FASE 2 PARCIAL: Implementación core - Cambios críticos realizados

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
This commit is contained in:
2026-01-07 18:36:59 -06:00
parent 1b723f0643
commit ee4945578e
6 changed files with 130 additions and 25 deletions

View File

@@ -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

View File

@@ -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."'";
@@ -453,6 +473,7 @@ $this->Util()->ValidateMail($value, "Email");
function AuthUser()
{
if(!$this->IsLoggedIn())

View File

@@ -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';

View File

@@ -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

View File

@@ -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

60
test_login_dinamico.php Normal file
View File

@@ -0,0 +1,60 @@
<?php
/**
* Test de login dinámico para verificar funcionamiento
* Este script permite probar el login con diferentes empresas
*/
require_once 'init.php';
require_once 'libraries.php';
// Datos de prueba - ajustar según necesidad
$testUsers = [
['email' => '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";
?>