Implement matching

This commit is contained in:
Jan Bader 2022-01-09 22:29:56 +00:00
parent beff7afcf7
commit 2ec9c923df

View File

@ -113,6 +113,13 @@ func (ynab *YNABImport) ImportAssignments(r io.Reader) error {
return nil return nil
} }
type Transfer struct {
CreateTransactionParams
TransferToAccount *Account
FromAccount string
ToAccount string
}
// ImportTransactions expects a TSV-file as exported by YNAB in the following format: // ImportTransactions expects a TSV-file as exported by YNAB in the following format:
func (ynab *YNABImport) ImportTransactions(r io.Reader) error { func (ynab *YNABImport) ImportTransactions(r io.Reader) error {
@ -125,7 +132,7 @@ func (ynab *YNABImport) ImportTransactions(r io.Reader) error {
return fmt.Errorf("could not read from tsv: %w", err) return fmt.Errorf("could not read from tsv: %w", err)
} }
var openTransfers []CreateTransactionParams var openTransfers []Transfer
count := 0 count := 0
for _, record := range csvData[1:] { for _, record := range csvData[1:] {
@ -174,8 +181,49 @@ func (ynab *YNABImport) ImportTransactions(r io.Reader) error {
if err != nil { if err != nil {
return fmt.Errorf("Could not get transfer account %s: %w", transferToAccountName, err) return fmt.Errorf("Could not get transfer account %s: %w", transferToAccountName, err)
} }
openTransfers = append(openTransfers, transaction)
fmt.Printf("Found transfer from %s to %s over %f\n", account.Name, transferToAccount.Name, amount.GetFloat64()) transfer := Transfer{
transaction,
transferToAccount,
accountName,
transferToAccountName,
}
found := false
for i, openTransfer := range openTransfers {
if openTransfer.TransferToAccount.ID != transfer.AccountID {
continue
}
if openTransfer.AccountID != transfer.TransferToAccount.ID {
continue
}
if openTransfer.Amount.GetFloat64() != -1*transfer.Amount.GetFloat64() {
continue
}
fmt.Printf("Matched transfers from %s to %s over %f\n", account.Name, transferToAccount.Name, amount.GetFloat64())
openTransfers[i] = openTransfers[len(openTransfers)-1]
openTransfers = openTransfers[:len(openTransfers)-1]
found = true
groupID := uuid.New()
transfer.GroupID = uuid.NullUUID{UUID: groupID, Valid: true}
openTransfer.GroupID = uuid.NullUUID{UUID: groupID, Valid: true}
_, err = ynab.queries.CreateTransaction(ynab.Context, transfer.CreateTransactionParams)
if err != nil {
return fmt.Errorf("could not save transaction %v: %w", transaction, err)
}
_, err = ynab.queries.CreateTransaction(ynab.Context, openTransfer.CreateTransactionParams)
if err != nil {
return fmt.Errorf("could not save transaction %v: %w", transaction, err)
}
break
}
if !found {
openTransfers = append(openTransfers, transfer)
}
} else { } else {
payeeID, err := ynab.GetPayee(payeeName) payeeID, err := ynab.GetPayee(payeeName)
if err != nil { if err != nil {
@ -194,6 +242,9 @@ func (ynab *YNABImport) ImportTransactions(r io.Reader) error {
count++ count++
} }
for _, openTransfer := range openTransfers {
fmt.Printf("Found transfer from %s to %s on %s over %f\n", openTransfer.FromAccount, openTransfer.ToAccount, openTransfer.Date, openTransfer.Amount.GetFloat64())
}
fmt.Printf("Imported %d transactions\n", count) fmt.Printf("Imported %d transactions\n", count)
return nil return nil