pyikb/pyikb/pyikb.py
2019-08-24 15:24:23 +02:00

238 lines
7.7 KiB
Python

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Author: J.A. de Jong - ASCEE
Beperkingen: eigenwoningforfait en hypotheekrenteaftrek worden nog niet
meegenomen. Het handigst is om de som van deze bedragen mee te nemen in de
priveaftrek.
Vul alleen investeringen in waarvoor investeringsaftrek geldt (geen
personenauto's bijvoorbeeld).
"""
__all__ = ['IKB_single', 'IKB_VOF']
class IKB_single:
"""
Inkomstenbelasting voor een ZZP-er, voor gegeven brutowinst
"""
def __init__(self, jaar=2019,
startersaftrek: bool = False,
ondernemersaftrek: bool = True,
priveaftrek: float = 0.,
voorlopig: float = 0.,
investeringen: float = 0,
verbose = True,
):
"""
Initialiseer een IKB-klasse voor een enkele ondernemer.
Args:
startersaftrek: True als de startersaftrek toegepast moet worden
ondernemersaftrek: True als de ondernemersaftrekposten, zoals
MKB-winstvrijstelling en zelfstandigenaftrek toegepast dient te
worden.
priveaftrek: Prive-aftrekposten (denk aan premie A.O.V.)
voorlopig: Reeds betaalde hoeveelheid belasting in voorlopige
aanslag
investeringen: vul hier het totaal in van het bedrag aan
investeringen dat dit jaar gedaan is (€). Dit wordt gebruikt voor
het berekenen van de kleinschaligheidsinvesteringsaftrek (KIA). Let
op: zet dit op 0 voor een V.O.F.!
"""
if jaar != 2019:
raise NotImplementedError('2019 kan alleen in deze versie')
self.sa = startersaftrek
self.oa = ondernemersaftrek
self.priveaftrek = priveaftrek
self.voorlopig = voorlopig
self.investeringen = investeringen
def bereken(self, brutowinst:float,
investeringen:float=0.):
"""
Bereken de te betalen IKB over 2019
Args:
brutowinst: winst uit ondernememing dat voor rekening van deze
persoon komt (€).
voorlopig: reeds betaald via voorlopige aanslag (€)
Returns:
Nog te betalen IKB voor het jaar (€)
"""
nettowinst = brutowinst
if self.oa:
# Zelfstandigenaftrek
nettowinst = max(nettowinst - 7280, 0)
if self.sa:
nettowinst = max(nettowinst - 2123, 0)
if self.oa:
# MKB-winstvrijstelling
nettowinst *= (1 - 0.14)
nettowinst = max(0, nettowinst)
print(f'Nettowinst na ondernemersaftrekposten {nettowinst}')
# Kleinschaligheidsinvesteringsaftrek
investeringen = self.investeringen
if investeringen <= 2300:
kia = 0.
elif investeringen <= 57321.:
kia = 0.28*investeringen
elif investeringen <= 106150.:
kia = 16051
elif investeringen <= 318449.:
kia = 16051 - 0.0756*(investeringen - 106150)
else:
kia = 0.
# Belastbaar inkomen, nog zo'n term
BI = max(0, nettowinst - self.priveaftrek - kia)
# print(f'Nettowinst: € {nettowinst}')
print(f'Belastbaar inkomen: {BI}')
# Afdeling: inkomstenbelasting ####################
# ibz: inkomensafhankelijke bijdrage z.v.w.
ibzvw = min(BI, 54614)*0.0565
print(f'IBZVW: {ibzvw}')
s1end = 20384.
perc_s1 = .3655
s2end = 34300.
perc_s2 = 0.381
s3end = 68507.
perc_s3 = 0.381
perc_s4 = 0.5175
# inkomstenbelasting schijven
ibs1 = min(BI, s1end)*perc_s1
print(f'IB Schijf 1: {ibs1}')
ibs2 = max(min(BI, s2end) - s1end, 0)*perc_s2
print(f'IB Schijf 2: {ibs2}')
ibs3 = max(min(BI, s3end) - s2end, 0)*perc_s3
print(f'IB Schijf 3: {ibs3}')
ibs4 = max(max(BI, s3end) - s3end, 0)*perc_s4
print(f'IB Schijf 4: {ibs4}')
belasting_box1 = ibzvw + ibs1+ibs2+ibs3+ibs4
print(f'Belasting box 1: {belasting_box1}')
assert belasting_box1 >= 0
# Afdeling: Heffingskortingen ####################
# Algemene heffingskorting, BI = belastbaar inkomen
if BI <= 20384:
ahk = 2477
elif BI <= 68507:
ahk = 2477 - 0.05147 * (BI - 20384)
else:
ahk = 0
print(f'Alg. hk: {ahk}')
# Arbeidskorting, arbeidsinkomen = winst uit onderneming voor
# ondernemersaftrekken
if brutowinst <= 9694:
ak = 0.01754 * brutowinst
elif brutowinst <= 20940:
ak = 170 + 0.28712*(brutowinst - 9694)
elif brutowinst <= 34060:
ak = 3399.
elif brutowinst <= 90710:
ak = 3399 - 0.06*(brutowinst - 34060)
else:
ak = 0.
print(f'Arbeidskorting: {ak}')
assert ak >= 0
belasting = max(0, belasting_box1 - ahk - ak)
return belasting - self.voorlopig
class IKB_VOF:
"""
Totale inkomstenbelasting (ikb) te betalen voor een V.O.F. de totale
hoeveelheid is bijvoorbeeld van belang wanneer beide vennoten een fiscaal
partnerschap hebben (denk aan man-vrouw V.O.F.).
"""
def __init__(self,
ikb_single1: IKB_single,
ikb_single2: IKB_single,
investeringen: float = 0,
iack=False):
"""
Initialiseer IKB_VOF klasse
Args:
ikb_single1: Eerste vennoot
ikb_single2: Tweede vennoot
investeringen: investeringen gedaan in V.O.F.
iack: Zet of True om inkomensafhankelijke combinatiekorting mee te
nemen.
"""
assert ikb_single1.investeringen == 0., "Investeringen dienen voor een V.O.F. opgegeven te worden in de IKB_VOF klasse"
assert ikb_single2.investeringen == 0., "Investeringen dienen voor een V.O.F. opgegeven te worden in de IKB_VOF klasse"
self.ikb_single1 = ikb_single1
self.ikb_single2 = ikb_single2
self.investeringen = investeringen
self.iack = iack
def bereken(self, winst: float
, winstverdeling : float = 0.5,
):
"""
Bereken nog te betalen ikb. Investeringsaftrek wordt berekend op basis
van aandeel in de winst.
Args:
brutowinst: Totale owinst uit onderneming
winstverdeling: fractie van de winst gealloceerd naar vennoot 1,
automatisch gaat het restant naar vennoot 2
Returns:
Nog te betalen totale belasting van beide vennoten
"""
assert winstverdeling >= 0 and winstverdeling <= 1
winst1 = winst*winstverdeling
winst2 = winst*(1-winstverdeling)
# Zet investeringsbedrag in elke natuurlijke persoon, nee dit is niet
# zo netjes op deze manier (accessing member vars).
self.ikb_single1.investeringen = self.investeringen*winstverdeling
self.ikb_single2.investeringen = self.investeringen*(1-winstverdeling)
betalen_1 = self.ikb_single1.bereken(winst1)
betalen_2 = self.ikb_single2.bereken(winst2)
assert betalen_1 >= 0
assert betalen_2 >= 0
totaal = betalen_1 + betalen_2
# ai = arbeidsinkomen, gelijk aan winst uit onderneming zonder
# ondernemersaftrekposten.
ai = winst2 if winst1 > winst2 else winst1
if self.iack:
if ai <= 4993:
iack = 0.
elif ai <= 29752:
iack = 0.1145*(ai-4993)
else:
iack = 2835
assert iack >= 0
totaal -= iack
return totaal