]> Git — Sourcephile - tmp/julm/literate-invoice.git/blob - tests/Tests/Accounting.hs
maint/correctness(Invoice): use sum type for ActionId
[tmp/julm/literate-invoice.git] / tests / Tests / Accounting.hs
1 {-# LANGUAGE DeriveAnyClass #-}
2 {-# LANGUAGE OverloadedLists #-}
3
4 module Tests.Accounting where
5
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.Invoice qualified as Invoice
12 import Tests.Organization qualified as Orga
13
14 data Account = Account
15 { accountOwner :: Maybe Orga.EntityId
16 , accountScope :: Set (Set Scope)
17 , accountPCG :: Maybe PCG.PCG
18 }
19 deriving (Eq, Ord, Show, Generic, NFData)
20 account =
21 Account
22 { accountOwner = Nothing
23 , accountScope = []
24 , accountPCG = Nothing
25 }
26
27 newtype Ors a = Ors {ors :: Set a}
28 deriving (Eq, Ord, Show, Generic)
29 deriving newtype (NFData)
30 newtype Ands a = Ands {ands :: Set a}
31 deriving (Eq, Ord, Show, Generic)
32 deriving newtype (NFData)
33 data Boolean a = BooleanTrue a | BooleanFalse a
34 deriving (Eq, Ord, Show, Generic, NFData)
35
36 data Meta
37 = Meta
38 { metaCause :: Ands (Ors Cause)
39 , metaOwner :: Set Cause
40 }
41 deriving (Eq, Ord, Show, Generic, NFData)
42
43 data Cause
44 = Cause
45 { causeEntity :: Maybe Orga.EntityId
46 , causePeriod :: Maybe Period
47 , causeInvoice :: Maybe Invoice.InvoiceId
48 }
49 deriving (Eq, Ord, Show, Generic, NFData)
50 cause =
51 Cause
52 { causeEntity = Nothing
53 , causeInvoice = Nothing
54 , causePeriod = Nothing
55 }
56
57 data Amounts
58 = Amounts
59 { amountsEuro :: Amount 100 (UnitName "€")
60 }
61 deriving (Eq, Ord, Show, Generic, NFData)
62 instance FromRational Amounts where
63 fromRational r = Amounts{amountsEuro = fromRational r}
64
65 accounting :: [Movement Cause Account Amounts]
66 accounting =
67 [ Movement
68 { moveDescription = ""
69 , moveDate = "2026-01-27"
70 , movePostings = equalPostings account{accountOwner = Just Orga.EntityUpwork} account{accountOwner = Just Orga.EntityJulmInfo} 174.30
71 , moveMeta = []
72 }
73 , Movement
74 { moveDescription = ""
75 , moveDate = "2026-01-28"
76 , movePostings = equalPostings account{accountOwner = Just Orga.EntityNixOSFoundationNGITeam} account{accountOwner = Just Orga.EntityJulmInfo} 2000.00
77 , moveMeta = []
78 }
79 , Movement
80 { moveDescription = ""
81 , moveDate = "2026-01-29"
82 , movePostings = equalPostings account{accountOwner = Just Orga.EntityNixOSFoundationNGITeam} account{accountOwner = Just Orga.EntityJulmInfo} 4643.75
83 , moveMeta = []
84 }
85 , Movement
86 { moveDescription = "Cotisation URSSAF"
87 , moveMeta =
88 [ cause
89 { causeEntity = Just Orga.EntityUrssaf
90 , causePeriod = Just Period{periodBeginning = "2026-01-01", periodEnd = "2026-01-31"}
91 }
92 ]
93 , moveDate = "2026-02-01"
94 , movePostings =
95 [ Posting
96 { postingAccount = account{accountOwner = Just Orga.EntityJulmInfo}
97 , postingFlow = FlowOrigin 1691.00
98 , postingMeta = []
99 }
100 , Posting
101 { postingAccount = account{accountOwner = Just Orga.EntityUrssaf}
102 , postingFlow = FlowTarget 1677.00
103 , postingMeta = []
104 }
105 , Posting
106 { postingAccount = account{accountOwner = Just Orga.EntityUrssaf}
107 , postingFlow = FlowTarget 14.00
108 , postingMeta = []
109 }
110 ]
111 }
112 ]