package payments import ( "context" "time" "github.com/google/uuid" ) // Statement is an account's full financial picture for the admin console: chip balances per funding // segment, benefits per origin, the recorded refund risk, and the append-only ledger history // (newest first). Read straight from the materialized tables + the ledger, uncached — an admin-only, // rare view, not a hot path. type Statement struct { Segments []SegmentChips Benefits []OriginBenefit Risk RiskInfo Ledger []LedgerEntry } // SegmentChips is one funding segment's chip balance. type SegmentChips struct { Source Source Chips int } // OriginBenefit is one origin's benefit state: the hint wallet, the ad-free term (zero AdsPaidUntil // when none) and the lifetime ad-free flag. type OriginBenefit struct { Origin Source Hints int AdsPaidUntil time.Time AdsForever bool } // RiskInfo is the account's recorded refund risk: whether it is abuse-flagged and the unrecoverable // chip loss accumulated by floor-0 refunds. Present is false when the account has no risk row. type RiskInfo struct { Present bool Abuse bool LossChips int } // LedgerEntry is one append-only ledger row projected for the report. The string ids are empty when // the column is NULL; Shop is the direct-rail merchant channel the referenced order used (empty for // other rails or order-less rows); Snapshot is the raw purchase/refund JSON (empty when none). type LedgerEntry struct { Kind string Source string Origin string ChipsDelta int ProductID string OrderID string Provider string ProviderPaymentID string Shop string Snapshot string CreatedAt time.Time } // AccountStatement assembles the account's financial picture (segments, benefits, risk, full ledger // history) for the admin console, straight from the materialized tables and the ledger (uncached). func (s *Service) AccountStatement(ctx context.Context, accountID uuid.UUID) (Statement, error) { return s.store.accountStatement(ctx, accountID) }