From b14c5e2696fb5471afe75b53ec7da3a0d32fcc2926d8707005dd1664ae64108c Mon Sep 17 00:00:00 2001 From: nfel Date: Sat, 29 Aug 2026 15:56:20 +0330 Subject: [PATCH] feat(gl): detect duplicate transaction versions --- application/reconciliation/service.go | 7 +++++++ application/reconciliation/service_test.go | 13 +++++++++++++ 2 files changed, 20 insertions(+) diff --git a/application/reconciliation/service.go b/application/reconciliation/service.go index c979868..875442a 100644 --- a/application/reconciliation/service.go +++ b/application/reconciliation/service.go @@ -32,6 +32,7 @@ func Run(ctx context.Context, repository Repository, pageSize int) (Report, erro pageSize = 100 } report := Report{Invalid: make([]Issue, 0)} + seen := make(map[string]string) for offset := 0; ; offset += pageSize { journals, err := repository.List(ctx, ledger.JournalFilter{Limit: pageSize, Offset: offset}) if err != nil { @@ -43,6 +44,12 @@ func Run(ctx context.Context, repository Repository, pageSize int) (Report, erro report.Invalid = append(report.Invalid, Issue{JournalID: journal.ID, Error: err.Error()}) continue } + key := journal.SourceService + "\x00" + journal.SourceTransactionID + "\x00" + fmt.Sprint(journal.EventVersion) + if previous, exists := seen[key]; exists { + report.Invalid = append(report.Invalid, Issue{JournalID: journal.ID, Error: fmt.Sprintf("duplicate source transaction/version; first journal %s", previous)}) + continue + } + seen[key] = journal.ID report.Valid++ } if len(journals) < pageSize { diff --git a/application/reconciliation/service_test.go b/application/reconciliation/service_test.go index 2f2aea5..1085ce4 100644 --- a/application/reconciliation/service_test.go +++ b/application/reconciliation/service_test.go @@ -41,3 +41,16 @@ func TestRunScansAndReportsInvalidJournals(t *testing.T) { t.Fatalf("unexpected report: %+v", report) } } + +func TestRunReportsDuplicateTransactionVersions(t *testing.T) { + first := validJournal() + second := validJournal() + second.ID = "j2" + report, err := Run(context.Background(), repositoryStub{pages: [][]ledger.Journal{{first, second}}}, 10) + if err != nil { + t.Fatal(err) + } + if report.Valid != 1 || len(report.Invalid) != 1 { + t.Fatalf("unexpected report: %+v", report) + } +}