hax-0.0.1: src/HAX/Germany/NatuerlichePerson.hs
{-# LANGUAGE
NoMonomorphismRestriction
, OverloadedStrings
, TypeSynonymInstances
, FlexibleInstances
, TypeFamilies
, FlexibleContexts
#-}
-- | This module provides the 'Body' instances for German Natürliche
-- Person as required to calculate income and business tax.
--
-- 'Body's are defined in "Accounting".
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
-- * Gewerbetreibender Instance
instance Gewerbetreibender NatuerlichePerson where
gwStFreibetrag _ = 24500
gewerbeGewinn = jahresErgebnis'
-- * Natürliche Person ('Body' und 'Gewerbetreibender' Instances)
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
-- Gewerbe
-- TODO Thesaurierungsbegünstigung 34a EStG
-- https://www.smartsteuer.de/portal/lexikon/T/Tarifbegrenzung-fuer-nicht-entnommene-Gewinne-bei-der-Einkommensteuer.html
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)]
-- http://de.wikipedia.org/wiki/Lohnnebenkosten
sozialAbgaben :: AccNatRW ()
sozialAbgaben = withBody $ \p -> when (pVersicherungsPflicht p) $ do
let brutto = pBruttoGehaltMtl p
tx $ BalancingTx "Sozialabgaben"
giroKonto
[(krankenundPflegeversicherungBasisbeitraege,
brutto * (0.082 -- Krankenversicherung
-- TODO 0.04 davon sind KrankengeldAnspruch = Privatausgaben
+ 0.01025)) -- Pflegeversicherung
,(altersvorsorgeAufwendungenEigenanteil, brutto * 0.0945) -- gesetzl. Rentenversicherung
,(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)
]
-- | Accountiung Action für die Privatperson
autoPrivatMtl :: AccNatRW ()
autoPrivatMtl = withBody $ \p ->
let kosten = akPrivat $ kostenAutoMonatl $ pWagen p in
when (kosten /= 0) $ fromTo kosten "Autokosten" giroKonto privatAusgaben