Tests.Invoice
Tests.Organization
Tests.Utils.Tests
+ Tests.Work
build-depends:
, filepath
+{-# 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)
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
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
type InvoiceScope = [Text]
-data Invoice actionId entId invId = Invoice
+data Invoice scopeId actionId entId invId = Invoice
{ invoiceId :: invId
, invoiceType :: InvoiceType
, invoiceEmittedOn :: LocalTime
, -- , 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
, 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)
| 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
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
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"
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 =
, Doc.tableCellJustify = Doc.JustifyCenter
}
, Doc.tableCell
- { Doc.tableCellContent = invItem & invoiceItemScope & pathToBlock
+ { Doc.tableCellContent = invItem & invoiceItemScope & Doc.toInline & Doc.toBlock
, Doc.tableCellJustify = Doc.JustifyStart
}
, Doc.tableCell
, Doc.tableCellJustify = Doc.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
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
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)
, accountPCG = Nothing
}
-newtype Ors a = Ors {ors :: Set a}
- deriving (Eq, Ord, Show, Generic)
- deriving newtype (NFData)
-newtype Ands a = Ands {ands :: Set a}
- deriving (Eq, Ord, Show, Generic)
- deriving newtype (NFData)
-data Boolean a = BooleanTrue a | BooleanFalse a
- deriving (Eq, Ord, Show, Generic, NFData)
-
data Meta
= Meta
{ metaCause :: Ands (Ors Cause)
data 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 =
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 = []
}
import Data.Time.Clock qualified as Time
import Data.Time.LocalTime qualified as Time
import Test.Syd (Spec, describe, goldenByteStringBuilderFile, it)
-import Tests.Organization qualified as Orga
import Tests.Utils.Tests (goldenPath)
import Text.Blaze.Renderer.Text qualified as Blaze.Text
import Text.Blaze.Renderer.Utf8 qualified as Blaze
import 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
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
| 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
, 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
, 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
, 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
]
, 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
]
<!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 & 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 & 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 & 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 & 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 & 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 & 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 & 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 & 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 & 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 & 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 & 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 & 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 & 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 & 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 & 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 & 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 & 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 & 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 & 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 & 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 & 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 & 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 & 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 & 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 & 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 & 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 & 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 & 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 & 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
<!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> & <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 & 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 & 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 & 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 & 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 & 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 & 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 & 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 & 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 & 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 & 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 & 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> & <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 & 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 & 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 & 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 & 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 & 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 & 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 & 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 & 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 & 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
<!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 & 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 & 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
--- /dev/null
+{-# 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"
+ }
+ ]