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
50 deriving (Eq, Ord, Show, Generic, Enum, NFData)
52 instance Get (Invoice ScopeId ActionId EntityId InvoiceId) InvoiceId where
53 get invoiceId = case invoiceId of
57 , invoiceType = InvoiceTypeSale
60 , invoicePaymentDueBefore = invoiceEmittedOn & Time.addLocalTime (31 * Time.nominalDay)
61 , invoiceIssuer = EntityJulmInfo
62 , invoiceRecipient = EntityJulmInfo
63 , invoiceRates = [Action_Development := 0]
65 [ InvoiceMentionTVANonApplicable
66 , InvoiceMentionIndemnitéForfaitaire
67 , InvoiceMentionIndemnitéTaux (12.15 :: Amount 100 (UnitName "%"))
71 { workDate = "2000-01-01"
73 , workAction = Action_Development
76 , workDescription = ""
81 invoiceEmittedOn = "2026-01-22"
85 , invoiceType = InvoiceTypeSale
86 , invoiceOrders = ["Contract n°2025-24"]
88 , invoicePaymentDueBefore = invoiceEmittedOn & Time.addLocalTime (31 * Time.nominalDay)
89 , invoiceIssuer = EntityJulmInfo
90 , invoiceRecipient = EntityNixOSFoundationNGITeam
92 [ Action_Organization := 31.25
93 , Action_Development := 31.25
94 , Action_Documentation := 31.25
95 , Action_Review := 31.25
98 [ InvoiceMentionTVANonApplicable
99 , InvoiceMentionIndemnitéForfaitaire
100 , InvoiceMentionIndemnitéTaux (12.15 :: Amount 100 (UnitName "%"))
104 & List.filter \work ->
107 [ work & workDate & (>= "2025-11-06")
108 , work & workDate & (<= "2025-12-22")
109 , work & workScope & (/= [Scope_NGIpkgs_Manuals])
113 invoiceEmittedOn = "2026-01-22"
117 , invoiceType = InvoiceTypeSale
118 , invoiceOrders = ["contract n°2026-03"]
120 , invoicePaymentDueBefore = invoiceEmittedOn & Time.addLocalTime (31 * Time.nominalDay)
121 , invoiceIssuer = EntityJulmInfo
122 , invoiceRecipient = EntityNixOSFoundationNGITeam
124 [ Action_Organization := 31.25
125 , Action_Development := 31.25
126 , Action_Documentation := 31.25
127 , Action_Review := 31.25
130 [ InvoiceMentionTVANonApplicable
131 , InvoiceMentionIndemnitéForfaitaire
132 , InvoiceMentionIndemnitéTaux (12.15 :: Amount 100 (UnitName "%"))
136 & List.filter \work ->
138 [ work & workDate & (>= "2025-12-23")
139 , work & workDate & (<= "2026-12-31")
140 , work & workScope & (/= [Scope_NGIpkgs_Manuals])
141 , work & workScope & (/= [Scope_NGIpkgs, Scope_Funkwhale])
144 [ work & workDate & (>= "2026-01-09")
145 , work & workDate & (<= "2026-01-28")
146 , work & workAction & (== Action_Organization)
147 , work & workScope & (== [Scope_NGIpkgs])
154 invoiceEmittedOn = "2026-01-27"
158 , invoiceType = InvoiceTypeSale
159 , invoiceOrders = ["contract n°2026-FixMe"]
161 , invoicePaymentDueBefore = invoiceEmittedOn & Time.addLocalTime (31 * Time.nominalDay)
162 , invoiceIssuer = EntityJulmInfo
163 , invoiceRecipient = EntityNixOSFoundationNGITeam
165 [ Action_Organization := 31.25
166 , Action_Development := 31.25
167 , Action_Documentation := 31.25
168 , Action_Review := 31.25
171 [ InvoiceMentionTVANonApplicable
172 , InvoiceMentionIndemnitéForfaitaire
173 , InvoiceMentionIndemnitéTaux (12.15 :: Amount 100 (UnitName "%"))
177 & List.filter \work ->
180 [ work & workDate & (>= "2026-01-21")
181 , work & workDate & (<= "2026-12-31")
182 , work & workScope & (== [Scope_NGIpkgs_Manuals])
186 [ work & workDate & (>= "2025-12-29")
187 , work & workDate & (<= "2026-12-31")
188 , work & workScope & (== [Scope_NGIpkgs, Scope_Funkwhale])
192 [ work & workDate & (>= "2026-01-09")
193 , work & workDate & (<= "2026-01-28")
194 , work & workAction & (== Action_Organization)
195 , work & workScope & (== [Scope_NGIpkgs])
202 invoiceEmittedOn = "2026-01-28"
204 invoices :: [InvoiceId]