diff --git a/cmd/cli/main.go b/cmd/cli/main.go index 964c8b0..0a2ac8d 100644 --- a/cmd/cli/main.go +++ b/cmd/cli/main.go @@ -439,6 +439,7 @@ func Main() { datesMatched := []string{} namesMatched := []string{} + nonAssetNamesMatched := []string{} for _, csvDelta := range csvDeltas { matches, dates := matchies(deltas, csvDelta) if len(matches) == 0 { @@ -450,10 +451,14 @@ func Main() { namesMatched = append(namesMatched, match.Name) } } + nonAssetNamesMatched = slices.DeleteFunc(slices.Clone(namesMatched), func(name string) bool { + return strings.Contains(name, "Asset") + }) datesMatched = slices.DeleteFunc(datesMatched, func(a string) bool { return strings.TrimSpace(a) == "" }) datesMatched = slices.Compact(datesMatched) namesMatched = slices.Compact(namesMatched) + transactions := deltas.Transactions() deltas = deltas.Like(func(delta ledger.Delta) bool { return delta.Date >= slices.Min(datesMatched) }) @@ -463,6 +468,43 @@ func Main() { deltas = deltas.Like(func(delta ledger.Delta) bool { return slices.Contains(namesMatched, delta.Name) }) + deltas = deltas.Like(func(delta ledger.Delta) bool { + xaction := transactions.Lookup(delta) + if noXactionFound := len(xaction) == 0; noXactionFound { + return false + } + + names := []string{} + for _, delta := range xaction.Deltas() { + names = append(names, delta.Name) + } + slices.Sort(names) + _ = names + + allTheSame := true + for i := range xaction { + for j := i + 1; j < len(xaction); j++ { + allTheSame = allTheSame && (xaction[i].Name == xaction[j].Name) + } + } + if allTheSame { + return false + } + + if anyNameNotRelevant := slices.ContainsFunc(xaction.Deltas(), func(some ledger.Delta) bool { + return !slices.Contains(namesMatched, delta.Name) + }); anyNameNotRelevant { + return false + } + + if hasNonAssetNameMatch := slices.ContainsFunc(xaction.Deltas(), func(some ledger.Delta) bool { + return slices.Contains(nonAssetNamesMatched, delta.Name) + }); !hasNonAssetNameMatch { + return false + } + + return true + }) deltasSum := deltas.Group(ledger.GroupDate(""), ledger.GroupName("")).Balances()[""][ledger.USD] csvSum := csvDeltas.Group(ledger.GroupDate(""), ledger.GroupName("")).Balances()[""][ledger.USD] diff --git a/src/ledger/transaction.go b/src/ledger/transaction.go index 0b068fe..60321b2 100644 --- a/src/ledger/transaction.go +++ b/src/ledger/transaction.go @@ -16,8 +16,21 @@ import ( type Transaction Deltas +func (t Transaction) Deltas() Deltas { + return Deltas(slices.Clone(t)) +} + type Transactions []Transaction +func (transactions Transactions) Lookup(delta Delta) Transaction { + for i := range transactions { + if transactions[i][0].Transaction == delta.Transaction { + return slices.Clone(transactions[i]) + } + } + return nil +} + func (transactions Transactions) Deltas() Deltas { result := make(Deltas, 0, len(transactions)) for _, transaction := range transactions {