module HAX.Germany.NatuerlichePerson where
import HAX.Accounting
import HAX.Bookkeeping
import HAX.Common
import Control.Monad.Reader
import HAX.Germany.Subjekte
import HAX.Germany.Gewerbe
import HAX.Germany.Einkommensteuer
instance Gewerbetreibender NatuerlichePerson where
gwStFreibetrag _ = 24500
gewerbeGewinn = jahresErgebnis'
instance Body NatuerlichePerson where
nominalAccounts p = maybe [] (const gewerbeAccounts) (pGewerbe p)
++ verlustVortragsKonten
++ aufwandsKonten ++ ertragsKonten ++
[privatVermoegen
,giroKonto
]
bodyMonthly action = withBody $ \p -> do
gehalt
sozialAbgaben
autoPrivatMtl
fromTo (kinderGeld p) "Kindergeld" steuerfreieEinnahmen giroKonto
maybe (return ())
(runGewerbe gewerbeMonatlich) $ pGewerbe p
action
atYearEnd $ do
gewerbeSteuer <- maybe (return keineGewerbeSteuer)
(runGewerbe gewerbeSteuer) $ pGewerbe p
when (gwGewinn gewerbeSteuer /=0) $
fromTo (gwGewinn gewerbeSteuer) "Einkünfte aus Gewerbebetrieb"
uebrigeSummeDerEinkuenfte privatVermoegen
fromTo 100 "Arbeitsmittel und übrige Werbungskosten" privatVermoegen
werbungskostensNichtSelbststaendigeArbeitOhneFahrten
est <- einkommenSteuer gewerbeSteuer
lst <- soll lohnSteuer
closingTx (maybe [] (const [jahresErgebnis]) (pGewerbe p)
++ ertragsKonten ++ aufwandsKonten)
$ BalancingTx "Steuern und Abschluss"
privatVermoegen
[(giroKonto,lst est)]
sozialAbgaben :: AccNatRW ()
sozialAbgaben = withBody $ \p -> when (pVersicherungsPflicht p) $ do
let brutto = pBruttoGehaltMtl p
tx $ BalancingTx "Sozialabgaben"
giroKonto
[(krankenundPflegeversicherungBasisbeitraege,
brutto * (0.082
+ 0.01025))
,(altersvorsorgeAufwendungenEigenanteil, brutto * 0.0945)
,(sonstigeVorsorgeAufwendungOhneBasisbeitraege, brutto * 0.015 ) --arbeitslosenversicherung
]
fromTo (brutto * 0.0945) "Arbeitgeberanteil Rentenversicherung"
steuerfreieEinnahmen altersvorsorgeAufwendungenArbeitgeberAnteil
gehalt :: AccNatRW ()
gehalt = withBody $ \p -> do
let geldwerterVorteil = geldwerterVorteilMonatl $ pWagen p
brutto = pBruttoGehaltMtl p
lohnsteuer = pLohnsteuerMtl p
tx $ BalancingTx "Gehalt und evtl. Firmenwagen"
arbeitslohn
[(giroKonto, brutto lohnsteuer)
,(privatAusgaben, geldwerterVorteil)
,(lohnSteuer, lohnsteuer)
]
autoPrivatMtl :: AccNatRW ()
autoPrivatMtl = withBody $ \p ->
let kosten = akPrivat $ kostenAutoMonatl $ pWagen p in
when (kosten /= 0) $ fromTo kosten "Autokosten" giroKonto privatAusgaben