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:
@@ -15,18 +15,13 @@
|
|||||||
exit;
|
exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// CAMBIO CRÍTICO: Obtener empresaId dinámicamente del usuario
|
||||||
|
// en lugar de hardcodearlo como "15"
|
||||||
$empresa->setEmail($email);
|
$empresa->setEmail($email);
|
||||||
$empresa->setPassword($password);
|
$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(!$empresa->DoLogin())
|
||||||
{
|
{
|
||||||
// If DoLogin itself sets errors (e.g., incorrect credentials), print them here
|
// If DoLogin itself sets errors (e.g., incorrect credentials), print them here
|
||||||
|
|||||||
@@ -376,15 +376,17 @@ $this->Util()->ValidateMail($value, "Email");
|
|||||||
{
|
{
|
||||||
$generalDb = new DB(true);
|
$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."'
|
WHERE email = '".$this->email."'
|
||||||
AND password = '".$this->password."'
|
AND password = '".$this->password."'
|
||||||
AND empresaId = '".$this->empresaId."'
|
|
||||||
AND baja = '0'";
|
AND baja = '0'";
|
||||||
$generalDb->setQuery($sql);
|
$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["loginKey"]);
|
||||||
unset($_SESSION["empresaId"]);
|
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
|
$sql = "SELECT * FROM usuario
|
||||||
LEFT JOIN empresa ON usuario.empresaId = empresa.empresaId
|
LEFT JOIN empresa ON usuario.empresaId = empresa.empresaId
|
||||||
WHERE usuarioId = '".$usuarioId."'";
|
WHERE usuarioId = '".$usuarioId."'";
|
||||||
@@ -453,6 +473,7 @@ $this->Util()->ValidateMail($value, "Email");
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
function AuthUser()
|
function AuthUser()
|
||||||
{
|
{
|
||||||
if(!$this->IsLoggedIn())
|
if(!$this->IsLoggedIn())
|
||||||
|
|||||||
@@ -93,9 +93,18 @@ class SystemConfig {
|
|||||||
'charset' => $_ENV['DB_CHARSET'] ?? 'utf8mb4'
|
'charset' => $_ENV['DB_CHARSET'] ?? 'utf8mb4'
|
||||||
];
|
];
|
||||||
|
|
||||||
// Patón:avantikads_nm{empresaId} donde empresaId viene del usuario
|
// PATRÓN DINÁMICO:
|
||||||
$prefix = $_ENV['DB_EMPRESA_PREFIX'] ?? 'avantikads_nm';
|
// - 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;
|
$database = $prefix . $empresaId;
|
||||||
|
}
|
||||||
|
|
||||||
// Configuración de usuario/password
|
// Configuración de usuario/password
|
||||||
$user = $_ENV['DB_EMPRESA_USER'] ?? $_ENV['DB_USER'] ?? 'root';
|
$user = $_ENV['DB_EMPRESA_USER'] ?? $_ENV['DB_USER'] ?? 'root';
|
||||||
|
|||||||
@@ -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: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: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
|
||||||
|
|||||||
@@ -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
|
- [ ] Analizar cómo se obtiene el `empresaId` del usuario
|
||||||
- [ ] Revisar configuración actual de base de datos
|
- [ ] Revisar configuración actual de base de datos
|
||||||
|
|
||||||
### Fase 2: Implementación Core (Pendiente)
|
### Fase 2: Implementación Core (En Progreso)
|
||||||
- [ ] Modificar `SystemConfig` para manejo dinámico de `empresaId`
|
- [x] Modificar `ajax/login.php` para obtener empresaId dinámico
|
||||||
- [ ] Actualizar `DatabaseManager` para selección dinámica de BD
|
- [ ] Actualizar `Empresa.class.php` para manejo dinámico
|
||||||
- [ ] Implementar lógica de prefijo de base de datos
|
- [ ] Implementar lógica de base de datos dinámica
|
||||||
- [ ] Crear función para obtener `empresaId` del usuario actual
|
- [ ] Actualizar `SystemConfig` para empresaId dinámico
|
||||||
|
- [ ] Probar login dinámico con diferentes empresas
|
||||||
|
|
||||||
### Fase 3: Actualización de Módulos (Pendiente)
|
### Fase 3: Actualización de Módulos (Pendiente)
|
||||||
- [ ] Actualizar módulos de catálogos
|
- [ ] Actualizar módulos de catálogos
|
||||||
@@ -94,7 +95,25 @@ El login debe:
|
|||||||
2. NO forzar empresaId=15
|
2. NO forzar empresaId=15
|
||||||
3. Usar el `empresaId` real del usuario para conectar a su base de datos
|
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
|
**Creado**: 07-01-2026
|
||||||
**Última actualización**: 07-01-2026
|
**Última actualización**: 07-01-2026
|
||||||
60
test_login_dinamico.php
Normal file
60
test_login_dinamico.php
Normal 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";
|
||||||
|
?>
|
||||||
Reference in New Issue
Block a user