# Implementer — F-019 Promotions v1

## Summary
Implemented server-side promo codes with percent/fixed-amount rules, validity/usage validation, cart promo-code application, and recalculated discounts during cart reads.

## Files changed
- `project/migrations/014_promotions.js`
- `project/src/modules/promotions/**`
- `project/src/modules/cart/**`
- `project/src/app/build-app.ts`
- `project/src/app/tests/promotions.itest.ts`

## Acceptance evidence
- AC1 valid promo: `promotions.itest.ts` applies `SAVE10`; cart returns server-calculated discount and reduced total.
- AC2 expired/exhausted promo: `promotions.itest.ts` verifies HTTP 422 for expired and usage-limit exhausted codes.
- AC3 client-supplied discount ignored: promo and cart schemas strip unknown discount fields; cart stores only selected promo code, not discount amount.
- `verify.sh`: passed.

## Commands run
- `cd project && npm run lint` — passed
- `cd project && npm run typecheck` — passed
- `cd project && npm run build` — passed
- `cd project && npm test` — passed
- `cd project && TEST_DATABASE_URL='postgres://mdv:mdv_dev_only@localhost:5432/mdv_test' npm run test:integration -- promotions.itest migrations.itest` — passed; 11 files, 44 tests
- `./scripts/verify.sh` — passed

## Notes
- No stacking in v1: one `promo_code` per cart.
- Usage count is validated for exhaustion; consumption/increment can be tied to checkout/order completion in a later feature.
