Alexander Avery
3 years ago
3 changed files with 116 additions and 41 deletions
@ -0,0 +1,82 @@ |
|||
package main |
|||
|
|||
import ( |
|||
"encoding/xml" |
|||
"github.com/aclindsa/ofxgo" |
|||
"time" |
|||
"fmt" |
|||
"github.com/ochinchina/go-ini" |
|||
"io" |
|||
) |
|||
|
|||
func transactionsFromXml(r io.Reader, assets ini.Section, vendors []ini.Key) ([]transaction, error) { |
|||
type xmlTransaction struct { |
|||
XMLName xml.Name `xml:"transaction"` |
|||
Date string `xml:"Date"` |
|||
TrnAmt float64 `xml:"amount"` |
|||
Asset string `xml:"Asset"` |
|||
Expense string `xml:"Expense,omitempty"` |
|||
VendorName string `xml:"VendorName,omitempty"` |
|||
Currency string `xml:"Currency"` |
|||
} |
|||
type transactionParent struct { |
|||
XMLName xml.Name `xml:"transactions"` |
|||
Transactions []xmlTransaction `xml:"transaction"` |
|||
} |
|||
root := new(transactionParent) |
|||
d := xml.NewDecoder(r) |
|||
err := d.Decode(&root) |
|||
if err != nil { |
|||
return nil, fmt.Errorf("failed unmarshaling xml: %w", err) |
|||
} |
|||
|
|||
xtx := root.Transactions |
|||
transactions := make([]transaction, 0) |
|||
for _, t := range xtx { |
|||
var expense string |
|||
if t.VendorName != "" && t.Expense == "" { |
|||
expense = matchPartial(vendors, t.VendorName) |
|||
} |
|||
time, err := time.Parse("1/02/2006", t.Date) |
|||
if err != nil { |
|||
return nil, fmt.Errorf("failed parsing time: %w", err) |
|||
} |
|||
tx := transaction { |
|||
Date: time, |
|||
TrnAmt: t.TrnAmt, |
|||
Asset: t.Asset, |
|||
Expense: expense, |
|||
VendorName: t.VendorName, |
|||
Currency: t.Currency, |
|||
} |
|||
transactions = append(transactions, tx) |
|||
} |
|||
return transactions, nil |
|||
} |
|||
|
|||
func transactionsFromOfx(r io.Reader, assets ini.Section, vendors []ini.Key) ([]transaction, error) { |
|||
resp, err := ofxgo.ParseResponse(r) |
|||
if err != nil { |
|||
return nil, err |
|||
} |
|||
|
|||
transactions := make([]transaction, 0) |
|||
for _, m := range resp.Bank { |
|||
if stmt, ok := m.(*ofxgo.StatementResponse); ok { |
|||
for _, t := range stmt.BankTranList.Transactions { |
|||
acctId := stmt.BankAcctFrom.AcctID.String() |
|||
amt, _ := t.TrnAmt.Rat.Float64() |
|||
tx := transaction{ |
|||
Date: t.DtPosted.Time, |
|||
TrnAmt: amt, |
|||
Asset: assets.GetValueWithDefault(acctId, acctId), |
|||
Expense: matchPartial(vendors, t.Name.String()), |
|||
VendorName: t.Name.String(), |
|||
Currency: stmt.CurDef.String(), |
|||
} |
|||
transactions = append(transactions, tx) |
|||
} |
|||
} |
|||
} |
|||
return transactions, nil |
|||
} |
Loading…
Reference in new issue