Skip to content

11. Uygulama alıştırması: sürüm 3

Image

Bu yeni sürümde iki değişiklik yapılmıştır:

  • Vergi hesaplaması için gerekli olan ve vergi dairesi tarafından sağlanan veriler, jSON [admindata.json] dosyasına yerleştirilmiştir:

{
    "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],
    "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ının sonuçları da jSON ve [résultats.json] dosyalarına yerleştirilecektir:

[
  {
    "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": 200000,
    "impôt": 42842,
    "surcôte": 17283,
    "décôte": 0,
    "réduction": 0,
    "taux": 0.41
  }
]

11.1. [config.py] yapılandırma komut dosyası

Yapılandırma komut dosyası şu şekilde olacaktır:


def configure():
    import os

    # bu komut dosyasının klasörünün mutlak yolu
    script_dir = os.path.dirname(os.path.abspath(__file__))
    # uygulamanın bağımlılıkları
    absolute_dependencies = [
        f"{script_dir}/../shared",
    ]
    # uygulama yapılandırması
    config = {
        # vergi mükellefleri dosyasının mutlak yolu
        "taxpayersFilename"f"{script_dir}/../data/taxpayersdata.txt",
        # sonuç dosyasının mutlak yolu
        "resultsFilename"f"{script_dir}/../data/résultats.json",
        # vergi idaresi veri dosyasının mutlak yolu
        "admindataFilename"f"{script_dir}/../data/admindata.json"
    }
    # syspath güncellemesi
    from myutils import set_syspath

    set_syspath(absolute_dependencies)

    # yapılandırma uygulanıyor
    return config
    1. satır: [shared] klasörünü Python Path'e ekliyoruz. Bu klasör, ana komut dosyası tarafından kullanılan [impôts_module_02] modülünü içerir;

11.2. Ana komut dosyası [main.py]

Sürüm 3'ün ana betiği şöyledir:


# uygulama yapılandırılıyor
import config

config = config.configure()

# syspath yapılandırıldı - içe aktarmalar yapılabilir
from impôts_module_02 import calcul_impôt, get_admindata, get_taxpayers_data, record_results_in_json_file

# vergi mükellefleri dosyası
taxpayers_filename = config['taxpayersFilename']
# sonuç dosyası
results_filename = config['resultsFilename']
# vergi idaresi verileri dosyası
admindata_filename = config['admindataFilename']
# kod
try:

    # vergi idaresi verilerinin okunması
    admindata = get_admindata(admindata_filename)
    # vergi mükellefi verilerinin okunması
    taxpayers = get_taxpayers_data(taxpayers_filename)
    # sonuç listesi
    results = []
    # vergi mükelleflerinin vergisi hesaplanır
    for taxpayer in taxpayers:
        # 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(admindata, taxpayer['marié'], taxpayer['enfants'], taxpayer['salaire'])
        # sözlük sonuç listesine eklenir
        results.append(result)
    # sonuçlar kaydedilir
    record_results_in_json_file(results_filename, results)
except BaseException as erreur:
    # farklı hatalar olabilir: dosya yok, dosya içeriği hatalı
    # hata görüntülenir ve uygulamadan çıkılır
    print(f"L'erreur suivante s'est produite : {erreur}]\n")
finally:
    print("Travail terminé...")

Notlar

  • 2-4. satırlarda, uygulama ve özellikle Python Yolu yapılandırılır;
    1. satır: [main.py]'te ihtiyaç duyulan işlevler içe aktarılır;
  • 9-14. satırlar: Uygulama tarafından kullanılan dosya adları yapılandırma dosyasından alınır;
  • Sürüm 3'ün ana betiği, sürüm 1 ve 2'ninkinden üç farklılık gösterir:
    1. satır: Vergi idaresine ait veriler jSON ve [./data/admindata.json] dosyalarından alınır;
    1. satır: Vergi hesaplama sonuçları jSON ve [./data/résultats.json] dosyalarına kaydedilir;
  • satır 7: sürüm 3'ün işlevleri [impots.modules.impôts_module_02] modülünde bulunur;

11.3. [impots.v02.modules.impôts_module_02] modülü

[impots.v02.modules.impôts_module_02] modülünün yapısı şöyledir:

Image

  • Modülde, sürüm 1 tarafından kullanılan modülde zaten mevcut olan işlevler bulunur, ancak bir fark vardır. Sürüm 2 modülü, sürüm 1 modülünde bulunan bir işlevi devraldığında, bunu ek bir parametre ile yapar: [adminData] (satır 29, 51, 77, 127). Bu parametre, jSON ve [adminData.json] dosyalarından alınan vergi verileri sözlüğünü temsil eder. Sürüm 1 modülünde, bu verilerin işlevlere aktarılmasına gerek yoktu çünkü işlevler için global olarak tanımlanmışlardı; dolayısıyla işlevler bu verileri zaten biliyordu;

11.4. Vergi idaresi verilerinin okunması

[get_admindata] fonksiyonu şu şekildedir:


# vergi idaresi verileri bir dosyadan okunur jSON
# ----------------------------------------
def get_admindata(admindata_filename: str) -> dict:
    # vergi dairesinin verilerinin okunması
    # Olası istisnaların bildirilmesine izin verilir: dosya yok, jSON içeriği hatalı
    file = None
    try:
        # jSON dosyasının okuma modunda açılması
        file = codecs.open(admindata_filename, "r", "utf8")
        # içeriğin bir sözlüğe aktarılması
        admin_data = json.load(file)
        # sonuç döndürülür
        return admin_data
    finally:
        # Dosya açılmışsa kapatılıyor
        if file:
            file.close()
    1. satır: okunan jSON dosyasından görüntü sözlüğü alınır;

11.5. Sonuçların Kaydedilmesi

[record_results_in_json_file] işlevi şu şekildedir:


# sonuçların jSON dosyasına yazılması
# ----------------------------------------
def record_results_in_json_file(results_filename: str, results: list):
    file = None
    try:
        # sonuç dosyasının açılması
        file = codecs.open(results_filename, "w", "utf8")
        # toplu yazma
        json.dump(results, file, ensure_ascii=False)
    finally:
        # Dosya açıksa kapatılır
        if file:
            file.close()
    1. satır: UTF-8 kodlamalı bir dosya oluşturulur;
    1. satır: [results] listesi, jSON dosyasına yazılır. UTF-8 karakterleri kaçış karakterleriyle korunmaz (ensure_ascii=False);

11.6. İşlevlerdeki değişiklikler

Bazı işlevler artık ek bir [admin_data] parametresi almaktadır. Bu, işlevlerin yazımını biraz değiştirir. Örneğin [calcul_impôt] işlevini ele alalım:


# vergi hesaplaması - 1. adım
# ----------------------------------------
def calcul_impôt(admin_data: dict, 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(admin_data, marié, enfants, salaire)
    impot1 = result1["impôt"]
    # çocuklar hariç vergi hesaplaması
    if enfants != 0:
        result2 = calcul_impôt_2(admin_data, marié, 0, salaire)
        impot2 = result2["impôt"]
        # aile katsayısı üst sınırının uygulanması
        if enfants < 3:
            # PLAFOND_QF_DEMI_PART ilk iki çocuk için euro
            impot2 = impot2 - enfants * admin_data['plafond_qf_demi_part']
        else:
            # PLAFOND_QF_DEMI_PART ilk iki çocuk için euro, sonraki çocuklar için iki katı
            impot2 = impot2 - 2 * admin_data['plafond_qf_demi_part'] - (enfants - 2) * 2 * admin_data[
                '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(admin_data, marié, salaire, impot)
    impot -= décôte
    # olası vergi indiriminin hesaplanması
    réduction = get_réduction(admin_data, 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

  • [calcul_impôt] işlevinin diğer işlevleri çağırdığı yerlerde, ilk parametre olarak [admin_data]'i aktarıyor (10., 14., 39. ve 42. satırlar);
  • [calcul_impôt]'in vergi sabitlerini kullandığı yerlerde, artık [admin_data] sözlüğü aracılığıyla gerçekleştirilir (satır 19, 22);

[admin_data]'i parametre olarak alan tüm işlevlerde de aynı tür değişiklikler yapılmıştır.

11.7. Sonuçlar

Elde edilen sonuçlar, 8.3. paragrafının başında sunulanlarla aynıdır.