İşkur - Kısa Çalışma Ödeneği Hesaplama Programı

Merhaba, covid19 ile birlikte ülke genelinde faaliyetlerini sürdüremeyen firmalara devlet tarafından sağlanan kısa dönemli destekler arasında işkur’un personel maaşlarını ödemekte zorluk çeken iş verene olacağı destek yer almaktadır. Detaylı bilgiye işkurun alttaki bağlantıdan web sitesine giderek bilgi alabilirsiniz.

https://www.iskur.gov.tr/isveren/kisa-calisma-odenegi/genel-bilgiler/

İş veren ve işçilerin işkur tarafından alacağı maaşı hesaplayabilmeleri için konsol’dan çalışan bir program kodladım. Hesaplamalar 2020 yılı verileri dikkate alınarak yapılmaktadır.

Programın bilgisayarda direk çalışmasını isterseniz aşağıdaki bağlantıdan indirebilirsiniz.

DİREK ÇALIŞTIRMA LİNKİ = iskur_odenek_hesaplayici_indir

Programı kullanırken dikkat etmeniz gereken hususlar şunlardır;

  • Programa değer girişleri yaptığınız zaman lütfen sadece rakam kullanınız ve geçersiz olabilecek küçüklükte rakamlar kullanmayınız. Aksi takdirde program size hatalı giriş yaptığınızı söyleyerek tekrar girmenizi isteyecektir.

  • Brüt maaşlarınızı e-devletten 4a hizmet dökümündeki detaylı hizmet dökümünden bulunduğunuz aydan 12 ay gerisine giderek her geçtiğiniz ayın brüt maaşını sistem size sordukça doğru şekilde yazınız.

  • Hesaplamalar yapılırken işkur tarafından belirtilen kıstaslar sebebi ile günlük brüt ücretiniz asgari bir ücretlinin günlük brüt ücretinin 1.5 katını geçtiği durumlarda geçersiz sayılacak ve maksimum değer olan 2020 yılı asgari ücretli çalışanın 1 günlük brüt ücretinin 1.5 katına eş değer alınacaktır. (güncel değer = 147 TL)

Programdan örnek bir görüntü;

UYARI !!! >> resimde görülen değerler tamamen örnek amaçlıdır. Hesaplamalar gerçeği yansıtmakta olup giriş yapılan değerler deneme amaçlı kullanılmıştır. Doğru hesaplama ve sonuca ulaşmak için lütfen programı doğru değerlerde girişler yaparak kullanın.



Bu kısımdan sonrası programın içeriğine, kodlamasına, formüller ve fonksiyonlarını merak edip katkıda bulunmak isteyenler içindir.


Programın kaynak kodlarına şuradan ulaşabilirsiniz.

Sabah böyle bir programa ihtiyacım oldu. İnternette hesaplayıcı bulamadım ve kendim yaptım. Benim gibi başka arayanlar olursa buradan rahatlıkla bulabilsinler diye bu forumda da paylaşmış oldum. Geliştirmek ve katkı sağlamak isteyen olursa yorumlarda tartışalım, önerilere de açığım.

Sağlıkla kalın, iyi günler.

5 Beğeni

Dostum kodlarınızı inceledim ve çok tekrar eden yerler gördüm. Yani her bir ay için aynı ifadeleri içeren yeni while döngülerini tekrar tekrar yazmanıza aslında gerek yok, kodlarınızı fonksiyonel hale getirebilirsiniz. Yani bir fonksiyon gireceğiniz bütün verileri argüman olarak alsın ve başka bir fonksiyon her veri için benzer şekilde çalışsın. Eğer fonksiyonda yer alan işlemlerde veriye göre bir değişiklik yapılacaksa, fonksiyona vereceğiniz parametre işlemin istediğiniz kısımlarını değiştirebilir. Örnek olsun diye aşağıdaki kodları sizinle paylaşıyorum. Ayrıca global alanda da çok fazla değişken bırakmamaya çalışın. Global alanda kalacak değişkenler sabit olarak kullanacağınız değişkenler olsun.

def onceki_veriyi_yazdir(onceki: list = []):
    for i in onceki:
        print(i)


def veri_al(yazi: str = "", onceki: list = (), uzunluk: int = 0):
    while True:
        veri = input(f"{yazi} = ")
        if len(veri) <= uzunluk:
            onceki_veriyi_yazdir(onceki=onceki)
        else:
            try:
                return int(veri)
            except ValueError:
                onceki_veriyi_yazdir(onceki=onceki)


