Skip to content

8. Uygulama alıştırması – sürüm 1

8.1. Sorun

Image

Yukarıdaki tablo, beyan edecek tek geliri maaşı olan bir vergi mükellefinin basitleştirilmiş durumunda verginin hesaplanmasına olanak tanır. Not (1)'de belirtildiği gibi, bu şekilde hesaplanan vergi, aşağıdaki üç mekanizma uygulanmadan önceki vergidir:

  • yüksek gelirler için geçerli olan aile katsayısı tavanı;
  • düşük gelirler için uygulanan vergi indirimi ve muafiyeti;

Böylece vergi hesaplaması aşağıdaki adımları içerir [http://impotsurlerevenu.org/comprendre-le-calcul-de-l-impot/1217-calcul-de-l-impot-2019.php]:

Image

Sadece maaşını beyan eden bir vergi mükellefinin basitleştirilmiş durumunda, vergi tutarını hesaplamaya yarayan bir program yazmayı amaçlıyoruz:

8.1.1. Brüt vergi hesaplaması

Brüt vergi şu şekilde hesaplanabilir:

Öncelikle vergi mükellefinin pay sayısı hesaplanır:

  • her ebeveyn 1 pay sağlar;
  • ilk iki çocuk her biri 1/2 pay sağlar;
  • sonraki çocuklar ise her biri 1 pay sağlar:

Dolayısıyla pay sayısı şöyledir:

  • nbParts=1+nbEnfants*0,5+(çocukSayısı-2)*0,5 eğer çalışan evli değilse;
  • evliyse nbParts=2+nbEnfants*0,5+(nbEnfants-2)*0,5;
    • burada nbEnfants, çalışanın çocuk sayısıdır;
  • vergilendirilebilir gelir R=0,9*S olarak hesaplanır; burada S yıllık maaştır;
  • aile katsayısı QF = R/nbParts olarak hesaplanır;
  • brüt vergi I, aşağıdaki verilere göre hesaplanır (2019):
9964
0
0
27519
0,14
1394,96
73779
0,3
5798
156244
0,4
13913,69
0
0,45
20163,45

Her satırda 3 alan bulunur: champ1, champ2, champ3. I vergisini hesaplamak için, QF <= alan1 olan ilk satırı bulur ve bu satırdaki değerleri alırız. Örneğin, evli, iki çocuğu olan ve yıllık maaşı S 50.000 avro olan bir çalışan için:

Vergilendirilebilir gelir: R=0,9*S=45.000

Pay sayısı: nbParts=2+2*0,5=3

Aile katsayısı: QF=45.000/3=15.000

QF<=alan1 olan ilk satır şöyledir:

    27519    0.14    1394.96

I vergisi ise 0,14*R – 1394,96*nbParts=[0,14*45000-1394,96*3]=2115'e eşittir. Vergi, bir euro aşağı yuvarlanır.

Eğer ilk satırdan itibaren QF <= champ1 ilişkisi geçerliyse, vergi sıfırdır.

QF değeri, QF<=alan1 koşulunun hiçbir zaman karşılanmayacağı şekilde ise, son satırdaki katsayılar kullanılır. Burada:

    0    0.45    20163.45

bu da brüt vergi I=0,45*R – 20163,45*nbParts sonucunu verir.

8.1.2. Aile katsayısı üst sınırı

Image

Aile katsayısı üst sınırı QF'in geçerli olup olmadığını anlamak için, brüt vergi hesaplaması çocukları hariç tutularak yeniden yapılır. Yine, iki çocuğu olan ve yıllık maaşı S 50.000 avro olan evli bir çalışan için:

Vergilendirilebilir gelir: R=0,9*S=45.000

Pay sayısı: nbParts=2 (çocuklar artık hesaba katılmıyor)

Aile katsayısı: QF=45.000/2=22.500

QF<=alan1 olan ilk satır şöyledir:

    27519    0.14    1394.96

I vergisi ise 0,14*R – 1394,96*nbParts=[0,14*45000-1394,96*2]=3510'a eşittir.

Çocuklara ilişkin maksimum kazanç: 1551 * 2 = 3102 avro

Asgari vergi: 3510 – 3102 = 408 avro

Daha önce hesaplanan 3 paylı brüt vergi 2115 avro, asgari vergi olan 408 avrodan yüksek olduğundan, bu durumda aile tavanı uygulanmaz.

Genel olarak, brüt vergi (vergi1, vergi2) değerinden daha yüksektir; burada:

  • [impôt1]: çocuklarla birlikte hesaplanan brüt vergidir;
  • [impôt2]: çocukları dikkate almadan hesaplanan ve çocuklarla ilgili maksimum indirim (burada yarım pay başına 1551 avro) düşülmüş brüt vergidir;

8.1.3. İndirim Hesaplaması

Image

Yine, iki çocuğu olan ve yıllık maaşı S 50.000 avro olan evli çalışan için:

Bir önceki adımda elde edilen brüt vergi (2115), bir çift için 2627 avronun altında (bekar için 1595 avro) olduğundan indirim uygulanır. İndirim, aşağıdaki hesaplama ile elde edilir:

indirim = eşik (çift = 1970 / bekar = 1196) - 0,75 * brüt vergi

indirim = 1970 - 0,75 * 2115 = 383,75, 384 avroya yuvarlanır.

Yeni brüt vergi = 2115 - 384 = 1731 avro

8.1.4. Vergi indiriminin hesaplanması

Image

Belirli bir eşik değerin altında, önceki hesaplamalardan elde edilen brüt vergiden %20 oranında bir indirim yapılır. 2019 yılında eşik değerler şu şekildedir:

  • bekar: 21.037 avro;
  • çift: 42074 avro; (yukarıdaki örnekte kullanılan 37968 rakamı hatalı görünüyor);

Bu eşik değeri şu değer kadar artırılır: 3797 * (çocukların sağladığı yarım pay sayısı).

Yine, iki çocuğu olan ve yıllık maaşı S 50.000 avro olan evli bir çalışan için:

  • vergilendirilebilir geliri (45.000 avro) eşik değerin (42.074 + 2 × 3.797) = 49.668 avro altındadır;
  • bu nedenle vergisinde %20’lik bir indirim hakkına sahiptir: 1731 * 0,2 = 346,2 avro (347 avroya yuvarlanır);
  • vergi mükellefinin brüt vergisi şu şekilde hesaplanır: 1731 - 347 = 1384 avro;

8.1.5. Net vergi hesaplaması

Hesaplamamız burada sona eriyor: ödenecek net vergi 1384 avro olacaktır. Gerçekte, vergi mükellefi, özellikle kamu yararına veya genel yarara çalışan kuruluşlara yapılan bağışlar için başka indirimlerden de yararlanabilir.

8.1.6. Yüksek gelirli kişiler

Yukarıdaki örneğimiz, çalışanların çoğunu kapsamaktadır. Ancak yüksek gelirli kişilerde vergi hesaplaması farklıdır.

8.1.6.1. Yıllık gelirler üzerindeki %10’luk indirimin üst sınırı

Çoğu durumda, vergilendirilebilir gelir şu formülle hesaplanır: R=0,9*S; burada S, yıllık maaştır. Buna %10’luk indirim denir. Bu indirim için bir üst sınır vardır. 2019 yılında:

  • 12.502 avrodan fazla olamaz;
  • 437 avrodan az olamaz;

Çocuksuz ve evli olmayan, yıllık maaşı 200.000 avro olan bir çalışanı ele alalım:

  • %10'luk indirim 20.000 avro > 12.502 avrodur. Dolayısıyla 12.502 avroya indirilir;

8.1.6.2. Aile katsayısı üst sınırı

|Plafonnement du quotient familial| paragrafında belirtilen aile katsayısı üst sınırının geçerli olduğu bir durumu ele alalım. Üç çocuğu olan ve yıllık geliri 100.000 avro olan bir çifti ele alalım. Hesaplama adımlarını tekrar gözden geçirelim:

  • %10’luk indirim 10.000 avro < 12.502 avrodur. Dolayısıyla vergilendirilebilir gelir R, 100.000 - 10.000 = 90.000 avrodur;
  • çiftin nbParts değeri 2 + 0,5 × 2 + 1 = 4 paydır;
  • bu nedenle aile katsayısı QF = R / nbParts = 90.000 / 4 = 22.500 avrodur;
  • çocuklu brüt vergisi I1, I1=0,14*90.000-1.394,96*4= 7.020 avrodur;
  • çocuksuz brüt vergisi I2:
  • QF=90.000/2=45.000 avro;
  • I2=0,3*90000-5798*2=15404 avro;
  • Aile katsayısı üst sınır kuralına göre, çocuklardan kaynaklanan kazanç (1551*4 yarım pay)=6204 avroyu aşamaz. Oysa burada bu tutar I2-I1=15404-7020= 8384 avrodur, yani 6204 avrodan fazladır;
  • bu nedenle brüt vergi, I3 = I2-6204 = 15.404 - 6.204 = 9.200 avro olarak yeniden hesaplanır;

Bu çiftin herhangi bir indirim veya iskonto hakkı olmayacak ve nihai vergisi 9200 avro olacaktır.

8.1.7. Resmi rakamlar

Vergi hesaplaması karmaşıktır. Belgenin tamamında, testler aşağıdaki örnekler kullanılarak yapılacaktır. Sonuçlar, vergi idaresinin |https://www3.impots.gouv.fr/simulateur/calcul_impot/2019/simplifie/index.htm| simülatöründen alınmıştır:

Vergi mükellefi
Resmi sonuçlar
Belgedeki algoritmanın sonuçları
2 çocuğu olan ve yıllık geliri 55555 avro olan çift
Vergi = 2815 avro
Vergi oranı = %14
Vergi = 2814 avro
Vergi oranı = %14
2 çocuğu olan ve yıllık geliri 50.000 avro olan çift
Vergi = 1385 avro
İndirim = 720 avro
İndirim = 0 avro
Vergi oranı = %14
Vergi = 1.384 avro
İndirim = 384 avro
İndirim = 347 avro
Vergi oranı = %14
3 çocuğu olan ve yıllık geliri 50.000 avro olan çift
Vergi = 0 avro
İndirim = 384 avro
İndirim = 346 avro
Vergi oranı = %14
Vergi = 0 avro
indirim = 720 euro
İndirim=0 euro
Vergi oranı = %14
Bekar, 2 çocuğu olan ve yıllık geliri 100.000 euro olan kişi
Vergi = 19.884 euro
İndirim = 0 avro
İndirim = 0 euro
Vergi oranı = %41
Vergi = 19.884 avro
Ek vergi = 4.480 avro
indirim=0 euro
İndirim = 0 euro
Vergi oranı = %41
Bekar, 3 çocuğu olan ve yıllık geliri 100.000 avro olan kişi
Vergi = 16.782 avro
İndirim = 0 euro
İndirim = 0 euro
Vergi oranı = %41
Vergi = 16.782 avro
Ek vergi = 7.176 avro
indirim=0 euro
İndirim = 0 euro
Vergi oranı = %41
3 çocuğu olan ve yıllık geliri 100.000 avro olan çift
Vergi = 9.200 avro
İndirim = 0 euro
İndirim = 0 euro
Vergi oranı = %30
Vergi = 9.200 avro
Ek vergi = 2180 avro
indirim=0 euro
İndirim = 0 euro
Vergi oranı = %30
5 çocuğu olan ve yıllık geliri 100.000 avro olan çift
Vergi = 4.230 avro
İndirim = 0 euro
İndirim = 0 euro
Vergi oranı = %14
Vergi = 4.230 avro
İndirim = 0 euro
İndirim=0 euro
Vergi oranı = %14
Çocuksuz bekar ve yıllık geliri 100.000 avro olan kişi
Vergi = 22.986 avro
İndirim = 0 euro
İndirim = 0 euro
Vergi oranı = %41
Vergi = 22.986 avro
Ek vergi = 0 avro
indirim=0 euro
İndirim = 0 euro
Vergi oranı = %41
2 çocuğu olan ve yıllık geliri 30.000 avro olan çift
Vergi = 0 euro
İndirim=0 euro
İndirim = 0 euro
Vergi oranı = %0
Vergi = 0 euro
indirim = 0 euro
İndirim=0 euro
Vergi oranı = %0
Çocuksuz bekar ve yıllık geliri 200.000 avro olan kişi
Vergi = 64.211 euro
İndirim = 0 euro
İndirim = 0 euro
Vergi oranı = %45
Vergi = 64.210 avro
Ek vergi = 7498 avro
indirim=0 euro
İndirim = 0 euro
Vergi oranı = %45
3 çocuğu olan ve yıllık geliri 200.000 avro olan çift
Vergi = 42.843 avro
İndirim = 0 avro
İndirim = 0 avro
Vergi oranı = %41
Vergi = 42.842 avro
Ek vergi = 17.283 avro
indirim=0 euro
İndirim = 0 euro
Vergi oranı = %41

Yukarıda, yüksek gelirli kişilerin iki nedenden dolayı ek olarak ödedikleri tutara “ek vergi” denir:

  • yıllık gelirler üzerindeki %10'luk indirimin üst sınırı;
  • aile katsayısının üst sınırı;

Bu gösterge, vergi idaresinin simülatöründe yer almadığı için doğrulanamamıştır.

Belgedeki algoritmanın her seferinde doğru bir vergi tutarı verdiği görülmektedir, ancak 1 avroluk bir hata payı bulunmaktadır. Bu hata payı, yuvarlama işlemlerinden kaynaklanmaktadır. Tüm tutarlar bazen bir üst avroya, bazen de bir alt avroya yuvarlanmaktadır. Resmi kuralları bilmediğim için, belgedeki algoritmadaki tutarlar şu şekilde yuvarlanmıştır:

  • indirimler ve indirim tutarları için bir üst euroya;
  • ek ücretler ve nihai vergi için bir euro aşağı yuvarlanmıştır;

Vergi hesaplama uygulamasının birkaç sürümünü geliştireceğiz.

8.2. Sürüm 1

Image

8.2.1. Ana komut dosyası

Aşağıda, ilk programı sunuyoruz:

  • vergi hesaplaması için gerekli veriler, kodda listeler ve sabitler şeklinde sabit olarak kodlanmıştır;
  • vergi mükelleflerine ait veriler (evli olup olmadığı, çocuk sayısı, maaş) ilk metin dosyası [taxpayersdata.txt]'te yer almaktadır;
  • vergi hesaplamasının sonuçları (evli, çocuk sayısı, maaş, vergi) ikinci bir metin dosyası olan [résultats.txt]'te saklanmaktadır;

[v-01/main.py] komut dosyası şu şekildedir:


# modüller
import sys

from impots.v01.shared.impôts_module_01 import *

# main -----------------------

# sabitler
# vergi mükellefleri dosyası
DATA = "./data/taxpayersdata.txt"
# sonuç dosyası
RESULTATS = "./data/résultats.txt"

try:
    # vergi mükellefi verilerinin okunması
    tax_payers = get_taxpayers_data(DATA)
    # sonuç listesi
    results = []
    # vergi mükelleflerinin vergisi hesaplanır
    for tax_payer in tax_payers:
        # vergi hesaplaması bir anahtar sözlüğü döndürür
        # ['marié', 'enfants', 'salaire', 'impôt', 'surcôte', 'décôte', 'réduction', 'taux']
        result = calcul_impôt(tax_payer['marié'], tax_payer['enfants'], tax_payer['salaire'])
        # sözlük sonuç listesine eklenir
        results.append(result)
    # sonuçlar kaydedilir
    record_results(RESULTATS, results)
except BaseException as erreur:
    # farklı hatalar olabilir: dosya yok, dosya içeriği hatalı
    # hata mesajı görüntülenir ve uygulamadan çıkılır
    print(f"l'erreur suivante s'est produite : {erreur}]\n")
    sys.exit()

Notlar

    1. satır: [impots.v01.modules.impôts_module_01] modülü kullanılır. Bu yolun, PyCharm projesinin kök dizininden itibaren ölçüldüğünü hatırlatırız;
    1. satır: [data/taxpayersdata.txt] dosyası şöyledir:
oui,2,55555
oui,2,50000
oui,3,50000
non,2,100000
non,3,100000
oui,3,100000
oui,5,100000
non,0,100000
oui,2,30000
non,0,200000
oui,3,200000

Her satır, üç elemandan oluşan bir tuple'ı temsil eder: [marié / pacsé ou pas, nombre d'enfants, salaire annuel en euros].

    1. satır: [taxpayersdata.txt] dosyasındaki her bir vergi mükellefi için hesaplanan vergi sonuçlarının yerleştirileceği dosya. İçeriği şu şekilde olacaktır:
{'marié': 'oui', 'enfants': 2, 'salaire': 55555, 'impôt': 2814, 'surcôte': 0, 'décôte': 0, 'réduction': 0, 'taux': 0.14}
{'marié': 'oui', 'enfants': 2, 'salaire': 50000, 'impôt': 1384, 'surcôte': 0, 'décôte': 384, 'réduction': 347, 'taux': 0.14}
{'marié': 'oui', 'enfants': 3, 'salaire': 50000, 'impôt': 0, 'surcôte': 0, 'décôte': 720, 'réduction': 0, 'taux': 0.14}
{'marié': 'non', 'enfants': 2, 'salaire': 100000, 'impôt': 19884, 'surcôte': 4480, 'décôte': 0, 'réduction': 0, 'taux': 0.41}
{'marié': 'non', 'enfants': 3, 'salaire': 100000, 'impôt': 16782, 'surcôte': 7176, 'décôte': 0, 'réduction': 0, 'taux': 0.41}
{'marié': 'oui', 'enfants': 3, 'salaire': 100000, 'impôt': 9200, 'surcôte': 2180, 'décôte': 0, 'réduction': 0, 'taux': 0.3}
{'marié': 'oui', 'enfants': 5, 'salaire': 100000, 'impôt': 4230, 'surcôte': 0, 'décôte': 0, 'réduction': 0, 'taux': 0.14}
{'marié': 'non', 'enfants': 0, 'salaire': 100000, 'impôt': 22986, 'surcôte': 0, 'décôte': 0, 'réduction': 0, 'taux': 0.41}
{'marié': 'oui', 'enfants': 2, 'salaire': 30000, 'impôt': 0, 'surcôte': 0, 'décôte': 0, 'réduction': 0, 'taux': 0}
{'marié': 'non', 'enfants': 0, 'salaire': 200000, 'impôt': 64210, 'surcôte': 7498, 'décôte': 0, 'réduction': 0, 'taux': 0.45}
{'marié': 'oui', 'enfants': 3, 'salaire': 200000, 'impôt': 42842, 'surcôte': 17283, 'décôte': 0, 'réduction': 0, 'taux': 0.41}
    1. satır: [taxpayersdata.txt] dosyasında bulunan vergi mükelleflerinin verileri alınır. [marié, enfants, salaire] anahtar sözlüklerinden oluşan bir liste alınır; her sözlük bir vergi mükellefini temsil eder;
  • 17-25. satırlar: [taxPayers] listesindeki vergi mükelleflerinin vergisi hesaplanır. Her bir öğesi yine bir [marié, enfants, salaire, impôt, surcôte, décôte, réduction, taux] anahtar sözlüğü olan [results] listesi alınır;
    1. satır: Sonuçların bulunduğu [results] listesi, yukarıda gösterilen biçimde [résultats.txt] dosyasına kaydedilir;
  • 28-32. satırlar: [impots.v01.modules.impôts_module_01] modülünden çıkabilecek tüm istisnalar durdurulur;

