You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

65 lines
1.5 KiB

package main
import (
"encoding/csv"
"fmt"
"os"
"strconv"
"src.wolkict.net/sepa/pain"
)
// FieldsPerBatchLine are the expected number of fields in each CSV line.
const FieldsPerBatchLine = 9
// ImportIndex keeps track of what column corresponds to what data.
type ImportIndex int
// These are our numbered input fields
const (
ImportName ImportIndex = iota
ImportAddr1
ImportAddr2
ImportCountry
ImportIBAN
ImportMandateId
ImportSignatureDate
ImportAmount
ImportInfo
)
func ImportCSV(fn string) ([]pain.DrctDbtTxInf, error) {
f, err := os.Open(fn)
if err != nil {
return nil, fmt.Errorf("opening file %q failed: %v", fn, err)
}
defer f.Close()
csvReader := csv.NewReader(f)
csvReader.FieldsPerRecord = FieldsPerBatchLine
all, err := csvReader.ReadAll()
if err != nil {
return nil, fmt.Errorf("reading csv %q failed: %v", fn, err)
}
ret := make([]pain.DrctDbtTxInf, len(all))
for i, line := range all {
if line[0] == "name" {
// Header line
continue
}
dbtr := pain.NewDebtor(line[ImportName], line[ImportAddr1], line[ImportAddr2], line[ImportCountry])
dbtrAcct := pain.NewDbtrAcct(line[ImportIBAN])
mandateInfo := pain.NewMandateInfo(line[ImportMandateId], line[ImportSignatureDate])
amount, err := strconv.ParseFloat(line[ImportAmount], 64)
if err != nil {
return nil, fmt.Errorf("error importing line %d, cannot parse amount: %v", i, err)
}
ret[i] = pain.NewDirectDebitTransaction(dbtr, dbtrAcct, mandateInfo, amount, line[ImportInfo], i)
}
return ret, nil
}