0) { error_log("ERROR: Email ya existe"); header("Location: /IMPORTADORES/agencias/alta?error=email_exists"); exit; } error_log("Validación de duplicado pasada"); // 4. Insertar usuario $sqlInsert = "INSERT INTO usuarios_sistema (nombre, email, password_hash, tipo_usuario, activo, creado_en, dos_factores, creado_por) OUTPUT INSERTED.id_usuario VALUES (?, ?, ?, ?, 1, GETDATE(), 0, ?) "; $params = [$nombre_encrypted, $email_encrypted, $password_hash, $tipo, $_SESSION['usuario_id']]; error_log("Parámetros para INSERT:"); error_log("nombre_encrypted: " . (empty($nombre_encrypted) ? 'VACÍO' : 'OK')); error_log("email_encrypted: " . (empty($email_encrypted) ? 'VACÍO' : 'OK')); error_log("password_hash: " . (empty($password_hash) ? 'VACÍO' : 'OK')); error_log("tipo: '$tipo'"); error_log("creado_por: " . $_SESSION['usuario_id']); $stmtInsert = sqlsrv_query($conn, $sqlInsert, $params); if ($stmtInsert === false) { error_log("ERROR: Fallo al insertar usuario"); error_log("SQL: $sqlInsert"); error_log("Errores SQL Server:"); error_log(print_r(sqlsrv_errors(), true)); throw new Exception("Error al insertar usuario"); } $idUsuarioRow = sqlsrv_fetch_array($stmtInsert, SQLSRV_FETCH_ASSOC); $id_usuario = $idUsuarioRow['id_usuario'] ?? null; if (!$id_usuario) { error_log("ERROR: No se obtuvo id_usuario tras el insert"); error_log("idUsuarioRow: " . print_r($idUsuarioRow, true)); throw new Exception("Error al obtener ID del nuevo usuario"); } error_log("Usuario insertado exitosamente con ID: $id_usuario"); // 5. Obtener la agencia del administrador actual $sqlAgencia = "SELECT id_agencia FROM agencias_aduanales WHERE id_administrador = ?"; $stmtAgencia = sqlsrv_query($conn, $sqlAgencia, [$_SESSION['usuario_id']]); if ($stmtAgencia === false) { error_log("ERROR: Fallo al consultar agencia"); error_log(print_r(sqlsrv_errors(), true)); throw new Exception("Error al consultar agencia"); } $agenciaRow = sqlsrv_fetch_array($stmtAgencia, SQLSRV_FETCH_ASSOC); $id_agencia = $agenciaRow['id_agencia'] ?? null; if (!$id_agencia) { error_log("ERROR: No se encontró agencia para el admin_agencia con id_usuario=" . $_SESSION['usuario_id']); error_log("agenciaRow: " . print_r($agenciaRow, true)); throw new Exception("No se encontró agencia asociada al administrador"); } error_log("Agencia encontrada con ID: $id_agencia"); // 6. Crear la relación agente-agencia $sqlRelacion = "INSERT INTO agente_agencia (id_agente, id_agencia, fecha_asignacion, activo, asignado_por) VALUES (?, ?, GETDATE(), 1, ?) "; $paramsRelacion = [$id_usuario, $id_agencia, $_SESSION['usuario_id']]; error_log("Parámetros para relación agente-agencia:"); error_log("id_agente: $id_usuario"); error_log("id_agencia: $id_agencia"); error_log("asignado_por: " . $_SESSION['usuario_id']); $stmtRelacion = sqlsrv_query($conn, $sqlRelacion, $paramsRelacion); if ($stmtRelacion === false) { error_log("ERROR: No se pudo insertar la relación agente-agencia"); error_log("SQL: $sqlRelacion"); error_log("Errores SQL Server:"); error_log(print_r(sqlsrv_errors(), true)); throw new Exception("Error al guardar relación agente-agencia"); } error_log("Relación agente-agencia creada exitosamente"); // 7. CONFIRMAR TRANSACCIÓN ✅ if (!sqlsrv_commit($conn)) { error_log("ERROR: No se pudo confirmar la transacción"); error_log(print_r(sqlsrv_errors(), true)); throw new Exception("Error al confirmar transacción"); } error_log("Transacción confirmada exitosamente"); // 8. Enviar correo de bienvenida if (class_exists('PHPMailer\PHPMailer\PHPMailer')) { $mail = new PHPMailer(true); try { $mail->isSMTP(); $mail->Host = 'secure.emailsrvr.com'; $mail->SMTPAuth = true; $mail->Username = 'noreply@aduanasoft.com.mx'; $mail->Password = $_ENV['SMTP_PASS'] ?? ''; $mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS; $mail->Port = 587; $mail->setFrom('noreply@aduanasoft.com.mx', 'SIIH | Sistema Integral para Importadores de Hidrocarburos'); $mail->addAddress($email); // Email sin encriptar para el envío $mail->CharSet = 'UTF-8'; $mail->isHTML(true); $mail->Subject = 'Tu acceso a la plataforma SIIH ha sido creado'; // Determinar el tipo de usuario para el mensaje $tipoUsuarioTexto = match($tipo) { 'agente_aduanal' => 'agente aduanal', default => 'usuario' }; $mail->Body = "