]> Git — Sourcephile - tmp/julm/literate-invoice.git/commitdiff
maint/correctness(Work): use sum type for ScopeId main
authorJulien Moutinho <julm@sourcephile.fr>
Tue, 3 Feb 2026 23:10:43 +0000 (00:10 +0100)
committerJulien Moutinho <julm@sourcephile.fr>
Wed, 4 Feb 2026 01:00:20 +0000 (02:00 +0100)
literate-business.cabal
src/Literate/Database.hs
src/Literate/Document/Type.hs
src/Literate/Invoice.hs
src/Literate/Invoice/HTML.hs
tests/Tests/Accounting.hs
tests/Tests/Invoice.hs
tests/Tests/Invoice/org3sale1.html
tests/Tests/Invoice/org3sale2.html
tests/Tests/Invoice/org3sale3.html
tests/Tests/Work.hs [new file with mode: 0644]

index 8543a3a4ddc829bfc9224fdcbf4162c845895844..10f2650e51ae73ea7d812c32c659e21b78797d71 100644 (file)
@@ -138,6 +138,7 @@ test-suite literate-business-tests
     Tests.Invoice
     Tests.Organization
     Tests.Utils.Tests
     Tests.Invoice
     Tests.Organization
     Tests.Utils.Tests
+    Tests.Work
 
   build-depends:
     , filepath
 
   build-depends:
     , filepath
index 43cb5bf6ca4d2c913af3d09b0f9602caa840a453..c3cb5612638c070977bb4e1fe78d96121d8572ef 100644 (file)
@@ -1,4 +1,50 @@
+{-# LANGUAGE DeriveAnyClass #-}
+
 module Literate.Database where
 
 module Literate.Database where
 
+import Data.List qualified as List
+
+import Literate.Document qualified as Doc
+import Literate.Prelude
+
 class Get to from where
   get :: from -> to
 class Get to from where
   get :: from -> to
+
+newtype Ors a = Ors {unOrs :: Set a}
+  deriving (Eq, Ord, Show, Generic)
+  deriving newtype (NFData)
+
+instance (Ord a, Doc.ToInline a) => Doc.ToInline (Ors a) where
+  toInline xs =
+    xs
+      & unOrs
+      & toList
+      <&> Doc.toInline
+      & List.intersperse " | "
+      & Doc.toInline
+
+instance Ord a => IsList (Ors a) where
+  type Item (Ors a) = a
+  fromList = Ors . fromList
+  toList = toList . unOrs
+
+newtype Ands a = Ands {unAnds :: Set a}
+  deriving (Eq, Ord, Show, Generic)
+  deriving newtype (NFData)
+
+instance Ord a => IsList (Ands a) where
+  type Item (Ands a) = a
+  fromList = Ands . fromList
+  toList = toList . unAnds
+
+instance (Ord a, Doc.ToInline a) => Doc.ToInline (Ands a) where
+  toInline xs =
+    xs
+      & unAnds
+      & toList
+      <&> Doc.toInline
+      & List.intersperse " & "
+      & Doc.toInline
+
+data Boolean a = BooleanTrue a | BooleanFalse a
+  deriving (Eq, Ord, Show, Generic, NFData)
index 7357dc6fff380bbc2ede8fca01bc1512e1d90e25..4e94bff55d7efc251f5a6e79e7f88d821521bc47 100644 (file)
@@ -341,6 +341,7 @@ instance ToBlock Dict where toBlock = BlockDict
 instance ToBlock (Container Block) where toBlock = BlockDiv
 instance ToBlock Flex where toBlock = BlockFlex
 instance ToBlock Inline where toBlock = BlockPara
 instance ToBlock (Container Block) where toBlock = BlockDiv
 instance ToBlock Flex where toBlock = BlockFlex
 instance ToBlock Inline where toBlock = BlockPara
+instance ToBlock [Inline] where toBlock = BlockPara . toInline
 instance ToBlock Int where toBlock i = i & show & toBlock
 instance ToBlock Integer where toBlock i = i & show & toBlock
 instance ToBlock List where toBlock = BlockList
 instance ToBlock Int where toBlock i = i & show & toBlock
 instance ToBlock Integer where toBlock i = i & show & toBlock
 instance ToBlock List where toBlock = BlockList
index 3ef704c7156ffea0d56e83e498c5f18e71bbcdc6..2ab2f8bfc679f17259acb9a7f9f0ad89352bad9b 100644 (file)
@@ -8,6 +8,7 @@ module Literate.Invoice where
 import Literate.Accounting.Amount
 import Literate.Accounting.Quantity
 import Literate.Accounting.Unit
 import Literate.Accounting.Amount
 import Literate.Accounting.Quantity
 import Literate.Accounting.Unit
+import Literate.Database
 import Literate.Document qualified as Doc
 import Literate.Organization
 import Literate.Prelude
 import Literate.Document qualified as Doc
 import Literate.Organization
 import Literate.Prelude
@@ -15,7 +16,7 @@ import Literate.Time
 
 type InvoiceScope = [Text]
 
 
 type InvoiceScope = [Text]
 
-data Invoice actionId entId invId = Invoice
+data Invoice scopeId actionId entId invId = Invoice
   { invoiceId :: invId
   , invoiceType :: InvoiceType
   , invoiceEmittedOn :: LocalTime
   { invoiceId :: invId
   , invoiceType :: InvoiceType
   , invoiceEmittedOn :: LocalTime
@@ -26,14 +27,14 @@ data Invoice actionId entId invId = Invoice
   , -- , invoiceItems :: [InvoiceItem (UnitName "€" :/: UnitName "h") (UnitName "h")]
     invoiceRates :: Map actionId (Amount 100 (UnitName "€" :/: UnitName "h"))
   , invoiceMentions :: [InvoiceMention]
   , -- , invoiceItems :: [InvoiceItem (UnitName "€" :/: UnitName "h") (UnitName "h")]
     invoiceRates :: Map actionId (Amount 100 (UnitName "€" :/: UnitName "h"))
   , invoiceMentions :: [InvoiceMention]
-  , invoiceWorks :: [Work actionId]
+  , invoiceWorks :: [Work scopeId actionId]
   }
   deriving (Eq, Show)
 
 invoice ::
   Ord actionId =>
   Enum entId =>
   }
   deriving (Eq, Show)
 
 invoice ::
   Ord actionId =>
   Enum entId =>
-  invId -> Invoice actionId entId invId
+  invId -> Invoice scopeId actionId entId invId
 invoice invoiceId =
   Invoice
     { invoiceId
 invoice invoiceId =
   Invoice
     { invoiceId
@@ -48,12 +49,12 @@ invoice invoiceId =
     , invoiceWorks = []
     }
 
     , invoiceWorks = []
     }
 
-data Work actionId = Work
+data Work scopeId actionId = Work
   { workDescription :: Doc.Inline
   , workDate :: LocalTime
   , workDuration :: Amount 100 (UnitName "h")
   , workAction :: actionId
   { workDescription :: Doc.Inline
   , workDate :: LocalTime
   , workDuration :: Amount 100 (UnitName "h")
   , workAction :: actionId
-  , workScope :: [Text]
+  , workScope :: Ands scopeId
   , workReferences :: [URL]
   }
   deriving (Eq, Show)
   , workReferences :: [URL]
   }
   deriving (Eq, Show)
@@ -72,8 +73,8 @@ data InvoiceMention
   | InvoiceMentionIndemnitéTaux (Amount 100 (UnitName "%"))
   deriving (Eq, Ord, Show, Generic, NFData)
 
   | InvoiceMentionIndemnitéTaux (Amount 100 (UnitName "%"))
   deriving (Eq, Ord, Show, Generic, NFData)
 
-data InvoiceItem actionId rate qty = InvoiceItem
-  { invoiceItemScope :: [Text]
+data InvoiceItem scopeId actionId rate qty = InvoiceItem
+  { invoiceItemScope :: Ands scopeId
   , invoiceItemAction :: actionId
   , invoiceItemType :: InvoiceItemType
   , invoiceItemPeriod :: Period
   , invoiceItemAction :: actionId
   , invoiceItemType :: InvoiceItemType
   , invoiceItemPeriod :: Period
@@ -83,7 +84,7 @@ data InvoiceItem actionId rate qty = InvoiceItem
   deriving (Eq, Show)
 type Euro = Amount 100 (UnitName "€")
 
   deriving (Eq, Show)
 type Euro = Amount 100 (UnitName "€")
 
-invoiceItemTotal :: InvoiceItem actionId rate qty -> Euro
+invoiceItemTotal :: InvoiceItem scopeId actionId rate qty -> Euro
 invoiceItemTotal InvoiceItem{..} =
   let (res, _actualFrac) =
         invoiceItemRate
 invoiceItemTotal InvoiceItem{..} =
   let (res, _actualFrac) =
         invoiceItemRate
index 47024624a89165da59eec34a433e15be572f1d74..521f9c20ba6d6fa612a05093782038f9a240e39f 100644 (file)
@@ -104,12 +104,12 @@ instance QuantFact qf => Doc.ToBlock (Quantity qf) where
   toBlock x = Doc.BlockPara $ x & Doc.toInline
 
 invoiceIdInline ::
   toBlock x = Doc.BlockPara $ x & Doc.toInline
 
 invoiceIdInline ::
-  forall actionId entId invId.
+  forall scopeId actionId entId invId.
   Get (Organization entId) entId =>
   Get (Entity entId) entId =>
   Enum invId =>
   Doc.ToInline entId =>
   Get (Organization entId) entId =>
   Get (Entity entId) entId =>
   Enum invId =>
   Doc.ToInline entId =>
-  Invoice actionId entId invId ->
+  Invoice scopeId actionId entId invId ->
   Doc.Inline
 invoiceIdInline inv =
   [ "org"
   Doc.Inline
 invoiceIdInline inv =
   [ "org"
@@ -131,21 +131,23 @@ invoiceIdInline inv =
 instance
   ( Get (Organization entId) entId
   , Get (Entity entId) entId
 instance
   ( Get (Organization entId) entId
   , Get (Entity entId) entId
+  , Ord scopeId
   , Show actionId
   , Ord actionId
   , Enum entId
   , Enum invId
   , Show actionId
   , Ord actionId
   , Enum entId
   , Enum invId
+  , Doc.ToInline scopeId
   , Doc.ToInline actionId
   , Doc.ToInline entId
   ) =>
   , Doc.ToInline actionId
   , Doc.ToInline entId
   ) =>
-  HTMLIOable (Invoice actionId entId invId)
+  HTMLIOable (Invoice scopeId actionId entId invId)
   where
   htmlIO inv = do
     -- FixMe(portability): this absolute path is not portable out of my system
     dataPath <- Self.getDataDir <&> File.normalise
     -- paperCSS <- dataPath </> "styles" </> "Paper.css" & BS.readFile <&> Text.decodeUtf8
     -- invoiceCSS <- dataPath </> "styles" </> "Invoice.css" & BS.readFile <&> Text.decodeUtf8
   where
   htmlIO inv = do
     -- FixMe(portability): this absolute path is not portable out of my system
     dataPath <- Self.getDataDir <&> File.normalise
     -- paperCSS <- dataPath </> "styles" </> "Paper.css" & BS.readFile <&> Text.decodeUtf8
     -- invoiceCSS <- dataPath </> "styles" </> "Invoice.css" & BS.readFile <&> Text.decodeUtf8
-    let invSummary :: [InvoiceItem _ _ _] =
+    let invSummary :: [InvoiceItem _ _ _ _] =
           invoiceSummary (inv & invoiceRates) (inv & invoiceWorks)
             & foldMap (foldMap pure)
     let invSummaryQuantityTotal :: Accounting.Quantity 100 =
           invoiceSummary (inv & invoiceRates) (inv & invoiceWorks)
             & foldMap (foldMap pure)
     let invSummaryQuantityTotal :: Accounting.Quantity 100 =
@@ -368,7 +370,7 @@ instance
                                                         , Doc.tableCellJustify = Doc.JustifyCenter
                                                         }
                                                     , Doc.tableCell
                                                         , Doc.tableCellJustify = Doc.JustifyCenter
                                                         }
                                                     , Doc.tableCell
-                                                        { Doc.tableCellContent = invItem & invoiceItemScope & pathToBlock
+                                                        { Doc.tableCellContent = invItem & invoiceItemScope & Doc.toInline & Doc.toBlock
                                                         , Doc.tableCellJustify = Doc.JustifyStart
                                                         }
                                                     , Doc.tableCell
                                                         , Doc.tableCellJustify = Doc.JustifyStart
                                                         }
                                                     , Doc.tableCell
@@ -467,12 +469,11 @@ instance
                                                       , Doc.tableCellJustify = Doc.JustifyCenter
                                                       }
                                                   , Doc.tableCell
                                                       , Doc.tableCellJustify = Doc.JustifyCenter
                                                       }
                                                   , Doc.tableCell
-                                                      { Doc.tableCellContent =
-                                                          work & workDuration & Doc.toBlock
+                                                      { Doc.tableCellContent = work & workDuration & Doc.toBlock
                                                       , Doc.tableCellJustify = Doc.JustifyEnd
                                                       }
                                                   , Doc.tableCell
                                                       , Doc.tableCellJustify = Doc.JustifyEnd
                                                       }
                                                   , Doc.tableCell
-                                                      { Doc.tableCellContent = work & workScope & pathToBlock
+                                                      { Doc.tableCellContent = work & workScope & Doc.toInline & Doc.toBlock
                                                       , Doc.tableCellJustify = Doc.JustifyStart
                                                       }
                                                   , Doc.tableCell
                                                       , Doc.tableCellJustify = Doc.JustifyStart
                                                       }
                                                   , Doc.tableCell
@@ -523,19 +524,14 @@ instance
                                 else Doc.PageSideRight
                         }
             }
                                 else Doc.PageSideRight
                         }
             }
-    where
-      pathToBlock segs =
-        [ seg & Doc.toInline
-        | seg <- segs
-        ]
-          & List.intersperse " / "
-          & Doc.toInline
-          & Doc.toBlock
 
 invoiceSummary ::
 
 invoiceSummary ::
+  Ord scopeId =>
   Show actionId =>
   Ord actionId =>
   Show actionId =>
   Ord actionId =>
-  _ -> [Work actionId] -> Map [Text] (Map actionId (InvoiceItem actionId _ _))
+  Map actionId (Amount 100 unit) ->
+  [Work scopeId actionId] ->
+  Map (Ands scopeId) (Map actionId (InvoiceItem scopeId actionId _ _))
 invoiceSummary invRates works =
   Map.unionsWith
     ( Map.unionWith
 invoiceSummary invRates works =
   Map.unionsWith
     ( Map.unionWith
index a620746c9db2ea8c888caa8db264f22aa2b50588..f8ab0642c5102d249590b44570cad67decf580be 100644 (file)
@@ -5,15 +5,17 @@ module Tests.Accounting where
 
 import Literate.Accounting
 import Literate.Accounting.PlanComptableGénéral qualified as PCG
 
 import Literate.Accounting
 import Literate.Accounting.PlanComptableGénéral qualified as PCG
+import Literate.Database
 import Literate.Invoice
 import Literate.Invoice
-import Literate.Organization
 import Literate.Prelude
 import Literate.Prelude
-import Tests.Invoice qualified as Invoice
-import Tests.Organization qualified as Orga
+
+import Tests.Invoice
+import Tests.Organization
+import Tests.Work
 
 data Account = Account
 
 data Account = Account
-  { accountOwner :: Maybe Orga.EntityId
-  , accountScope :: Set (Set Scope)
+  { accountOwner :: Maybe EntityId
+  , accountScope :: Set (Set ScopeId)
   , accountPCG :: Maybe PCG.PCG
   }
   deriving (Eq, Ord, Show, Generic, NFData)
   , accountPCG :: Maybe PCG.PCG
   }
   deriving (Eq, Ord, Show, Generic, NFData)
@@ -24,15 +26,6 @@ account =
     , accountPCG = Nothing
     }
 
     , accountPCG = Nothing
     }
 
