1 {-# LANGUAGE DeriveAnyClass #-}
2 {-# LANGUAGE OverloadedLists #-}
4 module Tests.Accounting where
6 import Literate.Accounting
7 import Literate.Accounting.PlanComptableGénéral qualified as PCG
8 import Literate.Invoice
9 import Literate.Organization
10 import Literate.Prelude
11 import Tests.Organization qualified as Orga
15 deriving (Eq, Ord, Show, Generic, NFData)
17 data Account = Account
18 { accountOwner :: Maybe Orga.EntityId
19 , accountScope :: Set (Set Scope)
20 , accountPCG :: Maybe PCG.PCG
22 deriving (Eq, Ord, Show, Generic, NFData)
25 { accountOwner = Nothing
27 , accountPCG = Nothing
30 newtype Ors a = Ors {ors :: Set a}
31 deriving (Eq, Ord, Show, Generic)
32 deriving newtype (NFData)
33 newtype Ands a = Ands {ands :: Set a}
34 deriving (Eq, Ord, Show, Generic)
35 deriving newtype (NFData)
36 data Boolean a = BooleanTrue a | BooleanFalse a
37 deriving (Eq, Ord, Show, Generic, NFData)
41 { metaCause :: Ands (Ors Cause)
42 , metaOwner :: Set Cause
44 deriving (Eq, Ord, Show, Generic, NFData)
48 { causeEntity :: Maybe Orga.EntityId
49 , causePeriod :: Maybe Period
50 , causeInvoice :: Maybe (InvoiceId Orga.EntityId)
52 deriving (Eq, Ord, Show, Generic, NFData)
55 { causeEntity = Nothing
56 , causeInvoice = Nothing
57 , causePeriod = Nothing
62 { amountsEuro :: Amount 100 (UnitName "€")
64 deriving (Eq, Ord, Show, Generic, NFData)
65 instance FromRational Amounts where
66 fromRational r = Amounts{amountsEuro = fromRational r}
68 accounting :: [Movement Cause Account Amounts]
71 { moveDescription = ""
72 , moveDate = "2026-01-27"
73 , movePostings = equalPostings account{accountOwner = Just Orga.EntityUpwork} account{accountOwner = Just Orga.EntityJulmInfo} 174.30
77 { moveDescription = ""
78 , moveDate = "2026-01-28"
79 , movePostings = equalPostings account{accountOwner = Just Orga.EntityNixOSFoundationNGITeam} account{accountOwner = Just Orga.EntityJulmInfo} 2000.00
83 { moveDescription = ""
84 , moveDate = "2026-01-29"
85 , movePostings = equalPostings account{accountOwner = Just Orga.EntityNixOSFoundationNGITeam} account{accountOwner = Just Orga.EntityJulmInfo} 4643.75
89 { moveDescription = "Cotisation URSSAF"
92 { causeEntity = Just Orga.EntityUrssaf
93 , causePeriod = Just Period{periodBeginning = "2026-01-01", periodEnd = "2026-01-31"}
96 , moveDate = "2026-02-01"
99 { postingAccount = account{accountOwner = Just Orga.EntityJulmInfo}
100 , postingFlow = FlowOrigin 1691.00
104 { postingAccount = account{accountOwner = Just Orga.EntityUrssaf}
105 , postingFlow = FlowTarget 1677.00
109 { postingAccount = account{accountOwner = Just Orga.EntityUrssaf}
110 , postingFlow = FlowTarget 14.00