Şimdi [main] betiği tarafından kullanılan üç işlevi ayrıntılı olarak inceleyeceğiz:

  • [get_taxpayers_data]: vergi mükelleflerinin verilerini okumak için;
  • [calcul_impôt]: vergi mükelleflerinin vergisini hesaplamak için;
  • [record_results]: sonuçları bir metin dosyasına kaydetmek için;

Tüm bu işlevler [impots.modules.impôts_module_01] modülünde bulunur.

8.2.2. [impots.v01.shared.impôts_module_01] modülü

Vergi hesaplaması için gerekli fonksiyonlar [impots.v01.shared.impôts_module_01] modülünde bir araya getirilmiştir:

Image

  • [1] dosyasında: vergi hesaplamasına ilişkin sabitlerin tanımlanması;
  • [2]: modülün işlevlerinin listesi;

8.2.3. [get_taxpayers_data] işlevi

[get_taxpayers_data] işlevi şöyledir:


# içe aktarmalar
import codecs


# vergi mükelleflerinin verileri okunur
# ----------------------------------------
def get_taxpayers_data(taxpayers_filename: str) -> list:
    # vergi mükellefi verilerinin okunması
    file = None
    try:
        # vergi mükellefleri listesi
        taxpayers = []
        # dosyanın açılması
        file = codecs.open(taxpayers_filename, "r", "utf8")
        # vergi mükellefleri dosyasının ilk satırını okuma
        ligne = file.readline().strip()
        # işlenecek satır kaldığı sürece
        while ligne != '':
            # satırı oluşturan “evli”, “çocuk sayısı” ve “maaş” olmak üzere 3 alanı alınır
            (marié, enfants, salaire) = ligne.split(",")
            # bunlar vergi mükellefleri listesine eklenir
            taxpayers.append({'marié': marié.strip().lower(), 'enfants': int(enfants), 'salaire': int(salaire)})
            # vergi mükellefleri dosyasından yeni bir satır okunur
            ligne = file.readline().strip()
        # sonuç verilir
        return taxpayers
    finally:
        # Dosya açıksa kapatılır
        if file:
            file.close()

