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