2.2 KiB
2.2 KiB
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 por043_pos_basics(ON CONFLICT), por lo que el backfill de filas existentes y los inserts futuros sin store_id heredan el default sin unUPDATEtable-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 0separa el envío del total (nunca sobreescritura: filas históricas pasan a 0,total_centsintacto).orders_items.cost_at_sale_cents bigintyorders_items.vat_rate text, ambos nullable: snapshots que quedanNULLhasta poblados (margen/IVA-por-tipo permanecenunavailable, nunca 0 — §10/§4 F-143).
Consequences
- Positivas: columna
DEFAULTevita table rewrite y mantienePgOrderRepository(rawINSERT 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_idno se resuelve por request en F-144 (usa el default);cost_at_sale_cents/vat_ratequedan NULL (población en F-146). Ambas son explícitas endataAvailabilitydel reporting contract (F-143). - Reversible:
down()elimina índice/FK/columnas; idempotente víaIF NOT EXISTS/DO $$.
Evidence of design
orders_ordersesquema actual (16 columnas, sin store_id/shipping_cents) — inspeccionado enmercadodevidadev DB.pos_storesdefault store sembrado por 043;DEFAULT_STORE_IDreutilizado desdesrc/modules/inventory/index.ts.