# 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`.
