This commit is contained in:
2025-06-02 13:32:49 -06:00
parent c574183cee
commit 46a92a4415
19 changed files with 728 additions and 379 deletions

132
views/agentes/bitacora.php Normal file
View File

@@ -0,0 +1,132 @@
<?php
include __DIR__ . '/../partials/sidebar_agente.php';
?>
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="UTF-8">
<title>Dashboard | Agente Aduanal</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet">
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js"></script>
<link href="https://cdn.datatables.net/1.13.4/css/jquery.dataTables.min.css" rel="stylesheet">
<script src="https://code.jquery.com/jquery-3.7.0.min.js"></script>
<script src="https://cdn.datatables.net/1.13.4/js/jquery.dataTables.min.js"></script>
<style>
body {
font-family: 'Segoe UI', sans-serif;
background-color: #f4f6f9;
}
.sidebar {
width: 220px;
height: 100vh;
background-color: #343a40;
position: fixed;
top: 0;
left: 0;
padding-top: 56px; /* Alineado con la altura de la navbar */
z-index: 1040; /* Asegura que esté por encima del contenido */
}
.sidebar .nav-link {
font-weight: bold;
color: white;
transition: all 0.3s ease;
}
.sidebar .nav-link:hover,
.sidebar .nav-link.active {
background-color: #495057;
color: #fff;
}
.content {
margin-top: 56px; /* Ajusta debajo de navbar */
padding: 40px 20px;
position: relative;
z-index: 1;
background-color: #f4f6f9; /* Asegura fondo uniforme */
transition: margin-left 0.3s ease;
}
.navbar {
position: fixed;
top: 0;
width: 100%;
z-index: 1050;
}
/* A partir de dispositivos medianos (>=768px), deja espacio lateral */
@media (min-width: 768px) {
.content {
margin-left: 250px; /* Ancho del sidebar */
}
}
/* En móviles, sin margen lateral */
@media (max-width: 767.98px) {
.content {
margin-left: 0;
}
.sidebar .nav-link {
font-weight: normal;
color: #343a40;
background-color: transparent;
}
.sidebar .nav-link:hover,
.sidebar .nav-link.active {
background-color: #e9ecef;
color: #212529;
}
}
.card { border-radius: 12px; }
table.dataTable thead th { background: #343a40; color: #fff; }
</style>
</head>
<body>
<div class="content">
<h4 class="mb-4">👥 Acceso de Usuarios</h4>
<div class="card p-3 shadow-sm">
<div class="table-responsive">
<table class="table table-striped" id="tabla-logins">
<thead>
<tr>
<th>ID</th>
<th>Nombre</th>
<th>Correo</th>
<th>IP</th>
<th>Fecha</th>
<th>Estatus</th>
<th>Detalles</th>
</tr>
</thead>
<tbody>
<?php foreach ($bitacoras as $b): ?>
<tr>
<td><?= htmlspecialchars($b['id_usuario']) ?></td>
<td><?= htmlspecialchars($b['nombre']) ?></td>
<td><?= htmlspecialchars($b['email']) ?></td>
<td><?= htmlspecialchars($b['ip']) ?></td>
<td><?= $b['fecha']->format('Y-m-d H:i:s') ?></td>
<td>
<?= $b['exito'] == 1 ? 'Éxito' : 'Fallido' ?>
</td>
<td><?= htmlspecialchars($b['detalle']) ?></td>
</tr>
<?php endforeach; ?>
</tbody>
</table>
</div>
</div>
</div>
<script>
$(document).ready(function () {
$('#tabla-logins').DataTable({
language: {
url: '//cdn.datatables.net/plug-ins/1.13.4/i18n/es-ES.json'
}
});
});
</script>
</body>
</html>

View File

@@ -1,3 +1,7 @@
<?php
require_once __DIR__ . '/../../app/helpers/crypto.php';
include __DIR__ . '/../partials/sidebar_agente.php';
?>
<!DOCTYPE html>
<html lang="es">
@@ -47,40 +51,36 @@
</head>
<body>
<?php
require_once __DIR__ . '/../../app/helpers/crypto.php';
include __DIR__ . '/../partials/sidebar_agente.php';
?>
<!-- 📄 CONTENIDO -->
<div class="content">
<h4 class="mb-4">Panel principal del agente</h4>
<!-- 📄 CONTENIDO -->
<div class="content">
<h4 class="mb-4">Panel principal del agente</h4>
<div class="row g-4">
<div class="col-md-4">
<div class="card shadow-sm p-3">
<h5 class="text-primary">Importadores activos</h5>
<p>Consulta los que ya fueron autorizados.</p>
<a href="/IMPORTADORES/importadores/activos" class="btn btn-primary btn-sm mt-2">Ver importadores</a>
<div class="row g-4">
<div class="col-md-4">
<div class="card shadow-sm p-3">
<h5 class="text-primary">Importadores activos</h5>
<p>Consulta los que ya fueron autorizados.</p>
<a href="/IMPORTADORES/AGENTES/activos" class="btn btn-primary btn-sm mt-2">Ver importadores</a>
</div>
</div>
</div>
<div class="col-md-4">
<div class="card shadow-sm p-3">
<h5 class="text-success">Solicitudes pendientes</h5>
<p>Valida nuevas solicitudes de registro.</p>
<a href="/IMPORTADORES/AGENTES/solicitudes_pendientes" class="btn btn-success btn-sm mt-2">Ver solicitudes</a>
<div class="col-md-4">
<div class="card shadow-sm p-3">
<h5 class="text-success">Solicitudes pendientes</h5>
<p>Valida nuevas solicitudes de registro.</p>
<a href="/IMPORTADORES/AGENTES/solicitudes_pendientes" class="btn btn-success btn-sm mt-2">Ver solicitudes</a>
</div>
</div>
</div>
<div class="col-md-4">
<div class="card shadow-sm p-3">
<h5 class="text-warning">Bitácora del sistema</h5>
<p>Revisa los accesos y acciones recientes.</p>
<a href="/IMPORTADORES/bitacoras/login" class="btn btn-warning btn-sm mt-2">Ver bitácora</a>
<div class="col-md-4">
<div class="card shadow-sm p-3">
<h5 class="text-warning">Bitácora del sistema</h5>
<p>Revisa los accesos y acciones recientes.</p>
<a href="/IMPORTADORES/agentes/bitacora" class="btn btn-warning btn-sm mt-2">Ver bitácora</a>
</div>
</div>
</div>
</div>
</div>
</body>
</html>

View File

@@ -2,88 +2,95 @@
require_once __DIR__ . '/../../app/helpers/crypto.php';
include __DIR__ . '/../partials/sidebar_agente.php';
?>
<meta name="viewport" content="width=device-width, initial-scale=1">
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet">
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/sweetalert2@11"></script>
<html>
<head>
<title>Dashboard | Agente Aduanal</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet">
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/sweetalert2@11"></script>
<style>
body {
font-family: 'Segoe UI', sans-serif;
background-color: #f4f6f9;
}
.sidebar {
width: 220px;
height: 100vh;
background-color: #343a40;
position: fixed;
top: 0;
left: 0;
padding-top: 60px;
}
.sidebar .nav-link {
color: #ccc;
padding: 12px 20px;
}
.sidebar .nav-link:hover, .sidebar .nav-link.active {
background-color: #495057;
color: #fff;
}
.content {
margin-left: 220px;
padding: 40px 20px;
}
.navbar {
position: fixed;
top: 0;
width: 100%;
z-index: 1000;
}
.card {
border-radius: 12px;
}
</style>
<style>
body {
font-family: 'Segoe UI', sans-serif;
background-color: #f4f6f9;
}
.sidebar {
width: 220px;
height: 100vh;
background-color: #343a40;
position: fixed;
top: 0;
left: 0;
padding-top: 60px;
}
.sidebar .nav-link {
color: #ccc;
padding: 12px 20px;
}
.sidebar .nav-link:hover, .sidebar .nav-link.active {
background-color: #495057;
color: #fff;
}
.content {
margin-left: 220px;
padding: 40px 20px;
}
.navbar {
position: fixed;
top: 0;
width: 100%;
z-index: 1000;
}
.card {
border-radius: 12px;
}
</style>
</head>
<div class="content px-4 pt-5 mt-4">
<h4>✅ Importadores Activos</h4>
<body>
<div class="content px-4 pt-5 mt-4">
<h4>✅ Importadores Activos</h4>
<table class="table table-hover mt-3 align-middle">
<thead class="table-dark">
<tr>
<th>#</th>
<th>Nombre</th>
<th>Correo</th>
<th>Fecha Registro</th>
<th>Acciones</th>
</tr>
</thead>
<tbody>
<?php foreach ($importadores as $i): ?>
<table class="table table-hover mt-3 align-middle">
<thead class="table-dark">
<tr>
<td><?= $i['id_usuario'] ?></td>
<td><?= htmlspecialchars(($i['nombre'])) ?></td>
<td><?= htmlspecialchars($i['email']) ?></td>
<td><?= isset($i['creado_en']) && $i['creado_en'] instanceof DateTime ? $i['creado_en']->format('Y-m-d H:i') : '' ?></td>
<td>
<?php if (isset($i['activo']) && $i['activo'] == 1): ?>
<a href="/IMPORTADORES/agentes/toggle_estado?id=<?= $i['id_usuario'] ?>&success=1" class="btn btn-sm btn-danger">Suspender</a>
<?php else: ?>
<a href="/IMPORTADORES/agentes/toggle_estado?id=<?= $i['id_usuario'] ?>&success=1" class="btn btn-sm btn-success">Activar</a>
<?php endif; ?>
</td>
<th>#</th>
<th>Nombre</th>
<th>Correo</th>
<th>Fecha Registro</th>
<th>Acciones</th>
</tr>
<?php endforeach; ?>
</tbody>
</table>
</div>
</thead>
<tbody>
<?php foreach ($importadores as $i): ?>
<tr>
<td><?= $i['id_usuario'] ?></td>
<td><?= htmlspecialchars(($i['nombre'])) ?></td>
<td><?= htmlspecialchars($i['email']) ?></td>
<td><?= isset($i['creado_en']) && $i['creado_en'] instanceof DateTime ? $i['creado_en']->format('Y-m-d H:i') : '' ?></td>
<td>
<?php if (isset($i['activo']) && $i['activo'] == 1): ?>
<a href="/IMPORTADORES/agentes/toggle_estado?id=<?= $i['id_usuario'] ?>&success=1" class="btn btn-sm btn-danger">Suspender</a>
<?php else: ?>
<a href="/IMPORTADORES/agentes/toggle_estado?id=<?= $i['id_usuario'] ?>&success=1" class="btn btn-sm btn-success">Activar</a>
<?php endif; ?>
</td>
</tr>
<?php endforeach; ?>
</tbody>
</table>
</div>
<?php if (isset($_GET['success'])): ?>
<script>
Swal.fire({
icon: 'success',
title: 'Estado actualizado',
text: 'El estado del usuario se ha actualizado correctamente.',
confirmButtonColor: '#198754'
});
</script>
<?php endif; ?>
<?php if (isset($_GET['success'])): ?>
<script>
Swal.fire({
icon: 'success',
title: 'Estado actualizado',
text: 'El estado del usuario se ha actualizado correctamente.',
confirmButtonColor: '#198754'
});
</script>
<?php endif; ?>
</body>
</html>

View File

@@ -2,7 +2,10 @@
require_once __DIR__ . '/../../app/helpers/crypto.php';
include __DIR__ . '/../partials/sidebar_agente.php';
?>
<meta name="viewport" content="width=device-width, initial-scale=1">
<html>
<head>
<title>Dashboard | Agente Aduanal</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet">
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js"></script>
@@ -43,43 +46,48 @@ include __DIR__ . '/../partials/sidebar_agente.php';
}
</style>
</head>
<div class="content px-4 pt-5 mt-4">
<h4>📥 Solicitudes Pendientes</h4>
<body>
<table class="table table-hover mt-3 align-middle">
<thead class="table-dark">
<tr>
<th>#</th>
<th>Empresa</th>
<th>RFC</th>
<th>Correo</th>
<th>Teléfono</th>
<th>Fecha</th>
<th>Archivo SAT</th>
<th>Acción</th>
</tr>
</thead>
<tbody>
<?php foreach ($solicitudes as $s): ?>
<div class="content px-4 pt-5 mt-4">
<h4>📥 Solicitudes Pendientes</h4>
<table class="table table-hover mt-3 align-middle">
<thead class="table-dark">
<tr>
<td><?= $s['request_id'] ?></td>
<td><?= htmlspecialchars(decrypt($s['company_name'])) ?></td>
<td><?= htmlspecialchars(decrypt($s['rfc'])) ?></td>
<td><?= htmlspecialchars($s['email']) ?></td>
<td><?= htmlspecialchars($s['phone']) ?></td>
<td><?= $s['request_date'] ? $s['request_date']->format('Y-m-d H:i') : '' ?></td>
<td>
<?php if (!empty($s['opinion_file'])): ?>
<a href="/IMPORTADORES/ver_opinion.php?file=<?= urlencode($s['opinion_file']) ?>" target="_blank" class="btn btn-sm btn-outline-secondary">Ver PDF</a>
<?php else: ?>
<span class="text-muted">No adjunto</span>
<?php endif; ?>
</td>
<td>
<a href="/IMPORTADORES/agentes/aprobar_solicitud?id=<?= $s['request_id'] ?>" class="btn btn-sm btn-success">Aprobar</a>
</td>
<th>#</th>
<th>Empresa</th>
<th>RFC</th>
<th>Correo</th>
<th>Teléfono</th>
<th>Fecha</th>
<th>Archivo SAT</th>
<th>Acción</th>
</tr>
<?php endforeach; ?>
</tbody>
</table>
</div>
</thead>
<tbody>
<?php foreach ($solicitudes as $s): ?>
<tr>
<td><?= $s['request_id'] ?></td>
<td><?= htmlspecialchars(decrypt($s['company_name'])) ?></td>
<td><?= htmlspecialchars(decrypt($s['rfc'])) ?></td>
<td><?= htmlspecialchars($s['email']) ?></td>
<td><?= htmlspecialchars($s['phone']) ?></td>
<td><?= $s['request_date'] ? $s['request_date']->format('Y-m-d H:i') : '' ?></td>
<td>
<?php if (!empty($s['opinion_file'])): ?>
<a href="/IMPORTADORES/ver_opinion.php?file=<?= urlencode($s['opinion_file']) ?>" target="_blank" class="btn btn-sm btn-outline-secondary">Ver PDF</a>
<?php else: ?>
<span class="text-muted">No adjunto</span>
<?php endif; ?>
</td>
<td>
<a href="/IMPORTADORES/agentes/aprobar_solicitud?id=<?= $s['request_id'] ?>" class="btn btn-sm btn-success">Aprobar</a>
</td>
</tr>
<?php endforeach; ?>
</tbody>
</table>
</div>
</body>
</html>

