Notificación solicitudes
This commit is contained in:
2
.env
2
.env
@@ -1,4 +1,4 @@
|
||||
DB_HOST=localhost
|
||||
DB_HOST=DESKTOP-22T88B6
|
||||
DB_DATABASE=Importaciones_HC
|
||||
DB_USERNAME=sa
|
||||
DB_PASSWORD=Soluciones01
|
||||
|
||||
@@ -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.");
|
||||
@@ -203,7 +196,6 @@ function guardar() {
|
||||
$proveedor_clave
|
||||
];
|
||||
|
||||
|
||||
$sql = "INSERT INTO dbo.solicitud_importacion_factura
|
||||
(id_importador, aduana, anexo22_apendice, numero_factura, fecha_factura,
|
||||
numero_pedimento, incoterm, pais_proveedor, tipo_moneda,
|
||||
@@ -224,6 +216,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 ?
|
||||
'<div style="background: #fff3cd; padding: 10px; border-radius: 5px; margin-bottom: 15px; border-left: 4px solid #ffc107;">
|
||||
<small><strong>📧 Copia enviada a correo adicional</strong></small>
|
||||
</div>' : '';
|
||||
|
||||
$mail->Body = "
|
||||
<div style='font-family: Segoe UI, sans-serif; background-color: #f4f6f9; padding: 30px;'>
|
||||
<div style='max-width: 600px; margin: auto; background: #fff; border: 1px solid #ccc; border-radius: 10px;'>
|
||||
<div style='background: linear-gradient(to right, #003366, #0055A5); padding: 20px; text-align: center;'>
|
||||
<h2 style='color: white; margin: 0;'>📥 Nueva Solicitud Registrada</h2>
|
||||
</div>
|
||||
<div style='padding: 20px;'>
|
||||
$tipoNotificacion
|
||||
<p>Hola <strong>" . htmlspecialchars($nombreUsuario) . "</strong>,</p>
|
||||
<p>Tu solicitud de importación ha sido registrada correctamente con los siguientes datos:</p>
|
||||
|
||||
<div style='background: #f8f9fa; padding: 15px; border-radius: 8px; margin: 15px 0;'>
|
||||
<table style='width: 100%; border-collapse: collapse;'>
|
||||
<tr>
|
||||
<td style='padding: 5px 0; font-weight: bold;'>ID Solicitud:</td>
|
||||
<td style='padding: 5px 0;'>$idSolicitud</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style='padding: 5px 0; font-weight: bold;'>Número de Factura:</td>
|
||||
<td style='padding: 5px 0;'>$numeroFactura</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style='padding: 5px 0; font-weight: bold;'>Fecha:</td>
|
||||
<td style='padding: 5px 0;'>$fechaFactura</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style='padding: 5px 0; font-weight: bold;'>Valor:</td>
|
||||
<td style='padding: 5px 0;'>$valorFactura $tipoMoneda</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
|
||||
<p>Puedes consultar el estado de tu solicitud accediendo a tu panel de control.</p>
|
||||
<br>
|
||||
<p style='color: #888; font-size: 14px;'>Si no realizaste esta acción, contacta al administrador del sistema.</p>
|
||||
</div>
|
||||
<div style='background: #e9ecef; text-align: center; padding: 10px; font-size: 13px; color: #666;'>
|
||||
© " . date('Y') . " SIIH · Desarrollado por AduanaSoft
|
||||
</div>
|
||||
</div>
|
||||
</div>";
|
||||
|
||||
$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
|
||||
|
||||
Reference in New Issue
Block a user