1 module Literate.Invoice.Invoice where
3 import Literate.Accounting.Math
4 import Literate.Prelude
7 import Data.Text qualified as Text
8 import Literate.Document.HTML qualified as HTML
10 data Id = Id {unId :: Natural}
11 deriving (Eq, Ord, Show)
12 instance HTML.ToMarkup Id where
13 toMarkup (Id idt) = idt & HTML.toHtml
15 data InvoiceId = InvoiceId
16 { invoiceIdBuyer :: Entity
17 , invoiceIdCount :: Natural
19 deriving (Eq, Ord, Show)
20 instance HTML.ToMarkup InvoiceId where
21 toMarkup InvoiceId{..} =
23 <> (invoiceIdBuyer & entityId & HTML.toMarkup)
25 <> (invoiceIdCount & HTML.toMarkup)
27 type Invoices = Map InvoiceId Invoice
32 { entityId :: EntityId
34 , entityEmail :: Maybe Email
35 , entityAddress :: Address
36 , entitySIREN :: Maybe Text
38 deriving (Eq, Ord, Show)
40 data Address = Address
41 { addressText :: [Text]
42 , addressZipCode :: ZipCode
44 , addressCountry :: Country
46 deriving (Eq, Ord, Show)
52 data Invoice = Invoice
53 { invoiceCreation :: LocalTime
54 , invoiceIssuer :: Entity
55 , invoiceRecipient :: Entity
56 , invoiceCustomer :: Entity
57 , invoiceObjet :: Text
58 , invoiceDetails :: Text
59 , invoiceItems :: [InvoiceItem (UnitName "€" :/: UnitName "h") (UnitName "h")]
60 , invoiceRate :: Double
63 data InvoiceItem rate qty = InvoiceItem
64 { invoiceItemDescription :: Text
65 , invoiceItemRate :: Amount 100 rate
66 , invoiceItemQuantity :: Amount 100 qty
68 invoiceItemTotal :: InvoiceItem rate qty -> Amount 100 (UnitName "€")
69 invoiceItemTotal InvoiceItem{..} =
70 let (res, _actualFrac) =
73 & fraction (invoiceItemQuantity & amountQuantity & quantityToRatio)