View File

@@ -84,17 +84,22 @@ include __DIR__ . '/../partials/sidebar_configuracion.php';
<h4 class="mb-4"> Información General</h4>
<div class="card shadow-sm p-4 mb-4 bg-white">
<form>
<div class="row mb-2">
<div class="row mb-3">
<label class="col-md-2 col-form-label">Clave:</label>
<div class="col-md-3">
<input type="text" class="form-control" value="<?= htmlspecialchars($datos['clave'] ?? '') ?>" disabled>
</div>
<div class="col-md-1"></div>
<div class="col-md-3"></div>
<label class="col-md-2 col-form-label">Tipo de identificador:</label>
<div class="col-md-4">
<input type="text" class="form-control" value="<?= htmlspecialchars($datos['tipo_identificador'] ?? '') ?>" disabled>
<div class="col-md-2">
<select name="tipo_identificador" class="form-control" disabled>
<option value="">-- Selecciona una opción --</option>
<option value="1" <?= ($datos['tipo_identificador'] ?? '') == '1' ? 'selected' : '' ?>>1 - RFC</option>
<option value="2" <?= ($datos['tipo_identificador'] ?? '') == '2' ? 'selected' : '' ?>>2 - CURP</option>
<option value="3" <?= ($datos['tipo_identificador'] ?? '') == '3' ? 'selected' : '' ?>>3 - SIN TAX ID</option>
</select>
</div>
</div>

