0) { header("Location: /IMPORTADORES/agencias/alta?error=email_exists"); exit; } // 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']]; $stmtInsert = sqlsrv_query($conn, $sqlInsert, $params); if ($stmtInsert === false) { error_log("ERROR: Fallo al insertar usuario"); 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"); throw new Exception("Error al obtener ID del nuevo usuario"); } // 6. Obtener la agencia del administrador actual $sqlAgencia = "SELECT id_agencia FROM agencias_aduanales WHERE id_administrador = ?"; $stmtAgencia = sqlsrv_query($conn, $sqlAgencia, [$_SESSION['usuario_id']]); $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']); throw new Exception("No se encontró agencia asociada al administrador"); } // 7. 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']]; $stmtRelacion = sqlsrv_query($conn, $sqlRelacion, $paramsRelacion); if ($stmtRelacion === false) { error_log("ERROR: No se pudo insertar la relación agente-agencia"); error_log(print_r(sqlsrv_errors(), true)); throw new Exception("Error al guardar relación agente-agencia"); } // 8. CONFIRMAR TRANSACCIÓN ✅ if (!sqlsrv_commit($conn)) { error_log("ERROR: No se pudo confirmar la transacción"); throw new Exception("Error al confirmar transacción"); } // 9. 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 = "

¡Bienvenido a SIIH!

Hola $nombre,

Se ha creado tu cuenta en la plataforma SIIH con el rol de $tipoUsuarioTexto.

Aquí tienes tus credenciales de acceso:

Correo: $email

Contraseña: $password

📌 Importante: Te recomendamos cambiar tu contraseña una vez que ingreses al sistema por primera vez.

Acceder al Sistema

© " . date('Y') . " SIIH · Sistema Integral para Importadores de Hidrocarburos
"; $mail->send(); } catch (Exception $e) { error_log("Error al enviar correo: " . $e->getMessage()); } } // 10. Redirigir con mensaje de éxito header("Location: /IMPORTADORES/agencias/alta?success=created"); exit; } catch (Exception $e) { error_log("ERROR CAPTURADO: " . $e->getMessage()); if (!sqlsrv_rollback($conn)) { error_log("ERROR: No se pudo revertir la transacción"); } else { error_log("Transacción revertida exitosamente"); } error_log("=== FIN CON ERROR guardar_agencia ==="); header("Location: /IMPORTADORES/agencias/alta?error=save_failed"); exit; } finally { if ($conn) { sqlsrv_close($conn); error_log("Conexión cerrada"); } } }