From b8fbaa53b912347b3b50cac3e913a142db460b0a Mon Sep 17 00:00:00 2001 From: Rutger Broekhoff Date: Mon, 25 Aug 2025 23:39:51 +0200 Subject: Conversion --- lib/convert.ml | 164 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 164 insertions(+) create mode 100644 lib/convert.ml (limited to 'lib/convert.ml') diff --git a/lib/convert.ml b/lib/convert.ml new file mode 100644 index 0000000..cbdb90f --- /dev/null +++ b/lib/convert.ml @@ -0,0 +1,164 @@ +open Core +open Ledger + +let virt_checking_acc = [ "Unfiled"; "Checking" ] +let virt_savings_acc = [ "Unfiled"; "Savings" ] +let virt_counterparty = [ "Unfiled"; "Counterparty" ] + +(* TODO: clean up *) +type convert_err = Nonpositive_amount | Other of Tx.error + +let cents n = Amount (Money.of_z n) + +let tx_from_current_acc euc_id (Ingcsv.Tx (base, spec)) = + if Z.(lt base.amount ~$0) then Error Nonpositive_amount + else + Result.map_error ~f:(fun e -> Other e) + @@ + match spec with + | Payment_terminal_payment details -> + Tx.make ~cleared:(Some base.date) ~commodity_id:euc_id + ~credit: + (Account_id_map.singleton virt_checking_acc @@ cents base.amount) + ~debit: + (Account_id_map.singleton virt_counterparty @@ cents base.amount) + ~labels: + Labels.( + empty + |> add (Iban_label Account_tag) base.account + |> add (String_label Counterparty_name_tag) + details.counterparty_name + |> add (String_label Card_seq_no_tag) details.card_sequence_no + |> add (String_label Terminal_tag) details.terminal + |> add (String_label Transaction_tag) details.transaction + |> add Timestamp_label details.timestamp + |> + if details.google_pay then add (Unit_label Google_pay_tag) () + else Fn.id) + | Payment_terminal_cashback details -> + Tx.make ~cleared:(Some base.date) ~commodity_id:euc_id + ~debit: + (Account_id_map.singleton virt_checking_acc @@ cents base.amount) + ~credit: + (Account_id_map.singleton virt_counterparty @@ cents base.amount) + ~labels: + Labels.( + empty + |> add (Iban_label Account_tag) base.account + |> add (String_label Counterparty_name_tag) + details.counterparty_name + |> add (String_label Card_seq_no_tag) details.card_sequence_no + |> add (String_label Terminal_tag) details.terminal + |> add (String_label Transaction_tag) details.transaction + |> add Timestamp_label details.timestamp) + | Online_banking_credit details -> + Tx.make ~cleared:(Some base.date) ~commodity_id:euc_id + ~debit: + (Account_id_map.singleton virt_checking_acc @@ cents base.amount) + ~credit: + (Account_id_map.singleton virt_counterparty @@ cents base.amount) + ~labels: + Labels.( + empty + |> add (Iban_label Account_tag) base.account + |> add (String_label Counterparty_name_tag) + details.counterparty_name + |> add (Iban_label Counterparty_iban_tag) + details.counterparty_iban + |> add (String_label Desc_tag) details.description + |> add Timestamp_label details.timestamp) + | Online_banking_debit details -> + Tx.make ~cleared:(Some base.date) ~commodity_id:euc_id + ~debit: + (Account_id_map.singleton virt_counterparty @@ cents base.amount) + ~credit: + (Account_id_map.singleton virt_checking_acc @@ cents base.amount) + ~labels: + Labels.( + empty + |> add (Iban_label Account_tag) base.account + |> add (String_label Counterparty_name_tag) + details.counterparty_name + |> add (Iban_label Counterparty_iban_tag) + details.counterparty_iban + |> add (String_label Desc_tag) details.description) + | Recurrent_direct_debit details -> + Tx.make ~cleared:(Some base.date) ~commodity_id:euc_id + ~debit: + (Account_id_map.singleton virt_counterparty @@ cents base.amount) + ~credit: + (Account_id_map.singleton virt_checking_acc @@ cents base.amount) + ~labels: + Labels.( + empty + |> add (Iban_label Account_tag) base.account + |> add (Iban_label Counterparty_iban_tag) + details.counterparty_iban + |> add (String_label Counterparty_name_tag) + details.counterparty_name + |> add (String_label Desc_tag) details.description + |> add (String_label Reference_tag) details.reference + |> add (String_label Mandate_id_tag) details.mandate_id + |> add (String_label Creditor_id_tag) details.creditor_id + |> + match details.other_party with + | None -> Fn.id + | Some other_party -> + add (String_label Other_party_tag) other_party) + | Rounding_savings_deposit details -> + Tx.make ~cleared:(Some base.date) ~commodity_id:euc_id + ~debit: + (Account_id_map.singleton virt_counterparty @@ cents base.amount) + ~credit: + (Account_id_map.singleton virt_checking_acc @@ cents base.amount) + ~labels: + Labels.( + empty + |> add (Unit_label Auto_round_savings_tag) () + |> add (String_label Savings_account_tag) details.savings_account) + | Deposit details -> + Tx.make ~cleared:(Some base.date) ~commodity_id:euc_id + ~debit: + (Account_id_map.singleton virt_checking_acc @@ cents base.amount) + ~credit: + (Account_id_map.singleton virt_counterparty @@ cents base.amount) + ~labels: + Labels.( + empty + |> add (Iban_label Counterparty_iban_tag) + details.counterparty_iban + |> add (String_label Counterparty_name_tag) + details.counterparty_name + |> add (String_label Desc_tag) details.description + |> add (String_label Reference_tag) details.reference) + | Ideal_debit details -> + Tx.make ~cleared:(Some base.date) ~commodity_id:euc_id + ~debit: + (Account_id_map.singleton virt_counterparty @@ cents base.amount) + ~credit: + (Account_id_map.singleton virt_checking_acc @@ cents base.amount) + ~labels: + Labels.( + empty + |> add (Iban_label Counterparty_iban_tag) + details.counterparty_iban + |> add (String_label Counterparty_name_tag) + details.counterparty_name + |> add (String_label Desc_tag) details.description + |> add (String_label Reference_tag) details.reference + |> add Timestamp_label details.timestamp) + | Batch_payment details -> + Tx.make ~cleared:(Some base.date) ~commodity_id:euc_id + ~debit: + (Account_id_map.singleton virt_counterparty @@ cents base.amount) + ~credit: + (Account_id_map.singleton virt_checking_acc @@ cents base.amount) + ~labels: + Labels.( + empty + |> add (Iban_label Counterparty_iban_tag) + details.counterparty_iban + |> add (String_label Counterparty_name_tag) + details.counterparty_name + |> add (String_label Desc_tag) details.description + |> add (String_label Reference_tag) details.reference) -- cgit v1.2.3