summaryrefslogtreecommitdiffstats
path: root/lib/convert.ml
diff options
context:
space:
mode:
authorRutger Broekhoff2025-11-27 23:35:08 +0100
committerRutger Broekhoff2025-11-27 23:35:08 +0100
commit46169ec3eb38e177cafd7faf6338d36c6a9e3971 (patch)
treeff4147b884c2f5533d5a7bae3f1211af43dc14a4 /lib/convert.ml
parent80e1f41596ca9955b432addbf01b913d864aa7c0 (diff)
downloadrdcapsis-46169ec3eb38e177cafd7faf6338d36c6a9e3971.tar.gz
rdcapsis-46169ec3eb38e177cafd7faf6338d36c6a9e3971.zip
Whatever all of this isocaml
Diffstat (limited to 'lib/convert.ml')
-rw-r--r--lib/convert.ml90
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
12let cents n = Amount (Money.of_z n) 12let cents n = Amount (Money.of_z n)
13 13
14let tx_from_current_acc euc_id (Ingcsv.Tx (base, spec)) = 14let 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
167let 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
174let les_from_current_acc euc_id tx = 147let 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' ]