diff options
author | Rutger Broekhoff | 2025-08-25 23:39:51 +0200 |
---|---|---|
committer | Rutger Broekhoff | 2025-08-25 23:39:51 +0200 |
commit | b8fbaa53b912347b3b50cac3e913a142db460b0a (patch) | |
tree | 4563ebc8b04a4ad841ad2103d8ddc0698e844a45 /lib/convert.ml | |
parent | 3f5221c2da2a19cf5de05284821e9b854d31b7fb (diff) | |
download | rdcapsis-b8fbaa53b912347b3b50cac3e913a142db460b0a.tar.gz rdcapsis-b8fbaa53b912347b3b50cac3e913a142db460b0a.zip |
Conversion
Diffstat (limited to 'lib/convert.ml')
-rw-r--r-- | lib/convert.ml | 164 |
1 files changed, 164 insertions, 0 deletions
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 @@ | |||
1 | open Core | ||
2 | open Ledger | ||
3 | |||
4 | let virt_checking_acc = [ "Unfiled"; "Checking" ] | ||
5 | let virt_savings_acc = [ "Unfiled"; "Savings" ] | ||
6 | let virt_counterparty = [ "Unfiled"; "Counterparty" ] | ||
7 | |||
8 | (* TODO: clean up *) | ||
9 | type convert_err = Nonpositive_amount | Other of Tx.error | ||
10 | |||
11 | let cents n = Amount (Money.of_z n) | ||
12 | |||
13 | let tx_from_current_acc euc_id (Ingcsv.Tx (base, spec)) = | ||
14 | if Z.(lt base.amount ~$0) then Error Nonpositive_amount | ||
15 | else | ||
16 | Result.map_error ~f:(fun e -> Other e) | ||
17 | @@ | ||
18 | match spec with | ||
19 | | Payment_terminal_payment details -> | ||
20 | Tx.make ~cleared:(Some base.date) ~commodity_id:euc_id | ||
21 | ~credit: | ||
22 | (Account_id_map.singleton virt_checking_acc @@ cents base.amount) | ||
23 | ~debit: | ||
24 | (Account_id_map.singleton virt_counterparty @@ cents base.amount) | ||
25 | ~labels: | ||
26 | Labels.( | ||
27 | empty | ||
28 | |> add (Iban_label Account_tag) base.account | ||
29 | |> add (String_label Counterparty_name_tag) | ||
30 | details.counterparty_name | ||
31 | |> add (String_label Card_seq_no_tag) details.card_sequence_no | ||
32 | |> add (String_label Terminal_tag) details.terminal | ||
33 | |> add (String_label Transaction_tag) details.transaction | ||
34 | |> add Timestamp_label details.timestamp | ||
35 | |> | ||
36 | if details.google_pay then add (Unit_label Google_pay_tag) () | ||
37 | else Fn.id) | ||
38 | | Payment_terminal_cashback details -> | ||
39 | Tx.make ~cleared:(Some base.date) ~commodity_id:euc_id | ||
40 | ~debit: | ||
41 | (Account_id_map.singleton virt_checking_acc @@ cents base.amount) | ||
42 | ~credit: | ||
43 | (Account_id_map.singleton virt_counterparty @@ cents base.amount) | ||
44 | ~labels: | ||
45 | Labels.( | ||
46 | empty | ||
47 | |> add (Iban_label Account_tag) base.account | ||
48 | |> add (String_label Counterparty_name_tag) | ||
49 | details.counterparty_name | ||
50 | |> add (String_label Card_seq_no_tag) details.card_sequence_no | ||
51 | |> add (String_label Terminal_tag) details.terminal | ||
52 | |> add (String_label Transaction_tag) details.transaction | ||
53 | |> add Timestamp_label details.timestamp) | ||
54 | | Online_banking_credit details -> | ||
55 | Tx.make ~cleared:(Some base.date) ~commodity_id:euc_id | ||
56 | ~debit: | ||
57 | (Account_id_map.singleton virt_checking_acc @@ cents base.amount) | ||
58 | ~credit: | ||
59 | (Account_id_map.singleton virt_counterparty @@ cents base.amount) | ||
60 | ~labels: | ||
61 | Labels.( | ||
62 | empty | ||
63 | |> add (Iban_label Account_tag) base.account | ||
64 | |> add (String_label Counterparty_name_tag) | ||
65 | details.counterparty_name | ||
66 | |> add (Iban_label Counterparty_iban_tag) | ||
67 | details.counterparty_iban | ||
68 | |> add (String_label Desc_tag) details.description | ||
69 | |> add Timestamp_label details.timestamp) | ||
70 | | Online_banking_debit details -> | ||
71 | Tx.make ~cleared:(Some base.date) ~commodity_id:euc_id | ||
72 | ~debit: | ||
73 | (Account_id_map.singleton virt_counterparty @@ cents base.amount) | ||
74 | ~credit: | ||
75 | (Account_id_map.singleton virt_checking_acc @@ cents base.amount) | ||
76 | ~labels: | ||
77 | Labels.( | ||
78 | empty | ||
79 | |> add (Iban_label Account_tag) base.account | ||
80 | |> add (String_label Counterparty_name_tag) | ||
81 | details.counterparty_name | ||
82 | |> add (Iban_label Counterparty_iban_tag) | ||
83 | details.counterparty_iban | ||
84 | |> add (String_label Desc_tag) details.description) | ||
85 | | Recurrent_direct_debit details -> | ||
86 | Tx.make ~cleared:(Some base.date) ~commodity_id:euc_id | ||
87 | ~debit: | ||
88 | (Account_id_map.singleton virt_counterparty @@ cents base.amount) | ||
89 | ~credit: | ||
90 | (Account_id_map.singleton virt_checking_acc @@ cents base.amount) | ||
91 | ~labels: | ||
92 | Labels.( | ||
93 | empty | ||
94 | |> add (Iban_label Account_tag) base.account | ||
95 | |> add (Iban_label Counterparty_iban_tag) | ||
96 | details.counterparty_iban | ||
97 | |> add (String_label Counterparty_name_tag) | ||
98 | details.counterparty_name | ||
99 | |> add (String_label Desc_tag) details.description | ||
100 | |> add (String_label Reference_tag) details.reference | ||
101 | |> add (String_label Mandate_id_tag) details.mandate_id | ||
102 | |> add (String_label Creditor_id_tag) details.creditor_id | ||
103 | |> | ||
104 | match details.other_party with | ||
105 | | None -> Fn.id | ||
106 | | Some other_party -> | ||
107 | add (String_label Other_party_tag) other_party) | ||
108 | | Rounding_savings_deposit details -> | ||
109 | Tx.make ~cleared:(Some base.date) ~commodity_id:euc_id | ||
110 | ~debit: | ||
111 | (Account_id_map.singleton virt_counterparty @@ cents base.amount) | ||
112 | ~credit: | ||
113 | (Account_id_map.singleton virt_checking_acc @@ cents base.amount) | ||
114 | ~labels: | ||
115 | Labels.( | ||
116 | empty | ||
117 | |> add (Unit_label Auto_round_savings_tag) () | ||
118 | |> add (String_label Savings_account_tag) details.savings_account) | ||
119 | | Deposit details -> | ||
120 | Tx.make ~cleared:(Some base.date) ~commodity_id:euc_id | ||
121 | ~debit: | ||
122 | (Account_id_map.singleton virt_checking_acc @@ cents base.amount) | ||
123 | ~credit: | ||
124 | (Account_id_map.singleton virt_counterparty @@ cents base.amount) | ||
125 | ~labels: | ||
126 | Labels.( | ||
127 | empty | ||
128 | |> add (Iban_label Counterparty_iban_tag) | ||
129 | details.counterparty_iban | ||
130 | |> add (String_label Counterparty_name_tag) | ||
131 | details.counterparty_name | ||
132 | |> add (String_label Desc_tag) details.description | ||
133 | |> add (String_label Reference_tag) details.reference) | ||
134 | | Ideal_debit details -> | ||
135 | Tx.make ~cleared:(Some base.date) ~commodity_id:euc_id | ||
136 | ~debit: | ||
137 | (Account_id_map.singleton virt_counterparty @@ cents base.amount) | ||
138 | ~credit: | ||
139 | (Account_id_map.singleton virt_checking_acc @@ cents base.amount) | ||
140 | ~labels: | ||
141 | Labels.( | ||
142 | empty | ||
143 | |> add (Iban_label Counterparty_iban_tag) | ||
144 | details.counterparty_iban | ||
145 | |> add (String_label Counterparty_name_tag) | ||
146 | details.counterparty_name | ||
147 | |> add (String_label Desc_tag) details.description | ||
148 | |> add (String_label Reference_tag) details.reference | ||
149 | |> add Timestamp_label details.timestamp) | ||
150 | | Batch_payment details -> | ||
151 | Tx.make ~cleared:(Some base.date) ~commodity_id:euc_id | ||
152 | ~debit: | ||
153 | (Account_id_map.singleton virt_counterparty @@ cents base.amount) | ||
154 | ~credit: | ||
155 | (Account_id_map.singleton virt_checking_acc @@ cents base.amount) | ||
156 | ~labels: | ||
157 | Labels.( | ||
158 | empty | ||
159 | |> add (Iban_label Counterparty_iban_tag) | ||
160 | details.counterparty_iban | ||
161 | |> add (String_label Counterparty_name_tag) | ||
162 | details.counterparty_name | ||
163 | |> add (String_label Desc_tag) details.description | ||
164 | |> add (String_label Reference_tag) details.reference) | ||