2.4 KiB
2.4 KiB
F-138 — Auto-sembrar fila de precio en creación de variante
Título
Auto-sembrar fila de precio en creación de variante para evitar la ventana 404 en GET /pricing/variants/:id.
Contexto / Problema
GET /pricing/variants/:variantId(modulopricing,PricingService.getVariantPrice→PgPricingRepository.findByVariantId) devuelve 404 cuandopricing_variant_pricesno tiene fila paravariant_id.CreateProductVariant.execute(catalog/application/variant-use-cases.ts) solo llama avariants.create(inserta encatalog_product_variants) y nunca inserta enpricing_variant_prices.- 3 call sites disparan
createVariant.execute:- Creación de producto con variante por defecto (
POST /products, autovarianteSKU-MV-{id}). - Lazy migration en
GET /products/:id/variants(producto legacy sin variantes → crea variante default para admin). POST /products/:id/variants(creación explícita de variante).
- Creación de producto con variante por defecto (
- En todos los casos, la variante existe en
catalog_product_variantsperoGET /pricing/variants/:variantId404ea hasta que un admin no asocie un precio → la carrotera/pos pueden romper ("el precio no existe").
Solución
Sembrar (seed) una fila de precio por defecto inmediatamente después de crear la variante, con valores neutros: net_unit_amount_cents = 0, vat_rate = 'general', currency = 'EUR' (default DDL). El sembrado es idempotente (ON CONFLICT (variant_id) DO NOTHING) y best-effort: si falla, la creación de la variante no se anula (la variante primaria es la prioridad; el precio es secundario).
Alcance
- Backend:
pricing(nuevo métodoseedVariantPrice) +catalog(inyección enCreateProductVariant+ wiring build-app). - Frontend: N/A (no hay cambios de UI).
- Migración: N/A —
pricing_variant_prices.variant_idya es UNIQUE/PK (lo demuestrasetVariantPriceusandoON CONFLICT (variant_id)); no se requiere migración ni columna nueva.
Definición de terminado
PricingService.seedVariantPrice(variantId)existe + persiste fila default.CreateProductVariantllama aseedVariantPricetrasvariants.create.- Los 3 call sites dejan fila de precio tras crear variante.
- Re-sembrar es no-op (idempotente).
- Tests unitarios (sin DB) pasan; itest de AC skipped sin
TEST_DATABASE_URL. npm run typecheck0 errores;npm test(targeted) verde;verify.shgreen.