diff --git a/frontend/src/lib/api/dashboard/a76/general_catalogs/ports.ts b/frontend/src/lib/api/dashboard/a76/general_catalogs/ports.ts index d397e245..fe2caaba 100644 --- a/frontend/src/lib/api/dashboard/a76/general_catalogs/ports.ts +++ b/frontend/src/lib/api/dashboard/a76/general_catalogs/ports.ts @@ -57,7 +57,7 @@ class PortsApi { const queryParams = new URLSearchParams({ company_id: companyId.toString() }); - return api.get(`${this.baseUrl}/${id}/?${queryParams.toString()}`); + return api.get(`${this.baseUrl}/${id}?${queryParams.toString()}`); } async create(data: PortCreate, companyId: string | number): Promise> { @@ -78,7 +78,7 @@ class PortsApi { const queryParams = new URLSearchParams({ company_id: companyId.toString() }); - return api.delete(`${this.baseUrl}/${id}/?${queryParams.toString()}`); + return api.delete(`${this.baseUrl}/${id}?${queryParams.toString()}`); } } diff --git a/frontend/src/lib/components/dashboard/goods/classes/forms/FixedAssetClassForm.svelte b/frontend/src/lib/components/dashboard/goods/classes/forms/FixedAssetClassForm.svelte index 5ebda988..3e48edfc 100644 --- a/frontend/src/lib/components/dashboard/goods/classes/forms/FixedAssetClassForm.svelte +++ b/frontend/src/lib/components/dashboard/goods/classes/forms/FixedAssetClassForm.svelte @@ -5,12 +5,27 @@ import * as Dialog from '$lib/components/ui/dialog'; import { Folder } from 'lucide-svelte'; import { toast } from 'svelte-sonner'; - import { materialTypesApi, type MaterialType } from '$lib/api/dashboard/reference_data/material_types'; + import { + materialTypesApi, + type MaterialType + } from '$lib/api/dashboard/reference_data/material_types'; import { unitsOfMeasureApi } from '$lib/api/dashboard/a76/units_of_measure'; - import { getTariffFractions, type TariffFraction } from '$lib/api/dashboard/a76/general_catalogs/tariff-fractions'; - import { getUSTariffFractions, type USTariffFraction } from '$lib/api/dashboard/a76/general_catalogs/us-tariff-fractions'; - import { getDepreciationCatalog, type DepreciationCatalog } from '$lib/api/dashboard/a76/general_catalogs/depreciation-catalog'; - import { getFDACatalog, type FDACatalog } from '$lib/api/dashboard/a76/general_catalogs/fda-catalog'; + import { + getTariffFractions, + type TariffFraction + } from '$lib/api/dashboard/a76/general_catalogs/tariff-fractions'; + import { + getUSTariffFractions, + type USTariffFraction + } from '$lib/api/dashboard/a76/general_catalogs/us-tariff-fractions'; + import { + getDepreciationCatalog, + type DepreciationCatalog + } from '$lib/api/dashboard/a76/general_catalogs/depreciation-catalog'; + import { + getFDACatalog, + type FDACatalog + } from '$lib/api/dashboard/a76/general_catalogs/fda-catalog'; import { companyStore } from '$lib/stores/company.svelte'; interface Props { @@ -72,7 +87,7 @@ if (initialData) { // Tomar snapshot para evitar referencias reactivas const snap = $state.snapshot(initialData); - + // Usar ?? para manejar null/undefined correctamente (evita que inputs pasen de controlado a no controlado) formData.class_code = snap.class_code ?? ''; formData.description_es = snap.description_es ?? ''; @@ -82,7 +97,8 @@ formData.fraction = snap.fraction ?? ''; formData.us_fraction = snap.us_fraction ?? ''; // Mapear depreciation_rate a annual_depreciation_rate si existe (números pueden ser null) - formData.annual_depreciation_rate = snap.depreciation_rate ?? snap.annual_depreciation_rate ?? null; + formData.annual_depreciation_rate = + snap.depreciation_rate ?? snap.annual_depreciation_rate ?? null; // Mapear fda_code a fda_key si existe formData.fda_key = snap.fda_code ?? snap.fda_key ?? ''; formData.eccn_code = snap.eccn_code ?? ''; @@ -92,7 +108,7 @@ formData.import_tariff_code = snap.import_tariff_code ?? ''; formData.import_tariff_type = snap.import_tariff_type ?? ''; formData.export_tariff_code = snap.export_tariff_code ?? ''; - formData.export_tariff_type = snap.export_tariff_type ?? ''; + formData.export_tariff_type = snap.export_tariff_type ?? ''; } else { // Reset form when initialData is null (new class) formData.class_code = ''; @@ -111,7 +127,7 @@ formData.import_tariff_code = ''; formData.import_tariff_type = ''; formData.export_tariff_code = ''; - formData.export_tariff_type = ''; + formData.export_tariff_type = ''; } }); @@ -193,7 +209,7 @@ if (!companyId) return; const response = await unitsOfMeasureApi.list(companyId, 1, 100); if (response.data) { - unitsOfMeasureData = response.data.items.map(item => ({ + unitsOfMeasureData = response.data.items.map((item) => ({ code: item.code, description: item.description || '', descriptionEnglish: item.description_en || '', @@ -264,16 +280,16 @@ try { const filters = search ? { search } : {}; const pageSize = 100; - + const response = await getTariffFractions(page, pageSize, companyId, filters); - + if (response.data) { if (page === 1) { tariffFractions = [...response.data.items]; } else { tariffFractions = [...tariffFractions, ...response.data.items]; } - + totalFractions = response.data.total; currentPage = page; hasMoreFractions = tariffFractions.length < response.data.total; @@ -314,16 +330,16 @@ try { const filters = search ? { search } : {}; const pageSize = 100; - + const response = await getUSTariffFractions(page, pageSize, companyId, filters); - + if (response.data) { if (page === 1) { usTariffFractions = [...response.data.items]; } else { usTariffFractions = [...usTariffFractions, ...response.data.items]; } - + totalUSFractions = response.data.total; currentUSPage = page; hasMoreUSFractions = usTariffFractions.length < response.data.total; @@ -364,16 +380,16 @@ try { const filters = search ? { search } : {}; const pageSize = 100; - + const response = await getDepreciationCatalog(page, pageSize, companyId, filters); - + if (response.data) { if (page === 1) { depreciationCatalog = [...response.data.items]; } else { depreciationCatalog = [...depreciationCatalog, ...response.data.items]; } - + totalDepreciation = response.data.total; currentDepreciationPage = page; hasMoreDepreciation = depreciationCatalog.length < response.data.total; @@ -409,16 +425,16 @@ try { const filters = search ? { search } : {}; const pageSize = 100; - + const response = await getFDACatalog(page, pageSize, companyId, filters); - + if (response.data) { if (page === 1) { fdaCatalog = [...response.data.items]; } else { fdaCatalog = [...fdaCatalog, ...response.data.items]; } - + totalFDA = response.data.total; currentFDAPage = page; hasMoreFDA = fdaCatalog.length < response.data.total; @@ -444,27 +460,27 @@ // Función de validación function validateForm(): boolean { const errors: Record = {}; - + if (!formData.class_code?.trim()) { errors.class_code = 'El código de clase es obligatorio'; } - + if (!formData.description_es?.trim()) { errors.description_es = 'La descripción en español es obligatoria'; } - + if (!formData.material_key?.trim()) { errors.material_key = 'El tipo de activo fijo es obligatorio'; } - + if (!formData.unit_of_measure?.trim()) { errors.unit_of_measure = 'La unidad de medida comercial es obligatoria'; } - + if (!formData.fraction?.trim()) { errors.fraction = 'La fracción arancelaria es obligatoria'; } - + validationErrors = errors; return Object.keys(errors).length === 0; } @@ -472,9 +488,9 @@ // Validar campo individual (para validación en blur) function validateField(fieldName: string) { if (!showErrors) return; // Solo validar si ya se intentó guardar - + const errors = { ...validationErrors }; - + switch (fieldName) { case 'class_code': if (!formData.class_code?.trim()) { @@ -512,29 +528,29 @@ } break; } - + validationErrors = errors; } function handleSave() { // Activar visualización de errores showErrors = true; - + // Validar formulario - if (!validateForm()) { + if (!validateForm()) { toast.error('Por favor, complete todos los campos obligatorios'); return; } - + // Tomamos una copia muerta de los datos actuales - const dataToSave = $state.snapshot(formData); - + const dataToSave = $state.snapshot(formData); + // Ejecutamos el onSave pasándole la copia if (onSave) { - onSave(dataToSave); + onSave(dataToSave); } } - + function handleCancel() { if (onCancel) { onCancel(); @@ -558,10 +574,11 @@ id="class_code" bind:value={formData.class_code} placeholder="Ingrese código de clase" - class="uppercase {validationErrors.class_code ? 'border-red-500 focus-visible:ring-red-500' : ''}" - maxlength={8} + class="uppercase {validationErrors.class_code + ? 'border-red-500 focus-visible:ring-red-500' + : ''}" + maxlength={20} oninput={() => { - // Limpiar error local si existe if (validationErrors.class_code) { const errors = { ...validationErrors }; delete errors.class_code; @@ -574,615 +591,569 @@

{validationErrors.class_code}

{/if} -
- -
- - -
- - validateField('description_es')} - /> - {#if validationErrors.description_es} -

{validationErrors.description_es}

- {/if} -
- - -
- - -
- - -
- -
- validateField('material_key')} - /> - - - {formData.material_description || ''} - -
- {#if validationErrors.material_key} -

{validationErrors.material_key}

- {/if} -
- - -
- -
- validateField('unit_of_measure')} - /> - - - {formData.unit_of_measure_description || ''} - - - Clave U.M.A: {formData.unit_measure_key || ''} - -
- {#if validationErrors.unit_of_measure} -

{validationErrors.unit_of_measure}

- {/if} -
- - -
- -
- validateField('fraction')} - /> - - - U.M.T: {formData.fraction_umt || ''} - - - Clave U.M.A: {formData.fraction_uma_key || ''} - -
- {#if validationErrors.fraction} -

{validationErrors.fraction}

- {/if} -
- - -
- -
- - - - Ad/valorem: {formData.us_fraction_ad_valorem || '0.00'} - - - Tasa Fija: {formData.us_fraction_fixed_rate || '0.00000000'} - -
-
- - -
- -
- - % - -
- +
validateField('material_key')} /> + + + {formData.material_description || ''} +
+ {#if validationErrors.material_key} +

{validationErrors.material_key}

+ {/if}
- -
- -
+ +
+
+ validateField('description_es')} /> - + {#if validationErrors.description_es} +

{validationErrors.description_es}

+ {/if}
-
- -
- -
-
- (formData.iva_exempt_fraction = true)} - class="h-4 w-4" - /> - -
-
- (formData.iva_exempt_fraction = false)} - class="h-4 w-4" - /> - -
-
-
- - -
- -
+
+ -
+ + +
+
+ +
+ validateField('unit_of_measure')} + /> + + + {formData.unit_of_measure_description || ''} + +
+ {#if validationErrors.unit_of_measure} +

{validationErrors.unit_of_measure}

+ {/if} +
+ +
+ +
+ validateField('fraction')} + /> + +
+ {#if validationErrors.fraction} +

{validationErrors.fraction}

+ {/if} +
+
+ + +
+
+ +
+ + +
+
+ +
+ +
+ + % + +
+
+
+ + +
+
+ +
+ + +
+
+ +
+ +
+ + +
+
+
+ +
+ + +
+
+
+ + + + + + + CATALOGO DE ACTIVO FIJO + +
+
+ + +
+
+ + + + + + + + + {#each filteredMaterialTypes as material (material.key)} + selectMaterial(material)} + > + + + + {/each} + +
ClaveDescripción
{material.key}{material.description}
+
+
+ + + +
+
+ + + + + + UNIDADES DE MEDIDA + +
+
+ + +
+
+ + + + + + + + + + + {#each filteredUnits as unit (unit.code)} + selectUnit(unit)} + > + + + + + + {/each} + +
CódigoDescripciónDescription (English)Clave Mexicana
{unit.code}{unit.description}{unit.descriptionEnglish}{unit.claveMexicana}
+
+
+ + + +
+
+ + + + + + CATALOGO DE FRACCIONES SITAR - SCAII + +
+
+ + +
+
+ + + + + + + + + + + {#each tariffFractions as fraction (fraction.code)} + selectFraction(fraction)} + > + + + + + + {:else} + + + + {/each} + +
FracciónNICODescripciónU.M.T
{fraction.fraction}{fraction.nico}{fraction.description}{fraction.umt}
+ {#if isLoadingFractions} + Cargando fracciones... + {:else} + No hay fracciones disponibles + {/if} +
+
+
+ + + +
+
+ + + + + + CATALOGO DE FRACCIONES AMERICANAS + +
+
+ + +
+
+ + + + + + + + + + + + {#each usTariffFractions as fraction (fraction.id)} + selectUSFraction(fraction)} + > + + + + + + + {:else} + + + + {/each} + +
CódigoPrefijoAd valoremCosto FijoDescripción
{fraction.code}{fraction.prefix || ''}{fraction.ad_valorem || '0.00'}{fraction.fixed_cost || '0.00'}{fraction.description || ''}
+ {#if isLoadingUSFractions} + Cargando fracciones... + {:else} + No hay fracciones disponibles + {/if} +
+
+
+ + + +
+
+ + + + + + CATALOGO DE DEPRECIACION + +
+
+ + +
+
+ + + + + + + + + + {#each depreciationCatalog as item (item.id)} + selectDepreciation(item)} + > + + + + + {:else} + + + + {/each} + +
FracciónDescripción% Depreciación
{item.fraction}{item.description}{item.depreciation_rate}%
+ {#if isLoadingDepreciation} + Cargando... + {:else} + No hay registros disponibles + {/if} +
+
+
+ + + +
+
+ + + + + + CATALOGO FDA + +
+
+ + +
+
+ + + + + + + + + {#each fdaCatalog as item (item.id)} + selectFDA(item)} + > + + + + {:else} + + + + {/each} + +
Clave FDADescripción
{item.fda_key}{item.description}
+ {#if isLoadingFDA} + Cargando... + {:else} + No hay registros disponibles + {/if} +
+
+
+ + + +
+
+ + + + + + CATALOGO DE CARTA PORTE + +
+
+ + +
+
+ + + + + + + + + {#each cartaPorteCatalog as item (item.id)} + { + formData.carta_porte_code = item.code; + showCartaPorteDialog = false; + }} + > + + + + {:else} + + + + {/each} + +
CódigoDescripción
{item.code}{item.description}
+ No hay registros disponibles +
+
+
+ + + +
+
- - - - - - - CATALOGO DE ACTIVO FIJO - -
-
- - -
-
- - - - - - - - - {#each filteredMaterialTypes as material (material.key)} - selectMaterial(material)} - > - - - - {/each} - -
ClaveDescripción
{material.key}{material.description}
-
-
- - - -
-
- - - - - - UNIDADES DE MEDIDA - -
-
- - -
-
- - - - - - - - - - - {#each filteredUnits as unit (unit.code)} - selectUnit(unit)} - > - - - - - - {/each} - -
CódigoDescripciónDescription (English)Clave Mexicana
{unit.code}{unit.description}{unit.descriptionEnglish}{unit.claveMexicana}
-
-
- - - -
-
- - - - - - CATALOGO DE FRACCIONES SITAR - SCAII - -
-
- - -
-
- - - - - - - - - - - {#each tariffFractions as fraction (fraction.code)} - selectFraction(fraction)} - > - - - - - - {:else} - - - - {/each} - -
FracciónNICODescripciónU.M.T
{fraction.fraction}{fraction.nico}{fraction.description}{fraction.umt}
- {#if isLoadingFractions} - Cargando fracciones... - {:else} - No hay fracciones disponibles - {/if} -
-
-
- - - -
-
- - - - - - CATALOGO DE FRACCIONES AMERICANAS - -
-
- - -
-
- - - - - - - - - - - - {#each usTariffFractions as fraction (fraction.id)} - selectUSFraction(fraction)} - > - - - - - - - {:else} - - - - {/each} - -
CódigoPrefijoAd valoremCosto FijoDescripción
{fraction.code}{fraction.prefix || ''}{fraction.ad_valorem || '0.00'}{fraction.fixed_cost || '0.00'}{fraction.description || ''}
- {#if isLoadingUSFractions} - Cargando fracciones... - {:else} - No hay fracciones disponibles - {/if} -
-
-
- - - -
-
- - - - - - CATALOGO DE DEPRECIACION - -
-
- - -
-
- - - - - - - - - - {#each depreciationCatalog as item (item.id)} - selectDepreciation(item)} - > - - - - - {:else} - - - - {/each} - -
FracciónDescripción% Depreciación
{item.fraction}{item.description}{item.depreciation_rate}%
- {#if isLoadingDepreciation} - Cargando... - {:else} - No hay registros disponibles - {/if} -
-
-
- - - -
-
- - - - - - CATALOGO FDA - -
-
- - -
-
- - - - - - - - - {#each fdaCatalog as item (item.id)} - selectFDA(item)} - > - - - - {:else} - - - - {/each} - -
Clave FDADescripción
{item.fda_key}{item.description}
- {#if isLoadingFDA} - Cargando... - {:else} - No hay registros disponibles - {/if} -
-
-
- - - -
-
- - - - - - CATALOGO DE CARTA PORTE - -
-
- - -
-
- - - - - - - - - {#each cartaPorteCatalog as item (item.id)} - { - formData.carta_porte_code = item.code; - showCartaPorteDialog = false; - }} - > - - - - {:else} - - - - {/each} - -
CódigoDescripción
{item.code}{item.description}
- No hay registros disponibles -
-
-
- - - -
-
diff --git a/frontend/src/lib/components/dashboard/invoices/edit/items/fa/country-dialog.svelte b/frontend/src/lib/components/dashboard/invoices/edit/items/fa/country-dialog.svelte index ddb6b92d..80cdbf0b 100644 --- a/frontend/src/lib/components/dashboard/invoices/edit/items/fa/country-dialog.svelte +++ b/frontend/src/lib/components/dashboard/invoices/edit/items/fa/country-dialog.svelte @@ -83,7 +83,7 @@ - + CATALOGO DE PAISES @@ -91,11 +91,7 @@
- +
@@ -113,9 +109,7 @@ - + @@ -134,11 +128,11 @@ class="border-b hover:bg-zinc-100 dark:hover:bg-zinc-800 cursor-pointer transition-colors" onclick={() => handleSelect(country)} > - - - - - + + + + + {/each} {#if filteredCountries.length === 0} @@ -152,7 +146,9 @@
Clave M3Clave M3 Clave Mexicana{country.m3_key || ''}{country.mex_key || ''}{country.description_es || ''}{country.ame_key || ''}{country.description_en || ''}{country.m3_key || ''}{country.mex_key || ''}{country.description_es || ''}{country.ame_key || ''}{country.description_en || ''}
-
+
+ {/each} diff --git a/frontend/src/lib/components/dashboard/invoices/edit/items/fa/tariff-fraction-dialog.svelte b/frontend/src/lib/components/dashboard/invoices/edit/items/fa/tariff-fraction-dialog.svelte index 02721e57..cdf26bb0 100644 --- a/frontend/src/lib/components/dashboard/invoices/edit/items/fa/tariff-fraction-dialog.svelte +++ b/frontend/src/lib/components/dashboard/invoices/edit/items/fa/tariff-fraction-dialog.svelte @@ -17,7 +17,7 @@ let loadingMore = $state(false); let searchTerm = $state(''); let error = $state(''); - + // Pagination state let currentPage = $state(1); let totalPages = $state(1); @@ -34,7 +34,7 @@ loadingMore = true; } error = ''; - + try { const params = new URLSearchParams({ page: page.toString(), @@ -45,11 +45,11 @@ const response = await fetch(`/api-sveltekit/tariff-fractions?${params}`, { credentials: 'include' }); - + if (response.ok) { const data = await response.json(); console.log('Tariff fractions data received:', data); - + if (data.items && Array.isArray(data.items)) { if (append) { fractions = [...fractions, ...data.items]; @@ -79,10 +79,10 @@ function handleScroll(e: Event) { if (!scrollContainer || loading || loadingMore || !hasMore) return; - + const target = e.target as HTMLDivElement; const scrollBottom = target.scrollHeight - target.scrollTop - target.clientHeight; - + // Load more when within 200px of bottom if (scrollBottom < 200) { loadFractions(currentPage + 1, true); @@ -120,7 +120,7 @@ - + FRACCIONES ARANCELARIAS @@ -139,11 +139,7 @@

-
+
{#if loading}
@@ -157,18 +153,12 @@ - - + + - + @@ -204,9 +194,7 @@ {/if} {#if !hasMore && fractions.length > 0} -
- Todos los resultados cargados -
+
Todos los resultados cargados
{/if} {/if} diff --git a/frontend/src/lib/components/dashboard/invoices/edit/items/fa/unit-of-measure-dialog.svelte b/frontend/src/lib/components/dashboard/invoices/edit/items/fa/unit-of-measure-dialog.svelte index 55dab050..fa12288a 100644 --- a/frontend/src/lib/components/dashboard/invoices/edit/items/fa/unit-of-measure-dialog.svelte +++ b/frontend/src/lib/components/dashboard/invoices/edit/items/fa/unit-of-measure-dialog.svelte @@ -84,7 +84,7 @@ - + CATALOGOS DE UNIDADES DE MEDIDA @@ -92,11 +92,7 @@
- +
@@ -114,9 +110,7 @@
CódigoFracciónCódigoFracción DescripciónNICONICO UMT
- + @@ -157,7 +151,9 @@
U.M.U.M. Descripción Español
-
+