'admin', 'admin' => 'admin', 'asesor' => 'asesor', 'marketing' => 'marketing', 'control logistico' => 'control_logistico', 'control_logistico' => 'control_logistico', 'soporte logistico' => 'soporte_logistico', 'soporte_logistico' => 'soporte_logistico', 'verificador de pagos' => 'verificador_pagos', 'verificador_pagos' => 'verificador_pagos', 'logistica' => 'logistica', ]; return $aliases[$role] ?? $role; } } if (isset($_SESSION['user_id'])) { $currentRole = (string) ($_SESSION['user_role'] ?? ''); if (in_array($currentRole, ['Administrador', 'admin'], true)) { header('Location: dashboard_principal.php'); } elseif (strcasecmp(trim($currentRole), 'Marketing') === 0) { header('Location: marketing_produccion.php'); } elseif (strcasecmp(trim($currentRole), 'Asesor') === 0) { header('Location: kanban.php'); } else { header('Location: pedidos.php'); } exit(); } $error = ''; $submittedUsername = ''; if ($_SERVER['REQUEST_METHOD'] === 'POST') { $username = trim((string) ($_POST['username'] ?? '')); $password = (string) ($_POST['password'] ?? ''); $submittedUsername = $username; if ($username === '' || $password === '') { $error = 'Please enter both username and password.'; } else { try { $db = db(); $lookup = normalizeLoginIdentifier($username); $stmt = $db->prepare('SELECT * FROM users WHERE LOWER(TRIM(username)) = :identifier LIMIT 1'); $stmt->bindValue(':identifier', $lookup, PDO::PARAM_STR); $stmt->execute(); $user = $stmt->fetch(PDO::FETCH_ASSOC); if (!$user) { $stmt = $db->prepare("SELECT * FROM users WHERE LOWER(TRIM(COALESCE(nombre_asesor, ''))) = :identifier LIMIT 1"); $stmt->bindValue(':identifier', $lookup, PDO::PARAM_STR); $stmt->execute(); $user = $stmt->fetch(PDO::FETCH_ASSOC); } if ($user && password_verify($password, (string) ($user['password'] ?? ''))) { $_SESSION['user_id'] = $user['id']; $_SESSION['username'] = trim((string) ($user['username'] ?? '')); $_SESSION['user_role'] = (string) ($user['role'] ?? ''); $_SESSION['role'] = normalizeSessionRole((string) ($user['role'] ?? '')); $_SESSION['nombre_asesor'] = trim((string) ($user['nombre_asesor'] ?? '')); // Record session try { $ip = $_SERVER['REMOTE_ADDR'] ?? 'unknown'; $ua = $_SERVER['HTTP_USER_AGENT'] ?? 'unknown'; $ciudad = 'Desconocida'; if ($ip !== 'unknown' && $ip !== '127.0.0.1' && $ip !== '::1') { $geo = @file_get_contents("http://ip-api.com/json/{$ip}?fields=city"); if ($geo) { $geoData = json_decode($geo, true); if (isset($geoData['city'])) { $ciudad = $geoData['city']; } } } $stmtSession = $db->prepare('INSERT INTO user_sessions (user_id, ip_address, ciudad, user_agent) VALUES (:user_id, :ip, :ciudad, :ua)'); $stmtSession->bindParam(':user_id', $user['id']); $stmtSession->bindParam(':ip', $ip); $stmtSession->bindParam(':ciudad', $ciudad); $stmtSession->bindParam(':ua', $ua); $stmtSession->execute(); } catch (PDOException $e) { // Silently fail if session recording fails, don't block login } $userRole = (string) ($user['role'] ?? ''); if (in_array($userRole, ['Administrador', 'admin'], true)) { header('Location: dashboard_principal.php'); } elseif (strcasecmp(trim($userRole), 'Marketing') === 0) { header('Location: marketing_produccion.php'); } elseif (strcasecmp(trim($userRole), 'Asesor') === 0) { header('Location: kanban.php'); } else { header('Location: pedidos.php'); } exit(); } elseif ($user) { $error = 'Invalid password.'; } else { $error = 'We could not find an account with that username or advisor name.'; } } catch (PDOException $e) { $error = 'Database error: ' . $e->getMessage(); } } } ?> Login - FLOWERSEGUIMIENTOPEDIDOS

Login