diff --git a/frontend/messages/es.json b/frontend/messages/es.json index e4b9728e..083691bc 100644 --- a/frontend/messages/es.json +++ b/frontend/messages/es.json @@ -41,11 +41,11 @@ "valuation_methods": "Metódos de valoración", "countries": "Países", "ports": "Puertos", - "unit_measures": "Unidades de medida general", - "um_customs_mex": "Unidades de medida - Aduanas Mexicanas", - "um_customs_ame": "Unidades de medida - Aduanas Americanas", - "um_ace": "Unidades de medida - ACE", - "um_oma": "Unidades de medida - OMA", + "unit_measures": "UM general", + "um_customs_mex": "UM Aduanas MX", + "um_customs_ame": "UM Aduanas USA", + "um_ace": "UM ACE", + "um_oma": "UM OMA", "conversions": "Conversiones", "equivalences": "Equivalencias", "exchange_rates": "Tipos de cambio", diff --git a/frontend/src/lib/api/dashboard/a76/general_catalogs/doda.ts b/frontend/src/lib/api/dashboard/a76/general_catalogs/doda.ts index 45d57304..d9cc41ac 100644 --- a/frontend/src/lib/api/dashboard/a76/general_catalogs/doda.ts +++ b/frontend/src/lib/api/dashboard/a76/general_catalogs/doda.ts @@ -1,6 +1,7 @@ import { api } from '$lib/api'; import type { ApiResponse } from '$lib/api'; +// --- Interfaces para detalles (Hijos) --- export interface DodaContainerSeal { id: number; @@ -28,7 +29,6 @@ export interface DodaContainerCreate { seals_detail?: DodaContainerSealCreate[]; } - export interface DodaAmericanPedimento { id: number; doda_sys_id: number; @@ -66,14 +66,13 @@ export interface DodaPedimentoCreate { authorization_patent?: string; document?: string; shipment?: string; - effective_amount_usd?: number; } +// --- Interfaces Principales (Padre) --- export interface Doda { id: number; - integration_number?: string; doda_date?: number; doda_time?: number; @@ -87,18 +86,38 @@ export interface Doda { operation_type?: string; status?: string; - + // Relaciones containers?: DodaContainer[]; american_pedimentos?: DodaAmericanPedimento[]; pedimentos_detail?: DodaPedimento[]; - + // Metadata tenant_id?: string; created_at?: string; updated_at?: string; + + // Campos extra del formulario que vimos en el frontend + selected?: boolean; + user_selected?: string; + last_user?: string; + responsible?: string; + carrier?: string; + shipments?: string; + pedimento_type?: string; + original_chain?: string; + serial_number?: string; + electronic_signature?: string; + transaction_number?: string; + linq_sat_qr?: string; + sat_certificate?: string; + sat_digital_seal?: string; + xml_doda_sent_path?: string; + xml_doda_response_path?: string; + sat_original_chain?: string; + customs_clearance?: number; + unique_badge_number?: string; } - export interface DodaCreate { integration_number?: string; doda_date?: number; @@ -143,6 +162,7 @@ export interface DodaListResponse { pages: number; } +// --- Funciones de API --- export async function getDodas( page: number = 1, @@ -177,7 +197,7 @@ export async function createDoda(data: DodaCreate, companyId: number): Promise { - const response = await api.patch(`/v1/a76/doda/${id}?company_id=${companyId}`, data); + const response = await api.put(`/v1/a76/doda/${id}?company_id=${companyId}`, data); return response.data; } diff --git a/frontend/src/lib/components/sidebar/team-switcher.svelte b/frontend/src/lib/components/sidebar/team-switcher.svelte index 6d85e6c5..c57880c1 100644 --- a/frontend/src/lib/components/sidebar/team-switcher.svelte +++ b/frontend/src/lib/components/sidebar/team-switcher.svelte @@ -9,7 +9,6 @@ const sidebar = useSidebar(); - // Ya no es necesario inicializar aquí, se inicializa en +layout.svelte con datos SSR diff --git a/frontend/src/routes/dashboard/general_catalogs/doda/edit/[[id]]/+page.svelte b/frontend/src/routes/dashboard/general_catalogs/doda/edit/[[id]]/+page.svelte index b81fc761..11e26295 100644 --- a/frontend/src/routes/dashboard/general_catalogs/doda/edit/[[id]]/+page.svelte +++ b/frontend/src/routes/dashboard/general_catalogs/doda/edit/[[id]]/+page.svelte @@ -17,7 +17,7 @@ } from '$lib/api/dashboard/a76/general_catalogs/doda'; import { ArrowLeft, LoaderCircle, Save } from 'lucide-svelte'; - // 1. Identificación reactiva de la URL + // 1. Identificación reactiva let id = $derived($page.params.id); let isEdit = $derived(!!id); let title = $derived(isEdit ? "Editar DODA" : "Nuevo DODA"); @@ -25,7 +25,6 @@ let loading = $state(false); let error = $state(null); - // 2. Función para obtener un objeto limpio function getEmptyForm(): DodaCreate { return { integration_number: '', doda_date: undefined, doda_time: undefined, @@ -42,16 +41,12 @@ }; } - // 3. Estado reactivo del formulario let formData = $state(getEmptyForm()); - // 4. Efecto de carga: Detecta cambios en el ID y trae datos $effect(() => { if (id) { - // Si hay un ID, lo cargamos loadDoda(Number(id)); } else { - // Si no hay ID, limpiamos para "Nuevo" formData = getEmptyForm(); error = null; } @@ -61,15 +56,45 @@ loading = true; try { const companyId = companyStore.activeCompany?.id; - // IMPORTANTE: Esperamos la respuesta de tu API const data = await getDoda(dodaId, companyId); - - // Reasignamos el objeto completo para forzar a Svelte 5 a actualizar la UI + if (data) { - formData = { ...getEmptyForm(), ...data }; + + formData = { + integration_number: data.integration_number || '', + doda_date: data.doda_date, + doda_time: data.doda_time, + dispatch_customs: data.dispatch_customs || '', + customs_sections: data.customs_sections || '', + patent: data.patent || '', + pedimentos: data.pedimentos || '', + caat: data.caat || '', + transport_identification: data.transport_identification || '', + fast_id: data.fast_id || '', + operation_type: data.operation_type || '', + selected: data.selected || false, + user_selected: data.user_selected || '', + last_user: data.last_user || '', + responsible: data.responsible || '', + carrier: data.carrier || '', + shipments: data.shipments || '', + pedimento_type: data.pedimento_type || '', + original_chain: data.original_chain || '', + serial_number: data.serial_number || '', + electronic_signature: data.electronic_signature || '', + transaction_number: data.transaction_number || '', + status: data.status || '', + linq_sat_qr: data.linq_sat_qr || '', + sat_certificate: data.sat_certificate || '', + sat_digital_seal: data.sat_digital_seal || '', + xml_doda_sent_path: data.xml_doda_sent_path || '', + xml_doda_response_path: data.xml_doda_response_path || '', + sat_original_chain: data.sat_original_chain || '', + customs_clearance: data.customs_clearance, + unique_badge_number: data.unique_badge_number || '' + }; } } catch (e) { - console.error(e); error = "No se pudo cargar la información del DODA"; } finally { loading = false; @@ -84,11 +109,22 @@ if (!companyId) throw new Error('Selecciona una compañía'); if (!formData.integration_number?.trim()) throw new Error('El número de integración es requerido'); + + const payload: DodaCreate = { + ...formData, + integration_number: formData.integration_number.trim(), + + doda_date: formData.doda_date || undefined, + doda_time: formData.doda_time || undefined, + customs_clearance: formData.customs_clearance || undefined + }; + if (isEdit) { - await updateDoda(Number(id), formData, companyId); + await updateDoda(Number(id), payload, companyId); } else { - await createDoda(formData, companyId); + await createDoda(payload, companyId); } + goto('/dashboard/general_catalogs/doda'); } catch (e: any) { error = e.message || 'Error al guardar'; @@ -105,7 +141,6 @@

{title}

-

Captura la información técnica del DODA.

@@ -115,129 +150,189 @@ {/if} -
{ e.preventDefault(); handleSubmit(); }} class="space-y-6"> - - - -
- -
-
- - + {#key id} + { e.preventDefault(); handleSubmit(); }} class="space-y-6"> + + + +
+ +
+
+ + +
+
+ + +
+
+
+
+ + +
+
+ + +
+
+ + +
- - -
-
-
-
- - + +
- - + +
-
- - -
-
-
- - -
- + - -
-
- - + +
+
+ + +
+
+ + +
+
+ + +
+
+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
- - + +
- - + +
-
-
-
- - -
-
- - -
-
- - -
-
- + - -
- - -
-
- -