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)