Files
mercadodevida/work/artifacts/POS-RECEIPT-QUICK-FIXES/implementer.md

3.7 KiB

Implementer evidence — POS-RECEIPT-QUICK-FIXES

Cambios realizados

1) Productos rápidos: nuevo flujo con buscador + lista de hasta 8

  • Reemplacé los <select> de productos rápidos en project/apps/admin/src/app/(dashboard)/pos/page.tsx.
  • Ahora el admin usa:
    • buscador por nombre / SKU / EAN
    • resultados con botón Añadir
    • lista ordenada de 8 huecos máximos
    • botones ↑ Subir, ↓ Bajar, Quitar
    • botón explícito Guardar accesos rápidos
  • El modal ya hidrata los productos ya guardados mediante variantIds, así se ven nombre/SKU al reabrir la configuración.

2) Fix del guardado que no persistía

  • El bug principal en admin era funcional/UI: existía saveTouchConfig() pero no había ningún botón que lo disparase.
  • Añadí el botón de guardado y mantuve el payload esperado por backend (quickProductVariantIds longitud 8).

3) Backend de catálogo para el buscador

  • Extendí GET /pos/admin/catalog-products en project/src/modules/pos/api/pos.routes.ts.
  • Ahora acepta:
    • q (búsqueda)
    • limit
    • variantIds (para hidratar la selección ya guardada)
  • Deja de ser necesario cargar toda la lista de variantes al entrar en la página del POS admin.

4) TPV: el ticket ya calcula IVA y totales con precio bruto

  • Corregí project/src/modules/pos/application/create-pos-sale.ts para que el TPV:
    • recalcule el precio bruto autoritativo desde pricing_variant_prices
    • valide descuentos contra el bruto real
    • guarde orders_orders.subtotal_cents y total_cents en bruto
    • guarde orders_orders.tax_cents con el IVA real
  • Corregí project/src/modules/pos/application/build-pos-receipt.ts para que el receipt renderice:
    • precio unitario bruto
    • subtotal bruto
    • descuento bruto
    • IVA real
    • total final bruto
  • Corregí project/src/modules/pos/application/apply-pos-return.ts para que las devoluciones reembolsen también el IVA del TPV.
  • Ajusté lecturas POS en project/src/modules/pos/api/pos.routes.ts para que búsqueda, touch catalog y lookup devuelvan priceCents bruto al cajero.
  • Ajusté la recuperación de ventas en project/apps/pos/src/app/(terminal)/page.tsx para conservar el precio final bruto al convertir líneas recuperadas en libres.

5) Frontend checkout: sincronización del carrito sin duplicar cantidades

  • Corregí project/frontend/src/app/api/checkout/route.ts.
  • Antes el proxy de checkout hacía POST /cart/items para todos los productos, así que si el carrito servidor ya tenía una unidad de la variante, el checkout intentaba sumar encima (ej. 16 en UI + 1 previa en servidor = 17 pedidas).
  • Ahora:
    • hace POST solo para líneas nuevas
    • hace PATCH para igualar la cantidad exacta de líneas ya existentes
    • mantiene DELETE para líneas eliminadas
    • parsea correctamente el envelope JSON del backend para mostrar solo el mensaje humano (Only 16 units available; you requested 17.) y no el JSON entero

Validación

  • cd project && npm run typecheck
  • cd project && npm run build
  • cd project && npx vitest run src/modules/pos/tests/payment-allocation.test.ts
  • cd project/apps/pos && npm run build
  • cd project/frontend && npm run build
  • cd project && TEST_DATABASE_URL=... npx vitest run src/app/tests/pos-checkout-receipts.itest.ts src/app/tests/pos-returns.itest.ts --no-file-parallelism ⚠️ bloqueado por un fallo preexistente en migración 057_product_variant_weight_and_expiry (type "w" does not exist), ajeno a estos cambios

Observaciones

  • También corregí el artefacto heredado work/artifacts/TPV-FIXES/{reviewer,security,qa}.json añadiendo agent, para que verify.sh no siga cayendo por metadata vieja.
  • No se cerró la feature; sigue pendiente de gates.