# Architect — F-050

## Diagnosis

Investigación sobre el estado actual del admin:

- Layout: `(dashboard)/layout.tsx` mantiene `max-w-[1280px]` con `mx-auto`, lo que limita el ancho útil en pantallas anchas; los centros quedan sin crecer.
- `settings/page.tsx` añade su propio `max-w-4xl`, anulando el contenedor del layout.
- `products/[id]/page.tsx` (edit sheet) usa `max-w-4xl` interno, lo que limita el editor de productos.
- `brands`/`tax-rates`/`shipping` siguen mezclando botones de texto con iconos en la columna de acciones.
- `categories` ya tiene selector de padre y checkbox promote, pero al editar sólo lista parents y bloquea al descendiente en hoja.
- `dashboard` carga `/api/admin/stats` con `combinedAuth`, que acepta `backoffice_session` o `mdv_session`; ambos resuelven al usuario con su `role`. El dashboard asume `Role` (`customer|admin`) del campo, pero los backoffice users tienen `role` `admin|editor`, por lo que `requireRole(user, 'admin')` no bloquea pero el render espera un union de `customer|admin`. Tras varios 401 (sin cookie válida) y la diferencia entre el proxy interno y la sesión, el cliente sólo ve un mensaje "No se pudieron cargar las estadísticas".
- Además, el dashboard del admin hace un fetch server-side/render que se ejecuta sin cookie de backoffice porque el login actual del admin está en cookie `backoffice_session`, pero el `/auth/login` mostrado por el frontend es la versión cliente; algunos links apuntaban a `/audit`, `/backoffice/stats` y `/orders/active` que no existen. `auditApi.list` apunta a `/api/admin/audit` que sí existe pero la página de auditoría usa `auditApi.list`, así que ese 404 era ruido del flujo anterior.

## Plan

1. **Layout full-width**
   - Reemplazar `max-w-[1280px] mx-auto` por `w-full px-6 md:px-10 py-8` en `(dashboard)/layout.tsx`, usando la estructura responsive del sidebar fijo.
   - `settings/page.tsx` retira su `max-w-4xl` propio.
   - `products/[id]/page.tsx` retira el `max-w-4xl`; la grid de tabs y secciones se expande.

2. **Acciones con icono + title en tax/shipping/brands**
   - Reutilizar `RowActions` con los handlers apropiados en `tax-rates` y `brands` (cuando aplique).
   - En `tax-rates` añadir handler de eliminar y reemplazar el botón de texto por `RowActions`. `shipping` ya tiene `RowActions`.

3. **Categories: padre y promote**
   - El selector de padre ya existe y filtra por `isParent`, pero en modo edición la categoría aún se está renderizando como padre aunque ya no lo sea. Solución: permitir que el checkbox `isParent` se edite en cualquier momento y refrescar el listado de padres disponibles para excluir la categoría actual (lo cual ya está implementado).
   - Añadir tip claro: "Promover a parent no exige tener hijos; parent es un flag booleano."

4. **Dashboard stats sin 404**
   - Cambiar el `requireRole` interno para que el dashboard admita tanto `admin` como `editor` y mapee correctamente.
   - Corregir el type-cast: el dashboard recibe `role: string` del backoffice, no restringido a `customer|admin`. Aceptar ambos.

5. **404s en navegación**
   - Reemplazar `/orders/active` y `/backoffice/stats` por rutas reales en `permissions.ts` y en el dashboard.
   - Verificar que el 404 de `/audit` proviene de un log pre-actualización; al recargar el backend, el endpoint `/api/admin/audit` existe y devuelve 200 con cookie válida.

6. **Auth y credenciales**
   - Verificar flujo de login del admin: el cliente hace `fetch('/api/auth/login')` desde el proxy Next; la página `/api/auth/login` corresponde a `identity` no a `backoffice`. El cliente debe usar `/api/backoffice/auth/login`. Ajustar `api-client.ts` para que `authApi.login` apunte a `/api/backoffice/auth/login` y `authApi.me` a `/api/backoffice/auth/me`.
   - Tras esto el cookie `backoffice_session` queda, `/backoffice/auth/me` responde 200 y `/admin/stats` pasa la auth.

## Acceptance evidence

- /settings: ancho efectivo mayor a 4xl.
- /products (edit): ancho del editor crece en pantallas anchas.
- /tax-rates, /shipping, /brands: columna de acciones con iconos y title.
- /categories: edición permite cambiar parent y promote.
- /dashboard: stats cargan 200 sin 404 cuando hay sesión backoffice válida.
- Verify verde.
