+ {#each driversForCarrier as driver}
+
{driver.driver_name}
{/each}
@@ -799,19 +857,25 @@
-
+
{
- formData.transport_num = v ?? '';
+ formData.trailer_num = v ?? '';
}}
>
-
+
- {#if formData.transport_num}
- {trailers.find((t) => t.trailer_number === formData.transport_num)
- ?.plate_number || formData.transport_num}
+ {#if formData.trailer_num}
+ {trailers.find((t) => t.trailer_number === formData.trailer_num)
+ ?.plate_number || formData.trailer_num}
+ {:else if invoiceType !== 'MEX' && !formData.carrier_id}
+ Primero elige transportista...
{:else if trailers.length > 0}
Selecciona remolque...
{:else}
diff --git a/frontend/src/lib/components/dashboard/invoices/edit/save-invoice.ts b/frontend/src/lib/components/dashboard/invoices/edit/save-invoice.ts
index 8cd4db12..bb555672 100644
--- a/frontend/src/lib/components/dashboard/invoices/edit/save-invoice.ts
+++ b/frontend/src/lib/components/dashboard/invoices/edit/save-invoice.ts
@@ -1,5 +1,5 @@
import { goto } from '$app/navigation';
-import { invoicesApi, type CreateInvoiceData, type UpdateInvoiceData, type OperationType } from '$lib/api/dashboard/a76/invoices';
+import { invoicesApi, type CreateInvoiceData, type UpdateInvoiceData } from '$lib/api/dashboard/a76/invoices';
interface FormDataSet {
InvoiceTopFieldsFormData: any;
@@ -30,6 +30,28 @@ interface SaveInvoiceResult {
}>;
}
+function _logisticsStrNonempty(value: unknown): boolean {
+ return value != null && String(value).trim() !== '';
+}
+
+/** Remolque obligatorio si tipo != none (mismo criterio que validate_common). */
+function validateClientLogistics(formData: FormDataSet): SaveInvoiceResult['validationErrors'] {
+ const g = formData.generalFormData;
+ const transportType = _logisticsStrNonempty(g?.transport_type) ? String(g.transport_type).trim() : 'none';
+ if (transportType === 'none' || _logisticsStrNonempty(g?.trailer_num)) {
+ return undefined;
+ }
+ return [
+ {
+ field: 'logistics.trailer_num',
+ message:
+ 'El Remolque es obligatorio cuando el Tipo de Transporte es distinto de Ninguno.',
+ code: 'REQUIRED_FIELD',
+ value: g?.trailer_num
+ }
+ ];
+}
+
export async function saveInvoice(options: SaveInvoiceOptions): Promise {
const { invoiceId, isCreate, companyId, formData } = options;
const { InvoiceTopFieldsFormData, generalFormData, observationFormData, itemsFormData, othersFormData, continuationFormData } = formData;
@@ -66,6 +88,13 @@ export async function saveInvoice(options: SaveInvoiceOptions): Promise value !== undefined)
);
+ // Compat: remolque vivía en transport_num en layouts antiguos
+ if (filtered.trailer_num === undefined && filtered.transport_num !== undefined) {
+ filtered.trailer_num = filtered.transport_num;
+ delete filtered.transport_num;
+ }
return { ...skeleton, ...filtered };
}
@@ -274,7 +279,7 @@
transport_id: invoice.logistics?.transport_id || '',
driver_name: invoice.logistics?.driver_name || '',
transport_type: invoice.logistics?.transport_type || '',
- transport_num: invoice.logistics?.vehicle_num || '',
+ trailer_num: invoice.logistics?.trailer_num || '',
aduana: invoice.compliance_mx?.aduana || '',
document_type: invoice.document_type || ''
};
diff --git a/frontend/src/routes/dashboard/invoices/settings/+page.svelte b/frontend/src/routes/dashboard/invoices/settings/+page.svelte
index f8970eb7..df10a010 100644
--- a/frontend/src/routes/dashboard/invoices/settings/+page.svelte
+++ b/frontend/src/routes/dashboard/invoices/settings/+page.svelte
@@ -163,7 +163,7 @@
transport_id: '',
driver_name: '',
transport_type: '',
- transport_num: '',
+ trailer_num: '',
aduana: '',
document_type: '',
...(settings.generalFormData || {})
@@ -266,7 +266,7 @@
transport_id: '',
driver_name: '',
transport_type: '',
- transport_num: '',
+ trailer_num: '',
aduana: '',
document_type: ''
};