feat: implementacion inicial descargo de peps

This commit is contained in:
2026-02-03 13:06:56 -06:00
parent d4014df5d5
commit afba0332b1
15 changed files with 701 additions and 6 deletions

View File

@@ -0,0 +1,35 @@
const BASE_URL = import.meta.env.VITE_API_URL || '';
export const avisoConsolidadoReportsApi = {
triggerPdfGeneration: async (invoiceId: number, companyId: number) => {
const params = new URLSearchParams({ company_id: companyId.toString() });
const endpoint = `${BASE_URL}/v1/a76/reports/exportacion/aviso_consolidado/${invoiceId}/download-async?${params.toString()}`;
const token = localStorage.getItem('access_token');
const response = await fetch(endpoint, {
method: 'POST',
headers: {
'Authorization': `Bearer ${token}`,
'Content-Type': 'application/json'
}
});
if (!response.ok) throw new Error('Error al iniciar la generación del Aviso Consolidado');
return await response.json();
},
getTaskStatus: async (taskId: string) => {
const endpoint = `${BASE_URL}/v1/a76/reports/exportacion/aviso_consolidado/tasks/${taskId}`;
const token = localStorage.getItem('access_token');
const response = await fetch(endpoint, {
method: 'GET',
headers: { 'Authorization': `Bearer ${token}` }
});
if (!response.ok) throw new Error('Error al consultar estado del Aviso Consolidado');
return await response.json();
}
};

View File

@@ -0,0 +1,36 @@
const BASE_URL = import.meta.env.VITE_API_URL || '';
export const dischargeReportsApi = {
triggerPdfGeneration: async (invoiceId: number, companyId: number) => {
const params = new URLSearchParams({ company_id: companyId.toString() });
// Endpoint matches routes.py
const endpoint = `${BASE_URL}/v1/a76/reports/exportacion/descargo/${invoiceId}/download-async?${params.toString()}`;
const token = localStorage.getItem('access_token');
const response = await fetch(endpoint, {
method: 'POST',
headers: {
'Authorization': `Bearer ${token}`,
'Content-Type': 'application/json'
}
});
if (!response.ok) throw new Error('Error al iniciar la generación del Reporte de Descarga');
return await response.json();
},
getTaskStatus: async (taskId: string) => {
const endpoint = `${BASE_URL}/v1/a76/reports/exportacion/descargo/tasks/${taskId}`;
const token = localStorage.getItem('access_token');
const response = await fetch(endpoint, {
method: 'GET',
headers: { 'Authorization': `Bearer ${token}` }
});
if (!response.ok) throw new Error('Error al consultar estado del Reporte de Descarga');
return await response.json();
}
};

View File

@@ -63,9 +63,9 @@
}
else if (response.state === 'FAILURE') {
hasError = true;
statusMessage = "Error al generar el PDF";
statusMessage = response.result ? `Error: ${response.result}` : "Error al generar el PDF";
stopPolling();
toast.error("Falló la generación del PDF");
toast.error("Falló la generación del PDF: " + (response.result || ""));
}
} catch (error) {
console.error("Error polling task status:", error);

View File

@@ -6,6 +6,7 @@
import { invoicesApi, type Invoice, type OperationType } from '$lib/api/dashboard/a76/invoices';
import { invoicesReportsApi } from '$lib/api/dashboard/a76/reports/reports-invoices';
import { consolidatedReportsApi } from '$lib/api/dashboard/a76/reports/reports-consolidated';
import { dischargeReportsApi } from '$lib/api/dashboard/a76/reports/reports-descargo';
import DataTable from '$lib/components/dashboard/invoices/data-table.svelte';
import { createColumns } from '$lib/components/dashboard/invoices/columns.js';
import * as Card from '$lib/components/ui/card';
@@ -15,7 +16,7 @@
import type { PageData } from './$types';
import { browser } from '$app/environment';
import { companyStore } from '$lib/stores/company.svelte';
import { Plus, RefreshCw, FileText, RotateCcw, Boxes } from 'lucide-svelte';
import { Plus, RefreshCw, FileText, RotateCcw, Boxes, ClipboardList } from 'lucide-svelte';
// IMPORTANTE: Asegúrate de tener instalada svelte-sonner para las notificaciones
import { toast } from "svelte-sonner";
@@ -376,6 +377,30 @@
}
}
async function handleDownloadDescargo(invoice: any) {
if (!companyStore.activeCompany) {
toast.error("No hay empresa seleccionada");
return;
}
try {
// 1. Trigger: Iniciar la tarea en Celery
const { task_id } = await dischargeReportsApi.triggerPdfGeneration(
invoice.id,
companyStore.activeCompany.id
);
// 2. Abrir diálogo de progreso
currentTaskId = task_id;
currentStatusFunction = dischargeReportsApi.getTaskStatus;
showProgressDialog = true;
} catch (error) {
console.error(error);
toast.error("No se pudo iniciar la descarga del reporte PEPS");
}
}
async function handleDownloadConsolidated(invoice: any) {
if (!companyStore.activeCompany) {
toast.error("No hay empresa seleccionada");
@@ -656,6 +681,10 @@
<Boxes class="h-4 w-4 mr-2" />
Consolidado
</Button>
<Button variant="outline" size="sm" onclick={() => selectedInvoice && handleDownloadDescargo(selectedInvoice)} disabled={!selectedInvoice}>
<ClipboardList class="h-4 w-4 mr-2" />
Descargo PEPS
</Button>
</div>
</div>
</div>