From 6c1b555f089846edef2f139f3b24c195f7888c80 Mon Sep 17 00:00:00 2001 From: AlexeerCT Date: Wed, 24 Dec 2025 14:42:23 -0600 Subject: [PATCH] feat: add pedimento fields and selection functionality to invoice forms --- .../invoices/edit/general-tab-form.svelte | 72 +++++++++++++++++-- .../invoices/edit/invoice-top-fields.svelte | 50 ++++++++++++- .../invoices/edit/[id]/+page.server.ts | 23 ++++-- .../dashboard/invoices/edit/[id]/+page.svelte | 2 + 4 files changed, 138 insertions(+), 9 deletions(-) diff --git a/frontend/src/lib/components/dashboard/invoices/edit/general-tab-form.svelte b/frontend/src/lib/components/dashboard/invoices/edit/general-tab-form.svelte index ac50af33..5f9e640d 100644 --- a/frontend/src/lib/components/dashboard/invoices/edit/general-tab-form.svelte +++ b/frontend/src/lib/components/dashboard/invoices/edit/general-tab-form.svelte @@ -1,7 +1,8 @@ - -
+
+

Datos del pedimento

+
+
+ Fecha del: +

{formData.fecha_pedimento_del || '-'}

+
+
+ Fecha al: +

{formData.fecha_pedimento_al || '-'}

+
+
+ Clave: +

{formData.clave_pedimento || '-'}

+
+
+ Régimen: +

{formData.regimen_pedimento || '-'}

+
+
+
+

Clientes - Proveedores - Agente Aduanal

-

Tipo de Moneda - Pesos Netos y Brutos

