]> Git — Sourcephile - tmp/julm/literate-invoice.git/blob - src/Literate/Invoice/Invoice.hs
feat(invoice): add what I need
[tmp/julm/literate-invoice.git] / src / Literate / Invoice / Invoice.hs
1 {-# LANGUAGE OverloadedLists #-}
2
3 module Literate.Invoice.Invoice where
4
5 import Country qualified
6 import Literate.Accounting.Math
7 import Literate.Document qualified as Doc
8 import Literate.Document.HTML qualified as HTML
9 import Literate.Organization
10 import Literate.Prelude
11 import Literate.Time
12
13 data InvoiceId = InvoiceId
14 { invoiceIdRecipient :: Organization
15 , invoiceIdType :: InvoiceType
16 , invoiceIdCount :: Natural
17 }
18 deriving (Eq, Ord, Show)
19 instance Doc.ToInline InvoiceId where
20 toInline i =
21 [ "org"
22 , i & invoiceIdRecipient & orgEntity & entityId & Doc.toInline
23 , case i & invoiceIdType of
24 InvoiceTypeProForma -> "pro-forma"
25 InvoiceTypeSale -> "sale"
26 InvoiceTypeVoucher -> "voucher"
27 , i & invoiceIdCount & show & Doc.toInline
28 ]
29 & Doc.Inlines
30
31 type Invoices = Map InvoiceId Invoice
32 type InvoiceAction = [Text]
33 type InvoiceScope = [Text]
34
35 data Invoice = Invoice
36 { invoiceEmittedOn :: LocalTime
37 , invoiceOrders :: [Doc.Inline]
38 , invoicePaymentDueBefore :: LocalTime
39 , invoiceIssuer :: Organization
40 , invoiceRecipient :: Organization
41 , -- , invoiceItems :: [InvoiceItem (UnitName "€" :/: UnitName "h") (UnitName "h")]
42 invoiceRates :: Map InvoiceAction (Amount 100 (UnitName "€" :/: UnitName "h"))
43 , invoiceMentions :: [InvoiceMention]
44 , invoiceLogs :: [InvoiceLog]
45 }
46 deriving (Eq, Show)
47 invoice =
48 Invoice
49 { invoiceEmittedOn = "2000-01-01"
50 , invoiceOrders = []
51 , invoicePaymentDueBefore = "2000-01-31"
52 , invoiceIssuer = organization
53 , invoiceRecipient = organization
54 , invoiceRates = []
55 , invoiceMentions = []
56 , invoiceLogs = []
57 }
58 data InvoiceLog = InvoiceLog
59 { invoiceLogDescription :: Doc.Inline
60 , invoiceLogDate :: LocalTime
61 , invoiceLogDuration :: Amount 100 (UnitName "h")
62 , invoiceLogAction :: [Text]
63 , invoiceLogScope :: [Text]
64 , invoiceLogReferences :: [URL]
65 }
66 deriving (Eq, Show)
67 data InvoiceType
68 = InvoiceTypeSale
69 | InvoiceTypeProForma
70 | InvoiceTypeVoucher
71 deriving (Eq, Ord, Show)
72 data InvoiceMention
73 = InvoiceMentionTVANonApplicable
74 | InvoiceMentionIndemnitéForfaitaire
75 | InvoiceMentionIndemnitéTaux (Amount 100 (UnitName "%"))
76 deriving (Eq, Ord, Show)
77
78 data InvoiceItem rate qty = InvoiceItem
79 { invoiceItemScope :: [Text]
80 , invoiceItemAction :: [Text]
81 , invoiceItemType :: InvoiceItemType
82 , invoiceItemPeriod :: Period
83 , invoiceItemRate :: Amount 100 rate
84 , invoiceItemQuantity :: Amount 100 qty
85 }
86 deriving (Eq, Show)
87 invoiceItemTotal :: InvoiceItem rate qty -> Amount 100 (UnitName "€")
88 invoiceItemTotal InvoiceItem{..} =
89 let (res, _actualFrac) =
90 invoiceItemRate
91 & amountQuantity
92 & fraction (invoiceItemQuantity & amountQuantity & quantityToRatio)
93 in Amount res
94 invoiceItem =
95 InvoiceItem
96 { invoiceItemScope = []
97 , invoiceItemAction = []
98 , invoiceItemType = InvoiceItemTypeItem
99 , invoiceItemPeriod = Period{periodBeginning = "2000-01-01", periodEnd = "2000-01-01"}
100 , invoiceItemRate = 0
101 , invoiceItemQuantity = 0
102 }
103
104 data InvoiceItemType
105 = InvoiceItemTypeItem
106 | InvoiceItemTypeService
107 deriving (Eq, Ord, Show)
108
109 data Period = Period
110 { periodBeginning :: LocalTime
111 , periodEnd :: LocalTime
112 }
113 deriving (Eq, Ord, Show)