{-# LANGUAGE DeriveAnyClass #-} {-# LANGUAGE OverloadedLists #-} module Tests.Accounting where import Literate.Accounting import Literate.Accounting.PlanComptableGénéral qualified as PCG import Literate.Invoice import Literate.Organization import Literate.Prelude import Tests.Invoice qualified as Invoice import Tests.Organization qualified as Orga data Scope = Scope deriving (Eq, Ord, Show, Generic, NFData) data Account = Account { accountOwner :: Maybe Orga.EntityId , accountScope :: Set (Set Scope) , accountPCG :: Maybe PCG.PCG } deriving (Eq, Ord, Show, Generic, NFData) account = Account { accountOwner = Nothing , accountScope = [] , 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) , metaOwner :: Set Cause } deriving (Eq, Ord, Show, Generic, NFData) data Cause = Cause { causeEntity :: Maybe Orga.EntityId , causePeriod :: Maybe Period , causeInvoice :: Maybe Invoice.InvoiceId } deriving (Eq, Ord, Show, Generic, NFData) cause = Cause { causeEntity = Nothing , causeInvoice = Nothing , causePeriod = Nothing } data Amounts = Amounts { amountsEuro :: Amount 100 (UnitName "€") } deriving (Eq, Ord, Show, Generic, NFData) instance FromRational Amounts where fromRational r = Amounts{amountsEuro = fromRational r} 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 , moveMeta = [] } , Movement { moveDescription = "" , moveDate = "2026-01-28" , movePostings = equalPostings account{accountOwner = Just Orga.EntityNixOSFoundationNGITeam} account{accountOwner = Just Orga.EntityJulmInfo} 2000.00 , moveMeta = [] } , Movement { moveDescription = "" , moveDate = "2026-01-29" , movePostings = equalPostings account{accountOwner = Just Orga.EntityNixOSFoundationNGITeam} account{accountOwner = Just Orga.EntityJulmInfo} 4643.75 , moveMeta = [] } , Movement { moveDescription = "Cotisation URSSAF" , moveMeta = [ cause { causeEntity = Just Orga.EntityUrssaf , causePeriod = Just Period{periodBeginning = "2026-01-01", periodEnd = "2026-01-31"} } ] , moveDate = "2026-02-01" , movePostings = [ Posting { postingAccount = account{accountOwner = Just Orga.EntityJulmInfo} , postingFlow = FlowOrigin 1691.00 , postingMeta = [] } , Posting { postingAccount = account{accountOwner = Just Orga.EntityUrssaf} , postingFlow = FlowTarget 1677.00 , postingMeta = [] } , Posting { postingAccount = account{accountOwner = Just Orga.EntityUrssaf} , postingFlow = FlowTarget 14.00 , postingMeta = [] } ] } ]