1 {-# LANGUAGE DeriveAnyClass #-}
2 {-# LANGUAGE OverloadedLists #-}
3 {-# LANGUAGE OverloadedStrings #-}
5 module Tests.Invoice where
7 import Data.List qualified as List
8 import Data.Text.Lazy qualified as Text.Lazy
9 import Data.Time.Clock qualified as Time
10 import Data.Time.LocalTime qualified as Time
11 import Test.Syd (Spec, describe, goldenByteStringBuilderFile, it)
12 import Tests.Utils.Tests (goldenPath)
13 import Text.Blaze.Renderer.Text qualified as Blaze.Text
14 import Text.Blaze.Renderer.Utf8 qualified as Blaze
17 import Literate.Accounting (Amount, Unit (UnitName))
18 import Literate.Database
19 import Literate.Document.HTML qualified as HTML
20 import Literate.Invoice
21 import Literate.Invoice.HTML (invoiceIdInline)
22 import Literate.Invoice.HTML qualified as HTML
23 import Literate.Prelude
25 import Tests.Organization
28 spec :: HasCallStack => Spec
31 forM_ invoices \invId -> do
33 inv = invId & get @(Invoice ScopeId ActionId EntityId InvoiceId)
38 & Blaze.Text.renderMarkup
40 outPath <- goldenPath idS "html"
42 goldenByteStringBuilderFile outPath do
43 inv & HTML.htmlIO <&> Blaze.renderMarkupBuilder
51 deriving (Eq, Ord, Show, Generic, Enum, NFData)
53 instance Get (Invoice ScopeId ActionId EntityId InvoiceId) InvoiceId where
54 get invoiceId = case invoiceId of
58 , invoiceType = InvoiceTypeSale
61 , invoicePaymentDueBefore = invoiceEmittedOn & Time.addLocalTime (31 * Time.nominalDay)
62 , invoiceIssuer = EntityJulmInfo
63 , invoiceRecipient = EntityJulmInfo
64 , invoiceRates = [Action_Develop := 0]
66 [ InvoiceMentionTVANonApplicable
67 , InvoiceMentionIndemnitéForfaitaire
68 , InvoiceMentionIndemnitéTaux (12.15 :: Amount 100 (UnitName "%"))
72 { workDate = "2000-01-01"
74 , workAction = Action_Develop
77 , workDescription = ""
82 invoiceEmittedOn = "2026-01-22"
86 , invoiceType = InvoiceTypeSale
87 , invoiceOrders = ["Contract n°2025-24"]
89 , invoicePaymentDueBefore = invoiceEmittedOn & Time.addLocalTime (31 * Time.nominalDay)
90 , invoiceIssuer = EntityJulmInfo
91 , invoiceRecipient = EntityNixOSFoundationNGITeam
93 [ Action_Debug := 31.25
94 , Action_Organize := 31.25
95 , Action_Develop := 31.25
96 , Action_Document := 31.25
97 , Action_Review := 31.25
100 [ InvoiceMentionTVANonApplicable
101 , InvoiceMentionIndemnitéForfaitaire
102 , InvoiceMentionIndemnitéTaux (12.15 :: Amount 100 (UnitName "%"))
106 & List.filter \work ->
109 [ work & workDate & (>= "2025-11-06")
110 , work & workDate & (<= "2025-12-22")
111 , work & workScope & (/= [Scope_NGIpkgs_Manuals])
115 invoiceEmittedOn = "2026-01-22"
119 , invoiceType = InvoiceTypeSale
120 , invoiceOrders = ["contract n°2026-03"]
122 , invoicePaymentDueBefore = invoiceEmittedOn & Time.addLocalTime (31 * Time.nominalDay)
123 , invoiceIssuer = EntityJulmInfo
124 , invoiceRecipient = EntityNixOSFoundationNGITeam
126 [ Action_Debug := 31.25
127 , Action_Organize := 31.25
128 , Action_Develop := 31.25
129 , Action_Document := 31.25
130 , Action_Review := 31.25
133 [ InvoiceMentionTVANonApplicable
134 , InvoiceMentionIndemnitéForfaitaire
135 , InvoiceMentionIndemnitéTaux (12.15 :: Amount 100 (UnitName "%"))
139 & List.filter \work ->
141 [ work & workDate & (>= "2025-12-23")
142 , work & workDate & (<= "2026-12-31")
143 , work & workScope & (/= [Scope_NGIpkgs_Manuals])
144 , work & workScope & (/= [Scope_NGIpkgs, Scope_Funkwhale])
147 [ work & workDate & (>= "2026-01-09")
148 , work & workDate & (<= "2026-01-28")
149 , work & workAction & (== Action_Organize)
150 , work & workScope & (== [Scope_NGIpkgs])
157 invoiceEmittedOn = "2026-01-27"
161 , invoiceType = InvoiceTypeSale
162 , invoiceOrders = ["contract n°2026-07, February 2026"]
164 , invoicePaymentDueBefore = invoiceEmittedOn & Time.addLocalTime (31 * Time.nominalDay)
165 , invoiceIssuer = EntityJulmInfo
166 , invoiceRecipient = EntityNixOSFoundationNGITeam
168 [ Action_Debug := 31.25
169 , Action_Develop := 31.25
170 , Action_Document := 31.25
171 , Action_Organize := 31.25
172 , Action_Review := 31.25
175 [ InvoiceMentionTVANonApplicable
176 , InvoiceMentionIndemnitéForfaitaire
177 , InvoiceMentionIndemnitéTaux (12.15 :: Amount 100 (UnitName "%"))
181 & List.filter \work ->
184 [ work & workDate & (> "2026-01-28")
185 , work & workDate & (< "2026-03-01")
192 invoiceEmittedOn = "2026-03-31"
196 , invoiceType = InvoiceTypeSale
197 , invoiceOrders = ["contract n°2026-07, Mars 2026"]
199 , invoicePaymentDueBefore = invoiceEmittedOn & Time.addLocalTime (31 * Time.nominalDay)
200 , invoiceIssuer = EntityJulmInfo
201 , invoiceRecipient = EntityNixOSFoundationNGITeam
203 [ Action_Debug := 31.25
204 , Action_Develop := 31.25
205 , Action_Document := 31.25
206 , Action_Organize := 31.25
207 , Action_Review := 31.25
210 [ InvoiceMentionTVANonApplicable
211 , InvoiceMentionIndemnitéForfaitaire
212 , InvoiceMentionIndemnitéTaux (12.15 :: Amount 100 (UnitName "%"))
216 & List.filter \work ->
219 [ work & workDate & (>= "2026-03-01")
220 , work & workDate & (<= "2026-04-01")
227 invoiceEmittedOn = "2026-03-31"
229 invoices :: [InvoiceId]