# F-114 — Import legacy OpenCart categories into the catalog without duplicates

## Backend
- `src/modules/categories/legacy/legacy-catalog.ts`: helper puro con la lista de las 76 entradas legacy, su clasificación (categoría / marca / excluido) y el `parentSlug` para cada categoría. Expone `normalizeName`, `decodeHtmlEntities`, `slugify`, `uniqueSlug` y `buildImportPlan(existingCategories, existingBrands, existingSlugs)`.
- `src/modules/categories/tests/legacy-catalog.test.ts`: 15 tests cubriendo normalización, slugify, uniqueSlug, dedup, mapeo, exclusión y clasificación.
- `scripts/seed-legacy-categories.mjs`: CLI idempotente que carga el helper, sondea la base, genera el plan y aplica inserts con `ON CONFLICT (slug) DO NOTHING`. Acepta `--dry-run`.

## Mapping (resumen)
- **Marcas** (32): PROVEEDORES, BIOSPIRIT, SALUD VIVA, GLOBO NATURA, SOLGAR, VITAFOOD, EL GRANERO INTEGRAL, A.VOGEL, BIOCOP, QBIO, LA FINESTRA SUL CIELO, CADIDIET, COMPLEMENTOS Y NUTRICIÓN, CHISVERT, SUPERFOOD, DIETISUR, GOURMET BIO, NATURALMENTE MEDITERRANEO, NATURAL, GOURMET CASH, NUTRINAT, COMERCIAL GARZA, ARTESANÍA AGRÍCOLA, DAS BROT, DULCES LISSEN, LEMONPHARMA, VEKINE, NAAY BOTANICALS, LAMBERTS, YODETIENDAS, NATURCOSMETIKA, TONGIL.
- **Categorías** (39): HERBALIST, FOOD, COSMETICS, DIET AND NUTRITION, NUTS & SEEDS, BREAD & PASTRIES, LEGUMES, FLOUR & CEREALS, PASTA & RICE, CREAMS & JAMS, FRUTAS Y VERDURAS, SUGAR & SWEETENERS, BEVERAGES, OIL AND VINEGAR, RAW FOOD, HIERBAS MEDICINALES, SUPLEMENTS, OILS & EXTRACTS, FACIAL, CORPORAL, ASEO PERSONAL, HOME, MACROBIOTIC, SNACKS, BOOKS, FRESH PRODUCTS, WINE, BEER, VEGETAL MILKS, JUICES, SODAS, CHILDREN, BABYS & KIDS, TEA & INFUSIONS, SPICE & CONDIMENTS, CHOCOLATE & SWEETS, CLEANING, PROVEEDORES, GRANOLA.
- **Excluidos** (5): 00 - SIN CODIGO, 01 - PRODUCTOS DESCATALOGADOS, 02 - PRODUCTOS RAPIDOS, SUPLEMENTS (id 96 — duplicado del 85), PROVEEDORES no-marca.

## Evidencia
- `npm run typecheck` OK.
- `npm test`: 160 passed / 0 failed (15 nuevos del helper).
- `npm run build` (backend) OK.
- `node scripts/seed-legacy-categories.mjs --dry-run`: plan de 39 categorías + 32 marcas.
- `node scripts/seed-legacy-categories.mjs`: ejecuta inserts. Re-ejecutado: 0 inserts (idempotente).
- DB antes: 12 categorías, 5 marcas. Después: 51 categorías (+39), 37 marcas (+32).
- Sub-árbol ALIMENTACIÓN antes: 3 hijos. Ahora: 24 (incluye BEVERAGES, BEER, WINE, JUICES, etc.).
