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();