bordro-hesaplama 0.0.1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- bordro/__init__.py +9 -0
- bordro/core.py +268 -0
- bordro/parametreler/2026.json +86 -0
- bordro_hesaplama-0.0.1.dist-info/METADATA +170 -0
- bordro_hesaplama-0.0.1.dist-info/RECORD +8 -0
- bordro_hesaplama-0.0.1.dist-info/WHEEL +5 -0
- bordro_hesaplama-0.0.1.dist-info/licenses/LICENSE +1 -0
- bordro_hesaplama-0.0.1.dist-info/top_level.txt +1 -0
bordro/__init__.py
ADDED
bordro/core.py
ADDED
|
@@ -0,0 +1,268 @@
|
|
|
1
|
+
"""
|
|
2
|
+
MAAŞ DÖNÜŞÜM ÇEKİRDEK MODÜLÜ (CORE)
|
|
3
|
+
- Brütten Nete & Netten Brüte Çeviri
|
|
4
|
+
- Aylık ve Yıllık Hesaplama
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
import json
|
|
8
|
+
import os
|
|
9
|
+
import pandas as pd
|
|
10
|
+
from typing import Dict, List, Union, Optional
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
# PARAMETRE YÖNETİMİ
|
|
14
|
+
|
|
15
|
+
class BordroParametreleri:
|
|
16
|
+
def __init__(self, yil: int = 2026):
|
|
17
|
+
self.veriler = self._json_yukle(yil)
|
|
18
|
+
|
|
19
|
+
self.ASGARI_UCRET_BRUT = self.veriler["ASGARI_UCRET_BRUT"]
|
|
20
|
+
# Tavanı hesapla
|
|
21
|
+
self.SGK_TAVAN = self.ASGARI_UCRET_BRUT * self.veriler["SGK_TAVAN_KATSAYI"]
|
|
22
|
+
|
|
23
|
+
self.AYLAR = self.veriler["AYLAR"]
|
|
24
|
+
self.ORAN_BES = self.veriler["ORANLAR"]["BES"]
|
|
25
|
+
self.ORAN_DAMGA = self.veriler["ORANLAR"]["DAMGA"]
|
|
26
|
+
|
|
27
|
+
# Sigorta Tipleri (Sadece işçi paylarını alacağız)
|
|
28
|
+
self.SIGORTA_TIPLERI = self.veriler["SIGORTA_TIPLERI"]
|
|
29
|
+
self.ENGELLILIK = self.veriler["ENGELLILIK_INDIRIMLERI"]
|
|
30
|
+
|
|
31
|
+
# Vergi dilimlerindeki null değerini sonsuzluğa (inf) çevir
|
|
32
|
+
dilimler = self.veriler["GELIR_VERGISI_DILIMLERI"]
|
|
33
|
+
if dilimler[-1][0] is None: dilimler[-1][0] = float('inf')
|
|
34
|
+
self.GELIR_VERGISI_DILIMLERI = dilimler
|
|
35
|
+
|
|
36
|
+
def _json_yukle(self, yil: int) -> Dict:
|
|
37
|
+
base_path = os.path.dirname(os.path.abspath(__file__))
|
|
38
|
+
json_path = os.path.join(base_path, "parametreler", f"{yil}.json")
|
|
39
|
+
if not os.path.exists(json_path):
|
|
40
|
+
raise FileNotFoundError(f"Parametre dosyası bulunamadı: {json_path}")
|
|
41
|
+
with open(json_path, 'r', encoding='utf-8') as f:
|
|
42
|
+
return json.load(f)
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
# Global Sabitler
|
|
46
|
+
SABITLER = BordroParametreleri(2026)
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
# YARDIMCI FONKSİYONLAR
|
|
51
|
+
|
|
52
|
+
def yuvarla(sayi: float) -> float:
|
|
53
|
+
"""Para birimi yuvarlama (2 hane)"""
|
|
54
|
+
return round(float(sayi or 0), 2)
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
def gelir_vergisi_hesapla(matrah: float, kumulatif_matrah: float = 0) -> float:
|
|
58
|
+
"""Kümülatif matraha göre dilimli gelir vergisi hesaplar."""
|
|
59
|
+
toplam_vergi = 0
|
|
60
|
+
hesaplanacak = matrah
|
|
61
|
+
gecici_kumulatif = kumulatif_matrah
|
|
62
|
+
|
|
63
|
+
for sinir, oran in SABITLER.GELIR_VERGISI_DILIMLERI:
|
|
64
|
+
if gecici_kumulatif >= sinir:
|
|
65
|
+
continue
|
|
66
|
+
|
|
67
|
+
kalan_limit = sinir - gecici_kumulatif
|
|
68
|
+
dilim_ici = min(hesaplanacak, kalan_limit)
|
|
69
|
+
|
|
70
|
+
toplam_vergi += dilim_ici * oran
|
|
71
|
+
hesaplanacak -= dilim_ici
|
|
72
|
+
gecici_kumulatif += dilim_ici
|
|
73
|
+
|
|
74
|
+
if hesaplanacak <= 0:
|
|
75
|
+
break
|
|
76
|
+
|
|
77
|
+
return toplam_vergi
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
# ANA FONKSİYON: BRÜT → NET (AYLIK)
|
|
82
|
+
|
|
83
|
+
def brut_net_aylik(brut_maas: float,
|
|
84
|
+
ay: int = 1,
|
|
85
|
+
devreden_matrah: Optional[float] = None,
|
|
86
|
+
sigorta_tipi_kodu: str = "01",
|
|
87
|
+
engel_derecesi: str = "0",
|
|
88
|
+
bes: bool = False,
|
|
89
|
+
bes_orani: Optional[float] = None) -> Dict:
|
|
90
|
+
"""
|
|
91
|
+
Verilen brüt maaşın o ayki net karşılığını hesaplar.
|
|
92
|
+
"""
|
|
93
|
+
|
|
94
|
+
# Parametre Hazırlığı
|
|
95
|
+
ay_ismi = SABITLER.AYLAR[ay - 1]
|
|
96
|
+
sigorta_bilgisi = SABITLER.SIGORTA_TIPLERI.get(sigorta_tipi_kodu, SABITLER.SIGORTA_TIPLERI["01"])
|
|
97
|
+
engelli_indirim = SABITLER.ENGELLILIK.get(str(engel_derecesi), 0)
|
|
98
|
+
|
|
99
|
+
# Devreden Matrah Yoksa Hesapla (Önceki ayları simüle et)
|
|
100
|
+
if devreden_matrah is None:
|
|
101
|
+
if ay == 1:
|
|
102
|
+
devreden_matrah = 0
|
|
103
|
+
else:
|
|
104
|
+
kumulatif = 0
|
|
105
|
+
for i in range(1, ay):
|
|
106
|
+
onceki = brut_net_aylik(brut_maas, i, kumulatif,
|
|
107
|
+
sigorta_tipi_kodu, engel_derecesi, bes, bes_orani)
|
|
108
|
+
kumulatif = onceki['kumulatif_matrah']
|
|
109
|
+
devreden_matrah = kumulatif
|
|
110
|
+
|
|
111
|
+
# HESAPLAMA
|
|
112
|
+
|
|
113
|
+
# 1. SGK ve İşsizlik (İşçi Payı)
|
|
114
|
+
sgk_matrah = min(brut_maas, SABITLER.SGK_TAVAN)
|
|
115
|
+
sgk_isci = yuvarla(sgk_matrah * sigorta_bilgisi["Isci_SGK"])
|
|
116
|
+
issizlik_isci = yuvarla(sgk_matrah * sigorta_bilgisi["Isci_Iss"])
|
|
117
|
+
|
|
118
|
+
# Gelir Vergisi
|
|
119
|
+
gv_matrah = max(0, brut_maas - sgk_isci - issizlik_isci - engelli_indirim)
|
|
120
|
+
|
|
121
|
+
if sigorta_bilgisi["Vergi_Muaf"]:
|
|
122
|
+
odenecek_gv = 0
|
|
123
|
+
else:
|
|
124
|
+
# Asgari Ücret İstisnası Hesabı
|
|
125
|
+
asgari_brut = SABITLER.ASGARI_UCRET_BRUT
|
|
126
|
+
asgari_sgk = yuvarla(asgari_brut * 0.14) # Standart %14
|
|
127
|
+
asgari_iss = yuvarla(asgari_brut * 0.01) # Standart %1
|
|
128
|
+
asgari_gv_matrah = asgari_brut - asgari_sgk - asgari_iss
|
|
129
|
+
|
|
130
|
+
asgari_kumulatif = asgari_gv_matrah * (ay - 1)
|
|
131
|
+
|
|
132
|
+
# Vergi Hesapla
|
|
133
|
+
gelir_vergisi = yuvarla(gelir_vergisi_hesapla(gv_matrah, devreden_matrah))
|
|
134
|
+
istisna_gv = yuvarla(gelir_vergisi_hesapla(asgari_gv_matrah, asgari_kumulatif))
|
|
135
|
+
|
|
136
|
+
# İstisnayı Düş
|
|
137
|
+
odenecek_gv = max(0, gelir_vergisi - istisna_gv)
|
|
138
|
+
|
|
139
|
+
# Damga Vergisi
|
|
140
|
+
damga_vergisi = yuvarla(brut_maas * SABITLER.ORAN_DAMGA)
|
|
141
|
+
asgari_damga = yuvarla(SABITLER.ASGARI_UCRET_BRUT * SABITLER.ORAN_DAMGA)
|
|
142
|
+
odenecek_dv = max(0, damga_vergisi - asgari_damga)
|
|
143
|
+
|
|
144
|
+
# BES Kesintisi
|
|
145
|
+
# Brüt maaş değil, SGK matrahı kullanılır
|
|
146
|
+
|
|
147
|
+
bes_tutari = 0
|
|
148
|
+
if bes:
|
|
149
|
+
kullanilacak_oran = bes_orani if bes_orani is not None else SABITLER.ORAN_BES
|
|
150
|
+
bes_tutari = yuvarla(sgk_matrah * kullanilacak_oran)
|
|
151
|
+
|
|
152
|
+
# NET MAAŞ
|
|
153
|
+
toplam_kesinti = sgk_isci + issizlik_isci + odenecek_gv + odenecek_dv + bes_tutari
|
|
154
|
+
net_maas = yuvarla(brut_maas - toplam_kesinti)
|
|
155
|
+
|
|
156
|
+
return {
|
|
157
|
+
'ay': ay_ismi,
|
|
158
|
+
'brut': brut_maas,
|
|
159
|
+
'net': net_maas,
|
|
160
|
+
'kumulatif_matrah': devreden_matrah + gv_matrah,
|
|
161
|
+
'sgk_isci': sgk_isci,
|
|
162
|
+
'issizlik_isci': issizlik_isci,
|
|
163
|
+
'gv': odenecek_gv,
|
|
164
|
+
'dv': odenecek_dv,
|
|
165
|
+
'bes': bes_tutari
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
|
|
169
|
+
# ANA FONKSİYON: BRÜT → NET (YILLIK LİSTE)
|
|
170
|
+
|
|
171
|
+
def brut_net_yillik(brut_maas: float,
|
|
172
|
+
sigorta_tipi_kodu: str = "01",
|
|
173
|
+
engel_derecesi: str = "0",
|
|
174
|
+
bes: bool = False,
|
|
175
|
+
bes_orani: Optional[float] = None,
|
|
176
|
+
dataframe: bool = True) -> Union[pd.DataFrame, List[Dict]]:
|
|
177
|
+
"""Brüt maaşın 12 aylık dökümünü verir."""
|
|
178
|
+
sonuclar = []
|
|
179
|
+
kumulatif = 0
|
|
180
|
+
|
|
181
|
+
for ay in range(1, 13):
|
|
182
|
+
sonuc = brut_net_aylik(brut_maas, ay, kumulatif,
|
|
183
|
+
sigorta_tipi_kodu, engel_derecesi, bes, bes_orani)
|
|
184
|
+
sonuclar.append(sonuc)
|
|
185
|
+
kumulatif = sonuc['kumulatif_matrah']
|
|
186
|
+
|
|
187
|
+
if dataframe:
|
|
188
|
+
df = pd.DataFrame(sonuclar)
|
|
189
|
+
toplam = df.select_dtypes(include=['number']).sum()
|
|
190
|
+
toplam['ay'] = 'TOPLAM'
|
|
191
|
+
df.loc['TOPLAM'] = toplam
|
|
192
|
+
return df
|
|
193
|
+
|
|
194
|
+
return sonuclar
|
|
195
|
+
|
|
196
|
+
|
|
197
|
+
# TERS FONKSİYON: NET → BRÜT (AYLIK)
|
|
198
|
+
|
|
199
|
+
def net_brut_aylik(hedef_net: float,
|
|
200
|
+
ay: int = 1,
|
|
201
|
+
devreden_matrah: float = 0,
|
|
202
|
+
sigorta_tipi_kodu: str = "01",
|
|
203
|
+
engel_derecesi: str = "0",
|
|
204
|
+
bes: bool = False,
|
|
205
|
+
bes_orani: Optional[float] = None) -> Dict:
|
|
206
|
+
"""
|
|
207
|
+
İstenilen NET maaşı elde etmek için gereken BRÜT maaşı bulur.
|
|
208
|
+
(Deneme-Yanılma / Bisection Yöntemi ile çalışır)
|
|
209
|
+
BES varsa, hedefimiz (Cepteki Net + BES Kesintisi) toplamıdır.
|
|
210
|
+
Böylece BES işveren maliyeti olmaz, çalışanın netinden düşer.
|
|
211
|
+
"""
|
|
212
|
+
|
|
213
|
+
alt = hedef_net
|
|
214
|
+
ust = hedef_net * 3.0 # Tahmini üst sınır
|
|
215
|
+
|
|
216
|
+
# 50 adımda doğru sonuca yaklaş
|
|
217
|
+
for _ in range(50):
|
|
218
|
+
orta_brut = (alt + ust) / 2
|
|
219
|
+
|
|
220
|
+
sonuc = brut_net_aylik(orta_brut, ay, devreden_matrah,
|
|
221
|
+
sigorta_tipi_kodu, engel_derecesi, bes, bes_orani)
|
|
222
|
+
|
|
223
|
+
|
|
224
|
+
elimize_gecen_deger = sonuc['net']
|
|
225
|
+
if bes:
|
|
226
|
+
elimize_gecen_deger += sonuc['bes']
|
|
227
|
+
|
|
228
|
+
fark = elimize_gecen_deger - hedef_net
|
|
229
|
+
# ---------------------------
|
|
230
|
+
|
|
231
|
+
if abs(fark) < 0.01: # 1 kuruş hassasiyet
|
|
232
|
+
return sonuc
|
|
233
|
+
|
|
234
|
+
if fark < 0: # Hesaplanan az geldiyse brütü artır
|
|
235
|
+
alt = orta_brut
|
|
236
|
+
else: # Hesaplanan çok geldiyse brütü azalt
|
|
237
|
+
ust = orta_brut
|
|
238
|
+
|
|
239
|
+
return sonuc
|
|
240
|
+
|
|
241
|
+
|
|
242
|
+
# TERS FONKSİYON: NET → BRÜT (YILLIK)
|
|
243
|
+
|
|
244
|
+
def net_brut_yillik(hedef_net: float,
|
|
245
|
+
sigorta_tipi_kodu: str = "01",
|
|
246
|
+
engel_derecesi: str = "0",
|
|
247
|
+
bes: bool = False,
|
|
248
|
+
bes_orani: Optional[float] = None,
|
|
249
|
+
dataframe: bool = True) -> Union[pd.DataFrame, List[Dict]]:
|
|
250
|
+
"""Her ay ele o NET paranın geçmesi için gereken Brütleri hesaplar."""
|
|
251
|
+
|
|
252
|
+
sonuclar = []
|
|
253
|
+
kumulatif = 0
|
|
254
|
+
|
|
255
|
+
for ay in range(1, 13):
|
|
256
|
+
sonuc = net_brut_aylik(hedef_net, ay, kumulatif,
|
|
257
|
+
sigorta_tipi_kodu, engel_derecesi, bes, bes_orani)
|
|
258
|
+
sonuclar.append(sonuc)
|
|
259
|
+
kumulatif = sonuc['kumulatif_matrah']
|
|
260
|
+
|
|
261
|
+
if dataframe:
|
|
262
|
+
df = pd.DataFrame(sonuclar)
|
|
263
|
+
toplam = df.select_dtypes(include=['number']).sum()
|
|
264
|
+
toplam['ay'] = 'TOPLAM'
|
|
265
|
+
df.loc['TOPLAM'] = toplam
|
|
266
|
+
return df
|
|
267
|
+
|
|
268
|
+
return sonuclar
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
{
|
|
2
|
+
"YIL": 2026,
|
|
3
|
+
"ASGARI_UCRET_BRUT": 33030.00,
|
|
4
|
+
"SGK_TAVAN_KATSAYI": 9.0,
|
|
5
|
+
"AYLAR": ["Ocak", "Şubat", "Mart", "Nisan", "Mayıs", "Haziran",
|
|
6
|
+
"Temmuz", "Ağustos", "Eylül", "Ekim", "Kasım", "Aralık"],
|
|
7
|
+
|
|
8
|
+
"GELIR_VERGISI_DILIMLERI": [
|
|
9
|
+
[190000.00, 0.15],
|
|
10
|
+
[400000.00, 0.20],
|
|
11
|
+
[1500000.00, 0.27],
|
|
12
|
+
[5300000.00, 0.35],
|
|
13
|
+
[null, 0.40]
|
|
14
|
+
],
|
|
15
|
+
|
|
16
|
+
"ORANLAR": {
|
|
17
|
+
"BES": 0.03,
|
|
18
|
+
"DAMGA": 0.00759
|
|
19
|
+
},
|
|
20
|
+
|
|
21
|
+
"ENGELLILIK_INDIRIMLERI": {
|
|
22
|
+
"0": 0,
|
|
23
|
+
"1": 12000,
|
|
24
|
+
"2": 7000,
|
|
25
|
+
"3": 3000
|
|
26
|
+
},
|
|
27
|
+
|
|
28
|
+
"SIGORTA_TIPLERI": {
|
|
29
|
+
"00": {"Ad": "00 - SGK'ya Tabi Değil", "Isci_SGK": 0.00, "Isci_Iss": 0.00, "Isveren_SGK": 0.00, "Isveren_Iss": 0.00, "Vergi_Muaf": false},
|
|
30
|
+
"01": {"Ad": "01 - Normal Çalışan", "Isci_SGK": 0.14, "Isci_Iss": 0.01, "Isveren_SGK": 0.2175, "Isveren_Iss": 0.02, "Vergi_Muaf": false},
|
|
31
|
+
"02": {"Ad": "02 - Emekli (SGDP)", "Isci_SGK": 0.075, "Isci_Iss": 0.00, "Isveren_SGK": 0.245, "Isveren_Iss": 0.00, "Vergi_Muaf": false},
|
|
32
|
+
"04": {"Ad": "04 - Yeraltı Sürekli (Maden)", "Isci_SGK": 0.14, "Isci_Iss": 0.01, "Isveren_SGK": 0.2475, "Isveren_Iss": 0.02, "Vergi_Muaf": false},
|
|
33
|
+
"05": {"Ad": "05 - Yeraltı Gruplu", "Isci_SGK": 0.14, "Isci_Iss": 0.01, "Isveren_SGK": 0.2475, "Isveren_Iss": 0.02, "Vergi_Muaf": false},
|
|
34
|
+
"06": {"Ad": "06 - Yer Üstü Gruplu", "Isci_SGK": 0.14, "Isci_Iss": 0.01, "Isveren_SGK": 0.2175, "Isveren_Iss": 0.02, "Vergi_Muaf": false},
|
|
35
|
+
"07": {"Ad": "07 - Çırak / Öğrenci", "Isci_SGK": 0.00, "Isci_Iss": 0.00, "Isveren_SGK": 0.02, "Isveren_Iss": 0.00, "Vergi_Muaf": true},
|
|
36
|
+
"12": {"Ad": "12 - Banka Sandıkları", "Isci_SGK": 0.14, "Isci_Iss": 0.01, "Isveren_SGK": 0.2175, "Isveren_Iss": 0.02, "Vergi_Muaf": false},
|
|
37
|
+
"13": {"Ad": "13 - İşsizliksiz Normal", "Isci_SGK": 0.14, "Isci_Iss": 0.00, "Isveren_SGK": 0.2175, "Isveren_Iss": 0.00, "Vergi_Muaf": false},
|
|
38
|
+
"14": {"Ad": "14 - Libya", "Isci_SGK": 0.05, "Isci_Iss": 0.00, "Isveren_SGK": 0.095, "Isveren_Iss": 0.00, "Vergi_Muaf": false},
|
|
39
|
+
"19": {"Ad": "19 - Hükümlü ve Tutuklu", "Isci_SGK": 0.00, "Isci_Iss": 0.00, "Isveren_SGK": 0.02, "Isveren_Iss": 0.00, "Vergi_Muaf": true},
|
|
40
|
+
"20": {"Ad": "20 - Almanya İstisna", "Isci_SGK": 0.00, "Isci_Iss": 0.00, "Isveren_SGK": 0.00, "Isveren_Iss": 0.00, "Vergi_Muaf": false},
|
|
41
|
+
"21": {"Ad": "21 - Yurt Dışı (Sözleşmesiz)", "Isci_SGK": 0.06, "Isci_Iss": 0.00, "Isveren_SGK": 0.115, "Isveren_Iss": 0.00, "Vergi_Muaf": false},
|
|
42
|
+
"22": {"Ad": "22 - Stajyer Öğrenci", "Isci_SGK": 0.00, "Isci_Iss": 0.00, "Isveren_SGK": 0.02, "Isveren_Iss": 0.00, "Vergi_Muaf": true},
|
|
43
|
+
"23": {"Ad": "23 - Harp Malulleri", "Isci_SGK": 0.14, "Isci_Iss": 0.01, "Isveren_SGK": 0.2175, "Isveren_Iss": 0.02, "Vergi_Muaf": false},
|
|
44
|
+
"25": {"Ad": "25 - İŞKUR Kursiyer", "Isci_SGK": 0.00, "Isci_Iss": 0.00, "Isveren_SGK": 0.00, "Isveren_Iss": 0.00, "Vergi_Muaf": true},
|
|
45
|
+
"28": {"Ad": "28 - İş Kaybı Tazminatı", "Isci_SGK": 0.00, "Isci_Iss": 0.00, "Isveren_SGK": 0.00, "Isveren_Iss": 0.00, "Vergi_Muaf": false},
|
|
46
|
+
"29": {"Ad": "29 - 60 Gün FHSZ (Tüm)", "Isci_SGK": 0.14, "Isci_Iss": 0.01, "Isveren_SGK": 0.2275, "Isveren_Iss": 0.02, "Vergi_Muaf": false},
|
|
47
|
+
"30": {"Ad": "30 - 60 Gün FHSZ (İşsizliksiz)", "Isci_SGK": 0.14, "Isci_Iss": 0.00, "Isveren_SGK": 0.2275, "Isveren_Iss": 0.00, "Vergi_Muaf": false},
|
|
48
|
+
"31": {"Ad": "31 - 60 Gün FHSZ (Malul)", "Isci_SGK": 0.14, "Isci_Iss": 0.01, "Isveren_SGK": 0.2275, "Isveren_Iss": 0.02, "Vergi_Muaf": false},
|
|
49
|
+
"32": {"Ad": "32 - 90 Gün FHSZ (Tüm)", "Isci_SGK": 0.14, "Isci_Iss": 0.01, "Isveren_SGK": 0.2325, "Isveren_Iss": 0.02, "Vergi_Muaf": false},
|
|
50
|
+
"33": {"Ad": "33 - 90 Gün FHSZ (İşsizliksiz)", "Isci_SGK": 0.14, "Isci_Iss": 0.00, "Isveren_SGK": 0.2325, "Isveren_Iss": 0.00, "Vergi_Muaf": false},
|
|
51
|
+
"34": {"Ad": "34 - 90 Gün FHSZ (Malul)", "Isci_SGK": 0.14, "Isci_Iss": 0.01, "Isveren_SGK": 0.2325, "Isveren_Iss": 0.02, "Vergi_Muaf": false},
|
|
52
|
+
"35": {"Ad": "35 - 180 Gün FHSZ (Tüm)", "Isci_SGK": 0.14, "Isci_Iss": 0.01, "Isveren_SGK": 0.2475, "Isveren_Iss": 0.02, "Vergi_Muaf": false},
|
|
53
|
+
"37": {"Ad": "37 - 180 Gün FHSZ (Malul)", "Isci_SGK": 0.14, "Isci_Iss": 0.01, "Isveren_SGK": 0.2475, "Isveren_Iss": 0.02, "Vergi_Muaf": false},
|
|
54
|
+
"39": {"Ad": "39 - Birleşik Krallık/İsviçre", "Isci_SGK": 0.05, "Isci_Iss": 0.00, "Isveren_SGK": 0.095, "Isveren_Iss": 0.00, "Vergi_Muaf": false},
|
|
55
|
+
"41": {"Ad": "41 - Askıda Olanlar", "Isci_SGK": 0.00, "Isci_Iss": 0.00, "Isveren_SGK": 0.12, "Isveren_Iss": 0.00, "Vergi_Muaf": false},
|
|
56
|
+
"90": {"Ad": "90 - İtibari Hizmet", "Isci_SGK": 0.14, "Isci_Iss": 0.01, "Isveren_SGK": 0.2175, "Isveren_Iss": 0.02, "Vergi_Muaf": false},
|
|
57
|
+
"91": {"Ad": "91 - 60 Gün FHSZ + İtibari", "Isci_SGK": 0.14, "Isci_Iss": 0.01, "Isveren_SGK": 0.2275, "Isveren_Iss": 0.02, "Vergi_Muaf": false},
|
|
58
|
+
"92": {"Ad": "92 - 90 Gün FHSZ + İtibari", "Isci_SGK": 0.14, "Isci_Iss": 0.01, "Isveren_SGK": 0.2325, "Isveren_Iss": 0.02, "Vergi_Muaf": false}
|
|
59
|
+
},
|
|
60
|
+
|
|
61
|
+
"TESVIK_KODLARI": {
|
|
62
|
+
"00000": {"Ad": "Teşviksiz", "Indirim": 0.00},
|
|
63
|
+
"05510": {"Ad": "05510 - Hazine (%5)", "Indirim": 0.05},
|
|
64
|
+
"05746": {"Ad": "05746 - Ar-Ge Merkezi", "Indirim": 0.2175},
|
|
65
|
+
"05921": {"Ad": "05921 - İşsizlik Ödeneği", "Indirim": 0.2175},
|
|
66
|
+
"06111": {"Ad": "06111 - Genç/Kadın İstihdamı", "Indirim": 0.2175},
|
|
67
|
+
"06486": {"Ad": "06486 - Bölgesel (6 Puan)", "Indirim": 0.11},
|
|
68
|
+
"06645": {"Ad": "06645 - İşbaşı Eğitim", "Indirim": 0.2175},
|
|
69
|
+
"14447": {"Ad": "14447 - İşsizlik Ödeneği", "Indirim": 0.05},
|
|
70
|
+
"14857": {"Ad": "14857 - Engelli Teşviki", "Indirim": 0.2175},
|
|
71
|
+
"15921": {"Ad": "15921 - 5921 Eski", "Indirim": 0.2175},
|
|
72
|
+
"16322": {"Ad": "16322 - Yatırım Teşviki", "Indirim": 0.05},
|
|
73
|
+
"24447": {"Ad": "24447 - İlave İstihdam (Hizmet)", "Indirim": 0.2175},
|
|
74
|
+
"25225": {"Ad": "25225 - Kültür Yatırımları", "Indirim": 0.2175},
|
|
75
|
+
"25510": {"Ad": "25510 - Yatırım Teşviki Ek", "Indirim": 0.05},
|
|
76
|
+
"26322": {"Ad": "26322 - Yatırım Teşviki Genel", "Indirim": 0.05},
|
|
77
|
+
"44447": {"Ad": "44447 - İlave İstihdam (İmalat)", "Indirim": 0.2175},
|
|
78
|
+
"46486": {"Ad": "46486 - Bölgesel Ek Puan", "Indirim": 0.11},
|
|
79
|
+
"54857": {"Ad": "54857 - Korumalı İşyeri", "Indirim": 0.2175},
|
|
80
|
+
"55225": {"Ad": "55225 - Kültür Girişimleri", "Indirim": 0.2175},
|
|
81
|
+
"56486": {"Ad": "56486 - Bölgesel Teşvik (En Yaygın)", "Indirim": 0.11},
|
|
82
|
+
"64447": {"Ad": "64447 - 4447 Diğer", "Indirim": 0.2175},
|
|
83
|
+
"66476": {"Ad": "66476 - Ar-Ge/Teknoloji", "Indirim": 0.2175},
|
|
84
|
+
"84447": {"Ad": "84447 - 4447 Özel", "Indirim": 0.2175}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: bordro-hesaplama
|
|
3
|
+
Version: 0.0.1
|
|
4
|
+
Summary: 2026 Türkiye parametreleriyle çalışan, aylık ve yıllık Net-Brüt ve Brüt-Net maaş dönüşümlerini yapan hesaplama motoru.
|
|
5
|
+
Author: Geliştirici
|
|
6
|
+
Classifier: Programming Language :: Python :: 3
|
|
7
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
8
|
+
Classifier: Operating System :: OS Independent
|
|
9
|
+
Requires-Python: >=3.9
|
|
10
|
+
Description-Content-Type: text/markdown
|
|
11
|
+
License-File: LICENSE
|
|
12
|
+
Requires-Dist: pandas>=1.0.0
|
|
13
|
+
Dynamic: license-file
|
|
14
|
+
|
|
15
|
+
# Maaş Dönüşüm Kütüphanesi
|
|
16
|
+
|
|
17
|
+
Türkiye'deki bordro hesaplamalarını basitleştiren Python kütüphanesi. Brüt maaştan net maaşa, net maaştan brüt maaşa dönüşüm yapmanızı sağlar.
|
|
18
|
+
|
|
19
|
+
## 🚀 Özellikler
|
|
20
|
+
|
|
21
|
+
- ✅ **Brüt → Net** dönüşümü (aylık ve yıllık)
|
|
22
|
+
- ✅ **Net → Brüt** dönüşümü (aylık ve yıllık)
|
|
23
|
+
- ✅ Kademeli gelir vergisi hesaplama
|
|
24
|
+
- ✅ Asgari ücret istisnası desteği
|
|
25
|
+
- ✅ **30+ farklı sigorta tipi** desteği (Normal çalışan, Emekli, Çırak, Stajyer, vs.)
|
|
26
|
+
- ✅ Engelli çalışan indirimleri (1., 2., 3. derece)
|
|
27
|
+
- ✅ BES (Bireysel Emeklilik Sistemi) kesintisi
|
|
28
|
+
- ✅ 2026 güncel parametreleri
|
|
29
|
+
|
|
30
|
+
## Kurulum
|
|
31
|
+
|
|
32
|
+
```bash
|
|
33
|
+
pip install pandas
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
Kütüphaneyi projenize dahil edin:
|
|
37
|
+
|
|
38
|
+
```python
|
|
39
|
+
from bordro import brut_net_aylik, brut_net_yillik, net_brut_aylik, net_brut_yillik
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
## Parametreler
|
|
43
|
+
|
|
44
|
+
### Sigorta Tipi Kodları (Öne Çıkanlar)
|
|
45
|
+
|
|
46
|
+
| Kod | Açıklama | SGK (İşçi) | İşsizlik (İşçi) | Vergi Muaf |
|
|
47
|
+
|-----|----------|------------|-----------------|------------|
|
|
48
|
+
| **"00"** | SGK'ya Tabi Değil | %0 | %0 | Hayır |
|
|
49
|
+
| **"01"** | Normal Çalışan (En Yaygın) | %14 | %1 | Hayır |
|
|
50
|
+
| **"02"** | Emekli (SGDP) | %7.5 | %0 | Hayır |
|
|
51
|
+
| **"07"** | Çırak / Öğrenci | %0 | %0 | **Evet** |
|
|
52
|
+
| **"13"** | İşsizliksiz Normal | %14 | %0 | Hayır |
|
|
53
|
+
| **"19"** | Hükümlü ve Tutuklu | %0 | %0 | **Evet** |
|
|
54
|
+
| **"22"** | Stajyer Öğrenci | %0 | %0 | **Evet** |
|
|
55
|
+
| **"25"** | İŞKUR Kursiyer | %0 | %0 | **Evet** |
|
|
56
|
+
|
|
57
|
+
**Not:** Toplam 30+ sigorta tipi mevcuttur. Tüm liste için `2026.json` dosyasına bakınız.
|
|
58
|
+
|
|
59
|
+
### Engellilik Dereceleri
|
|
60
|
+
|
|
61
|
+
| Kod | Açıklama | Aylık İndirim (2026) |
|
|
62
|
+
|-----|----------|----------------------|
|
|
63
|
+
| **"0"** | Engelli değil | 0 TL |
|
|
64
|
+
| **"1"** | 1. Derece | 12,000 TL |
|
|
65
|
+
| **"2"** | 2. Derece | 7,000 TL |
|
|
66
|
+
| **"3"** | 3. Derece | 3,000 TL |
|
|
67
|
+
|
|
68
|
+
### 2026 Güncel Parametreler
|
|
69
|
+
|
|
70
|
+
| Parametre | Değer |
|
|
71
|
+
|-----------|-------|
|
|
72
|
+
| **Asgari Ücret (Brüt)** | 33,030 TL |
|
|
73
|
+
| **SGK Tavanı** | 297,270 TL (Asgari ücret × 9) |
|
|
74
|
+
| **Damga Vergisi** | %0.759 |
|
|
75
|
+
| **BES Varsayılan Oran** | %3 |
|
|
76
|
+
|
|
77
|
+
### Gelir Vergisi Dilimleri (2026)
|
|
78
|
+
|
|
79
|
+
| Matrah Aralığı | Vergi Oranı |
|
|
80
|
+
|----------------|-------------|
|
|
81
|
+
| 0 - 190,000 TL | %15 |
|
|
82
|
+
| 190,000 - 400,000 TL | %20 |
|
|
83
|
+
| 400,000 - 1,500,000 TL | %27 |
|
|
84
|
+
| 1,500,000 - 5,300,000 TL | %35 |
|
|
85
|
+
| 5,300,000 TL üzeri | %40 |
|
|
86
|
+
|
|
87
|
+
## 📁 Proje Yapısı
|
|
88
|
+
|
|
89
|
+
```
|
|
90
|
+
proje/
|
|
91
|
+
│
|
|
92
|
+
├── core.py # Ana modül (hesaplama motoru)
|
|
93
|
+
├── parametreler/ # Yıllık parametre dosyaları
|
|
94
|
+
│ └── 2026.json # 2026 yılı parametreleri
|
|
95
|
+
│ # (Asgari ücret, vergiler, sigorta tipleri vb.)
|
|
96
|
+
└── README.md # Bu dosya
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
## 💡 Kullanım Örnekleri
|
|
100
|
+
|
|
101
|
+
### Örnek 1: Normal Çalışan vs Emekli Çalışan
|
|
102
|
+
|
|
103
|
+
```python
|
|
104
|
+
# Normal çalışan
|
|
105
|
+
normal = brut_net_aylik(60000, sigorta_tipi_kodu="01")
|
|
106
|
+
print(f"Normal Çalışan Net: {normal['net']:.2f} TL")
|
|
107
|
+
print(f"SGK: {normal['sgk_isci']:.2f} TL")
|
|
108
|
+
|
|
109
|
+
# Emekli çalışan (daha az SGK kesilir)
|
|
110
|
+
emekli = brut_net_aylik(60000, sigorta_tipi_kodu="02")
|
|
111
|
+
print(f"Emekli Net: {emekli['net']:.2f} TL")
|
|
112
|
+
print(f"SGK: {emekli['sgk_isci']:.2f} TL")
|
|
113
|
+
print(f"Fark: {emekli['net'] - normal['net']:.2f} TL")
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
### Örnek 2: Farklı Aylardaki Net Maaş Farkı (Kümülatif Vergi)
|
|
117
|
+
|
|
118
|
+
```python
|
|
119
|
+
# Ocak ayı
|
|
120
|
+
ocak = brut_net_aylik(70000, ay=1)
|
|
121
|
+
print(f"Ocak Net: {ocak['net']:.2f} TL")
|
|
122
|
+
|
|
123
|
+
# Haziran ayı
|
|
124
|
+
haziran = brut_net_aylik(70000, ay=6)
|
|
125
|
+
print(f"Haziran Net: {haziran['net']:.2f} TL")
|
|
126
|
+
|
|
127
|
+
# Aralık ayı (kümülatif vergi nedeniyle daha düşük)
|
|
128
|
+
aralik = brut_net_aylik(70000, ay=12)
|
|
129
|
+
print(f"Aralık Net: {aralik['net']:.2f} TL")
|
|
130
|
+
|
|
131
|
+
print(f"Ocak-Aralık Farkı: {ocak['net'] - aralik['net']:.2f} TL")
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
### Örnek 3: Engelli Çalışan Hesaplaması
|
|
135
|
+
|
|
136
|
+
```python
|
|
137
|
+
# Normal çalışan
|
|
138
|
+
normal = brut_net_aylik(50000)
|
|
139
|
+
|
|
140
|
+
# 1. derece engelli (12,000 TL indirim)
|
|
141
|
+
engelli_1 = brut_net_aylik(50000, engel_derecesi="1")
|
|
142
|
+
|
|
143
|
+
# 2. derece engelli (7,000 TL indirim)
|
|
144
|
+
engelli_2 = brut_net_aylik(50000, engel_derecesi="2")
|
|
145
|
+
|
|
146
|
+
# 3. derece engelli (3,000 TL indirim)
|
|
147
|
+
engelli_3 = brut_net_aylik(50000, engel_derecesi="3")
|
|
148
|
+
|
|
149
|
+
print(f"Normal Net: {normal['net']:.2f} TL")
|
|
150
|
+
print(f"1. Derece Net: {engelli_1['net']:.2f} TL (+{engelli_1['net'] - normal['net']:.2f} TL)")
|
|
151
|
+
print(f"2. Derece Net: {engelli_2['net']:.2f} TL (+{engelli_2['net'] - normal['net']:.2f} TL)")
|
|
152
|
+
print(f"3. Derece Net: {engelli_3['net']:.2f} TL (+{engelli_3['net'] - normal['net']:.2f} TL)")
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
### Örnek 4: BES ile Vergi Avantajı
|
|
156
|
+
|
|
157
|
+
```python
|
|
158
|
+
# BES olmadan
|
|
159
|
+
bes_yok = brut_net_aylik(80000, bes=False)
|
|
160
|
+
|
|
161
|
+
# %3 BES ile
|
|
162
|
+
bes_3 = brut_net_aylik(80000, bes=True, bes_orani=0.03)
|
|
163
|
+
|
|
164
|
+
print(f"BES Yok - Net: {bes_yok['net']:.2f} TL")
|
|
165
|
+
print(f"BES %3 - Net: {bes_3['net']:.2f} TL, BES: {bes_3['bes']:.2f} TL")
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
---
|
|
169
|
+
|
|
170
|
+
**Not**: Bu kütüphane **2026 yılı** Türkiye bordro mevzuatına göre hazırlanmıştır. Yeni yıllarda `parametreler/` klasöründe yeni JSON dosyası oluşturarak güncelleyebilirsiniz.
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
bordro/__init__.py,sha256=u6-ZiuexZCLb6wbGoxIpDaV4iGL_3N4T4BkFQ3qo1qQ,147
|
|
2
|
+
bordro/core.py,sha256=_D3kXhIaHqRCZWLIzmsyD-nUw0SQjnA21jxtWQJgbz8,9058
|
|
3
|
+
bordro/parametreler/2026.json,sha256=3fnIi4eOPkF3TFj0A5ElgH8fCHOoiXN-Rk_pHH9bFt8,6649
|
|
4
|
+
bordro_hesaplama-0.0.1.dist-info/licenses/LICENSE,sha256=q7KJbcPCqUAvkBuI1QNc8Kg9XPfBfnNkLN9WKwudO8U,11
|
|
5
|
+
bordro_hesaplama-0.0.1.dist-info/METADATA,sha256=_QeqMxtuD9Poq0xEnXL_bdbAnZIoWB_tX3LnOSiZavM,5615
|
|
6
|
+
bordro_hesaplama-0.0.1.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
|
|
7
|
+
bordro_hesaplama-0.0.1.dist-info/top_level.txt,sha256=8Wjqhckh32MFN270r-RsXGKZ2eK48CpZYAJTW7Xzxvc,7
|
|
8
|
+
bordro_hesaplama-0.0.1.dist-info/RECORD,,
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
MIT License
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
bordro
|