def istek_olustur(tum_veri: dict = {}):
    onceki = []
    sonuc = []
    for k, v in tum_veri.items():
        veri = veri_al(yazi=k, onceki=onceki, uzunluk=v)
        onceki.append(
            f"{k} = {veri}"
        )
        sonuc.append(veri)
    return sonuc


def hesapla(veriler: list = []):
    toplam = sum(i for i in veriler[2:-2])
    ortalama = toplam / 12
    gunluk = ortalama / 30
    gunluk_brut_odeme = gunluk * 0.60
    if gunluk_brut_odeme > 147.15:
        gunluk_brut_odeme = 147.15
    is_kur_odenegi = gunluk_brut_odeme * veriler[-2]
    is_veren_odenegi = (veriler[0] / 30) * veriler[-1] + veriler[1]
    toplam_kazanc = is_veren_odenegi + is_kur_odenegi
    eksik_tutar = (veriler[0] + veriler[1]) - toplam_kazanc
    print()
    print(
        "| İŞ VEREN TARAFINDAN ÖDENECEK MAAŞ TUTARI >> {} TL"
        .format(is_veren_odenegi)
    )
    print()
    print(
        "| İŞ KUR TARAFINDAN ÖDENECEK MAAŞ TUTARI >> {} TL"
        .format(is_kur_odenegi)
    )
    print()
    print(
        "| TOPLAM KAZANCINIZ >> {} TL"
        .format(toplam_kazanc)
    )
    print()
    print(
        "| EKSİK ALACAĞINIZ MAAŞ TUTARI >> {} TL"
        .format(eksik_tutar)
    )
    print()


def main():
    hesapla(
        veriler=istek_olustur(
            tum_veri={
                "NET MAAŞ": 3,
                "NET AGI": 2,
                "1. AY BRÜT ÜCRETİNİZ": 3,
                "2. AY BRÜT ÜCRETİNİZ": 3,
                "3. AY BRÜT ÜCRETİNİZ": 3,
                "4. AY BRÜT ÜCRETİNİZ": 3,
                "5. AY BRÜT ÜCRETİNİZ": 3,
                "6. AY BRÜT ÜCRETİNİZ": 3,
                "7. AY BRÜT ÜCRETİNİZ": 3,
                "8. AY BRÜT ÜCRETİNİZ": 3,
                "9. AY BRÜT ÜCRETİNİZ": 3,
                "10. AY BRÜT ÜCRETİNİZ": 3,
                "11. AY BRÜT ÜCRETİNİZ": 3,
                "12. AY BRÜT ÜCRETİNİZ": 3,
                "İŞ KUR TARAFINDAN ÖDENECEK GÜN SAYISI": 0,
                "İŞ VEREN TARAFINDAN ÖDENECEK GÜN SAYISI": 0
            }
        )
    )


if __name__ == "__main__":
    main()
2 Beğeni

Biraz acelem vardı. Düşünmek yerine yapmayı tercih ettim. Aslında uğraştığım vakti hesaba katarsak (birbirini tekrar eden uzun kod yapıları) düşünüp de daha az kod ile belki de aynı sürede programı yazabilirdim. Fakat bunu şimdi sizin örneğinize bakarak söylüyorum. İşin ilk başında hadi hadi yap şunu acil yetişmeli personelin hesaplamalarını yapman lazım diye söylediğim de kendime epey kalabalık yapılar ortaya çıktı. Normal de birbiri arasında işlemler yapan (sizinde dediğiniz gibi) fonksiyonlar ile kolayca halledebilirdik. Birde ben şöyle düşündüm;

Tekrar edileceklerin listesi
Sorulacak Soruların listesi
Kullanıcıya Gösterileceklerin listesini oluşturup for döngüsü ya da index kullanarak ihtiyaç duyulan yerde for ile gezip belli bir count değerinde çalıştırıp ardından durdurup daha kısa bir yapı oluşturabilirim dedim. Ve şuan bunu yazarken sizin de aslında bunu yaptığınızı fark ettim :smiley: ben en iyisi kodunuzu inceleyip üzerine düşüneyim. Kafama takılacak bir kaç şey var gibi görünüyor, onların içinden çıkamazsam tekrar sorarım.

