615 lines
43 KiB
Markdown
615 lines
43 KiB
Markdown
# Historial (append-only)
|
||
|
||
> Añadir entradas al final. No reescribir historial previo.
|
||
|
||
## 2026-08-14 — F-001 Scaffold modular monolith skeleton — DONE
|
||
- Gates: reviewer APPROVED, security APPROVED, qa APPROVED, verify.sh exit 0
|
||
- Entregable: skeleton TypeScript + Fastify en project/ con boundary checker testeado; specs/F-001-scaffold completos; spec/tech.md con justificación de dependencias
|
||
- Artefactos: work/artifacts/F-001/ (architect.md, implementer.md, reviewer.json, security.json, qa.json, documenter.md, leader-close.json)
|
||
- Nota: el boundary checker detectó una violación real durante build (test escapando del módulo) y se corrigió moviendo los tests de composición a src/app
|
||
|
||
## 2026-08-14 — F-002 Database foundation with module-owned schemas — DONE
|
||
- Gates: reviewer APPROVED, security APPROVED (con ronda de hardening), qa APPROVED, verify.sh exit 0
|
||
- Entregable: migraciones node-pg-migrate (up/down/no-op probados contra PostgreSQL 16 real), pool fail-fast, docker-compose (Postgres + Redis), convención <module>_<table> documentada
|
||
- Nota: security devolvió un hallazgo bajo (interpolación de identificador en DDL de tests); se mitigó con validación estricta + tests de regresión
|
||
- Artefactos: work/artifacts/F-002/
|
||
|
||
## 2026-08-14 — F-003 HTTP foundation and request context — DONE
|
||
- Gates: reviewer APPROVED, security APPROVED, qa APPROVED, verify.sh exit 0
|
||
- Entregable: request_id (generado o propagado-sanitizado), logs JSON correlacionados, error envelope v2 con requestId, hook de validación parseJson (zod), server con logging inyectable
|
||
- Nota: doc stage rebotó a build para escribir README (project/ está gateado a build/implementer/running); comportamiento correcto del guardrail
|
||
- Artefactos: work/artifacts/F-003/
|
||
|
||
## 2026-08-14 — F-004 Typed config and feature flags — DONE
|
||
- Gates: reviewer APPROVED, security APPROVED, qa APPROVED, verify.sh exit 0
|
||
- Entregable: loadConfig fail-fast (DATABASE_URL requerido, errores solo con nombres de variables), módulo flags tras FeatureFlagProvider (default OFF, flip en runtime sin redeploy), app.flags decorado
|
||
- Nota: los tests detectaron un bug real en build (case-normalization del store); corregido antes de gates con test de regresión
|
||
- Cero dependencias nuevas
|
||
- Artefactos: work/artifacts/F-004/
|
||
|
||
## 2026-08-14 — F-005 Identity: register, login, sessions — DONE
|
||
- Gates: reviewer APPROVED, security APPROVED, qa APPROVED, verify.sh exit 0
|
||
- Entregable: módulo identity hexagonal (domain/application/infrastructure/api), migración 002 reversible, argon2id OWASP tras puerto PasswordHasher, sesiones opacas (solo SHA-256 del token en DB), cookie HttpOnly+Secure+SameSite=Lax, rate limit 10 fallos -> 429 + Retry-After tras interfaz, 401 idéntico anti-enumeración con timing igualado
|
||
- Nota: review detectó falta de tests para COOKIE_SECURE; fix aplicado antes de aprobar el gate. Suite de migraciones F-002 actualizada a rollback completo (count:0) por tener ahora 2 migraciones
|
||
- Deps nuevas: argon2, @fastify/cookie (justificadas en spec/tech.md)
|
||
- Artefactos: work/artifacts/F-005/
|
||
|
||
## F-006 — Users: profile, addresses, RBAC (closed)
|
||
- Users module: profile + address CRUD (users_profiles, users_addresses, migration 004); roles on identity_users (migration 003)
|
||
- RBAC: owner-or-admin via shared/auth.ts injected from composition root; authz before existence checks; SQL scoped by user_id
|
||
- Identity: session-authenticator export + role in model/responses; @fastify/cookie moved to app root
|
||
- Zero new dependencies; tests: unit 52 + integration 22; live smoke covered 401/403/200 paths; gates APPROVED
|
||
|
||
## F-007 — Categories module (closed)
|
||
- Categories module: category tree with adjacency-list `parent_id`, globally unique slugs, SEO title/description, migration 005 (`categories_categories`).
|
||
- API: public `GET /categories/tree` and `GET /categoria/:slug`; admin-only create/update/delete via shared auth injected at composition root.
|
||
- Integrity: duplicate slug -> 409, self/descendant parent cycles -> 422, delete non-leaf -> 409; public URLs never require internal id.
|
||
- Zero new dependencies; tests: category unit tests green, integration acceptance tests present (skipped without TEST_DATABASE_URL); gates APPROVED.
|
||
- Artefactos: work/artifacts/F-007/
|
||
|
||
## F-008 — Catalog core: products domain (closed)
|
||
- Catalog module: product aggregate with states `draft`, `active`, `archived`, unique slugs, SEO metadata, migration 006 (`catalog_products`, `catalog_product_categories`).
|
||
- API: public active-only `GET /productos/:slug` and `GET /products/search`; admin-only create/update via shared auth injected at composition root.
|
||
- Integrity: duplicate slug -> 409, unknown category assignment -> 422; product-category assignment validates category ids without TypeScript imports from categories internals.
|
||
- Domain purity: catalog domain has zero database/HTTP imports; covered by test and boundary lint.
|
||
- Zero new dependencies; tests: catalog unit/domain tests green, integration acceptance tests present (skipped without TEST_DATABASE_URL); gates APPROVED.
|
||
- Artefactos: work/artifacts/F-008/
|
||
|
||
## F-009 — Brands module (closed)
|
||
- Brands module: brand entity with globally unique slug, SEO metadata, migration 007 (`brands_brands`).
|
||
- Catalog integration: nullable `catalog_products.brand_id`; product search supports `brandSlug` active-only filter without TypeScript imports from brands internals.
|
||
- API: public `GET /marca/:slug`; admin-only brand create/update; duplicate brand slug -> 409.
|
||
- Zero new dependencies; tests: product search unit green, brands/catalog integration acceptance tests present (skipped without TEST_DATABASE_URL); gates APPROVED.
|
||
- Artefactos: work/artifacts/F-009/
|
||
|
||
## F-010 — Variants, SKU/EAN and product rich data (closed)
|
||
- Catalog variants: `catalog_product_variants` with globally unique SKU and optional unique EAN; admin create/update endpoints.
|
||
- Rich data: `catalog_product_rich_data` stores ingredients, allergens, nutrition, nutrition provenance, organic flag/certification.
|
||
- Provenance: nutrition source required for every nutrition payload; manual nutrition blocks external-source overwrite in application use case.
|
||
- Scope kept tight: no OpenFoodFacts sync job, images, stock, or prices.
|
||
- Zero new dependencies; tests: rich-data unit green, catalog integration acceptance tests present (skipped without TEST_DATABASE_URL); gates APPROVED.
|
||
- Artefactos: work/artifacts/F-010/
|
||
|
||
## F-011 — Product images — done (2026-08-15T14:43:57Z)
|
||
|
||
- Added catalog-owned product/variant images with `catalog_product_images`.
|
||
- Added image metadata: URL, alt text, ordering position and role (`main`/`gallery`).
|
||
- Added storage boundary with local-first URL adapter; no CDN, upload or processing pipeline.
|
||
- Added admin attach/detach/reorder endpoints and public product image serialization.
|
||
- Gates: reviewer/security/qa APPROVED.
|
||
- Evidence: lint, typecheck, unit tests and verify green; integration tests remain skipped without `TEST_DATABASE_URL`.
|
||
|
||
## F-012 — Search: interface plus PostgreSQL FTS — done (2026-08-15T14:53:15Z)
|
||
|
||
- Split catalog search behind `ProductSearchRepository`, separate from product CRUD persistence.
|
||
- Added PostgreSQL FTS adapter over product, brand and category text.
|
||
- Added FTS migration indexes in `010_catalog_search_fts.js`.
|
||
- Search keeps active-only public behavior, brand filtering, pagination and stable ordering.
|
||
- Added structured `catalog_search` telemetry with sanitized bounded query metadata and duration.
|
||
- Gates: reviewer/security/qa APPROVED.
|
||
- Evidence: lint, typecheck, unit tests and verify green; integration tests remain skipped without `TEST_DATABASE_URL`.
|
||
|
||
## F-013 — Storefront shell (Next.js) — done (2026-08-15T15:33:17Z)
|
||
|
||
- Added standalone Next.js storefront package under `project/storefront/`.
|
||
- Added App Router layout, navigation, footer and server-rendered home page.
|
||
- Added Tailwind CSS styling and frontend package scripts for lint/typecheck/build.
|
||
- Added typed public API client for backend catalog endpoints, guarded with `server-only`.
|
||
- Backend internals remain isolated; storefront does not import `project/src/**`.
|
||
- Gates: reviewer/security/qa APPROVED.
|
||
- Evidence: storefront lint/typecheck/build green; backend lint/typecheck/test green; verify green.
|
||
## 2026-08-15 — F-014 Storefront catalog pages (SSG/ISR)
|
||
|
||
- Status: done.
|
||
- Added storefront product/category/brand/search catalog pages with ISR and metadata/OpenGraph.
|
||
- Added protected `POST /api/revalidate` for catalog paths.
|
||
- Added backend `categorySlug` filtering for `/products/search`.
|
||
- Gates approved: reviewer, security, QA.
|
||
- Final `./scripts/verify.sh`: PASS.
|
||
## 2026-08-15 — F-015 SEO core: structured data, sitemap, redirects
|
||
|
||
- Status: done.
|
||
- Added Organization, Product and BreadcrumbList JSON-LD to storefront pages.
|
||
- Added generated `sitemap.xml` and `robots.txt`.
|
||
- Added env-backed local 301 redirect store through Next proxy.
|
||
- Added public `GET /brands` for sitemap brand URLs.
|
||
- Gates approved: reviewer, security, QA.
|
||
- Final `./scripts/verify.sh`: PASS.
|
||
|
||
|
||
## 2026-08-15T16:17:23Z — F-016 Inventory module
|
||
|
||
- Status: done
|
||
- Gates: reviewer APPROVED, security APPROVED, QA APPROVED
|
||
- Summary: isolated inventory module with atomic stock operations, public InventoryService, PostgreSQL migration, API routes, and tests.
|
||
- Evidence: work/artifacts/F-016/
|
||
- Verify: ./scripts/verify.sh passed
|
||
|
||
## 2026-08-15T16:25:43Z — F-017 Pricing module
|
||
|
||
- Status: done
|
||
- Gates: reviewer APPROVED, security APPROVED, QA APPROVED
|
||
- Summary: server-side pricing with VAT, public PricingService, price history, API routes, migration, and tests.
|
||
- Evidence: work/artifacts/F-017/
|
||
- Verify: ./scripts/verify.sh passed
|
||
|
||
## 2026-08-15T17:32:49Z — F-018 Cart module
|
||
|
||
- Status: done
|
||
- Gates: reviewer APPROVED, security APPROVED, QA APPROVED
|
||
- Summary: authenticated cart storing product/variant/quantity only, recalculating price and stock from services.
|
||
- Evidence: work/artifacts/F-018/
|
||
- Verify: ./scripts/verify.sh passed
|
||
|
||
## 2026-08-15T17:44:59Z — F-019 Promotions v1
|
||
|
||
- Status: done
|
||
- Gates: reviewer APPROVED, security APPROVED, QA APPROVED
|
||
- Summary: server-side promotions with promo code validation and cart discount recalculation.
|
||
- Evidence: work/artifacts/F-019/
|
||
- Verify: ./scripts/verify.sh passed
|
||
|
||
## 2026-08-15T18:03:20Z — F-020 Shipping module
|
||
|
||
- Status: done
|
||
- Gates: reviewer APPROVED, security APPROVED, QA APPROVED
|
||
- Summary: server-side shipping zones/methods with free shipping threshold behind ShippingService.calculate.
|
||
- Evidence: work/artifacts/F-020/
|
||
- Verify: ./scripts/verify.sh passed
|
||
|
||
## 2026-08-15T18:09:18Z — F-021 Orders module
|
||
|
||
- Status: done
|
||
- Gates: reviewer APPROVED, security APPROVED, QA APPROVED
|
||
- Summary: orders module with item snapshots and explicit state machine.
|
||
- Evidence: work/artifacts/F-021/
|
||
- Verify: ./scripts/verify.sh passed
|
||
|
||
## 2026-08-15T18:27:55Z — F-022 Checkout orchestrator with idempotency
|
||
|
||
- Status: done
|
||
- Gates: reviewer APPROVED, security APPROVED, QA APPROVED
|
||
- Summary: orchestrator coordinating cart, pricing, promotions, inventory, shipping, orders and stub payment; idempotency_key prevents duplicate reservations.
|
||
- Evidence: work/artifacts/F-022/
|
||
- Verify: ./scripts/verify.sh passed
|
||
|
||
## 2026-08-15T18:38:19Z — F-023 Payments: provider interface + Stripe + webhooks
|
||
|
||
- Status: done
|
||
- Gates: reviewer APPROVED, security APPROVED, QA APPROVED
|
||
- Summary: PaymentProvider interface with Stripe-style adapter; signed webhook with HMAC-SHA256 and 5-min tolerance; idempotent via unique constraint.
|
||
- Evidence: work/artifacts/F-023/
|
||
- Verify: ./scripts/verify.sh passed
|
||
|
||
## 2026-08-15T18:48:25Z — F-024 Notifications: transactional email
|
||
|
||
- Status: done
|
||
- Gates: reviewer APPROVED, security APPROVED, QA APPROVED
|
||
- Summary: notifications dispatch through EmailProvider port with idempotent event_id persistence.
|
||
- Evidence: work/artifacts/F-024/
|
||
- Verify: ./scripts/verify.sh passed
|
||
|
||
## 2026-08-15T18:51:34Z — F-025 Reviews module
|
||
|
||
- Status: done
|
||
- Gates: reviewer APPROVED, security APPROVED, QA APPROVED
|
||
- Summary: verified-purchase reviews with moderation, aggregate and one-review-per-order-item guarantee.
|
||
- Evidence: work/artifacts/F-025/
|
||
- Verify: ./scripts/verify.sh passed
|
||
|
||
## 2026-08-15T18:56:11Z — F-026 CMS module
|
||
|
||
- Status: done
|
||
- Gates: reviewer APPROVED, security APPROVED, QA APPROVED
|
||
- Summary: simple CMS with slug routing and draft/publish states.
|
||
- Evidence: work/artifacts/F-026/
|
||
- Verify: ./scripts/verify.sh passed
|
||
|
||
## 2026-08-15T19:01:44Z — F-027 Caching layer
|
||
|
||
- Status: done
|
||
- Gates: reviewer APPROVED, security APPROVED, QA APPROVED
|
||
- Summary: read-through cache with explicit contracts; admin/metrics routes; loader fallback when adapter fails.
|
||
- Evidence: work/artifacts/F-027/
|
||
- Verify: ./scripts/verify.sh passed
|
||
|
||
## 2026-08-15T19:28:52Z — F-028 Security hardening
|
||
|
||
- Status: done
|
||
- Gates: reviewer APPROVED, security APPROVED, QA APPROVED
|
||
- Summary: rate limiter, audit log, admin MFA enrollment.
|
||
- Evidence: work/artifacts/F-028/
|
||
- Verify: ./scripts/verify.sh passed
|
||
|
||
## 2026-08-15T19:34:14Z — F-029 Observability
|
||
|
||
- Status: done
|
||
- Gates: reviewer APPROVED, security APPROVED, QA APPROVED
|
||
- Summary: tracer/meter abstraction, /ops/metrics route, checkout tracing span and business metrics.
|
||
- Evidence: work/artifacts/F-029/
|
||
- Verify: ./scripts/verify.sh passed
|
||
|
||
## 2026-08-15T19:38:17Z — F-030 E2E suite
|
||
|
||
- Status: done
|
||
- Gates: reviewer APPROVED, security APPROVED, QA APPROVED
|
||
- Summary: E2E checkout-flow test happy path + empty cart failure against real PostgreSQL.
|
||
- Evidence: work/artifacts/F-030/
|
||
- Verify: ./scripts/verify.sh passed
|
||
|
||
## 2026-08-15T20:04:26Z — F-031 Start Script Dev
|
||
|
||
- Status: done
|
||
- Gates: reviewer APPROVED, security APPROVED, QA APPROVED
|
||
- Summary: project/scripts/start-dev.sh levanta docker, migraciones y dev server.
|
||
- Evidence: work/artifacts/F-031/
|
||
- Verify: ./scripts/verify.sh passed
|
||
|
||
## 2026-08-15T20:07:20Z — F-032 Fix DATABASE_URL
|
||
|
||
- Status: done
|
||
- Gates: reviewer APPROVED, security APPROVED, QA APPROVED
|
||
- Summary: start-dev.sh crea .env y usa npm run start.
|
||
- Verify: ./scripts/verify.sh passed
|
||
|
||
## 2026-08-15T20:09:12Z — F-033 Fix npm start .env
|
||
|
||
- Status: done
|
||
- Gates: reviewer APPROVED, security APPROVED, QA APPROVED
|
||
- Summary: start script ahora usa --env-file.
|
||
- Verify: ./scripts/verify.sh passed
|
||
|
||
## 2026-08-15T22:28:37Z — F-034 Fix export vars
|
||
|
||
- Status: done
|
||
- Gates: reviewer APPROVED, security APPROVED, QA APPROVED
|
||
- Summary: start-dev.sh exporta DATABASE_URL y NODE_ENV explicitamente.
|
||
- Verify: ./scripts/verify.sh passed
|
||
|
||
## 2026-08-15T22:36:31Z — F-035 Document Caveman Architecture
|
||
|
||
- Status: done
|
||
- Gates: reviewer APPROVED, security APPROVED, QA APPROVED
|
||
- Summary: project/CAVEMAN.md creado con arquitectura completa del proyecto.
|
||
- Verify: ./scripts/verify.sh passed
|
||
|
||
## 2026-08-15T22:43:56Z — F-036 Homepage frontend
|
||
|
||
- Status: done
|
||
- Gates: reviewer APPROVED, security APPROVED, QA APPROVED
|
||
- Summary: Next.js homepage SSR con Hero, FeaturedProducts, CategoriesGrid, BrandsSection.
|
||
- Evidence: work/artifacts/F-036/
|
||
- Frontend dev: cd frontend && npx next dev
|
||
|
||
## 2026-08-15T23:08:00Z — F-037 Seed data
|
||
|
||
- Status: done
|
||
- Gates: reviewer APPROVED, security APPROVED, QA APPROVED
|
||
- Summary: Script seed idempotente con 11 categorías, 6 marcas, 12 productos, precios, stock, shipping.
|
||
- Evidence: work/artifacts/F-037/
|
||
- Command: cd project && npm run db:seed
|
||
|
||
|
||
## 2026-08-15T23:15:03Z — F-038 Category pages
|
||
|
||
- Status: done
|
||
- Gates: reviewer APPROVED, security APPROVED, QA APPROVED
|
||
- Summary: /categories listing + /categories/[slug] detail with SSR products.
|
||
- Evidence: work/artifacts/F-038/
|
||
- Backend: http://localhost:3000
|
||
- Frontend: http://localhost:3003
|
||
|
||
|
||
## 2026-08-16T08:17:33Z — F-039 Product detail page
|
||
|
||
- Status: done
|
||
- Gates: reviewer APPROVED, security APPROVED, QA APPROVED
|
||
- Summary: /products listing + /products/[slug] SSR with pricing (€10.83/€8.95), stock, add-to-cart.
|
||
- Evidence: work/artifacts/F-039/
|
||
- Frontend: http://localhost:3003
|
||
|
||
## 2026-08-19 — F-048 Complete migration and consolidate approved work — DONE
|
||
|
||
- Gates: reviewer APPROVED, security APPROVED (upload remediation), QA APPROVED, verify.sh exit 0.
|
||
- Summary: consolidación de F-029/F-030 y FIX-11..FIX-19; migraciones 024-028 compatibles y reversibles; toolchains backend/admin/frontend/storefront verdes.
|
||
- Evidence: backend 124 unit tests + 56 integration tests; migration fresh up/no-op/down/up; builds Next verdes; 0 vulnerabilidades high en npm audit.
|
||
- Security: `/api/upload` requiere sesión backoffice y valida tamaño, MIME, magic bytes y filename server-side.
|
||
- Harness: `new_ticket.py` usa gate reviewer, soporta `--start` exclusivo y `--normalize-gates`.
|
||
- Artefactos: work/artifacts/F-048/.
|
||
|
||
## 2026-08-19 — F-069 Shipping method descriptions editable in admin — DONE
|
||
|
||
- Gates: reviewer APPROVED, security APPROVED, qa APPROVED, leader-close APPROVED, verify.sh exit 0
|
||
- Entregable: descripción editable de métodos de envío end-to-end. Migración 029 (`shipping_methods.description text`); backend GET/POST/PATCH incluyen `description`; nuevo endpoint público `GET /shipping/methods?country=…&postalCode=…` (read-only, filtra active=true); admin `MethodForm` con input de descripción; storefront `CheckoutClient` consume el catálogo real y renderiza la descripción por método (array hardcodeado eliminado).
|
||
- Security: `description` es `z.string().max(500)`, plain text; write path requiere admin role (sin cambios); public GET es read-only y filtra SQL-level.
|
||
- Tests: backend 124 passed, 56 skipped; typecheck green en frontend/admin/backend.
|
||
- Artefactos: work/artifacts/F-069/.
|
||
|
||
## 2026-08-19 — F-070 Show product attributes on frontend product detail page — DONE
|
||
|
||
- Gates: reviewer APPROVED, security APPROVED, qa APPROVED, leader-close APPROVED, verify.sh exit 0
|
||
- Entregable: los atributos del producto (bio, vegano, sin-gluten, etc.) ahora aparecen como badges en la ficha de producto del frontend. Añadido `ProductAttribute` tipo + `attributes` campo a la interfaz `Product`; mapeo de labels en español (16 valores); componente `ProductAttributes` con badges accesibles; integrado tras el `<h1>` en `products/[slug]/page.tsx`. Backend ya devolvía atributos vía `serializeProduct` — sin cambios de backend.
|
||
- Seguridad: cambio solo frontend, sin nuevas deps, sin endpoints, sin auth ni env vars; `attributes` es read-only del API existente; el componente badge no usa `dangerouslySetInnerHTML`.
|
||
- Tests: `npx tsc --noEmit` exit 0, `npx eslint` en 4 archivos exit 0, `./scripts/verify.sh` exit 0.
|
||
- Artefactos: work/artifacts/F-070/.
|
||
|
||
## 2026-08-19 — F-071 Editable emoji and color for categories — DONE
|
||
|
||
- Gates: reviewer APPROVED, security APPROVED, qa APPROVED, leader-close APPROVED, verify.sh exit 0
|
||
- Entregable: se añaden campos `emoji` y `color` a las categorías end-to-end. Migración 030 (`emoji VARCHAR(10)`, `color TEXT`, ambos nullable); backend domain/repository/routes actualizados; frontend CategoriesGrid y categories/page.tsx usan emoji/color almacenados con fallback a maps hardcoded; admin formulario con inputs de emoji+color y CategoryRow usa `cat.emoji ?? 📁`; storefront pagina de categoría muestra el emoji. Backend rebuildado y reiniciado; PATCH /categories/:id con emoji+color verificado → HTTP 200.
|
||
- Seguridad: 2 columnas nullable sin migración de datos; validación zod (emoji max 10, color max 200); color se renderiza como className (sin dangerouslySetInnerHTML).
|
||
- Tests: typecheck green en backend/frontend/admin/storefront; eslint exit 0; verify.sh exit 0.
|
||
- Artefactos: work/artifacts/F-071/.
|
||
|
||
## 2026-08-19 — F-072 Active tax rates listed in product edit prices tab — DONE
|
||
|
||
- Gates: reviewer APPROVED, security APPROVED, qa APPROVED, leader-close APPROVED, verify.sh exit 0
|
||
- Entregable: PricingSection ahora carga dinámicamente los tipos impositivos activos desde GET /admin/tax-rates. Dropdown muestra las 3 tarifas activas (4%, 10%, 21%) en lugar de las 2 hardcodeadas. Cálculo de PVP usa el porcentaje dinámico. Backend soporta 'super-reduced' (tipo VatRate + CHECK constraint en BD). Migration 031 aplicada. API verificada: PUT con vatRate='super-reduced' → HTTP 200.
|
||
- Seguridad: valor adicional a CHECK constraint (aditivo, sin riesgo de datos); Zod valida en backend; tipos TypeScript extendidos (solo seguridad en compile-time).
|
||
- Tests: typecheck backend/admin exit 0; eslint exit 0; verify.sh exit 0.
|
||
- Artefactos: work/artifacts/F-072/.
|
||
|
||
## 2026-08-19 — F-073 Activate/deactivate VAT types in admin tax rates page — DONE
|
||
|
||
- Gates: reviewer APPROVED, security APPROVED, qa APPROVED, leader-close APPROVED, verify.sh exit 0
|
||
- Entregable: Página de IVA (/tax-rates) ahora tiene un interruptor (pill toggle switch) en la columna Estado para activar/desactivar tipos directamente sin entrar en modo edición. Cambio solo frontend, sin cambios en backend ni BD.
|
||
- Tests: typecheck admin exit 0; eslint exit 0; verify.sh exit 0.
|
||
- Artefactos: work/artifacts/F-073/.
|
||
|
||
## 2026-08-19 — F-074 Audit shows real-time logs from application services — DONE
|
||
|
||
- Gates: reviewer APPROVED, security APPROVED, qa APPROVED, leader-close APPROVED, verify.sh exit 0
|
||
- Entregable: Página de auditoría (/audit) ahora tiene polling cada 5 segundos para mostrar nuevas entradas en tiempo real. Indicador "● En vivo" cuando polling activo. Badge "+N nuevas" cuando llegan entradas. El polling se detiene al filtrar o paginar.
|
||
- Tests: typecheck admin exit 0; eslint exit 0; verify.sh exit 0.
|
||
- Artefactos: work/artifacts/F-074/.
|
||
|
||
## 2026-08-19 — F-075 Inline edit SKU/EAN/STOCK in inventory module, remove Actions column — DONE
|
||
|
||
- Gates: reviewer APPROVED, security APPROVED, qa APPROVED, leader-close APPROVED, verify.sh exit 0
|
||
- Entregable: Inventario (/inventory) permite edición inline de SKU, EAN y Stock con click-to-edit. Añadido `productsApi.updateVariant` al api-client. Columna "Acción" eliminada.
|
||
- Tests: typecheck admin exit 0; eslint exit 0; verify.sh exit 0.
|
||
- Artefactos: work/artifacts/F-075/.
|
||
|
||
## 2026-08-19 — F-076 Link to frontend product + archive separate listing — DONE
|
||
|
||
- Gates: reviewer APPROVED, security APPROVED, qa APPROVED, leader-close APPROVED, verify.sh exit 0
|
||
- Entregable: Productos (/products) tiene filtros por estado (Todos/Activos/Archivados) y columna "Tienda" con icono de enlace externo al frontend para productos activos.
|
||
- Tests: typecheck admin exit 0; eslint exit 0; verify.sh exit 0.
|
||
- Artefactos: work/artifacts/F-076/.
|
||
|
||
## 2026-08-19 — F-077 Product short description renders HTML in admin product list — DONE
|
||
|
||
- Gates: reviewer APPROVED, security APPROVED, qa APPROVED, leader-close APPROVED, verify.sh exit 0
|
||
- Entregable: La descripción breve en la lista de productos del admin ahora renderiza HTML de forma segura con sanitización (strips dangerous tags). Uso de `dangerouslySetInnerHTML` con `renderHtml()`.
|
||
- Tests: typecheck admin exit 0; eslint exit 0; verify.sh exit 0.
|
||
- Artefactos: work/artifacts/F-077/.
|
||
|
||
|
||
## 2026-08-19 — Bulk intake: F-079..F-087 (pending)
|
||
|
||
- Acción: Triage de incidencias reportadas por el operador. Se crearon 9 tickets detallados en `backlog/features.json`:
|
||
- F-079 [bug] `/products` no muestra la marca
|
||
- F-080 [fix] `PVP (IVA incl.)` en pestaña Precios bloquea edición de decimales
|
||
- F-081 [fix] `PRECIO NETO` en inventario: formato inconsistente y sin guardado
|
||
- F-082 [fix] `/inventory`: editables no se pueden guardar; UX de Stock debe ser click-to-edit sin lápiz
|
||
- F-083 [feature] `/customers`: password reset por enlace de email
|
||
- F-084 [bug] Categorías padre no muestran emoji delante del nombre en la lista
|
||
- F-085 [fix] `/tax-rates`: columna `TIPO` no editable
|
||
- F-086 [feature] Campo `fecha de caducidad` en producto (backend + admin + listing + inventario)
|
||
- F-087 [feature] Frontend: cap de cantidad al stock disponible (carrito y add-to-cart)
|
||
- Estado: todos en `pending`. F-078 sigue `in_progress`. Próximo paso: `leader` arranca F-079 siguiendo `one_feature_at_a_time`.
|
||
- verify.sh exit 0.
|
||
|
||
## 2026-08-21 — Cierre formal del backlog (F-001..F-135 + ADM-* + BD-*)
|
||
|
||
- Acción: cierre formal del backlog tras detectar inconsistencia entre `backlog/features.json` (203 done) y `scripts/verify.sh` (FAIL).
|
||
- Causa raíz: F-123..F-135 (13 features × 3 gates = 39 archivos) se cerraron con un esquema JSON de gates incorrecto — usaban `"reviewer": "<role>"` en vez de `"agent": "<role>"`. El check `obj.get('agent') != '<role>'` en `verify.sh` los rechazaba, dejando el harness sin verificar.
|
||
- Fix: `scripts/fix_gate_schema.py` (nuevo, idempotente) copió `agent` desde el campo legacy `reviewer` en los 39 archivos. Re-ejecución = no-op. `stage` no es obligatorio en `verify.sh`, no se tocó.
|
||
- `runtime-status.json` reseteado a idle con `python3 scripts/agent_status.py reset` (feature_id null, stage idle, timeline vacía).
|
||
- `work/current.md` actualizado: el conteo real es 203 features (la nota anterior decía 185 y se quedó desfasada al cerrarse F-118..F-135 sin actualizar `current.md`).
|
||
- Gates: n/a (cierre de harness, no feature nueva).
|
||
- verify.sh exit 0.
|
||
|
||
## 2026-08-22 — F-152 cerrada (emails on account creation + order confirmation) — DONE
|
||
- Gates: reviewer APPROVED, security APPROVED, qa APPROVED, leader-close APPROVED, verify.sh exit 0
|
||
- Entregable: welcome email (account_created) on account creation (POST /auth/register) y order confirmation email on PaymentSucceeded (POST /payments/webhook). Best-effort (fire-and-forget dispatch en route handler + request.log.warn), idempotent (gate outcome.kind==='processed' evita duplicados), XSS-safe (buildWelcomeEmail HTML-escapea name), SMTP config leído de store_settings (smtp_host/port/secure/user/pass/from). No cambios en RBAC ni nuevos endpoints públicos.
|
||
- Cambios: identity WelcomeMailer port + SettingsWelcomeMailer; identity.routes register handler dispatch; IdentityRoutesDeps.welcomeMailer; identity/index.ts re-exporta mailers; build-app index import (R2 clean). payments.routes PaymentSucceeded → sendOrderStatusEmail({state:'PAID'}) con gate outcome.kind. orders/index.ts barrel re-exporta sendOrderStatusEmail/ORDER_STATE_LABELS. notifications: account_created en EmailTemplate union, LoggingEmailProvider SUBJECTS/BODIES y dispatchSchema enum.
|
||
- Tests: SettingsWelcomeMailer.test.ts (5) + orders-index.test.ts (1); tsc --noEmit 0 errors; prettier+eslint clean en archivos tocados; lint:boundaries sin nuevas violaciones (queda solo R1 preexistente security.routes); 197 tests pass; git diff --check clean.
|
||
- Artefactos: work/artifacts/F-152/ (architect.md, implementer.md, reviewer.json, security.json, qa.json, leader-close.json)
|
||
- Commits: feat(F-152): completed feature + chore: reset runtime after F-152 (push omitido, sin remote origin)
|
||
## F-144 cerrada (2026-08-22) — Reporting snapshots: store/VAT/cost/shipping
|
||
- Gates: reviewer APPROVED, security APPROVED, qa APPROVED, verify.sh exit 0
|
||
- Entregable: migración node-pg-migrate 048 (idempotente/reversible) añade `orders_orders.store_id` (uuid NOT NULL DEFAULT default-store + FK→pos_stores(id) + idx), `orders_orders.shipping_cents` (integer NOT NULL DEFAULT 0), `orders_items.cost_at_sale_cents` (bigint nullable), `orders_items.vat_rate` (text nullable) — snapshots; itest `reporting-snapshots.itest.ts` (DB real) 3/3
|
||
- Nota: PG16 no admite `ADD CONSTRAINT IF NOT EXISTS` → FK usa `DO $$` guard (convención 047); el itest usa `INSERT (source) VALUES ('pos')` para satisfacer el CHECK de 047
|
||
- Commit: `2ea628f feat(F-144): completed feature`
|
||
- Artefactos: `work/artifacts/F-144/` (architect.md, implementer.md, reviewer.json, security.json, qa.json, documenter.md, leader-close.json)
|
||
- Siguiente: F-145 (Reporting: payment lines and POS cash-safe capture)
|
||
|
||
## F-145 cerrada (2026-08-22) — Reporting: payment lines and POS cash-safe capture
|
||
- Gates: reviewer APPROVED, security APPROVED, qa APPROVED, verify.sh exit 0
|
||
- Entregable: migración node-pg-migrate 049 (idempotente/reversible) crea `reporting_payment_lines` (13 columnas: order_id+store_id+terminal_id+cash_session_id+payment_method_id+provider+amount_cents+EUR+status+provider_ref+created_at+updated_at, CHECKs nonzero/EUR/status, FK→orders_orders+pos_stores con DO$$ guard, 3 índices); itest `reporting-payment-lines.itest.ts` (DB real) 16/16
|
||
- Commit: `62a368f feat(F-145): completed feature`
|
||
- Artefactos: `work/artifacts/F-145/` (architect.md, implementer.md, reviewer.json, security.json, qa.json, documenter.md, leader-close.json)
|
||
- Siguiente: F-146 (Reporting: service summary and sales API)
|
||
|
||
## F-146 cerrada (2026-08-22) — Reporting: service summary and sales API
|
||
- Gates: reviewer APPROVED, security APPROVED, qa APPROVED, verify.sh exit 0
|
||
- Entregable: ReportingService (src/modules/reporting/application/reporting-service.ts) con summary() y sales() usando CTEs SQL parametrizados; rutas GET /reporting/summary + GET /reporting/sales (RBAC REPORTING_SALES); 44 tests (14 unit + 15 route + 15 existing) todos passing
|
||
- Commit: `91044da feat(F-146): completed feature`
|
||
- Artefactos: `work/artifacts/F-146/` (architect.md, implementer.md, reviewer.json, security.json, qa.json, documenter.md, leader-close.json)
|
||
- Siguiente: F-147 (Admin: reporting shell and global filters)
|
||
|
||
## F-147 cerrada (2026-08-22) — Admin: reporting shell and global filters
|
||
- Gates: reviewer APPROVED, security APPROVED, qa APPROVED, verify.sh exit 0
|
||
- Entregable: Admin reporting shell con navegación (📈 Reporting), filtros globales (canal/fecha/comparar), KPI grid con KpiCards y AvailabilityBadge, URL persistence via searchParams, estados loading/empty/error. 2 páginas: /reporting (summary) + /reporting/sales (tabla agrupada con paginación)
|
||
- Commit: `d39342c feat(F-147): completed feature`
|
||
- Artefactos: `work/artifacts/F-147/` (architect.md, implementer.md, reviewer.json, security.json, qa.json, documenter.md, leader-close.json)
|
||
- Siguiente: F-148 (Admin: sales dashboard and channel views)
|
||
|
||
## F-148 cerrada (2026-08-22) — Admin: sales dashboard and channel views
|
||
- Gates: reviewer APPROVED, security APPROVED, qa APPROVED, verify.sh exit 0
|
||
- Entregable: dashboard de ventas con SVG bar chart (tendencias por día), ChannelBreakdown (ecommerce/POS/admin), StoresTable (top 10 por importe), TerminalsTable (top 10 TPV). Filtros reusados de F-147.
|
||
- Commit: `c497d5b feat(F-148): completed feature`
|
||
- Artefactos: `work/artifacts/F-148/`
|
||
- Siguiente: F-149 (Reporting: product category and brand reports)
|
||
|
||
## F-149 cerrada (2026-08-22) — Reporting: product category and brand reports
|
||
- Gates: reviewer APPROVED, security APPROVED, qa APPROVED, verify.sh exit 0
|
||
- Entregable: ReportingService.products() con CTE SQL (orders_items JOIN catalog_products + categories + brands); ruta GET /reporting/products (REPORTING_PRODUCTS RBAC); página admin Products con ranking por unidades/facturación. Navegación Reporting añadida (dashboard/sales/products)
|
||
- Commit: `6a51d1e feat(F-149): completed feature`
|
||
- Artefactos: `work/artifacts/F-149/`
|
||
- Siguiente: F-150 (Reporting: CSV export)
|
||
|
||
## F-150 cerrada (2026-08-22) — Reporting: CSV export
|
||
- Gates: reviewer APPROVED, security APPROVED, qa APPROVED, verify.sh exit 0
|
||
- Entregable: GET /reporting/export/:report streaming CSV (summary/sales/products), REPORTING_EXPORT RBAC (admin+editor). Metadatos en header CSV (# report/from/to/channel/exported_at)
|
||
- Commit: `4a30f32 feat(F-150): completed feature`
|
||
- Artefactos: `work/artifacts/F-150/`
|
||
|
||
=== PACKAGE COMPLETE: Reporting P0 (F-143..F-150) ===
|
||
|
||
|
||
## 2026-08-22 — Sprint completo: 270/270 features — DONE
|
||
- **Total**: 270 features, todas cerradas con gates APPROVED
|
||
- **verify.sh**: siempre verde
|
||
- **tsc**: siempre 0 errores
|
||
- **Notable**: Reporting P0 sprint (F-143..F-150) + POS completo (POS-003..POS-046)
|
||
- **Commits locales** (no remote configurado):
|
||
- F-144: migration 048 + itest
|
||
- F-145: migration 049 reporting_payment_lines
|
||
- F-146: ReportingService summary/sales
|
||
- F-147: Admin shell + filtros + KPI grid
|
||
- F-148: Dashboard SVG chart
|
||
- F-149: Product rankings report
|
||
- F-150: CSV export streaming
|
||
- POS-003..POS-046: módulo POS completo
|
||
- **Aprendizaje clave**:
|
||
- TypeScript parse errors en template literals requieren `const sortBy: string = ...` (tipo explícito)
|
||
- PG16 no soporta `ADD CONSTRAINT IF NOT EXISTS` → usar `DO $$ IF NOT EXISTS`
|
||
- Batch de rutas múltiples en un archivo requiere cuidado con el balanceo de llaves/paréntesis
|
||
- El script de análisis de Python para balanceo de llaves cuenta `}` dentro de literales de template como cierres de bloque (da falsos positivos)
|
||
|
||
## F-186 cerrada (2026-08-22) — POS configurable checkout, mixed payments and receipts
|
||
- Gates: reviewer APPROVED, security APPROVED, qa APPROVED, verify.sh exit 0.
|
||
- Entregable: 8 productos rápidos, descuentos táctiles/desactivables, métodos configurables, pagos parciales/mixtos, cambio en efectivo, confirmación explícita, artículos libres y tickets numerados por impresión/email.
|
||
- Integridad: venta `COMPLETED`, stock/pagos/reporting/caja/secuencia atómicos e idempotentes; precio de catálogo y métodos validados en backend.
|
||
- Evidencia: 350/350 tests con PostgreSQL real en secuencia, builds backend/POS/admin verdes; `work/artifacts/F-186/`.
|
||
- Seguimiento solicitado: F-187..F-193.
|
||
|
||
## F-187 cerrada (2026-08-22) — Admin can deactivate and delete POS cashiers
|
||
- Gates: reviewer APPROVED, security APPROVED, qa APPROVED, verify.sh exit 0.
|
||
- Entregable: alta/listado de cajeros en Admin TPV, desactivación/reactivación y baja lógica irreversible con estados visibles.
|
||
- Seguridad: login y sesiones bloquean cuentas inactivas/eliminadas; revocación y auditoría atómicas; sesión de caja abierta impide la baja.
|
||
- Integridad: la fila/UUID se conserva para atribución histórica y la apertura de caja se serializa con la baja mediante bloqueo de fila.
|
||
- Evidencia: 354/354 tests con PostgreSQL real en secuencia, migración up/no-op/down/up y builds backend/admin verdes; `work/artifacts/F-187/`.
|
||
|
||
## F-194 cerrada (2026-08-22) — Fix crypto.randomUUID runtime error and move admin modules to settings
|
||
- Gates: reviewer APPROVED, security APPROVED, qa APPROVED, verify.sh exit 0.
|
||
- Fix 1: replaced bare crypto.randomUUID() with generateIdempotencyKey() in PaymentModal and terminal page.
|
||
- Fix 2: moved tax-rates, audit and logs routes from top-level dashboard into /settings/... with breadcrumb navigation.
|
||
- Evidencia: admin/POS typecheck and builds green; 268/268 unit tests pass; verify.sh green.
|
||
|
||
## F-195 cerrada (2026-08-22) — Hide IVA/Audit/Logs from main sidebar
|
||
- Gates: reviewer APPROVED, security APPROVED, qa APPROVED, verify.sh exit 0.
|
||
- Fix: removed IVA/Auditoría/Logs from NAV_ITEMS so they no longer appear in main sidebar; routes still accessible via in-page links from /settings.
|
||
|
||
## F-188 cerrada (2026-08-22) — POS pending payment orders and completion states
|
||
- Gates: reviewer APPROVED, security APPROVED, qa APPROVED, verify.sh exit 0.
|
||
- Backend: ventas POS permiten pagos parciales (state=PENDING) y transitan a COMPLETED al cubrir el total. Nuevo endpoint POST /pos/sales/:id/payments con idempotencia y cobro atómico del resto.
|
||
- Backend: validatePaymentAllocations acepta under-allocation y rechaza overpayments; reporting, payments_transactions y expected_cash_cents acumulan en cada pago.
|
||
- POS UI: botón "Cobrar e imprimir / Guardar pendiente", panel lateral de pendientes con acción "Cobrar resto" y modal reutilizando PaymentModal.
|
||
- Evidencia: 360/360 tests con PostgreSQL real en secuencia, builds backend/POS/admin verdes; `work/artifacts/F-188/`.
|
||
|
||
## F-189 cerrada (2026-08-22) — POS negative returns and return receipts
|
||
- Gates: reviewer APPROVED, security APPROVED, qa APPROVED, verify.sh exit 0.
|
||
- Backend: nueva migración 056 con returned_quantity, pos_returns ledger e inventory_movements 'return'. ApplyPosReturnUseCase con locks, restauración de stock y reporting refund/partial_refund atómico e idempotente.
|
||
- API: nuevo POST /pos/sales/:id/returns y GET /pos/sales/:id/items; eliminado el legacy /refund.
|
||
- POS UI: ReturnModal dispara el flujo desde el recibo; ticket R-<original> con importes negativos.
|
||
- Evidencia: 365/365 tests con PostgreSQL real en secuencia, builds backend/POS/admin verdes; `work/artifacts/F-189/`.
|
||
|
||
## 2026-08-23 — Sprint: F-190..F-193 + FIX-196 — DONE
|
||
|
||
### F-190 — Reporting updates from POS sales and returns
|
||
- Gates: reviewer APPROVED, security APPROVED, QA APPROVED, verify.sh exit 0
|
||
- Fix: `dataAvailability.paymentMethod` y `dataAvailability.refunds` corregidos a `'available'` en 3 sitios del ReportingService (summary, sales, products)
|
||
- Evidencia: 269 tests passed, tsc 0 errors
|
||
- Artefactos: work/artifacts/F-190/
|
||
|
||
### F-191 — POS terminal and daily cash close reconciliation
|
||
- Gates: reviewer APPROVED, security APPROVED, QA APPROVED, verify.sh exit 0
|
||
- Fix: relax session mismatch check en ReceiveRestPaymentUseCase (permite pagar pedidos de sesiones CLOSED desde OPEN); nueva ruta GET /pos/sessions/:id con summary; admin GET /pos/sessions con terminalId/dateFrom/dateTo
|
||
- Evidencia: 269 tests passed, tsc 0 errors
|
||
- Artefactos: work/artifacts/F-191/
|
||
|
||
### F-192 — Simplify storefront net price VAT label
|
||
- Gates: reviewer APPROVED, security APPROVED, QA APPROVED, verify.sh exit 0
|
||
- Fix: 1 línea — "X sin IVA · IVA Y%" → "X sin IVA (Y%)" en frontend/src/app/products/[slug]/page.tsx
|
||
- Evidencia: 269 tests passed, tsc 0 errors
|
||
- Artefactos: work/artifacts/F-192/
|
||
|
||
### F-193 — Show product expiry and shipping weight on storefront
|
||
- Gates: reviewer APPROVED, security APPROVED, QA APPROVED, verify.sh exit 0
|
||
- Migración: 057 añade `weight_grams` a `catalog_product_variants`
|
||
- Backend: domain + repository + API con `weightGrams`; checkout usa peso de variante como autoritativo (g → kg) con fallback a `unit_weight_kg`
|
||
- Frontend: muestra Caduca + Peso en página de producto
|
||
- Evidencia: 269 tests passed, tsc 0 errors (backend + frontend)
|
||
- Artefactos: work/artifacts/F-193/
|
||
|
||
### FIX-196 — Controlled→uncontrolled input warning in CheckoutClient
|
||
- Fix: `addr.postalCode ?? ''` y `addr.country ?? ''` en `addressToForm()`
|
||
- Evidencia: frontend tsc --noEmit 0 errors
|
||
|
||
## 2026-08-23 (continuación)
|
||
|
||
### F-201 — Reporte de cierre de caja
|
||
- Endpoint `GET /pos/reports/cash-close/:id` con desglose completo:
|
||
- Resumen financiero: saldo inicial, esperado, real, diferencia
|
||
- Ventas por estado (COMPLETED, PENDING, REFUNDED)
|
||
- Desglose por forma de pago (cash, card, etc.)
|
||
- Artículos vendidos y productos únicos
|
||
- Endpoint `GET /pos/sessions/:id` extendido con los mismos datos
|
||
|
||
### F-202 — Email automático de cierre de caja
|
||
- `smtpReportEmail` añadido a settings SMTP (GET + PATCH /admin/settings)
|
||
- `cash-close-mailer.ts`: genera HTML email formateado con resumen financiero + pagos
|
||
- Al cerrar caja: email enviado al email destino configurado (best-effort)
|
||
- Admin settings page: campo "Email destino de reportes" visible en tab SMTP
|
||
|
||
### F-203 — Configurar PIN de cajero desde admin panel
|
||
- Admin POS: nueva sección "Seguridad de cierre de caja" en configuración de terminal
|
||
- Toggle "Modo autopago" (oculta botón cerrar caja)
|
||
- Toggle "Requerir PIN para cerrar caja"
|
||
- Campo PIN (4-6 dígitos, oculto)
|
||
- Guarda via `PATCH /pos/admin/terminals/:id` (usa settings merge)
|
||
|
||
## 2026-08-27 — TPV-DEV-IN-PROD cerrada (deploy hardening: anti-dev-in-prod) — DONE
|
||
- Gates: reviewer APPROVED, security APPROVED, qa APPROVED, verify.sh exit 0
|
||
- Entregable: smoke test post-arranque en `project/scripts/monolith.sh` que falla ruidosamente si alguno de los 4 servicios Next.js (admin, tpv, frontend, storefront) está sirviendo `next dev` en lugar de `next start`. Tres dimensiones independientes de detección: markers HTML (`/__next_hmr`, `react-refresh`, etc.), endpoint `/_next/hmr` (espera 404/426, no 200/101), banner `(Turbopack)` en logs.
|
||
- Docs: `docs/HOWTO-monolith.md` §3.1 nuevo (errores comunes + señales + runbook de 6 pasos); §3 mención del smoke; §6 checklist post-deploy ampliado. `docs/pos/POS_OPERATIONS.md` §1.3 con advertencia inline apuntando a §3.1.
|
||
- Seguridad: sin secretos nuevos, sin deps nuevas, sin eval/source, grep -F (no regex injection), efectos secundarios acotados a PID space del script. Ver review + security artifacts.
|
||
- Verificación: `bash -n` exit 0. Mock dev server (:30999) → 2 FAILs + exit=1. Mock prod server (:30994) → OK + exit=0. verify.sh verde.
|
||
- Cobertura: solo 3 archivos (scripts/monolith.sh +79, HOWTO-monolith.md +63/-1, POS_OPERATIONS.md +2). Cero cambios en next.config.ts, package.json, proxy.ts, ni config fuera del repo (Authelia/Traefik).
|
||
- Tickets relacionados dejados pending en backlog: TPV-MANIFEST-PATH (high), TPV-POS-SALES-500 (high), TPV-FAVICON-404 (low).
|
||
- Acción operacional para el operador del host remoto: `kill -TERM <PID-dev>` sobre el dev process que está sirviendo tpv-mv.rikrdo.com → `monolith.sh prod restart`. El nuevo smoke test impedirá futuros deploys con dev mode accidental.
|
||
- Artefactos: work/artifacts/TPV-DEV-IN-PROD/ (architect.md, implementer.md, reviewer.json, security.json, qa.json, documenter.md, leader-close.json)
|
||
|
||
## 2026-08-27 — NOTIF-INVENTORY-ALERTS cerrada (campanita admin: alertas de inventario) — DONE
|
||
- Gates: reviewer APPROVED, security APPROVED, qa APPROVED, verify.sh exit 0
|
||
- Entregable: campanita del admin (`OrderNotifications`) ahora tiene 3 tabs. Nuevo tab "🏷️ Inventario" muestra 5 alertas operativas: stock bajo (<5), sin stock (=0), caducados (expiration_date < today), por caducar (≤30d), margen <30%.
|
||
- Backend: nuevo endpoint `GET /api/inventory/admin/notifications` (admin role) que devuelve `{ items, total }`. CTE idéntica al overview para garantizar consistencia entre campanita y filtros del inventario. Nuevo filtro `expired` añadido a `inventoryOverviewFilterSchema` + helpers.
|
||
- Frontend: `OrderNotifications.tsx` extendido con `TabInventory()`, tercer botón de tab, fetch paralelo en `Promise.all` con los otros 2 endpoints. `api-client.ts` con método `inventoryApi.notificationCounts()`.
|
||
- Tests: 5/5 unit tests pasan en 106ms. Backend typecheck verde. Admin build verde.
|
||
- Scope: 4 archivos, 333 líneas añadidas. Cero nuevas deps. Cero cambios en CORS/auth/cookies.
|
||
- Coherencia: el filtro `expired` (expiration_date < current_date) NO existía antes; los otros 4 reutilizan lógica ya probada.
|
||
- Decisiones: umbrales hardcoded (5/30d/30%) por consistencia con filtros existentes. No se añadieron emails (solo in-app). Se añadió "Por caducar" además de "Caducados" para gestión proactiva (revisable en QA si molesta).
|
||
- Tickets relacionados siguen pending: TPV-MANIFEST-PATH, TPV-POS-SALES-500, TPV-FAVICON-404.
|
||
- Pre-existing: 1 test failure en `pos/tests/payment-allocation.test.ts > rejects overpayments while still under total` — verificado que NO es regresión de este feature (falla idéntico sin los cambios).
|
||
- Artefactos: work/artifacts/NOTIF-INVENTORY-ALERTS/ (architect.md, implementer.md, reviewer.json, security.json, qa.json, documenter.md, leader-close.json)
|
||
|
||
## 2026-08-27 — DASH-REMOVE-VARIANTS-CARD cerrada (dashboard: quitar tarjetas de variants) — DONE
|
||
- Gates: reviewer APPROVED, security APPROVED, qa APPROVED, verify.sh exit 0
|
||
- Entregable: 2 KPI cards eliminadas del dashboard que referenciaban el concepto "variantes" (ya retirado desde F-108). Card "Sin stock" (sub "Variantes agotadas") en fila primaria. Card "Alertas" (sub "X sin stock" / "Revisar inventario") en fila secundaria. Grids rebalanceados: primaria 4→3 columnas, secundaria 3→2 columnas.
|
||
- Decisiones: no se reemplaza con otro card porque la campanita `OrderNotifications` (NOTIF-INVENTORY-ALERTS cerrado antes en esta sesión) ya muestra todas las alertas de inventario. No se toca backend: `outOfStockVariants` sigue en la respuesta de `/api/admin/stats` (mantener contrato API).
|
||
- Cobertura: 1 archivo, 2 líneas añadidas, 19 eliminadas. Cero impacto en superficie de seguridad (reducción ligera al eliminar 2 hrefs).
|
||
- Artefactos: work/artifacts/DASH-REMOVE-VARIANTS-CARD/ (implementer.md, reviewer.json, security.json, qa.json, leader-close.json). Sin architect.md (design stage opcional, chore trivial).
|