diff --git a/.env b/.env index b16b6a0..e427a09 100644 --- a/.env +++ b/.env @@ -1,4 +1,4 @@ -DB_HOST=localhost +DB_HOST=DESKTOP-22T88B6 DB_DATABASE=Importaciones_HC DB_USERNAME=sa DB_PASSWORD=Soluciones01 diff --git a/app/controllers/solicitud_importacion.php b/app/controllers/solicitud_importacion.php index 458a38c..04bccd7 100644 --- a/app/controllers/solicitud_importacion.php +++ b/app/controllers/solicitud_importacion.php @@ -8,13 +8,12 @@ require_once __DIR__ . '/../../vendor/autoload.php'; require_once __DIR__ . '/../helpers/env.php'; loadEnv(); -/** - * Obtiene (y cachea en sesión) el JWT de la API usando las credenciales de $_ENV - */ -/** - * Obtiene (y cachea) el JWT de la API usando credenciales de $_ENV - * Gestiona expiración: asume 1 hora de vida y renueva si ha pasado. - */ +require_once __DIR__ . '/../../vendor/autoload.php'; +require_once __DIR__ . '/../helpers/crypto.php'; + +/** Obtiene (y cachea en sesión) el JWT de la API usando las credenciales de $_ENV **/ +/** Obtiene (y cachea) el JWT de la API usando credenciales de $_ENV + * Gestiona expiración: asume 1 hora de vida y renueva si ha pasado. **/ function getApiToken(): ?string { // Duración en segundos del token (60 min) @@ -64,9 +63,7 @@ function getApiToken(): ?string return null; } -/** - * Listado de solicitudes de importación (facturas) del importador logueado - */ +/** Listado de solicitudes de importación (facturas) del importador logueado **/ function lista() { if (!($_SESSION['usuario_id'] ?? false)) { header('Location: /IMPORTADORES/login'); @@ -106,9 +103,7 @@ function lista() { include __DIR__ . '/../../views/solicitud_importacion/lista.php'; } -/** - * Formulario de nueva factura - */ +/** Formulario de nueva factura **/ function crear() { if (!($_SESSION['usuario_id'] ?? false)) { header('Location: /IMPORTADORES/login'); @@ -147,9 +142,7 @@ function crear() { include __DIR__ . '/../../views/solicitud_importacion/crear.php'; } -/** - * Procesa la creación de una nueva factura y sus partidas - */ +/** Procesa la creación de una nueva factura y sus partidas **/ function guardar() { if (!($_SESSION['usuario_id'] ?? false)) { die("⚠️ No autorizado."); @@ -202,7 +195,6 @@ function guardar() { $status, $proveedor_clave ]; - $sql = "INSERT INTO dbo.solicitud_importacion_factura (id_importador, aduana, anexo22_apendice, numero_factura, fecha_factura, @@ -223,6 +215,79 @@ function guardar() { } $id_solicitud = (int)$new['id_solicitud']; + + try { + // Verificar configuración de notificaciones del usuario + $sqlNotif = " + SELECT + u.nombre, + u.email, + u.notificaciones, + u.notificaciones_extra, + COALESCE(p.nuevas_solicitudes, 0) as nuevas_solicitudes, + ce.correo as correo_extra + FROM usuarios_sistema u + LEFT JOIN preferencias_notificaciones_usuario p ON u.id_usuario = p.id_usuario + LEFT JOIN correo_extra ce ON u.id_usuario = ce.id_usuario + WHERE u.id_usuario = ?"; + + $stmtNotif = sqlsrv_prepare($conn, $sqlNotif, [$id_importador]); + + if ($stmtNotif && sqlsrv_execute($stmtNotif)) { + $notifConfig = sqlsrv_fetch_array($stmtNotif, SQLSRV_FETCH_ASSOC); + sqlsrv_free_stmt($stmtNotif); + + // 🔐 Desencriptar datos + if ($notifConfig) { + // Correo + $notifConfig['email'] = decrypt($notifConfig['email']); + // Nombre + $notifConfig['nombre'] = decrypt($notifConfig['nombre']); + } + + // Verificar si debe enviar notificaciones + if ($notifConfig && + $notifConfig['notificaciones'] == 1 && + $notifConfig['nuevas_solicitudes'] == 1) { + + // Preparar datos para la notificación + $datosNotificacion = [ + 'id_solicitud' => $id_solicitud, + 'numero_factura' => $num_factura, + 'fecha_factura' => $fecha, + 'valor_factura' => $valor_factura, + 'tipo_moneda' => $tipo_moneda + ]; + + // Enviar al correo principal + $resultadoPrincipal = enviarNotificacionNuevaSolicitud( + $notifConfig['email'], + $notifConfig['nombre'], + $datosNotificacion + ); + + // Enviar al correo adicional si está configurado + if ($notifConfig['notificaciones_extra'] == 1 && !empty($notifConfig['correo_extra'])) { + $resultadoExtra = enviarNotificacionNuevaSolicitud( + $notifConfig['correo_extra'], + $notifConfig['nombre'], + $datosNotificacion, + true // Indicar que es correo adicional + ); + } + // Log de notificaciones enviadas (opcional) + error_log("✅ Notificación enviada para solicitud ID: $id_solicitud"); + } else { + // Log informativo + error_log("ℹ️ Usuario ID: $id_importador no tiene notificaciones de nuevas solicitudes habilitadas"); + } + } else { + error_log("⚠️ No se pudo consultar configuración de notificaciones para usuario ID: $id_importador"); + } + } catch (Exception $e) { + // No fallar el proceso por errores de notificación + error_log("❌ Error en sistema de notificaciones: " . $e->getMessage()); + } // Partidas if(!empty($_POST['partidas'])&&is_array($_POST['partidas'])){ @@ -257,21 +322,115 @@ function guardar() { } } } - if ($partidas_insertadas === 0) { ///header('Location: /IMPORTADORES/solicitud_importacion/crear?error_partidas=1'); // exit; } } - header('Location: /IMPORTADORES/solicitud_importacion/lista?created=ok'); exit; } -/** - * Formulario de edición de factura - */ +/** Función para generar la notificación **/ +use PHPMailer\PHPMailer\PHPMailer; +use PHPMailer\PHPMailer\Exception; + +function enviarNotificacionNuevaSolicitud($email, $nombreUsuario, $datosSolicitud, $esCorreoExtra = false) { + $mail = new PHPMailer(true); + + try { + // Configuración SMTP + $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->CharSet = 'UTF-8'; + + // Configuración del mensaje + $mail->setFrom('noreply@aduanasoft.com.mx', 'SIIH | AduanaSoft'); + $mail->addAddress($email); + $mail->isHTML(true); + + // Personalizar subject si es correo adicional + $subjectPrefix = $esCorreoExtra ? '[COPIA] ' : ''; + $mail->Subject = $subjectPrefix . '📦 Nueva Solicitud de Importación Registrada'; + + // Formatear datos para el email + $idSolicitud = $datosSolicitud['id_solicitud']; + $numeroFactura = htmlspecialchars($datosSolicitud['numero_factura']); + $fechaFactura = htmlspecialchars($datosSolicitud['fecha_factura']); + $valorFactura = number_format($datosSolicitud['valor_factura'], 2); + $tipoMoneda = htmlspecialchars($datosSolicitud['tipo_moneda']); + + $tipoNotificacion = $esCorreoExtra ? + '
+ 📧 Copia enviada a correo adicional +
' : ''; + + $mail->Body = " +
+
+
+

📥 Nueva Solicitud Registrada

+
+
+ $tipoNotificacion +

Hola " . htmlspecialchars($nombreUsuario) . ",

+

Tu solicitud de importación ha sido registrada correctamente con los siguientes datos:

+ +
+ + + + + + + + + + + + + + + + + +
ID Solicitud:$idSolicitud
Número de Factura:$numeroFactura
Fecha:$fechaFactura
Valor:$valorFactura $tipoMoneda
+
+ +

Puedes consultar el estado de tu solicitud accediendo a tu panel de control.

+
+

Si no realizaste esta acción, contacta al administrador del sistema.

+
+
+ © " . date('Y') . " SIIH · Desarrollado por AduanaSoft +
+
+
"; + + $envioExitoso = $mail->send(); + + if ($envioExitoso) { + $tipoCorreo = $esCorreoExtra ? 'correo adicional' : 'correo principal'; + error_log("✅ Notificación enviada exitosamente al $tipoCorreo: $email"); + return true; + } + + return false; + + } catch (Exception $e) { + $tipoCorreo = $esCorreoExtra ? 'correo adicional' : 'correo principal'; + error_log("❌ Error al enviar notificación al $tipoCorreo ($email): {$mail->ErrorInfo}"); + return false; + } +} + +/** Formulario de edición de factura **/ function editar() { if (!($_SESSION['usuario_id'] ?? false)) { header('Location: /IMPORTADORES/login'); exit; @@ -330,9 +489,7 @@ while($r=sqlsrv_fetch_array($stmtPar,SQLSRV_FETCH_ASSOC)) $partidas[]=$r; include __DIR__ . '/../../views/solicitud_importacion/editar.php'; } -/** - * Procesa la actualización de una factura y sus partidas - */ +/** Procesa la actualización de una factura y sus partidas **/ function actualizar() { session_start(); if (!($_SESSION['usuario_id'] ?? false)) { @@ -486,9 +643,7 @@ function actualizar() { } -/** - * “Soft-delete” de una factura - */ +/** “Soft-delete” de una factura **/ function eliminar() { if (!($_SESSION['usuario_id'] ?? false)) { header('Location: /IMPORTADORES/login'); exit; } $id=(int)($_GET['id']??0); @@ -497,10 +652,8 @@ function eliminar() { header('Location: /IMPORTADORES/solicitud_importacion/lista?deleted=ok'); exit; } -/** - * GET /IMPORTADORES/solicitud_importacion/ajax_proveedores - * Devuelve JSON para poblar el select de Proveedor - */ +/** GET /IMPORTADORES/solicitud_importacion/ajax_proveedores + * Devuelve JSON para poblar el select de Proveedor **/ function ajax_proveedores() { // 1) Asegura que la respuesta sea JSON