Üstteki kod yapınız için teşekkürler

1 Beğeni
def onceki_veriyi_yazdir(onceki: list = []):
    for i in onceki:
        print(i)

Yukarıdaki fonksiyon çok basit bir fonksiyon. Ama iki kez kullanacağım için bunu bir fonksiyona dahil ettim. Parametre olarak onceki diye bir liste tanımlanmış. Bu listenin ne olduğunu biliyorsunuz. Kullanıcının daha önce girmiş olduğu verileri saklayan bir liste bu.

def veri_al(yazi: str = "", onceki: list = (), uzunluk: int = 0):
    while True:
        veri = input(f"{yazi} = ")
        if len(veri) <= uzunluk:
            onceki_veriyi_yazdir(onceki=onceki)
        else:
            try:
                return int(veri)
            except ValueError:
                onceki_veriyi_yazdir(onceki=onceki)

Bu da basit bir fonksiyon aslında. Parametrelere bakıyoruz. yazi isminde bir parametre var. Her bir veriyi alırken, o verinin neye ait olduğunu kullanıcı bu yazi ile görecek. onceki isimli parametre de az önce açıkladığım işlemi yapacak. Bu fonksiyonda onceki=onceki şeklinde bir tanım var. Demek ki, onceki bu fonksiyonda da tanımlanmayacak. Diğer parametre uzunluk, bu uzunluk parametresi sizin kodlarınızda gördüğüm aşağıdaki koşul sebebiyle oluşturuldu.

if len(net_maas) <= 3:

Her bir veri için böyle koşullar tanımlamışsınız ama buradaki uzunluk sabit olmadığı için her bir veriye göre uzunluk da belirlenmeli. Dolayısıyla uzunluk parametresi burada koşulu kontrol ediyor.

def istek_olustur(tum_veri: dict = {}):
    onceki = []
    sonuc = []
    for k, v in tum_veri.items():
        veri = veri_al(yazi=k, onceki=onceki, uzunluk=v)
        onceki.append(
            f"{k} = {veri}"
        )
        sonuc.append(veri)
    return sonuc

Yukarıdaki fonksiyonda da tum_veri isimli bir sözlük parametre olarak verilmiş. Bütün verileri girerken kullanacağız bu veriyi. Bu fonksiyonda onceki listesini boş bir liste olarak tanımlıyoruz. Kullanıcıdan input ile veri aldıkça bu liste de dolmaya başlayacak. veri’yi veri değişkenine atayacağız değeri de veri_al(yazi=k, onceki=onceki, uzunluk=v)'ye göre belirlenecek. Bu veriyi onceki listesine {k} = {veri} olarak ekliyoruz. Birazdan bu k'nın ne olduğunu da anlatacağım. Ve son olarak sonuc listesinin içine veri'yi ekliyoruz.

Hesaplama kısmını atlıyorum. istek_olustur fonksiyonu aşağıda gördüğünüz gibi çağrılmış. Gördüğünüz gibi tüm_veri parametresine bir sözlük yazdık. Yukarıdaki ifade de k dan bahsetmiştim. Burada k değişkeni "NET MAAŞ" ve diğer anahtarlar oluyor. v değeri de yukarıda bahsettiğim uzunluk değerimiz. "NET MAAŞ" için uzunluk değeri 3.

        istek_olustur(
            tum_veri={
                "NET MAAŞ": 3,
                "NET AGI": 2,
                "1. AY BRÜT ÜCRETİNİZ": 3,
                "2. AY BRÜT ÜCRETİNİZ": 3,
                "3. AY BRÜT ÜCRETİNİZ": 3,
                "4. AY BRÜT ÜCRETİNİZ": 3,
                "5. AY BRÜT ÜCRETİNİZ": 3,
                "6. AY BRÜT ÜCRETİNİZ": 3,
                "7. AY BRÜT ÜCRETİNİZ": 3,
                "8. AY BRÜT ÜCRETİNİZ": 3,
                "9. AY BRÜT ÜCRETİNİZ": 3,
                "10. AY BRÜT ÜCRETİNİZ": 3,
                "11. AY BRÜT ÜCRETİNİZ": 3,
                "12. AY BRÜT ÜCRETİNİZ": 3,
                "İŞ KUR TARAFINDAN ÖDENECEK GÜN SAYISI": 0,
                "İŞ VEREN TARAFINDAN ÖDENECEK GÜN SAYISI": 0
            }
        )

