4.7 KiB
4.7 KiB
F-114 — Arquitectura: importar categorías de OpenCart sin duplicar
Origen
Tabla legacy oc_category_description (PHPMyAdmin, MySQL) en localhost:3306/admin_natural,
consulta SELECT category_id, name FROM oc_category_description WHERE language_id=1; con 76 filas.
Catálogo actual
- 5 raíces:
Alimentacion,Cosmetica e Higiene,Hogar y Mascotas,Limpieza Ecologica,Suplementos. - 7 hijos directos.
- 5 marcas:
BioSana,EcoVida,NaturGreen,SolNatural,TierraNatural.
Decisiones
- No crear un importador genérico desde MySQL: no asumimos acceso de red a la base legacy.
En su lugar, hardcodeamos la lista en un script de seed reproducible (
scripts/seed-legacy-categories.mjs). Cuando llegue el momento de conectar al OpenCart real, un paso posterior puede volcar a JSON y alimentar el mismo script. - Cada entrada va a donde corresponde:
- Marcas →
brands_brands. Lista: SOLGAR, EL GRANERO INTEGRAL, A.VOGEL, BIOCOP, QBIO, LA FINESTRA SUL CIELO, CADIDIET, CHISVERT, DIETISUR, GOURMET BIO, GOURMET CASH, NUTRINAT, COMERCIAL GARZA, ARTESANÍA AGRÍCOLA, DAS BROT, DULCES LISSEN, LEMONPHARMA, VEKINE, NAAY BOTANICALS, LAMBERTS, YODETIENDAS, NATURCOSMETIKA, TONGIL, SALUD VIVA, GLOBO NATURA, BIOSPIRIT, NATURALMENTE MEDITERRANEO, NATURAL, VITAFOOD, PROVIDEEDORES. - Categorías reales →
categories_categories. Incluye el resto.
- Marcas →
- Normalización: decodificar entidades HTML (
&, ), trim, colapso de espacios, comparación case-insensitive. - Deduplicación:
- Categoría: si existe una con el mismo
name(normalizado, case-insensitive) → skip (no duplicar). - Categoría marca: si existe en
brands_brandspornameigual → skip. - Slug único: si el slug derivado ya existe, se numera (
aceites-2,aceites-3, …).
- Categoría: si existe una con el mismo
- Padre de cada nueva categoría (mapeo manual):
- Por defecto cuelgan de la raíz
Alimentacionsalvo que indique lo contrario. - Mapeo específico (cat, parent):
- 67 HERBALIST → Hierbas e Infusiones
- 68 FOOD → Alimentacion
- 69 COSMETICS → Cosmetica e Higiene
- 70 DIET AND NUTRITION → Suplementos
- 71 NUTS & SEEDS → Frutos Secos
- 72 BREAD & PASTRIES → Alimentacion
- 75 LEGUMES → Alimentacion
- 76 FLOUR & CEREALS → Alimentacion
- 77 PASTA & RICE → Alimentacion
- 78 CREAMS & JAMS → Cremas
- 79 FRUTAS Y VERDURAS → Alimentacion
- 80 SUGAR & SWEETENERS → Alimentacion
- 81 BEVERAGES → Alimentacion
- 82 OIL AND VINEGAR → Aceites
- 83 RAW FOOD → Alimentacion
- 84 HIERBAS MEDICINALES → Hierbas e Infusiones
- 85 SUPLEMENTS → Suplementos
- 86 OILS & EXTRACTS → Aceites
- 87 FACIAL → Cosmetica e Higiene
- 88 CORPORAL → Cosmetica e Higiene
- 89 ASEO PERSONAL → Cosmetica e Higiene
- 90 HOME → Hogar y Mascotas
- 91 MACROBIOTIC → Alimentacion
- 93 SNACKS → Alimentacion
- 95 BOOKS → Hogar y Mascotas (libros)
- 97 FRESH PRODUCTS → Alimentacion
- 102 WINE → Alimentacion
- 103 BEER → Alimentacion
- 104 VEGETAL MILKS → Alimentacion
- 105 JUICES → Alimentacion
- 106 SODAS → Alimentacion
- 107 CHILDREN → Alimentacion
- 108 BABYS & KIDS → Cosmetica e Higiene (cosmética infantil)
- 115 TEA & INFUSIONS → Hierbas e Infusiones
- 116 SPICE & CONDIMENTS → Alimentacion
- 117 CHOCOLATE & SWEETS → Alimentacion
- 127 PROVEEDORES → raíz (proveedores)
- 129 CLEANING → Limpieza Ecologica
- Por defecto cuelgan de la raíz
- Excluidos (no son categorías):
00 - SIN CODIGO,01 - PRODUCTOS DESCATALOGADOS,02 - PRODUCTOS RAPIDOS: marcadores legacy, no importan.
- Idempotencia: el script busca antes de insertar; se puede re-ejecutar sin crear duplicados.
- Lenguaje: los nombres y los slugs se guardan tal cual aparecen en el legacy tras normalizar.
Componentes
scripts/seed-legacy-categories.mjs: CLI ejecutable que importa categorías/marcas.src/modules/categories/legacy/legacy-catalog.ts(helper en TS): define la lista, normalización, parent-mapping, dedup. Exportable para tests.src/modules/categories/tests/legacy-catalog.test.ts: tests de la normalización, slugificación, dedup, mapeo.- README corto en
work/artifacts/F-114/README.mdcon la salida esperada del seed.
Tests
- Normalización:
&, , mayúsculas, espacios. - Slugificación: minúsculas, guiones, signos.
- Deduplicación: case-insensitive y por slug.
- Mapeo: todas las entradas del legacy se clasifican en categoría/marca/excluido.
- Smoke itest opcional contra DB (marcado como such, no obligatorio).
Fuera de alcance
- Sin importación de productos.
- Sin conexión al MySQL real.
- Sin traducciones (solo
language_id=1).