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

170
app/controllers/cove.php Normal file
View File

@@ -0,0 +1,170 @@
<?php
require_once __DIR__ . '/../../config/database.php';
require_once __DIR__ . '/../helpers/session.php';
/**
* GET /IMPORTADORES/cove/ajax_estado_facturas?pedimento_id=123
* Devuelve estado de COVE por factura del pedimento actual del usuario.
*/
function ajax_estado_facturas()
{
if (!($_SESSION['usuario_id'] ?? false)) {
http_response_code(403);
echo json_encode(['success' => false, 'message' => 'No autorizado']);
exit;
}
$usuario_id = (int)$_SESSION['usuario_id'];
$pedimento_id = isset($_GET['pedimento_id']) ? (int)$_GET['pedimento_id'] : 0;
if ($pedimento_id <= 0) {
http_response_code(400);
echo json_encode(['success' => false, 'message' => 'ID inválido']);
exit;
}
$conn = getConnection();
// Verificar propiedad del pedimento
$chk = sqlsrv_query($conn, "SELECT 1 FROM pedimentos WHERE id = ? AND usuario_id = ?", [$pedimento_id, $usuario_id]);
$own = $chk && sqlsrv_fetch_array($chk) ? true : false;
if ($chk) sqlsrv_free_stmt($chk);
if (!$own) {
http_response_code(404);
echo json_encode(['success' => false, 'message' => 'Pedimento no encontrado']);
exit;
}
$sql = "SELECT f.id AS factura_id,
CASE WHEN cr.id IS NULL THEN 0 ELSE 1 END AS respondido,
cr.estado AS estado,
cr.fecha_actualizacion AS fecha
FROM pedimento_facturas f
LEFT JOIN cove_respuestas cr
ON cr.factura_id = f.id AND cr.usuario_id = ?
WHERE f.pedimento_id = ?
ORDER BY f.id";
$stmt = sqlsrv_query($conn, $sql, [$usuario_id, $pedimento_id]);
if ($stmt === false) {
http_response_code(500);
echo json_encode(['success' => false, 'message' => 'Error de base de datos']);
exit;
}
$data = [];
while ($r = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC)) {
if (isset($r['fecha']) && $r['fecha'] instanceof DateTime) {
$r['fecha'] = $r['fecha']->format('Y-m-d H:i:s');
}
$data[] = $r;
}
sqlsrv_free_stmt($stmt);
echo json_encode(['success' => true, 'data' => $data]);
exit;
}
/**
* POST /IMPORTADORES/cove/ajax_guardar_respuestas
* Guarda/actualiza respuestas de COVE para una factura concreta.
* Body: pedimento_id, factura_id, respuestas (JSON string), estado (opcional)
*/
function ajax_guardar_respuestas()
{
if (!($_SESSION['usuario_id'] ?? false)) {
http_response_code(403);
echo json_encode(['success' => false, 'message' => 'No autorizado']);
exit;
}
$usuario_id = (int)$_SESSION['usuario_id'];
$pedimento_id = isset($_POST['pedimento_id']) ? (int)$_POST['pedimento_id'] : 0;
$factura_id = isset($_POST['factura_id']) ? (int)$_POST['factura_id'] : 0;
$respuestas = $_POST['respuestas'] ?? '{}';
$estado = $_POST['estado'] ?? 'respondido';
if ($pedimento_id <= 0 || $factura_id <= 0) {
http_response_code(400);
echo json_encode(['success' => false, 'message' => 'Parámetros inválidos']);
exit;
}
$conn = getConnection();
// Verificar propiedad del pedimento
$chk = sqlsrv_query($conn, "SELECT 1 FROM pedimentos WHERE id = ? AND usuario_id = ?", [$pedimento_id, $usuario_id]);
$own = $chk && sqlsrv_fetch_array($chk) ? true : false;
if ($chk) sqlsrv_free_stmt($chk);
if (!$own) {
http_response_code(404);
echo json_encode(['success' => false, 'message' => 'Pedimento no encontrado']);
exit;
}
// Upsert manual: si existe update, si no insert
$sel = sqlsrv_query($conn, "SELECT id FROM cove_respuestas WHERE factura_id = ? AND usuario_id = ?", [$factura_id, $usuario_id]);
$row = $sel ? sqlsrv_fetch_array($sel, SQLSRV_FETCH_ASSOC) : null;
if ($sel) sqlsrv_free_stmt($sel);
if ($row) {
$sql = "UPDATE cove_respuestas
SET respuestas = ?, estado = ?, fecha_actualizacion = SYSDATETIME()
WHERE id = ?";
$stmt = sqlsrv_query($conn, $sql, [$respuestas, $estado, $row['id']]);
} else {
$sql = "INSERT INTO cove_respuestas (pedimento_id, factura_id, usuario_id, respuestas, estado, fecha_creacion)
VALUES (?, ?, ?, ?, ?, SYSDATETIME())";
$stmt = sqlsrv_query($conn, $sql, [$pedimento_id, $factura_id, $usuario_id, $respuestas, $estado]);
}
if ($stmt === false) {
http_response_code(500);
echo json_encode(['success' => false, 'message' => 'No se pudieron guardar las respuestas']);
exit;
}
echo json_encode(['success' => true]);
exit;
}
// Estado agregado por pedimento: total de facturas vs respondidas/solicitadas
function ajax_estado_pedimentos()
{
if (!($_SESSION['usuario_id'] ?? false)) {
http_response_code(403);
echo json_encode(['success' => false, 'message' => 'No autorizado']);
exit;
}
$usuario_id = (int)$_SESSION['usuario_id'];
$conn = getConnection();
$sql = "
SELECT p.id AS pedimento_id,
COUNT(f.id) AS total_facturas,
SUM(CASE WHEN cr.estado IN ('respondido','solicitado') THEN 1 ELSE 0 END) AS respondidas
FROM pedimentos p
LEFT JOIN pedimento_facturas f ON f.pedimento_id = p.id
LEFT JOIN cove_respuestas cr ON cr.factura_id = f.id AND cr.usuario_id = p.usuario_id
WHERE p.usuario_id = ?
GROUP BY p.id
";
$stmt = sqlsrv_query($conn, $sql, [$usuario_id]);
if ($stmt === false) {
http_response_code(500);
echo json_encode(['success' => false, 'message' => 'Error de base de datos']);
exit;
}
$data = [];
while ($r = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC)) {
$total = (int)($r['total_facturas'] ?? 0);
$resp = (int)($r['respondidas'] ?? 0);
$completo = ($total > 0 && $resp >= $total) ? 1 : 0;
$data[] = [
'pedimento_id' => (int)$r['pedimento_id'],
'total_facturas' => $total,
'respondidas' => $resp,
'completo' => $completo
];
}
sqlsrv_free_stmt($stmt);
echo json_encode(['success' => true, 'data' => $data]);
exit;
}