diff --git a/.gitignore b/.gitignore
index a7c93c6b..3126b165 100644
--- a/.gitignore
+++ b/.gitignore
@@ -82,3 +82,4 @@ backend/celerybeat-schedule
celerybeat-schedule
celerybeat-schedule.*
celerybeat.pid
+backend/api/v1/modules/reports/generated/
diff --git a/frontend/src/lib/api/dashboard/a76/reports/reports-transmission.ts b/frontend/src/lib/api/dashboard/a76/reports/reports-transmission.ts
index a845ed10..d9bccf67 100644
--- a/frontend/src/lib/api/dashboard/a76/reports/reports-transmission.ts
+++ b/frontend/src/lib/api/dashboard/a76/reports/reports-transmission.ts
@@ -1,247 +1,64 @@
-
-const BASE_URL = import.meta.env.VITE_API_URL || '';
+import { api } from '$lib/api';
export const reportsTransmissionApi = {
triggerGeneration: async (request: any) => {
- const endpoint = `${BASE_URL}/v1/a76/reports/exportacion/transmission/generate`;
-
- const token = localStorage.getItem('access_token');
- const response = await fetch(endpoint, {
- method: 'POST',
- headers: {
- 'Authorization': `Bearer ${token}`,
- 'Content-Type': 'application/json'
- },
- body: JSON.stringify(request)
- });
-
- if (!response.ok) {
- let errorMessage = 'Error al iniciar la generación del archivo de transmisión';
- try {
- const errorData = await response.json();
- errorMessage = errorData.detail || errorData.message || errorMessage;
- } catch (e) {
- try {
- const text = await response.text();
- if (text) errorMessage = text;
- } catch (e2) {}
- }
- throw new Error(errorMessage);
- }
- return await response.json();
+ const result = await api.post('/v1/a76/reports/exportacion/transmission/generate', request);
+ if (result.error || !result.data) throw new Error(result.error || 'Error al iniciar la generación del archivo de transmisión');
+ return result.data;
},
getTaskStatus: async (taskId: string) => {
- const endpoint = `${BASE_URL}/v1/a76/reports/exportacion/transmission/tasks/${taskId}`;
-
- const token = localStorage.getItem('access_token');
- const response = await fetch(endpoint, {
- method: 'GET',
- headers: { 'Authorization': `Bearer ${token}` }
- });
-
- if (!response.ok) {
- let errorMessage = 'Error al consultar estado de la transmisión';
- try {
- const errorData = await response.json();
- errorMessage = errorData.detail || errorData.message || errorMessage;
- } catch (e) {
- try {
- const text = await response.text();
- if (text) errorMessage = text;
- } catch (e2) {}
- }
- throw new Error(errorMessage);
- }
- return await response.json();
+ const result = await api.get(`/v1/a76/reports/exportacion/transmission/tasks/${taskId}`);
+ if (result.error || !result.data) throw new Error(result.error || 'Error al consultar estado de la transmisión');
+ return result.data;
},
triggerTemporalGeneration: async (request: any) => {
- const endpoint = `${BASE_URL}/v1/a76/reports/importacion/transmission/temporal/generate`;
-
- const token = localStorage.getItem('access_token');
- const response = await fetch(endpoint, {
- method: 'POST',
- headers: {
- 'Authorization': `Bearer ${token}`,
- 'Content-Type': 'application/json'
- },
- body: JSON.stringify(request)
- });
-
- if (!response.ok) {
- let errorMessage = 'Error al iniciar la generación temporal';
- try {
- const errorData = await response.json();
- errorMessage = errorData.detail || errorData.message || errorMessage;
- } catch (e) {
- try {
- const text = await response.text();
- if (text) errorMessage = text;
- } catch (e2) {}
- }
- throw new Error(errorMessage);
- }
- return await response.json();
+ const result = await api.post('/v1/a76/reports/importacion/transmission/temporal/generate', request);
+ if (result.error || !result.data) throw new Error(result.error || 'Error al iniciar la generación temporal');
+ return result.data;
},
getTemporalTaskStatus: async (taskId: string) => {
- const endpoint = `${BASE_URL}/v1/a76/reports/importacion/transmission/temporal/tasks/${taskId}`;
-
- const token = localStorage.getItem('access_token');
- const response = await fetch(endpoint, {
- method: 'GET',
- headers: { 'Authorization': `Bearer ${token}` }
- });
-
- if (!response.ok) {
- let errorMessage = 'Error al consultar estado de la transmisión temporal';
- try {
- const errorData = await response.json();
- errorMessage = errorData.detail || errorData.message || errorMessage;
- } catch (e) {
- try {
- const text = await response.text();
- if (text) errorMessage = text;
- } catch (e2) {}
- }
- throw new Error(errorMessage);
- }
- return await response.json();
+ const result = await api.get(`/v1/a76/reports/importacion/transmission/temporal/tasks/${taskId}`);
+ if (result.error || !result.data) throw new Error(result.error || 'Error al consultar estado de la transmisión temporal');
+ return result.data;
},
triggerDefinitiveGeneration: async (request: any) => {
- const endpoint = `${BASE_URL}/v1/a76/reports/importacion/transmission/definitive/generate`;
-
- const token = localStorage.getItem('access_token');
- const response = await fetch(endpoint, {
- method: 'POST',
- headers: {
- 'Authorization': `Bearer ${token}`,
- 'Content-Type': 'application/json'
- },
- body: JSON.stringify(request)
- });
-
- if (!response.ok) {
- let errorMessage = 'Error al iniciar la generación definitiva';
- try {
- const errorData = await response.json();
- errorMessage = errorData.detail || errorData.message || errorMessage;
- } catch (e) {
- try {
- const text = await response.text();
- if (text) errorMessage = text;
- } catch (e2) {}
- }
- throw new Error(errorMessage);
- }
- return await response.json();
+ const result = await api.post('/v1/a76/reports/importacion/transmission/definitive/generate', request);
+ if (result.error || !result.data) throw new Error(result.error || 'Error al iniciar la generación definitiva');
+ return result.data;
},
getDefinitiveTaskStatus: async (taskId: string) => {
- const endpoint = `${BASE_URL}/v1/a76/reports/importacion/transmission/definitive/tasks/${taskId}`;
-
- const token = localStorage.getItem('access_token');
- const response = await fetch(endpoint, {
- method: 'GET',
- headers: { 'Authorization': `Bearer ${token}` }
- });
-
- if (!response.ok) {
- let errorMessage = 'Error al consultar estado de la transmisión definitiva';
- try {
- const errorData = await response.json();
- errorMessage = errorData.detail || errorData.message || errorMessage;
- } catch (e) {
- try {
- const text = await response.text();
- if (text) errorMessage = text;
- } catch (e2) {}
- }
- throw new Error(errorMessage);
- }
- return await response.json();
+ const result = await api.get(`/v1/a76/reports/importacion/transmission/definitive/tasks/${taskId}`);
+ if (result.error || !result.data) throw new Error(result.error || 'Error al consultar estado de la transmisión definitiva');
+ return result.data;
},
triggerXmlRbSystemsImpoTemp: async (request: { invoice_numbers: string[]; entry_port?: string; exit_port?: string }) => {
- const endpoint = `${BASE_URL}/v1/a76/reports/xml-rb-systems/importacion-temporal/generate`;
- const token = localStorage.getItem('access_token');
- const response = await fetch(endpoint, {
- method: 'POST',
- headers: { 'Authorization': `Bearer ${token}`, 'Content-Type': 'application/json' },
- body: JSON.stringify(request)
- });
- if (!response.ok) {
- let errorMessage = 'Error al generar XML RB Systems (importación temporal)';
- try { errorMessage = (await response.json()).detail || errorMessage; } catch (e) {}
- throw new Error(errorMessage);
- }
- return await response.json();
+ const result = await api.post('/v1/a76/reports/xml-rb-systems/importacion-temporal/generate', request);
+ if (result.error || !result.data) throw new Error(result.error || 'Error al generar XML RB Systems (importación temporal)');
+ return result.data;
},
triggerXmlRbSystemsImpoDef: async (request: { invoice_numbers: string[]; entry_port?: string; exit_port?: string }) => {
- const endpoint = `${BASE_URL}/v1/a76/reports/xml-rb-systems/importacion-definitiva/generate`;
- const token = localStorage.getItem('access_token');
- const response = await fetch(endpoint, {
- method: 'POST',
- headers: { 'Authorization': `Bearer ${token}`, 'Content-Type': 'application/json' },
- body: JSON.stringify(request)
- });
- if (!response.ok) {
- let errorMessage = 'Error al generar XML RB Systems (importación definitiva)';
- try { errorMessage = (await response.json()).detail || errorMessage; } catch (e) {}
- throw new Error(errorMessage);
- }
- return await response.json();
+ const result = await api.post('/v1/a76/reports/xml-rb-systems/importacion-definitiva/generate', request);
+ if (result.error || !result.data) throw new Error(result.error || 'Error al generar XML RB Systems (importación definitiva)');
+ return result.data;
},
- triggerXmlRbSystemsImpo: async (request: { invoice_numbers: string[]; entry_port?: string; exit_port?: string }) => {
- const endpoint = `${BASE_URL}/v1/a76/reports/xml-rb-systems/importacion/generate`;
- const token = localStorage.getItem('access_token');
- const response = await fetch(endpoint, {
- method: 'POST',
- headers: { 'Authorization': `Bearer ${token}`, 'Content-Type': 'application/json' },
- body: JSON.stringify(request)
- });
- if (!response.ok) {
- let errorMessage = 'Error al generar XML RB Systems (importación)';
- try { errorMessage = (await response.json()).detail || errorMessage; } catch (e) {}
- throw new Error(errorMessage);
- }
- return await response.json();
- },
-
- triggerXmlRbSystemsExpo: async (request: { manifest_numbers: string[]; entry_port?: string; exit_port?: string; include_emanifest?: boolean }) => {
- const endpoint = `${BASE_URL}/v1/a76/reports/xml-rb-systems/exportacion/generate`;
- const token = localStorage.getItem('access_token');
- const response = await fetch(endpoint, {
- method: 'POST',
- headers: { 'Authorization': `Bearer ${token}`, 'Content-Type': 'application/json' },
- body: JSON.stringify(request)
- });
- if (!response.ok) {
- let errorMessage = 'Error al generar XML RB Systems (exportación)';
- try { errorMessage = (await response.json()).detail || errorMessage; } catch (e) {}
- throw new Error(errorMessage);
- }
- return await response.json();
+ triggerXmlRbSystemsExpo: async (request: { manifest_numbers: string[]; include_emanifest?: boolean }) => {
+ const result = await api.post('/v1/a76/reports/xml-rb-systems/exportacion/generate', request);
+ if (result.error || !result.data) throw new Error(result.error || 'Error al generar XML RB Systems (exportación)');
+ return result.data;
},
triggerXmlOptimaExpo: async (request: { manifest_numbers: string[]; consolidar_partidas?: boolean }) => {
- const endpoint = `${BASE_URL}/v1/a76/reports/xml-optima/exportacion/generate`;
- const token = localStorage.getItem('access_token');
- const response = await fetch(endpoint, {
- method: 'POST',
- headers: { 'Authorization': `Bearer ${token}`, 'Content-Type': 'application/json' },
- body: JSON.stringify(request)
- });
- if (!response.ok) {
- let errorMessage = 'Error al generar XML Optima (exportación)';
- try { errorMessage = (await response.json()).detail || errorMessage; } catch (e) {}
- throw new Error(errorMessage);
- }
- return await response.json();
+ const result = await api.post('/v1/a76/reports/xml-optima/exportacion/generate', request);
+ if (result.error || !result.data) throw new Error(result.error || 'Error al generar XML Optima (exportación)');
+ return result.data;
}
};
diff --git a/frontend/src/lib/components/dashboard/exchange_rate/exchange-rate-guard.svelte b/frontend/src/lib/components/dashboard/exchange_rate/exchange-rate-guard.svelte
index 47e19ee7..33164161 100644
--- a/frontend/src/lib/components/dashboard/exchange_rate/exchange-rate-guard.svelte
+++ b/frontend/src/lib/components/dashboard/exchange_rate/exchange-rate-guard.svelte
@@ -1,5 +1,6 @@
-