-newtype Ors a = Ors {ors :: Set a}
-  deriving (Eq, Ord, Show, Generic)
-  deriving newtype (NFData)
-newtype Ands a = Ands {ands :: Set a}
-  deriving (Eq, Ord, Show, Generic)
-  deriving newtype (NFData)
-data Boolean a = BooleanTrue a | BooleanFalse a
-  deriving (Eq, Ord, Show, Generic, NFData)
-
 data Meta
   = Meta
   { metaCause :: Ands (Ors Cause)
 data Meta
   = Meta
   { metaCause :: Ands (Ors Cause)
@@ -42,9 +35,9 @@ data Meta
 
 data Cause
   = Cause
 
 data Cause
   = Cause
-  { causeEntity :: Maybe Orga.EntityId
+  { causeEntity :: Maybe EntityId
   , causePeriod :: Maybe Period
   , causePeriod :: Maybe Period
-  , causeInvoice :: Maybe Invoice.InvoiceId
+  , causeInvoice :: Maybe InvoiceId
   }
   deriving (Eq, Ord, Show, Generic, NFData)
 cause =
   }
   deriving (Eq, Ord, Show, Generic, NFData)
 cause =
@@ -65,45 +58,57 @@ instance FromRational Amounts where
 accounting :: [Movement Cause Account Amounts]
 accounting =
   [ Movement
 accounting :: [Movement Cause Account Amounts]
 accounting =
   [ Movement
-      { moveDescription = ""
-      , moveDate = "2026-01-27"
-      , movePostings = equalPostings account{accountOwner = Just Orga.EntityUpwork} account{accountOwner = Just Orga.EntityJulmInfo} 174.30
+      { moveDescription = "Liquidation"
       , moveMeta = []
       , moveMeta = []
+      , moveDate = "2026-01-27"
+      , movePostings = equalPostings account{accountOwner = Just EntityUpwork} account{accountOwner = Just EntityJulmInfo} 174.30
       }
   , Movement
       { moveDescription = ""
       }
   , Movement
       { moveDescription = ""
+      , moveMeta =
+          [ cause{causeInvoice = Just Invoice_org3sale2}
+          ]
       , moveDate = "2026-01-28"
       , moveDate = "2026-01-28"
-      , movePostings = equalPostings account{accountOwner = Just Orga.EntityNixOSFoundationNGITeam} account{accountOwner = Just Orga.EntityJulmInfo} 2000.00
-      , moveMeta = []
+      , movePostings = equalPostings account{accountOwner = Just EntityNixOSFoundationNGITeam} account{accountOwner = Just EntityJulmInfo} 2000.00
       }
   , Movement
       { moveDescription = ""
       }
   , Movement
       { moveDescription = ""
+      , moveMeta =
+          [ cause{causeInvoice = Just Invoice_org3sale1}
+          ]
       , moveDate = "2026-01-29"
       , moveDate = "2026-01-29"
-      , movePostings = equalPostings account{accountOwner = Just Orga.EntityNixOSFoundationNGITeam} account{accountOwner = Just Orga.EntityJulmInfo} 4643.75
-      , moveMeta = []
+      , movePostings = equalPostings account{accountOwner = Just EntityNixOSFoundationNGITeam} account{accountOwner = Just EntityJulmInfo} 4643.75
       }
   , Movement
       { moveDescription = "Cotisation URSSAF"
       , moveMeta =
           [ cause
       }
   , Movement
       { moveDescription = "Cotisation URSSAF"
       , moveMeta =
           [ cause
-              { causeEntity = Just Orga.EntityUrssaf
+              { causeEntity = Just EntityUrssaf
               , causePeriod = Just Period{periodBeginning = "2026-01-01", periodEnd = "2026-01-31"}
               }
           ]
       , moveDate = "2026-02-01"
       , movePostings =
           [ Posting
               , causePeriod = Just Period{periodBeginning = "2026-01-01", periodEnd = "2026-01-31"}
               }
           ]
       , moveDate = "2026-02-01"
       , movePostings =
           [ Posting
-              { postingAccount = account{accountOwner = Just Orga.EntityJulmInfo}
+              { postingAccount =
+                  account
+                    { accountOwner = Just EntityJulmInfo
+                    , accountPCG = Just PCG.pcg2025_5121
+                    }
               , postingFlow = FlowOrigin 1691.00
               , postingMeta = []
               }
           , Posting
               , postingFlow = FlowOrigin 1691.00
               , postingMeta = []
               }
           , Posting
-              { postingAccount = account{accountOwner = Just Orga.EntityUrssaf}
+              { postingAccount =
+                  account
+                    { accountOwner = Just EntityUrssaf
+                    , accountPCG = Just PCG.pcg2025_6451
+                    }
               , postingFlow = FlowTarget 1677.00
               , postingMeta = []
               }
           , Posting
               , postingFlow = FlowTarget 1677.00
               , postingMeta = []
               }
           , Posting
-              { postingAccount = account{accountOwner = Just Orga.EntityUrssaf}
+              { postingAccount = account{accountOwner = Just EntityUrssaf}
               , postingFlow = FlowTarget 14.00
               , postingMeta = []
               }
               , postingFlow = FlowTarget 14.00
               , postingMeta = []
               }
index 9435147fd0ea1b1b25aa07db3a14ef12360a9bdc..7765773b339a46c184f7d9cfe943cb1f157e0837 100644 (file)
@@ -9,7 +9,6 @@ import Data.Text.Lazy qualified as Text.Lazy
 import Data.Time.Clock qualified as Time
 import Data.Time.LocalTime qualified as Time
 import Test.Syd (Spec, describe, goldenByteStringBuilderFile, it)
 import Data.Time.Clock qualified as Time
 import Data.Time.LocalTime qualified as Time
 import Test.Syd (Spec, describe, goldenByteStringBuilderFile, it)
-import Tests.Organization qualified as Orga
 import Tests.Utils.Tests (goldenPath)
 import Text.Blaze.Renderer.Text qualified as Blaze.Text
 import Text.Blaze.Renderer.Utf8 qualified as Blaze
 import Tests.Utils.Tests (goldenPath)
 import Text.Blaze.Renderer.Text qualified as Blaze.Text
 import Text.Blaze.Renderer.Utf8 qualified as Blaze
@@ -17,20 +16,21 @@ import Prelude ((*))
 
 import Literate.Accounting (Amount, Unit (UnitName))
 import Literate.Database
 
 import Literate.Accounting (Amount, Unit (UnitName))
 import Literate.Database
-import Literate.Document qualified as Doc
 import Literate.Document.HTML qualified as HTML
 import Literate.Invoice
 import Literate.Invoice.HTML (invoiceIdInline)
 import Literate.Invoice.HTML qualified as HTML
 import Literate.Prelude
 
 import Literate.Document.HTML qualified as HTML
 import Literate.Invoice
 import Literate.Invoice.HTML (invoiceIdInline)
 import Literate.Invoice.HTML qualified as HTML
 import Literate.Prelude
 
+import Tests.Organization
+import Tests.Work
+
 spec :: HasCallStack => Spec
 spec =
 spec :: HasCallStack => Spec
 spec =
-  -- aroundAll readDicts do
   describe "Invoice" do
     forM_ invoices \invId -> do
       let
   describe "Invoice" do
     forM_ invoices \invId -> do
       let
-        inv = invId & get @(Invoice ActionId Orga.EntityId InvoiceId)
+        inv = invId & get @(Invoice ScopeId ActionId EntityId InvoiceId)
         idS =
           inv
             & invoiceIdInline
         idS =
           inv
             & invoiceIdInline
@@ -42,636 +42,6 @@ spec =
         goldenByteStringBuilderFile outPath do
           inv & HTML.htmlIO <&> Blaze.renderMarkupBuilder
 
         goldenByteStringBuilderFile outPath do
           inv & HTML.htmlIO <&> Blaze.renderMarkupBuilder
 
-works_NGIpkgs :: [Work ActionId]
-works_NGIpkgs =
-  [ Work
-      { workDate = "2025-11-06"
-      , workDuration = 0.5
-      , workAction = Action_Organization
-      , workScope = ["NGIpkgs"]
-      , workReferences = ["https://meet.google.com/hii-druc-tjp"]
-      , workDescription = "first meeting"
-      }
-  , Work
-      { workDate = "2025-11-06"
-      , workDuration = 4
-      , workAction = Action_Development
-      , workScope = ["NGIpkgs", "Bonfire"]
-      , workReferences = ["https://github.com/ju1m/bonfire-app/commits/nix"]
-      , workDescription = "focus on the hardest part first"
-      }
-  , Work
-      { workDate = "2025-11-07"
-      , workDuration = 8
-      , workAction = Action_Development
-      , workScope = ["NGIpkgs", "Bonfire"]
-      , workReferences = ["https://github.com/ju1m/bonfire-app/commits/nix"]
-      , workDescription = "continuing to package Bonfire deps"
-      }
-  , Work
-      { workDate = "2025-11-08"
-      , workDuration = 0.1
-      , workAction = Action_Development
-      , workScope = ["Nixpkgs", "opencv"]
-      , workReferences = ["https://github.com/NixOS/nixpkgs/pull/459592"]
-      , workDescription = "fix opencv in nixpkgs"
-      }
-  , Work
-      { workDate = "2025-11-09"
-      , workDuration = 8
-      , workAction = Action_Development
-      , workScope = ["NGIpkgs", "Bonfire"]
-      , workReferences = ["https://github.com/ju1m/bonfire-app/commits/nix"]
-      , workDescription = "continue to fix deps"
-      }
-  , Work
-      { workDate = "2025-11-09"
-      , workDuration = 4
-      , workAction = Action_Development
-      , workScope = ["NGIpkgs", "Bonfire"]
-      , workReferences = ["https://github.com/ju1m/bonfire-app/commits/nix"]
-      , workDescription = "continue to fix deps"
-      }
-  , Work
-      { workDate = "2025-11-11"
-      , workDuration = 6
-      , workAction = Action_Development
-      , workScope = ["NGIpkgs", "Bonfire"]
-      , workReferences = ["https://github.com/ju1m/bonfire-app/commits/nix"]
-      , workDescription = "continue to fix deps"
-      }
-  , Work
-      { workDate = "2025-11-12"
-      , workDuration = 4
-      , workAction = Action_Development
-      , workScope = ["NGIpkgs", "Bonfire"]
-      , workReferences = ["https://github.com/ju1m/bonfire-app/commits/nix"]
-      , workDescription = "continue to fix deps"
-      }
-  , Work
-      { workDate = "2025-11-14"
-      , workDuration = 5
-      , workAction = Action_Development
-      , workScope = ["NGIpkgs", "Bonfire"]
-      , workReferences = ["https://github.com/ngi-nix/ngipkgs/pull/1812"]
-      , workDescription = "continue to fix deps and move into ngipkgs"
-      }
-  , Work
-      { workDate = "2025-11-14"
-      , workDuration = 1
-      , workAction = Action_Organization
-      , workScope = ["NGIpkgs"]
-      , workReferences = ["https://www.notion.so/nixos-foundation/Nix-NGI-weekly-review-34-2ab59d49e1be80939503c655b009e934"]
-      , workDescription = "weekly meeting"
-      }
-  , Work
-      { workDate = "2025-11-15"
-      , workDuration = 6
-      , workAction = Action_Development
-      , workScope = ["NGIpkgs", "Bonfire"]
-      , workReferences = []
-      , workDescription = "finish to build Bonfire and start to fix runtime bugs"
-      }
-  , Work
-      { workDate = "2025-11-16"
-      , workDuration = 4
-      , workAction = Action_Development
-      , workScope = ["NGIpkgs", "Bonfire"]
-      , workReferences = ["https://github.com/ngi-nix/ngipkgs/pull/1812#issuecomment-3537609170"]
-      , workDescription = "workaround and contribute upstream"
-      }
-  , Work
-      { workDate = "2025-11-17"
-      , workDuration = 8
-      , workAction = Action_Development
-      , workScope = ["NGIpkgs", "Bonfire"]
-      , workReferences = []
-      , workDescription = "add updateScript and fix opencv"
-      }
-  , Work
-      { workDate = "2025-11-19"
-      , workDuration = 8
-      , workAction = Action_Development
-      , workScope = ["NGIpkgs", "Bonfire"]
-      , workReferences = ["https://github.com/ngi-nix/ngipkgs/pull/1812#issuecomment-3554376221"]
-      , workDescription = "continue to fix startup crashes"
-      }
-  , Work
-      { workDate = "2025-11-21"
-      , workDuration = 4
-      , workAction = Action_Development
-      , workScope = ["NGIpkgs", "Bonfire"]
-      , workReferences = []
-      , workDescription = "begin to package yarn assets. Upstream likes convoluted code and fake libraries."
-      }
-  , Work
-      { workDate = "2025-11-21"
-      , workDuration = 1
-      , workAction = Action_Organization
-      , workScope = ["NGIpkgs"]
-      , workReferences = []
-      , workDescription = "weekly meeting"
-      }
-  , Work
-      { workDate = "2025-11-21"
-      , workDuration = 4
-      , workAction = Action_Development
-      , workScope = ["NGIpkgs", "Bonfire"]
-      , workReferences = []
-      , workDescription = "continue to package assets"
-      }
-  , Work
-      { workDate = "2025-11-23"
-      , workDuration = 4
-      , workAction = Action_Development
-      , workScope = ["NGIpkgs", "Bonfire"]
-      , workReferences = []
-      , workDescription = "continue to package assets and try to get Bonfire to work"
-      }
-  , Work
-      { workDate = "2025-11-24"
-      , workDuration = 10
-      , workAction = Action_Development
-      , workScope = ["NGIpkgs", "Bonfire"]
-      , workReferences = ["https://github.com/surface-ui/surface/issues/762#issuecomment-3577030748"]
-      , workDescription = "continue to solve problems with Bonfire packaging"
-      }
-  , Work
-      { workDate = "2025-11-27"
-      , workDuration = 8
-      , workAction = Action_Development
-      , workScope = ["NGIpkgs", "Bonfire"]
-      , workReferences = ["https://github.com/ngi-nix/ngipkgs/pull/1812#issuecomment-3584319056"]
-      , workDescription = "successfully auto-update and build Bonfire"
-      }
-  , Work
-      { workDate = "2025-11-28"
-      , workDuration = 1
-      , workAction = Action_Organization
-      , workScope = ["NGIpkgs"]
-      , workReferences = ["https://www.notion.so/nixos-foundation/Nix-NGI-weekly-review-36-2b959d49e1be80fa823cd4d83581fda5#2b959d49e1be80fc85eed38c9a9dca86"]
-      , workDescription = "weekly meeting"
-      }
-  , Work
-      { workDate = "2025-11-29"
-      , workDuration = 5
-      , workAction = Action_Development
-      , workScope = ["NGIpkgs", "Bonfire"]
-      , workReferences = []
-      , workDescription = "begin the service module"
-      }
-  , Work
-      { workDate = "2025-12-02"
-      , workDuration = 4
-      , workAction = Action_Development
-      , workScope = ["NGIpkgs", "Bonfire"]
-      , workReferences = []
-      , workDescription = "continue the service module"
-      }
-  , Work
-      { workDate = "2025-12-03"
-      , workDuration = 8
-      , workAction = Action_Development
-      , workScope = ["NGIpkgs", "Bonfire"]
-      , workReferences = []
-      , workDescription = "first working service module"
-      }
-  , Work
-      { workDate = "2025-12-04"
-      , workDuration = 5
-      , workAction = Action_Development
-      , workScope = ["NGIpkgs", "Bonfire"]
-      , workReferences = ["https://github.com/ngi-nix/ngipkgs/pull/1871"]
-      , workDescription = "improve service module"
-      }
-  , Work
-      { workDate = "2025-12-05"
-      , workDuration = 1
-      , workAction = Action_Organization
-      , workScope = ["NGIpkgs"]
-      , workReferences = ["https://www.notion.so/nixos-foundation/Nix-NGI-weekly-review-36-2b959d49e1be80fa823cd4d83581fda5"]
-      , workDescription = "weekly meeting"
-      }
-  , Work
-      { workDate = "2025-12-05"
-      , workDuration = 0.5
-      , workAction = Action_Documentation
-      , workScope = ["NGIpkgs", "Manuals"]
-      , workReferences = ["https://github.com/ngi-nix/ngipkgs/pull/1954"]
-      , workDescription = "meeting"
-      }
-  , Work
-      { workDate = "2025-12-06"
-      , workDuration = 2
-      , workAction = Action_Documentation
-      , workScope = ["NGIpkgs", "Manuals"]
-      , workReferences = []
-      , workDescription = "prepare wednesday meeting"
-      }
-  , Work
-      { workDate = "2025-12-07"
-      , workDuration = 4
-      , workAction = Action_Documentation
-      , workScope = ["NGIpkgs", "Manuals"]
-      , workReferences = []
-      , workDescription = "prepare demo for wednesday meeting"
-      }
-  , Work
-      { workDate = "2025-12-08"
-      , workDuration = 4
-      , workAction = Action_Documentation
-      , workScope = ["NGIpkgs", "Manuals"]
-      , workReferences = ["https://github.com/ngi-nix/ngipkgs/pull/1891"]
-      , workDescription = "prepare demo for wednesday meeting"
-      }
-  , Work
-      { workDate = "2025-12-09"
-      , workDuration = 4
-      , workAction = Action_Documentation
-      , workScope = ["NGIpkgs", "Manuals"]
-      , workReferences = ["https://github.com/ngi-nix/ngipkgs/pull/1891"]
-      , workDescription = "continue to document"
-      }
-  , Work
-      { workDate = "2025-12-10"
-      , workDuration = 2
-      , workAction = Action_Review
-      , workScope = ["NGIpkgs"]
-      , workReferences = ["https://www.notion.so/nixos-foundation/Nix-NGI-best-practices-for-NixOS-modules-implementation-2c559d49e1be80a8a499f21abb203d6f"]
-      , workDescription = "visio on “best practices”"
-      }
-  , Work
-      { workDate = "2025-12-12"
-      , workDuration = 1
-      , workAction = Action_Organization
-      , workScope = ["NGIpkgs"]
-      , workReferences = []
-      , workDescription = "weekly visio meeting"
-      }
-  , Work
-      { workDate = "2025-12-11"
-      , workDuration = 8
-      , workAction = Action_Documentation
-      , workScope = ["NGIpkgs", "Manuals"]
-      , workReferences = []
-      , workDescription = "continue to document"
-      }
-  , Work
-      { workDate = "2025-12-12"
-      , workDuration = 4
-      , workAction = Action_Documentation
-      , workScope = ["NGIpkgs", "Manuals"]
-      , workReferences = []
-      , workDescription = "continue to document"
-      }
-  , Work
-      { workDate = "2025-12-13"
-      , workDuration = 2
-      , workAction = Action_Documentation
-      , workScope = ["NGIpkgs", "Manuals"]
-      , workReferences = []
-      , workDescription =
-          [ "setup sphinx like "
-          , Doc.InlineLink
-              { Doc.inlineLinkTarget = "https://nix.dev"
-              , Doc.inlineLinkText = "nix.dev"
-              }
-          , " for the manuals"
-          ]
-      }
-  , Work
-      { workDate = "2025-12-13"
-      , workDuration = 5
-      , workAction = Action_Development
-      , workScope = ["NGIpkgs", "Bonfire"]
-      , workReferences = ["https://github.com/bonfire-networks/bonfire-app/issues/1670#issuecomment-3650762914"]
-      , workDescription = "update to latest; overcoming new bugs introduced by upstream"
-      }
-  , Work
-      { workDate = "2025-12-15"
-      , workDuration = 4
-      , workAction = Action_Development
-      , workScope = ["NGIpkgs", "Bonfire"]
-      , workReferences = []
-      , workDescription = "improving the update script and still overcoming upstream bugs"
-      }
-  , Work
-      { workDate = "2025-12-16"
-      , workDuration = 3
-      , workAction = Action_Development
-      , workScope = ["NGIpkgs", "Bonfire"]
-      , workReferences = []
-      , workDescription = "overcoming bugs, again"
-      }
-  , Work
-      { workDate = "2025-12-16"
-      , workDuration = 2
-      , workAction = Action_Review
-      , workScope = ["NGIpkgs"]
-      , workReferences = []
-      , workDescription = "visio to review PRs"
-      }
-  , Work
-      { workDate = "2025-12-16"
-      , workDuration = 2
-      , workAction = Action_Review
-      , workScope = ["NGIpkgs"]
-      , workReferences = []
-      , workDescription = "visio to review PRs"
-      }
-  , Work
-      { workDate = "2025-12-17"
-      , workDuration = 1.5
-      , workAction = Action_Review
-      , workScope = ["NGIpkgs"]
-      , workReferences = []
-      , workDescription = "visio to review PRs"
-      }
-  , Work
-      { workDate = "2025-12-18"
-      , workDuration = 1
-      , workAction = Action_Review
-      , workScope = ["NGIpkgs", "dnsvizor"]
-      , workReferences = []
-      , workDescription = "review linj’s PR"
-      }
-  , Work
-      { workDate = "2025-12-19"
-      , workDuration = 1.5
-      , workAction = Action_Organization
-      , workScope = ["NGIpkgs"]
-      , workReferences = []
-      , workDescription = "weekly meeting"
-      }
-  , Work
-      { workDate = "2025-12-21"
-      , workDuration = 4
-      , workAction = Action_Development
-      , workScope = ["NGIpkgs", "Bonfire"]
-      , workReferences = []
-      , workDescription =
-          [ "fix bug using "
-          , "__structuredAttrs" & Doc.InlineCode
-          ]
-      }
-  , Work
-      { workDate = "2025-12-23"
-      , workDuration = 4
-      , workAction = Action_Documentation
-      , workScope = ["NGIpkgs", "Manuals"]
-      , workReferences = []
-      , workDescription = "improve building the manuals"
-      }
-  , Work
-      { workDate = "2025-12-23"
-      , workDuration = 2
-      , workAction = Action_Development
-      , workScope = ["NGIpkgs", "Bonfire"]
-      , workReferences = []
-      , workDescription = "address reviewers’ concerns"
-      }
-  , Work
-      { workDate = "2025-12-24"
-      , workDuration = 4
-      , workAction = Action_Development
-      , workScope = ["NGIpkgs", "Bonfire"]
-      , workReferences = []
-      , workDescription = "update Bonfire and report issues upstream"
-      }
-  , Work
-      { workDate = "2025-12-24"
-      , workDuration = 4
-      , workAction = Action_Documentation
-      , workScope = ["NGIpkgs", "Manuals"]
-      , workReferences = []
-      , workDescription = "document"
-      }
-  , Work
-      { workDate = "2025-12-24"
-      , workDuration = 2
-      , workAction = Action_Development
-      , workScope = ["NGIpkgs", "Bonfire"]
-      , workReferences = []
-      , workDescription = "update Bonfire to fix bugs"
-      }
-  , Work
-      { workDate = "2025-12-25"
-      , workDuration = 2
-      , workAction = Action_Documentation
-      , workScope = ["NGIpkgs", "Manuals"]
-      , workReferences = []
-      , workDescription = "document"
-      }
-  , Work
-      { workDate = "2025-12-25"
-      , workDuration = 6
-      , workAction = Action_Development
-      , workScope = ["NGIpkgs", "Bonfire"]
-      , workReferences = ["https://github.com/bonfire-networks/bonfire-app/issues/1698#issuecomment-3692147409"]
-      , workDescription = "update and fix bugs"
-      }
-  , Work
-      { workDate = "2025-12-26"
-      , workDuration = 1
-      , workAction = Action_Development
-      , workScope = ["NGIpkgs", "Bonfire"]
-      , workReferences = []
-      , workDescription = "update to fix bugs"
-      }
-  , Work
-      { workDate = "2025-12-28"
-      , workDuration = 6
-      , workAction = Action_Documentation
-      , workScope = ["NGIpkgs", "Manuals"]
-      , workReferences = []
-      , workDescription = "document"
-      }
-  , Work
-      { workDate = "2025-12-29"
-      , workDuration = 2
-      , workAction = Action_Development
-      , workScope = ["NGIpkgs", "Bonfire"]
-      , workReferences = []
-      , workDescription = "add more tests"
-      }
-  , Work
-      { workDate = "2025-12-29"
-      , workDuration = 0.5
-      , workAction = Action_Review
-      , workScope = ["NGIpkgs", "Funkwhale"] -- goes into NGI Review
-      , workReferences = ["https://github.com/ngi-nix/ngipkgs/pull/1707#discussion_r2651644145"]
-      , workDescription = ""
-      }
-  , Work
-      { workDate = "2025-12-30"
-      , workDuration = 4
-      , workAction = Action_Development
-      , workScope = ["NGIpkgs", "BEAM"]
-      , workReferences = []
-      , workDescription = ["improve ", Doc.InlineCode "buildMix", " & ", Doc.InlineCode "mixRelease", " for packaging Elixir software"]
-      }
-  , Work
-      { workDate = "2026-01-01"
-      , workDuration = 4
-      , workAction = Action_Development
-      , workScope = ["NGIpkgs", "Bonfire"]
-      , workReferences = []
-      , workDescription = "support other flavours"
-      }
-  , Work
-      { workDate = "2026-01-03"
-      , workDuration = 4
-      , workAction = Action_Development
-      , workScope = ["NGIpkgs", "Bonfire"]
-      , workReferences = []
-      , workDescription = "support other flavours, and make update more resilient"
-      }
-  , Work
-      { workDate = "2026-01-04"
-      , workDuration = 2
-      , workAction = Action_Development
-      , workScope = ["NGIpkgs", "Bonfire"]
-      , workReferences = []
-      , workDescription = "provide upstream with reproducers"
-      }
-  , Work
-      { workDate = "2026-01-05"
-      , workDuration = 2
-      , workAction = Action_Development
-      , workScope = ["NGIpkgs", "Bonfire"]
-      , workReferences = []
-      , workDescription = "update to latest version"
-      }
-  , Work
-      { workDate = "2026-01-07"
-      , workDuration = 5
-      , workAction = Action_Development
-      , workScope = ["NGIpkgs", "Bonfire"]
-      , workReferences = []
-      , workDescription = "fix updating"
-      }
-  , Work
-      { workDate = "2026-01-07"
-      , workDuration = 1
-      , workAction = Action_Documentation
-      , workScope = ["NGIpkgs", "Manuals"] -- goes into NGI Core
-      , workReferences = ["https://github.com/ngi-nix/ngipkgs/pull/1891"]
-      , workDescription = "address reviewer’s comment"
-      }
-  , Work
-      { workDate = "2026-01-09"
-      , workDuration = 2
-      , workAction = Action_Documentation
-      , workScope = ["NGIpkgs", "Manuals"] -- goes into NGI Core
-      , workReferences = []
-      , workDescription = "address reviewer’s comments"
-      }
-  , Work
-      { workDate = "2026-01-09"
-      , workDuration = 2
-      , workAction = Action_Development
-      , workScope = ["NGIpkgs", "Bonfire"]
-      , workReferences = ["https://github.com/bonfire-networks/bonfire-app/issues/1730"]
-      , workDescription = "answer upstream’s questions"
-      }
-  , Work
-      { workDate = "2026-01-11"
-      , workDuration = 5
-      , workAction = Action_Development
-      , workScope = ["NGIpkgs", "dnsvizor"]
-      , workReferences = []
-      , workDescription = ["replace ", Doc.InlineCode "hillingar", " to package MirageOS unikernels"]
-      }
-  , Work
-      { workDate = "2026-01-09"
-      , workDuration = 2
-      , workAction = Action_Organization
-      , workScope = ["NGIpkgs"]
-      , workReferences = []
-      , workDescription = "weekly meeting"
-      }
-  , Work
-      { workDate = "2026-01-12"
-      , workDuration = 5
-      , workAction = Action_Development
-      , workScope = ["NGIpkgs", "dnsvizor"]
-      , workReferences = ["https://github.com/ju1m/ngipkgs/commits/dnsvizor/"]
-      , workDescription = ["remove the need for ", Doc.InlineCode "--allow-import-from-derivation"]
-      }
-  , Work
-      { workDate = "2026-01-12"
-      , workDuration = 6
-      , workAction = Action_Documentation
-      , workScope = ["NGIpkgs", "Manuals"] -- goes into NGI Core
-      , workReferences = []
-      , workDescription = "render options"
-      }
-  , Work
-      { workDate = "2026-01-13"
-      , workDuration = 1
-      , workAction = Action_Documentation
-      , workScope = ["NGIpkgs", "Manuals"] -- goes into NGI Core
-      , workReferences = []
-      , workDescription = "update"
-      }
-  , Work
-      { workDate = "2026-01-16"
-      , workDuration = 2
-      , workAction = Action_Organization
-      , workScope = ["NGIpkgs"]
-      , workReferences = []
-      , workDescription = "weekly meeting"
-      }
-  , Work
-      { workDate = "2026-01-19"
-      , workDuration = 2
-      , workAction = Action_Documentation
-      , workScope = ["NGIpkgs", "Manuals"] -- goes into NGI Core
-      , workReferences = []
-      , workDescription = "split into several PDF"
-      }
-  , Work
-      { workDate = "2026-01-22"
-      , workDuration = 4
-      , workAction = Action_Development
-      , workScope = ["NGIpkgs", "Manuals"] -- goes into NGI Core
-      , workReferences = ["https://github.com/ngi-nix/ngipkgs/pull/2010"]
-      , workDescription = "address reviewers’ concerns"
-      }
-  , Work
-      { workDate = "2026-01-23"
-      , workDuration = 1.5
-      , workAction = Action_Organization
-      , workScope = ["NGIpkgs"]
-      , workReferences = []
-      , workDescription = "weekly meeting"
-      }
-  , Work
-      { workDate = "2026-01-25"
-      , workDuration = 4
-      , workAction = Action_Development
-      , workScope = ["NGIpkgs", "Seppo"]
-      , workReferences = []
-      , workDescription = "begin packaging"
-      }
-  , Work
-      { workDate = "2026-01-26"
-      , workDuration = 5
-      , workAction = Action_Development
-      , workScope = ["NGIpkgs", "Seppo"]
-      , workReferences = []
-      , workDescription = "continue packaging"
-      }
-  , Work
-      { workDate = "2026-01-27"
-      , workDuration = 5
-      , workAction = Action_Development
-      , workScope = ["NGIpkgs", "Seppo"]
-      , workReferences = []
-      , workDescription = "continue packaging"
-      }
-  ]
-
 data InvoiceId
   = Invoice_0
   | Invoice_org3sale1
 data InvoiceId
   = Invoice_0
   | Invoice_org3sale1
@@ -679,28 +49,7 @@ data InvoiceId
   | Invoice_org3sale3
   deriving (Eq, Ord, Show, Generic, Enum, NFData)
 
   | Invoice_org3sale3
   deriving (Eq, Ord, Show, Generic, Enum, NFData)
 
-invoiceRate_NGIpkgs =
-  [ Action_Organization := 31.25
-  , Action_Development := 31.25
-  , Action_Documentation := 31.25
-  , Action_Review := 31.25
-  ]
-
-data ActionId
-  = Action_Organization
-  | Action_Development
-  | Action_Documentation
-  | Action_Review
-  deriving (Eq, Ord, Show, Generic, Enum, NFData)
-
-instance Doc.ToInline ActionId where
-  toInline = \case
-    Action_Development -> "development"
-    Action_Documentation -> "documentation"
-    Action_Organization -> "organization"
-    Action_Review -> "review"
-
-instance Get (Invoice ActionId Orga.EntityId InvoiceId) InvoiceId where
+instance Get (Invoice ScopeId ActionId EntityId InvoiceId) InvoiceId where
   get invoiceId = case invoiceId of
     Invoice_0 ->
       Invoice
   get invoiceId = case invoiceId of
     Invoice_0 ->
       Invoice
@@ -709,8 +58,8 @@ instance Get (Invoice ActionId Orga.EntityId InvoiceId) InvoiceId where
         , invoiceOrders = []
         , invoiceEmittedOn
         , invoicePaymentDueBefore = invoiceEmittedOn & Time.addLocalTime (31 * Time.nominalDay)
         , invoiceOrders = []
         , invoiceEmittedOn
         , invoicePaymentDueBefore = invoiceEmittedOn & Time.addLocalTime (31 * Time.nominalDay)
-        , invoiceIssuer = Orga.EntityJulmInfo
-        , invoiceRecipient = Orga.EntityJulmInfo
+        , invoiceIssuer = EntityJulmInfo
+        , invoiceRecipient = EntityJulmInfo
         , invoiceRates = [Action_Development := 0]
         , invoiceMentions =
             [ InvoiceMentionTVANonApplicable
         , invoiceRates = [Action_Development := 0]
         , invoiceMentions =
             [ InvoiceMentionTVANonApplicable
@@ -737,22 +86,27 @@ instance Get (Invoice ActionId Orga.EntityId InvoiceId) InvoiceId where
         , invoiceOrders = ["Contract n°2025-24"]
         , invoiceEmittedOn
         , invoicePaymentDueBefore = invoiceEmittedOn & Time.addLocalTime (31 * Time.nominalDay)
         , invoiceOrders = ["Contract n°2025-24"]
         , invoiceEmittedOn
         , invoicePaymentDueBefore = invoiceEmittedOn & Time.addLocalTime (31 * Time.nominalDay)
-        , invoiceIssuer = Orga.EntityJulmInfo
-        , invoiceRecipient = Orga.EntityNixOSFoundationNGITeam
-        , invoiceRates = invoiceRate_NGIpkgs
+        , invoiceIssuer = EntityJulmInfo
+        , invoiceRecipient = EntityNixOSFoundationNGITeam
+        , invoiceRates =
+            [ Action_Organization := 31.25
+            , Action_Development := 31.25
+            , Action_Documentation := 31.25
+            , Action_Review := 31.25
+            ]
         , invoiceMentions =
             [ InvoiceMentionTVANonApplicable
             , InvoiceMentionIndemnitéForfaitaire
             , InvoiceMentionIndemnitéTaux (12.15 :: Amount 100 (UnitName "%"))
             ]
         , invoiceWorks =
         , invoiceMentions =
             [ InvoiceMentionTVANonApplicable
             , InvoiceMentionIndemnitéForfaitaire
             , InvoiceMentionIndemnitéTaux (12.15 :: Amount 100 (UnitName "%"))
             ]
         , invoiceWorks =
-            works_NGIpkgs
+            works
               & List.filter \work ->
                 and $
                   list
                     [ work & workDate & (>= "2025-11-06")
                     , work & workDate & (<= "2025-12-22")
               & List.filter \work ->
                 and $
                   list
                     [ work & workDate & (>= "2025-11-06")
                     , work & workDate & (<= "2025-12-22")
-                    , work & workScope & (/= ["NGIpkgs", "Manuals"])
+                    , work & workScope & (/= [Scope_NGIpkgs_Manuals])
                     ]
         }
       where
                     ]
         }
       where
@@ -764,28 +118,33 @@ instance Get (Invoice ActionId Orga.EntityId InvoiceId) InvoiceId where
         , invoiceOrders = ["contract n°2026-03"]
         , invoiceEmittedOn
         , invoicePaymentDueBefore = invoiceEmittedOn & Time.addLocalTime (31 * Time.nominalDay)
         , invoiceOrders = ["contract n°2026-03"]
         , invoiceEmittedOn
         , invoicePaymentDueBefore = invoiceEmittedOn & Time.addLocalTime (31 * Time.nominalDay)
-        , invoiceIssuer = Orga.EntityJulmInfo
-        , invoiceRecipient = Orga.EntityNixOSFoundationNGITeam
-        , invoiceRates = invoiceRate_NGIpkgs
+        , invoiceIssuer = EntityJulmInfo
+        , invoiceRecipient = EntityNixOSFoundationNGITeam
+        , invoiceRates =
+            [ Action_Organization := 31.25
+            , Action_Development := 31.25
+            , Action_Documentation := 31.25
+            , Action_Review := 31.25
+            ]
         , invoiceMentions =
             [ InvoiceMentionTVANonApplicable
             , InvoiceMentionIndemnitéForfaitaire
             , InvoiceMentionIndemnitéTaux (12.15 :: Amount 100 (UnitName "%"))
             ]
         , invoiceWorks =
         , invoiceMentions =
             [ InvoiceMentionTVANonApplicable
             , InvoiceMentionIndemnitéForfaitaire
             , InvoiceMentionIndemnitéTaux (12.15 :: Amount 100 (UnitName "%"))
             ]
         , invoiceWorks =
-            works_NGIpkgs
+            works
               & List.filter \work ->
                 and $
                   [ work & workDate & (>= "2025-12-23")
                   , work & workDate & (<= "2026-12-31")
               & List.filter \work ->
                 and $
                   [ work & workDate & (>= "2025-12-23")
                   , work & workDate & (<= "2026-12-31")
-                  , work & workScope & (/= ["NGIpkgs", "Manuals"])
-                  , work & workScope & (/= ["NGIpkgs", "Funkwhale"])
+                  , work & workScope & (/= [Scope_NGIpkgs_Manuals])
+                  , work & workScope & (/= [Scope_NGIpkgs, Scope_Funkwhale])
                   , not $
                       and $
                         [ work & workDate & (>= "2026-01-09")
                         , work & workDate & (<= "2026-01-28")
                         , work & workAction & (== Action_Organization)
                   , not $
                       and $
                         [ work & workDate & (>= "2026-01-09")
                         , work & workDate & (<= "2026-01-28")
                         , work & workAction & (== Action_Organization)
-                        , work & workScope & (== ["NGIpkgs"])
+                        , work & workScope & (== [Scope_NGIpkgs])
                         ]
                           & list
                   ]
                         ]
                           & list
                   ]
@@ -800,35 +159,40 @@ instance Get (Invoice ActionId Orga.EntityId InvoiceId) InvoiceId where
         , invoiceOrders = ["contract n°2026-FixMe"]
         , invoiceEmittedOn
         , invoicePaymentDueBefore = invoiceEmittedOn & Time.addLocalTime (31 * Time.nominalDay)
         , invoiceOrders = ["contract n°2026-FixMe"]
         , invoiceEmittedOn
         , invoicePaymentDueBefore = invoiceEmittedOn & Time.addLocalTime (31 * Time.nominalDay)
-        , invoiceIssuer = Orga.EntityJulmInfo
-        , invoiceRecipient = Orga.EntityNixOSFoundationNGITeam
-        , invoiceRates = invoiceRate_NGIpkgs
+        , invoiceIssuer = EntityJulmInfo
+        , invoiceRecipient = EntityNixOSFoundationNGITeam
+        , invoiceRates =
+            [ Action_Organization := 31.25
+            , Action_Development := 31.25
+            , Action_Documentation := 31.25
+            , Action_Review := 31.25
+            ]
         , invoiceMentions =
             [ InvoiceMentionTVANonApplicable
             , InvoiceMentionIndemnitéForfaitaire
             , InvoiceMentionIndemnitéTaux (12.15 :: Amount 100 (UnitName "%"))
             ]
         , invoiceWorks =
         , invoiceMentions =
             [ InvoiceMentionTVANonApplicable
             , InvoiceMentionIndemnitéForfaitaire
             , InvoiceMentionIndemnitéTaux (12.15 :: Amount 100 (UnitName "%"))
             ]
         , invoiceWorks =
-            works_NGIpkgs
+            works
               & List.filter \work ->
                 or $
                   [ and $
                       [ work & workDate & (>= "2026-01-21")
                       , work & workDate & (<= "2026-12-31")
               & List.filter \work ->
                 or $
                   [ and $
                       [ work & workDate & (>= "2026-01-21")
                       , work & workDate & (<= "2026-12-31")
-                      , work & workScope & (== ["NGIpkgs", "Manuals"])
+                      , work & workScope & (== [Scope_NGIpkgs_Manuals])
                       ]
                         & list
                   , and $
                       [ work & workDate & (>= "2025-12-29")
                       , work & workDate & (<= "2026-12-31")
                       ]
                         & list
                   , and $
                       [ work & workDate & (>= "2025-12-29")
                       , work & workDate & (<= "2026-12-31")
-                      , work & workScope & (== ["NGIpkgs", "Funkwhale"])
+                      , work & workScope & (== [Scope_NGIpkgs, Scope_Funkwhale])
                       ]
                         & list
                   , and $
                       [ work & workDate & (>= "2026-01-09")
                       , work & workDate & (<= "2026-01-28")
                       , work & workAction & (== Action_Organization)
                       ]
                         & list
                   , and $
                       [ work & workDate & (>= "2026-01-09")
                       , work & workDate & (<= "2026-01-28")
                       , work & workAction & (== Action_Organization)
-                      , work & workScope & (== ["NGIpkgs"])
+                      , work & workScope & (== [Scope_NGIpkgs])
                       ]
                         & list
                   ]
                       ]
                         & list
                   ]
index 75c45b26fb06e46a40bfbbf970dbbf4a252a13a0..43c2aa779f7cd83a62e3826858ce13b34eb65574 100644 (file)
@@ -1,2 +1,2 @@
 <!DOCTYPE HTML>
 <!DOCTYPE HTML>
-<html><head><title>julminfo - 2026-01-22 - Invoice #org3sale1 - Contract n°2025-24</title><link rel="stylesheet" type="text/css" href="/home/julm/work/sourcephile/haskell/literate-business/data/styles/Document.css"><link rel="stylesheet" type="text/css" href="/home/julm/work/sourcephile/haskell/literate-business/data/styles/Invoice.css"><link rel="stylesheet" type="text/css" href="/home/julm/work/sourcephile/haskell/literate-business/data/styles/List.css"><link rel="stylesheet" type="text/css" href="/home/julm/work/sourcephile/haskell/literate-business/data/styles/Paper.css"><link rel="stylesheet" type="text/css" href="/home/julm/work/sourcephile/haskell/literate-business/data/styles/Table.css"></head><body><div class="page A4 portrait" style="display:flex;size:A4 portrait;"><div style="align-content:stretch;display:flex;flex-direction:column;gap:5.0mm;justify-content:space-between;width:100%;" style="width:100%;"><div style="display:flex;flex-direction:column;gap:5.0mm;width:100%;"><div class="title"><p>Invoice</p></div><section class="invoice-headers"><div class="dict"><div class="dict-entry"><div class="dict-key">InvoiceIdentifier:</div><div class="dict-value"><p>org3sale1</p></div></div><div class="dict-entry"><div class="dict-key">InvoiceType:</div><div class="dict-value"><p>sale</p></div></div><div class="dict-entry"><div class="dict-key">InvoiceOrders:</div><div class="dict-value"><div class="list" style="grid-template-columns:max-content 1fr;"><div class="list-body odd"><div class="list-key" style="justify-items:end;">-</div><div class="list-value" style="justify-items:start;"><p>Contract n°2025-24</p></div></div></div></div></div><div class="dict-entry"><div class="dict-key">InvoiceEmittedOn:</div><div class="dict-value"><p>2026-01-22</p></div></div><div class="dict-entry"><div class="dict-key">InvoicePaymentDueBefore:</div><div class="dict-value"><p>2026-02-22</p></div></div></div></section><section class="invoice-from-to"><div class="org"><div class="entity"><div class="dict"><div class="dict-entry"><div class="dict-key">Name:</div><div class="dict-value"><p>julminfo</p></div></div><div class="dict-entry"><div class="dict-key">Address:</div><div class="dict-value"><div class="address"><p>3, place du Monument</p><p>Mairie - Bureau 1</p><div class="address-bottom"><p>23340 Gentioux-Pigerolles France</p></div></div></div></div><div class="dict-entry"><div class="dict-key">SIREN:</div><div class="dict-value"><p>942798083</p></div></div><div class="dict-entry"><div class="dict-key">IBAN:</div><div class="dict-value"><p>FR18 2004 1010 0820 3735 3D02 912</p></div></div></div></div><div class="dict"><div class="dict-entry"><div class="dict-key">Seller:</div><div class="dict-value"><div class="org"><div class="entity"><div class="dict"><div class="dict-entry"><div class="dict-key">Name:</div><div class="dict-value"><p>julminfo</p></div></div><div class="dict-entry"><div class="dict-key">Address:</div><div class="dict-value"><div class="address"><p>3, place du Monument</p><p>Mairie - Bureau 1</p><div class="address-bottom"><p>23340 Gentioux-Pigerolles France</p></div></div></div></div><div class="dict-entry"><div class="dict-key">SIREN:</div><div class="dict-value"><p>942798083</p></div></div><div class="dict-entry"><div class="dict-key">IBAN:</div><div class="dict-value"><p>FR18 2004 1010 0820 3735 3D02 912</p></div></div></div></div><div class="dict"><div class="dict-entry"><div class="dict-key">Admin:</div><div class="dict-value"><div class="org"><div class="entity"><div class="dict"><div class="dict-entry"><div class="dict-key">Name:</div><div class="dict-value"><p>Julien Moutinho</p></div></div><div class="dict-entry"><div class="dict-key">Email:</div><div class="dict-value"><p><a href="mailto:julm@sourcephile.fr">julm​@sourcephile.fr</a></p></div></div></div></div><div class="dict"></div></div></div></div></div></div></div></div><div class="dict-entry"><div class="dict-key">Buyer:</div><div class="dict-value"><div class="org"><div class="entity"><div class="dict"><div class="dict-entry"><div class="dict-key">Name:</div><div class="dict-value"><p>Nix@NGI Team</p></div></div><div class="dict-entry"><div class="dict-key">Email:</div><div class="dict-value"><p><a href="mailto:ngi@nixos.org">ngi​@nixos.org</a></p></div></div></div></div><div class="dict"><div class="dict-entry"><div class="dict-key">Admin:</div><div class="dict-value"><div class="org"><div class="entity"><div class="dict"><div class="dict-entry"><div class="dict-key">Name:</div><div class="dict-value"><p>Daniel Ramirez</p></div></div><div class="dict-entry"><div class="dict-key">Email:</div><div class="dict-value"><p><a href="mailto:danielramirez5@protonmail.com">danielramirez5​@protonmail.com</a></p></div></div></div></div><div class="dict"></div></div></div></div></div></div></div></div></div></div></section><section><div class="title"><p>Grand totals</p></div><div class="table" style="grid-template-columns:1fr 1fr 1fr;"><div class="table-head"><div class="table-cell"><div><p>Time frame</p></div></div><div class="table-cell"><div><p>Workload</p></div></div><div class="table-cell"><div><p>To pay (excl. taxes)</p></div></div></div><div class="table-body odd"><div class="table-cell" style="justify-items:center;" style="align-items:center;"><p>2025-11-06</p><p>2025-12-21</p></div><div class="table-cell" style="justify-items:center;" style="align-items:center;"><p>148.60 h</p></div><div class="table-cell" style="justify-items:center;" style="align-items:center;"><p>4643.75 €</p></div></div></div></section><section><div class="title"><p>Mandatory legal notices</p></div><div class="list" style="grid-template-columns:max-content 1fr;"><div class="list-body odd"><div class="list-key" style="justify-items:end;">—</div><div class="list-value" style="justify-items:start;"><p>VAT not applicable, art. 293 B of the French General Tax Code.</p></div></div><div class="list-body even"><div class="list-key" style="justify-items:end;">—</div><div class="list-value" style="justify-items:start;"><p>Fixed compensation for recovery costs in case of late payment: 40.00 €</p></div></div><div class="list-body odd"><div class="list-key" style="justify-items:end;">—</div><div class="list-value" style="justify-items:start;"><p>Late payment penalty rate (applicable from 2026-02-23): 12.15 % × unpaid amount × number of days late / 365.25</p></div></div></div></section></div><div style="display:flex;flex-direction:row;gap:5.0mm;justify-content:space-between;width:100%;"><p>julminfo - 2026-01-22 - Invoice #org3sale1 - Contract n°2025-24</p><p>1/5</p></div></div></div><div class="page A4 portrait" style="display:flex;size:A4 portrait;"><div style="align-content:stretch;display:flex;flex-direction:column;gap:5.0mm;justify-content:space-between;width:100%;" style="width:100%;"><section class="invoice-summary"><div style="display:flex;flex-direction:column;gap:5.0mm;width:100%;"><div class="title"><p>Summary</p></div><div class="table" style="grid-template-columns:max-content max-content 1fr max-content max-content max-content max-content max-content;"><div class="table-head"><div class="table-cell"><div><p>#</p></div></div><div class="table-cell"><div><p>Type</p></div></div><div class="table-cell"><div><p>Scope</p></div></div><div class="table-cell"><div><p>Action</p></div></div><div class="table-cell"><div><p>Time frame</p></div></div><div class="table-cell"><div><p>Rate</p><p>(excl. taxes.)</p></div></div><div class="table-cell"><div><p>Quantity</p></div></div><div class="table-cell"><div><p>Total</p><p>(excl. taxes.)</p></div></div></div><div class="table-body odd"><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>1</p></div><div class="table-cell" style="justify-items:center;" style="align-items:center;"><p>service</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>NGIpkgs</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>organization</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>2025-11-06</p><p>2025-12-19</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>31.25 € / h</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>7.00 h</p><p>(4.71%)</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>218.75 €</p></div></div><div class="table-body even"><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>2</p></div><div class="table-cell" style="justify-items:center;" style="align-items:center;"><p>service</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>NGIpkgs</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>review</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>2025-12-10</p><p>2025-12-17</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>31.25 € / h</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>7.50 h</p><p>(5.05%)</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>234.38 €</p></div></div><div class="table-body odd"><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>3</p></div><div class="table-cell" style="justify-items:center;" style="align-items:center;"><p>service</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>NGIpkgs / Bonfire</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>development</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>2025-11-06</p><p>2025-12-21</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>31.25 € / h</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>133.00 h</p><p>(89.5%)</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>4156.25 €</p></div></div><div class="table-body even"><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>4</p></div><div class="table-cell" style="justify-items:center;" style="align-items:center;"><p>service</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>NGIpkgs / dnsvizor</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>review</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>2025-12-18</p><p>2025-12-18</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>31.25 € / h</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>1.00 h</p><p>(0.67%)</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>31.25 €</p></div></div><div class="table-body odd"><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>5</p></div><div class="table-cell" style="justify-items:center;" style="align-items:center;"><p>service</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>Nixpkgs / opencv</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>development</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>2025-11-08</p><p>2025-11-08</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>31.25 € / h</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>0.10 h</p><p>(0.07%)</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>3.12 €</p></div></div></div></div></section><div style="display:flex;flex-direction:row;gap:5.0mm;justify-content:space-between;width:100%;"><p>2/5</p><p>julminfo - 2026-01-22 - Invoice #org3sale1 - Contract n°2025-24 — Summary</p></div></div></div><div class="page A4 portrait" style="display:flex;size:A4 portrait;"><div style="align-content:stretch;display:flex;flex-direction:column;gap:5.0mm;justify-content:space-between;width:100%;" style="width:100%;"><section class="invoice-details"><div style="display:flex;flex-direction:column;gap:5.0mm;width:100%;"><div class="title"><p>Details</p></div><div class="table" style="grid-template-columns:max-content max-content max-content 1fr 1fr 50.0mm 2fr;"><div class="table-head"><div class="table-cell"><div><p>#</p></div></div><div class="table-cell"><div><p>Date</p></div></div><div class="table-cell"><div><p>Duration</p></div></div><div class="table-cell"><div><p>Scope</p></div></div><div class="table-cell"><div><p>Action</p></div></div><div class="table-cell"><div><p>References</p></div></div><div class="table-cell"><div><p>Description</p></div></div></div><div class="table-body odd"><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>1</p></div><div class="table-cell" style="justify-items:center;" style="align-items:center;"><p>2025-11-06</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>0.50 h</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>NGIpkgs</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>organization</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p><a style="word-break:break-all;" href="https://meet.google.com/hii-druc-tjp">https://meet.google.com/hii-druc-tjp</a></p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>first meeting</p></div></div><div class="table-body even"><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>2</p></div><div class="table-cell" style="justify-items:center;" style="align-items:center;"><p>2025-11-06</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>4.00 h</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>NGIpkgs / Bonfire</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>development</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p><a style="word-break:break-all;" href="https://github.com/ju1m/bonfire-app/commits/nix">https://github.com/ju1m/bonfire-app/commits/nix</a></p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>focus on the hardest part first</p></div></div><div class="table-body odd"><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>3</p></div><div class="table-cell" style="justify-items:center;" style="align-items:center;"><p>2025-11-07</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>8.00 h</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>NGIpkgs / Bonfire</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>development</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p><a style="word-break:break-all;" href="https://github.com/ju1m/bonfire-app/commits/nix">https://github.com/ju1m/bonfire-app/commits/nix</a></p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>continuing to package Bonfire deps</p></div></div><div class="table-body even"><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>4</p></div><div class="table-cell" style="justify-items:center;" style="align-items:center;"><p>2025-11-08</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>0.10 h</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>Nixpkgs / opencv</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>development</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p><a style="word-break:break-all;" href="https://github.com/NixOS/nixpkgs/pull/459592">https://github.com/NixOS/nixpkgs/pull/459592</a></p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>fix opencv in nixpkgs</p></div></div><div class="table-body odd"><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>5</p></div><div class="table-cell" style="justify-items:center;" style="align-items:center;"><p>2025-11-09</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>8.00 h</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>NGIpkgs / Bonfire</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>development</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p><a style="word-break:break-all;" href="https://github.com/ju1m/bonfire-app/commits/nix">https://github.com/ju1m/bonfire-app/commits/nix</a></p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>continue to fix deps</p></div></div><div class="table-body even"><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>6</p></div><div class="table-cell" style="justify-items:center;" style="align-items:center;"><p>2025-11-09</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>4.00 h</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>NGIpkgs / Bonfire</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>development</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p><a style="word-break:break-all;" href="https://github.com/ju1m/bonfire-app/commits/nix">https://github.com/ju1m/bonfire-app/commits/nix</a></p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>continue to fix deps</p></div></div><div class="table-body odd"><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>7</p></div><div class="table-cell" style="justify-items:center;" style="align-items:center;"><p>2025-11-11</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>6.00 h</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>NGIpkgs / Bonfire</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>development</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p><a style="word-break:break-all;" href="https://github.com/ju1m/bonfire-app/commits/nix">https://github.com/ju1m/bonfire-app/commits/nix</a></p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>continue to fix deps</p></div></div><div class="table-body even"><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>8</p></div><div class="table-cell" style="justify-items:center;" style="align-items:center;"><p>2025-11-12</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>4.00 h</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>NGIpkgs / Bonfire</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>development</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p><a style="word-break:break-all;" href="https://github.com/ju1m/bonfire-app/commits/nix">https://github.com/ju1m/bonfire-app/commits/nix</a></p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>continue to fix deps</p></div></div><div class="table-body odd"><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>9</p></div><div class="table-cell" style="justify-items:center;" style="align-items:center;"><p>2025-11-14</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>5.00 h</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>NGIpkgs / Bonfire</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>development</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p><a style="word-break:break-all;" href="https://github.com/ngi-nix/ngipkgs/pull/1812">https://github.com/ngi-nix/ngipkgs/pull/1812</a></p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>continue to fix deps and move into ngipkgs</p></div></div><div class="table-body even"><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>10</p></div><div class="table-cell" style="justify-items:center;" style="align-items:center;"><p>2025-11-14</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>1.00 h</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>NGIpkgs</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>organization</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p><a style="word-break:break-all;" href="https://www.notion.so/nixos-foundation/Nix-NGI-weekly-review-34-2ab59d49e1be80939503c655b009e934">https://www.notion.so/nixos-foundation/Nix-NGI-weekly-review-34-2ab59d49e1be80939503c655b009e934</a></p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>weekly meeting</p></div></div><div class="table-body odd"><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>11</p></div><div class="table-cell" style="justify-items:center;" style="align-items:center;"><p>2025-11-15</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>6.00 h</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>NGIpkgs / Bonfire</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>development</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p></p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>finish to build Bonfire and start to fix runtime bugs</p></div></div><div class="table-body even"><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>12</p></div><div class="table-cell" style="justify-items:center;" style="align-items:center;"><p>2025-11-16</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>4.00 h</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>NGIpkgs / Bonfire</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>development</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p><a style="word-break:break-all;" href="https://github.com/ngi-nix/ngipkgs/pull/1812#issuecomment-3537609170">https://github.com/ngi-nix/ngipkgs/pull/1812#issuecomment-3537609170</a></p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>workaround and contribute upstream</p></div></div><div class="table-body odd"><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>13</p></div><div class="table-cell" style="justify-items:center;" style="align-items:center;"><p>2025-11-17</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>8.00 h</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>NGIpkgs / Bonfire</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>development</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p></p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>add updateScript and fix opencv</p></div></div><div class="table-body even"><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>14</p></div><div class="table-cell" style="justify-items:center;" style="align-items:center;"><p>2025-11-19</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>8.00 h</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>NGIpkgs / Bonfire</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>development</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p><a style="word-break:break-all;" href="https://github.com/ngi-nix/ngipkgs/pull/1812#issuecomment-3554376221">https://github.com/ngi-nix/ngipkgs/pull/1812#issuecomment-3554376221</a></p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>continue to fix startup crashes</p></div></div><div class="table-body odd"><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>15</p></div><div class="table-cell" style="justify-items:center;" style="align-items:center;"><p>2025-11-21</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>4.00 h</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>NGIpkgs / Bonfire</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>development</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p></p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>begin to package yarn assets. Upstream likes convoluted code and fake libraries.</p></div></div></div></div></section><div style="display:flex;flex-direction:row;gap:5.0mm;justify-content:space-between;width:100%;"><p>julminfo - 2026-01-22 - Invoice #org3sale1 - Contract n°2025-24 — Details</p><p>3/5</p></div></div></div><div class="page A4 portrait" style="display:flex;size:A4 portrait;"><div style="align-content:stretch;display:flex;flex-direction:column;gap:5.0mm;justify-content:space-between;width:100%;" style="width:100%;"><section class="invoice-details"><div style="display:flex;flex-direction:column;gap:5.0mm;width:100%;"><div class="table" style="grid-template-columns:max-content max-content max-content 1fr 1fr 50.0mm 2fr;"><div class="table-head"><div class="table-cell"><div><p>#</p></div></div><div class="table-cell"><div><p>Date</p></div></div><div class="table-cell"><div><p>Duration</p></div></div><div class="table-cell"><div><p>Scope</p></div></div><div class="table-cell"><div><p>Action</p></div></div><div class="table-cell"><div><p>References</p></div></div><div class="table-cell"><div><p>Description</p></div></div></div><div class="table-body odd"><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>16</p></div><div class="table-cell" style="justify-items:center;" style="align-items:center;"><p>2025-11-21</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>1.00 h</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>NGIpkgs</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>organization</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p></p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>weekly meeting</p></div></div><div class="table-body even"><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>17</p></div><div class="table-cell" style="justify-items:center;" style="align-items:center;"><p>2025-11-21</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>4.00 h</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>NGIpkgs / Bonfire</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>development</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p></p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>continue to package assets</p></div></div><div class="table-body odd"><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>18</p></div><div class="table-cell" style="justify-items:center;" style="align-items:center;"><p>2025-11-23</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>4.00 h</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>NGIpkgs / Bonfire</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>development</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p></p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>continue to package assets and try to get Bonfire to work</p></div></div><div class="table-body even"><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>19</p></div><div class="table-cell" style="justify-items:center;" style="align-items:center;"><p>2025-11-24</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>10.00 h</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>NGIpkgs / Bonfire</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>development</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p><a style="word-break:break-all;" href="https://github.com/surface-ui/surface/issues/762#issuecomment-3577030748">https://github.com/surface-ui/surface/issues/762#issuecomment-3577030748</a></p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>continue to solve problems with Bonfire packaging</p></div></div><div class="table-body odd"><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>20</p></div><div class="table-cell" style="justify-items:center;" style="align-items:center;"><p>2025-11-27</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>8.00 h</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>NGIpkgs / Bonfire</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>development</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p><a style="word-break:break-all;" href="https://github.com/ngi-nix/ngipkgs/pull/1812#issuecomment-3584319056">https://github.com/ngi-nix/ngipkgs/pull/1812#issuecomment-3584319056</a></p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>successfully auto-update and build Bonfire</p></div></div><div class="table-body even"><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>21</p></div><div class="table-cell" style="justify-items:center;" style="align-items:center;"><p>2025-11-28</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>1.00 h</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>NGIpkgs</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>organization</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p><a style="word-break:break-all;" href="https://www.notion.so/nixos-foundation/Nix-NGI-weekly-review-36-2b959d49e1be80fa823cd4d83581fda5#2b959d49e1be80fc85eed38c9a9dca86">https://www.notion.so/nixos-foundation/Nix-NGI-weekly-review-36-2b959d49e1be80fa823cd4d83581fda5#2b959d49e1be80fc85eed38c9a9dca86</a></p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>weekly meeting</p></div></div><div class="table-body odd"><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>22</p></div><div class="table-cell" style="justify-items:center;" style="align-items:center;"><p>2025-11-29</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>5.00 h</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>NGIpkgs / Bonfire</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>development</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p></p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>begin the service module</p></div></div><div class="table-body even"><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>23</p></div><div class="table-cell" style="justify-items:center;" style="align-items:center;"><p>2025-12-02</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>4.00 h</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>NGIpkgs / Bonfire</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>development</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p></p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>continue the service module</p></div></div><div class="table-body odd"><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>24</p></div><div class="table-cell" style="justify-items:center;" style="align-items:center;"><p>2025-12-03</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>8.00 h</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>NGIpkgs / Bonfire</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>development</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p></p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>first working service module</p></div></div><div class="table-body even"><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>25</p></div><div class="table-cell" style="justify-items:center;" style="align-items:center;"><p>2025-12-04</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>5.00 h</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>NGIpkgs / Bonfire</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>development</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p><a style="word-break:break-all;" href="https://github.com/ngi-nix/ngipkgs/pull/1871">https://github.com/ngi-nix/ngipkgs/pull/1871</a></p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>improve service module</p></div></div><div class="table-body odd"><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>26</p></div><div class="table-cell" style="justify-items:center;" style="align-items:center;"><p>2025-12-05</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>1.00 h</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>NGIpkgs</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>organization</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p><a style="word-break:break-all;" href="https://www.notion.so/nixos-foundation/Nix-NGI-weekly-review-36-2b959d49e1be80fa823cd4d83581fda5">https://www.notion.so/nixos-foundation/Nix-NGI-weekly-review-36-2b959d49e1be80fa823cd4d83581fda5</a></p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>weekly meeting</p></div></div><div class="table-body even"><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>27</p></div><div class="table-cell" style="justify-items:center;" style="align-items:center;"><p>2025-12-10</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>2.00 h</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>NGIpkgs</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>review</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p><a style="word-break:break-all;" href="https://www.notion.so/nixos-foundation/Nix-NGI-best-practices-for-NixOS-modules-implementation-2c559d49e1be80a8a499f21abb203d6f">https://www.notion.so/nixos-foundation/Nix-NGI-best-practices-for-NixOS-modules-implementation-2c559d49e1be80a8a499f21abb203d6f</a></p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>visio on “best practices”</p></div></div><div class="table-body odd"><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>28</p></div><div class="table-cell" style="justify-items:center;" style="align-items:center;"><p>2025-12-12</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>1.00 h</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>NGIpkgs</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>organization</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p></p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>weekly visio meeting</p></div></div><div class="table-body even"><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>29</p></div><div class="table-cell" style="justify-items:center;" style="align-items:center;"><p>2025-12-13</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>5.00 h</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>NGIpkgs / Bonfire</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>development</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p><a style="word-break:break-all;" href="https://github.com/bonfire-networks/bonfire-app/issues/1670#issuecomment-3650762914">https://github.com/bonfire-networks/bonfire-app/issues/1670#issuecomment-3650762914</a></p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>update to latest; overcoming new bugs introduced by upstream</p></div></div><div class="table-body odd"><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>30</p></div><div class="table-cell" style="justify-items:center;" style="align-items:center;"><p>2025-12-15</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>4.00 h</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>NGIpkgs / Bonfire</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>development</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p></p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>improving the update script and still overcoming upstream bugs</p></div></div></div></div></section><div style="display:flex;flex-direction:row;gap:5.0mm;justify-content:space-between;width:100%;"><p>4/5</p><p>julminfo - 2026-01-22 - Invoice #org3sale1 - Contract n°2025-24 — Details</p></div></div></div><div class="page A4 portrait" style="display:flex;size:A4 portrait;"><div style="align-content:stretch;display:flex;flex-direction:column;gap:5.0mm;justify-content:space-between;width:100%;" style="width:100%;"><section class="invoice-details"><div style="display:flex;flex-direction:column;gap:5.0mm;width:100%;"><div class="table" style="grid-template-columns:max-content max-content max-content 1fr 1fr 50.0mm 2fr;"><div class="table-head"><div class="table-cell"><div><p>#</p></div></div><div class="table-cell"><div><p>Date</p></div></div><div class="table-cell"><div><p>Duration</p></div></div><div class="table-cell"><div><p>Scope</p></div></div><div class="table-cell"><div><p>Action</p></div></div><div class="table-cell"><div><p>References</p></div></div><div class="table-cell"><div><p>Description</p></div></div></div><div class="table-body odd"><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>31</p></div><div class="table-cell" style="justify-items:center;" style="align-items:center;"><p>2025-12-16</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>3.00 h</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>NGIpkgs / Bonfire</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>development</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p></p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>overcoming bugs, again</p></div></div><div class="table-body even"><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>32</p></div><div class="table-cell" style="justify-items:center;" style="align-items:center;"><p>2025-12-16</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>2.00 h</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>NGIpkgs</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>review</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p></p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>visio to review PRs</p></div></div><div class="table-body odd"><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>33</p></div><div class="table-cell" style="justify-items:center;" style="align-items:center;"><p>2025-12-16</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>2.00 h</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>NGIpkgs</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>review</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p></p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>visio to review PRs</p></div></div><div class="table-body even"><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>34</p></div><div class="table-cell" style="justify-items:center;" style="align-items:center;"><p>2025-12-17</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>1.50 h</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>NGIpkgs</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>review</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p></p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>visio to review PRs</p></div></div><div class="table-body odd"><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>35</p></div><div class="table-cell" style="justify-items:center;" style="align-items:center;"><p>2025-12-18</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>1.00 h</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>NGIpkgs / dnsvizor</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>review</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p></p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>review linj’s PR</p></div></div><div class="table-body even"><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>36</p></div><div class="table-cell" style="justify-items:center;" style="align-items:center;"><p>2025-12-19</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>1.50 h</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>NGIpkgs</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>organization</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p></p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>weekly meeting</p></div></div><div class="table-body odd"><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>37</p></div><div class="table-cell" style="justify-items:center;" style="align-items:center;"><p>2025-12-21</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>4.00 h</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>NGIpkgs / Bonfire</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>development</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p></p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>fix bug using <code>__structuredAttrs</code></p></div></div></div></div></section><div style="display:flex;flex-direction:row;gap:5.0mm;justify-content:space-between;width:100%;"><p>julminfo - 2026-01-22 - Invoice #org3sale1 - Contract n°2025-24 — Details</p><p>5/5</p></div></div></div></body></html>
\ No newline at end of file
+<html><head><title>julminfo - 2026-01-22 - Invoice #org3sale1 - Contract n°2025-24</title><link rel="stylesheet" type="text/css" href="/home/julm/work/sourcephile/haskell/literate-business/data/styles/Document.css"><link rel="stylesheet" type="text/css" href="/home/julm/work/sourcephile/haskell/literate-business/data/styles/Invoice.css"><link rel="stylesheet" type="text/css" href="/home/julm/work/sourcephile/haskell/literate-business/data/styles/List.css"><link rel="stylesheet" type="text/css" href="/home/julm/work/sourcephile/haskell/literate-business/data/styles/Paper.css"><link rel="stylesheet" type="text/css" href="/home/julm/work/sourcephile/haskell/literate-business/data/styles/Table.css"></head><body><div class="page A4 portrait" style="display:flex;size:A4 portrait;"><div style="align-content:stretch;display:flex;flex-direction:column;gap:5.0mm;justify-content:space-between;width:100%;" style="width:100%;"><div style="display:flex;flex-direction:column;gap:5.0mm;width:100%;"><div class="title"><p>Invoice</p></div><section class="invoice-headers"><div class="dict"><div class="dict-entry"><div class="dict-key">InvoiceIdentifier:</div><div class="dict-value"><p>org3sale1</p></div></div><div class="dict-entry"><div class="dict-key">InvoiceType:</div><div class="dict-value"><p>sale</p></div></div><div class="dict-entry"><div class="dict-key">InvoiceOrders:</div><div class="dict-value"><div class="list" style="grid-template-columns:max-content 1fr;"><div class="list-body odd"><div class="list-key" style="justify-items:end;">-</div><div class="list-value" style="justify-items:start;"><p>Contract n°2025-24</p></div></div></div></div></div><div class="dict-entry"><div class="dict-key">InvoiceEmittedOn:</div><div class="dict-value"><p>2026-01-22</p></div></div><div class="dict-entry"><div class="dict-key">InvoicePaymentDueBefore:</div><div class="dict-value"><p>2026-02-22</p></div></div></div></section><section class="invoice-from-to"><div class="org"><div class="entity"><div class="dict"><div class="dict-entry"><div class="dict-key">Name:</div><div class="dict-value"><p>julminfo</p></div></div><div class="dict-entry"><div class="dict-key">Address:</div><div class="dict-value"><div class="address"><p>3, place du Monument</p><p>Mairie - Bureau 1</p><div class="address-bottom"><p>23340 Gentioux-Pigerolles France</p></div></div></div></div><div class="dict-entry"><div class="dict-key">SIREN:</div><div class="dict-value"><p>942798083</p></div></div><div class="dict-entry"><div class="dict-key">IBAN:</div><div class="dict-value"><p>FR18 2004 1010 0820 3735 3D02 912</p></div></div></div></div><div class="dict"><div class="dict-entry"><div class="dict-key">Seller:</div><div class="dict-value"><div class="org"><div class="entity"><div class="dict"><div class="dict-entry"><div class="dict-key">Name:</div><div class="dict-value"><p>julminfo</p></div></div><div class="dict-entry"><div class="dict-key">Address:</div><div class="dict-value"><div class="address"><p>3, place du Monument</p><p>Mairie - Bureau 1</p><div class="address-bottom"><p>23340 Gentioux-Pigerolles France</p></div></div></div></div><div class="dict-entry"><div class="dict-key">SIREN:</div><div class="dict-value"><p>942798083</p></div></div><div class="dict-entry"><div class="dict-key">IBAN:</div><div class="dict-value"><p>FR18 2004 1010 0820 3735 3D02 912</p></div></div></div></div><div class="dict"><div class="dict-entry"><div class="dict-key">Admin:</div><div class="dict-value"><div class="org"><div class="entity"><div class="dict"><div class="dict-entry"><div class="dict-key">Name:</div><div class="dict-value"><p>Julien Moutinho</p></div></div><div class="dict-entry"><div class="dict-key">Email:</div><div class="dict-value"><p><a href="mailto:julm@sourcephile.fr">julm​@sourcephile.fr</a></p></div></div></div></div><div class="dict"></div></div></div></div></div></div></div></div><div class="dict-entry"><div class="dict-key">Buyer:</div><div class="dict-value"><div class="org"><div class="entity"><div class="dict"><div class="dict-entry"><div class="dict-key">Name:</div><div class="dict-value"><p>Nix@NGI Team</p></div></div><div class="dict-entry"><div class="dict-key">Email:</div><div class="dict-value"><p><a href="mailto:ngi@nixos.org">ngi​@nixos.org</a></p></div></div></div></div><div class="dict"><div class="dict-entry"><div class="dict-key">Admin:</div><div class="dict-value"><div class="org"><div class="entity"><div class="dict"><div class="dict-entry"><div class="dict-key">Name:</div><div class="dict-value"><p>Daniel Ramirez</p></div></div><div class="dict-entry"><div class="dict-key">Email:</div><div class="dict-value"><p><a href="mailto:danielramirez5@protonmail.com">danielramirez5​@protonmail.com</a></p></div></div></div></div><div class="dict"></div></div></div></div></div></div></div></div></div></div></section><section><div class="title"><p>Grand totals</p></div><div class="table" style="grid-template-columns:1fr 1fr 1fr;"><div class="table-head"><div class="table-cell"><div><p>Time frame</p></div></div><div class="table-cell"><div><p>Workload</p></div></div><div class="table-cell"><div><p>To pay (excl. taxes)</p></div></div></div><div class="table-body odd"><div class="table-cell" style="justify-items:center;" style="align-items:center;"><p>2025-11-06</p><p>2025-12-21</p></div><div class="table-cell" style="justify-items:center;" style="align-items:center;"><p>148.60 h</p></div><div class="table-cell" style="justify-items:center;" style="align-items:center;"><p>4643.75 €</p></div></div></div></section><section><div class="title"><p>Mandatory legal notices</p></div><div class="list" style="grid-template-columns:max-content 1fr;"><div class="list-body odd"><div class="list-key" style="justify-items:end;">—</div><div class="list-value" style="justify-items:start;"><p>VAT not applicable, art. 293 B of the French General Tax Code.</p></div></div><div class="list-body even"><div class="list-key" style="justify-items:end;">—</div><div class="list-value" style="justify-items:start;"><p>Fixed compensation for recovery costs in case of late payment: 40.00 €</p></div></div><div class="list-body odd"><div class="list-key" style="justify-items:end;">—</div><div class="list-value" style="justify-items:start;"><p>Late payment penalty rate (applicable from 2026-02-23): 12.15 % × unpaid amount × number of days late / 365.25</p></div></div></div></section></div><div style="display:flex;flex-direction:row;gap:5.0mm;justify-content:space-between;width:100%;"><p>julminfo - 2026-01-22 - Invoice #org3sale1 - Contract n°2025-24</p><p>1/5</p></div></div></div><div class="page A4 portrait" style="display:flex;size:A4 portrait;"><div style="align-content:stretch;display:flex;flex-direction:column;gap:5.0mm;justify-content:space-between;width:100%;" style="width:100%;"><section class="invoice-summary"><div style="display:flex;flex-direction:column;gap:5.0mm;width:100%;"><div class="title"><p>Summary</p></div><div class="table" style="grid-template-columns:max-content max-content 1fr max-content max-content max-content max-content max-content;"><div class="table-head"><div class="table-cell"><div><p>#</p></div></div><div class="table-cell"><div><p>Type</p></div></div><div class="table-cell"><div><p>Scope</p></div></div><div class="table-cell"><div><p>Action</p></div></div><div class="table-cell"><div><p>Time frame</p></div></div><div class="table-cell"><div><p>Rate</p><p>(excl. taxes.)</p></div></div><div class="table-cell"><div><p>Quantity</p></div></div><div class="table-cell"><div><p>Total</p><p>(excl. taxes.)</p></div></div></div><div class="table-body odd"><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>1</p></div><div class="table-cell" style="justify-items:center;" style="align-items:center;"><p>service</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>Bonfire &amp; NGIpkgs</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>development</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>2025-11-06</p><p>2025-12-21</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>31.25 € / h</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>133.00 h</p><p>(89.5%)</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>4156.25 €</p></div></div><div class="table-body even"><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>2</p></div><div class="table-cell" style="justify-items:center;" style="align-items:center;"><p>service</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>DNSvizor &amp; NGIpkgs</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>review</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>2025-12-18</p><p>2025-12-18</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>31.25 € / h</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>1.00 h</p><p>(0.67%)</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>31.25 €</p></div></div><div class="table-body odd"><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>3</p></div><div class="table-cell" style="justify-items:center;" style="align-items:center;"><p>service</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>NGIpkgs</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>organization</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>2025-11-06</p><p>2025-12-19</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>31.25 € / h</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>7.00 h</p><p>(4.71%)</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>218.75 €</p></div></div><div class="table-body even"><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>4</p></div><div class="table-cell" style="justify-items:center;" style="align-items:center;"><p>service</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>NGIpkgs</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>review</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>2025-12-10</p><p>2025-12-17</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>31.25 € / h</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>7.50 h</p><p>(5.05%)</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>234.38 €</p></div></div><div class="table-body odd"><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>5</p></div><div class="table-cell" style="justify-items:center;" style="align-items:center;"><p>service</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>Nixpkgs &amp; OpenCV</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>development</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>2025-11-08</p><p>2025-11-08</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>31.25 € / h</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>0.10 h</p><p>(0.07%)</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>3.12 €</p></div></div></div></div></section><div style="display:flex;flex-direction:row;gap:5.0mm;justify-content:space-between;width:100%;"><p>2/5</p><p>julminfo - 2026-01-22 - Invoice #org3sale1 - Contract n°2025-24 — Summary</p></div></div></div><div class="page A4 portrait" style="display:flex;size:A4 portrait;"><div style="align-content:stretch;display:flex;flex-direction:column;gap:5.0mm;justify-content:space-between;width:100%;" style="width:100%;"><section class="invoice-details"><div style="display:flex;flex-direction:column;gap:5.0mm;width:100%;"><div class="title"><p>Details</p></div><div class="table" style="grid-template-columns:max-content max-content max-content 1fr 1fr 50.0mm 2fr;"><div class="table-head"><div class="table-cell"><div><p>#</p></div></div><div class="table-cell"><div><p>Date</p></div></div><div class="table-cell"><div><p>Duration</p></div></div><div class="table-cell"><div><p>Scope</p></div></div><div class="table-cell"><div><p>Action</p></div></div><div class="table-cell"><div><p>References</p></div></div><div class="table-cell"><div><p>Description</p></div></div></div><div class="table-body odd"><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>1</p></div><div class="table-cell" style="justify-items:center;" style="align-items:center;"><p>2025-11-06</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>0.50 h</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>NGIpkgs</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>organization</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p><a style="word-break:break-all;" href="https://meet.google.com/hii-druc-tjp">https://meet.google.com/hii-druc-tjp</a></p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>first meeting</p></div></div><div class="table-body even"><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>2</p></div><div class="table-cell" style="justify-items:center;" style="align-items:center;"><p>2025-11-06</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>4.00 h</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>Bonfire &amp; NGIpkgs</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>development</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p><a style="word-break:break-all;" href="https://github.com/ju1m/bonfire-app/commits/nix">https://github.com/ju1m/bonfire-app/commits/nix</a></p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>focus on the hardest part first</p></div></div><div class="table-body odd"><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>3</p></div><div class="table-cell" style="justify-items:center;" style="align-items:center;"><p>2025-11-07</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>8.00 h</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>Bonfire &amp; NGIpkgs</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>development</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p><a style="word-break:break-all;" href="https://github.com/ju1m/bonfire-app/commits/nix">https://github.com/ju1m/bonfire-app/commits/nix</a></p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>continuing to package Bonfire deps</p></div></div><div class="table-body even"><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>4</p></div><div class="table-cell" style="justify-items:center;" style="align-items:center;"><p>2025-11-08</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>0.10 h</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>Nixpkgs &amp; OpenCV</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>development</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p><a style="word-break:break-all;" href="https://github.com/NixOS/nixpkgs/pull/459592">https://github.com/NixOS/nixpkgs/pull/459592</a></p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>fix opencv in nixpkgs</p></div></div><div class="table-body odd"><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>5</p></div><div class="table-cell" style="justify-items:center;" style="align-items:center;"><p>2025-11-09</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>8.00 h</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>Bonfire &amp; NGIpkgs</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>development</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p><a style="word-break:break-all;" href="https://github.com/ju1m/bonfire-app/commits/nix">https://github.com/ju1m/bonfire-app/commits/nix</a></p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>continue to fix deps</p></div></div><div class="table-body even"><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>6</p></div><div class="table-cell" style="justify-items:center;" style="align-items:center;"><p>2025-11-09</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>4.00 h</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>Bonfire &amp; NGIpkgs</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>development</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p><a style="word-break:break-all;" href="https://github.com/ju1m/bonfire-app/commits/nix">https://github.com/ju1m/bonfire-app/commits/nix</a></p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>continue to fix deps</p></div></div><div class="table-body odd"><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>7</p></div><div class="table-cell" style="justify-items:center;" style="align-items:center;"><p>2025-11-11</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>6.00 h</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>Bonfire &amp; NGIpkgs</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>development</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p><a style="word-break:break-all;" href="https://github.com/ju1m/bonfire-app/commits/nix">https://github.com/ju1m/bonfire-app/commits/nix</a></p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>continue to fix deps</p></div></div><div class="table-body even"><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>8</p></div><div class="table-cell" style="justify-items:center;" style="align-items:center;"><p>2025-11-12</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>4.00 h</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>Bonfire &amp; NGIpkgs</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>development</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p><a style="word-break:break-all;" href="https://github.com/ju1m/bonfire-app/commits/nix">https://github.com/ju1m/bonfire-app/commits/nix</a></p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>continue to fix deps</p></div></div><div class="table-body odd"><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>9</p></div><div class="table-cell" style="justify-items:center;" style="align-items:center;"><p>2025-11-14</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>5.00 h</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>Bonfire &amp; NGIpkgs</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>development</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p><a style="word-break:break-all;" href="https://github.com/ngi-nix/ngipkgs/pull/1812">https://github.com/ngi-nix/ngipkgs/pull/1812</a></p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>continue to fix deps and move into ngipkgs</p></div></div><div class="table-body even"><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>10</p></div><div class="table-cell" style="justify-items:center;" style="align-items:center;"><p>2025-11-14</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>1.00 h</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>NGIpkgs</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>organization</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p><a style="word-break:break-all;" href="https://www.notion.so/nixos-foundation/Nix-NGI-weekly-review-34-2ab59d49e1be80939503c655b009e934">https://www.notion.so/nixos-foundation/Nix-NGI-weekly-review-34-2ab59d49e1be80939503c655b009e934</a></p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>weekly meeting</p></div></div><div class="table-body odd"><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>11</p></div><div class="table-cell" style="justify-items:center;" style="align-items:center;"><p>2025-11-15</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>6.00 h</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>Bonfire &amp; NGIpkgs</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>development</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p></p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>finish to build Bonfire and start to fix runtime bugs</p></div></div><div class="table-body even"><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>12</p></div><div class="table-cell" style="justify-items:center;" style="align-items:center;"><p>2025-11-16</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>4.00 h</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>Bonfire &amp; NGIpkgs</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>development</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p><a style="word-break:break-all;" href="https://github.com/ngi-nix/ngipkgs/pull/1812#issuecomment-3537609170">https://github.com/ngi-nix/ngipkgs/pull/1812#issuecomment-3537609170</a></p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>workaround and contribute upstream</p></div></div><div class="table-body odd"><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>13</p></div><div class="table-cell" style="justify-items:center;" style="align-items:center;"><p>2025-11-17</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>8.00 h</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>Bonfire &amp; NGIpkgs</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>development</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p></p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>add updateScript and fix opencv</p></div></div><div class="table-body even"><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>14</p></div><div class="table-cell" style="justify-items:center;" style="align-items:center;"><p>2025-11-19</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>8.00 h</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>Bonfire &amp; NGIpkgs</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>development</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p><a style="word-break:break-all;" href="https://github.com/ngi-nix/ngipkgs/pull/1812#issuecomment-3554376221">https://github.com/ngi-nix/ngipkgs/pull/1812#issuecomment-3554376221</a></p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>continue to fix startup crashes</p></div></div><div class="table-body odd"><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>15</p></div><div class="table-cell" style="justify-items:center;" style="align-items:center;"><p>2025-11-21</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>4.00 h</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>Bonfire &amp; NGIpkgs</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>development</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p></p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>begin to package yarn assets. Upstream likes convoluted code and fake libraries.</p></div></div></div></div></section><div style="display:flex;flex-direction:row;gap:5.0mm;justify-content:space-between;width:100%;"><p>julminfo - 2026-01-22 - Invoice #org3sale1 - Contract n°2025-24 — Details</p><p>3/5</p></div></div></div><div class="page A4 portrait" style="display:flex;size:A4 portrait;"><div style="align-content:stretch;display:flex;flex-direction:column;gap:5.0mm;justify-content:space-between;width:100%;" style="width:100%;"><section class="invoice-details"><div style="display:flex;flex-direction:column;gap:5.0mm;width:100%;"><div class="table" style="grid-template-columns:max-content max-content max-content 1fr 1fr 50.0mm 2fr;"><div class="table-head"><div class="table-cell"><div><p>#</p></div></div><div class="table-cell"><div><p>Date</p></div></div><div class="table-cell"><div><p>Duration</p></div></div><div class="table-cell"><div><p>Scope</p></div></div><div class="table-cell"><div><p>Action</p></div></div><div class="table-cell"><div><p>References</p></div></div><div class="table-cell"><div><p>Description</p></div></div></div><div class="table-body odd"><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>16</p></div><div class="table-cell" style="justify-items:center;" style="align-items:center;"><p>2025-11-21</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>1.00 h</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>NGIpkgs</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>organization</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p></p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>weekly meeting</p></div></div><div class="table-body even"><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>17</p></div><div class="table-cell" style="justify-items:center;" style="align-items:center;"><p>2025-11-21</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>4.00 h</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>Bonfire &amp; NGIpkgs</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>development</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p></p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>continue to package assets</p></div></div><div class="table-body odd"><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>18</p></div><div class="table-cell" style="justify-items:center;" style="align-items:center;"><p>2025-11-23</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>4.00 h</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>Bonfire &amp; NGIpkgs</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>development</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p></p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>continue to package assets and try to get Bonfire to work</p></div></div><div class="table-body even"><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>19</p></div><div class="table-cell" style="justify-items:center;" style="align-items:center;"><p>2025-11-24</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>10.00 h</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>Bonfire &amp; NGIpkgs</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>development</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p><a style="word-break:break-all;" href="https://github.com/surface-ui/surface/issues/762#issuecomment-3577030748">https://github.com/surface-ui/surface/issues/762#issuecomment-3577030748</a></p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>continue to solve problems with Bonfire packaging</p></div></div><div class="table-body odd"><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>20</p></div><div class="table-cell" style="justify-items:center;" style="align-items:center;"><p>2025-11-27</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>8.00 h</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>Bonfire &amp; NGIpkgs</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>development</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p><a style="word-break:break-all;" href="https://github.com/ngi-nix/ngipkgs/pull/1812#issuecomment-3584319056">https://github.com/ngi-nix/ngipkgs/pull/1812#issuecomment-3584319056</a></p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>successfully auto-update and build Bonfire</p></div></div><div class="table-body even"><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>21</p></div><div class="table-cell" style="justify-items:center;" style="align-items:center;"><p>2025-11-28</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>1.00 h</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>NGIpkgs</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>organization</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p><a style="word-break:break-all;" href="https://www.notion.so/nixos-foundation/Nix-NGI-weekly-review-36-2b959d49e1be80fa823cd4d83581fda5#2b959d49e1be80fc85eed38c9a9dca86">https://www.notion.so/nixos-foundation/Nix-NGI-weekly-review-36-2b959d49e1be80fa823cd4d83581fda5#2b959d49e1be80fc85eed38c9a9dca86</a></p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>weekly meeting</p></div></div><div class="table-body odd"><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>22</p></div><div class="table-cell" style="justify-items:center;" style="align-items:center;"><p>2025-11-29</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>5.00 h</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>Bonfire &amp; NGIpkgs</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>development</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p></p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>begin the service module</p></div></div><div class="table-body even"><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>23</p></div><div class="table-cell" style="justify-items:center;" style="align-items:center;"><p>2025-12-02</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>4.00 h</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>Bonfire &amp; NGIpkgs</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>development</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p></p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>continue the service module</p></div></div><div class="table-body odd"><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>24</p></div><div class="table-cell" style="justify-items:center;" style="align-items:center;"><p>2025-12-03</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>8.00 h</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>Bonfire &amp; NGIpkgs</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>development</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p></p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>first working service module</p></div></div><div class="table-body even"><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>25</p></div><div class="table-cell" style="justify-items:center;" style="align-items:center;"><p>2025-12-04</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>5.00 h</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>Bonfire &amp; NGIpkgs</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>development</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p><a style="word-break:break-all;" href="https://github.com/ngi-nix/ngipkgs/pull/1871">https://github.com/ngi-nix/ngipkgs/pull/1871</a></p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>improve service module</p></div></div><div class="table-body odd"><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>26</p></div><div class="table-cell" style="justify-items:center;" style="align-items:center;"><p>2025-12-05</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>1.00 h</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>NGIpkgs</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>organization</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p><a style="word-break:break-all;" href="https://www.notion.so/nixos-foundation/Nix-NGI-weekly-review-36-2b959d49e1be80fa823cd4d83581fda5">https://www.notion.so/nixos-foundation/Nix-NGI-weekly-review-36-2b959d49e1be80fa823cd4d83581fda5</a></p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>weekly meeting</p></div></div><div class="table-body even"><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>27</p></div><div class="table-cell" style="justify-items:center;" style="align-items:center;"><p>2025-12-10</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>2.00 h</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>NGIpkgs</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>review</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p><a style="word-break:break-all;" href="https://www.notion.so/nixos-foundation/Nix-NGI-best-practices-for-NixOS-modules-implementation-2c559d49e1be80a8a499f21abb203d6f">https://www.notion.so/nixos-foundation/Nix-NGI-best-practices-for-NixOS-modules-implementation-2c559d49e1be80a8a499f21abb203d6f</a></p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>visio on “best practices”</p></div></div><div class="table-body odd"><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>28</p></div><div class="table-cell" style="justify-items:center;" style="align-items:center;"><p>2025-12-12</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>1.00 h</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>NGIpkgs</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>organization</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p></p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>weekly visio meeting</p></div></div><div class="table-body even"><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>29</p></div><div class="table-cell" style="justify-items:center;" style="align-items:center;"><p>2025-12-13</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>5.00 h</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>Bonfire &amp; NGIpkgs</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>development</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p><a style="word-break:break-all;" href="https://github.com/bonfire-networks/bonfire-app/issues/1670#issuecomment-3650762914">https://github.com/bonfire-networks/bonfire-app/issues/1670#issuecomment-3650762914</a></p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>update to latest; overcoming new bugs introduced by upstream</p></div></div><div class="table-body odd"><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>30</p></div><div class="table-cell" style="justify-items:center;" style="align-items:center;"><p>2025-12-15</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>4.00 h</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>Bonfire &amp; NGIpkgs</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>development</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p></p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>improving the update script and still overcoming upstream bugs</p></div></div></div></div></section><div style="display:flex;flex-direction:row;gap:5.0mm;justify-content:space-between;width:100%;"><p>4/5</p><p>julminfo - 2026-01-22 - Invoice #org3sale1 - Contract n°2025-24 — Details</p></div></div></div><div class="page A4 portrait" style="display:flex;size:A4 portrait;"><div style="align-content:stretch;display:flex;flex-direction:column;gap:5.0mm;justify-content:space-between;width:100%;" style="width:100%;"><section class="invoice-details"><div style="display:flex;flex-direction:column;gap:5.0mm;width:100%;"><div class="table" style="grid-template-columns:max-content max-content max-content 1fr 1fr 50.0mm 2fr;"><div class="table-head"><div class="table-cell"><div><p>#</p></div></div><div class="table-cell"><div><p>Date</p></div></div><div class="table-cell"><div><p>Duration</p></div></div><div class="table-cell"><div><p>Scope</p></div></div><div class="table-cell"><div><p>Action</p></div></div><div class="table-cell"><div><p>References</p></div></div><div class="table-cell"><div><p>Description</p></div></div></div><div class="table-body odd"><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>31</p></div><div class="table-cell" style="justify-items:center;" style="align-items:center;"><p>2025-12-16</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>3.00 h</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>Bonfire &amp; NGIpkgs</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>development</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p></p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>overcoming bugs, again</p></div></div><div class="table-body even"><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>32</p></div><div class="table-cell" style="justify-items:center;" style="align-items:center;"><p>2025-12-16</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>2.00 h</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>NGIpkgs</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>review</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p></p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>visio to review PRs</p></div></div><div class="table-body odd"><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>33</p></div><div class="table-cell" style="justify-items:center;" style="align-items:center;"><p>2025-12-16</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>2.00 h</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>NGIpkgs</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>review</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p></p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>visio to review PRs</p></div></div><div class="table-body even"><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>34</p></div><div class="table-cell" style="justify-items:center;" style="align-items:center;"><p>2025-12-17</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>1.50 h</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>NGIpkgs</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>review</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p></p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>visio to review PRs</p></div></div><div class="table-body odd"><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>35</p></div><div class="table-cell" style="justify-items:center;" style="align-items:center;"><p>2025-12-18</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>1.00 h</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>DNSvizor &amp; NGIpkgs</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>review</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p></p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>review linj’s PR</p></div></div><div class="table-body even"><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>36</p></div><div class="table-cell" style="justify-items:center;" style="align-items:center;"><p>2025-12-19</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>1.50 h</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>NGIpkgs</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>organization</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p></p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>weekly meeting</p></div></div><div class="table-body odd"><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>37</p></div><div class="table-cell" style="justify-items:center;" style="align-items:center;"><p>2025-12-21</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>4.00 h</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>Bonfire &amp; NGIpkgs</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>development</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p></p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>fix bug using <code>__structuredAttrs</code></p></div></div></div></div></section><div style="display:flex;flex-direction:row;gap:5.0mm;justify-content:space-between;width:100%;"><p>julminfo - 2026-01-22 - Invoice #org3sale1 - Contract n°2025-24 — Details</p><p>5/5</p></div></div></div></body></html>
\ No newline at end of file
index 2ee0dfb00ffed1d2d338a39d60da8156555b6159..94e8bb480264110fcf04da355bb2eef9f672049b 100644 (file)
@@ -1,2 +1,2 @@
 <!DOCTYPE HTML>
 <!DOCTYPE HTML>
-<html><head><title>julminfo - 2026-01-27 - Invoice #org3sale2 - contract n°2026-03</title><link rel="stylesheet" type="text/css" href="/home/julm/work/sourcephile/haskell/literate-business/data/styles/Document.css"><link rel="stylesheet" type="text/css" href="/home/julm/work/sourcephile/haskell/literate-business/data/styles/Invoice.css"><link rel="stylesheet" type="text/css" href="/home/julm/work/sourcephile/haskell/literate-business/data/styles/List.css"><link rel="stylesheet" type="text/css" href="/home/julm/work/sourcephile/haskell/literate-business/data/styles/Paper.css"><link rel="stylesheet" type="text/css" href="/home/julm/work/sourcephile/haskell/literate-business/data/styles/Table.css"></head><body><div class="page A4 portrait" style="display:flex;size:A4 portrait;"><div style="align-content:stretch;display:flex;flex-direction:column;gap:5.0mm;justify-content:space-between;width:100%;" style="width:100%;"><div style="display:flex;flex-direction:column;gap:5.0mm;width:100%;"><div class="title"><p>Invoice</p></div><section class="invoice-headers"><div class="dict"><div class="dict-entry"><div class="dict-key">InvoiceIdentifier:</div><div class="dict-value"><p>org3sale2</p></div></div><div class="dict-entry"><div class="dict-key">InvoiceType:</div><div class="dict-value"><p>sale</p></div></div><div class="dict-entry"><div class="dict-key">InvoiceOrders:</div><div class="dict-value"><div class="list" style="grid-template-columns:max-content 1fr;"><div class="list-body odd"><div class="list-key" style="justify-items:end;">-</div><div class="list-value" style="justify-items:start;"><p>contract n°2026-03</p></div></div></div></div></div><div class="dict-entry"><div class="dict-key">InvoiceEmittedOn:</div><div class="dict-value"><p>2026-01-27</p></div></div><div class="dict-entry"><div class="dict-key">InvoicePaymentDueBefore:</div><div class="dict-value"><p>2026-02-27</p></div></div></div></section><section class="invoice-from-to"><div class="org"><div class="entity"><div class="dict"><div class="dict-entry"><div class="dict-key">Name:</div><div class="dict-value"><p>julminfo</p></div></div><div class="dict-entry"><div class="dict-key">Address:</div><div class="dict-value"><div class="address"><p>3, place du Monument</p><p>Mairie - Bureau 1</p><div class="address-bottom"><p>23340 Gentioux-Pigerolles France</p></div></div></div></div><div class="dict-entry"><div class="dict-key">SIREN:</div><div class="dict-value"><p>942798083</p></div></div><div class="dict-entry"><div class="dict-key">IBAN:</div><div class="dict-value"><p>FR18 2004 1010 0820 3735 3D02 912</p></div></div></div></div><div class="dict"><div class="dict-entry"><div class="dict-key">Seller:</div><div class="dict-value"><div class="org"><div class="entity"><div class="dict"><div class="dict-entry"><div class="dict-key">Name:</div><div class="dict-value"><p>julminfo</p></div></div><div class="dict-entry"><div class="dict-key">Address:</div><div class="dict-value"><div class="address"><p>3, place du Monument</p><p>Mairie - Bureau 1</p><div class="address-bottom"><p>23340 Gentioux-Pigerolles France</p></div></div></div></div><div class="dict-entry"><div class="dict-key">SIREN:</div><div class="dict-value"><p>942798083</p></div></div><div class="dict-entry"><div class="dict-key">IBAN:</div><div class="dict-value"><p>FR18 2004 1010 0820 3735 3D02 912</p></div></div></div></div><div class="dict"><div class="dict-entry"><div class="dict-key">Admin:</div><div class="dict-value"><div class="org"><div class="entity"><div class="dict"><div class="dict-entry"><div class="dict-key">Name:</div><div class="dict-value"><p>Julien Moutinho</p></div></div><div class="dict-entry"><div class="dict-key">Email:</div><div class="dict-value"><p><a href="mailto:julm@sourcephile.fr">julm​@sourcephile.fr</a></p></div></div></div></div><div class="dict"></div></div></div></div></div></div></div></div><div class="dict-entry"><div class="dict-key">Buyer:</div><div class="dict-value"><div class="org"><div class="entity"><div class="dict"><div class="dict-entry"><div class="dict-key">Name:</div><div class="dict-value"><p>Nix@NGI Team</p></div></div><div class="dict-entry"><div class="dict-key">Email:</div><div class="dict-value"><p><a href="mailto:ngi@nixos.org">ngi​@nixos.org</a></p></div></div></div></div><div class="dict"><div class="dict-entry"><div class="dict-key">Admin:</div><div class="dict-value"><div class="org"><div class="entity"><div class="dict"><div class="dict-entry"><div class="dict-key">Name:</div><div class="dict-value"><p>Daniel Ramirez</p></div></div><div class="dict-entry"><div class="dict-key">Email:</div><div class="dict-value"><p><a href="mailto:danielramirez5@protonmail.com">danielramirez5​@protonmail.com</a></p></div></div></div></div><div class="dict"></div></div></div></div></div></div></div></div></div></div></section><section><div class="title"><p>Grand totals</p></div><div class="table" style="grid-template-columns:1fr 1fr 1fr;"><div class="table-head"><div class="table-cell"><div><p>Time frame</p></div></div><div class="table-cell"><div><p>Workload</p></div></div><div class="table-cell"><div><p>To pay (excl. taxes)</p></div></div></div><div class="table-body odd"><div class="table-cell" style="justify-items:center;" style="align-items:center;"><p>2025-12-23</p><p>2026-01-27</p></div><div class="table-cell" style="justify-items:center;" style="align-items:center;"><p>64.00 h</p></div><div class="table-cell" style="justify-items:center;" style="align-items:center;"><p>2000.00 €</p></div></div></div></section><section><div class="title"><p>Mandatory legal notices</p></div><div class="list" style="grid-template-columns:max-content 1fr;"><div class="list-body odd"><div class="list-key" style="justify-items:end;">—</div><div class="list-value" style="justify-items:start;"><p>VAT not applicable, art. 293 B of the French General Tax Code.</p></div></div><div class="list-body even"><div class="list-key" style="justify-items:end;">—</div><div class="list-value" style="justify-items:start;"><p>Fixed compensation for recovery costs in case of late payment: 40.00 €</p></div></div><div class="list-body odd"><div class="list-key" style="justify-items:end;">—</div><div class="list-value" style="justify-items:start;"><p>Late payment penalty rate (applicable from 2026-02-28): 12.15 % × unpaid amount × number of days late / 365.25</p></div></div></div></section></div><div style="display:flex;flex-direction:row;gap:5.0mm;justify-content:space-between;width:100%;"><p>julminfo - 2026-01-27 - Invoice #org3sale2 - contract n°2026-03</p><p>1/4</p></div></div></div><div class="page A4 portrait" style="display:flex;size:A4 portrait;"><div style="align-content:stretch;display:flex;flex-direction:column;gap:5.0mm;justify-content:space-between;width:100%;" style="width:100%;"><section class="invoice-summary"><div style="display:flex;flex-direction:column;gap:5.0mm;width:100%;"><div class="title"><p>Summary</p></div><div class="table" style="grid-template-columns:max-content max-content 1fr max-content max-content max-content max-content max-content;"><div class="table-head"><div class="table-cell"><div><p>#</p></div></div><div class="table-cell"><div><p>Type</p></div></div><div class="table-cell"><div><p>Scope</p></div></div><div class="table-cell"><div><p>Action</p></div></div><div class="table-cell"><div><p>Time frame</p></div></div><div class="table-cell"><div><p>Rate</p><p>(excl. taxes.)</p></div></div><div class="table-cell"><div><p>Quantity</p></div></div><div class="table-cell"><div><p>Total</p><p>(excl. taxes.)</p></div></div></div><div class="table-body odd"><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>1</p></div><div class="table-cell" style="justify-items:center;" style="align-items:center;"><p>service</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>NGIpkgs / BEAM</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>development</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>2025-12-30</p><p>2025-12-30</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>31.25 € / h</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>4.00 h</p><p>(6.25%)</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>125.00 €</p></div></div><div class="table-body even"><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>2</p></div><div class="table-cell" style="justify-items:center;" style="align-items:center;"><p>service</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>NGIpkgs / Bonfire</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>development</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>2025-12-23</p><p>2026-01-09</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>31.25 € / h</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>36.00 h</p><p>(56.25%)</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>1125.00 €</p></div></div><div class="table-body odd"><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>3</p></div><div class="table-cell" style="justify-items:center;" style="align-items:center;"><p>service</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>NGIpkgs / Seppo</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>development</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>2026-01-25</p><p>2026-01-27</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>31.25 € / h</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>14.00 h</p><p>(21.88%)</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>437.50 €</p></div></div><div class="table-body even"><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>4</p></div><div class="table-cell" style="justify-items:center;" style="align-items:center;"><p>service</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>NGIpkgs / dnsvizor</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>development</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>2026-01-11</p><p>2026-01-12</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>31.25 € / h</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>10.00 h</p><p>(15.62%)</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>312.50 €</p></div></div></div></div></section><div style="display:flex;flex-direction:row;gap:5.0mm;justify-content:space-between;width:100%;"><p>2/4</p><p>julminfo - 2026-01-27 - Invoice #org3sale2 - contract n°2026-03 — Summary</p></div></div></div><div class="page A4 portrait" style="display:flex;size:A4 portrait;"><div style="align-content:stretch;display:flex;flex-direction:column;gap:5.0mm;justify-content:space-between;width:100%;" style="width:100%;"><section class="invoice-details"><div style="display:flex;flex-direction:column;gap:5.0mm;width:100%;"><div class="title"><p>Details</p></div><div class="table" style="grid-template-columns:max-content max-content max-content 1fr 1fr 50.0mm 2fr;"><div class="table-head"><div class="table-cell"><div><p>#</p></div></div><div class="table-cell"><div><p>Date</p></div></div><div class="table-cell"><div><p>Duration</p></div></div><div class="table-cell"><div><p>Scope</p></div></div><div class="table-cell"><div><p>Action</p></div></div><div class="table-cell"><div><p>References</p></div></div><div class="table-cell"><div><p>Description</p></div></div></div><div class="table-body odd"><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>1</p></div><div class="table-cell" style="justify-items:center;" style="align-items:center;"><p>2025-12-23</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>2.00 h</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>NGIpkgs / Bonfire</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>development</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p></p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>address reviewers’ concerns</p></div></div><div class="table-body even"><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>2</p></div><div class="table-cell" style="justify-items:center;" style="align-items:center;"><p>2025-12-24</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>4.00 h</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>NGIpkgs / Bonfire</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>development</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p></p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>update Bonfire and report issues upstream</p></div></div><div class="table-body odd"><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>3</p></div><div class="table-cell" style="justify-items:center;" style="align-items:center;"><p>2025-12-24</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>2.00 h</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>NGIpkgs / Bonfire</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>development</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p></p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>update Bonfire to fix bugs</p></div></div><div class="table-body even"><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>4</p></div><div class="table-cell" style="justify-items:center;" style="align-items:center;"><p>2025-12-25</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>6.00 h</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>NGIpkgs / Bonfire</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>development</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p><a style="word-break:break-all;" href="https://github.com/bonfire-networks/bonfire-app/issues/1698#issuecomment-3692147409">https://github.com/bonfire-networks/bonfire-app/issues/1698#issuecomment-3692147409</a></p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>update and fix bugs</p></div></div><div class="table-body odd"><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>5</p></div><div class="table-cell" style="justify-items:center;" style="align-items:center;"><p>2025-12-26</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>1.00 h</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>NGIpkgs / Bonfire</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>development</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p></p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>update to fix bugs</p></div></div><div class="table-body even"><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>6</p></div><div class="table-cell" style="justify-items:center;" style="align-items:center;"><p>2025-12-29</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>2.00 h</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>NGIpkgs / Bonfire</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>development</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p></p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>add more tests</p></div></div><div class="table-body odd"><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>7</p></div><div class="table-cell" style="justify-items:center;" style="align-items:center;"><p>2025-12-30</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>4.00 h</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>NGIpkgs / BEAM</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>development</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p></p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>improve <code>buildMix</code> &amp; <code>mixRelease</code> for packaging Elixir software</p></div></div><div class="table-body even"><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>8</p></div><div class="table-cell" style="justify-items:center;" style="align-items:center;"><p>2026-01-01</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>4.00 h</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>NGIpkgs / Bonfire</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>development</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p></p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>support other flavours</p></div></div><div class="table-body odd"><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>9</p></div><div class="table-cell" style="justify-items:center;" style="align-items:center;"><p>2026-01-03</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>4.00 h</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>NGIpkgs / Bonfire</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>development</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p></p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>support other flavours, and make update more resilient</p></div></div><div class="table-body even"><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>10</p></div><div class="table-cell" style="justify-items:center;" style="align-items:center;"><p>2026-01-04</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>2.00 h</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>NGIpkgs / Bonfire</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>development</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p></p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>provide upstream with reproducers</p></div></div><div class="table-body odd"><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>11</p></div><div class="table-cell" style="justify-items:center;" style="align-items:center;"><p>2026-01-05</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>2.00 h</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>NGIpkgs / Bonfire</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>development</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p></p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>update to latest version</p></div></div><div class="table-body even"><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>12</p></div><div class="table-cell" style="justify-items:center;" style="align-items:center;"><p>2026-01-07</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>5.00 h</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>NGIpkgs / Bonfire</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>development</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p></p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>fix updating</p></div></div><div class="table-body odd"><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>13</p></div><div class="table-cell" style="justify-items:center;" style="align-items:center;"><p>2026-01-09</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>2.00 h</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>NGIpkgs / Bonfire</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>development</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p><a style="word-break:break-all;" href="https://github.com/bonfire-networks/bonfire-app/issues/1730">https://github.com/bonfire-networks/bonfire-app/issues/1730</a></p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>answer upstream’s questions</p></div></div><div class="table-body even"><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>14</p></div><div class="table-cell" style="justify-items:center;" style="align-items:center;"><p>2026-01-11</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>5.00 h</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>NGIpkgs / dnsvizor</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>development</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p></p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>replace <code>hillingar</code> to package MirageOS unikernels</p></div></div><div class="table-body odd"><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>15</p></div><div class="table-cell" style="justify-items:center;" style="align-items:center;"><p>2026-01-12</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>5.00 h</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>NGIpkgs / dnsvizor</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>development</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p><a style="word-break:break-all;" href="https://github.com/ju1m/ngipkgs/commits/dnsvizor/">https://github.com/ju1m/ngipkgs/commits/dnsvizor/</a></p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>remove the need for <code>--allow-import-from-derivation</code></p></div></div></div></div></section><div style="display:flex;flex-direction:row;gap:5.0mm;justify-content:space-between;width:100%;"><p>julminfo - 2026-01-27 - Invoice #org3sale2 - contract n°2026-03 — Details</p><p>3/4</p></div></div></div><div class="page A4 portrait" style="display:flex;size:A4 portrait;"><div style="align-content:stretch;display:flex;flex-direction:column;gap:5.0mm;justify-content:space-between;width:100%;" style="width:100%;"><section class="invoice-details"><div style="display:flex;flex-direction:column;gap:5.0mm;width:100%;"><div class="table" style="grid-template-columns:max-content max-content max-content 1fr 1fr 50.0mm 2fr;"><div class="table-head"><div class="table-cell"><div><p>#</p></div></div><div class="table-cell"><div><p>Date</p></div></div><div class="table-cell"><div><p>Duration</p></div></div><div class="table-cell"><div><p>Scope</p></div></div><div class="table-cell"><div><p>Action</p></div></div><div class="table-cell"><div><p>References</p></div></div><div class="table-cell"><div><p>Description</p></div></div></div><div class="table-body odd"><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>16</p></div><div class="table-cell" style="justify-items:center;" style="align-items:center;"><p>2026-01-25</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>4.00 h</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>NGIpkgs / Seppo</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>development</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p></p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>begin packaging</p></div></div><div class="table-body even"><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>17</p></div><div class="table-cell" style="justify-items:center;" style="align-items:center;"><p>2026-01-26</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>5.00 h</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>NGIpkgs / Seppo</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>development</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p></p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>continue packaging</p></div></div><div class="table-body odd"><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>18</p></div><div class="table-cell" style="justify-items:center;" style="align-items:center;"><p>2026-01-27</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>5.00 h</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>NGIpkgs / Seppo</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>development</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p></p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>continue packaging</p></div></div></div></div></section><div style="display:flex;flex-direction:row;gap:5.0mm;justify-content:space-between;width:100%;"><p>4/4</p><p>julminfo - 2026-01-27 - Invoice #org3sale2 - contract n°2026-03 — Details</p></div></div></div></body></html>
\ No newline at end of file
+<html><head><title>julminfo - 2026-01-27 - Invoice #org3sale2 - contract n°2026-03</title><link rel="stylesheet" type="text/css" href="/home/julm/work/sourcephile/haskell/literate-business/data/styles/Document.css"><link rel="stylesheet" type="text/css" href="/home/julm/work/sourcephile/haskell/literate-business/data/styles/Invoice.css"><link rel="stylesheet" type="text/css" href="/home/julm/work/sourcephile/haskell/literate-business/data/styles/List.css"><link rel="stylesheet" type="text/css" href="/home/julm/work/sourcephile/haskell/literate-business/data/styles/Paper.css"><link rel="stylesheet" type="text/css" href="/home/julm/work/sourcephile/haskell/literate-business/data/styles/Table.css"></head><body><div class="page A4 portrait" style="display:flex;size:A4 portrait;"><div style="align-content:stretch;display:flex;flex-direction:column;gap:5.0mm;justify-content:space-between;width:100%;" style="width:100%;"><div style="display:flex;flex-direction:column;gap:5.0mm;width:100%;"><div class="title"><p>Invoice</p></div><section class="invoice-headers"><div class="dict"><div class="dict-entry"><div class="dict-key">InvoiceIdentifier:</div><div class="dict-value"><p>org3sale2</p></div></div><div class="dict-entry"><div class="dict-key">InvoiceType:</div><div class="dict-value"><p>sale</p></div></div><div class="dict-entry"><div class="dict-key">InvoiceOrders:</div><div class="dict-value"><div class="list" style="grid-template-columns:max-content 1fr;"><div class="list-body odd"><div class="list-key" style="justify-items:end;">-</div><div class="list-value" style="justify-items:start;"><p>contract n°2026-03</p></div></div></div></div></div><div class="dict-entry"><div class="dict-key">InvoiceEmittedOn:</div><div class="dict-value"><p>2026-01-27</p></div></div><div class="dict-entry"><div class="dict-key">InvoicePaymentDueBefore:</div><div class="dict-value"><p>2026-02-27</p></div></div></div></section><section class="invoice-from-to"><div class="org"><div class="entity"><div class="dict"><div class="dict-entry"><div class="dict-key">Name:</div><div class="dict-value"><p>julminfo</p></div></div><div class="dict-entry"><div class="dict-key">Address:</div><div class="dict-value"><div class="address"><p>3, place du Monument</p><p>Mairie - Bureau 1</p><div class="address-bottom"><p>23340 Gentioux-Pigerolles France</p></div></div></div></div><div class="dict-entry"><div class="dict-key">SIREN:</div><div class="dict-value"><p>942798083</p></div></div><div class="dict-entry"><div class="dict-key">IBAN:</div><div class="dict-value"><p>FR18 2004 1010 0820 3735 3D02 912</p></div></div></div></div><div class="dict"><div class="dict-entry"><div class="dict-key">Seller:</div><div class="dict-value"><div class="org"><div class="entity"><div class="dict"><div class="dict-entry"><div class="dict-key">Name:</div><div class="dict-value"><p>julminfo</p></div></div><div class="dict-entry"><div class="dict-key">Address:</div><div class="dict-value"><div class="address"><p>3, place du Monument</p><p>Mairie - Bureau 1</p><div class="address-bottom"><p>23340 Gentioux-Pigerolles France</p></div></div></div></div><div class="dict-entry"><div class="dict-key">SIREN:</div><div class="dict-value"><p>942798083</p></div></div><div class="dict-entry"><div class="dict-key">IBAN:</div><div class="dict-value"><p>FR18 2004 1010 0820 3735 3D02 912</p></div></div></div></div><div class="dict"><div class="dict-entry"><div class="dict-key">Admin:</div><div class="dict-value"><div class="org"><div class="entity"><div class="dict"><div class="dict-entry"><div class="dict-key">Name:</div><div class="dict-value"><p>Julien Moutinho</p></div></div><div class="dict-entry"><div class="dict-key">Email:</div><div class="dict-value"><p><a href="mailto:julm@sourcephile.fr">julm​@sourcephile.fr</a></p></div></div></div></div><div class="dict"></div></div></div></div></div></div></div></div><div class="dict-entry"><div class="dict-key">Buyer:</div><div class="dict-value"><div class="org"><div class="entity"><div class="dict"><div class="dict-entry"><div class="dict-key">Name:</div><div class="dict-value"><p>Nix@NGI Team</p></div></div><div class="dict-entry"><div class="dict-key">Email:</div><div class="dict-value"><p><a href="mailto:ngi@nixos.org">ngi​@nixos.org</a></p></div></div></div></div><div class="dict"><div class="dict-entry"><div class="dict-key">Admin:</div><div class="dict-value"><div class="org"><div class="entity"><div class="dict"><div class="dict-entry"><div class="dict-key">Name:</div><div class="dict-value"><p>Daniel Ramirez</p></div></div><div class="dict-entry"><div class="dict-key">Email:</div><div class="dict-value"><p><a href="mailto:danielramirez5@protonmail.com">danielramirez5​@protonmail.com</a></p></div></div></div></div><div class="dict"></div></div></div></div></div></div></div></div></div></div></section><section><div class="title"><p>Grand totals</p></div><div class="table" style="grid-template-columns:1fr 1fr 1fr;"><div class="table-head"><div class="table-cell"><div><p>Time frame</p></div></div><div class="table-cell"><div><p>Workload</p></div></div><div class="table-cell"><div><p>To pay (excl. taxes)</p></div></div></div><div class="table-body odd"><div class="table-cell" style="justify-items:center;" style="align-items:center;"><p>2025-12-23</p><p>2026-01-27</p></div><div class="table-cell" style="justify-items:center;" style="align-items:center;"><p>64.00 h</p></div><div class="table-cell" style="justify-items:center;" style="align-items:center;"><p>2000.00 €</p></div></div></div></section><section><div class="title"><p>Mandatory legal notices</p></div><div class="list" style="grid-template-columns:max-content 1fr;"><div class="list-body odd"><div class="list-key" style="justify-items:end;">—</div><div class="list-value" style="justify-items:start;"><p>VAT not applicable, art. 293 B of the French General Tax Code.</p></div></div><div class="list-body even"><div class="list-key" style="justify-items:end;">—</div><div class="list-value" style="justify-items:start;"><p>Fixed compensation for recovery costs in case of late payment: 40.00 €</p></div></div><div class="list-body odd"><div class="list-key" style="justify-items:end;">—</div><div class="list-value" style="justify-items:start;"><p>Late payment penalty rate (applicable from 2026-02-28): 12.15 % × unpaid amount × number of days late / 365.25</p></div></div></div></section></div><div style="display:flex;flex-direction:row;gap:5.0mm;justify-content:space-between;width:100%;"><p>julminfo - 2026-01-27 - Invoice #org3sale2 - contract n°2026-03</p><p>1/4</p></div></div></div><div class="page A4 portrait" style="display:flex;size:A4 portrait;"><div style="align-content:stretch;display:flex;flex-direction:column;gap:5.0mm;justify-content:space-between;width:100%;" style="width:100%;"><section class="invoice-summary"><div style="display:flex;flex-direction:column;gap:5.0mm;width:100%;"><div class="title"><p>Summary</p></div><div class="table" style="grid-template-columns:max-content max-content 1fr max-content max-content max-content max-content max-content;"><div class="table-head"><div class="table-cell"><div><p>#</p></div></div><div class="table-cell"><div><p>Type</p></div></div><div class="table-cell"><div><p>Scope</p></div></div><div class="table-cell"><div><p>Action</p></div></div><div class="table-cell"><div><p>Time frame</p></div></div><div class="table-cell"><div><p>Rate</p><p>(excl. taxes.)</p></div></div><div class="table-cell"><div><p>Quantity</p></div></div><div class="table-cell"><div><p>Total</p><p>(excl. taxes.)</p></div></div></div><div class="table-body odd"><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>1</p></div><div class="table-cell" style="justify-items:center;" style="align-items:center;"><p>service</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>BEAM &amp; NGIpkgs</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>development</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>2025-12-30</p><p>2025-12-30</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>31.25 € / h</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>4.00 h</p><p>(6.25%)</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>125.00 €</p></div></div><div class="table-body even"><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>2</p></div><div class="table-cell" style="justify-items:center;" style="align-items:center;"><p>service</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>Bonfire &amp; NGIpkgs</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>development</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>2025-12-23</p><p>2026-01-09</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>31.25 € / h</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>36.00 h</p><p>(56.25%)</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>1125.00 €</p></div></div><div class="table-body odd"><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>3</p></div><div class="table-cell" style="justify-items:center;" style="align-items:center;"><p>service</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>DNSvizor &amp; NGIpkgs</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>development</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>2026-01-11</p><p>2026-01-12</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>31.25 € / h</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>10.00 h</p><p>(15.62%)</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>312.50 €</p></div></div><div class="table-body even"><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>4</p></div><div class="table-cell" style="justify-items:center;" style="align-items:center;"><p>service</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>NGIpkgs &amp; Seppo</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>development</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>2026-01-25</p><p>2026-01-27</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>31.25 € / h</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>14.00 h</p><p>(21.88%)</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>437.50 €</p></div></div></div></div></section><div style="display:flex;flex-direction:row;gap:5.0mm;justify-content:space-between;width:100%;"><p>2/4</p><p>julminfo - 2026-01-27 - Invoice #org3sale2 - contract n°2026-03 — Summary</p></div></div></div><div class="page A4 portrait" style="display:flex;size:A4 portrait;"><div style="align-content:stretch;display:flex;flex-direction:column;gap:5.0mm;justify-content:space-between;width:100%;" style="width:100%;"><section class="invoice-details"><div style="display:flex;flex-direction:column;gap:5.0mm;width:100%;"><div class="title"><p>Details</p></div><div class="table" style="grid-template-columns:max-content max-content max-content 1fr 1fr 50.0mm 2fr;"><div class="table-head"><div class="table-cell"><div><p>#</p></div></div><div class="table-cell"><div><p>Date</p></div></div><div class="table-cell"><div><p>Duration</p></div></div><div class="table-cell"><div><p>Scope</p></div></div><div class="table-cell"><div><p>Action</p></div></div><div class="table-cell"><div><p>References</p></div></div><div class="table-cell"><div><p>Description</p></div></div></div><div class="table-body odd"><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>1</p></div><div class="table-cell" style="justify-items:center;" style="align-items:center;"><p>2025-12-23</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>2.00 h</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>Bonfire &amp; NGIpkgs</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>development</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p></p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>address reviewers’ concerns</p></div></div><div class="table-body even"><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>2</p></div><div class="table-cell" style="justify-items:center;" style="align-items:center;"><p>2025-12-24</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>4.00 h</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>Bonfire &amp; NGIpkgs</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>development</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p></p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>update Bonfire and report issues upstream</p></div></div><div class="table-body odd"><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>3</p></div><div class="table-cell" style="justify-items:center;" style="align-items:center;"><p>2025-12-24</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>2.00 h</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>Bonfire &amp; NGIpkgs</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>development</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p></p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>update Bonfire to fix bugs</p></div></div><div class="table-body even"><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>4</p></div><div class="table-cell" style="justify-items:center;" style="align-items:center;"><p>2025-12-25</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>6.00 h</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>Bonfire &amp; NGIpkgs</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>development</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p><a style="word-break:break-all;" href="https://github.com/bonfire-networks/bonfire-app/issues/1698#issuecomment-3692147409">https://github.com/bonfire-networks/bonfire-app/issues/1698#issuecomment-3692147409</a></p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>update and fix bugs</p></div></div><div class="table-body odd"><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>5</p></div><div class="table-cell" style="justify-items:center;" style="align-items:center;"><p>2025-12-26</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>1.00 h</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>Bonfire &amp; NGIpkgs</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>development</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p></p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>update to fix bugs</p></div></div><div class="table-body even"><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>6</p></div><div class="table-cell" style="justify-items:center;" style="align-items:center;"><p>2025-12-29</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>2.00 h</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>Bonfire &amp; NGIpkgs</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>development</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p></p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>add more tests</p></div></div><div class="table-body odd"><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>7</p></div><div class="table-cell" style="justify-items:center;" style="align-items:center;"><p>2025-12-30</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>4.00 h</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>BEAM &amp; NGIpkgs</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>development</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p></p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>improve <code>buildMix</code> &amp; <code>mixRelease</code> for packaging Elixir software</p></div></div><div class="table-body even"><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>8</p></div><div class="table-cell" style="justify-items:center;" style="align-items:center;"><p>2026-01-01</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>4.00 h</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>Bonfire &amp; NGIpkgs</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>development</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p></p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>support other flavours</p></div></div><div class="table-body odd"><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>9</p></div><div class="table-cell" style="justify-items:center;" style="align-items:center;"><p>2026-01-03</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>4.00 h</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>Bonfire &amp; NGIpkgs</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>development</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p></p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>support other flavours, and make update more resilient</p></div></div><div class="table-body even"><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>10</p></div><div class="table-cell" style="justify-items:center;" style="align-items:center;"><p>2026-01-04</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>2.00 h</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>Bonfire &amp; NGIpkgs</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>development</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p></p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>provide upstream with reproducers</p></div></div><div class="table-body odd"><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>11</p></div><div class="table-cell" style="justify-items:center;" style="align-items:center;"><p>2026-01-05</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>2.00 h</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>Bonfire &amp; NGIpkgs</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>development</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p></p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>update to latest version</p></div></div><div class="table-body even"><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>12</p></div><div class="table-cell" style="justify-items:center;" style="align-items:center;"><p>2026-01-07</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>5.00 h</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>Bonfire &amp; NGIpkgs</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>development</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p></p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>fix updating</p></div></div><div class="table-body odd"><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>13</p></div><div class="table-cell" style="justify-items:center;" style="align-items:center;"><p>2026-01-09</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>2.00 h</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>Bonfire &amp; NGIpkgs</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>development</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p><a style="word-break:break-all;" href="https://github.com/bonfire-networks/bonfire-app/issues/1730">https://github.com/bonfire-networks/bonfire-app/issues/1730</a></p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>answer upstream’s questions</p></div></div><div class="table-body even"><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>14</p></div><div class="table-cell" style="justify-items:center;" style="align-items:center;"><p>2026-01-11</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>5.00 h</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>DNSvizor &amp; NGIpkgs</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>development</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p></p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>replace <code>hillingar</code> to package MirageOS unikernels</p></div></div><div class="table-body odd"><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>15</p></div><div class="table-cell" style="justify-items:center;" style="align-items:center;"><p>2026-01-12</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>5.00 h</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>DNSvizor &amp; NGIpkgs</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>development</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p><a style="word-break:break-all;" href="https://github.com/ju1m/ngipkgs/commits/dnsvizor/">https://github.com/ju1m/ngipkgs/commits/dnsvizor/</a></p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>remove the need for <code>--allow-import-from-derivation</code></p></div></div></div></div></section><div style="display:flex;flex-direction:row;gap:5.0mm;justify-content:space-between;width:100%;"><p>julminfo - 2026-01-27 - Invoice #org3sale2 - contract n°2026-03 — Details</p><p>3/4</p></div></div></div><div class="page A4 portrait" style="display:flex;size:A4 portrait;"><div style="align-content:stretch;display:flex;flex-direction:column;gap:5.0mm;justify-content:space-between;width:100%;" style="width:100%;"><section class="invoice-details"><div style="display:flex;flex-direction:column;gap:5.0mm;width:100%;"><div class="table" style="grid-template-columns:max-content max-content max-content 1fr 1fr 50.0mm 2fr;"><div class="table-head"><div class="table-cell"><div><p>#</p></div></div><div class="table-cell"><div><p>Date</p></div></div><div class="table-cell"><div><p>Duration</p></div></div><div class="table-cell"><div><p>Scope</p></div></div><div class="table-cell"><div><p>Action</p></div></div><div class="table-cell"><div><p>References</p></div></div><div class="table-cell"><div><p>Description</p></div></div></div><div class="table-body odd"><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>16</p></div><div class="table-cell" style="justify-items:center;" style="align-items:center;"><p>2026-01-25</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>4.00 h</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>NGIpkgs &amp; Seppo</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>development</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p></p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>begin packaging</p></div></div><div class="table-body even"><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>17</p></div><div class="table-cell" style="justify-items:center;" style="align-items:center;"><p>2026-01-26</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>5.00 h</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>NGIpkgs &amp; Seppo</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>development</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p></p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>continue packaging</p></div></div><div class="table-body odd"><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>18</p></div><div class="table-cell" style="justify-items:center;" style="align-items:center;"><p>2026-01-27</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>5.00 h</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>NGIpkgs &amp; Seppo</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>development</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p></p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>continue packaging</p></div></div></div></div></section><div style="display:flex;flex-direction:row;gap:5.0mm;justify-content:space-between;width:100%;"><p>4/4</p><p>julminfo - 2026-01-27 - Invoice #org3sale2 - contract n°2026-03 — Details</p></div></div></div></body></html>
\ No newline at end of file
index fba9f928f8cab018153cff3cf889be6ce7dacbfd..11db5b46513403ec21302cfc9915282b2b7975d2 100644 (file)
@@ -1,2 +1,2 @@
 <!DOCTYPE HTML>
 <!DOCTYPE HTML>
-<html><head><title>julminfo - 2026-01-28 - Invoice #org3sale3 - contract n°2026-FixMe</title><link rel="stylesheet" type="text/css" href="/home/julm/work/sourcephile/haskell/literate-business/data/styles/Document.css"><link rel="stylesheet" type="text/css" href="/home/julm/work/sourcephile/haskell/literate-business/data/styles/Invoice.css"><link rel="stylesheet" type="text/css" href="/home/julm/work/sourcephile/haskell/literate-business/data/styles/List.css"><link rel="stylesheet" type="text/css" href="/home/julm/work/sourcephile/haskell/literate-business/data/styles/Paper.css"><link rel="stylesheet" type="text/css" href="/home/julm/work/sourcephile/haskell/literate-business/data/styles/Table.css"></head><body><div class="page A4 portrait" style="display:flex;size:A4 portrait;"><div style="align-content:stretch;display:flex;flex-direction:column;gap:5.0mm;justify-content:space-between;width:100%;" style="width:100%;"><div style="display:flex;flex-direction:column;gap:5.0mm;width:100%;"><div class="title"><p>Invoice</p></div><section class="invoice-headers"><div class="dict"><div class="dict-entry"><div class="dict-key">InvoiceIdentifier:</div><div class="dict-value"><p>org3sale3</p></div></div><div class="dict-entry"><div class="dict-key">InvoiceType:</div><div class="dict-value"><p>sale</p></div></div><div class="dict-entry"><div class="dict-key">InvoiceOrders:</div><div class="dict-value"><div class="list" style="grid-template-columns:max-content 1fr;"><div class="list-body odd"><div class="list-key" style="justify-items:end;">-</div><div class="list-value" style="justify-items:start;"><p>contract n°2026-FixMe</p></div></div></div></div></div><div class="dict-entry"><div class="dict-key">InvoiceEmittedOn:</div><div class="dict-value"><p>2026-01-28</p></div></div><div class="dict-entry"><div class="dict-key">InvoicePaymentDueBefore:</div><div class="dict-value"><p>2026-02-28</p></div></div></div></section><section class="invoice-from-to"><div class="org"><div class="entity"><div class="dict"><div class="dict-entry"><div class="dict-key">Name:</div><div class="dict-value"><p>julminfo</p></div></div><div class="dict-entry"><div class="dict-key">Address:</div><div class="dict-value"><div class="address"><p>3, place du Monument</p><p>Mairie - Bureau 1</p><div class="address-bottom"><p>23340 Gentioux-Pigerolles France</p></div></div></div></div><div class="dict-entry"><div class="dict-key">SIREN:</div><div class="dict-value"><p>942798083</p></div></div><div class="dict-entry"><div class="dict-key">IBAN:</div><div class="dict-value"><p>FR18 2004 1010 0820 3735 3D02 912</p></div></div></div></div><div class="dict"><div class="dict-entry"><div class="dict-key">Seller:</div><div class="dict-value"><div class="org"><div class="entity"><div class="dict"><div class="dict-entry"><div class="dict-key">Name:</div><div class="dict-value"><p>julminfo</p></div></div><div class="dict-entry"><div class="dict-key">Address:</div><div class="dict-value"><div class="address"><p>3, place du Monument</p><p>Mairie - Bureau 1</p><div class="address-bottom"><p>23340 Gentioux-Pigerolles France</p></div></div></div></div><div class="dict-entry"><div class="dict-key">SIREN:</div><div class="dict-value"><p>942798083</p></div></div><div class="dict-entry"><div class="dict-key">IBAN:</div><div class="dict-value"><p>FR18 2004 1010 0820 3735 3D02 912</p></div></div></div></div><div class="dict"><div class="dict-entry"><div class="dict-key">Admin:</div><div class="dict-value"><div class="org"><div class="entity"><div class="dict"><div class="dict-entry"><div class="dict-key">Name:</div><div class="dict-value"><p>Julien Moutinho</p></div></div><div class="dict-entry"><div class="dict-key">Email:</div><div class="dict-value"><p><a href="mailto:julm@sourcephile.fr">julm​@sourcephile.fr</a></p></div></div></div></div><div class="dict"></div></div></div></div></div></div></div></div><div class="dict-entry"><div class="dict-key">Buyer:</div><div class="dict-value"><div class="org"><div class="entity"><div class="dict"><div class="dict-entry"><div class="dict-key">Name:</div><div class="dict-value"><p>Nix@NGI Team</p></div></div><div class="dict-entry"><div class="dict-key">Email:</div><div class="dict-value"><p><a href="mailto:ngi@nixos.org">ngi​@nixos.org</a></p></div></div></div></div><div class="dict"><div class="dict-entry"><div class="dict-key">Admin:</div><div class="dict-value"><div class="org"><div class="entity"><div class="dict"><div class="dict-entry"><div class="dict-key">Name:</div><div class="dict-value"><p>Daniel Ramirez</p></div></div><div class="dict-entry"><div class="dict-key">Email:</div><div class="dict-value"><p><a href="mailto:danielramirez5@protonmail.com">danielramirez5​@protonmail.com</a></p></div></div></div></div><div class="dict"></div></div></div></div></div></div></div></div></div></div></section><section><div class="title"><p>Grand totals</p></div><div class="table" style="grid-template-columns:1fr 1fr 1fr;"><div class="table-head"><div class="table-cell"><div><p>Time frame</p></div></div><div class="table-cell"><div><p>Workload</p></div></div><div class="table-cell"><div><p>To pay (excl. taxes)</p></div></div></div><div class="table-body odd"><div class="table-cell" style="justify-items:center;" style="align-items:center;"><p>2025-12-29</p><p>2026-01-23</p></div><div class="table-cell" style="justify-items:center;" style="align-items:center;"><p>10.00 h</p></div><div class="table-cell" style="justify-items:center;" style="align-items:center;"><p>312.50 €</p></div></div></div></section><section><div class="title"><p>Mandatory legal notices</p></div><div class="list" style="grid-template-columns:max-content 1fr;"><div class="list-body odd"><div class="list-key" style="justify-items:end;">—</div><div class="list-value" style="justify-items:start;"><p>VAT not applicable, art. 293 B of the French General Tax Code.</p></div></div><div class="list-body even"><div class="list-key" style="justify-items:end;">—</div><div class="list-value" style="justify-items:start;"><p>Fixed compensation for recovery costs in case of late payment: 40.00 €</p></div></div><div class="list-body odd"><div class="list-key" style="justify-items:end;">—</div><div class="list-value" style="justify-items:start;"><p>Late payment penalty rate (applicable from 2026-03-01): 12.15 % × unpaid amount × number of days late / 365.25</p></div></div></div></section></div><div style="display:flex;flex-direction:row;gap:5.0mm;justify-content:space-between;width:100%;"><p>julminfo - 2026-01-28 - Invoice #org3sale3 - contract n°2026-FixMe</p><p>1/3</p></div></div></div><div class="page A4 portrait" style="display:flex;size:A4 portrait;"><div style="align-content:stretch;display:flex;flex-direction:column;gap:5.0mm;justify-content:space-between;width:100%;" style="width:100%;"><section class="invoice-summary"><div style="display:flex;flex-direction:column;gap:5.0mm;width:100%;"><div class="title"><p>Summary</p></div><div class="table" style="grid-template-columns:max-content max-content 1fr max-content max-content max-content max-content max-content;"><div class="table-head"><div class="table-cell"><div><p>#</p></div></div><div class="table-cell"><div><p>Type</p></div></div><div class="table-cell"><div><p>Scope</p></div></div><div class="table-cell"><div><p>Action</p></div></div><div class="table-cell"><div><p>Time frame</p></div></div><div class="table-cell"><div><p>Rate</p><p>(excl. taxes.)</p></div></div><div class="table-cell"><div><p>Quantity</p></div></div><div class="table-cell"><div><p>Total</p><p>(excl. taxes.)</p></div></div></div><div class="table-body odd"><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>1</p></div><div class="table-cell" style="justify-items:center;" style="align-items:center;"><p>service</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>NGIpkgs</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>organization</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>2026-01-09</p><p>2026-01-23</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>31.25 € / h</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>5.50 h</p><p>(55.0%)</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>171.88 €</p></div></div><div class="table-body even"><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>2</p></div><div class="table-cell" style="justify-items:center;" style="align-items:center;"><p>service</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>NGIpkgs / Funkwhale</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>review</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>2025-12-29</p><p>2025-12-29</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>31.25 € / h</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>0.50 h</p><p>(5.0%)</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>15.62 €</p></div></div><div class="table-body odd"><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>3</p></div><div class="table-cell" style="justify-items:center;" style="align-items:center;"><p>service</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>NGIpkgs / Manuals</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>development</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>2026-01-22</p><p>2026-01-22</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>31.25 € / h</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>4.00 h</p><p>(40.0%)</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>125.00 €</p></div></div></div></div></section><div style="display:flex;flex-direction:row;gap:5.0mm;justify-content:space-between;width:100%;"><p>2/3</p><p>julminfo - 2026-01-28 - Invoice #org3sale3 - contract n°2026-FixMe — Summary</p></div></div></div><div class="page A4 portrait" style="display:flex;size:A4 portrait;"><div style="align-content:stretch;display:flex;flex-direction:column;gap:5.0mm;justify-content:space-between;width:100%;" style="width:100%;"><section class="invoice-details"><div style="display:flex;flex-direction:column;gap:5.0mm;width:100%;"><div class="title"><p>Details</p></div><div class="table" style="grid-template-columns:max-content max-content max-content 1fr 1fr 50.0mm 2fr;"><div class="table-head"><div class="table-cell"><div><p>#</p></div></div><div class="table-cell"><div><p>Date</p></div></div><div class="table-cell"><div><p>Duration</p></div></div><div class="table-cell"><div><p>Scope</p></div></div><div class="table-cell"><div><p>Action</p></div></div><div class="table-cell"><div><p>References</p></div></div><div class="table-cell"><div><p>Description</p></div></div></div><div class="table-body odd"><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>1</p></div><div class="table-cell" style="justify-items:center;" style="align-items:center;"><p>2025-12-29</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>0.50 h</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>NGIpkgs / Funkwhale</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>review</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p><a style="word-break:break-all;" href="https://github.com/ngi-nix/ngipkgs/pull/1707#discussion_r2651644145">https://github.com/ngi-nix/ngipkgs/pull/1707#discussion_r2651644145</a></p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p></p></div></div><div class="table-body even"><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>2</p></div><div class="table-cell" style="justify-items:center;" style="align-items:center;"><p>2026-01-09</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>2.00 h</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>NGIpkgs</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>organization</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p></p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>weekly meeting</p></div></div><div class="table-body odd"><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>3</p></div><div class="table-cell" style="justify-items:center;" style="align-items:center;"><p>2026-01-16</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>2.00 h</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>NGIpkgs</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>organization</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p></p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>weekly meeting</p></div></div><div class="table-body even"><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>4</p></div><div class="table-cell" style="justify-items:center;" style="align-items:center;"><p>2026-01-22</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>4.00 h</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>NGIpkgs / Manuals</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>development</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p><a style="word-break:break-all;" href="https://github.com/ngi-nix/ngipkgs/pull/2010">https://github.com/ngi-nix/ngipkgs/pull/2010</a></p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>address reviewers’ concerns</p></div></div><div class="table-body odd"><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>5</p></div><div class="table-cell" style="justify-items:center;" style="align-items:center;"><p>2026-01-23</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>1.50 h</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>NGIpkgs</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>organization</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p></p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>weekly meeting</p></div></div></div></div></section><div style="display:flex;flex-direction:row;gap:5.0mm;justify-content:space-between;width:100%;"><p>julminfo - 2026-01-28 - Invoice #org3sale3 - contract n°2026-FixMe — Details</p><p>3/3</p></div></div></div></body></html>
\ No newline at end of file
+<html><head><title>julminfo - 2026-01-28 - Invoice #org3sale3 - contract n°2026-FixMe</title><link rel="stylesheet" type="text/css" href="/home/julm/work/sourcephile/haskell/literate-business/data/styles/Document.css"><link rel="stylesheet" type="text/css" href="/home/julm/work/sourcephile/haskell/literate-business/data/styles/Invoice.css"><link rel="stylesheet" type="text/css" href="/home/julm/work/sourcephile/haskell/literate-business/data/styles/List.css"><link rel="stylesheet" type="text/css" href="/home/julm/work/sourcephile/haskell/literate-business/data/styles/Paper.css"><link rel="stylesheet" type="text/css" href="/home/julm/work/sourcephile/haskell/literate-business/data/styles/Table.css"></head><body><div class="page A4 portrait" style="display:flex;size:A4 portrait;"><div style="align-content:stretch;display:flex;flex-direction:column;gap:5.0mm;justify-content:space-between;width:100%;" style="width:100%;"><div style="display:flex;flex-direction:column;gap:5.0mm;width:100%;"><div class="title"><p>Invoice</p></div><section class="invoice-headers"><div class="dict"><div class="dict-entry"><div class="dict-key">InvoiceIdentifier:</div><div class="dict-value"><p>org3sale3</p></div></div><div class="dict-entry"><div class="dict-key">InvoiceType:</div><div class="dict-value"><p>sale</p></div></div><div class="dict-entry"><div class="dict-key">InvoiceOrders:</div><div class="dict-value"><div class="list" style="grid-template-columns:max-content 1fr;"><div class="list-body odd"><div class="list-key" style="justify-items:end;">-</div><div class="list-value" style="justify-items:start;"><p>contract n°2026-FixMe</p></div></div></div></div></div><div class="dict-entry"><div class="dict-key">InvoiceEmittedOn:</div><div class="dict-value"><p>2026-01-28</p></div></div><div class="dict-entry"><div class="dict-key">InvoicePaymentDueBefore:</div><div class="dict-value"><p>2026-02-28</p></div></div></div></section><section class="invoice-from-to"><div class="org"><div class="entity"><div class="dict"><div class="dict-entry"><div class="dict-key">Name:</div><div class="dict-value"><p>julminfo</p></div></div><div class="dict-entry"><div class="dict-key">Address:</div><div class="dict-value"><div class="address"><p>3, place du Monument</p><p>Mairie - Bureau 1</p><div class="address-bottom"><p>23340 Gentioux-Pigerolles France</p></div></div></div></div><div class="dict-entry"><div class="dict-key">SIREN:</div><div class="dict-value"><p>942798083</p></div></div><div class="dict-entry"><div class="dict-key">IBAN:</div><div class="dict-value"><p>FR18 2004 1010 0820 3735 3D02 912</p></div></div></div></div><div class="dict"><div class="dict-entry"><div class="dict-key">Seller:</div><div class="dict-value"><div class="org"><div class="entity"><div class="dict"><div class="dict-entry"><div class="dict-key">Name:</div><div class="dict-value"><p>julminfo</p></div></div><div class="dict-entry"><div class="dict-key">Address:</div><div class="dict-value"><div class="address"><p>3, place du Monument</p><p>Mairie - Bureau 1</p><div class="address-bottom"><p>23340 Gentioux-Pigerolles France</p></div></div></div></div><div class="dict-entry"><div class="dict-key">SIREN:</div><div class="dict-value"><p>942798083</p></div></div><div class="dict-entry"><div class="dict-key">IBAN:</div><div class="dict-value"><p>FR18 2004 1010 0820 3735 3D02 912</p></div></div></div></div><div class="dict"><div class="dict-entry"><div class="dict-key">Admin:</div><div class="dict-value"><div class="org"><div class="entity"><div class="dict"><div class="dict-entry"><div class="dict-key">Name:</div><div class="dict-value"><p>Julien Moutinho</p></div></div><div class="dict-entry"><div class="dict-key">Email:</div><div class="dict-value"><p><a href="mailto:julm@sourcephile.fr">julm​@sourcephile.fr</a></p></div></div></div></div><div class="dict"></div></div></div></div></div></div></div></div><div class="dict-entry"><div class="dict-key">Buyer:</div><div class="dict-value"><div class="org"><div class="entity"><div class="dict"><div class="dict-entry"><div class="dict-key">Name:</div><div class="dict-value"><p>Nix@NGI Team</p></div></div><div class="dict-entry"><div class="dict-key">Email:</div><div class="dict-value"><p><a href="mailto:ngi@nixos.org">ngi​@nixos.org</a></p></div></div></div></div><div class="dict"><div class="dict-entry"><div class="dict-key">Admin:</div><div class="dict-value"><div class="org"><div class="entity"><div class="dict"><div class="dict-entry"><div class="dict-key">Name:</div><div class="dict-value"><p>Daniel Ramirez</p></div></div><div class="dict-entry"><div class="dict-key">Email:</div><div class="dict-value"><p><a href="mailto:danielramirez5@protonmail.com">danielramirez5​@protonmail.com</a></p></div></div></div></div><div class="dict"></div></div></div></div></div></div></div></div></div></div></section><section><div class="title"><p>Grand totals</p></div><div class="table" style="grid-template-columns:1fr 1fr 1fr;"><div class="table-head"><div class="table-cell"><div><p>Time frame</p></div></div><div class="table-cell"><div><p>Workload</p></div></div><div class="table-cell"><div><p>To pay (excl. taxes)</p></div></div></div><div class="table-body odd"><div class="table-cell" style="justify-items:center;" style="align-items:center;"><p>2025-12-29</p><p>2026-01-23</p></div><div class="table-cell" style="justify-items:center;" style="align-items:center;"><p>10.00 h</p></div><div class="table-cell" style="justify-items:center;" style="align-items:center;"><p>312.50 €</p></div></div></div></section><section><div class="title"><p>Mandatory legal notices</p></div><div class="list" style="grid-template-columns:max-content 1fr;"><div class="list-body odd"><div class="list-key" style="justify-items:end;">—</div><div class="list-value" style="justify-items:start;"><p>VAT not applicable, art. 293 B of the French General Tax Code.</p></div></div><div class="list-body even"><div class="list-key" style="justify-items:end;">—</div><div class="list-value" style="justify-items:start;"><p>Fixed compensation for recovery costs in case of late payment: 40.00 €</p></div></div><div class="list-body odd"><div class="list-key" style="justify-items:end;">—</div><div class="list-value" style="justify-items:start;"><p>Late payment penalty rate (applicable from 2026-03-01): 12.15 % × unpaid amount × number of days late / 365.25</p></div></div></div></section></div><div style="display:flex;flex-direction:row;gap:5.0mm;justify-content:space-between;width:100%;"><p>julminfo - 2026-01-28 - Invoice #org3sale3 - contract n°2026-FixMe</p><p>1/3</p></div></div></div><div class="page A4 portrait" style="display:flex;size:A4 portrait;"><div style="align-content:stretch;display:flex;flex-direction:column;gap:5.0mm;justify-content:space-between;width:100%;" style="width:100%;"><section class="invoice-summary"><div style="display:flex;flex-direction:column;gap:5.0mm;width:100%;"><div class="title"><p>Summary</p></div><div class="table" style="grid-template-columns:max-content max-content 1fr max-content max-content max-content max-content max-content;"><div class="table-head"><div class="table-cell"><div><p>#</p></div></div><div class="table-cell"><div><p>Type</p></div></div><div class="table-cell"><div><p>Scope</p></div></div><div class="table-cell"><div><p>Action</p></div></div><div class="table-cell"><div><p>Time frame</p></div></div><div class="table-cell"><div><p>Rate</p><p>(excl. taxes.)</p></div></div><div class="table-cell"><div><p>Quantity</p></div></div><div class="table-cell"><div><p>Total</p><p>(excl. taxes.)</p></div></div></div><div class="table-body odd"><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>1</p></div><div class="table-cell" style="justify-items:center;" style="align-items:center;"><p>service</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>Funkwhale &amp; NGIpkgs</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>review</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>2025-12-29</p><p>2025-12-29</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>31.25 € / h</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>0.50 h</p><p>(5.0%)</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>15.62 €</p></div></div><div class="table-body even"><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>2</p></div><div class="table-cell" style="justify-items:center;" style="align-items:center;"><p>service</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>NGIpkgs</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>organization</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>2026-01-09</p><p>2026-01-23</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>31.25 € / h</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>5.50 h</p><p>(55.0%)</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>171.88 €</p></div></div><div class="table-body odd"><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>3</p></div><div class="table-cell" style="justify-items:center;" style="align-items:center;"><p>service</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>NGIpkgs Manuals</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>development</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>2026-01-22</p><p>2026-01-22</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>31.25 € / h</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>4.00 h</p><p>(40.0%)</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>125.00 €</p></div></div></div></div></section><div style="display:flex;flex-direction:row;gap:5.0mm;justify-content:space-between;width:100%;"><p>2/3</p><p>julminfo - 2026-01-28 - Invoice #org3sale3 - contract n°2026-FixMe — Summary</p></div></div></div><div class="page A4 portrait" style="display:flex;size:A4 portrait;"><div style="align-content:stretch;display:flex;flex-direction:column;gap:5.0mm;justify-content:space-between;width:100%;" style="width:100%;"><section class="invoice-details"><div style="display:flex;flex-direction:column;gap:5.0mm;width:100%;"><div class="title"><p>Details</p></div><div class="table" style="grid-template-columns:max-content max-content max-content 1fr 1fr 50.0mm 2fr;"><div class="table-head"><div class="table-cell"><div><p>#</p></div></div><div class="table-cell"><div><p>Date</p></div></div><div class="table-cell"><div><p>Duration</p></div></div><div class="table-cell"><div><p>Scope</p></div></div><div class="table-cell"><div><p>Action</p></div></div><div class="table-cell"><div><p>References</p></div></div><div class="table-cell"><div><p>Description</p></div></div></div><div class="table-body odd"><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>1</p></div><div class="table-cell" style="justify-items:center;" style="align-items:center;"><p>2025-12-29</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>0.50 h</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>Funkwhale &amp; NGIpkgs</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>review</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p><a style="word-break:break-all;" href="https://github.com/ngi-nix/ngipkgs/pull/1707#discussion_r2651644145">https://github.com/ngi-nix/ngipkgs/pull/1707#discussion_r2651644145</a></p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p></p></div></div><div class="table-body even"><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>2</p></div><div class="table-cell" style="justify-items:center;" style="align-items:center;"><p>2026-01-09</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>2.00 h</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>NGIpkgs</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>organization</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p></p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>weekly meeting</p></div></div><div class="table-body odd"><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>3</p></div><div class="table-cell" style="justify-items:center;" style="align-items:center;"><p>2026-01-16</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>2.00 h</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>NGIpkgs</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>organization</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p></p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>weekly meeting</p></div></div><div class="table-body even"><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>4</p></div><div class="table-cell" style="justify-items:center;" style="align-items:center;"><p>2026-01-22</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>4.00 h</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>NGIpkgs Manuals</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>development</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p><a style="word-break:break-all;" href="https://github.com/ngi-nix/ngipkgs/pull/2010">https://github.com/ngi-nix/ngipkgs/pull/2010</a></p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>address reviewers’ concerns</p></div></div><div class="table-body odd"><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>5</p></div><div class="table-cell" style="justify-items:center;" style="align-items:center;"><p>2026-01-23</p></div><div class="table-cell" style="justify-items:end;" style="align-items:center;"><p>1.50 h</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>NGIpkgs</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>organization</p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p></p></div><div class="table-cell" style="justify-items:start;" style="align-items:center;"><p>weekly meeting</p></div></div></div></div></section><div style="display:flex;flex-direction:row;gap:5.0mm;justify-content:space-between;width:100%;"><p>julminfo - 2026-01-28 - Invoice #org3sale3 - contract n°2026-FixMe — Details</p><p>3/3</p></div></div></div></body></html>
\ No newline at end of file
diff --git a/tests/Tests/Work.hs b/tests/Tests/Work.hs
new file mode 100644 (file)
index 0000000..39abfa1
--- /dev/null
@@ -0,0 +1,675 @@
+{-# LANGUAGE DeriveAnyClass #-}
+{-# LANGUAGE OverloadedLists #-}
+{-# LANGUAGE OverloadedStrings #-}
+
+module Tests.Work where
+
+import Literate.Document qualified as Doc
+import Literate.Invoice
+import Literate.Prelude
+
+data ScopeId
+  = Scope_BEAM
+  | Scope_Bonfire
+  | Scope_DNSvizor
+  | Scope_Funkwhale
+  | Scope_NGIpkgs
+  | Scope_NGIpkgs_Manuals
+  | Scope_Nixpkgs
+  | Scope_OpenCV
+  | Scope_Seppo
+  deriving (Eq, Ord, Show, Generic, NFData)
+instance Doc.ToInline ScopeId where
+  toInline = \case
+    Scope_BEAM -> "BEAM"
+    Scope_Bonfire -> "Bonfire"
+    Scope_DNSvizor -> "DNSvizor"
+    Scope_Funkwhale -> "Funkwhale"
+    Scope_NGIpkgs -> "NGIpkgs"
+    Scope_NGIpkgs_Manuals -> "NGIpkgs Manuals"
+    Scope_Nixpkgs -> "Nixpkgs"
+    Scope_OpenCV -> "OpenCV"
+    Scope_Seppo -> "Seppo"
+
+data ActionId
+  = Action_Organization
+  | Action_Development
+  | Action_Documentation
+  | Action_Review
+  deriving (Eq, Ord, Show, Generic, Enum, NFData)
+instance Doc.ToInline ActionId where
+  toInline = \case
+    Action_Development -> "development"
+    Action_Documentation -> "documentation"
+    Action_Organization -> "organization"
+    Action_Review -> "review"
+
+works :: [Work ScopeId ActionId]
+works =
+  [ Work
+      { workDate = "2025-11-06"
+      , workDuration = 0.5
+      , workAction = Action_Organization
+      , workScope = [Scope_NGIpkgs]
+      , workReferences = ["https://meet.google.com/hii-druc-tjp"]
+      , workDescription = "first meeting"
+      }
+  , Work
+      { workDate = "2025-11-06"
+      , workDuration = 4
+      , workAction = Action_Development
+      , workScope = [Scope_NGIpkgs, Scope_Bonfire]
+      , workReferences = ["https://github.com/ju1m/bonfire-app/commits/nix"]
+      , workDescription = "focus on the hardest part first"
+      }
+  , Work
+      { workDate = "2025-11-07"
+      , workDuration = 8
+      , workAction = Action_Development
+      , workScope = [Scope_NGIpkgs, Scope_Bonfire]
+      , workReferences = ["https://github.com/ju1m/bonfire-app/commits/nix"]
+      , workDescription = "continuing to package Bonfire deps"
+      }
+  , Work
+      { workDate = "2025-11-08"
+      , workDuration = 0.1
+      , workAction = Action_Development
+      , workScope = [Scope_Nixpkgs, Scope_OpenCV]
+      , workReferences = ["https://github.com/NixOS/nixpkgs/pull/459592"]
+      , workDescription = "fix opencv in nixpkgs"
+      }
+  , Work
+      { workDate = "2025-11-09"
+      , workDuration = 8
+      , workAction = Action_Development
+      , workScope = [Scope_NGIpkgs, Scope_Bonfire]
+      , workReferences = ["https://github.com/ju1m/bonfire-app/commits/nix"]
+      , workDescription = "continue to fix deps"
+      }
+  , Work
+      { workDate = "2025-11-09"
+      , workDuration = 4
+      , workAction = Action_Development
+      , workScope = [Scope_NGIpkgs, Scope_Bonfire]
+      , workReferences = ["https://github.com/ju1m/bonfire-app/commits/nix"]
+      , workDescription = "continue to fix deps"
+      }
+  , Work
+      { workDate = "2025-11-11"
+      , workDuration = 6
+      , workAction = Action_Development
+      , workScope = [Scope_NGIpkgs, Scope_Bonfire]
+      , workReferences = ["https://github.com/ju1m/bonfire-app/commits/nix"]
+      , workDescription = "continue to fix deps"
+      }
+  , Work
+      { workDate = "2025-11-12"
+      , workDuration = 4
+      , workAction = Action_Development
+      , workScope = [Scope_NGIpkgs, Scope_Bonfire]
+      , workReferences = ["https://github.com/ju1m/bonfire-app/commits/nix"]
+      , workDescription = "continue to fix deps"
+      }
+  , Work
+      { workDate = "2025-11-14"
+      , workDuration = 5
+      , workAction = Action_Development
+      , workScope = [Scope_NGIpkgs, Scope_Bonfire]
+      , workReferences = ["https://github.com/ngi-nix/ngipkgs/pull/1812"]
+      , workDescription = "continue to fix deps and move into ngipkgs"
+      }
+  , Work
+      { workDate = "2025-11-14"
+      , workDuration = 1
+      , workAction = Action_Organization
+      , workScope = [Scope_NGIpkgs]
+      , workReferences = ["https://www.notion.so/nixos-foundation/Nix-NGI-weekly-review-34-2ab59d49e1be80939503c655b009e934"]
+      , workDescription = "weekly meeting"
+      }
+  , Work
+      { workDate = "2025-11-15"
+      , workDuration = 6
+      , workAction = Action_Development
+      , workScope = [Scope_NGIpkgs, Scope_Bonfire]
+      , workReferences = []
+      , workDescription = "finish to build Bonfire and start to fix runtime bugs"
+      }
+  , Work
+      { workDate = "2025-11-16"
+      , workDuration = 4
+      , workAction = Action_Development
+      , workScope = [Scope_NGIpkgs, Scope_Bonfire]
+      , workReferences = ["https://github.com/ngi-nix/ngipkgs/pull/1812#issuecomment-3537609170"]
+      , workDescription = "workaround and contribute upstream"
+      }
+  , Work
+      { workDate = "2025-11-17"
+      , workDuration = 8
+      , workAction = Action_Development
+      , workScope = [Scope_NGIpkgs, Scope_Bonfire]
+      , workReferences = []
+      , workDescription = "add updateScript and fix opencv"
+      }
+  , Work
+      { workDate = "2025-11-19"
+      , workDuration = 8
+      , workAction = Action_Development
+      , workScope = [Scope_NGIpkgs, Scope_Bonfire]
+      , workReferences = ["https://github.com/ngi-nix/ngipkgs/pull/1812#issuecomment-3554376221"]
+      , workDescription = "continue to fix startup crashes"
+      }
+  , Work
+      { workDate = "2025-11-21"
+      , workDuration = 4
+      , workAction = Action_Development
+      , workScope = [Scope_NGIpkgs, Scope_Bonfire]
+      , workReferences = []
+      , workDescription = "begin to package yarn assets. Upstream likes convoluted code and fake libraries."
+      }
+  , Work
+      { workDate = "2025-11-21"
+      , workDuration = 1
+      , workAction = Action_Organization
+      , workScope = [Scope_NGIpkgs]
+      , workReferences = []
+      , workDescription = "weekly meeting"
+      }
+  , Work
+      { workDate = "2025-11-21"
+      , workDuration = 4
+      , workAction = Action_Development
+      , workScope = [Scope_NGIpkgs, Scope_Bonfire]
+      , workReferences = []
+      , workDescription = "continue to package assets"
+      }
+  , Work
+      { workDate = "2025-11-23"
+      , workDuration = 4
+      , workAction = Action_Development
+      , workScope = [Scope_NGIpkgs, Scope_Bonfire]
+      , workReferences = []
+      , workDescription = "continue to package assets and try to get Bonfire to work"
+      }
+  , Work
+      { workDate = "2025-11-24"
+      , workDuration = 10
+      , workAction = Action_Development
+      , workScope = [Scope_NGIpkgs, Scope_Bonfire]
+      , workReferences = ["https://github.com/surface-ui/surface/issues/762#issuecomment-3577030748"]
+      , workDescription = "continue to solve problems with Bonfire packaging"
+      }
+  , Work
+      { workDate = "2025-11-27"
+      , workDuration = 8
+      , workAction = Action_Development
+      , workScope = [Scope_NGIpkgs, Scope_Bonfire]
+      , workReferences = ["https://github.com/ngi-nix/ngipkgs/pull/1812#issuecomment-3584319056"]
+      , workDescription = "successfully auto-update and build Bonfire"
+      }
+  , Work
+      { workDate = "2025-11-28"
+      , workDuration = 1
+      , workAction = Action_Organization
+      , workScope = [Scope_NGIpkgs]
+      , workReferences = ["https://www.notion.so/nixos-foundation/Nix-NGI-weekly-review-36-2b959d49e1be80fa823cd4d83581fda5#2b959d49e1be80fc85eed38c9a9dca86"]
+      , workDescription = "weekly meeting"
+      }
+  , Work
+      { workDate = "2025-11-29"
+      , workDuration = 5
+      , workAction = Action_Development
+      , workScope = [Scope_NGIpkgs, Scope_Bonfire]
+      , workReferences = []
+      , workDescription = "begin the service module"
+      }
+  , Work
+      { workDate = "2025-12-02"
+      , workDuration = 4
+      , workAction = Action_Development
+      , workScope = [Scope_NGIpkgs, Scope_Bonfire]
+      , workReferences = []
+      , workDescription = "continue the service module"
+      }
+  , Work
+      { workDate = "2025-12-03"
+      , workDuration = 8
+      , workAction = Action_Development
+      , workScope = [Scope_NGIpkgs, Scope_Bonfire]
+      , workReferences = []
+      , workDescription = "first working service module"
+      }
+  , Work
+      { workDate = "2025-12-04"
+      , workDuration = 5
+      , workAction = Action_Development
+      , workScope = [Scope_NGIpkgs, Scope_Bonfire]
+      , workReferences = ["https://github.com/ngi-nix/ngipkgs/pull/1871"]
+      , workDescription = "improve service module"
+      }
+  , Work
+      { workDate = "2025-12-05"
+      , workDuration = 1
+      , workAction = Action_Organization
+      , workScope = [Scope_NGIpkgs]
+      , workReferences = ["https://www.notion.so/nixos-foundation/Nix-NGI-weekly-review-36-2b959d49e1be80fa823cd4d83581fda5"]
+      , workDescription = "weekly meeting"
+      }
+  , Work
+      { workDate = "2025-12-05"
+      , workDuration = 0.5
+      , workAction = Action_Documentation
+      , workScope = [Scope_NGIpkgs_Manuals]
+      , workReferences = ["https://github.com/ngi-nix/ngipkgs/pull/1954"]
+      , workDescription = "meeting"
+      }
+  , Work
+      { workDate = "2025-12-06"
+      , workDuration = 2
+      , workAction = Action_Documentation
+      , workScope = [Scope_NGIpkgs_Manuals]
+      , workReferences = []
+      , workDescription = "prepare wednesday meeting"
+      }
+  , Work
+      { workDate = "2025-12-07"
+      , workDuration = 4
+      , workAction = Action_Documentation
+      , workScope = [Scope_NGIpkgs_Manuals]
+      , workReferences = []
+      , workDescription = "prepare demo for wednesday meeting"
+      }
+  , Work
+      { workDate = "2025-12-08"
+      , workDuration = 4
+      , workAction = Action_Documentation
+      , workScope = [Scope_NGIpkgs_Manuals]
+      , workReferences = ["https://github.com/ngi-nix/ngipkgs/pull/1891"]
+      , workDescription = "prepare demo for wednesday meeting"
+      }
+  , Work
+      { workDate = "2025-12-09"
+      , workDuration = 4
+      , workAction = Action_Documentation
+      , workScope = [Scope_NGIpkgs_Manuals]
+      , workReferences = ["https://github.com/ngi-nix/ngipkgs/pull/1891"]
+      , workDescription = "continue to document"
+      }
+  , Work
+      { workDate = "2025-12-10"
+      , workDuration = 2
+      , workAction = Action_Review
+      , workScope = [Scope_NGIpkgs]
+      , workReferences = ["https://www.notion.so/nixos-foundation/Nix-NGI-best-practices-for-NixOS-modules-implementation-2c559d49e1be80a8a499f21abb203d6f"]
+      , workDescription = "visio on “best practices”"
+      }
+  , Work
+      { workDate = "2025-12-12"
+      , workDuration = 1
+      , workAction = Action_Organization
+      , workScope = [Scope_NGIpkgs]
+      , workReferences = []
+      , workDescription = "weekly visio meeting"
+      }
+  , Work
+      { workDate = "2025-12-11"
+      , workDuration = 8
+      , workAction = Action_Documentation
+      , workScope = [Scope_NGIpkgs_Manuals]
+      , workReferences = []
+      , workDescription = "continue to document"
+      }
+  , Work
+      { workDate = "2025-12-12"
+      , workDuration = 4
+      , workAction = Action_Documentation
+      , workScope = [Scope_NGIpkgs_Manuals]
+      , workReferences = []
+      , workDescription = "continue to document"
+      }
+  , Work
+      { workDate = "2025-12-13"
+      , workDuration = 2
+      , workAction = Action_Documentation
+      , workScope = [Scope_NGIpkgs_Manuals]
+      , workReferences = []
+      , workDescription =
+          [ "setup sphinx like "
+          , Doc.InlineLink
+              { Doc.inlineLinkTarget = "https://nix.dev"
+              , Doc.inlineLinkText = "nix.dev"
+              }
+          , " for the manuals"
+          ]
+      }
+  , Work
+      { workDate = "2025-12-13"
+      , workDuration = 5
+      , workAction = Action_Development
+      , workScope = [Scope_NGIpkgs, Scope_Bonfire]
+      , workReferences = ["https://github.com/bonfire-networks/bonfire-app/issues/1670#issuecomment-3650762914"]
+      , workDescription = "update to latest; overcoming new bugs introduced by upstream"
+      }
+  , Work
+      { workDate = "2025-12-15"
+      , workDuration = 4
+      , workAction = Action_Development
+      , workScope = [Scope_NGIpkgs, Scope_Bonfire]
+      , workReferences = []
+      , workDescription = "improving the update script and still overcoming upstream bugs"
+      }
+  , Work
+      { workDate = "2025-12-16"
+      , workDuration = 3
+      , workAction = Action_Development
+      , workScope = [Scope_NGIpkgs, Scope_Bonfire]
+      , workReferences = []
+      , workDescription = "overcoming bugs, again"
+      }
+  , Work
+      { workDate = "2025-12-16"
+      , workDuration = 2
+      , workAction = Action_Review
+      , workScope = [Scope_NGIpkgs]
+      , workReferences = []
+      , workDescription = "visio to review PRs"
+      }
+  , Work
+      { workDate = "2025-12-16"
+      , workDuration = 2
+      , workAction = Action_Review
+      , workScope = [Scope_NGIpkgs]
+      , workReferences = []
+      , workDescription = "visio to review PRs"
+      }
+  , Work
+      { workDate = "2025-12-17"
+      , workDuration = 1.5
+      , workAction = Action_Review
+      , workScope = [Scope_NGIpkgs]
+      , workReferences = []
+      , workDescription = "visio to review PRs"
+      }
+  , Work
+      { workDate = "2025-12-18"
+      , workDuration = 1
+      , workAction = Action_Review
+      , workScope = [Scope_NGIpkgs, Scope_DNSvizor]
+      , workReferences = []
+      , workDescription = "review linj’s PR"
+      }
+  , Work
+      { workDate = "2025-12-19"
+      , workDuration = 1.5
+      , workAction = Action_Organization
+      , workScope = [Scope_NGIpkgs]
+      , workReferences = []
+      , workDescription = "weekly meeting"
+      }
+  , Work
+      { workDate = "2025-12-21"
+      , workDuration = 4
+      , workAction = Action_Development
+      , workScope = [Scope_NGIpkgs, Scope_Bonfire]
+      , workReferences = []
+      , workDescription =
+          [ "fix bug using "
+          , "__structuredAttrs" & Doc.InlineCode
+          ]
+      }
+  , Work
+      { workDate = "2025-12-23"
+      , workDuration = 4
+      , workAction = Action_Documentation
+      , workScope = [Scope_NGIpkgs_Manuals]
+      , workReferences = []
+      , workDescription = "improve building the manuals"
+      }
+  , Work
+      { workDate = "2025-12-23"
+      , workDuration = 2
+      , workAction = Action_Development
+      , workScope = [Scope_NGIpkgs, Scope_Bonfire]
+      , workReferences = []
+      , workDescription = "address reviewers’ concerns"
+      }
+  , Work
+      { workDate = "2025-12-24"
+      , workDuration = 4
+      , workAction = Action_Development
+      , workScope = [Scope_NGIpkgs, Scope_Bonfire]
+      , workReferences = []
+      , workDescription = "update Bonfire and report issues upstream"
+      }
+  , Work
+      { workDate = "2025-12-24"
+      , workDuration = 4
+      , workAction = Action_Documentation
+      , workScope = [Scope_NGIpkgs_Manuals]
+      , workReferences = []
+      , workDescription = "document"
+      }
+  , Work
+      { workDate = "2025-12-24"
+      , workDuration = 2
+      , workAction = Action_Development
+      , workScope = [Scope_NGIpkgs, Scope_Bonfire]
+      , workReferences = []
+      , workDescription = "update Bonfire to fix bugs"
+      }
+  , Work
+      { workDate = "2025-12-25"
+      , workDuration = 2
+      , workAction = Action_Documentation
+      , workScope = [Scope_NGIpkgs_Manuals]
+      , workReferences = []
+      , workDescription = "document"
+      }
+  , Work
+      { workDate = "2025-12-25"
+      , workDuration = 6
+      , workAction = Action_Development
+      , workScope = [Scope_NGIpkgs, Scope_Bonfire]
+      , workReferences = ["https://github.com/bonfire-networks/bonfire-app/issues/1698#issuecomment-3692147409"]
+      , workDescription = "update and fix bugs"
+      }
+  , Work
+      { workDate = "2025-12-26"
+      , workDuration = 1
+      , workAction = Action_Development
+      , workScope = [Scope_NGIpkgs, Scope_Bonfire]
+      , workReferences = []
+      , workDescription = "update to fix bugs"
+      }
+  , Work
+      { workDate = "2025-12-28"
+      , workDuration = 6
+      , workAction = Action_Documentation
+      , workScope = [Scope_NGIpkgs_Manuals]
+      , workReferences = []
+      , workDescription = "document"
+      }
+  , Work
+      { workDate = "2025-12-29"
+      , workDuration = 2
+      , workAction = Action_Development
+      , workScope = [Scope_NGIpkgs, Scope_Bonfire]
+      , workReferences = []
+      , workDescription = "add more tests"
+      }
+  , Work
+      { workDate = "2025-12-29"
+      , workDuration = 0.5
+      , workAction = Action_Review
+      , workScope = [Scope_NGIpkgs, Scope_Funkwhale] -- goes into NGI Review
+      , workReferences = ["https://github.com/ngi-nix/ngipkgs/pull/1707#discussion_r2651644145"]
+      , workDescription = ""
+      }
+  , Work
+      { workDate = "2025-12-30"
+      , workDuration = 4
+      , workAction = Action_Development
+      , workScope = [Scope_NGIpkgs, Scope_BEAM]
+      , workReferences = []
+      , workDescription = ["improve ", Doc.InlineCode "buildMix", " & ", Doc.InlineCode "mixRelease", " for packaging Elixir software"]
+      }
+  , Work
+      { workDate = "2026-01-01"
+      , workDuration = 4
+      , workAction = Action_Development
+      , workScope = [Scope_NGIpkgs, Scope_Bonfire]
+      , workReferences = []
+      , workDescription = "support other flavours"
+      }
+  , Work
+      { workDate = "2026-01-03"
+      , workDuration = 4
+      , workAction = Action_Development
+      , workScope = [Scope_NGIpkgs, Scope_Bonfire]
+      , workReferences = []
+      , workDescription = "support other flavours, and make update more resilient"
+      }
+  , Work
+      { workDate = "2026-01-04"
+      , workDuration = 2
+      , workAction = Action_Development
+      , workScope = [Scope_NGIpkgs, Scope_Bonfire]
+      , workReferences = []
+      , workDescription = "provide upstream with reproducers"
+      }
+  , Work
+      { workDate = "2026-01-05"
+      , workDuration = 2
+      , workAction = Action_Development
+      , workScope = [Scope_NGIpkgs, Scope_Bonfire]
+      , workReferences = []
+      , workDescription = "update to latest version"
+      }
+  , Work
+      { workDate = "2026-01-07"
+      , workDuration = 5
+      , workAction = Action_Development
+      , workScope = [Scope_NGIpkgs, Scope_Bonfire]
+      , workReferences = []
+      , workDescription = "fix updating"
+      }
+  , Work
+      { workDate = "2026-01-07"
+      , workDuration = 1
+      , workAction = Action_Documentation
+      , workScope = [Scope_NGIpkgs_Manuals] -- goes into NGI Core
+      , workReferences = ["https://github.com/ngi-nix/ngipkgs/pull/1891"]
+      , workDescription = "address reviewer’s comment"
+      }
+  , Work
+      { workDate = "2026-01-09"
+      , workDuration = 2
+      , workAction = Action_Documentation
+      , workScope = [Scope_NGIpkgs_Manuals] -- goes into NGI Core
+      , workReferences = []
+      , workDescription = "address reviewer’s comments"
+      }
+  , Work
+      { workDate = "2026-01-09"
+      , workDuration = 2
+      , workAction = Action_Development
+      , workScope = [Scope_NGIpkgs, Scope_Bonfire]
+      , workReferences = ["https://github.com/bonfire-networks/bonfire-app/issues/1730"]
+      , workDescription = "answer upstream’s questions"
+      }
+  , Work
+      { workDate = "2026-01-11"
+      , workDuration = 5
+      , workAction = Action_Development
+      , workScope = [Scope_NGIpkgs, Scope_DNSvizor]
+      , workReferences = []
+      , workDescription = ["replace ", Doc.InlineCode "hillingar", " to package MirageOS unikernels"]
+      }
+  , Work
+      { workDate = "2026-01-09"
+      , workDuration = 2
+      , workAction = Action_Organization
+      , workScope = [Scope_NGIpkgs]
+      , workReferences = []
+      , workDescription = "weekly meeting"
+      }
+  , Work
+      { workDate = "2026-01-12"
+      , workDuration = 5
+      , workAction = Action_Development
+      , workScope = [Scope_NGIpkgs, Scope_DNSvizor]
+      , workReferences = ["https://github.com/ju1m/ngipkgs/commits/dnsvizor/"]
+      , workDescription = ["remove the need for ", Doc.InlineCode "--allow-import-from-derivation"]
+      }
+  , Work
+      { workDate = "2026-01-12"
+      , workDuration = 6
+      , workAction = Action_Documentation
+      , workScope = [Scope_NGIpkgs_Manuals] -- goes into NGI Core
+      , workReferences = []
+      , workDescription = "render options"
+      }
+  , Work
+      { workDate = "2026-01-13"
+      , workDuration = 1
+      , workAction = Action_Documentation
+      , workScope = [Scope_NGIpkgs_Manuals] -- goes into NGI Core
+      , workReferences = []
+      , workDescription = "update"
+      }
+  , Work
+      { workDate = "2026-01-16"
+      , workDuration = 2
+      , workAction = Action_Organization
+      , workScope = [Scope_NGIpkgs]
+      , workReferences = []
+      , workDescription = "weekly meeting"
+      }
+  , Work
+      { workDate = "2026-01-19"
+      , workDuration = 2
+      , workAction = Action_Documentation
+      , workScope = [Scope_NGIpkgs_Manuals] -- goes into NGI Core
+      , workReferences = []
+      , workDescription = "split into several PDF"
+      }
+  , Work
+      { workDate = "2026-01-22"
+      , workDuration = 4
+      , workAction = Action_Development
+      , workScope = [Scope_NGIpkgs_Manuals] -- goes into NGI Core
+      , workReferences = ["https://github.com/ngi-nix/ngipkgs/pull/2010"]
+      , workDescription = "address reviewers’ concerns"
+      }
+  , Work
+      { workDate = "2026-01-23"
+      , workDuration = 1.5
+      , workAction = Action_Organization
+      , workScope = [Scope_NGIpkgs]
+      , workReferences = []
+      , workDescription = "weekly meeting"
+      }
+  , Work
+      { workDate = "2026-01-25"
+      , workDuration = 4
+      , workAction = Action_Development
+      , workScope = [Scope_NGIpkgs, Scope_Seppo]
+      , workReferences = []
+      , workDescription = "begin packaging"
+      }
+  , Work
+      { workDate = "2026-01-26"
+      , workDuration = 5
+      , workAction = Action_Development
+      , workScope = [Scope_NGIpkgs, Scope_Seppo]
+      , workReferences = []
+      , workDescription = "continue packaging"
+      }
+  , Work
+      { workDate = "2026-01-27"
+      , workDuration = 5
+      , workAction = Action_Development
+      , workScope = [Scope_NGIpkgs, Scope_Seppo]
+      , workReferences = []
+      , workDescription = "continue packaging"
+      }
+  ]