Bu yukarıdaki fonksiyon bize bir liste döndürecek. Bu listeyi de hesapla fonksiyonunda kullanıyoruz. Sizin değişken isimlerini kullanarak yaptığınız hesaplamayı bu kez istek_olustur fonksiyonundan dönen listenin indeks değerlerini kullanarak yapıyoruz. Hangi indekste hangi değerin olduğunu bildiğimize göre bunu rahatlıkla yapabiliriz.

2 Beğeni

Mükemmel bir yapı, basit ama okuduğum da “aaa harbiden çok faydalı yaa” dedim ve ağzım biraz açık kaldı :smiley:


Uzunluk değerini daha basit bir şekilde belirlemiş olmanın programdan aldığı yükü görebildim baya iyi.


Sözlük oluşturmamızın sebebi, 2 farklı liste oluşturmak yerine item ve key kullanarak tek bir yapı içinde daha az kod ve kontrol merkezini bir yapıya indirerek daha kolay bir takip ve çalışma mantığı kurduk sanırım dimi?


Her yeni veri girişimde bir sonraki veride hata aldığım da ya da program bir önceki verileri yazdırması gerektiğinde sanki bir veritabanından bilgileri çekermiş gibi listelere ve sözlüklere giderek for döngüsü ile daha kısa yapılar ile daha büyük işleri tekrar edebiliyor diye anladım.


Bu yapıda kullanılan algoritmanız ufkumu açtı. Teşekkür ederim tekrardan, özellikle fonksiyonların açıklamaları için

2 Beğeni

Sözlük yerine list veya tuple da kullanabilirdik ama bu sefer k yerine i[0] ve v yerine de i[1] derdik. Sıkıntı olmazdı.

Sözlük kullanmayı seviyorum. Yani veriye şöyle ulaşmak hoşuma gidiyor. :slight_smile:

data["İstanbul"][1981]["doğumlar"]["ikizler"]

Her bir input için hata mesajı alma ihtimaliniz var mı? Var. O halde hata mesajı, her input için ortak olacak. Her yanlış girdiğimiz veri için bu veriden önce girilmiş verileri ekrana yazdırmak için bir liste tanımlayabiliriz. Bu liste her veri girişinde çoğalacak. İlk veriyi eklerken bu liste boşken, sıra ikinci veriye geldiğinde bu listemizde ilk verimiz olacak. Sıra üçüncü veriye geldiğinde bu listemizde 2 tane veri olacak…

1 Beğeni

Merhaba @dildeolupbiten

Programı tkinter kullanarak pencereli hale getirdim. Program çalışmasını istediğim şekilde çalışıyor. Ama bir sorun var. Aslında birden fazla.

  • entry alanına string ifade girmeyi engellemem lazım
  • koşul durumlarını kontrol edebilmem lazım. entry.get() ile çok fazla kod yazmam gerekiyor.
  • koşul durumlarına uyum sağlamayan satırları bulup satır yanlarında uyarı verme yazısı yazdım fakat belli bir sıraya göre uyarıları veriyor :frowning:
  • kaynak kodlarda çok fazla kalabalık oldu, acaba onları seyreltme imkanımız olabiliyor mu?

https://satemsoftware.com/drive/iskur_kaynak_kod.zip

zip dosyası içerisinde pencere klasörünün içinde ki kodlar diğeri konsol.

Müsait bir vaktiniz imkanınız varsa, pencere klasöründeki kod yapısına bir bakabilir misiniz?

Program çalışıyor ama elimden geldiğince kusursuz hale getirmeye çalışıyorum.

1 Beğeni

Paylaştığınız bağlantıyı indiremedim. Ama sizinle bir fikir vermesi açısından kod paylaşabilirim. Tabi programınızın büyüklüğüne göre, widgetler veya widget grupları için class kullanıp, her birini ayrı dosyalarda da tutabilirsiniz.

import tkinter as tk
from tkinter.messagebox import showinfo


def check(event):
    if not event.widget.get().isnumeric():
        index = event.widget.index("insert")
        event.widget.delete(index - 1, index)
            
        
def create_frames(master, number, side):
    for i in range(number):
        frame = tk.Frame(master=master)
        frame.pack(side=side)
        yield frame
    
        
