Files
mercadodevida/spec/product.md
2026-08-22 10:22:25 +02:00

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 (modulo pricing, PricingService.getVariantPricePgPricingRepository.findByVariantId) devuelve 404 cuando pricing_variant_prices no tiene fila para variant_id.
  • CreateProductVariant.execute (catalog/application/variant-use-cases.ts) solo llama a variants.create (inserta en catalog_product_variants) y nunca inserta en pricing_variant_prices.
  • 3 call sites disparan createVariant.execute:
    1. Creación de producto con variante por defecto (POST /products, autovariante SKU-MV-{id}).
    2. Lazy migration en GET /products/:id/variants (producto legacy sin variantes → crea variante default para admin).
    3. POST /products/:id/variants (creación explícita de variante).
  • En todos los casos, la variante existe en catalog_product_variants pero GET /pricing/variants/:variantId 404ea 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étodo seedVariantPrice) + catalog (inyección en CreateProductVariant + wiring build-app).
  • Frontend: N/A (no hay cambios de UI).
  • Migración: N/A — pricing_variant_prices.variant_id ya es UNIQUE/PK (lo demuestra setVariantPrice usando ON CONFLICT (variant_id)); no se requiere migración ni columna nueva.

Definición de terminado

  • PricingService.seedVariantPrice(variantId) existe + persiste fila default.
  • CreateProductVariant llama a seedVariantPrice tras variants.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 typecheck 0 errores; npm test (targeted) verde; verify.sh green.