From ee4945578e0dffc9f89d93a8d3734f03a85d66e8 Mon Sep 17 00:00:00 2001 From: nickpons666 Date: Wed, 7 Jan 2026 18:36:59 -0600 Subject: [PATCH] =?UTF-8?q?FASE=202=20PARCIAL:=20Implementaci=C3=B3n=20cor?= =?UTF-8?q?e=20-=20Cambios=20cr=C3=ADticos=20realizados?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit CAMBIOS REALIZADOS: ✅ ajax/login.php - Eliminado hardcodeo empresaId = 15 ✅ classes/empresa.class.php - Método DoLogin() ahora obtiene empresaId dinámico ✅ classes/system-config.class.php - Lógica de BD dinámica (1=ventas_nm, >1=ventas_nm{id}) PROBLEMAS DETECTADOS: ⚠️ GetSingle() devuelve escalar no array ⚠️ empresaId obtenido = 0 (incorrecto) ⚠️ Warnings PHP en acceso a arrays nulos ⚠️ Compatibilidad sistema viejo vs nuevo ARCHIVOS MODIFICADOS: - ajax/login.php - classes/empresa.class.php - classes/system-config.class.php - md/plan-accion-multi-empresa.md - test_login_dinamico.php SIGUIENTE PASO: Revisar GetSingle() y compatibilidad --- ajax/login.php | 15 +++------ classes/empresa.class.php | 33 ++++++++++++++---- classes/system-config.class.php | 15 +++++++-- logs/php_errors.log | 1 + md/plan-accion-multi-empresa.md | 31 +++++++++++++---- test_login_dinamico.php | 60 +++++++++++++++++++++++++++++++++ 6 files changed, 130 insertions(+), 25 deletions(-) create mode 100644 test_login_dinamico.php diff --git a/ajax/login.php b/ajax/login.php index ad19de5..6d1ba3d 100755 --- a/ajax/login.php +++ b/ajax/login.php @@ -15,18 +15,13 @@ exit; } + // CAMBIO CRÍTICO: Obtener empresaId dinámicamente del usuario + // en lugar de hardcodearlo como "15" $empresa->setEmail($email); $empresa->setPassword($password); - $empresa->setEmpresaId("15"); - // Check for validation errors set by setEmail, setPassword, setEmpresaId - if($empresa->Util()->GetError()) - { - $empresa->Util()->PrintErrors(); - echo 'fail[#]'; - exit; - } - + // El método DoLogin ahora debe obtener el empresaId desde la base de datos + // basado en el email y password del usuario if(!$empresa->DoLogin()) { // If DoLogin itself sets errors (e.g., incorrect credentials), print them here @@ -39,5 +34,5 @@ { echo 'ok[#]ok'; } - + ?> \ No newline at end of file diff --git a/classes/empresa.class.php b/classes/empresa.class.php index f6c75de..795b681 100755 --- a/classes/empresa.class.php +++ b/classes/empresa.class.php @@ -254,7 +254,7 @@ class Empresa extends Main } - + public function getRfc() { return $this->rfc; @@ -376,15 +376,17 @@ $this->Util()->ValidateMail($value, "Email"); { $generalDb = new DB(true); - $sql = "SELECT usuarioId FROM usuario + // CAMBIO CRÍTICO: Obtener empresaId dinámicamente del usuario + // Buscar usuario por email y password sin filtrar por empresaId fijo + $sql = "SELECT usuarioId, empresaId FROM usuario WHERE email = '".$this->email."' AND password = '".$this->password."' - AND empresaId = '".$this->empresaId."' AND baja = '0'"; $generalDb->setQuery($sql); - $usuarioId = $generalDb->GetSingle(); + $result = $generalDb->GetSingle(); - if(!$usuarioId) + // GetSingle puede devolver un string o array, manejar ambos casos + if(!$result) { unset($_SESSION["loginKey"]); unset($_SESSION["empresaId"]); @@ -397,6 +399,24 @@ $this->Util()->ValidateMail($value, "Email"); } + // Si result es array, obtener valores; si es string, es usuarioId viejo + if(is_array($result)) + { + $usuarioId = $result['usuarioId']; + $empresaIdFromUser = $result['empresaId']; + } + else + { + // Compatibilidad con sistema antiguo - obtener empresaId separadamente + $usuarioId = $result; + $sql2 = "SELECT empresaId FROM usuario WHERE usuarioId = '".$usuarioId."'"; + $generalDb->setQuery($sql2); + $empresaIdFromUser = $generalDb->GetSingle(); + } + + // Establecer el empresaId real del usuario + $this->empresaId = $empresaIdFromUser; + $sql = "SELECT * FROM usuario LEFT JOIN empresa ON usuario.empresaId = empresa.empresaId WHERE usuarioId = '".$usuarioId."'"; @@ -452,6 +472,7 @@ $this->Util()->ValidateMail($value, "Email"); + function AuthUser() { @@ -502,4 +523,4 @@ $this->Util()->ValidateMail($value, "Email"); }//empresa -?> +?> \ No newline at end of file diff --git a/classes/system-config.class.php b/classes/system-config.class.php index 7989333..3fd478c 100755 --- a/classes/system-config.class.php +++ b/classes/system-config.class.php @@ -93,9 +93,18 @@ class SystemConfig { 'charset' => $_ENV['DB_CHARSET'] ?? 'utf8mb4' ]; - // Patón:avantikads_nm{empresaId} donde empresaId viene del usuario - $prefix = $_ENV['DB_EMPRESA_PREFIX'] ?? 'avantikads_nm'; - $database = $prefix . $empresaId; + // PATRÓN DINÁMICO: + // - empresaId = 1 → usa ventas_nm (sin número) + // - empresaId > 1 → usa ventas_nm{empresaId} + $prefix = $_ENV['DB_EMPRESA_PREFIX'] ?? 'ventas_nm'; + + if ($empresaId == 1) { + // Regla especial: empresaId = 1 usa base sin número + $database = $prefix; + } else { + // Regla general: empresaId > 1 usa base con número + $database = $prefix . $empresaId; + } // Configuración de usuario/password $user = $_ENV['DB_EMPRESA_USER'] ?? $_ENV['DB_USER'] ?? 'root'; diff --git a/logs/php_errors.log b/logs/php_errors.log index 89fa824..5a02ceb 100644 --- a/logs/php_errors.log +++ b/logs/php_errors.log @@ -5,3 +5,4 @@ [07-Jan-2026 18:01:53 America/Mexico_City] Base de datos ventas_nm15 no encontrada, usando fallback a master [07-Jan-2026 18:01:53 America/Mexico_City] Base de datos ventas_nm15 no encontrada, usando fallback a master [07-Jan-2026 18:02:40 America/Mexico_City] Base de datos ventas_nm15 no encontrada, usando fallback a master +[07-Jan-2026 18:34:20 America/Mexico_City] Base de datos ventas_nm15 no encontrada, usando fallback a master diff --git a/md/plan-accion-multi-empresa.md b/md/plan-accion-multi-empresa.md index 3883b52..7456a89 100644 --- a/md/plan-accion-multi-empresa.md +++ b/md/plan-accion-multi-empresa.md @@ -19,11 +19,12 @@ Eliminar código hardcodeado con `empresaId = 15` y implementar sistema dinámic - [ ] Analizar cómo se obtiene el `empresaId` del usuario - [ ] Revisar configuración actual de base de datos -### Fase 2: Implementación Core (Pendiente) -- [ ] Modificar `SystemConfig` para manejo dinámico de `empresaId` -- [ ] Actualizar `DatabaseManager` para selección dinámica de BD -- [ ] Implementar lógica de prefijo de base de datos -- [ ] Crear función para obtener `empresaId` del usuario actual +### 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 @@ -94,7 +95,25 @@ El login debe: 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 1 en progreso - Problema identificado +**Estado**: Fase 2 en progreso - Problemas de compatibilidad detectados **Creado**: 07-01-2026 **Última actualización**: 07-01-2026 \ No newline at end of file diff --git a/test_login_dinamico.php b/test_login_dinamico.php new file mode 100644 index 0000000..d9f768b --- /dev/null +++ b/test_login_dinamico.php @@ -0,0 +1,60 @@ + 'test@empresa1.com', 'password' => '1234', 'expectedEmpresaId' => 1], + ['email' => 'test@empresa2.com', 'password' => '1234', 'expectedEmpresaId' => 2], + // Agregar más casos de prueba según sea necesario +]; + +echo "=== TEST DE LOGIN DINÁMICO ===\n\n"; + +foreach ($testUsers as $test) { + echo "Test con email: {$test['email']}\n"; + + // Crear instancia de empresa + $empresa = new Empresa(); + $empresa->setEmail($test['email']); + $empresa->setPassword($test['password']); + + // Intentar login + if ($empresa->DoLogin()) { + $actualEmpresaId = $_SESSION['empresaId']; + $loginKey = $_SESSION['loginKey']; + + echo "✅ Login exitoso\n"; + echo " empresaId obtenido: $actualEmpresaId\n"; + echo " empresaId esperado: {$test['expectedEmpresaId']}\n"; + echo " loginKey: $loginKey\n"; + + // Verificar base de datos correspondiente + $config = SystemConfig::getEmpresaDatabaseConfig($actualEmpresaId); + echo " Base de datos: {$config['database']}\n"; + + if ($actualEmpresaId == $test['expectedEmpresaId']) { + echo "✅ CORRECTO: empresaId coincide\n"; + } else { + echo "❌ ERROR: empresaId no coincide\n"; + } + + // Limpiar sesión para siguiente test + unset($_SESSION['loginKey']); + unset($_SESSION['empresaId']); + + } else { + echo "❌ Login fallido\n"; + echo " Revisar credenciales o disponibilidad del usuario\n"; + } + + echo str_repeat("-", 50) . "\n"; +} + +echo "=== FIN DEL TEST ===\n"; +?> \ No newline at end of file