# F-100 — Arquitectura: generación automática de SKU a partir del título ## Estado actual - En `POST /products` (catálogo) se crea una variante por defecto con `sku = "SKU-MV-${productId}"`. - El admin no expone la edición del SKU en `PriceStockSection` (sólo EAN, precios, stock). - No hay endpoint de "sugerir SKU" en el backend. ## Decisiones 1. **Helper puro** `src/modules/catalog/domain/sku.ts`: - `generateSkuFromTitle(title)`: normaliza el título (mayúsculas, sin diacríticos, sin caracteres no alfanuméricos, guiones separadores, recorte a 100 chars). Devuelve `MV-`. - `uniqueSku(base, existing: Set)`: si el base está ocupado, prueba `base-2`, `base-3`, … hasta encontrar uno libre. 2. **Backend**: - Cambiar la creación de producto para usar el SKU derivado del título en lugar del UUID; mantener `uniqueSku` para resolver colisiones. - Endpoint nuevo `POST /admin/products/sku:generate` con body `{ title: string }` → `{ sku: string }`. Útil para preview antes de crear. - Permitir que el admin edite el SKU en la sección "Precios y Stock" (PriceStockSection). Persistencia vía `PATCH /products/:id/variants/:variantId`. 3. **Admin UI** (`apps/admin`): - `api-client.ts`: `productsApi.generateSku(title)` y `productsApi.updateVariant(id, vid, { sku })`. - Sección "Precios y Stock": muestra el SKU actual como input editable con botón "Regenerar" que llama al endpoint. - Página de creación de producto: llama a `generateSku` al blur del nombre para previsualizar el SKU. 4. **Validación**: - SKU: `^[A-Za-z0-9-]+$`, 1..100 chars (alineado con `newVariantSchema`). - El endpoint `/admin/products/sku:generate` sólo da sugerencias; el cliente decide. - Duplicados: PostgreSQL ya rechaza por `UNIQUE` en `product_variants.sku`. Aclarar el error al admin con un mensaje claro. ## Tests - `sku.test.ts` (6-8): normalización, acentos, longitudes, collision in `uniqueSku`. - Añadir test al repositorio Variantes (e2e) si el repo expone `findBySku`: comprobar que se devuelve un SKU existente para validar. ## Fuera de alcance - Sin servicio externo de SKU. - Sin relajar la unicidad. - Sin afectar a las variantes ya creadas (migración no requerida).