Preparando proyecto para migración a repositorio MVE

This commit is contained in:
2025-10-23 08:48:00 -06:00
parent b1b9e4a77c
commit d0af739ce2
75 changed files with 15875 additions and 4022 deletions

View File

@@ -3,6 +3,29 @@ require_once __DIR__ . '/../helpers/session.php';
require_once __DIR__ . '/../../config/database.php';
require_once __DIR__ . '/../helpers/env.php';
// Formatea el pedimento como: YY-AA-PPPP-PPPPPPP
function format_pedimento_display($anio, $aduana, $patente, $numero)
{
$yy = substr((string)$anio, -2);
$ad = substr(preg_replace('/\D/', '', (string)$aduana), 0, 2);
$pat = str_pad(preg_replace('/\D/', '', (string)$patente), 4, '0', STR_PAD_LEFT);
$num = str_pad(preg_replace('/\D/', '', (string)$numero), 7, '0', STR_PAD_LEFT);
$yy = $yy !== '' ? $yy : '00';
$ad = str_pad($ad, 2, '0', STR_PAD_LEFT);
return "$yy-$ad-$pat-$num";
}
function ensure_expediente_schema($conn) {
// Agregar columna pedimento_id si no existe (compatibilidad con esquema nuevo)
$chk = sqlsrv_query($conn, "SELECT 1 FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'expediente_archivos' AND COLUMN_NAME = 'pedimento_id'");
$exists = $chk && sqlsrv_fetch_array($chk) ? true : false;
if ($chk) sqlsrv_free_stmt($chk);
if (!$exists) {
@sqlsrv_query($conn, "ALTER TABLE expediente_archivos ADD pedimento_id INT NULL");
@sqlsrv_query($conn, "CREATE INDEX IX_expediente_archivos_pedimento ON expediente_archivos(pedimento_id)");
}
}
// Mostrar tabla de expedientes
function index()
{
@@ -12,29 +35,50 @@ function index()
}
$conn = getConnection();
ensure_expediente_schema($conn);
$id_importador = $_SESSION['usuario_id'];
$sql = "SELECT
sif.id_solicitud, sif.numero_pedimento, sif.fecha_factura, sif.aduana, sif.proveedor_clave,
COUNT(ea.id) AS total_archivos,
ISNULL(SUM(ea.tamano_archivo), 0) AS total_tamano
FROM solicitud_importacion_factura sif
LEFT JOIN expediente_archivos ea
ON ea.id_solicitud = sif.id_solicitud
WHERE sif.numero_pedimento IS NOT NULL
AND sif.id_importador = ?
AND sif.status > 0
GROUP BY sif.id_solicitud, sif.numero_pedimento, sif.fecha_factura, sif.aduana, sif.proveedor_clave
ORDER BY sif.fecha_factura DESC
";
// Nuevo origen: pedimentos (cabecera) + facturas para fecha/proveedor + archivos por pedimento
$sql = "
WITH fact AS (
SELECT
f.pedimento_id,
MAX(f.fecha_factura) AS fecha_factura,
MIN(COALESCE(NULLIF(LTRIM(RTRIM(f.proveedor)), ''), '-')) AS proveedor
FROM pedimento_facturas f
GROUP BY f.pedimento_id
), arch AS (
SELECT pedimento_id, COUNT(*) AS total_archivos, ISNULL(SUM(tamano_archivo), 0) AS total_tamano
FROM expediente_archivos
WHERE pedimento_id IS NOT NULL
GROUP BY pedimento_id
)
SELECT
p.id AS pedimento_id,
p.numero_pedimento,
p.patente,
p.aduana,
p.anio,
f.fecha_factura,
f.proveedor,
ISNULL(a.total_archivos, 0) AS total_archivos,
ISNULL(a.total_tamano, 0) AS total_tamano
FROM pedimentos p
LEFT JOIN fact f ON f.pedimento_id = p.id
LEFT JOIN arch a ON a.pedimento_id = p.id
WHERE p.usuario_id = ?
ORDER BY COALESCE(f.fecha_factura, p.fecha_creacion) DESC, p.id DESC
";
$stmt = sqlsrv_query($conn, $sql, [$id_importador]);
$expedientes = [];
if ($stmt) {
while ($row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC)) {
$row['pedimento_display'] = format_pedimento_display($row['anio'] ?? '', $row['aduana'] ?? '', $row['patente'] ?? '', $row['numero_pedimento'] ?? '');
$expedientes[] = $row;
}
sqlsrv_free_stmt($stmt);
}
include __DIR__ . '/../../views/expediente/index.php';
@@ -45,27 +89,50 @@ function subir($id_solicitud)
include __DIR__ . '/../../views/expediente/subir.php';
}
// Vista subir para pedimento nuevo
function subir_pedimento($pedimento_id)
{
if (!isset($_SESSION['usuario_id'])) { header('Location: /IMPORTADORES/login'); exit; }
$conn = getConnection();
// Validar propiedad del pedimento
$chk = sqlsrv_query($conn, "SELECT 1 FROM pedimentos WHERE id = ? AND usuario_id = ?", [$pedimento_id, $_SESSION['usuario_id']]);
if (!$chk || !sqlsrv_fetch($chk)) { http_response_code(403); echo "No autorizado"; exit; }
if ($chk) sqlsrv_free_stmt($chk);
$GLOBALS['pedimento_id'] = (int)$pedimento_id;
include __DIR__ . '/../../views/expediente/subir.php';
}
function subir_handler()
{
if (!isset($_POST['id_solicitud']) || !isset($_FILES['archivos']) || !isset($_SESSION['usuario_id'])) {
die("❌ Solicitud inválida.");
}
if (!isset($_FILES['archivos']) || !isset($_SESSION['usuario_id'])) { die("❌ Solicitud inválida."); }
$conn = getConnection();
ensure_expediente_schema($conn);
$id_solicitud = (int) $_POST['id_solicitud'];
$id_importador = $_SESSION['usuario_id'];
// Validar propiedad de la solicitud
$validStmt = sqlsrv_query($conn, "SELECT 1 FROM solicitud_importacion_factura WHERE id_solicitud = ? AND id_importador = ?", [$id_solicitud, $id_importador]);
if (!sqlsrv_fetch($validStmt)) {
die("❌ No tienes permisos para esta solicitud.");
$id_solicitud = isset($_POST['id_solicitud']) ? (int) $_POST['id_solicitud'] : null;
$pedimento_id = isset($_POST['pedimento_id']) ? (int) $_POST['pedimento_id'] : null;
if ($pedimento_id) {
// Validar propiedad del pedimento
$validStmt = sqlsrv_query($conn, "SELECT 1 FROM pedimentos WHERE id = ? AND usuario_id = ?", [$pedimento_id, $id_importador]);
if (!$validStmt || !sqlsrv_fetch($validStmt)) { die("❌ No tienes permisos para este pedimento."); }
if ($validStmt) sqlsrv_free_stmt($validStmt);
} elseif ($id_solicitud) {
// Validar propiedad de la solicitud (legacy)
$validStmt = sqlsrv_query($conn, "SELECT 1 FROM solicitud_importacion_factura WHERE id_solicitud = ? AND id_importador = ?", [$id_solicitud, $id_importador]);
if (!$validStmt || !sqlsrv_fetch($validStmt)) { die("❌ No tienes permisos para esta solicitud."); }
if ($validStmt) sqlsrv_free_stmt($validStmt);
} else {
die("❌ Falta identificador de pedimento.");
}
$archivos = $_FILES['archivos'];
$usuario = $_SESSION['usuario_nombre'] ?? 'sistema';
$uploadDir = __DIR__ . '/../../uploads/expedientes/' . $id_solicitud;
$folderKey = $pedimento_id ? ('pedimento_' . $pedimento_id) : ('solicitud_' . $id_solicitud);
$uploadDir = __DIR__ . '/../../uploads/expedientes/' . $folderKey;
if (!is_dir($uploadDir)) {
mkdir($uploadDir, 0775, true);
}
@@ -79,19 +146,29 @@ function subir_handler()
move_uploaded_file($archivos['tmp_name'][$i], $rutaFinal);
$rutaDb = "uploads/expedientes/$id_solicitud/$nombreSeguro";
$rutaDb = "uploads/expedientes/$folderKey/$nombreSeguro";
$tamanoKb = round(filesize($rutaFinal) / 1024, 2);
$tipoArchivo = mime_content_type($rutaFinal);
$sql = "INSERT INTO expediente_archivos
(id_solicitud, nombre_archivo, ruta_archivo, tipo_archivo, tamano_archivo, creado_por)
VALUES (?, ?, ?, ?, ?, ?)
";
$params = [$id_solicitud, $nombreOriginal, $rutaDb, $tipoArchivo, $tamanoKb, $usuario];
if ($pedimento_id) {
$sql = "INSERT INTO expediente_archivos
(pedimento_id, nombre_archivo, ruta_archivo, tipo_archivo, tamano_archivo, creado_por)
VALUES (?, ?, ?, ?, ?, ?)";
$params = [$pedimento_id, $nombreOriginal, $rutaDb, $tipoArchivo, $tamanoKb, $usuario];
} else {
$sql = "INSERT INTO expediente_archivos
(id_solicitud, nombre_archivo, ruta_archivo, tipo_archivo, tamano_archivo, creado_por)
VALUES (?, ?, ?, ?, ?, ?)";
$params = [$id_solicitud, $nombreOriginal, $rutaDb, $tipoArchivo, $tamanoKb, $usuario];
}
sqlsrv_query($conn, $sql, $params);
}
header("Location: /IMPORTADORES/expediente/ver/$id_solicitud");
if ($pedimento_id) {
header("Location: /IMPORTADORES/expediente/ver_pedimento/$pedimento_id");
} else {
header("Location: /IMPORTADORES/expediente/ver/$id_solicitud");
}
exit;
}
@@ -119,6 +196,51 @@ function ver($id_solicitud)
}
}
$GLOBALS['pedimento'] = null; // vista usa variable opcional
include __DIR__ . '/../../views/expediente/ver.php';
}
function ver_pedimento($pedimento_id)
{
if (!isset($_SESSION['usuario_id'])) {
header('Location: /IMPORTADORES/login');
exit;
}
$conn = getConnection();
ensure_expediente_schema($conn);
$id_importador = $_SESSION['usuario_id'];
// Validar propiedad
$chk = sqlsrv_query($conn, "SELECT 1 FROM pedimentos WHERE id = ? AND usuario_id = ?", [$pedimento_id, $id_importador]);
if (!$chk || !sqlsrv_fetch($chk)) { http_response_code(404); echo "No autorizado o no encontrado"; exit; }
if ($chk) sqlsrv_free_stmt($chk);
// Datos del pedimento para cabecera
$stmtPed = sqlsrv_query($conn, "SELECT id, numero_pedimento, patente, aduana, anio, clave_documento, rfc_importador, fecha_creacion FROM pedimentos WHERE id = ?", [$pedimento_id]);
$pedimento = $stmtPed ? sqlsrv_fetch_array($stmtPed, SQLSRV_FETCH_ASSOC) : null;
if ($stmtPed) sqlsrv_free_stmt($stmtPed);
if ($pedimento) {
$pedimento['pedimento_display'] = format_pedimento_display($pedimento['anio'] ?? '', $pedimento['aduana'] ?? '', $pedimento['patente'] ?? '', $pedimento['numero_pedimento'] ?? '');
}
$sql = "SELECT * FROM expediente_archivos WHERE pedimento_id = ? ORDER BY creado_en DESC";
$stmt = sqlsrv_query($conn, $sql, [$pedimento_id]);
$archivos = [];
if ($stmt) {
while ($row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC)) {
if (isset($row['creado_en']) && is_string($row['creado_en'])) {
$row['creado_en'] = new DateTime($row['creado_en']);
}
$archivos[] = $row;
}
sqlsrv_free_stmt($stmt);
}
$GLOBALS['pedimento_id'] = (int)$pedimento_id;
$GLOBALS['pedimento'] = $pedimento;
include __DIR__ . '/../../views/expediente/ver.php';
}
@@ -131,9 +253,24 @@ function ver_archivo($id_archivo)
$conn = getConnection();
$sql = "SELECT ea.*, sif.id_importador FROM expediente_archivos ea JOIN solicitud_importacion_factura sif ON sif.id_solicitud = ea.id_solicitud WHERE ea.id = ?";
$stmt = sqlsrv_query($conn, $sql, [$id_archivo]);
$archivo = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC);
ensure_expediente_schema($conn);
// Intentar resolver por pedimento (nuevo) y si no, por solicitud (legacy)
$sql = "SELECT ea.*, p.usuario_id AS id_importador
FROM expediente_archivos ea
JOIN pedimentos p ON p.id = ea.pedimento_id
WHERE ea.id = ? AND ea.pedimento_id IS NOT NULL";
$stmt = sqlsrv_query($conn, $sql, [$id_archivo]);
$archivo = $stmt ? sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC) : null;
if ($stmt) sqlsrv_free_stmt($stmt);
if (!$archivo) {
$sqlL = "SELECT ea.*, sif.id_importador
FROM expediente_archivos ea
JOIN solicitud_importacion_factura sif ON sif.id_solicitud = ea.id_solicitud
WHERE ea.id = ?";
$stmtL = sqlsrv_query($conn, $sqlL, [$id_archivo]);
$archivo = $stmtL ? sqlsrv_fetch_array($stmtL, SQLSRV_FETCH_ASSOC) : null;
if ($stmtL) sqlsrv_free_stmt($stmtL);
}
if (!$archivo || $archivo['id_importador'] != $_SESSION['usuario_id']) {
http_response_code(403);
@@ -224,4 +361,50 @@ function descargar_zip($id_solicitud)
readfile($zip_file);
unlink($zip_file);
exit;
}
function descargar_zip_pedimento($pedimento_id)
{
if (!isset($_SESSION['usuario_id'])) {
http_response_code(403);
echo "No autorizado.";
exit;
}
$conn = getConnection();
ensure_expediente_schema($conn);
$id_importador = $_SESSION['usuario_id'];
// Validar propiedad
$chk = sqlsrv_query($conn, "SELECT 1 FROM pedimentos WHERE id = ? AND usuario_id = ?", [$pedimento_id, $id_importador]);
if (!$chk || !sqlsrv_fetch($chk)) { http_response_code(404); echo "No autorizado"; exit; }
if ($chk) sqlsrv_free_stmt($chk);
$stmt = sqlsrv_query($conn, "SELECT nombre_archivo, ruta_archivo FROM expediente_archivos WHERE pedimento_id = ?", [$pedimento_id]);
if (!$stmt) { http_response_code(500); echo "Error al consultar archivos."; exit; }
$archivos = [];
while ($row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC)) {
$ruta_absoluta = __DIR__ . '/../../' . $row['ruta_archivo'];
if (file_exists($ruta_absoluta)) {
$archivos[] = [ 'ruta' => $ruta_absoluta, 'nombre' => $row['nombre_archivo'] ];
}
}
sqlsrv_free_stmt($stmt);
if (empty($archivos)) { http_response_code(404); echo "No hay archivos válidos para comprimir."; exit; }
$zip_file = tempnam(sys_get_temp_dir(), 'expediente_') . '.zip';
$zip = new ZipArchive();
if ($zip->open($zip_file, ZipArchive::CREATE) !== true) { http_response_code(500); echo "No se pudo crear el archivo ZIP."; exit; }
foreach ($archivos as $a) { $zip->addFile($a['ruta'], $a['nombre']); }
$zip->close();
header('Content-Type: application/zip');
header('Content-Disposition: attachment; filename="expediente_pedimento_' . $pedimento_id . '.zip"');
header('Content-Length: ' . filesize($zip_file));
readfile($zip_file);
unlink($zip_file);
exit;
}