Notlar

    1. satır: [taxpayers_filename], işlenecek dosyanın adıdır. İşlev bir liste döndürür;
  • 18-24. satırlar: metin dosyasındaki [marié, enfants, salaire] satırlarını işleyen döngü;
    1. satır: Satırdaki üç öğe alınır. Burada satırın sözdizimsel olarak doğru olduğu, yani beklenen üç öğeyi içerdiği varsayılır;
    1. satır: [marié, enfants, salaire] anahtarlarıyla bir sözlük oluşturulur ve bu sözlük [taxPayers] listesine eklenir;
    1. satır: Dosya işlendikten sonra, [taxPayers] listesi döndürülür;
  • 10-30. satırlar: 10. satırdaki [try]'e [catch] cümlesi eklenmediğine dikkat edilmelidir. [catch] cümlesi zorunlu değildir. 27. satırda, hata olsun ya da olmasın her durumda metin dosyasını kapatmak için bir [finally] cümlesi eklenmiştir;
  • bu try / finally yapısı olası bir istisnayı kaçırır (catch yoktur). Bu istisna, ana komut dosyasına ([main]) iletilecek ve ana komut dosyası durup istisnayı görüntüleyecektir (bkz. |Le script principal| paragrafı). Bu mekanizma, modülün çoğu işlevi için kullanılmıştır;

