]> 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.Work
 
   build-depends:
     , filepath
index 43cb5bf6ca4d2c913af3d09b0f9602caa840a453..c3cb5612638c070977bb4e1fe78d96121d8572ef 100644 (file)
@@ -1,4 +1,50 @@
+{-# LANGUAGE DeriveAnyClass #-}
+
 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
+
+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 [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
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.Database
 import Literate.Document qualified as Doc
 import Literate.Organization
 import Literate.Prelude
@@ -15,7 +16,7 @@ import Literate.Time
 
 type InvoiceScope = [Text]
 
-data Invoice actionId entId invId = Invoice
+data Invoice scopeId actionId entId invId = Invoice
   { 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]
-  , invoiceWorks :: [Work actionId]
+  , invoiceWorks :: [Work scopeId actionId]
   }
   deriving (Eq, Show)
 
 invoice ::
   Ord actionId =>
   Enum entId =>
-  invId -> Invoice actionId entId invId
+  invId -> Invoice scopeId actionId entId invId
 invoice invoiceId =
   Invoice
     { invoiceId
@@ -48,12 +49,12 @@ invoice invoiceId =
     , invoiceWorks = []
     }
 
-data Work actionId = Work
+data Work scopeId actionId = Work
   { workDescription :: Doc.Inline
   , workDate :: LocalTime
   , workDuration :: Amount 100 (UnitName "h")
   , workAction :: actionId
-  , workScope :: [Text]
+  , workScope :: Ands scopeId
   , workReferences :: [URL]
   }
   deriving (Eq, Show)
@@ -72,8 +73,8 @@ data InvoiceMention
   | 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
@@ -83,7 +84,7 @@ data InvoiceItem actionId rate qty = InvoiceItem
   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
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 ::
-  forall actionId entId invId.
+  forall scopeId actionId entId invId.
   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"
@@ -131,21 +131,23 @@ invoiceIdInline inv =
 instance
   ( Get (Organization entId) entId
   , Get (Entity entId) entId
+  , Ord scopeId
   , Show actionId
   , Ord actionId
   , Enum entId
   , Enum invId
+  , Doc.ToInline scopeId
   , 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
-    let invSummary :: [InvoiceItem _ _ _] =
+    let invSummary :: [InvoiceItem _ _ _ _] =
           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.tableCellContent = invItem & invoiceItemScope & pathToBlock
+                                                        { Doc.tableCellContent = invItem & invoiceItemScope & Doc.toInline & Doc.toBlock
                                                         , Doc.tableCellJustify = Doc.JustifyStart
                                                         }
                                                     , Doc.tableCell
@@ -467,12 +469,11 @@ instance
                                                       , 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.tableCellContent = work & workScope & pathToBlock
+                                                      { Doc.tableCellContent = work & workScope & Doc.toInline & Doc.toBlock
                                                       , Doc.tableCellJustify = Doc.JustifyStart
                                                       }
                                                   , Doc.tableCell
@@ -523,19 +524,14 @@ instance
                                 else Doc.PageSideRight
                         }
             }
-    where
-      pathToBlock segs =
-        [ seg & Doc.toInline
-        | seg <- segs
-        ]
-          & List.intersperse " / "
-          & Doc.toInline
-          & Doc.toBlock
 
 invoiceSummary ::
+  Ord scopeId =>
   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
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.Database
 import Literate.Invoice
-import Literate.Organization
 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
-  { 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)
@@ -24,15 +26,6 @@ account =
     , 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)
@@ -42,9 +35,9 @@ data Meta
 
 data Cause
   = Cause
-  { causeEntity :: Maybe Orga.EntityId
+  { causeEntity :: Maybe EntityId
   , causePeriod :: Maybe Period
-  , causeInvoice :: Maybe Invoice.InvoiceId
+  , causeInvoice :: Maybe InvoiceId
   }
   deriving (Eq, Ord, Show, Generic, NFData)
 cause =
@@ -65,45 +58,57 @@ instance FromRational Amounts where
 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 = []
+      , moveDate = "2026-01-27"
+      , movePostings = equalPostings account{accountOwner = Just EntityUpwork} account{accountOwner = Just EntityJulmInfo} 174.30
       }
   , Movement
       { moveDescription = ""
+      , moveMeta =
+          [ cause{causeInvoice = Just Invoice_org3sale2}
+          ]
       , 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 = ""
+      , moveMeta =
+          [ cause{causeInvoice = Just Invoice_org3sale1}
+          ]
       , 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
-              { causeEntity = Just Orga.EntityUrssaf
+              { causeEntity = Just EntityUrssaf
               , 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
-              { postingAccount = account{accountOwner = Just Orga.EntityUrssaf}
+              { postingAccount =
+                  account
+                    { accountOwner = Just EntityUrssaf
+                    , accountPCG = Just PCG.pcg2025_6451
+                    }
               , postingFlow = FlowTarget 1677.00
               , postingMeta = []
               }
           , Posting
-              { postingAccount = account{accountOwner = Just Orga.EntityUrssaf}
+              { postingAccount = account{accountOwner = Just EntityUrssaf}
               , 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 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
@@ -17,20 +16,21 @@ import Prelude ((*))
 
 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 Tests.Organization
+import Tests.Work
+
 spec :: HasCallStack => Spec
 spec =
-  -- aroundAll readDicts do
   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
@@ -42,636 +42,6 @@ spec =
         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
@@ -679,28 +49,7 @@ data InvoiceId
   | 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
@@ -709,8 +58,8 @@ instance Get (Invoice ActionId Orga.EntityId InvoiceId) InvoiceId where
         , 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
@@ -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)
-        , 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 =
-            works_NGIpkgs
+            works
               & 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
@@ -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)
-        , 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 =
-            works_NGIpkgs
+            works
               & 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)
-                        , work & workScope & (== ["NGIpkgs"])
+                        , work & workScope & (== [Scope_NGIpkgs])
                         ]
                           & 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)
-        , 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 =
-            works_NGIpkgs
+            works
               & 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")
-                      , 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)
-                      , work & workScope & (== ["NGIpkgs"])
+                      , work & workScope & (== [Scope_NGIpkgs])
                       ]
                         & list
                   ]
index 75c45b26fb06e46a40bfbbf970dbbf4a252a13a0..43c2aa779f7cd83a62e3826858ce13b34eb65574 100644 (file)
@@ -1,2 +1,2 @@
 <!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>
-<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>
-<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"
+      }
+  ]