# POS-002 — Implementer notes ## Cambios ### Migraciones - `project/migrations/043_pos_basics.js` - Crea `pos_stores`, `pos_terminals`, `pos_payment_methods`, `pos_quick_products`, `pos_parked_tickets`, `pos_cash_sessions`. - Seed idempotente de la tienda por defecto **Natural - Mercado de Vida** (`natural-mercado-de-vida`) y métodos `cash` / `card`. - Índice parcial para impedir más de una sesión OPEN por terminal. - `project/migrations/044_pos_inventory_store.js` - Añade `store_id` a `inventory_stock` e `inventory_movements`. - Backfill de las 14 filas de stock y 13 movimientos existentes a la tienda por defecto. - Sustituye unicidad de `variant_id` por `(variant_id, store_id)`. - `project/migrations/045_pos_orders_source.js` - Añade `source`, `terminal_id`, `cash_session_id` a `orders_orders`. - Añade estado `COMPLETED` al CHECK. - Permite `user_id NULL` para walk-ins POS, pero añade CHECK `source = 'pos' OR user_id IS NOT NULL`. - `project/migrations/046_pos_backoffice_roles.js` - Añade roles `pos_cashier` y `pos_manager` al CHECK de `backoffice_users.role`. - `project/migrations/047_orders_user_required_when_not_pos.js` - Catch-up para bases que ya habían aplicado la versión inicial de 045 sin el CHECK de `user_id`. ### Dominio/auth - `src/shared/auth.ts`: `Role` ahora incluye `pos_cashier` y `pos_manager`; nuevo `requireAnyRole()`. - `src/shared/tests/auth.test.ts`: 8 tests, incluyendo roles POS y lista vacía. - `src/modules/orders/domain/order.ts`: `OrderState.COMPLETED` y estado terminal sin transiciones. ### Inventario multi-tienda - `StockItem` ahora expone `storeId`. - `StockCommand` ahora exige `storeId`. - `InventoryService.checkAvailability(variantId, storeId, quantity)`. - Repositorio PostgreSQL filtra y actualiza por `(variant_id, store_id)`; los movimientos también guardan `store_id`. - El flujo ecommerce/cart usa `DEFAULT_STORE_ID` para mantener compatibilidad con la tienda única actual. - Endpoints inventory aceptan `storeId` opcional y usan la tienda por defecto si no se envía. - Bulk-adjust actualizado a la clave compuesta y movimiento con store. - Tests unitarios e integración actualizados. ### Build admin - `project/apps/admin/next.config.ts`: `turbopack.root = __dirname` para evitar que Next.js 16 elija el workspace incorrecto por la presencia de múltiples lockfiles (`project/package-lock.json` + `project/frontend/package-lock.json`). - Se verificó build limpio después de borrar `.next`; `/brands` y `/categories` prerenderizan correctamente. ## Evidencia ```text Backend build: npm run build ✅ Backend tests: 191 passed, 56 skipped ✅ Backend typecheck: npx tsc --noEmit ✅ Admin build limpio: npm run build ✅ Admin typecheck: npx tsc --noEmit ✅ Admin ESLint relevante ✅ Migrations 043..047 aplicadas ✅ verify.sh ✅ ``` Pruebas de constraint: ```text ecommerce + user_id NULL → CHECK violation ✅ pos + user_id NULL → insert allowed ✅ re-run migrations → No migrations to run ✅ ``` ## Nota de build El error reportado de Next.js (`Export encountered an error on /brands/page`) era un fallo de prerender con el backend inaccesible y raíz de Turbopack ambigua. El problema se reprodujo en el entorno reportado, se limpió `.next`, se fijó `turbopack.root`, y el build limpio pasó sin `ECONNREFUSED`, sin error de prerender y sin warning de lockfiles. ## Archivos modificados - `project/migrations/043_pos_basics.js` - `project/migrations/044_pos_inventory_store.js` - `project/migrations/045_pos_orders_source.js` - `project/migrations/046_pos_backoffice_roles.js` - `project/migrations/047_orders_user_required_when_not_pos.js` - `project/src/shared/auth.ts` - `project/src/shared/tests/auth.test.ts` - `project/src/modules/orders/domain/order.ts` - `project/src/modules/inventory/domain/stock.ts` - `project/src/modules/inventory/domain/ports.ts` - `project/src/modules/inventory/application/inventory-service.ts` - `project/src/modules/inventory/infrastructure/pg-inventory-repository.ts` - `project/src/modules/inventory/api/inventory.routes.ts` - `project/src/modules/inventory/index.ts` - `project/src/modules/inventory/tests/inventory-service.test.ts` - `project/src/app/tests/inventory.itest.ts` - `project/src/modules/cart/application/cart-service.ts` - `project/src/modules/checkout/application/checkout-service.ts` - `project/src/modules/checkout/tests/checkout-service.test.ts` - `project/apps/admin/next.config.ts`