diff options
Diffstat (limited to 'lib/convert.ml')
| -rw-r--r-- | lib/convert.ml | 90 |
1 files changed, 31 insertions, 59 deletions
diff --git a/lib/convert.ml b/lib/convert.ml index 5afc95e..5411fcc 100644 --- a/lib/convert.ml +++ b/lib/convert.ml | |||
| @@ -12,6 +12,18 @@ type convert_err = Nonpositive_amount | Other of Tx.error | |||
| 12 | let cents n = Amount (Money.of_z n) | 12 | let cents n = Amount (Money.of_z n) |
| 13 | 13 | ||
| 14 | let tx_from_current_acc euc_id (Ingcsv.Tx (base, spec)) = | 14 | let tx_from_current_acc euc_id (Ingcsv.Tx (base, spec)) = |
| 15 | let make_tx_entries ~on_checking = | ||
| 16 | Account_id_map.of_alist_exn | ||
| 17 | [ | ||
| 18 | ( virt_checking_acc, | ||
| 19 | ( on_checking, | ||
| 20 | cents base.amount, | ||
| 21 | Some (Money.of_z base.resulting_balance) ) ); | ||
| 22 | ( virt_counterparty, | ||
| 23 | (Debit_credit.opposite on_checking, cents base.amount, None) ); | ||
| 24 | ] | ||
| 25 | and base_labels = Labels.singleton (Iban_label Account_tag) base.account in | ||
| 26 | |||
| 15 | if Z.(lt base.amount ~$0) then Error Nonpositive_amount | 27 | if Z.(lt base.amount ~$0) then Error Nonpositive_amount |
| 16 | else | 28 | else |
| 17 | Result.map_error ~f:(fun e -> Other e) | 29 | Result.map_error ~f:(fun e -> Other e) |
| @@ -19,14 +31,10 @@ let tx_from_current_acc euc_id (Ingcsv.Tx (base, spec)) = | |||
| 19 | match spec with | 31 | match spec with |
| 20 | | Payment_terminal_payment details -> | 32 | | Payment_terminal_payment details -> |
| 21 | Tx.make ~cleared:(Some base.date) ~commodity_id:euc_id | 33 | Tx.make ~cleared:(Some base.date) ~commodity_id:euc_id |
| 22 | ~credit: | 34 | ~entries:(make_tx_entries ~on_checking:Debit_credit.Credit) |
| 23 | (Account_id_map.singleton virt_checking_acc @@ cents base.amount) | ||
| 24 | ~debit: | ||
| 25 | (Account_id_map.singleton virt_counterparty @@ cents base.amount) | ||
| 26 | ~labels: | 35 | ~labels: |
| 27 | Labels.( | 36 | Labels.( |
| 28 | empty | 37 | base_labels |
| 29 | |> add (Iban_label Account_tag) base.account | ||
| 30 | |> add (String_label Counterparty_name_tag) | 38 | |> add (String_label Counterparty_name_tag) |
| 31 | details.counterparty_name | 39 | details.counterparty_name |
| 32 | |> add (String_label Card_seq_no_tag) details.card_sequence_no | 40 | |> add (String_label Card_seq_no_tag) details.card_sequence_no |
| @@ -38,14 +46,10 @@ let tx_from_current_acc euc_id (Ingcsv.Tx (base, spec)) = | |||
| 38 | else Fn.id) | 46 | else Fn.id) |
| 39 | | Payment_terminal_cashback details -> | 47 | | Payment_terminal_cashback details -> |
| 40 | Tx.make ~cleared:(Some base.date) ~commodity_id:euc_id | 48 | Tx.make ~cleared:(Some base.date) ~commodity_id:euc_id |
| 41 | ~debit: | 49 | ~entries:(make_tx_entries ~on_checking:Debit_credit.Debit) |
| 42 | (Account_id_map.singleton virt_checking_acc @@ cents base.amount) | ||
| 43 | ~credit: | ||
| 44 | (Account_id_map.singleton virt_counterparty @@ cents base.amount) | ||
| 45 | ~labels: | 50 | ~labels: |
| 46 | Labels.( | 51 | Labels.( |
| 47 | empty | 52 | base_labels |
| 48 | |> add (Iban_label Account_tag) base.account | ||
| 49 | |> add (String_label Counterparty_name_tag) | 53 | |> add (String_label Counterparty_name_tag) |
| 50 | details.counterparty_name | 54 | details.counterparty_name |
| 51 | |> add (String_label Card_seq_no_tag) details.card_sequence_no | 55 | |> add (String_label Card_seq_no_tag) details.card_sequence_no |
| @@ -54,14 +58,10 @@ let tx_from_current_acc euc_id (Ingcsv.Tx (base, spec)) = | |||
| 54 | |> add Timestamp_label details.timestamp) | 58 | |> add Timestamp_label details.timestamp) |
| 55 | | Online_banking_credit details -> | 59 | | Online_banking_credit details -> |
| 56 | Tx.make ~cleared:(Some base.date) ~commodity_id:euc_id | 60 | Tx.make ~cleared:(Some base.date) ~commodity_id:euc_id |
| 57 | ~debit: | 61 | ~entries:(make_tx_entries ~on_checking:Debit_credit.Debit) |
| 58 | (Account_id_map.singleton virt_checking_acc @@ cents base.amount) | ||
| 59 | ~credit: | ||
| 60 | (Account_id_map.singleton virt_counterparty @@ cents base.amount) | ||
| 61 | ~labels: | 62 | ~labels: |
| 62 | Labels.( | 63 | Labels.( |
| 63 | empty | 64 | base_labels |
| 64 | |> add (Iban_label Account_tag) base.account | ||
| 65 | |> add (String_label Counterparty_name_tag) | 65 | |> add (String_label Counterparty_name_tag) |
| 66 | details.counterparty_name | 66 | details.counterparty_name |
| 67 | |> add (Iban_label Counterparty_iban_tag) | 67 | |> add (Iban_label Counterparty_iban_tag) |
| @@ -70,14 +70,10 @@ let tx_from_current_acc euc_id (Ingcsv.Tx (base, spec)) = | |||
| 70 | |> add Timestamp_label details.timestamp) | 70 | |> add Timestamp_label details.timestamp) |
| 71 | | Online_banking_debit details -> | 71 | | Online_banking_debit details -> |
| 72 | Tx.make ~cleared:(Some base.date) ~commodity_id:euc_id | 72 | Tx.make ~cleared:(Some base.date) ~commodity_id:euc_id |
| 73 | ~debit: | 73 | ~entries:(make_tx_entries ~on_checking:Debit_credit.Credit) |
| 74 | (Account_id_map.singleton virt_counterparty @@ cents base.amount) | ||
| 75 | ~credit: | ||
| 76 | (Account_id_map.singleton virt_checking_acc @@ cents base.amount) | ||
| 77 | ~labels: | 74 | ~labels: |
| 78 | Labels.( | 75 | Labels.( |
| 79 | empty | 76 | base_labels |
| 80 | |> add (Iban_label Account_tag) base.account | ||
| 81 | |> add (String_label Counterparty_name_tag) | 77 | |> add (String_label Counterparty_name_tag) |
| 82 | details.counterparty_name | 78 | details.counterparty_name |
| 83 | |> add (Iban_label Counterparty_iban_tag) | 79 | |> add (Iban_label Counterparty_iban_tag) |
| @@ -85,14 +81,10 @@ let tx_from_current_acc euc_id (Ingcsv.Tx (base, spec)) = | |||
| 85 | |> add (String_label Desc_tag) details.description) | 81 | |> add (String_label Desc_tag) details.description) |
| 86 | | Recurrent_direct_debit details -> | 82 | | Recurrent_direct_debit details -> |
| 87 | Tx.make ~cleared:(Some base.date) ~commodity_id:euc_id | 83 | Tx.make ~cleared:(Some base.date) ~commodity_id:euc_id |
| 88 | ~debit: | 84 | ~entries:(make_tx_entries ~on_checking:Debit_credit.Credit) |
| 89 | (Account_id_map.singleton virt_counterparty @@ cents base.amount) | ||
| 90 | ~credit: | ||
| 91 | (Account_id_map.singleton virt_checking_acc @@ cents base.amount) | ||
| 92 | ~labels: | 85 | ~labels: |
| 93 | Labels.( | 86 | Labels.( |
| 94 | empty | 87 | base_labels |
| 95 | |> add (Iban_label Account_tag) base.account | ||
| 96 | |> add (Iban_label Counterparty_iban_tag) | 88 | |> add (Iban_label Counterparty_iban_tag) |
| 97 | details.counterparty_iban | 89 | details.counterparty_iban |
| 98 | |> add (String_label Counterparty_name_tag) | 90 | |> add (String_label Counterparty_name_tag) |
| @@ -108,24 +100,18 @@ let tx_from_current_acc euc_id (Ingcsv.Tx (base, spec)) = | |||
| 108 | add (String_label Other_party_tag) other_party) | 100 | add (String_label Other_party_tag) other_party) |
| 109 | | Rounding_savings_deposit details -> | 101 | | Rounding_savings_deposit details -> |
| 110 | Tx.make ~cleared:(Some base.date) ~commodity_id:euc_id | 102 | Tx.make ~cleared:(Some base.date) ~commodity_id:euc_id |
| 111 | ~debit: | 103 | ~entries:(make_tx_entries ~on_checking:Debit_credit.Credit) |
| 112 | (Account_id_map.singleton virt_counterparty @@ cents base.amount) | ||
| 113 | ~credit: | ||
| 114 | (Account_id_map.singleton virt_checking_acc @@ cents base.amount) | ||
| 115 | ~labels: | 104 | ~labels: |
| 116 | Labels.( | 105 | Labels.( |
| 117 | empty | 106 | base_labels |
| 118 | |> add (Unit_label Auto_round_savings_tag) () | 107 | |> add (Unit_label Auto_round_savings_tag) () |
| 119 | |> add (String_label Savings_account_tag) details.savings_account) | 108 | |> add (String_label Savings_account_tag) details.savings_account) |
| 120 | | Deposit details -> | 109 | | Deposit details -> |
| 121 | Tx.make ~cleared:(Some base.date) ~commodity_id:euc_id | 110 | Tx.make ~cleared:(Some base.date) ~commodity_id:euc_id |
| 122 | ~debit: | 111 | ~entries:(make_tx_entries ~on_checking:Debit_credit.Debit) |
| 123 | (Account_id_map.singleton virt_checking_acc @@ cents base.amount) | ||
| 124 | ~credit: | ||
| 125 | (Account_id_map.singleton virt_counterparty @@ cents base.amount) | ||
| 126 | ~labels: | 112 | ~labels: |
| 127 | Labels.( | 113 | Labels.( |
| 128 | empty | 114 | base_labels |
| 129 | |> add (Iban_label Counterparty_iban_tag) | 115 | |> add (Iban_label Counterparty_iban_tag) |
| 130 | details.counterparty_iban | 116 | details.counterparty_iban |
| 131 | |> add (String_label Counterparty_name_tag) | 117 | |> add (String_label Counterparty_name_tag) |
| @@ -134,13 +120,10 @@ let tx_from_current_acc euc_id (Ingcsv.Tx (base, spec)) = | |||
| 134 | |> add (String_label Reference_tag) details.reference) | 120 | |> add (String_label Reference_tag) details.reference) |
| 135 | | Ideal_debit details -> | 121 | | Ideal_debit details -> |
| 136 | Tx.make ~cleared:(Some base.date) ~commodity_id:euc_id | 122 | Tx.make ~cleared:(Some base.date) ~commodity_id:euc_id |
| 137 | ~debit: | 123 | ~entries:(make_tx_entries ~on_checking:Debit_credit.Credit) |
| 138 | (Account_id_map.singleton virt_counterparty @@ cents base.amount) | ||
| 139 | ~credit: | ||
| 140 | (Account_id_map.singleton virt_checking_acc @@ cents base.amount) | ||
| 141 | ~labels: | 124 | ~labels: |
| 142 | Labels.( | 125 | Labels.( |
| 143 | empty | 126 | base_labels |
| 144 | |> add (Iban_label Counterparty_iban_tag) | 127 | |> add (Iban_label Counterparty_iban_tag) |
| 145 | details.counterparty_iban | 128 | details.counterparty_iban |
| 146 | |> add (String_label Counterparty_name_tag) | 129 | |> add (String_label Counterparty_name_tag) |
| @@ -150,13 +133,10 @@ let tx_from_current_acc euc_id (Ingcsv.Tx (base, spec)) = | |||
| 150 | |> add Timestamp_label details.timestamp) | 133 | |> add Timestamp_label details.timestamp) |
| 151 | | Batch_payment details -> | 134 | | Batch_payment details -> |
| 152 | Tx.make ~cleared:(Some base.date) ~commodity_id:euc_id | 135 | Tx.make ~cleared:(Some base.date) ~commodity_id:euc_id |
| 153 | ~debit: | 136 | ~entries:(make_tx_entries ~on_checking:Debit_credit.Debit) |
| 154 | (Account_id_map.singleton virt_counterparty @@ cents base.amount) | ||
| 155 | ~credit: | ||
| 156 | (Account_id_map.singleton virt_checking_acc @@ cents base.amount) | ||
| 157 | ~labels: | 137 | ~labels: |
| 158 | Labels.( | 138 | Labels.( |
| 159 | empty | 139 | base_labels |
| 160 | |> add (Iban_label Counterparty_iban_tag) | 140 | |> add (Iban_label Counterparty_iban_tag) |
| 161 | details.counterparty_iban | 141 | details.counterparty_iban |
| 162 | |> add (String_label Counterparty_name_tag) | 142 | |> add (String_label Counterparty_name_tag) |
| @@ -164,14 +144,6 @@ let tx_from_current_acc euc_id (Ingcsv.Tx (base, spec)) = | |||
| 164 | |> add (String_label Desc_tag) details.description | 144 | |> add (String_label Desc_tag) details.description |
| 165 | |> add (String_label Reference_tag) details.reference) | 145 | |> add (String_label Reference_tag) details.reference) |
| 166 | 146 | ||
| 167 | let ba_from_current_acc (Ingcsv.Tx (base, _)) = | ||
| 168 | { | ||
| 169 | account = virt_checking_acc; | ||
| 170 | amount = Money.of_z base.resulting_balance; | ||
| 171 | labels = Labels.(empty |> add (Iban_label Account_tag) base.account); | ||
| 172 | } | ||
| 173 | |||
| 174 | let les_from_current_acc euc_id tx = | 147 | let les_from_current_acc euc_id tx = |
| 175 | let%map tx' = tx_from_current_acc euc_id tx in | 148 | let%map tx' = tx_from_current_acc euc_id tx in |
| 176 | let ba = ba_from_current_acc tx in | 149 | [ Tx_item tx' ] |
| 177 | [ Bal_assert_item ba; Tx_item tx' ] | ||