View File

@@ -88,20 +88,23 @@ include __DIR__ . '/../partials/sidebar_configuracion.php';
<h4 class="mb-4">✏️ Editar Información</h4>
<div class="card shadow-sm p-4 mb-4 bg-white">
<form id="form-edicion" method="POST" action="/IMPORTADORES/configuracion/guardar">
<div class="row mb-2">
<div class="row mb-3">
<label class="col-md-2 col-form-label">Clave:</label>
<div class="col-md-3">
<input type="text" name="clave" maxlength="8"
class="form-control" value="<?= htmlspecialchars($datos['clave'] ?? '') ?>" disabled>
</div>
<div class="col-md-1"></div>
<div class="col-md-3"></div>
<label class="col-md-2 col-form-label">Tipo de identificador:</label>
<div class="col-md-4">
<input type="number" name="tipo_identificador"
class="form-control" value="<?= htmlspecialchars($datos['tipo_identificador'] ?? '') ?>"
onfocus="this.value=''" onblur="if(this.value=='') this.value='<?= htmlspecialchars($datos['tipo_identificador'] ?? '') ?>'">
<div class="col-md-2">
<select name="tipo_identificador" class="form-control" required>
<option value="">-- Selecciona una opción --</option>
<option value="1" <?= ($datos['tipo_identificador'] ?? '') == '1' ? 'selected' : '' ?>>1 - RFC</option>
<option value="2" <?= ($datos['tipo_identificador'] ?? '') == '2' ? 'selected' : '' ?>>2 - CURP</option>
<option value="3" <?= ($datos['tipo_identificador'] ?? '') == '3' ? 'selected' : '' ?>>3 - SIN TAX ID</option>
</select>
</div>
</div>
@@ -123,87 +126,78 @@ include __DIR__ . '/../partials/sidebar_configuracion.php';
<label class="col-md-1 col-form-label">CURP:</label>
<div class="col-md-5">
<input type="text" name="curp" maxlength="18"
class="form-control" value="<?= htmlspecialchars($datos['curp'] ?? '') ?>"
onfocus="this.value=''" onblur="if(this.value=='') this.value='<?= htmlspecialchars($datos['curp'] ?? '') ?>'">
class="form-control" value="<?= htmlspecialchars($datos['curp'] ?? '') ?>">
</div>
</div>
<div class="row mb-3">
<label class="col-md-2 col-form-label">Calle:</label>
<div class="col-md-10">
<input type="text" name="calle" class="form-control" value="<?= htmlspecialchars($datos['calle'] ?? '') ?>"
onfocus="this.value=''" onblur="if(this.value=='') this.value='<?= htmlspecialchars($datos['calle'] ?? '') ?>'">
<input type="text" name="calle" class="form-control" value="<?= htmlspecialchars($datos['calle'] ?? '') ?>">
</div>
</div>
<div class="row mb-3">
<label class="col-md-2 col-form-label">Núm. Exterior:</label>
<div class="col-md-2">
<input type="number" name="num_exterior" class="form-control" value="<?= htmlspecialchars($datos['num_exterior'] ?? '') ?>"
onfocus="this.value=''" onblur="if(this.value=='') this.value='<?= htmlspecialchars($datos['num_exterior'] ?? '') ?>'">
<input type="text" name="num_exterior" class="form-control" value="<?= htmlspecialchars($datos['num_exterior'] ?? '') ?>">
</div>
<div class="col-md-4"></div>
<label class="col-md-2 col-form-label">Núm. Interior:</label>
<div class="col-md-2">
<input type="text" name="num_interior" class="form-control" value="<?= htmlspecialchars($datos['num_interior'] ?? '') ?>"
onfocus="this.value=''" onblur="if(this.value=='') this.value='<?= htmlspecialchars($datos['num_interior'] ?? '') ?>'">
<input type="text" name="num_interior" class="form-control" value="<?= htmlspecialchars($datos['num_interior'] ?? '') ?>">
</div>
</div>
<div class="row mb-3">
<label class="col-md-2 col-form-label">Ciudad / Localidad:</label>
<div class="col-md-3">
<input type="text" name="ciudad" class="form-control" value="<?= htmlspecialchars($datos['ciudad'] ?? '') ?>"
onfocus="this.value=''" onblur="if(this.value=='') this.value='<?= htmlspecialchars($datos['ciudad'] ?? '') ?>'">
<input type="text" name="ciudad" class="form-control" value="<?= htmlspecialchars($datos['ciudad'] ?? '') ?>">
</div>
<div class="col-md-1"></div>
<label class="col-md-1 col-form-label">Colonia:</label>
<div class="col-md-5">
<input type="text" name="colonia" class="form-control" value="<?= htmlspecialchars($datos['colonia'] ?? '') ?>"
onfocus="this.value=''" onblur="if(this.value=='') this.value='<?= htmlspecialchars($datos['colonia'] ?? '') ?>'">
<input type="text" name="colonia" class="form-control" value="<?= htmlspecialchars($datos['colonia'] ?? '') ?>">
</div>
</div>
<div class="row mb-3">
<label class="col-md-2 col-form-label">País:</label>
<div class="col-md-3">
<input type="text" name="pais" class="form-control" value="<?= htmlspecialchars($datos['pais'] ?? '') ?>"
onfocus="this.value=''" onblur="if(this.value=='') this.value='<?= htmlspecialchars($datos['pais'] ?? '') ?>'">
<input type="text" name="pais" class="form-control" value="<?= htmlspecialchars($datos['pais'] ?? '') ?>">
</div>
<div class="col-md-3"></div>
<label class="col-md-2 col-form-label">Código Postal:</label>
<div class="col-md-2">
<input type="number" name="codigo_postal" class="form-control" value="<?= htmlspecialchars($datos['codigo_postal'] ?? '') ?>"
onfocus="this.value=''" onblur="if(this.value=='') this.value='<?= htmlspecialchars($datos['codigo_postal'] ?? '') ?>'">
<input type="number" name="codigo_postal" class="form-control" value="<?= htmlspecialchars($datos['codigo_postal'] ?? '') ?>">
</div>
</div>
<div class="row mb-3">
<label class="col-md-2 col-form-label">Municipio:</label>
<div class="col-md-4">
<input type="text" name="municipio" class="form-control" value="<?= htmlspecialchars($datos['municipio'] ?? '') ?>"
onfocus="this.value=''" onblur="if(this.value=='') this.value='<?= htmlspecialchars($datos['municipio'] ?? '') ?>'">
<input type="text" name="municipio" class="form-control" value="<?= htmlspecialchars($datos['municipio'] ?? '') ?>">
</div>
<div class="col-md-1"></div>
<label class="col-md-1 col-form-label">Estado:</label>
<div class="col-md-4">
<input type="text" name="estado" class="form-control" value="<?= htmlspecialchars($datos['estado'] ?? '') ?>"
onfocus="this.value=''" onblur="if(this.value=='') this.value='<?= htmlspecialchars($datos['estado'] ?? '') ?>'">
<input type="text" name="estado" class="form-control" value="<?= htmlspecialchars($datos['estado'] ?? '') ?>">
</div>
</div>
<div class="row mb-3">
<label class="col-md-2 col-form-label">Teléfono:</label>
<div class="col-md-5">
<input type="text" class="form-control" value="<?= htmlspecialchars($datos['telefono'] ?? '') ?>" disabled>
<input type="text" name="telefono" maxlength="11"
class="form-control" value="<?= htmlspecialchars($datos['telefono'] ?? '') ?>">
</div>
<div class="col-md-1"></div>
@@ -211,8 +205,7 @@ include __DIR__ . '/../partials/sidebar_configuracion.php';
<label class="col-md-1 col-form-label">Fax:</label>
<div class="col-md-3">
<input type="text" name="fax" maxlength="12"
class="form-control" value="<?= htmlspecialchars($datos['fax'] ?? '') ?>"
onfocus="this.value=''" onblur="if(this.value=='') this.value='<?= htmlspecialchars($datos['fax'] ?? '') ?>'">
class="form-control" value="<?= htmlspecialchars($datos['fax'] ?? '') ?>">
</div>
</div>
@@ -227,9 +220,7 @@ include __DIR__ . '/../partials/sidebar_configuracion.php';
<label class="col-md-2 col-form-label">Observaciones:</label>
<div class="col-md-10">
<?php $valor_obs = htmlspecialchars($datos['observaciones'] ?? ''); ?>
<textarea name="observaciones" class="form-control" rows="3"
onfocus="if(this.value === '<?= $valor_obs ?>') this.value=''"
onblur="if(this.value === '') this.value='<?= $valor_obs ?>'"><?= $valor_obs ?></textarea>
<textarea name="observaciones" class="form-control" rows="3"><?= $valor_obs ?></textarea>
</div>
</div>
<div style="display: flex; justify-content: right;">
@@ -241,38 +232,44 @@ include __DIR__ . '/../partials/sidebar_configuracion.php';
<script src="https://cdn.jsdelivr.net/npm/sweetalert2@11"></script>
<script>
document.getElementById('form-edicion').addEventListener('submit', function (event) {
event.preventDefault(); // Evita que el formulario se envíe
document.getElementById('form-edicion').addEventListener('submit', function (event) {
event.preventDefault(); // Evita que el formulario se envíe
const curp = document.querySelector('[name="curp"]').value.trim();
const fax = document.querySelector('[name="fax"]').value.trim();
const curp = document.querySelector('[name="curp"]').value.trim();
const telefono = document.querySelector('input[name="telefono"]').value.trim();
const fax = document.querySelector('[name="fax"]').value.trim();
let errores = [];
let errores = [];
// Validación CURP
if (!/^[A-Z]{4}[0-9]{6}[HM](AS|BC|BS|CC|CL|CM|CS|CH|DF|DG|GT|GR|HG|JC|MC|MN|MS|NT|NL|OC|PL|QT|QR|SP|SL|SR|TC|TS|TL|VZ|YN|ZS)[A-Z]{3}[A-Z0-9]{2}$/.test(curp)) {
errores.push('La CURP no tiene el formato correcto.');
}
// Validación CURP
if (!/^[A-Z]{4}[0-9]{6}[HM](AS|BC|BS|CC|CL|CM|CS|CH|DF|DG|GT|GR|HG|JC|MC|MN|MS|NT|NL|OC|PL|QT|QR|SP|SL|SR|TC|TS|TL|VZ|YN|ZS)[A-Z]{3}[A-Z0-9]{2}$/.test(curp)) {
errores.push('La CURP no tiene el formato correcto.');
}
// Validación Fax
if (fax !== '' && !/^\d{3} \d{3} \d{4}$/.test(fax)) {
errores.push('El número de fax debe tener el formato: 123 456 7890.');
}
// Validación Teléfono - Ajustada para permitir diferentes formatos
if (telefono !== '' && !/^\d{10,11}$/.test(telefono.replace(/\s/g, ''))) {
errores.push('El número de teléfono debe tener 10 u 11 dígitos.');
}
// Si hay errores, mostrar alerta y no enviar
if (errores.length > 0) {
Swal.fire({
icon: 'error',
title: 'Errores en el formulario',
html: errores.map(e => `<p>${e}</p>`).join('')
});
return; // Evita que el formulario se envíe
}
// Validación Fax
if (fax !== '' && !/^\d{3}\s?\d{3}\s?\d{4}$/.test(fax)) {
errores.push('El número de fax debe tener el formato: 123 456 7890 o 1234567890.');
}
// Si no hay errores, enviar el formulario
this.submit(); // Esto sí lo envía manualmente
});
// Si hay errores, mostrar alerta y no enviar
if (errores.length > 0) {
Swal.fire({
icon: 'error',
title: 'Errores en el formulario',
html: errores.map(e => `<p>${e}</p>`).join('')
});
return; // Evita que el formulario se envíe
}
// Si no hay errores, enviar el formulario
this.submit(); // Esto sí lo envía manualmente
});
</script>
</body>
</html>

