feat(F-144): completed feature
This commit is contained in:
40
work/artifacts/F-144/architect.md
Normal file
40
work/artifacts/F-144/architect.md
Normal file
@@ -0,0 +1,40 @@
|
||||
# F-144 — Architecture decision record
|
||||
|
||||
## Context
|
||||
REPORTING_ARCHITECTURE.md §5 lista los *snapshots* mínimos necesarios para
|
||||
reportar ventas multi-tienda sin reescribir historia. `orders_orders` carece de
|
||||
`store_id` (§5.1 riesgo #1), no separa envío de `total_cents` (§5.6) y
|
||||
`orders_items` no guarda `cost_at_sale_cents`/`vat_rate` snapshots (§5.2, §5.9).
|
||||
|
||||
## Decision
|
||||
Una migración idempotente `048_*` añade las columnas de *snapshot* como columnas
|
||||
nuevas de tabla:
|
||||
|
||||
- `orders_orders.store_id uuid NOT NULL DEFAULT <default store>` con FK →
|
||||
`pos_stores(id)` VALID. El default store (`00000000-0000-0000-0000-000000000001`)
|
||||
está sembrado por `043_pos_basics` (ON CONFLICT), por lo que el backfill de
|
||||
filas existentes y los inserts futuros sin store_id heredan el default sin un
|
||||
`UPDATE` table-scan ni toque en el app-layer. La resolución explícita de tienda
|
||||
por request se posterga a F-146 (writes app-layered).
|
||||
- `orders_orders.shipping_cents integer NOT NULL DEFAULT 0` separa el envío del
|
||||
total (nunca sobreescritura: filas históricas pasan a 0, `total_cents` intacto).
|
||||
- `orders_items.cost_at_sale_cents bigint` y `orders_items.vat_rate text`, ambos
|
||||
**nullable**: snapshots que quedan `NULL` hasta poblados (margen/IVA-por-tipo
|
||||
permanecen `unavailable`, nunca 0 — §10/§4 F-143).
|
||||
|
||||
## Consequences
|
||||
- Positivas: columna `DEFAULT` evita table rewrite y mantiene `PgOrderRepository`
|
||||
(raw `INSERT INTO orders_orders (...)`) 100% compatible → cero regresión en
|
||||
checkout/orders itests; el default store existe al subir la migración (043
|
||||
precede a 048) → FK VALID siempre tiene un target válido.
|
||||
- Nuevas limitaciones: `store_id` no se resuelve por request en F-144 (usa el
|
||||
default); `cost_at_sale_cents`/`vat_rate` quedan NULL (población en F-146).
|
||||
Ambas son explícitas en `dataAvailability` del reporting contract (F-143).
|
||||
- Reversible: `down()` elimina índice/FK/columnas; idempotente vía `IF NOT
|
||||
EXISTS`/`DO $$`.
|
||||
|
||||
## Evidence of design
|
||||
- `orders_orders` esquema actual (16 columnas, sin store_id/shipping_cents) —
|
||||
inspeccionado en `mercadodevida` dev DB.
|
||||
- `pos_stores` default store sembrado por 043; `DEFAULT_STORE_ID` reutilizado desde
|
||||
`src/modules/inventory/index.ts`.
|
||||
Reference in New Issue
Block a user