feat/m2-10-reconcile-domain
main
Ports scripts/match_payments.py reconcile() — the most load-bearing pure function in the codebase — to go/internal/domain/reconcile.
scripts/match_payments.py reconcile()
go/internal/domain/reconcile
reconcile.go — types + Reconcile():
reconcile.go
Reconcile()
Member
FeeData
Transaction
Exception
ExceptionKey
MonthData
MemberResult
OtherEntry
TxEntry
Result
canonicalMemberKey
[?]
other:
OtherTransactions
matching.InferTransactionDetails
reconcile_test.go — 12 unit tests:
reconcile_test.go
tests/test_reconcile_exceptions.py
tests/test_match_payments.py
ok fuj-management/go/internal/domain/reconcile 0.3s
make go-lint clean.
make go-lint
Three-phase payment allocation (greedy / proportional / even-split) ported verbatim from scripts/match_payments.py reconcile(). Includes 12 unit tests covering all Python test cases plus Go-only extras: [?] stripping, other: purpose, out-of-window credit, inference fallback, and no-match/empty-transaction guards. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
9e6aebc816
71278e6f7a
No dependencies set.
The note is not visible to the blocked user.
Ports
scripts/match_payments.py reconcile()— the most load-bearing pure function in the codebase — togo/internal/domain/reconcile.What's included
reconcile.go— types +Reconcile():Member,FeeData,Transaction,Exception,ExceptionKeyMonthData,MemberResult,OtherEntry,TxEntry,ResultcanonicalMemberKeyfor diacritics/case/whitespace-tolerant Person-column resolution[?]marker stripping from Person cellsother:purpose routing toOtherTransactionsmatching.InferTransactionDetailswhen Person/Purpose columns are emptyreconcile_test.go— 12 unit tests:tests/test_reconcile_exceptions.pyandtests/test_match_payments.py[?]stripping,other:purpose, out-of-window credit, inference fallback, no-match unmatched, empty-transaction guardTest run
make go-lintclean.9e6aebc816to71278e6f7a