diff options
author | Rutger Broekhoff | 2025-08-26 00:35:27 +0200 |
---|---|---|
committer | Rutger Broekhoff | 2025-08-26 00:35:27 +0200 |
commit | e6873458facadea0dfb228bb33291d6baf68c427 (patch) | |
tree | 9ca19e2bbb12d92447f654a92280a6048383ebba /lib/ingcsv.ml | |
parent | b8fbaa53b912347b3b50cac3e913a142db460b0a (diff) | |
download | rdcapsis-e6873458facadea0dfb228bb33291d6baf68c427.tar.gz rdcapsis-e6873458facadea0dfb228bb33291d6baf68c427.zip |
Basic import seems to be working
Diffstat (limited to 'lib/ingcsv.ml')
-rw-r--r-- | lib/ingcsv.ml | 30 |
1 files changed, 15 insertions, 15 deletions
diff --git a/lib/ingcsv.ml b/lib/ingcsv.ml index f3536bf..53258fe 100644 --- a/lib/ingcsv.ml +++ b/lib/ingcsv.ml | |||
@@ -3,14 +3,7 @@ open Result.Let_syntax | |||
3 | module Time_ns = Time_ns_unix | 3 | module Time_ns = Time_ns_unix |
4 | 4 | ||
5 | module Debit_credit = struct | 5 | module Debit_credit = struct |
6 | type t = Debit | Credit | 6 | type t = Debit | Credit [@@deriving string, sexp_of] |
7 | |||
8 | let of_string = function | ||
9 | | "Debit" -> Debit | ||
10 | | "Credit" -> Credit | ||
11 | | s -> Printf.failwithf "Debit_credit.of_string: %S" s () | ||
12 | |||
13 | let to_string = function Debit -> "Debit" | Credit -> "Credit" | ||
14 | end | 7 | end |
15 | 8 | ||
16 | module Cents = struct | 9 | module Cents = struct |
@@ -38,7 +31,7 @@ module Transaction_type = struct | |||
38 | | Phone_banking (* GF (telefonisch bankieren, Girofoon) *) | 31 | | Phone_banking (* GF (telefonisch bankieren, Girofoon) *) |
39 | | Transfer (* OV (overboeking); 'Transfer' *) | 32 | | Transfer (* OV (overboeking); 'Transfer' *) |
40 | | Various (* DV (diversen) *) | 33 | | Various (* DV (diversen) *) |
41 | [@@deriving equal, string] | 34 | [@@deriving equal, string, sexp_of] |
42 | 35 | ||
43 | let of_code = function | 36 | let of_code = function |
44 | | "AC" -> Accept_giro | 37 | | "AC" -> Accept_giro |
@@ -209,6 +202,7 @@ type parse_err = | |||
209 | | Inconsistent_counterparty_name | 202 | | Inconsistent_counterparty_name |
210 | | Inconsistent_counterparty_iban | 203 | | Inconsistent_counterparty_iban |
211 | | Inconsistent_transaction_code | 204 | | Inconsistent_transaction_code |
205 | [@@deriving string, sexp_of] | ||
212 | 206 | ||
213 | let assert_value_date (ptx : Primitive_tx.t) d = | 207 | let assert_value_date (ptx : Primitive_tx.t) d = |
214 | if Date.(d = ptx.date) then Ok () else Error Inconsistent_value_date | 208 | if Date.(d = ptx.date) then Ok () else Error Inconsistent_value_date |
@@ -348,7 +342,7 @@ let credit_transfer_rex = | |||
348 | date: ([0-9]{2}/[0-9]{2}/[0-9]{4})$" | 342 | date: ([0-9]{2}/[0-9]{2}/[0-9]{4})$" |
349 | 343 | ||
350 | let parse_credit_transfer_notifs notifs = | 344 | let parse_credit_transfer_notifs notifs = |
351 | match Re.Pcre.extract ~rex:normal_direct_debit_rex notifs with | 345 | match Re.Pcre.extract ~rex:credit_transfer_rex notifs with |
352 | | [| _; name; desc; iban_str; ref_; val_date_str |] -> | 346 | | [| _; name; desc; iban_str; ref_; val_date_str |] -> |
353 | let%map iban = parse_iban iban_str | 347 | let%map iban = parse_iban iban_str |
354 | and val_date = parse_val_date val_date_str in | 348 | and val_date = parse_val_date val_date_str in |
@@ -554,12 +548,18 @@ let tx_base_from_prim (ptx : Primitive_tx.t) : tx_base = | |||
554 | tag = ptx.tag; | 548 | tag = ptx.tag; |
555 | } | 549 | } |
556 | 550 | ||
557 | let tx_from_prim ptx ~ams_tz : (tx, parse_err) result = | 551 | type parse_err_ext = Transaction_type.t * Debit_credit.t * parse_err |
552 | [@@deriving sexp_of] | ||
553 | |||
554 | let tx_from_prim ptx ~ams_tz : (tx, parse_err_ext) result = | ||
558 | let base = tx_base_from_prim ptx in | 555 | let base = tx_base_from_prim ptx in |
559 | let%map specifics = tx_specifics_from_prim ams_tz ptx in | 556 | let%map specifics = |
557 | Result.map_error (tx_specifics_from_prim ams_tz ptx) ~f:(fun e -> | ||
558 | (ptx.type_, ptx.debit_credit, e)) | ||
559 | in | ||
560 | Tx (base, specifics) | 560 | Tx (base, specifics) |
561 | 561 | ||
562 | type csv_err = Parse_err of parse_err | Exn of exn | 562 | type csv_err = Parse_err of parse_err_ext | Exn of exn |
563 | 563 | ||
564 | module List = struct | 564 | module List = struct |
565 | include List | 565 | include List |
@@ -580,8 +580,8 @@ let read_channel (c : In_channel.t) ~ams_tz : (tx list, csv_err) result = | |||
580 | let%bind ptxs = | 580 | let%bind ptxs = |
581 | try | 581 | try |
582 | Ok | 582 | Ok |
583 | (Delimited.Read.read_lines ~header:(`Require Primitive_tx.headers) | 583 | (Delimited.Read.read_lines ~sep:';' |
584 | Primitive_tx.parse c) | 584 | ~header:(`Require Primitive_tx.headers) Primitive_tx.parse c) |
585 | with e -> Error (Exn e) | 585 | with e -> Error (Exn e) |
586 | in | 586 | in |
587 | List.map_result ptxs ~f:(tx_from_prim ~ams_tz) | 587 | List.map_result ptxs ~f:(tx_from_prim ~ams_tz) |