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;
|
||||
}
|
||||
|
||||
// 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';
|
||||
}
|
||||
|
||||
|
||||
?>
|
||||
@@ -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
|
||||
|
||||
|
||||
?>
|
||||
?>
|
||||
@@ -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';
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
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