8.2.4. [calcul_impôt] işlevi

[calcul_impôt] işlevi şöyledir:


# ithalatlar
import codecs
import math

# 2019 vergi dilimleri
limites = [9964, 27519, 73779, 156244, 0]
coeffr = [0, 0.14, 0.3, 0.41, 0.45]
coeffn = [0, 1394.96, 5798, 13913.69, 20163.45]

# 2019 vergi hesaplaması için sabitler
PLAFOND_QF_DEMI_PART = 1551
PLAFOND_REVENUS_CELIBATAIRE_POUR_REDUCTION = 21037
PLAFOND_REVENUS_COUPLE_POUR_REDUCTION = 42074
VALEUR_REDUC_DEMI_PART = 3797
PLAFOND_DECOTE_CELIBATAIRE = 1196
PLAFOND_DECOTE_COUPLE = 1970
PLAFOND_IMPOT_COUPLE_POUR_DECOTE = 2627
PLAFOND_IMPOT_CELIBATAIRE_POUR_DECOTE = 1595
ABATTEMENT_DIXPOURCENT_MAX = 12502
ABATTEMENT_DIXPOURCENT_MIN = 437


# vergi hesaplaması
# ----------------------------------------
def calcul_impôt(marié: str, enfants: int, salaire: int) -> dict:
    # evli: evet, hayır
    # çocuklar: çocuk sayısı
    # maaş: yıllık maaş
    # sınırlar, coeffr, coeffn: vergi hesaplamasına olanak tanıyan veri tabloları
    #
    # çocuklu vergi hesaplaması
    result1 = calcul_impôt_2(marié, enfants, salaire)
    impot1 = result1["impôt"]
    # çocuklar hariç vergi hesaplaması
    if enfants != 0:
        result2 = calcul_impôt_2(marié, 0, salaire)
        impot2 = result2["impôt"]
        # aile katsayısı tavanının uygulanması
        if enfants < 3:
            # PLAFOND_QF_DEMI_PART euro (ilk 2 çocuk için)
            impot2 = impot2 - enfants * PLAFOND_QF_DEMI_PART
        else:
            # PLAFOND_QF_DEMI_PART avro ilk 2 çocuk için, sonraki çocuklar için iki katı
            impot2 = impot2 - 2 * PLAFOND_QF_DEMI_PART - (enfants - 2) * 2 * PLAFOND_QF_DEMI_PART
    else:
        impot2 = impot1
        result2 = result1

    # ilgili vergi oranı ve ek vergiyle birlikte en yüksek vergi tutarı alınır
    if impot1 > impot2:
        impot = impot1
        taux = result1["taux"]
        surcôte = result1["surcôte"]
    else:
        surcôte = impot2 - impot1 + result2["surcôte"]
        impot = impot2
        taux = result2["taux"]

    # Olası bir indirimin hesaplanması
    décôte = get_décôte(marié, salaire, impot)
    impot -= décôte
    # olası vergi indiriminin hesaplanması
    réduction = get_réduction(marié, salaire, enfants, impot)
    impot -= réduction
    # sonuç
    return {"marié": marié, "enfants": enfants, "salaire": salaire, "impôt": math.floor(impot), "surcôte": surcôte,
            "décôte": décôte, "réduction": réduction, "taux": taux}

