getMessage()); } /** * Clase de configuración centralizada */ class Config { /** * Obtiene configuración de base de datos por empresaId * @param int $empresaId ID de la empresa * @return array Configuración de BD para la empresa */ public static function getDatabaseConfig($empresaId) { // Configuración base desde .env $baseConfig = [ 'host' => $_ENV['DB_HOST'] ?? 'localhost', 'port' => $_ENV['DB_PORT'] ?? '3306', 'charset' => $_ENV['DB_CHARSET'] ?? 'utf8mb4' ]; // Mapeo dinámico de empresas basado en estructura real del sistema // Patón:avantikads_nm{empresaId} donde empresaId viene del usuario $prefix = $_ENV['DB_EMPRESA_PREFIX'] ?? 'avantikads_nm'; $database = $prefix . $empresaId; // Validar que exista la base de datos if (!self::validateDatabaseExists($database)) { throw new Exception("Base de datos no existe para empresaId: $empresaId (DB: $database)"); } $empresas = [ $empresaId => [ 'database' => $database, 'user' => $_ENV['DB_EMPRESA_USER'] ?? $_ENV['DB_USER'], 'password' => $_ENV['DB_EMPRESA_PASSWORD'] ?? $_ENV['DB_PASSWORD'] ] ]; // Validar que exista configuración para la empresa if (!isset($empresas[$empresaId])) { throw new Exception("No existe configuración para empresaId: $empresaId"); } return array_merge($baseConfig, $empresas[$empresaId]); } /** * 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 { $host = $_ENV['DB_HOST'] ?? 'localhost'; $user = $_ENV['DB_USER'] ?? 'root'; $password = $_ENV['DB_PASSWORD'] ?? ''; // Conexión sin especificar BD para verificar existencia $mysqli = new mysqli($host, $user, $password); if ($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) { error_log("Error validando BD $database: " . $e->getMessage()); return false; } } /** * Obtiene empresaId del usuario actual * @param int $userId ID del usuario * @return int|null empresaId del usuario */ public static function getEmpresaIdByUserId($userId) { // Conexión a base de datos master para obtener empresaId del usuario $masterConfig = [ 'host' => $_ENV['DB_MASTER_HOST'] ?? $_ENV['DB_HOST'], 'database' => $_ENV['DB_MASTER_DATABASE'] ?? 'avantikads_nmgen', 'user' => $_ENV['DB_MASTER_USER'] ?? $_ENV['DB_USER'], 'password' => $_ENV['DB_MASTER_PASSWORD'] ?? $_ENV['DB_PASSWORD'] ]; try { $mysqli = new mysqli( $masterConfig['host'], $masterConfig['user'], $masterConfig['password'], $masterConfig['database'] ); if ($mysqli->connect_error) { throw new Exception("Error conexión master DB: " . $mysqli->connect_error); } $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) { error_log("Error obteniendo empresaId: " . $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_port' => $_ENV['SMTP_PORT'] ?? '587', 'items_per_page' => $_ENV['ITEMS_PER_PAGE'] ?? '20', 'min_year' => $_ENV['MIN_YEAR'] ?? '2025', 'max_year' => $_ENV['MAX_YEAR'] ?? '2030', 'debug_mode' => $_ENV['DEBUG_MODE'] ?? 'false' ]; } } /** * Clase de base de datos mejorada con soporte multi-empresa */ class DatabaseManager { private $connections = []; private $currentEmpresaId = null; /** * Obtiene conexión para empresa específica * @param int $empresaId ID de la empresa * @return mysqli */ public function getConnection($empresaId) { if (!isset($this->connections[$empresaId])) { $config = Config::getDatabaseConfig($empresaId); $mysqli = new mysqli( $config['host'] . ':' . $config['port'], $config['user'], $config['password'], $config['database'] ); if ($mysqli->connect_error) { throw new Exception("Error conexión empresa $empresaId: " . $mysqli->connect_error); } $mysqli->set_charset($config['charset']); $this->connections[$empresaId] = $mysqli; } return $this->connections[$empresaId]; } /** * Establece empresaId actual basado en usuario en sesión * @param int $userId ID del usuario en sesión */ public function setEmpresaByUser($userId) { $this->currentEmpresaId = Config::getEmpresaIdByUserId($userId); if (!$this->currentEmpresaId) { throw new Exception("No se pudo determinar empresaId para usuario: $userId"); } } /** * Obtiene conexión para empresa actual * @return mysqli */ public function getCurrentConnection() { if (!$this->currentEmpresaId) { throw new Exception("No hay empresaId establecido"); } return $this->getConnection($this->currentEmpresaId); } } // Ejemplo de inicialización /* try { // Cargar configuración $dbManager = new DatabaseManager(); // Establecer empresa basado en usuario en sesión if (isset($_SESSION['userId'])) { $dbManager->setEmpresaByUser($_SESSION['userId']); } // Obtener conexión para la empresa del usuario $db = $dbManager->getCurrentConnection(); // Ejecutar consulta $result = $db->query("SELECT * FROM productos"); } catch (Exception $e) { error_log("Error en inicialización: " . $e->getMessage()); die("Error del sistema"); } */ ?>