From e6873458facadea0dfb228bb33291d6baf68c427 Mon Sep 17 00:00:00 2001 From: Rutger Broekhoff Date: Tue, 26 Aug 2025 00:35:27 +0200 Subject: Basic import seems to be working --- lib/ingcsv.ml | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) (limited to 'lib/ingcsv.ml') 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 module Time_ns = Time_ns_unix module Debit_credit = struct - type t = Debit | Credit - - let of_string = function - | "Debit" -> Debit - | "Credit" -> Credit - | s -> Printf.failwithf "Debit_credit.of_string: %S" s () - - let to_string = function Debit -> "Debit" | Credit -> "Credit" + type t = Debit | Credit [@@deriving string, sexp_of] end module Cents = struct @@ -38,7 +31,7 @@ module Transaction_type = struct | Phone_banking (* GF (telefonisch bankieren, Girofoon) *) | Transfer (* OV (overboeking); 'Transfer' *) | Various (* DV (diversen) *) - [@@deriving equal, string] + [@@deriving equal, string, sexp_of] let of_code = function | "AC" -> Accept_giro @@ -209,6 +202,7 @@ type parse_err = | Inconsistent_counterparty_name | Inconsistent_counterparty_iban | Inconsistent_transaction_code +[@@deriving string, sexp_of] let assert_value_date (ptx : Primitive_tx.t) d = if Date.(d = ptx.date) then Ok () else Error Inconsistent_value_date @@ -348,7 +342,7 @@ let credit_transfer_rex = date: ([0-9]{2}/[0-9]{2}/[0-9]{4})$" let parse_credit_transfer_notifs notifs = - match Re.Pcre.extract ~rex:normal_direct_debit_rex notifs with + match Re.Pcre.extract ~rex:credit_transfer_rex notifs with | [| _; name; desc; iban_str; ref_; val_date_str |] -> let%map iban = parse_iban iban_str 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 = tag = ptx.tag; } -let tx_from_prim ptx ~ams_tz : (tx, parse_err) result = +type parse_err_ext = Transaction_type.t * Debit_credit.t * parse_err +[@@deriving sexp_of] + +let tx_from_prim ptx ~ams_tz : (tx, parse_err_ext) result = let base = tx_base_from_prim ptx in - let%map specifics = tx_specifics_from_prim ams_tz ptx in + let%map specifics = + Result.map_error (tx_specifics_from_prim ams_tz ptx) ~f:(fun e -> + (ptx.type_, ptx.debit_credit, e)) + in Tx (base, specifics) -type csv_err = Parse_err of parse_err | Exn of exn +type csv_err = Parse_err of parse_err_ext | Exn of exn module List = struct include List @@ -580,8 +580,8 @@ let read_channel (c : In_channel.t) ~ams_tz : (tx list, csv_err) result = let%bind ptxs = try Ok - (Delimited.Read.read_lines ~header:(`Require Primitive_tx.headers) - Primitive_tx.parse c) + (Delimited.Read.read_lines ~sep:';' + ~header:(`Require Primitive_tx.headers) Primitive_tx.parse c) with e -> Error (Exn e) in List.map_result ptxs ~f:(tx_from_prim ~ams_tz) -- cgit v1.2.3