# F-186 — Implementer evidence ## Implemented ### POS cashier - Eight quick-product slots rendered in a 4×2 touch grid. - Touch-sized line-discount button; hidden when `terminal.settings.lineDiscountsEnabled=false`. - Touch payment modal per configured method with “total” / “partial” choice. - Mixed payment allocations remain visible with paid and outstanding totals and can be removed. - Cash tender captures overpayment and previews/records change. - Separate “Confirmar y cerrar ticket” step; disabled until applied amounts equal total. - Receipt modal supports browser print and SMTP email; cashier is only reset after one delivery action completes. - Free-item modal adds non-stock service/product lines by name and positive price. ### Admin - Terminal config expanded from 4 to 8 quick slots. - Per-terminal discount switch for self-payment terminals. - Payment-method management supports custom active/inactive cash/card/other methods (Bizum, Stripe, Apple Pay labels, etc.; no external processor integration). - Company identity, ticket prefix/next number/padding, header/footer and return-policy settings. ### Backend and persistence - Migration `054_pos_checkout_receipts.js` adds transaction-safe receipt settings/sequence, immutable receipt numbers, and nullable stock IDs for CHECK-constrained free lines. - POS sale now reloads catalog prices/names/SKU server-side, locks/decrements stock, rejects disabled discounts/methods, validates exact payment allocation and cash tender, and commits as `COMPLETED`. - Payment transactions preserve configured method, tender and change in immutable raw data. - Each payment is captured in `reporting_payment_lines`; this addresses new POS sales not reaching reporting. - Cash session expected balance increases by applied cash, never by tendered cash (change excluded). - Rich receipt builder contains company, time, ticket number, item details, totals, payment allocations, change and return policy. - Receipt access is terminal-scoped for cashier/manager and unrestricted only for admin. - Receipt email uses existing SMTP settings and cannot inject custom content. - POS cashier creation was corrected to use `backoffice_users` with Argon2 instead of invalid identity rows/SHA-256. ## Tests and verification - `cd project && npm run typecheck` — PASS. - `cd project && npm test` — PASS: 268 unit tests; DB tests skipped without env. - `TEST_DATABASE_URL=... npx vitest run --no-file-parallelism` — PASS: 78 files / 350 tests, including all real-PostgreSQL integration files sequentially. - New `payment-allocation.test.ts` — PASS: mixed partial allocation, cash change, exact total, disabled method and legacy mapping. - New `pos-checkout-receipts.itest.ts` — PASS: complete state, stock decrement, free line, mixed payment/change, reporting capture, receipt sequence, cash expected amount and idempotent replay. - Migration fresh up / no-op second up / full down / re-up — PASS. - POS Next.js production build — PASS. - Admin Next.js production build — PASS (pre-existing dynamic upload tracing warnings only). - `./scripts/verify.sh` — PASS. - `git diff --check` — PASS. - Targeted ESLint and Prettier for all changed backend/admin/POS files — PASS. ## Known repository-wide pre-existing checks - Root `npm run lint` remains red on 9 unrelated pre-existing errors in `generate-thumbnails.mjs`, `log-broadcaster.ts`, old `store-repository.test.ts`, and reporting files. Changed files pass targeted ESLint/Prettier. - Boundary violations were reduced from 8 to 1 by adding the POS public index and removing old deep imports. The remaining violation is pre-existing `security.routes.ts -> infrastructure/logging/log-broadcaster.ts` and is outside F-186. ## Follow-up tickets captured from user additions - F-187 cashier deletion/deactivation. - F-188 pending-payment orders (paid POS orders are already `COMPLETED` here). - F-189 negative quantity returns and return tickets. - F-190 full reporting update/refresh audit (new POS payment lines are captured here). - F-191 terminal and daily close reconciliation. - F-192 simplified storefront VAT label. - F-193 storefront expiry/weight and shipping-weight calculation.