Preparando proyecto para migración a repositorio MVE
This commit is contained in:
@@ -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;
|
||||
}
|
||||
Reference in New Issue
Block a user