# F-145 — Implementer evidence ## What F-145 build evidence: schema migration `049_reporting_payment_lines.js` creates the immutable `reporting_payment_lines` table with all columns, CHECK constraints, FKs and indexes; plus DB integration test `reporting-payment-lines.itest.ts`. Backend-only, **no API or user-facing behavior change**. ## Design recap (architect-approved — see architect.md) - `reporting_payment_lines`: order_id + store_id + terminal_id + cash_session_id + payment_method_id + provider + amount_cents + currency + status + provider_ref + created_at + updated_at. - CHECK: `amount_cents != 0`, `currency = 'EUR'`, `status IN ('payment','refund','partial_refund')`. - FK: order_id→orders_orders(id), store_id→pos_stores(id) — guarded by DO$$ for PG16 safety. - Three indexes: (store_id,created_at), (order_id), (cash_session_id) WHERE cash_session_id IS NOT NULL. - Immutable: refunds as new rows with status='refund', no UPDATE path. ## Files - `project/migrations/049_reporting_payment_lines.js` (created) — idempotent/reversible. - `project/src/app/tests/reporting-payment-lines.itest.ts` (created) — 16 DB assertions. ## Tests - `reporting-payment-lines.itest.ts` (16, real PostgreSQL): AC1 (columns/types/nullability/defaults), AC1 (CHECK nonzero_amount/eur_only/valid_status), AC1 (FK order_id/store_id + FK violation), AC2 (valid INSERT + status variants), AC4 (3 indexes), AC5 (immutable refund-as-new-row pattern). ## Verification - `npm run build` → 0 TypeScript errors (no output = success). - `node scripts/check-module-boundaries.mjs src` → 0 NEW violations. - `./scripts/verify.sh` → green (F-145 in_progress, runtime-consistent). ## AC traceability | AC | Estado | Evidencia | |----|--------|-----------| | AC1 table+FK+CHECK+idx | ✅ | 13 columns (types/nullable/defaults), 3 CHECK constraints, 2 FKs, 3 indexes, FK violation asserted | | AC2 valid INSERT | ✅ | INSERT succeeds, returns all columns, status variants | | AC3 CHECK nonzero_amount | ✅ | amount_cents=0 throws | | AC4 FK violation | ✅ | invalid order_id FK throws | | AC5 idempotent/reversible | ✅ | createTable IF NOT EXISTS; down() drops all | | AC6 indexes | ✅ | store_created + order + session (partial) | | AC7 immutability | ✅ | refund as new row pattern verified | | AC8 gates | ✅ | tsc 0; itest 16; 0 boundaries new |