Notlar

  • 6-8. satırlar: vergi dilimleri (bkz. |Calcul de l’impôt brut| paragrafı);
  • satır 11-20: vergi hesaplamasına ilişkin sabitler;
  • 5-20. satırlarda başlatılan öğelerin, aşağıda açıklayacağımız işlevler için küresel olacağına dikkat edilmelidir. Dolayısıyla, bunları kullanan işlev aynı isimde değişkenler tanımlamadığı sürece bu öğeler bilinir durumdadır;
  • 5-20. satırlardaki rakamlar her yıl değişir. Burada 2019 yılına ait rakamlar yer almaktadır;
    1. satır: [calcul_impôt] fonksiyonu üç parametre alır:
    2. [marié]: evet / hayır, vergi mükellefinin evli mi yoksa medeni birliktelik içinde mi olduğunu belirtir;
    3. [enfants]: çocuk sayısı;
    4. [salaire]: yıllık maaşı (avro cinsinden);
  • satır 31-33: çocukları dikkate alarak vergi hesaplaması;
  • satır 34-47: bu satırlar aile katsayısının üst sınırını uygular (bkz. |Plafonnement du quotient familial| paragrafı);
  • satır 49-57: bu satırlar, vergi mükellefinin vergi oranını ve olası bir ek vergiyi hesaplar (bkz. paragraf |Cas des hauts revenus|);
  • satır 59-61: olası bir indirimin hesaplanması (bkz. paragraf |Calcul de la décôte|);
  • satır 62-64: ödenecek vergide olası bir indirimin hesaplanması (bkz. paragraf |Calcul de la réduction d’impôts|);

Algoritma oldukça karmaşıktır ve yorumlarda belirtilenlerin ötesinde ayrıntılara girmeyeceğiz. Algoritma, |Le problème| paragrafında açıklanan vergi hesaplama yöntemini uygular.

8.2.5. [calcul_impôt_2] fonksiyonu

[calcul_impôt] fonksiyonu, aşağıdaki [calcul_impôt_2] fonksiyonunu çağırır:


def calcul_impôt_2(marié: str, enfants: int, salaire: int) -> list:
    # evli: evet, hayır
    # çocuklar: çocuk sayısı
    # maaş: yıllık maaş
    # sınırlar, coeffr, coeffn: vergi hesaplamasına olanak tanıyan veri tabloları
    #
    # pay sayısı
    marié = marié.strip().lower()
    if marié == "oui":
        nb_parts = enfants / 2 + 2
    else:
        nb_parts = enfants / 2 + 1

    # 3. çocuktan itibaren her çocuk için 1 pay
    if enfants >= 3:
        # 3. çocuktan itibaren her çocuk için yarım pay daha
        nb_parts += 0.5 * (enfants - 2)

    # vergilendirilebilir gelir
    revenu_imposable = get_revenu_imposable(salaire)
    # ek ücret
    surcôte = math.floor(revenu_imposable - 0.9 * salaire)
    # yuvarlama hataları için
    if surcôte < 0:
        surcôte = 0

    # aile katsayısı
    quotient = revenu_imposable / nb_parts
    # tablo sınırlarının sonuna eklenir ve ardından gelen döngüyü durdurur
    limites[len(limites) - 1] = quotient
    # vergi hesaplaması
    i = 0
    while quotient > limites[i]:
        i += 1
        # aile katsayısı sınır tablosunun sonuna yerleştirildiği için, önceki döngü
    # sınır tablosunun sınırlarını aşamaz

    # artık vergiyi hesaplayabiliriz
    impôt = math.floor(revenu_imposable * coeffr[i] - nb_parts * coeffn[i])
    # sonuç
    return {"impôt": impôt, "surcôte": surcôte, "taux": coeffr[i]}

