aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMartin Polden <mpolden@mpolden.no>2022-11-01 22:39:03 +0100
committerMartin Polden <mpolden@mpolden.no>2023-05-31 19:41:37 +0200
commite4ea57b21c7ab30e61a792d1ab698092555dbae1 (patch)
tree90f634604cd87d8a6ff83bd13a4269f0d0a9c0aa
parentad65af77171b15f79636aeac426b1a7a43dd27aa (diff)
bulder: handle new format
-rw-r--r--record/bulder/builder_test.go41
-rw-r--r--record/bulder/bulder.go19
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)