Compare commits
3 Commits
fa7bafa241
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
7262f5f69b | ||
|
|
b2954c0461 | ||
|
|
03b9a6d1f1 |
@@ -13,6 +13,7 @@ import (
|
|||||||
"os"
|
"os"
|
||||||
"os/signal"
|
"os/signal"
|
||||||
"slices"
|
"slices"
|
||||||
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
"syscall"
|
"syscall"
|
||||||
"time"
|
"time"
|
||||||
@@ -376,6 +377,7 @@ func Main() {
|
|||||||
return strings.Contains(strings.ToLower(field), "amount")
|
return strings.Contains(strings.ToLower(field), "amount")
|
||||||
})
|
})
|
||||||
|
|
||||||
|
csvDeltas := make(ledger.Deltas, 0)
|
||||||
for {
|
for {
|
||||||
line, err := reader.Read()
|
line, err := reader.Read()
|
||||||
if err == io.EOF {
|
if err == io.EOF {
|
||||||
@@ -393,25 +395,75 @@ func Main() {
|
|||||||
desc := line[descIdx]
|
desc := line[descIdx]
|
||||||
amount := line[amountIdx]
|
amount := line[amountIdx]
|
||||||
|
|
||||||
matches := deltas.Like(
|
amountF, err := strconv.ParseFloat(amount, 32)
|
||||||
func(delta ledger.Delta) bool {
|
if err != nil {
|
||||||
if delta.Date < slices.Min(dates) {
|
log.Fatalf("non-float amount %q: %v", amount, err)
|
||||||
return false
|
}
|
||||||
}
|
csvDeltas = append(csvDeltas, ledger.Delta{
|
||||||
if delta.Date > slices.Max(dates) {
|
Date: dates[0],
|
||||||
return false
|
OtherDates: dates[1:],
|
||||||
}
|
Name: desc,
|
||||||
if delta.Currency != ledger.USD {
|
Value: amountF,
|
||||||
return false
|
Currency: ledger.USD,
|
||||||
}
|
Description: desc,
|
||||||
if fmt.Sprintf("%.2f", -1*delta.Value) != amount {
|
Payee: true,
|
||||||
return false
|
})
|
||||||
}
|
}
|
||||||
return 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 {
|
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:
|
default:
|
||||||
|
|||||||
Reference in New Issue
Block a user