Bu algoritma 8.1.1. paragrafında açıklanmıştır.

8.2.6. [get_décôte] işlevi

[get_décôte] fonksiyonu, vergide olası indirimin hesaplanmasını gerçekleştirir (|Calcul de la décôte| paragrafı):


# olası bir indirimi hesaplar
def get_décôte(marié: str, salaire: int, impots: int) -> int:
    # başlangıçta, sıfır indirim
    décôte = 0
    # indirimden yararlanmak için geçerli olan azami vergi tutarı
    plafond_impôt_pour_décôte = PLAFOND_IMPOT_COUPLE_POUR_DECOTE if marié == "oui" else PLAFOND_IMPOT_CELIBATAIRE_POUR_DECOTE
    if impots < plafond_impôt_pour_décôte:
        # indirim tutarının üst sınırı
        plafond_décôte = PLAFOND_DECOTE_COUPLE if marié == "oui" else PLAFOND_DECOTE_CELIBATAIRE
        # teorik indirim
        décôte = plafond_décôte - 0.75 * impots
        # indirim, vergi tutarını aşamaz
        if décôte > impots:
            décôte = impots

        # <0 değerinde indirim yoktur
        if décôte < 0:
            décôte = 0

    # sonuç
    return math.ceil(décôte)

8.2.7. [get_réduction] işlevi

[get_réduction] fonksiyonu, ödenecek vergide olası indirimin hesaplanmasını gerçekleştirir (|Calcul de la réduction d’impôts| paragrafı):


# olası bir indirimi hesaplar
def get_réduction(marié: str, salaire: int, enfants: int, impots: int) -> int:
    # %20 indirimden yararlanabilmek için gelir üst sınırı
    plafond_revenu_pour_réduction = PLAFOND_REVENUS_COUPLE_POUR_REDUCTION if marié == "oui" else PLAFOND_REVENUS_CELIBATAIRE_POUR_REDUCTION
    plafond_revenu_pour_réduction += enfants * VALEUR_REDUC_DEMI_PART
    if enfants > 2:
        plafond_revenu_pour_réduction += (enfants - 2) * VALEUR_REDUC_DEMI_PART

    # vergilendirilebilir gelir
    revenu_imposable = get_revenu_imposable(salaire)
    # indirim
    réduction = 0
    if revenu_imposable < plafond_revenu_pour_réduction:
        # %20 indirim
        réduction = 0.2 * impots

    # sonuç
    return math.ceil(réduction)

8.2.8. [get_revenu_imposable] işlevi

[get_revenu_imposable] işlevi, yıllık maaştan vergilendirilebilir geliri hesaplar:


# revenu_imposable = salaireAnnuel - muafiyet
# indirimde bir minimum ve bir maksimum değer vardır
# ----------------------------------------
def get_revenu_imposable(salaire: int) -> int:
    # maaşın %10'u kadar indirim
    abattement = 0.1 * salaire
    # bu indirim ABATTEMENT_DIXPOURCENT_MAX değerini aşamaz
    if abattement > ABATTEMENT_DIXPOURCENT_MAX:
        abattement = ABATTEMENT_DIXPOURCENT_MAX

    # indirim, ABATTEMENT_DIXPOURCENT_MIN değerinden daha düşük olamaz
    if abattement < ABATTEMENT_DIXPOURCENT_MIN:
        abattement = ABATTEMENT_DIXPOURCENT_MIN

    # vergilendirilebilir gelir
    revenu_imposable = salaire - abattement
    # sonuç
    return math.floor(revenu_imposable)

