Compare commits
3 Commits
fa7bafa241
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
7262f5f69b | ||
|
|
b2954c0461 | ||
|
|
03b9a6d1f1 |
@@ -13,6 +13,7 @@ import (
|
||||
"os"
|
||||
"os/signal"
|
||||
"slices"
|
||||
"strconv"
|
||||
"strings"
|
||||
"syscall"
|
||||
"time"
|
||||
@@ -376,6 +377,7 @@ func Main() {
|
||||
return strings.Contains(strings.ToLower(field), "amount")
|
||||
})
|
||||
|
||||
csvDeltas := make(ledger.Deltas, 0)
|
||||
for {
|
||||
line, err := reader.Read()
|
||||
if err == io.EOF {
|
||||
@@ -393,25 +395,75 @@ func Main() {
|
||||
desc := line[descIdx]
|
||||
amount := line[amountIdx]
|
||||
|
||||
matches := deltas.Like(
|
||||
func(delta ledger.Delta) bool {
|
||||
if delta.Date < slices.Min(dates) {
|
||||
return false
|
||||
amountF, err := strconv.ParseFloat(amount, 32)
|
||||
if err != nil {
|
||||
log.Fatalf("non-float amount %q: %v", amount, err)
|
||||
}
|
||||
if delta.Date > slices.Max(dates) {
|
||||
return false
|
||||
csvDeltas = append(csvDeltas, ledger.Delta{
|
||||
Date: dates[0],
|
||||
OtherDates: dates[1:],
|
||||
Name: desc,
|
||||
Value: amountF,
|
||||
Currency: ledger.USD,
|
||||
Description: desc,
|
||||
Payee: true,
|
||||
})
|
||||
}
|
||||
if delta.Currency != ledger.USD {
|
||||
return false
|
||||
|
||||
matchies := func(deltas ledger.Deltas, delta ledger.Delta) (ledger.Deltas, []string) {
|
||||
deltas = slices.Clone(deltas)
|
||||
dates := append([]string{delta.Date}, delta.OtherDates...)
|
||||
matches := deltas.Like(func(delta ledger.Delta) bool {
|
||||
return delta.Date >= slices.Min(dates)
|
||||
})
|
||||
matches = matches.Like(func(delta ledger.Delta) bool {
|
||||
return delta.Date <= slices.Max(dates)
|
||||
})
|
||||
matches = matches.Like(func(delta ledger.Delta) bool {
|
||||
return delta.Currency == ledger.USD
|
||||
})
|
||||
return matches.Like(func(d2 ledger.Delta) bool {
|
||||
return fmt.Sprintf("%.2f", d2.Value) == fmt.Sprintf("%.2f", delta.Value)
|
||||
}), dates
|
||||
}
|
||||
if fmt.Sprintf("%.2f", -1*delta.Value) != amount {
|
||||
return false
|
||||
}
|
||||
return true
|
||||
},
|
||||
)
|
||||
|
||||
datesMatched := []string{}
|
||||
namesMatched := []string{}
|
||||
for _, csvDelta := range csvDeltas {
|
||||
matches, dates := matchies(deltas, csvDelta)
|
||||
if len(matches) == 0 {
|
||||
log.Printf("%s %s %s", strings.Join(dates, "="), desc, amount)
|
||||
fmt.Printf("unique to csv | %s %s %.2f\n", strings.Join(dates, "="), csvDelta.Name, csvDelta.Value)
|
||||
}
|
||||
for _, match := range matches {
|
||||
datesMatched = append(datesMatched, match.Date)
|
||||
datesMatched = append(datesMatched, match.OtherDates...)
|
||||
namesMatched = append(namesMatched, match.Name)
|
||||
}
|
||||
}
|
||||
datesMatched = slices.DeleteFunc(datesMatched, func(a string) bool { return strings.TrimSpace(a) == "" })
|
||||
datesMatched = slices.Compact(datesMatched)
|
||||
namesMatched = slices.Compact(namesMatched)
|
||||
|
||||
deltas = deltas.Like(func(delta ledger.Delta) bool {
|
||||
return delta.Date >= slices.Min(datesMatched)
|
||||
})
|
||||
deltas = deltas.Like(func(delta ledger.Delta) bool {
|
||||
return delta.Date <= slices.Max(datesMatched)
|
||||
})
|
||||
deltas = deltas.Like(func(delta ledger.Delta) bool {
|
||||
return slices.Contains(namesMatched, delta.Name)
|
||||
})
|
||||
|
||||
deltasSum := deltas.Group(ledger.GroupDate(""), ledger.GroupName("")).Balances()[""][ledger.USD]
|
||||
csvSum := csvDeltas.Group(ledger.GroupDate(""), ledger.GroupName("")).Balances()[""][ledger.USD]
|
||||
if deltasSum != csvSum {
|
||||
log.Printf("csv sum %.2f but deltas sum %.2f", csvSum, deltasSum)
|
||||
}
|
||||
|
||||
for _, delta := range deltas {
|
||||
matches, dates := matchies(csvDeltas, delta)
|
||||
if len(matches) == 0 {
|
||||
fmt.Printf("unique to ledger | %s %s %.2f\n", strings.Join(dates, "="), delta.Description, delta.Value)
|
||||
}
|
||||
}
|
||||
default:
|
||||
|
||||
Reference in New Issue
Block a user