summaryrefslogtreecommitdiffstats
path: root/lib/ingcsv.ml
diff options
context:
space:
mode:
authorRutger Broekhoff2025-08-26 00:35:27 +0200
committerRutger Broekhoff2025-08-26 00:35:27 +0200
commite6873458facadea0dfb228bb33291d6baf68c427 (patch)
tree9ca19e2bbb12d92447f654a92280a6048383ebba /lib/ingcsv.ml
parentb8fbaa53b912347b3b50cac3e913a142db460b0a (diff)
downloadrdcapsis-e6873458facadea0dfb228bb33291d6baf68c427.tar.gz
rdcapsis-e6873458facadea0dfb228bb33291d6baf68c427.zip
Basic import seems to be working
Diffstat (limited to 'lib/ingcsv.ml')
-rw-r--r--lib/ingcsv.ml30
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
3module Time_ns = Time_ns_unix 3module Time_ns = Time_ns_unix
4 4
5module Debit_credit = struct 5module 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"
14end 7end
15 8
16module Cents = struct 9module 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
213let assert_value_date (ptx : Primitive_tx.t) d = 207let 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
350let parse_credit_transfer_notifs notifs = 344let 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
557let tx_from_prim ptx ~ams_tz : (tx, parse_err) result = 551type parse_err_ext = Transaction_type.t * Debit_credit.t * parse_err
552[@@deriving sexp_of]
553
554let 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
562type csv_err = Parse_err of parse_err | Exn of exn 562type csv_err = Parse_err of parse_err_ext | Exn of exn
563 563
564module List = struct 564module 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)