From e4ea57b21c7ab30e61a792d1ab698092555dbae1 Mon Sep 17 00:00:00 2001 From: Martin Polden Date: Tue, 1 Nov 2022 22:39:03 +0100 Subject: bulder: handle new format --- record/bulder/builder_test.go | 41 +++++++++++++++++++++++++++++++++++++++++ record/bulder/bulder.go | 19 ++++++++++++------- 2 files changed, 53 insertions(+), 7 deletions(-) diff --git a/record/bulder/builder_test.go b/record/bulder/builder_test.go index 2fa30e9..6fb525d 100644 --- a/record/bulder/builder_test.go +++ b/record/bulder/builder_test.go @@ -49,3 +49,44 @@ func TestRead(t *testing.T) { } } } + +func TestRead2(t *testing.T) { + // Different format + in := `Dato;Inn på konto;Ut fra konto;Til konto;Til kontonummer;Fra konto;Fra kontonummer;Type;Tekst;KID;Hovedkategori;Underkategori +2022-10-25;;-1050,00;;til kontonr. 11;fra konto 1;til kontonr. 1;Betaling;Vare 1;min kid;kategori 1;underkategori 1 +2022-10-25;;-2500,00;min konto 22;mitt kontonr. 2;fra konto 2;fra kontonr. 2;Betaling;Nedbetaling Lån;;Hus og hjem;Lån +` + r := NewReader(strings.NewReader(in)) + rs, err := r.Read() + if err != nil { + t.Fatal(err) + } + + var tests = []struct { + t time.Time + text string + amount int64 + balance int64 + }{ + {date(2022, 10, 25), "Betaling,Vare 1,kategori 1,underkategori 1", -105000, 0}, + {date(2022, 10, 25), "Betaling,Nedbetaling Lån,Hus og hjem,Lån", -250000, 0}, + } + if len(rs) != len(tests) { + t.Fatalf("want %d records, got %d", len(tests), len(rs)) + } + + for i, tt := range tests { + if !rs[i].Time.Equal(tt.t) { + t.Errorf("#%d: want Time = %s, got %s", i, tt.t, rs[i].Time) + } + if rs[i].Text != tt.text { + t.Errorf("#%d: want Text = %q, got %q", i, tt.text, rs[i].Text) + } + if rs[i].Amount != tt.amount { + t.Errorf("#%d: want Amount = %d, got %d", i, tt.amount, rs[i].Amount) + } + if rs[i].Balance != tt.balance { + t.Errorf("#%d: want Balance = %d, got %d", i, tt.balance, rs[i].Balance) + } + } +} diff --git a/record/bulder/bulder.go b/record/bulder/bulder.go index 3021b52..18ad792 100644 --- a/record/bulder/bulder.go +++ b/record/bulder/bulder.go @@ -31,6 +31,7 @@ func (r *Reader) Read() ([]record.Record, error) { c.Comma = ';' var rs []record.Record line := 0 + oldFormat := false for { csvRecord, err := c.Read() if err == io.EOF { @@ -40,12 +41,13 @@ func (r *Reader) Read() ([]record.Record, error) { return nil, err } line++ - if line == 1 { - continue // Skip header - } if len(csvRecord) < 12 { continue } + if line == 1 { + oldFormat = csvRecord[3] == "Balanse" + continue // Skip header + } t, err := time.Parse("2006-01-02", csvRecord[0]) if err != nil { return nil, fmt.Errorf("invalid time on line %d: %q: %w", line, csvRecord[0], err) @@ -59,16 +61,19 @@ func (r *Reader) Read() ([]record.Record, error) { return nil, fmt.Errorf("invalid amount on line %d: %q: %w", line, amountValue, err) } var balance int64 - balanceValue := csvRecord[3] - if balanceValue != "" { + if balanceValue := csvRecord[3]; oldFormat && balanceValue != "" { balance, err = parseAmount(balanceValue) if err != nil { return nil, fmt.Errorf("invalid balance on line %d: %q: %w", line, balanceValue, err) } } + indexOffset := 0 + if oldFormat { + indexOffset = 1 + } var text strings.Builder - paymentType := csvRecord[8] - paymentText := csvRecord[9] + paymentType := csvRecord[7+indexOffset] + paymentText := csvRecord[8+indexOffset] text.WriteString(paymentType) text.WriteString(",") text.WriteString(paymentText) -- cgit v1.2.3