+ +
+ +
+ + +
+
+ + +
+
+ + +
+
+
+
@@ -505,6 +564,11 @@
+ +
+ + +
diff --git a/frontend/src/lib/components/dashboard/invoices/edit/invoice-top-fields.svelte b/frontend/src/lib/components/dashboard/invoices/edit/invoice-top-fields.svelte index bee69a12..8e4700a4 100644 --- a/frontend/src/lib/components/dashboard/invoices/edit/invoice-top-fields.svelte +++ b/frontend/src/lib/components/dashboard/invoices/edit/invoice-top-fields.svelte @@ -5,21 +5,41 @@ import { Switch } from '$lib/components/ui/switch'; import type { Invoice } from '$lib/api/dashboard/a76/invoices'; import type { InvoiceType } from '$lib/api/dashboard/refrence_data/invoice_types'; + import type { Pedimento } from '$lib/api/dashboard/a76/pedimentos'; let { invoice, formData = $bindable(), invoiceTypes = [], + pedimentos = [], defaultOperationType = undefined, defaultInvoiceType = undefined, }: { invoice: Invoice | null; formData?: any; invoiceTypes?: InvoiceType[]; + pedimentos?: Pedimento[]; defaultOperationType?: number | null; defaultInvoiceType?: string | null; } = $props(); + function handlePedimentoChange(pedimentoId: string) { + if (!pedimentoId) return; + + const selectedPedimento = pedimentos.find(p => p.id === parseInt(pedimentoId)); + if (!selectedPedimento) return; + + // Actualizar los campos del pedimento en formData + formData.fecha_pedimento_del = selectedPedimento.pedimento_dates?.start_date || ''; + formData.fecha_pedimento_al = selectedPedimento.pedimento_dates?.end_date || ''; + formData.clave_pedimento = selectedPedimento.pedimento_code || ''; + formData.regimen_pedimento = selectedPedimento.regime || ''; + + // Construir el número de pedimento completo + const pedimentoNumber = `${selectedPedimento.year || ''}-${selectedPedimento.customs_office || ''}-${selectedPedimento.license || ''}-${selectedPedimento.pedimento_number || ''}`.replace(/^-+|-+$/g, ''); + formData.pedimento = pedimentoNumber; + } + if (!formData) { let operationType: number | null = null; if (invoice?.operation_type) { @@ -30,6 +50,7 @@ formData = { is_pedimento_pending: false, + pedimento_id: null, pedimento: invoice?.compliance_mx?.pedimento || '', remesa: invoice?.compliance_mx?.remesa || '', invoice_number: invoice?.invoice_number || '', @@ -37,6 +58,11 @@ emission_date: '', operation_type: operationType, invoice_type: invoice?.invoice_type || (defaultInvoiceType ?? ''), + // Campos del pedimento (se llenarán al seleccionar un pedimento) + fecha_pedimento_del: '', + fecha_pedimento_al: '', + clave_pedimento: '', + regimen_pedimento: '', }; } @@ -103,7 +129,29 @@
- + { + formData.pedimento_id = v ? parseInt(v) : null; + if (v) { + handlePedimentoChange(v); + } + }} + > + + + {formData.pedimento || 'Selecciona pedimento...'} + + + + {#each pedimentos as pedimento} + + {pedimento.year}-{pedimento.customs_office}-{pedimento.license}-{pedimento.pedimento_number} + + {/each} + +
diff --git a/frontend/src/routes/dashboard/invoices/edit/[id]/+page.server.ts b/frontend/src/routes/dashboard/invoices/edit/[id]/+page.server.ts index ffb19ce8..11d7de3a 100644 --- a/frontend/src/routes/dashboard/invoices/edit/[id]/+page.server.ts +++ b/frontend/src/routes/dashboard/invoices/edit/[id]/+page.server.ts @@ -95,6 +95,13 @@ export const load: PageServerLoad = async ({ params, cookies, fetch, url }) => { fetch ); + const pedimentosPromise = authenticatedFetch( + `v1/a76/pedimentos?company_id=${companyId}&page=1&page_size=100`, + {}, + cookies, + fetch + ); + // Si el ID es "new", es una creación if (params.id === 'new') { const [ @@ -106,7 +113,8 @@ export const load: PageServerLoad = async ({ params, cookies, fetch, url }) => { transportTypesResponse, sealsResponse, incotermsResponse, - enclosureResponse + enclosureResponse, + pedimentosResponse ] = await Promise.all([ invoiceTypesPromise, customsBrokersPromise, @@ -116,7 +124,8 @@ export const load: PageServerLoad = async ({ params, cookies, fetch, url }) => { transportTypesPromise, sealsPromise, incotermsPromise, - enclosurePromise + enclosurePromise, + pedimentosPromise ]); const invoiceTypes = invoiceTypesResponse.ok ? await invoiceTypesResponse.json() : { items: [] }; @@ -128,6 +137,7 @@ export const load: PageServerLoad = async ({ params, cookies, fetch, url }) => { const seals = sealsResponse.ok ? await sealsResponse.json() : { items: [] }; const incoterms = incotermsResponse.ok ? await incotermsResponse.json() : { items: [] }; const enclosure = enclosureResponse.ok ? await enclosureResponse.json() : { items: [] }; + const pedimentos = pedimentosResponse.ok ? await pedimentosResponse.json() : { items: [] }; return { invoice: null, @@ -142,6 +152,7 @@ export const load: PageServerLoad = async ({ params, cookies, fetch, url }) => { seals: seals.items || [], incoterms: incoterms.items || [], enclosure: enclosure.items || [], + pedimentos: pedimentos.items || [], // Filtros desde query parameters para preselección filters: { operation_type: parsedOperationType, @@ -180,7 +191,8 @@ export const load: PageServerLoad = async ({ params, cookies, fetch, url }) => { transportTypesResponse, sealsResponse, incotermsResponse, - enclosureResponse + enclosureResponse, + pedimentosResponse ] = await Promise.all([ invoiceTypesPromise, customsBrokersPromise, @@ -190,7 +202,8 @@ export const load: PageServerLoad = async ({ params, cookies, fetch, url }) => { transportTypesPromise, sealsPromise, incotermsPromise, - enclosurePromise + enclosurePromise, + pedimentosPromise ]); const invoiceTypes = invoiceTypesResponse.ok ? await invoiceTypesResponse.json() : { items: [] }; @@ -202,6 +215,7 @@ export const load: PageServerLoad = async ({ params, cookies, fetch, url }) => { const seals = sealsResponse.ok ? await sealsResponse.json() : { items: [] }; const incoterms = incotermsResponse.ok ? await incotermsResponse.json() : { items: [] }; const enclosure = enclosureResponse.ok ? await enclosureResponse.json() : { items: [] }; + const pedimentos = pedimentosResponse.ok ? await pedimentosResponse.json() : { items: [] }; return { invoice, @@ -216,6 +230,7 @@ export const load: PageServerLoad = async ({ params, cookies, fetch, url }) => { seals: seals.items || [], incoterms: incoterms.items || [], enclosure: enclosure.items || [], + pedimentos: pedimentos.items || [], // Filtros desde query parameters para preselección filters: { operation_type: parsedOperationType, diff --git a/frontend/src/routes/dashboard/invoices/edit/[id]/+page.svelte b/frontend/src/routes/dashboard/invoices/edit/[id]/+page.svelte index 5d0cf1a8..3bc2c203 100644 --- a/frontend/src/routes/dashboard/invoices/edit/[id]/+page.svelte +++ b/frontend/src/routes/dashboard/invoices/edit/[id]/+page.svelte @@ -57,6 +57,7 @@ operation_type?: number | null; invoice_type?: string | null; }; + pedimentos?: any[]; } let { data }: { data: ExtendedPageData } = $props(); @@ -573,6 +574,7 @@ invoice={data.invoice} bind:formData={generalFormData} invoiceTypes={data.invoiceTypes || []} + pedimentos={data.pedimentos || []} defaultOperationType={data.filters?.operation_type ?? undefined} defaultInvoiceType={data.filters?.invoice_type ?? undefined} />