Compare commits

...

3 Commits

Author SHA1 Message Date
Bel LaPointe
7262f5f69b find unique to ledger
All checks were successful
cicd / ci (push) Successful in 1m15s
2026-01-31 12:14:08 -07:00
Bel LaPointe
b2954c0461 no log confusing to read
All checks were successful
cicd / ci (push) Successful in 1m6s
2026-01-31 11:30:08 -07:00
Bel LaPointe
03b9a6d1f1 todo
All checks were successful
cicd / ci (push) Successful in 1m10s
2026-01-31 11:23:53 -07:00

View File

@@ -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
}
if delta.Date > slices.Max(dates) {
return false
}
if delta.Currency != ledger.USD {
return false
}
if fmt.Sprintf("%.2f", -1*delta.Value) != amount {
return false
}
return true
},
)
amountF, err := strconv.ParseFloat(amount, 32)
if err != nil {
log.Fatalf("non-float amount %q: %v", amount, err)
}
csvDeltas = append(csvDeltas, ledger.Delta{
Date: dates[0],
OtherDates: dates[1:],
Name: desc,
Value: amountF,
Currency: ledger.USD,
Description: desc,
Payee: true,
})
}
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
}
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: