module HAX.Germany.Subjekte where
import HAX.Accounting
import HAX.Bookkeeping
import HAX.Common
solidaritaetsFaktor = 0.055
data NatuerlichePerson = NatuerlichePerson
{
pGeburt :: ADate
, pGewerbe :: Maybe (Gewerbe NatuerlichePerson)
, kinderMitKindergeldImHaushalt :: Bool
, kinderMitKindergeld :: Amount
, landOderForstwirt :: Bool
, pSplitting :: Bool
, krankenUndPflegeOhneZuschuesse :: Bool
, krankenUndPflegeOhneZuschuessePartner :: Maybe Bool
, kinderFreibetragsVerdopplung :: Bool
, pWagen :: Auto
, pBruttoGehaltMtl :: Decimal
, pLohnsteuerMtl :: Decimal
, pVersicherungsPflicht :: Bool
, pAuswaertigeKinderInBerufsausbildung :: Decimal
}
deriving Show
data GmbH = GmbH { gGewerbe :: Gewerbe GmbH
}
data Gewerbe body = Gewerbe {
gwAngestellte :: [NatuerlichePerson]
, gwTreibender :: body
, gwHebesatz :: Amount
, gwMonatlMietkosten :: Amount
, gwWaegen :: [Auto]
}
deriving Show
giroKonto = "Giro"
data Auto = AutoMonatl { aKmPrivatOhneArbeitsfahrten :: Decimal
, aKmArbeitsstaette :: Decimal
, aKmGeschaeftl :: Decimal
, aArbeitsTage :: Decimal
, aFixKosten :: Amount
, aLeasing :: Amount
, aSpritKostenProKm :: Amount
, aListenPreis :: Amount
, aFirmenWagen :: FirmenWagen
}
deriving Show
data FirmenWagen = Pauschal | Fahrtenbuch | Privat
deriving Show
data AutoKosten = AutoKosten { akPrivat :: Amount,
akGewerbe :: Amount,
akGewerbeLeasing :: Amount
}
entfernungsPauschale :: Auto -> Amount
entfernungsPauschale a = 0.3 * 12 * aArbeitsTage a * aKmArbeitsstaette a
kmPrivatMonatl :: Auto -> Amount
kmPrivatMonatl a = aKmPrivatOhneArbeitsfahrten a +
aArbeitsTage a * 2 * aKmArbeitsstaette a
geldwerterVorteilMonatl :: Auto -> Amount
geldwerterVorteilMonatl a = g $ aFirmenWagen a
where g Privat = 0
g Pauschal = aListenPreis a * (
0.01 + when' (12 * aArbeitsTage a > 46) 0.0003 * aKmArbeitsstaette a)
g Fahrtenbuch = gesamtKostenAuto a * privat / (privat + aKmGeschaeftl a)
privat = kmPrivatMonatl a
gesamtKostenAuto :: Auto -> Amount
gesamtKostenAuto = g . kostenAutoMonatl
where g (AutoKosten a b c) = a+b+c
kostenAutoMonatl :: Auto -> AutoKosten
kostenAutoMonatl a = g $ aFirmenWagen a
where g Privat = AutoKosten
(aLeasing a + aFixKosten a + aSpritKostenProKm a * kmPrivatMonatl a)
(aSpritKostenProKm a * aKmGeschaeftl a)
0
g _ = AutoKosten
0
(aFixKosten a + aSpritKostenProKm a * (
aKmGeschaeftl a + kmPrivatMonatl a))
$ aLeasing a
verlustVortragsKonten = [virtuell,
steuerlicheVerlustVortraege
]
virtuell = "virt"
steuerlicheVerlustVortraege = "stVV"
verlustAbzug :: String
-> Amount
-> AccountingReadOnly b Amount
verlustAbzug vType ertrag = do
vortraege <- soll steuerlicheVerlustVortraege
let vorabVerrechenbar = min 1000000 ertrag
abzug = min vortraege $ vorabVerrechenbar + 0.6*(ertrag vorabVerrechenbar)
when (abzug /= 0) $ tell $
fromTo abzug (vType ++ "Verlustvorträge") steuerlicheVerlustVortraege virtuell
return $ positivePart abzug
nachVerlustAbzug :: String
-> Amount
-> AccountingReadOnly b Amount
nachVerlustAbzug vType ertrag = (ertrag ) <$> verlustAbzug vType ertrag