# F-151 — Implementer evidence ## Problema observado Los servicios estaban levantados y respondían HTTP 200, pero la base activa estaba vacía: - `catalog_products`: 0 - `catalog_product_variants`: 0 - `pricing_variant_prices`: 0 - `inventory_stock`: 0 - `categories_categories`: 0 - `brands_brands`: 0 - `backoffice_users`: 0 Por eso: - frontend no mostraba productos; - admin no aceptaba credenciales porque no existía ningún usuario backoffice. Además, al ejecutar `node scripts/seed.cjs`, fallaba desde POS-002: ```text there is no unique or exclusion constraint matching the ON CONFLICT specification ``` Causa: `inventory_stock` ya no es único por `variant_id`; ahora es único por `(variant_id, store_id)`. Tras crear usuario backoffice, había otro problema: login devolvía 200, pero la cookie `backoffice_session` se emitía con `Secure` en HTTP local, por lo que el navegador/curl no la reenviaba. ## Cambios ### `project/scripts/seed.cjs` - Limpia también `inventory_movements` para evitar movimientos obsoletos tras reseed. - Inserta stock con `store_id = DEFAULT_STORE_ID`. - Usa `ON CONFLICT (variant_id, store_id)`. - Crea/actualiza un usuario backoffice admin: - email por defecto: `admin@mdv.local` - password por defecto en seed dev: `Admin123456!` - configurable con `SEED_ADMIN_EMAIL` y `SEED_ADMIN_PASSWORD`. - si `NODE_ENV=production`, exige `SEED_ADMIN_PASSWORD` explícito. ### `project/src/modules/backoffice/api/backoffice.routes.ts` - Cookie `backoffice_session` ahora usa `secure` solo si la request es HTTPS o `x-forwarded-proto=https`. - En HTTP local/LAN la cookie se emite sin `Secure`, permitiendo que el admin mantenga sesión. ## Acciones aplicadas al entorno - Ejecutado `node scripts/seed.cjs` sobre la DB activa. - Reiniciado solo backend para cargar el cambio de cookie. ## Estado verificado Counts actuales: ```text products: 12 variants: 12 prices: 12 stock: 12 categories: 11 brands: 6 backoffice_users: admin@mdv.local / admin ``` Pruebas: ```text GET /health backend/admin/frontend/storefront ✅ POST /backoffice/auth/login ✅ 200 Set-Cookie backoffice_session sin Secure en HTTP ✅ GET /backoffice/auth/me vía admin proxy ✅ GET /catalog/products?limit=2 vía admin proxy ✅ productos GET /products/search?limit=1 público ✅ productos GET frontend /products contiene productos ✅ npm run build ✅ npm test ✅ 191 passed, 56 skipped eslint/prettier archivos tocados ✅ ./scripts/verify.sh ✅ git diff --check ✅ ``` Nota: `npm run lint` global sigue fallando por errores preexistentes no tocados: - `scripts/generate-thumbnails.mjs`: unused import y empty block. - `src/infrastructure/logging/log-broadcaster.ts`: `no-this-alias`.