package membership import ( "context" "io" domreconcile "fuj-management/go/internal/domain/reconcile" ) // ReconcileReport loads attendance, transactions, and exceptions via s, runs // the three-phase reconciliation, and writes the balance report to out. // Returns ErrIOPending until real loaders are injected in M4. func ReconcileReport(ctx context.Context, s Sources, defaultYear int, out io.Writer) error { members, sortedMonths, err := s.LoadAdults(ctx) if err != nil { return err } txns, err := s.LoadTransactions(ctx) if err != nil { return err } exceptions, err := s.LoadExceptions(ctx) if err != nil { return err } result := domreconcile.Reconcile(members, sortedMonths, txns, exceptions, defaultYear) printReconcileReport(out, result, sortedMonths) return nil }