From 16103a4d886605b49bc2f21f06eb99513e4fac60 Mon Sep 17 00:00:00 2001 From: Rutger Broekhoff Date: Wed, 23 Jul 2025 12:47:47 +0200 Subject: Slay --- app/Data/Ledger.hs | 4 +- app/Import/Ing/Convert.hs | 140 +++++++++++++++++++++++++++++++++++++++++----- 2 files changed, 127 insertions(+), 17 deletions(-) (limited to 'app') diff --git a/app/Data/Ledger.hs b/app/Data/Ledger.hs index ceca9da..53901cb 100644 --- a/app/Data/Ledger.hs +++ b/app/Data/Ledger.hs @@ -50,9 +50,9 @@ data TxType data IbanTag = AccountTag | CounterpartyIbanTag deriving (Eq, Enum, Ord, Show) -data UnitTag = FiledTag | GooglePayTag deriving (Eq, Enum, Ord, Show) +data UnitTag = FiledTag | GooglePayTag | AutoRoundSavingsTag deriving (Eq, Enum, Ord, Show) -data TextTag = DescTag | UserTag | CounterpartyNameTag | ReferenceTag | MandateIdTag | CreditorIdTag | OtherPartyTag | TransactionTag | TerminalTag | CardSeqNoTag deriving (Eq, Enum, Ord, Show) +data TextTag = DescTag | UserTag | CounterpartyNameTag | ReferenceTag | MandateIdTag | CreditorIdTag | OtherPartyTag | TransactionTag | TerminalTag | CardSeqNoTag | SavingsAccountTag deriving (Eq, Enum, Ord, Show) data Label a where TextLabel :: TextTag -> Label T.Text diff --git a/app/Import/Ing/Convert.hs b/app/Import/Ing/Convert.hs index 712c8a4..36ce99f 100644 --- a/app/Import/Ing/Convert.hs +++ b/app/Import/Ing/Convert.hs @@ -12,11 +12,14 @@ import Data.Text qualified as T import Import.Ing.CurrentAccountCsv as C import Import.Ing.SavingsAccountCsv as S -virtCheckingAccount :: Iban.Iban -> L.AccountId -virtCheckingAccount iban = AccountId ["Unfiled", "Asset", "Current", "Checking", "Iban", Iban.toText iban] +virtCheckingAcc :: L.AccountId +virtCheckingAcc = AccountId ["Unfiled", "Checking"] -virtCounterparty :: T.Text -> L.AccountId -virtCounterparty name = AccountId ["Unfiled", "Expenses", "Counterparty", "Name", name] +virtSavingsAcc :: L.AccountId +virtSavingsAcc = AccountId ["Unfiled", "Savings"] + +virtCounterparty :: L.AccountId +virtCounterparty = AccountId ["Unfiled", "Counterparty"] toCents :: Decimal -> Either String L.Money toCents m @@ -31,9 +34,8 @@ condUnitLabel :: UnitTag -> Bool -> L.Labels condUnitLabel _ False = empty condUnitLabel t True = singleton (UnitLabel t) (Identity ()) -fromCurrentAccountTx :: CommodityId -> C.Tx -> Either String L.Tx -fromCurrentAccountTx eucId (C.Tx base spec) = do - let acc = virtCheckingAccount base.account +fromCurrentAccTx :: CommodityId -> C.Tx -> Either String L.Tx +fromCurrentAccTx eucId (C.Tx base spec) = do when (base.amount < 0) $ Left "Transaction amount may not be lower than zero" amount <- L.Amount <$> toCents base.amount @@ -50,11 +52,12 @@ fromCurrentAccountTx eucId (C.Tx base spec) = do L.Tx { cleared = Just base.date, commodityId = eucId, - credit = M.singleton acc amount, - debit = M.singleton (virtCounterparty counterpartyName) amount, + credit = M.singleton virtCheckingAcc amount, + debit = M.singleton virtCounterparty amount, labels = fromList [ IbanLabel AccountTag ==> base.account, + TextLabel CounterpartyNameTag ==> counterpartyName, TextLabel CardSeqNoTag ==> cardSequenceNo, TextLabel TerminalTag ==> terminal, TextLabel TransactionTag ==> transaction, @@ -73,11 +76,12 @@ fromCurrentAccountTx eucId (C.Tx base spec) = do L.Tx { cleared = Just base.date, commodityId = eucId, - debit = M.singleton acc amount, - credit = M.singleton (virtCounterparty counterpartyName) amount, + debit = M.singleton virtCheckingAcc amount, + credit = M.singleton virtCounterparty amount, labels = fromList [ IbanLabel AccountTag ==> base.account, + TextLabel CounterpartyNameTag ==> counterpartyName, TextLabel CardSeqNoTag ==> cardSequenceNo, TextLabel TerminalTag ==> terminal, TextLabel TransactionTag ==> transaction, @@ -94,11 +98,12 @@ fromCurrentAccountTx eucId (C.Tx base spec) = do L.Tx { cleared = Just base.date, commodityId = eucId, - debit = M.singleton acc amount, - credit = M.singleton (virtCounterparty counterpartyName) amount, + debit = M.singleton virtCheckingAcc amount, + credit = M.singleton virtCounterparty amount, labels = fromList [ IbanLabel AccountTag ==> base.account, + TextLabel CounterpartyNameTag ==> counterpartyName, IbanLabel CounterpartyIbanTag ==> counterpartyIban, TextLabel DescTag ==> description, TimestampLabel ==> timestamp @@ -114,13 +119,118 @@ fromCurrentAccountTx eucId (C.Tx base spec) = do L.Tx { cleared = Just base.date, commodityId = eucId, - debit = M.singleton (virtCounterparty counterpartyName) amount, - credit = M.singleton acc amount, + debit = M.singleton virtCounterparty amount, + credit = M.singleton virtCheckingAcc amount, labels = fromList [ IbanLabel AccountTag ==> base.account, + TextLabel CounterpartyNameTag ==> counterpartyName, IbanLabel CounterpartyIbanTag ==> counterpartyIban, TextLabel DescTag ==> description ] `union` (maybe empty (singleton TimestampLabel . Identity) mtimestamp) } + RecurrentDirectDebit + { counterpartyName, + counterpartyIban, + description, + reference, + mandateId, + creditorId, + otherParty + } -> + return $ + L.Tx + { cleared = Just base.date, + commodityId = eucId, + credit = M.singleton virtCheckingAcc amount, + debit = M.singleton virtCounterparty amount, + labels = + fromList + [ IbanLabel AccountTag ==> base.account, + IbanLabel CounterpartyIbanTag ==> counterpartyIban, + TextLabel CounterpartyNameTag ==> counterpartyName, + TextLabel DescTag ==> description, + TextLabel ReferenceTag ==> reference, + TextLabel MandateIdTag ==> mandateId, + TextLabel CreditorIdTag ==> creditorId + ] + `union` (maybe empty (singleton (TextLabel OtherPartyTag) . Identity) otherParty) + } + RoundingSavingsDeposit + { savingsAccount + } -> + return $ + L.Tx + { cleared = Just base.date, + commodityId = eucId, + credit = M.singleton virtCheckingAcc amount, + debit = M.singleton virtSavingsAcc amount, + labels = + fromList + [ UnitLabel AutoRoundSavingsTag ==> (), + TextLabel SavingsAccountTag ==> savingsAccount + ] + } + DepositTransfer + { counterpartyName, + counterpartyIban, + description, + reference + } -> + return $ + L.Tx + { cleared = Just base.date, + commodityId = eucId, + debit = M.singleton virtCheckingAcc amount, + credit = M.singleton virtCounterparty amount, + labels = + fromList + [ IbanLabel CounterpartyIbanTag ==> counterpartyIban, + TextLabel CounterpartyNameTag ==> counterpartyName, + TextLabel DescTag ==> description, + TextLabel ReferenceTag ==> reference + ] + } + IdealDebit + { counterpartyName, + counterpartyIban, + description, + timestamp, + reference + } -> + return $ + L.Tx + { cleared = Just base.date, + commodityId = eucId, + debit = M.singleton virtCheckingAcc amount, + credit = M.singleton virtCounterparty amount, + labels = + fromList + [ IbanLabel CounterpartyIbanTag ==> counterpartyIban, + TextLabel CounterpartyNameTag ==> counterpartyName, + TextLabel DescTag ==> description, + TextLabel ReferenceTag ==> reference, + TimestampLabel ==> timestamp + ] + } + BatchPayment + { counterpartyName, + counterpartyIban, + description, + reference + } -> + return $ + L.Tx + { cleared = Just base.date, + commodityId = eucId, + debit = M.singleton virtCheckingAcc amount, + credit = M.singleton virtCounterparty amount, + labels = + fromList + [ IbanLabel CounterpartyIbanTag ==> counterpartyIban, + TextLabel CounterpartyNameTag ==> counterpartyName, + TextLabel DescTag ==> description, + TextLabel ReferenceTag ==> reference + ] + } -- cgit v1.2.3