#!/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