Files
mercadodevida/work/artifacts/F-189/implementer.md
2026-08-22 23:02:00 +02:00

36 lines
2.0 KiB
Markdown

# F-189 — Implementer evidence
## Delivered
- Migration `056_pos_return_lines.js`:
- Adds `orders_items.returned_quantity integer NOT NULL DEFAULT 0` with CHECK.
- Extends `inventory_movements.operation` CHECK to allow `'return'`.
- Creates `pos_returns` ledger with UNIQUE `(order_id, idempotency_key)` for replay.
- New `ApplyPosReturnUseCase`:
- Locks order and stock rows.
- Validates per-line return bounds; rejects over-return with `POS_RETURN_EXCEEDS_AVAILABLE`.
- Requires full return for free items with `POS_RETURN_FREE_ITEM_PARTIAL`.
- Restores inventory, decrements cash session expected cash proportionally.
- Emits `reporting_payment_lines` row with `status='refund'` / `'partial_refund'`.
- Inserts `orders_order_history`, `pos_returns`, audit events.
- Idempotent via `pos_returns.idempotency_key`.
- New `buildPosReturnReceipt` returning an `R-<original>` numbered receipt with negative totals and `originalReceiptNumber`.
- New `POST /pos/sales/:id/returns` endpoint (POS roles + `x-terminal-id` binding).
- New `GET /pos/sales/:id/items` endpoint returning order items with `returnedQuantity`.
- Removed legacy `POST /pos/sales/:id/refund`.
- POS cashier UI: new `ReturnModal` exposed via a `Devolver artículos` button on the receipt modal; shows per-line steppers, reason and refund total; on success replaces the active receipt with the return receipt.
- Type updates so both POS, admin and backend see `originalReceiptNumber` / `isReturn` flags.
## Validation
- Backend, POS, admin typecheck: PASS.
- Real PostgreSQL sequential suite: 365/365 PASS (5 new in `pos-returns.itest.ts`).
- Migration cycle (`fresh up / second no-op / full down / re-up`): 4/4 PASS.
- Targeted ESLint + Prettier on every changed file: PASS.
- `./scripts/verify.sh`: PASS.
## Baselines
- Backend global lint remains unchanged; no new errors.
- Boundary check stays at one pre-existing security import violation; F-189 introduces none.
- Untracked upload JPGs excluded from the feature commit.