33 lines
2.2 KiB
Markdown
33 lines
2.2 KiB
Markdown
# 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-<SLUG>`.
|
|
- `uniqueSku(base, existing: Set<string>)`: 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).
|