View File

@@ -8,9 +8,6 @@ if (!isset($_SESSION['usuario_id']) || $_SESSION['tipo_usuario'] !== 'agente_adu
$nombreAgente = $_SESSION['usuario_nombre'];
?>
<!-- 🔷 NAVBAR -->
<nav class="navbar navbar-dark bg-dark">
<div class="container-fluid">
@@ -28,6 +25,6 @@ $nombreAgente = $_SESSION['usuario_nombre'];
<a href="/IMPORTADORES/AGENTES/dashboard" class="nav-link active">📊 Dashboard</a>
<a href="/IMPORTADORES/AGENTES/activos" class="nav-link">✅ Importadores Activos</a>
<a href="/IMPORTADORES/AGENTES/solicitudes_pendientes" class="nav-link">📥 Solicitudes de Registro</a>
<a href="/IMPORTADORES/bitacoras/login" class="nav-link">🕓 Bitácora</a>
<a href="/IMPORTADORES/AGENTES/bitacora" class="nav-link">🕓 Bitácora</a>
</nav>
</div>

View File

@@ -108,15 +108,24 @@ $dos_factores_estado = obtenerEstadoDosFactores();
<div class="card shadow-sm p-3">
<h4 class="mb-4 text-dark">Recibe Notificaciones</h4>
<p>Agrega un correo adicional para recibir notificaciones.</p>
<form action="/IMPORTADORES/seguridad/correoExtra" method="POST">
<div class="mb-3">
<label class="form-label">Correo electrónico</label>
<input type="email" name="email-extra" class="form-control" required value="">
</div>
<div class="d-grid">
<button type="submit" class="btn btn-primary">Registrar</button>
</div>
</form>
<?php if (!empty($correos['correo_extra'])): ?>
<p><?= htmlspecialchars($correos['correo_extra']) ?></p>
<form method="POST" action="/IMPORTADORES/seguridad/modificarCorreoExtra">
<div class="mb-3">
<input type="email" name="email-extra" class="form-control" value="<?= htmlspecialchars($correos['correo_extra']) ?>" required>
</div>
<div class="mb-3">
<button type="submit" class="btn btn-success">Actualizar</button>
</div>
</form>
<?php else: ?>
<form method="POST" action="/IMPORTADORES/seguridad/correoExtra">
<div class="mb-3">
<input type="email" name="email-extra" class="form-control" placeholder="Correo adicional" required>
</div>
<button type="submit" class="btn btn-primary">Registrar</button>
</form>
<?php endif; ?>
</div>
</div>
@@ -125,15 +134,22 @@ $dos_factores_estado = obtenerEstadoDosFactores();
<div class="card shadow-sm p-3">
<h4 class="mb-4 text-dark">Correo de Respaldo</h4>
<p>Agrega un correo de respaldo para reuperación de tu cuenta.</p>
<form action="/IMPORTADORES/seguridad/correoRespaldo" method="POST">
<div class="mb-3">
<label class="form-label">Correo electrónico respaldo</label>
<input type="email" name="email-respaldo" class="form-control" required value="">
</div>
<div class="d-grid">
<button type="submit" class="btn btn-success">Registrar</button>
</div>
</form>
<?php if (!empty($correos['correo_respaldo'])): ?>
<p><?= htmlspecialchars($correos['correo_respaldo']) ?></p>
<form method="POST" action="/IMPORTADORES/seguridad/modificarCorreoRspaldo">
<div class="mb-3">
<input type="email" name="email-respaldo" class="form-control" value="<?= htmlspecialchars($correos['correo_respaldo']) ?>" required>
</div>
<button type="submit" class="btn btn-success">Actualizar</button>
</form>
<?php else: ?>
<form method="POST" action="/IMPORTADORES/seguridad/correoRespaldo">
<div class="mb-3">
<input type="email" name="email-respaldo" class="form-control" placeholder="Correo de respaldo" required>
</div>
<button type="submit" class="btn btn-primary">Registrar</button>
</form>
<?php endif; ?>
</div>
</div>

View File

@@ -99,7 +99,7 @@
</div>
<div class="col-md-4 mb-3">
<label for="pais_proveedor" class="form-label">País (Proveedor)</label>
<select id="pais_proveedor" name="pais_proveedor" class="form-select searchable">
<select id="pais_proveedor" name="pais_proveedor" class="form-select searchable" required>
<option value="">-- Selecciona País --</option>
<?php foreach($paises as $p): ?>
<option value="<?= htmlspecialchars($p['id_pais']) ?>"><?= htmlspecialchars($p['nombre']) ?></option>
@@ -108,7 +108,7 @@
</div>
<div class="col-md-4 mb-3">
<label for="tipo_moneda" class="form-label">Moneda</label>
<select id="tipo_moneda" name="tipo_moneda" class="form-select searchable">
<select id="tipo_moneda" name="tipo_moneda" class="form-select searchable" required>
<?php foreach(['MXN'=>'Peso Mexicano','USD'=>'Dólar USD','EUR'=>'Euro','CNY'=>'Yuan','GBP'=>'Libra GBP','JPY'=>'Yen'] as $code=>$label): ?>
<option value="<?= $code ?>"><?= "$label ($code)" ?></option>
<?php endforeach; ?>
@@ -139,7 +139,9 @@
<select id="transportista_id" name="transportista_id" class="form-select searchable" required>
<option value="">-- Selecciona --</option>
<?php foreach($transportistas as $t): ?>
<option value="<?= htmlspecialchars($t['id_transportista']) ?>"><?= htmlspecialchars($t['nombre']) ?></option>
<option value="<?= htmlspecialchars($t['id_transportista']) ?>">
<?= htmlspecialchars($t['clave_identificador'] . ' - ' . $t['nombre']) ?>
</option>
<?php endforeach; ?>
</select>
</div>
@@ -148,7 +150,9 @@
<select id="chofer_id" name="chofer_id" class="form-select searchable" required>
<option value="">-- Selecciona Chofer --</option>
<?php foreach($choferes as $c): ?>
<option value="<?= htmlspecialchars($c['id_chofer']) ?>"><?= htmlspecialchars($c['nombre']) ?></option>
<option value="<?= htmlspecialchars($c['id_chofer']) ?>">
<?= htmlspecialchars($c['nombre']) ?>
</option>
<?php endforeach; ?>
</select>
</div>
@@ -179,12 +183,12 @@
</thead>
<tbody>
<tr>
<td><input name="partidas[0][descripcion]" class="form-control w-100"></td>
<td><input name="partidas[0][cantidad_comercial]" type="number" step="0.0001" class="form-control w-100"></td>
<td><input name="partidas[0][cantidad_tarifa]" type="number" step="0.0001" class="form-control w-100"></td>
<td><input name="partidas[0][descripcion]" class="form-control w-100" required></td>
<td><input name="partidas[0][cantidad_comercial]" type="number" step="0.0001" class="form-control w-100" min="0" required></td>
<td><input name="partidas[0][cantidad_tarifa]" type="number" step="0.0001" class="form-control w-100" min="0" required></td>
<td>
<div class="mb-3">
<select name="partidas[0][unidad_comercial_id]" class="form-select searchable">
<select name="partidas[0][unidad_comercial_id]" class="form-select searchable" required>
<option value="">-- Unidad --</option>
<?php foreach($unidades_medida as $um): ?>
<option value="<?= htmlspecialchars($um['id']) ?>"><?= htmlspecialchars($um['descripcion']) ?></option>
@@ -192,11 +196,11 @@
</select>
</div>
</td>
<td><input name="partidas[0][valor_factura]" type="number" step="0.01" class="form-control valor-partida w-100"></td>
<td><input name="partidas[0][peso_bruto]" type="number" step="0.0001" class="form-control w-100"></td>
<td><input name="partidas[0][valor_factura]" type="number" step="0.01" class="form-control valor-partida w-100" min="0" required></td>
<td><input name="partidas[0][peso_bruto]" type="number" step="0.0001" class="form-control w-100" min="0" required></td>
<td>
<div class="mb-3">
<select name="partidas[0][tasa_preferencial]" class="form-select searchable">
<select name="partidas[0][tasa_preferencial]" class="form-select searchable" required>
<option value="">-- Selecciona --</option>
<option>General</option>
<option>TLC</option>

View File

@@ -201,8 +201,8 @@
<?php endforeach; else: ?>
<tr>
<td><input name="partidas[0][descripcion]" class="form-control"></td>
<td><input name="partidas[0][cantidad_comercial]" type="number" step="0.0001" class="form-control"></td>
<td><input name="partidas[0][cantidad_tarifa]" type="number" step="0.0001" class="form-control"></td>
<td><input name="partidas[0][cantidad_comercial]" type="number" step="0.0001" class="form-control" min="0"></td>
<td><input name="partidas[0][cantidad_tarifa]" type="number" step="0.0001" class="form-control" min="0"></td>
<td>
<select name="partidas[0][unidad_comercial_id]" class="form-select searchable">
<option value="">-- Unidad --</option>
@@ -211,8 +211,8 @@
<?php endforeach; ?>
</select>
</td>
<td><input name="partidas[0][valor_factura]" type="number" step="0.01" class="form-control valor-partida"></td>
<td><input name="partidas[0][peso_bruto]" type="number" step="0.0001" class="form-control"></td>
<td><input name="partidas[0][valor_factura]" type="number" step="0.01" class="form-control valor-partida" min="0"></td>
<td><input name="partidas[0][peso_bruto]" type="number" step="0.0001" class="form-control" min="0"></td>
<td>
<select name="partidas[0][tasa_preferencial]" class="form-select searchable">
<option value="">-- Selecciona --</option>
@@ -243,104 +243,125 @@
</div>
<!-- Choices.js & jQuery -->
<!-- Choices.js JS -->
<script src="https://cdn.jsdelivr.net/npm/choices.js/public/assets/scripts/choices.min.js"></script>
<!-- Choices.js JS -->
<script src="https://cdn.jsdelivr.net/npm/choices.js/public/assets/scripts/choices.min.js"></script>
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/select2@4.1.0/dist/js/select2.min.js"></script>
<
<script>
// 1) Inicializar Choices para todos los selects excepto proveedor_id
document.querySelectorAll('.searchable:not(#proveedor_id)').forEach(el => {
new Choices(el, { searchEnabled: true, itemSelectText: '', shouldSort: false });
});
// 2) Cargar proveedores dinámicamente
const proveedorEl = document.getElementById('proveedor_id');
let proveedorChoices = null;
fetch('/IMPORTADORES/solicitud_importacion/ajax_proveedores')
.then(res => res.ok ? res.json() : Promise.reject(res.status))
.then(json => {
proveedorEl.innerHTML = '<option value="">-- Selecciona Proveedor --</option>';
json.results.forEach(item => {
const opt = document.createElement('option');
opt.value = item.id;
opt.text = item.text;
proveedorEl.add(opt);
});
// destruir instancia previa si existe
if (proveedorChoices) proveedorChoices.destroy();
proveedorChoices = new Choices(proveedorEl, {
searchEnabled: true,
itemSelectText: '',
shouldSort: false
});
// seleccionar valor actual
const current = '<?= htmlspecialchars($factura['proveedor_id'], ENT_QUOTES) ?>';
if (current) {
proveedorChoices.setChoiceByValue(current);
}
})
.catch(err => {
console.error('Error cargando proveedores:', err);
proveedorEl.innerHTML = '<option value="">No fue posible cargar proveedores</option>';
});
// 3) Agregar partida dinámica
// add-partida & validation script
document.getElementById('add-partida').addEventListener('click', () => {
const tbody = document.querySelector('#tabla-partidas tbody');
const idx = tbody.querySelectorAll('tr').length;
const row = document.createElement('tr');
row.innerHTML = `
<td><input name="partidas[\${idx}][descripcion]" class="form-control"></td>
<td><input name="partidas[\${idx}][cantidad_comercial]" type="number" step="0.0001" class="form-control"></td>
<td><input name="partidas[\${idx}][cantidad_tarifa]" type="number" step="0.0001" class="form-control"></td>
<td><select name="partidas[\${idx}][unidad_comercial_id]" class="form-select searchable"><option value="">-- Unidad --</option>
<?php foreach($unidades_medida as $um): ?>
<td><input name="partidas[${idx}][descripcion]" class="form-control"></td>
<td><input name="partidas[${idx}][cantidad_comercial]" type="number" step="0.0001" class="form-control"></td>
<td><input name="partidas[${idx}][cantidad_tarifa]" type="number" step="0.0001" class="form-control"></td>
<td>
<select name="partidas[${idx}][unidad_comercial_id]" class="form-select searchable">
<option value="">-- Unidad --</option>
<?php foreach($unidades_medida as $um): ?>
<option value="<?= htmlspecialchars($um['id']) ?>"><?= htmlspecialchars($um['descripcion']) ?></option>
<?php endforeach; ?>
</select></td>
<td><input name="partidas[\${idx}][valor_factura]" type="number" step="0.01" class="form-control valor-partida"></td>
<td><input name="partidas[\${idx}][peso_bruto]" type="number" step="0.0001" class="form-control"></td>
<td><select name="partidas[\${idx}][tasa_preferencial]" class="form-select searchable"><option value="">-- Selecciona --</option>
<?php endforeach; ?>
</select>
</td>
<td><input name="partidas[${idx}][valor_factura]" type="number" step="0.01" class="form-control valor-partida"></td>
<td><input name="partidas[${idx}][peso_bruto]" type="number" step="0.0001" class="form-control"></td>
<td>
<select name="partidas[${idx}][tasa_preferencial]" class="form-select searchable">
<option value="">-- Selecciona --</option>
<option>General</option><option>TLC</option><option>PROSEC</option><option>ALADI</option><option>COMERCIALIZADORA</option>
</select></td>
<td class="hide"><input name="partidas[\${idx}][precio_unitario]" type="number" class="form-control"></td>
<td class="hide"><input name="partidas[\${idx}][oma_factura]" class="form-control"></td>
</select>
</td>
<td class="hide"><input name="partidas[${idx}][precio_unitario]" type="number" class="form-control"></td>
<td class="hide"><input name="partidas[${idx}][oma_factura]" class="form-control"></td>
<td><button type="button" class="btn btn-danger btn-sm remove-row">✖️</button></td>
`;
tbody.appendChild(row);
// re-init Choices para nuevos selects
// Re-inicializar Choices.js en los nuevos selects
row.querySelectorAll('.searchable').forEach(el => {
new Choices(el, { searchEnabled: true, itemSelectText: '', shouldSort: false });
});
});
// 4) Remover partida
document.querySelector('#tabla-partidas tbody').addEventListener('click', e => {
if (e.target.matches('.remove-row')) {
e.target.closest('tr').remove();
// Manejador para controlar el overflow al abrir dropdowns
document.addEventListener('click', function(e) {
const tableContainer = document.querySelector('.table-responsive');
if (!tableContainer) return;
if (e.target.closest('.choices__inner')) {
tableContainer.style.overflow = 'visible';
} else {
tableContainer.style.overflow = 'auto';
}
});
// 5) Validar suma de partidas
$('#solicitudForm').submit(function(e) {
const total = parseFloat($('.valor-total').val()) || 0;
document.querySelector('#tabla-partidas tbody').addEventListener('click', e => {
if (e.target.matches('.remove-row')) e.target.closest('tr').remove();
});
// validate suma partidas == valor_factura
$('#solicitudForm').submit(function(e){
const total = parseFloat($('#valor_factura').val())||0;
let sum = 0;
$('.valor-partida').each(function() {
sum += parseFloat($(this).val()) || 0;
});
if (Math.abs(sum - total) > 0.01) {
$('.valor-partida').each(function(){ sum += parseFloat($(this).val())||0; });
if(Math.abs(sum - total) > 0.001){
e.preventDefault();
Swal.fire({
icon: 'error',
title: 'Error de validación',
text: `La suma de partidas (${sum.toFixed(2)}) no coincide con Valor Factura (${total.toFixed(2)})`
icon:'error',
title:'Error de validación',
text:`La suma de partidas (${sum.toFixed(2)}) no coincide con Valor Factura (${total.toFixed(2)}).`
});
}
});
</script>
<script>
// ✅ DIFERENCIA PRINCIPAL: Inicializar Choices.js en partidas existentes
document.addEventListener('DOMContentLoaded', function() {
// Inicializar Choices.js en selects existentes de partidas (para edición)
document.querySelectorAll('#tabla-partidas .searchable').forEach(el => {
if (el.id !== 'proveedor_id') {
new Choices(el, { searchEnabled: true, itemSelectText: '', shouldSort: false });
}
});
// Inicializar otros selects searchable (excepto proveedor_id que se maneja aparte)
document.querySelectorAll('.searchable').forEach(el => {
if (el.id !== 'proveedor_id' && !el.closest('#tabla-partidas')) {
new Choices(el, { searchEnabled: true, itemSelectText: '', shouldSort: false });
}
});
});
// proveedores script - ✅ DIFERENCIA: Pre-seleccionar proveedor existente
const proveedorEl = document.getElementById('proveedor_id');
const proveedorActual = '<?= htmlspecialchars($factura['proveedor_clave'] ?? '') ?>'; // ← Proveedor actual
fetch('/IMPORTADORES/solicitud_importacion/ajax_proveedores')
.then(res => { if (!res.ok) throw new Error(`HTTP ${res.status}`); return res.json(); })
.then(json => {
proveedorEl.innerHTML = '<option value="">-- Selecciona Proveedor --</option>';
json.results.forEach(item => {
const opt = document.createElement('option');
opt.value = item.id;
opt.text = item.text;
// ✅ Pre-seleccionar si coincide con el proveedor actual
if (item.id === proveedorActual) {
opt.selected = true;
}
proveedorEl.add(opt);
});
if (proveedorEl._choice) proveedorEl._choice.destroy();
new Choices(proveedorEl, { searchEnabled: true, itemSelectText: '', shouldSort: false });
})
.catch(err => {
console.error('Error cargando proveedores:', err);
proveedorEl.innerHTML = '<option value="">No fue posible cargar proveedores</option>';
});
</script>
</body>
</html>
</html>

View File

@@ -1,3 +1,5 @@
<?php include __DIR__ . '/../partials/sidebar_importador.php'; ?>
<!DOCTYPE html>
<html lang="es">
<head>
@@ -82,7 +84,7 @@
</style>
</head>
<body>
<?php include __DIR__ . '/../partials/sidebar_importador.php'; ?>
<div class="content">
<h4>📄 Solicitudes de Importación</h4>
<a href="/IMPORTADORES/solicitud_importacion/crear" class="btn btn-success mb-3"> Nueva Solicitud</a>
@@ -114,7 +116,7 @@
<td><?= htmlspecialchars($f['fecha_factura']) ?></td>
<td><?= htmlspecialchars($f['numero_pedimento']) ?></td>
<td><?= htmlspecialchars($f['incoterm']) ?></td>
<td><?= htmlspecialchars($f['pais_proveedor']) ?></td>
<td><?= htmlspecialchars($f['nombre_pais_proveedor']) ?></td>
<td><?= htmlspecialchars($f['tipo_moneda']) ?></td>
<td><?= number_format($f['valor_factura'],2) ?></td>
<td>

View File

@@ -1,3 +1,5 @@
<?php include __DIR__ . '/../partials/sidebar_importador.php'; ?>
<!DOCTYPE html>
<html lang="es">
<head>
@@ -77,17 +79,15 @@
}
</style>
</head>
<body>
<?php include __DIR__ . '/../partials/sidebar_importador.php'; ?>
<div class="content">
<br> <br>
<h4> Nuevo Transporte</h4>
<form id="formTransCrear" action="/IMPORTADORES/transportes/guardar" method="POST" enctype="multipart/form-data" class="card p-4 shadow-sm">
<div class="row g-3">
<div class="col-md-6">
<label class="form-label">Vehículo *</label>
<label class="form-label">Contenedor *</label>
<input name="vehiculo" id="vehiculo" class="form-control" required>
</div>
<div class="col-md-6">
@@ -104,7 +104,7 @@
<option value="">Selecciona...</option>
<?php foreach($transportistas as $tr): ?>
<option value="<?= $tr['id_transportista'] ?>">
<?= htmlspecialchars($tr['nombre']) ?>
<?= htmlspecialchars(($tr['clave_identificador'] . ' - ' . $tr['nombre'])) ?>
</option>
<?php endforeach; ?>
</select>
@@ -143,6 +143,7 @@
// Si todas las validaciones pasan, el formulario se envía.
});
</script>
</body>
</html>

View File

@@ -112,7 +112,7 @@ if (!($_SESSION['usuario_id'] ?? false)) {
<label class="form-label">Archivo CSV *</label>
<input type="file" name="csv" accept=".csv" class="form-control" required>
</div>
<p>Descarga la plantilla y llena las columnas: <code>vehiculo, identificador_fiscal, id_transportista</code>.</p>
<p>Descarga la plantilla y llena las columnas: <code>contenedor, identificador_fiscal, id_transportista</code>.</p>
<a href="/IMPORTADORES/public/downloads/transportes_masivo_template.csv" class="btn btn-outline-secondary mb-3">
📥 Descargar plantilla
</a><br>
@@ -120,9 +120,8 @@ if (!($_SESSION['usuario_id'] ?? false)) {
</form>
</div>
</div>
</body>
</html>
<script>
<script>
document.addEventListener('DOMContentLoaded', function() {
const Toast = Swal.mixin({
toast: true,
@@ -148,4 +147,7 @@ if (!($_SESSION['usuario_id'] ?? false)) {
});
});
});
</script>
</script>
</body>
</html>