8.2.9. [record_results] işlevi

[record_results] işlevi, vergi hesaplama sonuçlarını bir metin dosyasına kaydeder:


# sonuçların bir metin dosyasına yazılması
# ----------------------------------------
def record_results(results_filename: str, results: list):
    # results_filename : sonuçların kaydedileceği metin dosyasının adı
    # results : sonuçların sözlük listesi biçiminde listesi
    # her sözlük bir metin satırına yazılır
    résultats = None
    try:
        # sonuç dosyasının açılması
        résultats = codecs.open(results_filename, "w", "utf8")
        # vergi mükelleflerinin işlenmesi
        for result in results:
            # sonuç, sonuç dosyasına kaydedilir
            résultats.write(f"{result}\n")
            # bir sonraki vergi mükellefi
    finally:
        # dosya açıksa kapatılır
        if résultats:
            résultats.close()

8.2.10. Sonuçlar

Daha önce de belirtildiği gibi, aşağıdaki [taxpayersdata.txt] vergi mükellefi dosyası ile:

oui,2,55555
oui,2,50000
oui,3,50000
non,2,100000
non,3,100000
oui,3,100000
oui,5,100000
non,0,100000
oui,2,30000
non,0,200000
oui,3,200000

[main.py] komut dosyası, aşağıdaki [résultats.txt] dosyasını oluşturur:

{'marié': 'oui', 'enfants': 2, 'salaire': 55555, 'impôt': 2814, 'surcôte': 0, 'décôte': 0, 'réduction': 0, 'taux': 0.14}
{'marié': 'oui', 'enfants': 2, 'salaire': 50000, 'impôt': 1384, 'surcôte': 0, 'décôte': 384, 'réduction': 347, 'taux': 0.14}
{'marié': 'oui', 'enfants': 3, 'salaire': 50000, 'impôt': 0, 'surcôte': 0, 'décôte': 720, 'réduction': 0, 'taux': 0.14}
{'marié': 'non', 'enfants': 2, 'salaire': 100000, 'impôt': 19884, 'surcôte': 4480, 'décôte': 0, 'réduction': 0, 'taux': 0.41}
{'marié': 'non', 'enfants': 3, 'salaire': 100000, 'impôt': 16782, 'surcôte': 7176, 'décôte': 0, 'réduction': 0, 'taux': 0.41}
{'marié': 'oui', 'enfants': 3, 'salaire': 100000, 'impôt': 9200, 'surcôte': 2180, 'décôte': 0, 'réduction': 0, 'taux': 0.3}
{'marié': 'oui', 'enfants': 5, 'salaire': 100000, 'impôt': 4230, 'surcôte': 0, 'décôte': 0, 'réduction': 0, 'taux': 0.14}
{'marié': 'non', 'enfants': 0, 'salaire': 100000, 'impôt': 22986, 'surcôte': 0, 'décôte': 0, 'réduction': 0, 'taux': 0.41}
{'marié': 'oui', 'enfants': 2, 'salaire': 30000, 'impôt': 0, 'surcôte': 0, 'décôte': 0, 'réduction': 0, 'taux': 0}
{'marié': 'non', 'enfants': 0, 'salaire': 200000, 'impôt': 64210, 'surcôte': 7498, 'décôte': 0, 'réduction': 0, 'taux': 0.45}
{'marié': 'oui', 'enfants': 3, 'salaire': 200000, 'impôt': 42842, 'surcôte': 17283, 'décôte': 0, 'réduction': 0, 'taux': 0.41}

Bu sonuçlar, |Chiffres officiels| paragrafındaki resmi rakamlarla uyumludur.

Şimdi bu sürümü bir konsol penceresinde çalıştıralım:


(venv) C:\Data\st-2020\dev\python\cours-2020\python3-flask-2020\impots\v01>python main.py
Traceback (most recent call last):
  File "main.py", line 4, in <module>
    from impots.v01.shared.impôts_module_01 import *
ModuleNotFoundError: No module named 'impots'

Daha önce karşılaştığımız bir hata ile tekrar karşılaşıyoruz: bir modülün bulunamaması hatası; bu durumda [impots] modülü. Bunun anlamının şunu olduğunu hatırlatalım:

  • Python yorumlayıcısı, Python Yolu'ndaki klasörleri tek tek taradı;
  • hiçbirinde [impots.py] adlı bir komut dosyasının bulunduğu bir klasör bulamamıştır;

[v02] sürümü bu soruna bir çözüm getirecektir.