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

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]:

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:
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:
bu da brüt vergi I=0,45*R – 20163,45*nbParts sonucunu verir.
8.1.2. Aile katsayısı üst sınırı

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:
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ı

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ı

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

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
-
- 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;
-
- satır: [data/taxpayersdata.txt] dosyası şöyledir:
Her satır, üç elemandan oluşan bir tuple'ı temsil eder: [marié / pacsé ou pas, nombre d'enfants, salaire annuel en euros].
-
- 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:
-
- 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;
-
- 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:

- [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
-
- 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ü;
-
- 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;
-
- satır: [marié, enfants, salaire] anahtarlarıyla bir sözlük oluşturulur ve bu sözlük [taxPayers] listesine eklenir;
-
- 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;
-
- satır: [calcul_impôt] fonksiyonu üç parametre alır:
- [marié]: evet / hayır, vergi mükellefinin evli mi yoksa medeni birliktelik içinde mi olduğunu belirtir;
- [enfants]: çocuk sayısı;
- [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:
[main.py] komut dosyası, aşağıdaki [résultats.txt] dosyasını oluşturur:
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.