Files
mercadodevida/work/current.md
2026-08-21 12:27:13 +02:00

7.0 KiB
Raw Blame History

Feature actual

Feature activa: F-113 (in_progress) — Email customer on processing/shipped with tracking and editable courier

Enviar email al cliente al pasar el pedido a procesando y enviado. El email de enviado incluye el número de seguimiento y el courier, elegido de una lista editable en Ajustes. F-102 cerrada previamente en esta sesión.

Backlog: 180 features (178 done, 2 pending, 1 in_progress).

Últimas features cerradas: F-102, F-101, F-111, F-110, F-109, F-108.

Notas de diseño F-113

  • El email ya existe (order-status-mailer.ts, F-106) pero la UI admin llama a la ruta de cliente /orders/:id/transitions (sin email). F-113 apunta la UI admin a /orders/:id/transitions/admin.
  • Courier se guarda en orders_orders.courier (migración 039) y la lista editable vive en store_settings.shipping_couriers (JSON array).
  • SHIPPED exige tracking y courier (422 si faltan).

Última incidencia resuelta (2026-08-20)

F-099 en build. El sistema deja de simular el envío de recuperación en logs y añade SMTP configurable desde Ajustes → SMTP / Email. También se incorporan generación de descripción normal vacía, proxy de logs con cookie httpOnly y navegación de login/logout solo con icono y tooltip.

Última incidencia resuelta (2026-08-20)

F-095 cerrada con todos los gates aprobados. Las imágenes URL se descargan y almacenan en uploads locales antes de adjuntarse.

Incidencia anterior (2026-08-20)

Añadir una imagen por URL devolvía 400 porque el flujo hacía un PATCH vacío del producto y adjuntaba directamente la URL remota.

Última incidencia resuelta (2026-08-20)

F-094 cerrada con todos los gates aprobados. Publicar permite crear variantes y explica SKU/EAN, precios y stock.

Incidencia anterior (2026-08-20)

Precios e Inventario indicaban que las variantes se creaban desde Publicar, pero Publicar no ofrecía creación ni explicación.

Última incidencia resuelta (2026-08-20)

F-093 cerrada con todos los gates aprobados. Inventario busca ahora por EAN o nombre de producto.

Incidencia anterior (2026-08-20)

La búsqueda de Inventario enviaba q, pero el listado admin solo filtraba por nombre de producto.

Última incidencia resuelta (2026-08-20)

F-092 cerrada con todos los gates aprobados. Fecha de caducidad está ahora en General; backend y admin fueron reconstruidos y desplegados.

Incidencia anterior (2026-08-20)

Fecha de caducidad estaba en la pestaña SEO de la ficha de producto. F-092 la movió a General sin cambiar el estado, payload ni guardado.

Última incidencia resuelta (2026-08-20)

F-091 cerrada con todos los gates aprobados. Los conflictos de SKU/EAN indican ahora qué campo está duplicado y Enter + blur no generan PATCH simultáneos.

Incidencia anterior (2026-08-20)

El PATCH de variantes devolvía 409 PRODUCT_VARIANT_CODE_EXISTS cuando el SKU o EAN ya estaba usado por otra variante. El editor mostraba solo Error y la combinación Enter + blur podía intentar enviar dos veces.

Última incidencia resuelta (2026-08-20)

F-090 cerrada con todos los gates aprobados. El listado ya recibe marca/caducidad y los valores SKU/EAN guardados permanecen visibles tras salir del campo.

Incidencia anterior (2026-08-20)

El listado admin mostraba para marca/caducidad porque la serialización del catálogo omitía ambos campos. En el editor de producto, SKU/EAN se guardaban en rows pero la vista no editable usaba el array variants inicial y volvía a mostrar valores antiguos.

Última incidencia resuelta (2026-08-20)

F-089 cerrada con todos los gates aprobados. El enlace del listado admin apunta ahora a http://192.168.18.93:3003/products/<slug>, ruta del frontend customer.

Incidencia anterior (2026-08-20)

El enlace de producto del listado admin apuntaba a http://192.168.18.93:3003/productos/<slug>, pero el frontend customer usa /products/<slug>. F-089 corrigió únicamente ese path.

Última incidencia resuelta (2026-08-20)

F-088 cerrada con todos los gates aprobados. El admin responde HTTP 200 en http://192.168.18.93:3004/.

Symptom reportado por el operador (2026-08-20)

http://192.168.18.93:3004/ERR_CONNECTION_REFUSED. El servicio admin del monolito no se mantiene en pie. Diagnóstico:

  • monolith.sh prod status → admin exited during startup, log: Could not find a production build in the '.next' directory.
  • apps/admin/.next/ existe pero no contiene BUILD_ID ni required-server-files.json.
  • npx tsc --noEmit en apps/adminerror TS2353 en tax-rates/page.tsx(59,33): 'appliesTo' does not exist in type 'Partial<{ name: string; ratePercent: number; active: boolean; }>'.

Root cause

F-085 añadió el handler saveTipo que llama a taxApi.update(id, { appliesTo }) y extendió la página con UI de edición inline, pero olvidó extender la firma de taxApi.update en apps/admin/src/lib/api-client.ts. Resultado: next build aborta por typecheck, no se genera BUILD_ID, next start falla y el admin no puede servir nada en :3004. El backend en pricing.routes.ts ya valida y persiste appliesTo, así que el fix es 100% frontend (type only).

Fix

Ampliar la firma Partial<{...}> de taxApi.update para aceptar appliesTo: 'general' | 'reduced' | 'super-reduced' (mismo enum que el backend). Después: npm run build en apps/admin produce BUILD_ID, monolith.sh prod mantiene el admin vivo y http://192.168.18.93:3004/ responde 200.

Pending tickets (2026-08-21)

Pendientes: F-100 (descartable, sustituida por F-109), F-101, F-102, F-107, F-108, F-109, F-110, F-111, F-112.

Orden sugerido: F-108 → F-109 → F-107 → F-110 → F-111 → F-101 → F-102 → F-112.

Redefiniciones de intake del operador (2026-08-21)

  • F-101 (alcance reducido): El renderizado actual de descripciones IA ya funciona. Solo queda justificar el texto de la descripción en la ficha de producto del frontend. NO hace falta conversión Markdown→HTML.
  • F-102 (redefinida): El peso del producto es 1 por unidad (si pide 3, peso = 3 × peso unitario). Lo llamado "pack" es en realidad un selector de compra mínima: cantidad mínima de compra por producto; el frontend bloquea la compra por debajo de ese mínimo. Además, nueva opción de envío: límite de envío gratuito por rango de peso en cada tipo de envío y un max weight por tipo de envío.
  • F-112 (nueva): Disclaimer de contenido IA en fichas de producto del frontend:
    • "Parte del contenido de esta ficha puede haber sido generado o asistido mediante inteligencia artificial y revisado antes de su publicación."
    • "La composición y características del producto pueden cambiar. Consulta siempre la etiqueta y la información del fabricante antes de consumirlo o utilizarlo."

Nota de intake (2026-08-20)

El operador reportó ERR_CONNECTION_REFUSED en :3004. El triage lo une a F-085 (cambio parcial sin actualizar la firma TS). Se crea F-088 para reparar la regresión sin reabrir F-085, y se ejecuta por orquestra secuencial.