5 changed files with 166 additions and 24 deletions
@ -0,0 +1,64 @@ |
|||||
|
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 |
||||
|
} |
||||
Loading…
Reference in new issue