def create_entries(master, labels, width):
    entries = []
    for i, j in enumerate(labels):
        label = tk.Label(master=master, text=j)
        label.grid(row=i, column=0, sticky="e")
        entry = tk.Entry(master=master, width=width)
        entry.grid(row=i, column=1, sticky="w")
        entry.bind(sequence="<KeyRelease>", func=check)
        entries.append(entry)
    return entries, labels
    
    
def create_labels(master, texts):
    labels = []
    master.configure(bd=1, relief="sunken")
    for i, j in enumerate(texts):
        label = tk.Label(master=master, text=j)
        label.grid(row=i, column=0, sticky="w")
        labels.append(label)
    return labels
        
    
def get_values(entries):
    if any(i.get() == "" for i in entries):
        return
    return [int(i.get()) for i in entries] 
        
        
def hesapla(veriler, labels, texts, min_values):
    if not veriler:
        showinfo(title="Warning", message="Boş kutucukları doldurun.")
        return
    for i, j in zip(veriler, min_values):
        if len(str(i)) < min_values[j]:
            showinfo(
                title="Warning", 
                message=f"{j} alanına girilen sayının minimum "
                        f"{min_values[j]} basamaklı olmalı."
            )
            return
    toplam = sum(i for i in veriler[2:-2])
    ortalama = toplam / 12
    gunluk = ortalama / 30
    gunluk_brut_odeme = gunluk * 0.60
    if gunluk_brut_odeme > 147.15:
        gunluk_brut_odeme = 147.15
    is_kur_odenegi = gunluk_brut_odeme * veriler[-2]
    is_veren_odenegi = (veriler[0] / 30) * veriler[-1] + veriler[1]
    toplam_kazanc = is_veren_odenegi + is_kur_odenegi
    eksik_tutar = (veriler[0] + veriler[1]) - toplam_kazanc
    for i, j in enumerate(
            [is_veren_odenegi, is_kur_odenegi, toplam_kazanc, eksik_tutar]
    ):    
        labels[i].configure(text=texts[i] + str(round(j, 2)) + " TL")
    
        
def main():
    root = tk.Tk()
    root.resizable(width=False, height=False)
    frames = create_frames(master=root, number=3, side="top")
    entries = create_entries(
        master=next(frames), 
        labels={
            "NET MAAŞ": 4,
            "NET AGI": 3,
            "1. AY BRÜT ÜCRETİNİZ": 4,
            "2. AY BRÜT ÜCRETİNİZ": 4,
            "3. AY BRÜT ÜCRETİNİZ": 4,
            "4. AY BRÜT ÜCRETİNİZ": 4,
            "5. AY BRÜT ÜCRETİNİZ": 4,
            "6. AY BRÜT ÜCRETİNİZ": 4,
            "7. AY BRÜT ÜCRETİNİZ": 4,
            "8. AY BRÜT ÜCRETİNİZ": 4,
            "9. AY BRÜT ÜCRETİNİZ": 4,
            "10. AY BRÜT ÜCRETİNİZ": 4,
            "11. AY BRÜT ÜCRETİNİZ": 4,
            "12. AY BRÜT ÜCRETİNİZ": 4,
            "İŞ KUR TARAFINDAN ÖDENECEK GÜN SAYISI": 2,
            "İŞ VEREN TARAFINDAN ÖDENECEK GÜN SAYISI": 2
        },
        width=6,
    )
    texts = [
            "İŞ VEREN TARAFINDAN ÖDENECEK MAAŞ TUTARI = ",
            "İŞ KUR TARAFINDAN ÖDENECEK MAAŞ TUTARI = ",
            "TOPLAM KAZANCINIZ = ",
            "EKSİK ALACAĞINIZ MAAŞ TUTARI = "           
    ]
    labels = create_labels(master=next(frames), texts=texts)
    button = tk.Button(
        master=next(frames), 
        text="HESAPLA", 
        command=lambda: hesapla(
            veriler=get_values(entries[0]),
            min_values=entries[1], 
            labels=labels, 
            texts=texts
        )
    )
    button.pack(side="bottom")
    root.mainloop()


main()
1 Beğeni

Yukarıdaki zaman göstergesi çalışıyor mu?

Aktif olarak çalışmıyor sadece her işlem yapıldığında kendini guncelliyordu.

1 Beğeni