# Plan de Acción - Sistema Multi-Empresa Dinámico ## Objetivo Eliminar código hardcodeado con `empresaId = 15` y implementar sistema dinámico que obtenga el `empresaId` del usuario logueado. ## Reglas de Base de Datos - `empresaId = 1` → usa base de datos `ventas_nm` (sin número) - `empresaId > 1` → usa base de datos `ventas_nm{empresaId}` (con número) ## Estructura del Sistema - **Base Master**: `ventas_nmgen` (usuarios, empresas, configuración) - **Base Empresa**: `ventas_nm{empresaId}` (datos operativos) ## Fases del Proyecto ### Fase 1: Análisis y Diagnóstico (En Progreso) - [x] Identificar todos los archivos con código hardcodeado - [ ] Mapear flujo actual de autenticación - [ ] Analizar cómo se obtiene el `empresaId` del usuario - [ ] Revisar configuración actual de base de datos ### Fase 2: Implementación Core (En Progreso) - [x] Modificar `ajax/login.php` para obtener empresaId dinámico - [ ] Actualizar `Empresa.class.php` para manejo dinámico - [ ] Implementar lógica de base de datos dinámica - [ ] Actualizar `SystemConfig` para empresaId dinámico - [ ] Probar login dinámico con diferentes empresas ### Fase 3: Actualización de Módulos (Pendiente) - [ ] Actualizar módulos de catálogos - [ ] Actualizar módulos de ventas - [ ] Actualizar módulos de inventarios - [ ] Actualizar módulos de reportes ### Fase 4: Pruebas y Validación (Pendiente) - [ ] Pruebas con `empresaId = 1` (base `ventas_nm`) - [ ] Pruebas con `empresaId > 1` (base `ventas_nm{numero}`) - [ ] Validar flujo completo de autenticación - [ ] Verificar funcionamiento de todos los módulos ### Fase 5: Documentación y Limpieza (Pendiente) - [ ] Documentar nueva arquitectura - [ ] Limpiar código obsoleto - [ ] Actualizar comentarios - [ ] Crear guía de implementación ## Archivos Críticos a Revisar - `classes/system-config.class.php` - `classes/database-manager.class.php` - `init.php` - `config.php` - Módulos principales (`modules/`) ## Control de Versiones - Cada fase completada = 1 commit - No hacer push hasta autorización explícita - Esperar pruebas funcionales antes de subir ## Notas Importantes - Mantener compatibilidad con código existente - Preservar seguridad del sistema - No romper funcionalidades actuales - Testing exhaustivo antes de producción ## Hallazgos de Fase 1 ### 🚨 Problema Principal Identificado **Archivo crítico**: `ajax/login.php:20` ```php $empresa->setEmpresaId("15"); // HARDCODEADO ``` ### 📋 Lista Completa de Archivos con empresaId = 15 **Login y Autenticación:** - `ajax/login.php:20` - **CRÍTICO** - Seteo hardcodeado en login **Crons (13 archivos):** - `crons/reporte-inventario*.php` (5 archivos) - `crons/rep-prods-prov*.php` (6 archivos) - `crons/liberar-productos.php` **AJAX:** - `ajax/facturas.php:9` ### 🔍 Análisis del Flujo de Login 1. **Usuario ingresa email/password** → `login.js` 2. **AJAX envía a** `ajax/login.php` 3. **❌ PROBLEMA**: `$empresa->setEmpresaId("15")` forza empresaId=15 4. **Consulta**: `usuario` WHERE `empresaId = 15` (solo busca en empresa 15) 5. **Establece sesión**: `$_SESSION["empresaId"] = 15` ### 🎯 Solución Requerida El login debe: 1. Obtener `empresaId` de la tabla `usuario` basado en email/password 2. NO forzar empresaId=15 3. Usar el `empresaId` real del usuario para conectar a su base de datos ## Resultados de Pruebas Fase 2 ### ⚠️ Problemas Identificados - Login funciona pero obtiene `empresaId = 0` (incorrecto) - Errores de PHP warnings en acceso a arrays nulos - Mensaje de "usuario o contraseña incorrecta" pero login continúa - Base de datos resultante: `ventas_nm0` (incorrecto) ### 🔍 Análisis de Problemas 1. **GetSingle()**: Devuelve valor escalar no array como se esperaba 2. **Compatibilidad**: Sistema viejo vs nuevo en consulta SQL 3. **Warnings**: Acceso a arrays nulos en db.class.php ### 🛠️ Soluciones Requeridas - Revisar método `GetSingle()` en DB class - Ajustar compatibilidad en consulta SQL - Corregir manejo de nulos --- **Estado**: Fase 2 en progreso - Problemas de compatibilidad detectados **Creado**: 07-01-2026 **Última actualización**: 07-01-2026