Merge branch 'main' of https://github.com/AduanaSoft/IMPORTADORES
This commit is contained in:
91
views/expediente/index.php
Normal file
91
views/expediente/index.php
Normal 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>
|
||||
31
views/expediente/subir.php
Normal file
31
views/expediente/subir.php
Normal 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
73
views/expediente/ver.php
Normal 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>
|
||||
@@ -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' : '' ?>">
|
||||
|
||||
@@ -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>
|
||||
|
||||
Reference in New Issue
Block a user