seccion expediente electronico

This commit is contained in:
2025-05-21 10:58:02 -06:00
parent d10d68f607
commit f7ba0e3381
91 changed files with 876 additions and 28 deletions

View File

@@ -0,0 +1,91 @@
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="UTF-8">
<title>📁 Expediente Electrónico</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: 56px;
z-index: 1040;
}
.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;
padding: 40px 20px;
position: relative;
z-index: 1;
background-color: #f4f6f9;
transition: margin-left 0.3s ease;
}
@media (min-width: 768px) { .content { margin-left: 250px; } }
@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 th, .table td { vertical-align: middle; }
.folder-icon { color: #f0ad4e; font-size: 1.2rem; }
</style>
</head>
<body>
<?php include __DIR__ . '/../partials/sidebar_importador.php'; ?>
<div class="content">
<h4 class="mb-4">📁 Expedientes Electrónicos</h4>
<div class="card p-3 shadow-sm">
<div class="table-responsive">
<table class="table table-hover table-bordered">
<thead class="table-light">
<tr>
<th>Pedimento</th>
<th>Fecha Factura</th>
<th>Aduana</th>
<th>Proveedor</th>
<th>Archivos</th>
<th>Tamaño Total</th>
<th>Acciones</th>
</tr>
</thead>
<tbody>
<?php foreach ($expedientes as $exp): ?>
<tr>
<td><i class="fas fa-folder folder-icon me-2"></i><?= htmlspecialchars($exp['numero_pedimento']) ?></td>
<td><?= is_a($exp['fecha_factura'], 'DateTime') ? $exp['fecha_factura']->format('Y-m-d') : htmlspecialchars($exp['fecha_factura']) ?></td>
<td><?= htmlspecialchars($exp['aduana']) ?></td>
<td><?= htmlspecialchars($exp['proveedor_clave']) ?></td>
<td><?= $exp['total_archivos'] ?> archivos</td>
<td><?= number_format($exp['total_tamano'], 2) ?> KB</td>
<td>
<a href="/IMPORTADORES/expediente/ver/<?= $exp['id_solicitud'] ?>" class="btn btn-outline-primary btn-sm">📂 Ver</a>
<a href="/IMPORTADORES/expediente/subir/<?= $exp['id_solicitud'] ?>" class="btn btn-outline-success btn-sm">⬆ Subir</a>
</td>
</tr>
<?php endforeach; ?>
</tbody>
</table>
</div>
</div>
</div>
<script src="https://kit.fontawesome.com/a076d05399.js" crossorigin="anonymous"></script>
</body>
</html>

View File

@@ -0,0 +1,31 @@
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="UTF-8">
<title>📤 Subir Archivos</title>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css">
<style>
body { font-family: 'Segoe UI', sans-serif; background-color: #f4f6f9; }
.content { margin-top: 56px; padding: 40px 20px; background-color: #f4f6f9; }
@media (min-width: 768px) { .content { margin-left: 250px; } }
</style>
</head>
<body>
<?php include __DIR__ . '/../partials/sidebar_importador.php'; ?>
<div class="content">
<h4>📤 Subir Archivos al Expediente</h4>
<div class="card p-4 bg-white shadow-sm">
<form action="/IMPORTADORES/expediente/subir_handler" method="POST" enctype="multipart/form-data">
<input type="hidden" name="id_solicitud" value="<?= $id_solicitud ?>">
<div class="mb-3">
<label for="archivo" class="form-label">Selecciona archivo(s)</label>
<input class="form-control" type="file" name="archivos[]" id="archivo" multiple required>
</div>
<button type="submit" class="btn btn-success">Subir</button>
<a href="/IMPORTADORES/expediente/index" class="btn btn-secondary ms-2">Cancelar</a>
</form>
</div>
</div>
</body>
</html>

73
views/expediente/ver.php Normal file
View File

@@ -0,0 +1,73 @@
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="UTF-8">
<title>📂 Ver Expediente</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; }
.content { margin-top: 56px; padding: 40px 20px; background-color: #f4f6f9; }
@media (min-width: 768px) { .content { margin-left: 250px; } }
.file-icon { margin-right: 8px; }
</style>
</head>
<body>
<?php include __DIR__ . '/../partials/sidebar_importador.php'; ?>
<div class="content">
<h4>📂 Archivos del Expediente</h4>
<div class="card p-4 bg-white shadow-sm">
<?php if (empty($archivos)): ?>
<p>No hay archivos subidos para esta solicitud.</p>
<?php else: ?>
<div class="mb-3">
<a href="/IMPORTADORES/expediente/descargar_zip/<?= $id_solicitud ?>" class="btn btn-outline-dark">📦 Descargar todo en ZIP</a>
</div>
<table class="table table-hover table-bordered">
<thead class="table-light">
<tr>
<th>Archivo</th>
<th>Tipo</th>
<th>Tamaño (KB)</th>
<th>Subido por</th>
<th>Fecha</th>
<th>Acciones</th>
</tr>
</thead>
<tbody>
<?php foreach ($archivos as $file): ?>
<tr>
<td>
<?php
$icon = 'fa-file';
$ext = strtolower(pathinfo($file['nombre_archivo'], PATHINFO_EXTENSION));
if (in_array($ext, ['pdf'])) $icon = 'fa-file-pdf text-danger';
elseif (in_array($ext, ['jpg', 'jpeg', 'png'])) $icon = 'fa-file-image text-info';
elseif (in_array($ext, ['doc', 'docx'])) $icon = 'fa-file-word text-primary';
elseif (in_array($ext, ['xls', 'xlsx'])) $icon = 'fa-file-excel text-success';
elseif (in_array($ext, ['zip', 'rar'])) $icon = 'fa-file-archive text-warning';
?>
<i class="fas <?= $icon ?> file-icon"></i>
<?= htmlspecialchars($file['nombre_archivo']) ?>
</td>
<td><?= htmlspecialchars($file['tipo_archivo']) ?></td>
<td><?= number_format($file['tamano_archivo'], 2) ?></td>
<td><?= htmlspecialchars($file['creado_por']) ?></td>
<td><?= $file['creado_en']->format('Y-m-d H:i') ?></td>
<td class="d-flex gap-2">
<a href="/IMPORTADORES/expediente/ver_archivo/<?= $file['id'] ?>" class="btn btn-sm btn-outline-secondary" target="_blank">👁 Ver</a>
<a href="/IMPORTADORES/<?= $file['ruta_archivo'] ?>" download class="btn btn-sm btn-outline-primary">⬇ Descargar</a>
</td>
</tr>
<?php endforeach; ?>
</tbody>
</table>
<?php endif; ?>
<a href="/IMPORTADORES/expediente/index" class="btn btn-secondary mt-3">← Volver</a>
</div>
</div>
</body>
</html>

View File

@@ -166,6 +166,25 @@ if (!isset($_SESSION['usuario_id']) || $_SESSION['tipo_usuario'] !== 'importador
</nav>
</div>
<!-- EXPEDIENTE ELECTRÓNICO -->
<a class="nav-link px-3 py-2 d-flex justify-content-between align-items-center
<?= str_contains($_SERVER['REQUEST_URI'], '/expediente') ? 'active' : '' ?>"
data-bs-toggle="collapse" href="#submenuExpediente" role="button" aria-expanded="false">
📁 Expediente Electrónico
<span class="badge bg-secondary">1</span>
</a>
<div class="collapse <?= str_contains($_SERVER['REQUEST_URI'], '/expediente') ? 'show' : '' ?>" id="submenuExpediente">
<nav class="nav flex-column ms-3">
<a href="/IMPORTADORES/expediente/index"
class="nav-link px-3 py-1 <?= $_SERVER['REQUEST_URI'] === '/IMPORTADORES/expediente/consultar' ? 'active' : '' ?>">
• Ver expediente
</a>
</nav>
</div>
<!-- CONFIGURACIÓN -->
<a href="/IMPORTADORES/configuracion"
class="nav-link px-3 py-2 <?= str_contains($_SERVER['REQUEST_URI'], '/configuracion') ? 'active' : '' ?>">
@@ -294,6 +313,27 @@ if (!isset($_SESSION['usuario_id']) || $_SESSION['tipo_usuario'] !== 'importador
</nav>
</div>
<!-- EXPEDIENTE ELECTRÓNICO -->
<a class="nav-link px-3 py-2 d-flex justify-content-between align-items-center
<?= str_contains($_SERVER['REQUEST_URI'], '/expediente') ? 'active' : '' ?>"
data-bs-toggle="collapse" href="#submenuExpediente" role="button" aria-expanded="false">
📁 Expediente Electrónico
<span class="badge bg-secondary">1</span>
</a>
<div class="collapse <?= str_contains($_SERVER['REQUEST_URI'], '/expediente') ? 'show' : '' ?>" id="submenuExpediente">
<nav class="nav flex-column ms-3">
<a href="/IMPORTADORES/expediente/index"
class="nav-link px-3 py-1 <?= $_SERVER['REQUEST_URI'] === '/IMPORTADORES/expediente/consultar' ? 'active' : '' ?>">
• Ver expediente
</a>
</nav>
</div>
<!-- CONFIGURACIÓN -->
<a href="/IMPORTADORES/configuracion"
class="nav-link px-3 py-2 <?= str_contains($_SERVER['REQUEST_URI'], '/configuracion') ? 'active' : '' ?>">

View File

@@ -11,6 +11,7 @@
<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>
table.dataTable thead th { background: #343a40; color: #fff; }
body { font-family: 'Segoe UI', sans-serif; background-color: #f4f6f9; }
@@ -74,11 +75,14 @@
.card {
border-radius: 12px;
}
.status-select:disabled {
background-color: #e9ecef;
color: #6c757d;
}
</style>
</head>
<body>
<?php include __DIR__ . '/../partials/sidebar_importador.php'; ?>
<br><br>
<div class="content">
<h4>📄 Solicitudes de Importación</h4>
<a href="/IMPORTADORES/solicitud_importacion/crear" class="btn btn-success mb-3"> Nueva Solicitud</a>
@@ -97,6 +101,8 @@
<th>Vinculación</th>
<th>Transportista</th>
<th>PDF</th>
<!-- Nueva columna Status -->
<th>Status</th>
<th>Acciones</th>
</tr>
</thead>
@@ -127,6 +133,19 @@
📄 PDF
</a>
</td>
<!-- Celda de Status -->
<td>
<select
class="form-select status-select"
data-id="<?= $f['id_solicitud'] ?>"
>
<option value="1" <?= $f['status']==1 ? 'selected' : '' ?>>1 En proceso</option>
<option value="2" <?= $f['status']==2 ? 'selected' : '' ?>>2 Solicitar importación</option>
<option value="3" <?= $f['status']==3 ? 'selected' : '' ?>>3 Con agencia aduana</option>
<option value="4" <?= $f['status']==4 ? 'selected' : '' ?>>4 En proceso de pago</option>
<option value="5" <?= $f['status']==5 ? 'selected' : '' ?>>5 Pedimento generado</option>
</select>
</td>
<td>
<a href="/IMPORTADORES/solicitud_importacion/editar?id=<?= $f['id_solicitud'] ?>"
class="btn btn-sm btn-primary">✏️</a>
@@ -158,22 +177,58 @@
}
$(document).ready(function () {
$('#tabla-solicitudes').DataTable({
language: {
url: '//cdn.datatables.net/plug-ins/1.13.4/i18n/es-ES.json'
}
// Inicializa DataTable
const table = $('#tabla-solicitudes').DataTable({
language: { url: '//cdn.datatables.net/plug-ins/1.13.4/i18n/es-ES.json' }
});
});
<?php if(isset($_GET['deleted'])): ?>
Swal.fire('¡Hecho!','Solicitud eliminada.','success');
<?php endif; ?>
<?php if(isset($_GET['created'])): ?>
Swal.fire('¡Listo!','Solicitud creada.','success');
<?php endif; ?>
<?php if(isset($_GET['updated'])): ?>
Swal.fire('¡Listo!','Solicitud actualizada.','success');
<?php endif; ?>
// Función para bloquear o desbloquear acciones según status
function updateRowStatus($row, status) {
const disable = status === '2'; // 2 = Solicitar importación
$row.find('a.btn, button.btn').prop('disabled', disable);
// Si quieres bloquear también el propio select:
// $row.find('.status-select').prop('disabled', disable);
}
// Al cambiar el select de status
$('#tabla-solicitudes').on('change', '.status-select', function () {
const $sel = $(this);
const id = $sel.data('id');
const status = $sel.val();
const $row = $sel.closest('tr');
// Bloquear botones localmente
updateRowStatus($row, status);
// Llamada AJAX
$.post(
'/IMPORTADORES/solicitud_importacion/update_status',
{ id: id, status: status },
function(res) {
if (!res.success) {
Swal.fire('Error','No se pudo actualizar status','error');
}
},
'json'
).fail(() => {
Swal.fire('Error','No se pudo conectar al servidor','error');
});
});
// Al cargar, aplica bloqueo si ya está en “Solicitar importación”
$('#tabla-solicitudes tbody tr').each(function () {
const $sel = $(this).find('.status-select');
if ($sel.length) updateRowStatus($(this), $sel.val());
});
// Mensajes SweetAlert tras acciones
<?php if(isset($_GET['deleted'])): ?>
Swal.fire('¡Hecho!','Solicitud eliminada.','success');
<?php elseif(isset($_GET['created'])): ?>
Swal.fire('¡Listo!','Solicitud creada.','success');
<?php elseif(isset($_GET['updated'])): ?>
Swal.fire('¡Listo!','Solicitud actualizada.','success');
<?php endif; ?>
});
</script>
</body>
</html>