Merge branch 'feature/pedimentos2' into development

This commit is contained in:
2025-11-18 16:27:57 -06:00
2 changed files with 113 additions and 134 deletions

View File

@@ -4,6 +4,29 @@
*/
import { api } from '$lib/api';
// Sub-resource interfaces
export interface PedimentoDates {
entry_date?: string | null;
pedimento_date?: string | null;
payment_date?: string | null;
}
export interface PedimentoPayments {
payment_form?: string | null;
bank_identifier?: string | null;
}
export interface PedimentoTransportMeans {
arrival_key?: string | null;
arrival_data?: string | null;
departure_key?: string | null;
departure_data?: string | null;
}
export interface PedimentoValidation {
document?: string | null;
}
export interface Pedimento {
id: number;
tenant_id: number;
@@ -22,6 +45,11 @@ export interface Pedimento {
gross_weight?: number | null;
exchange_rate?: number | null;
created_at: string;
// Sub-resources
pedimento_dates?: PedimentoDates | null;
pedimento_payments?: PedimentoPayments | null;
pedimento_transport_means?: PedimentoTransportMeans | null;
pedimento_validation?: PedimentoValidation | null;
}
export interface PedimentoListResponse {
@@ -46,6 +74,11 @@ export interface CreatePedimentoData {
paid_price?: number | null;
gross_weight?: number | null;
exchange_rate?: number | null;
// Sub-resources
pedimento_dates?: PedimentoDates | null;
pedimento_payments?: PedimentoPayments | null;
pedimento_transport_means?: PedimentoTransportMeans | null;
pedimento_validation?: PedimentoValidation | null;
}
export interface UpdatePedimentoData {
@@ -63,6 +96,11 @@ export interface UpdatePedimentoData {
paid_price?: number | null;
gross_weight?: number | null;
exchange_rate?: number | null;
// Sub-resources
pedimento_dates?: PedimentoDates | null;
pedimento_payments?: PedimentoPayments | null;
pedimento_transport_means?: PedimentoTransportMeans | null;
pedimento_validation?: PedimentoValidation | null;
}
export interface PedimentoFilters {

View File

@@ -16,12 +16,8 @@
import TransportTabForm from '$lib/components/dashboard/pedimentos/edit/transport-tab-form.svelte';
import ValidationTabForm from '$lib/components/dashboard/pedimentos/edit/validation-tab-form.svelte';
// Importar las APIs
// Importar solo la API de pedimentos
import { pedimentosApi, type CreatePedimentoData, type UpdatePedimentoData } from '$lib/api/dashboard/a76/pedimentos';
import { pedimentoDatesApi, type UpdatePedimentoDatesData, type CreatePedimentoDatesData } from '$lib/api/dashboard/a76/pedimento-dates';
import { pedimentoPaymentsApi, type UpdatePedimentoPaymentsData, type CreatePedimentoPaymentsData } from '$lib/api/dashboard/a76/pedimento-payments';
import { pedimentoTransportApi, type UpdatePedimentoTransportMeansData, type CreatePedimentoTransportMeansData } from '$lib/api/dashboard/a76/pedimento-transport';
import { pedimentoValidationApi, type UpdatePedimentoValidationData, type CreatePedimentoValidationData } from '$lib/api/dashboard/a76/pedimento-validation';
let { data }: { data: PageData } = $props();
@@ -30,7 +26,7 @@
let error = $state<string | null>(null);
let success = $state(false);
// ID del pedimento - se usa para crear sub-recursos después de crear el pedimento
// ID del pedimento
let pedimentoId = $state<number | null>(data.pedimentoId);
// Referencias a los componentes de formulario para obtener sus datos
@@ -40,7 +36,7 @@
let transportFormData = $state<any>(null);
let validationFormData = $state<any>(null);
// Estados para saber si existen datos previos
// Estados para saber si existen datos previos (para compatibilidad con componentes hijos)
let datesExists = $state(false);
let paymentsExists = $state(false);
let transportExists = $state(false);
@@ -70,152 +66,97 @@
success = false;
try {
let pedimentoId = data.pedimentoId;
// Validar campos requeridos para creación
if (data.isCreate && generalFormData) {
const requiredFields = {
year: 'Año',
customs_office: 'Aduana',
license: 'Patente',
pedimento_number: 'Número de Pedimento',
client_id: 'ID del Cliente',
operation_type: 'Tipo de Operación',
pedimento_type: 'Tipo de Pedimento',
regime: 'Régimen',
status: 'Estado'
};
// 1. Crear o actualizar datos generales
if (generalFormData) {
// Validar campos requeridos para creación
if (data.isCreate) {
const requiredFields = {
year: 'Año',
customs_office: 'Aduana',
license: 'Patente',
pedimento_number: 'Número de Pedimento',
client_id: 'ID del Cliente',
operation_type: 'Tipo de Operación',
pedimento_type: 'Tipo de Pedimento',
regime: 'Régimen',
status: 'Estado'
};
const missingFields: string[] = [];
for (const [field, label] of Object.entries(requiredFields)) {
const value = (generalFormData as any)[field];
if (value === null || value === undefined || value === '') {
missingFields.push(label);
}
}
if (missingFields.length > 0) {
throw new Error(`Los siguientes campos son obligatorios: ${missingFields.join(', ')}`);
const missingFields: string[] = [];
for (const [field, label] of Object.entries(requiredFields)) {
const value = (generalFormData as any)[field];
if (value === null || value === undefined || value === '') {
missingFields.push(label);
}
}
const payload: any = {
year: generalFormData.year || undefined,
customs_office: generalFormData.customs_office || undefined,
license: generalFormData.license || undefined,
pedimento_number: generalFormData.pedimento_number || undefined,
client_id: generalFormData.client_id || undefined,
operation_type: generalFormData.operation_type || undefined,
pedimento_type: generalFormData.pedimento_type || undefined,
pedimento_code: generalFormData.pedimento_code || undefined,
regime: generalFormData.regime || undefined,
status: generalFormData.status || undefined,
usd_value: generalFormData.usd_value || undefined,
paid_price: generalFormData.paid_price || undefined,
gross_weight: generalFormData.gross_weight || undefined,
exchange_rate: generalFormData.exchange_rate || undefined
};
// Eliminar campos undefined para no enviarlos
Object.keys(payload).forEach(key => {
if (payload[key] === undefined) {
delete payload[key];
}
});
if (data.isCreate) {
// Crear nuevo pedimento
const response = await pedimentosApi.create(payload);
if (response.error) {
// Intentar extraer mensaje de error más específico
const errorMsg = typeof response.error === 'string' ? response.error : 'Error al crear el pedimento';
throw new Error(errorMsg);
}
if (!response.data?.id) throw new Error('No se recibió el ID del pedimento creado');
pedimentoId = response.data.id;
} else {
// Actualizar pedimento existente
const response = await pedimentosApi.update(pedimentoId!, payload);
if (response.error) throw new Error(response.error);
if (missingFields.length > 0) {
throw new Error(`Los siguientes campos son obligatorios: ${missingFields.join(', ')}`);
}
}
// 2. Guardar fechas
if (datesFormData && (datesFormData.entry_date || datesFormData.pedimento_date || datesFormData.payment_date)) {
const payload = {
// Construir el payload unificado
const payload: CreatePedimentoData | UpdatePedimentoData = {
// Datos generales
year: generalFormData?.year || undefined,
customs_office: generalFormData?.customs_office || undefined,
license: generalFormData?.license || undefined,
pedimento_number: generalFormData?.pedimento_number || undefined,
client_id: generalFormData?.client_id || undefined,
operation_type: generalFormData?.operation_type || undefined,
pedimento_type: generalFormData?.pedimento_type || undefined,
pedimento_code: generalFormData?.pedimento_code || undefined,
regime: generalFormData?.regime || undefined,
status: generalFormData?.status || undefined,
usd_value: generalFormData?.usd_value || undefined,
paid_price: generalFormData?.paid_price || undefined,
gross_weight: generalFormData?.gross_weight || undefined,
exchange_rate: generalFormData?.exchange_rate || undefined,
// Sub-recursos
pedimento_dates: (datesFormData?.entry_date || datesFormData?.pedimento_date || datesFormData?.payment_date) ? {
entry_date: datesFormData.entry_date || null,
pedimento_date: datesFormData.pedimento_date || null,
payment_date: datesFormData.payment_date || null
};
if (datesExists && !data.isCreate) {
const response = await pedimentoDatesApi.update(pedimentoId!, payload as UpdatePedimentoDatesData);
if (response.error && response.status !== 404) throw new Error(response.error);
} else {
const response = await pedimentoDatesApi.create(pedimentoId!, payload as CreatePedimentoDatesData);
if (response.error) throw new Error(response.error);
datesExists = true;
}
}
// 3. Guardar pagos
if (paymentsFormData && (paymentsFormData.payment_form || paymentsFormData.bank_identifier)) {
const payload = {
} : undefined,
pedimento_payments: (paymentsFormData?.payment_form || paymentsFormData?.bank_identifier) ? {
payment_form: paymentsFormData.payment_form || null,
bank_identifier: paymentsFormData.bank_identifier || null
};
if (paymentsExists && !data.isCreate) {
const response = await pedimentoPaymentsApi.update(pedimentoId!, payload as UpdatePedimentoPaymentsData);
if (response.error && response.status !== 404) throw new Error(response.error);
} else {
const response = await pedimentoPaymentsApi.create(pedimentoId!, payload as CreatePedimentoPaymentsData);
if (response.error) throw new Error(response.error);
paymentsExists = true;
}
}
// 4. Guardar transporte
if (transportFormData && (transportFormData.arrival_key || transportFormData.arrival_data || transportFormData.departure_key || transportFormData.departure_data)) {
const payload = {
} : undefined,
pedimento_transport_means: (transportFormData?.arrival_key || transportFormData?.arrival_data || transportFormData?.departure_key || transportFormData?.departure_data) ? {
arrival_key: transportFormData.arrival_key || null,
arrival_data: transportFormData.arrival_data || null,
departure_key: transportFormData.departure_key || null,
departure_data: transportFormData.departure_data || null
};
if (transportExists && !data.isCreate) {
const response = await pedimentoTransportApi.update(pedimentoId!, payload as UpdatePedimentoTransportMeansData);
if (response.error && response.status !== 404) throw new Error(response.error);
} else {
const response = await pedimentoTransportApi.create(pedimentoId!, payload as CreatePedimentoTransportMeansData);
if (response.error) throw new Error(response.error);
transportExists = true;
}
}
// 5. Guardar validación
if (validationFormData && validationFormData.document) {
const payload = {
} : undefined,
pedimento_validation: validationFormData?.document ? {
document: validationFormData.document || null
};
if (validationExists && !data.isCreate) {
const response = await pedimentoValidationApi.update(pedimentoId!, payload as UpdatePedimentoValidationData);
if (response.error && response.status !== 404) throw new Error(response.error);
} else {
const response = await pedimentoValidationApi.create(pedimentoId!, payload as CreatePedimentoValidationData);
if (response.error) throw new Error(response.error);
validationExists = true;
}
}
} : undefined
};
// Si fue una creación, redirigir a la página de edición
if (data.isCreate && pedimentoId) {
await goto(`/dashboard/pedimentos/edit/${pedimentoId}`);
// Eliminar campos undefined para no enviarlos
Object.keys(payload).forEach(key => {
if (payload[key as keyof typeof payload] === undefined) {
delete payload[key as keyof typeof payload];
}
});
let newPedimentoId = pedimentoId;
if (data.isCreate) {
// Crear nuevo pedimento con todos sus sub-recursos
const response = await pedimentosApi.create(payload as CreatePedimentoData);
if (response.error) {
const errorMsg = typeof response.error === 'string' ? response.error : 'Error al crear el pedimento';
throw new Error(errorMsg);
}
if (!response.data?.id) throw new Error('No se recibió el ID del pedimento creado');
newPedimentoId = response.data.id;
// Redirigir a la página de edición
await goto(`/dashboard/pedimentos/edit/${newPedimentoId}`);
return;
} else {
// Actualizar pedimento existente con todos sus sub-recursos
const response = await pedimentosApi.update(pedimentoId!, payload as UpdatePedimentoData);
if (response.error) throw new Error(response.error);
}
success = true;