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
267 lines
9.3 KiB
PHP
Executable File
267 lines
9.3 KiB
PHP
Executable File
<?php
|
|
/**
|
|
* Sistema de configuración centralizada multi-empresa
|
|
* Compatible con PHP 8 y manejo seguro de credenciales
|
|
*/
|
|
|
|
/**
|
|
* Carga variables de entorno desde archivo .env
|
|
*/
|
|
function loadEnv($path = '.env') {
|
|
if (!file_exists($path)) {
|
|
throw new Exception("Archivo .env no encontrado en: $path");
|
|
}
|
|
|
|
$lines = file($path, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
|
|
foreach ($lines as $line) {
|
|
if (strpos(trim($line), '#') === 0) continue;
|
|
|
|
if (strpos($line, '=') !== false) {
|
|
list($key, $value) = explode('=', $line, 2);
|
|
$key = trim($key);
|
|
$value = trim($value);
|
|
|
|
// Remover comillas si existen
|
|
$value = trim($value, '"\'');
|
|
|
|
// Establecer como variable de entorno
|
|
$_ENV[$key] = $value;
|
|
putenv("$key=$value");
|
|
}
|
|
}
|
|
}
|
|
|
|
// Cargar configuración desde .env al inicio
|
|
try {
|
|
loadEnv(__DIR__ . '/../.env');
|
|
} catch (Exception $e) {
|
|
// Configurar log antes de morir
|
|
$logFile = __DIR__ . '/../logs/php_errors.log';
|
|
ini_set('error_log', $logFile);
|
|
ini_set('log_errors', 1);
|
|
error_log("Error cargando configuración: " . $e->getMessage());
|
|
die("Error cargando configuración: " . $e->getMessage());
|
|
}
|
|
|
|
/**
|
|
* Clase de configuración del sistema
|
|
*/
|
|
class SystemConfig {
|
|
|
|
/**
|
|
* Determina si estamos en entorno DEMO basado en sesión
|
|
* @return bool
|
|
*/
|
|
public static function isDemoMode() {
|
|
return (isset($_SESSION['curBD']) && $_SESSION['curBD'] === 'Demo');
|
|
}
|
|
|
|
/**
|
|
* Obtiene configuración de base de datos master
|
|
* @return array Configuración de BD master
|
|
*/
|
|
public static function getMasterDatabaseConfig() {
|
|
$config = [
|
|
'host' => $_ENV['DB_MASTER_HOST'] ?? 'localhost',
|
|
'database' => $_ENV['DB_MASTER_DATABASE'] ?? 'avantikads_nmgen',
|
|
'user' => $_ENV['DB_MASTER_USER'] ?? 'root',
|
|
'password' => $_ENV['DB_MASTER_PASSWORD'] ?? '',
|
|
'charset' => $_ENV['DB_CHARSET'] ?? 'utf8mb4',
|
|
'port' => $_ENV['DB_PORT'] ?? '3306'
|
|
];
|
|
|
|
// Si es modo DEMO, usar configuración alternativa
|
|
if (self::isDemoMode()) {
|
|
$config['host'] = $_ENV['DB_DEMO_HOST'] ?? '10.10.4.17:3390';
|
|
$config['user'] = $_ENV['DB_DEMO_USER'] ?? 'nickpons666';
|
|
$config['password'] = $_ENV['DB_DEMO_PASSWORD'] ?? 'MiPo6425@@';
|
|
}
|
|
|
|
return $config;
|
|
}
|
|
|
|
/**
|
|
* Obtiene configuración de base de datos para empresa específica
|
|
* @param int $empresaId ID de la empresa
|
|
* @return array Configuración de BD para la empresa
|
|
*/
|
|
public static function getEmpresaDatabaseConfig($empresaId) {
|
|
// Configuración base desde .env
|
|
$baseConfig = [
|
|
'host' => $_ENV['DB_HOST'] ?? 'localhost',
|
|
'port' => $_ENV['DB_PORT'] ?? '3306',
|
|
'charset' => $_ENV['DB_CHARSET'] ?? 'utf8mb4'
|
|
];
|
|
|
|
// 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';
|
|
$password = $_ENV['DB_EMPRESA_PASSWORD'] ?? $_ENV['DB_PASSWORD'] ?? '';
|
|
|
|
// Si es modo DEMO, usar configuración alternativa
|
|
if (self::isDemoMode()) {
|
|
$baseConfig['host'] = $_ENV['DB_DEMO_HOST'] ?? '10.10.4.17:3390';
|
|
$user = $_ENV['DB_DEMO_USER'] ?? 'nickpons666';
|
|
$password = $_ENV['DB_DEMO_PASSWORD'] ?? 'MiPo6425@@';
|
|
}
|
|
|
|
return array_merge($baseConfig, [
|
|
'database' => $database,
|
|
'user' => $user,
|
|
'password' => $password
|
|
]);
|
|
}
|
|
|
|
/**
|
|
* Valida que exista la base de datos para una empresa
|
|
* @param string $database Nombre de la base de datos
|
|
* @return bool
|
|
*/
|
|
public static function validateDatabaseExists($database) {
|
|
try {
|
|
$config = self::getMasterDatabaseConfig();
|
|
|
|
// Conexión sin especificar BD para verificar existencia
|
|
$mysqli = new mysqli($config['host'], $config['user'], $config['password'], "", $config['port']);
|
|
|
|
if ($mysqli->connect_error) {
|
|
$logFile = __DIR__ . '/../logs/php_errors.log';
|
|
ini_set('error_log', $logFile);
|
|
error_log("Error conexión validación: " . $mysqli->connect_error);
|
|
return false;
|
|
}
|
|
|
|
// Verificar si la base de datos existe
|
|
$result = $mysqli->query("SHOW DATABASES LIKE '$database'");
|
|
$exists = $result->num_rows > 0;
|
|
|
|
$mysqli->close();
|
|
return $exists;
|
|
|
|
} catch (Exception $e) {
|
|
$logFile = __DIR__ . '/../logs/php_errors.log';
|
|
ini_set('error_log', $logFile);
|
|
error_log("Error validando BD $database: " . $e->getMessage());
|
|
return false;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Obtiene empresaId del usuario actual desde base de datos master
|
|
* @param int $userId ID del usuario
|
|
* @return int|null empresaId del usuario
|
|
*/
|
|
public static function getEmpresaIdByUserId($userId) {
|
|
$masterConfig = self::getMasterDatabaseConfig();
|
|
|
|
try {
|
|
$mysqli = new mysqli(
|
|
$masterConfig['host'],
|
|
$masterConfig['user'],
|
|
$masterConfig['password'],
|
|
$masterConfig['database'],
|
|
$masterConfig['port']
|
|
);
|
|
|
|
if ($mysqli->connect_error) {
|
|
throw new Exception("Error conexión master DB: " . $mysqli->connect_error);
|
|
}
|
|
|
|
$mysqli->set_charset($masterConfig['charset']);
|
|
|
|
$stmt = $mysqli->prepare("SELECT empresaId FROM usuario WHERE usuarioId = ? LIMIT 1");
|
|
$stmt->bind_param("i", $userId);
|
|
$stmt->execute();
|
|
$result = $stmt->get_result();
|
|
|
|
if ($row = $result->fetch_assoc()) {
|
|
return (int)$row['empresaId'];
|
|
}
|
|
|
|
return null;
|
|
|
|
} catch (Exception $e) {
|
|
$logFile = __DIR__ . '/../logs/php_errors.log';
|
|
ini_set('error_log', $logFile);
|
|
error_log("Error obteniendo empresaId para usuario $userId: " . $e->getMessage());
|
|
return null;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Obtiene configuración general del sistema
|
|
* @return array Configuración general
|
|
*/
|
|
public static function getSystemConfig() {
|
|
return [
|
|
'doc_root' => $_ENV['DOC_ROOT'] ?? '/var/www/html/ventas',
|
|
'web_root' => $_ENV['WEB_ROOT'] ?? 'http://localhost',
|
|
'smtp_host' => $_ENV['SMTP_HOST'] ?? '',
|
|
'smtp_user' => $_ENV['SMTP_USER'] ?? '',
|
|
'smtp_pass' => $_ENV['SMTP_PASS'] ?? '',
|
|
'smtp_port' => $_ENV['SMTP_PORT'] ?? '',
|
|
'items_per_page' => $_ENV['ITEMS_PER_PAGE'] ?? '20',
|
|
'min_year' => $_ENV['MIN_YEAR'] ?? '2025',
|
|
'max_year' => $_ENV['MAX_YEAR'] ?? '2030',
|
|
'user_pac' => $_ENV['USER_PAC'] ?? '',
|
|
'pw_pac' => $_ENV['PW_PAC'] ?? '',
|
|
'debug_mode' => $_ENV['DEBUG_MODE'] ?? 'false'
|
|
];
|
|
}
|
|
|
|
/**
|
|
* Obtiene constantes legadas para compatibilidad
|
|
* @return array Constantes compatibles con sistema anterior
|
|
*/
|
|
public static function getLegacyConstants() {
|
|
$systemConfig = self::getSystemConfig();
|
|
$masterConfig = self::getMasterDatabaseConfig();
|
|
|
|
return [
|
|
'SQL_HOST' => $masterConfig['host'],
|
|
'SQL_DATABASE' => $masterConfig['database'], // avantikads_nmgen
|
|
'SQL_DATABASE2' => $_ENV['DB_EMPRESA_PREFIX'] ?? 'avantikads_nm', // prefix sin número
|
|
'SQL_USER' => $masterConfig['user'],
|
|
'SQL_PASSWORD' => $masterConfig['password'],
|
|
'DOC_ROOT' => $systemConfig['doc_root'],
|
|
'WEB_ROOT' => $systemConfig['web_root'],
|
|
'SMTP_HOST' => $systemConfig['smtp_host'],
|
|
'SMTP_USER' => $systemConfig['smtp_user'],
|
|
'SMTP_PASS' => $systemConfig['smtp_pass'],
|
|
'SMTP_PORT' => $systemConfig['smtp_port'],
|
|
'ITEMS_PER_PAGE' => $systemConfig['items_per_page'],
|
|
'MIN_YEAR' => (int)$systemConfig['min_year'],
|
|
'MAX_YEAR' => (int)$systemConfig['max_year'],
|
|
'USER_PAC' => $systemConfig['user_pac'],
|
|
'PW_PAC' => $systemConfig['pw_pac']
|
|
];
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Define constantes legadas para compatibilidad con código existente
|
|
*/
|
|
function defineLegacyConstants() {
|
|
$constants = SystemConfig::getLegacyConstants();
|
|
|
|
foreach ($constants as $name => $value) {
|
|
if (!defined($name)) {
|
|
define($name, $value);
|
|
}
|
|
}
|
|
}
|
|
|
|
// Definir constantes legadas para compatibilidad
|
|
defineLegacyConstants(); |