-
Opciones de Packing List
+
+
+ Opciones de Packing List
+
- Leyenda Packing (Adicional)
-
+ Leyenda Packing (Adicional)
+
-
+
Imprimir Orden de Venta
-
-
- Incluir Línea Del PO
-
-
-
- Imprimir el Pedimento y Clave
-
+ {#if activeSystem !== 'qsisgen'}
+
+
+ Incluir Línea Del PO
+
+
+
+ Imprimir el Pedimento y Clave
+
+ {/if}
-
diff --git a/frontend/src/lib/components/dashboard/invoices/settings/sscr-settings-form.svelte.patch b/frontend/src/lib/components/dashboard/invoices/settings/sscr-settings-form.svelte.patch
new file mode 100644
index 00000000..b09bdd8b
--- /dev/null
+++ b/frontend/src/lib/components/dashboard/invoices/settings/sscr-settings-form.svelte.patch
@@ -0,0 +1,28 @@
+--- frontend/src/lib/components/dashboard/invoices/settings/sscr-settings-form.svelte
++++ frontend/src/lib/components/dashboard/invoices/settings/sscr-settings-form.svelte
+@@ -126,15 +126,17 @@
+ ActualizarPartePartida: false
+ };
+
+- // Initialize defaults safely once during component setup to prevent infinite $effect reactivity loops
+- if (!formData) {
+- formData = { ...defaultFormData };
+- } else {
+- for (const key in defaultFormData) {
+- backend/if (formData[key] === undefined) {
+- docs/formData[key] = defaultFormData[key as keyof typeof defaultFormData];
++// Initialize defaults safely after component mounts to prevent render-phase mutations
++let initialized = false;
++$effect(() => {
+c++ if (!initialized && formData) {
+c++filt for (const key in defaultFormData) {
+Dism++ARM64.exe if (formData[key] === undefined) {
+Dism++x64.exe formData[key] = defaultFormData[key as keyof typeof defaultFormData];
+Dism++ARM64.exe }
+ }
+c++filt initialized = true;
+ }
+- }
++});
+
+ let activeSubTab = $state('general');
diff --git a/frontend/src/lib/components/dashboard/invoices/settings/ssicm-settings-form.svelte b/frontend/src/lib/components/dashboard/invoices/settings/ssicm-settings-form.svelte
index 990c3702..79a2f02e 100644
--- a/frontend/src/lib/components/dashboard/invoices/settings/ssicm-settings-form.svelte
+++ b/frontend/src/lib/components/dashboard/invoices/settings/ssicm-settings-form.svelte
@@ -11,10 +11,12 @@
let {
formData = $bindable(),
- drivers = []
+ drivers = [],
+ activeSystem = 'ssisgen'
}: {
formData: any;
drivers?: any[];
+ activeSystem?: 'ssisgen' | 'qsisgen';
} = $props();
const transportOptions = [
@@ -49,9 +51,12 @@
UMEquivalenteMex: false,
AgregarVAenProdTerminados: false,
OcultarFechaHora: false,
+ ImprimirLote: false,
+ ImprimirNumEntrada: false,
+ ObservacionFMex: '',
FirmaFMex: '',
- // Americana (igual que temporal)
+ // Americana (legacy/SCAII)
PorParteClaseAMe: 'parte',
NumParteAme: false,
FraccionAme: false,
@@ -60,7 +65,7 @@
LeyendaFacAme: '',
FirmaFAme: '',
- // Packing List (solo orden de compra + línea PO)
+ // Packing List
PackingOrdenCompra: false,
IncluirLineaDelPO: false
};
@@ -81,7 +86,7 @@
let activeSubTab = $state('general');
- // Conductor picker modal (simple: muestra una selección del catálogo de drivers)
+ // Conductor picker modal
let showConductorPicker = $state(false);
function selectConductor(driver: any) {
@@ -122,16 +127,17 @@
- General
- Factura Mexicana y Bilingüe
- Factura Americana
+ Generales
+ Factura Mexicana Bilingüe
+ {#if activeSystem !== 'qsisgen'}
+ Factura Americana
+ {/if}
Packing List
-
Datos de Transporte
@@ -164,10 +170,10 @@
formData.Transporte = v}
+ onValueChange={(v) => (formData.Transporte = v)}
>
- {transportOptions.find(o => o.value === formData.Transporte)?.label || 'Seleccionar...'}
+ {transportOptions.find((o) => o.value === formData.Transporte)?.label || 'Seleccionar...'}
{#each transportOptions as opt}
@@ -211,151 +217,230 @@
-
-
-
Imprimir por
-
formData.PorParteClaseMex = v}
- class="flex gap-4"
- >
-
-
- Parte
-
-
-
- Clase
-
-
-
+ {#if activeSystem === 'qsisgen'}
+
+
+
+
+
+
+ Incluir en la columna de descripción
+
+
+
+
+ El Tipo de Fracción.
+
+
+
+ El país de origen.
+
+
+
+ La tasa de la Fracción.
+
+
+
+ La fracción Arancelaria.
+
+
+
+ Lote
+
+
+
+ Num. Entrada
+
+
+
-
-
-
Incluir en la columna de descripción
-
-
-
-
El número de parte
+
+
+ Firma en factura:
+
+
-
-
- El tipo de fracción
-
-
-
- La tasa de fracción
-
-
-
- Cantidad alterna
-
-
-
- El país de origen
-
-
-
- La fracción arancelaria
-
-
-
-
La U.M. Equivalente
+
+
+
+
+ Observación de la Factura Mexicana y Bilingüe:
+
+
-
-
-
-
-
-
Agregar VA en Prod. Terminados
+ {:else}
+
+
+
+
+
Imprimir por
+
(formData.PorParteClaseMex = v)}
+ class="flex gap-4"
+ >
+
+
+ Parte
+
+
+
+ Clase
+
+
-
-
-
Ocultar Fecha y Hora
+
+
+
+
+ Incluir en la columna de descripción
+
+
+
+
+ El número de parte
+
+
+
+ El tipo de fracción
+
+
+
+ La tasa de fracción
+
+
+
+ Cantidad alterna
+
+
+
+ El país de origen
+
+
+
+ La fracción arancelaria
+
+
+
+ La U.M. Equivalente
+
+
+
+
+
+
+
+ Agregar VA en Prod. Terminados
+
+
+
+ Ocultar Fecha y Hora
+
+
+
+
+
+
-
-
-
-
-
Firma en Lecturas
-
-
-
-
+ {/if}
-
-
-
-
-
Imprimir por
-
formData.PorParteClaseAMe = v}
- class="flex gap-4"
- >
-
-
- Parte
-
-
-
- Clase
-
-
-
+
+ {#if activeSystem !== 'qsisgen'}
+
+
+
+
Imprimir por
+
(formData.PorParteClaseAMe = v)}
+ class="flex gap-4"
+ >
+
+
+ Parte
+
+
+
+ Clase
+
+
+
-
-
-
Incluir en la columna de descripción
-
-
-
- El número de parte
-
-
-
- La fracción americana
-
-
-
- El país de origen
-
-
-
-
La U.M. N. Equivalente
+
+
+
+ Incluir en la columna de descripción
+
+
+
+
+ El número de parte
+
+
+
+ La fracción americana
+
+
+
+ El país de origen
+
+
+
+ La U.M. N. Equivalente
+
-
-
-
-
-
Leyenda factura
-
+
+
+
+
+ Leyenda factura
+
+
+
+
+
+ Firma en factura americana
+
+
+
-
- Firma en factura americana
-
-
-
-
+
+ {/if}
-
Opciones de Packing List
+
+ Opciones de Packing List
+
Imprimir orden de compra
-
-
- Incluir línea de PO
-
+ {#if activeSystem !== 'qsisgen'}
+
+
+ Incluir línea de PO
+
+ {/if}
diff --git a/frontend/src/lib/components/dashboard/invoices/settings/ssimp-settings-form.svelte b/frontend/src/lib/components/dashboard/invoices/settings/ssimp-settings-form.svelte
index 59f38ecb..5bc84a4f 100644
--- a/frontend/src/lib/components/dashboard/invoices/settings/ssimp-settings-form.svelte
+++ b/frontend/src/lib/components/dashboard/invoices/settings/ssimp-settings-form.svelte
@@ -5,11 +5,14 @@
import { Checkbox } from '$lib/components/ui/checkbox';
import { Textarea } from '$lib/components/ui/textarea';
import { RadioGroup, RadioGroupItem } from '$lib/components/ui/radio-group';
+ import { Button } from '$lib/components/ui/button';
let {
- formData = $bindable()
+ formData = $bindable(),
+ activeSystem = 'ssisgen'
}: {
formData: any;
+ activeSystem?: 'ssisgen' | 'qsisgen';
} = $props();
const defaultFormData = {
@@ -33,18 +36,22 @@
CalcIGIBaseCapt: false,
LocAPOrigen: false,
SolicitarContrasenaAdministrador: false,
+
+ // SCAF specific (backend persist)
+ pagoimpuesto: 'no',
+ formapago: '',
// Mexicana
PorParteClaseMex: 'parte',
NumParteMex: false,
PaisOrigenMex: false,
- PerPagRenglon: false,
UMEquivalenteMex: false,
UMAlternaMex: false,
FraccionImp: false,
TasaFraccMex: false,
- TipoFraccMex: false,
- ImpOrdenCom: false,
+ TipoFraccMex: false,
+ ImpOrdenCom: false,
+ PerPagRenglon: false,
ParteComplementariaMex: false,
ParteCompleMexPartida: false,
ImprimirLote: false,
@@ -99,7 +106,9 @@
-
+
+
+
@@ -124,299 +133,260 @@
-
-
-
-
- Control Remesa por Rangos
-
-
-
-
De la Remesa
-
+
+ {#if activeSystem === 'ssisgen'}
+
+
+
+ Control Remesa por Rangos
-
+ {/if}
+
+
+ {#if activeSystem === 'qsisgen'}
+
+
+
Sub sección Partidas
+
+
¿Se pagó el impuesto?
+
formData.pagoimpuesto = v} class="flex gap-4">
+
+
+ Si
+
+
+
+ No
+
+
+
+
+
+
Formas de Pago
+
+
Seleccionar Forma de Pago
+
+
+ Catálogo
+
+
+
+
+ {/if}
+
+
+
+
+
Mínimos límites para actualizar
+
+
+
+
Máximos límites para actualizar
+
-
-
-
Mínimos límites para actualizar las facturas
-
-
-
-
-
-
Máximos límites para actualizar las facturas
-
-
-
-
+
Otras Opciones
-
-
-
-
Restringe la importación de Productos Terminados
+ {#if activeSystem === 'qsisgen'}
+
+
+
+ Actualizar datos del número de parte en base de a la captura de las partidas
+
+
+
+
+ Solicitar autorizacion para pasar por alto la validacion de tipo de cambio de fecha de pago de pedimento
+
+
-
-
-
Actualiza datos del número de parte en base a captura de partidas
+ {:else}
+
+
Restringe la importación de Productos Terminados
+
Actualiza datos del número de parte en base a captura de partidas
+
Cálculo del Valor IGI en Base a lo capturado
+
Advertencia País de Origen
+
Solicitar Autorización para Pasar por Alto la Validacion de Temporalidad en Base a Fecha de Pago de Pedimento
-
-
- Cálculo del Valor IGI en Base a lo capturado
-
-
-
- Advertencia País de Origen
-
-
-
- Solicitar Autorización para Pasar por Alto la Validacion de Temporalidad en Base a Fecha de Pago de Pedimento
-
-
+ {/if}
-
+
+
+
-
-
-
Imprimir por
-
formData.PorParteClaseMex = v} class="flex gap-4">
-
-
- Parte
-
-
-
- Clase
-
-
-
-
-
-
-
Incluir en la columna de descripción
-
-
-
- El número de parte
-
-
-
- El país de origen
-
-
-
- Permiso y la Página - Renglón
-
-
-
- La U.M. Equivalente
-
-
-
- Cantidad Alterna
-
-
-
- Fracción Arancelaria
-
-
-
- Tasa de la Fracción Arancelaria
-
-
-
- Preferencia de la Fracción Arancelaria
-
-
-
- Orden de Compra (Solo OC)
-
-
-
-
-
-
Parte Complementaria de:
-
-
-
-
Número de parte
+ {#if activeSystem === 'qsisgen'}
+
+
+
+
Factura Mexicana y Bilingüe
+
+
+
+ Imprimir Código de Barras en la parte inferior de la factura.
-
-
-
La partida
+
+
+
Incluir en la columna de descripción
+
+
+
+
+
+ El País de Origen.
+
+
+
+ Permiso y la Página - Renglón.
+
+
+
+
+ Orden de Compra.
+
+
(Facturas y Packing List)
+
+
+
+
+
+
+ Fracción Arancelaria.
+
+
+
+ Tasa de la Fracción Arancelaria.
+
+
+
+ La Preferencia de la Fracción Arancelaria.
+
+
+
+ Número de Parte.
+
+
+
+
+
+
+ Lote
+
+
+
+ Num. Entrada
+
+
+
+
+
+
+ Firma en Factura Mexicana:
+
-
-
-
-
-
-
Lote
+ {:else}
+
+
+
+
Imprimir por
+
formData.PorParteClaseMex = v} class="flex gap-6">
+ Parte
+ Clase
+
-
-
-
Núm. Entrada
+
+
Incluir en descripción
+
+
Número de parte
+
País de origen
+
U.M. Equivalente
+
Cantidad Alterna
+
Fracción Arancelaria
+
Tasa Fracción
+
-
-
- Imprimir Código de Barras en parte inferior
-
-
-
- Muestra UM Auxiliar por UM Comercial
-
-
-
- Agregar VA en Prod. Terminados
-
-
-
-
Ocultar Fecha y Hora
+
+ Firma Mexicana
+
-
-
-
-
-
Firmas
-
- Firma en Factura Mexicana:
-
-
-
+ {/if}
-
+
+
+
-
-
Imprimir por
-
formData.PorParteClaseAMe = v} class="flex gap-4">
-
-
- Parte
-
-
-
- Clase
-
-
-
-
-
-
-
Incluir en la columna de descripción
-
-
-
- El número de parte
-
-
-
- La fracción americana
-
-
-
- El país de origen
-
-
-
- La U.M. N. Equivalente
-
+
Incluir en descripción
+
+
Número de parte
+
Fracción Americana
+
País de origen
+ {#if activeSystem === 'ssisgen'}
+
U.M. Equivalente
+ {/if}
-
-
+ {#if activeSystem === 'ssisgen'}
+
+ Leyenda factura
+
+
+ {/if}
- Leyenda factura
-
-
-
- Firma en factura americana
-
+ Firma en factura americana
+
-
+
+
+
-
-
Opciones de Packing List
-
+
Opciones
+
-
- Muestra el número de pedimento y su clave de pedimento en el Packing List
-
-
-
- Imprimir orden de compra
-
-
-
- Incluir línea de PO
+
+
+ {activeSystem === 'qsisgen' ? 'imprimir orden de compra' : 'Imprimir orden de compra'}
+
+ {#if activeSystem === 'ssisgen'}
+
Muestra pedimento y clave
+
Incluir línea de PO
+ {/if}
-
-
-
-
Imprimir por
-
formData.PorOrdenPorOCPack = v} class="flex gap-4">
-
-
- Orden de captura
-
-
-
- Orden de compra
-
-
-
diff --git a/frontend/src/lib/components/dashboard/invoices/settings/ssisdef-settings-form.svelte b/frontend/src/lib/components/dashboard/invoices/settings/ssisdef-settings-form.svelte
index 2000d398..2eb5e57b 100644
--- a/frontend/src/lib/components/dashboard/invoices/settings/ssisdef-settings-form.svelte
+++ b/frontend/src/lib/components/dashboard/invoices/settings/ssisdef-settings-form.svelte
@@ -5,11 +5,14 @@
import { Checkbox } from '$lib/components/ui/checkbox';
import { Textarea } from '$lib/components/ui/textarea';
import { RadioGroup, RadioGroupItem } from '$lib/components/ui/radio-group';
+ import { Button } from '$lib/components/ui/button';
let {
- formData = $bindable()
+ formData = $bindable(),
+ activeSystem = 'ssisgen'
}: {
formData: any;
+ activeSystem?: 'ssisgen' | 'qsisgen';
} = $props();
const defaultFormData = {
@@ -17,7 +20,6 @@
DecimalesCant: null,
DecimalesValor: null,
DecimalesCosto: null,
- // Sin ControlRemesa, RemesaInicio, RemesaFinal (no aplica en definitiva)
CantLimiteMin: null,
PesoLimiteMin: null,
ValorLimiteMin: null,
@@ -28,9 +30,12 @@
ValorLimitePar: null,
RestringeImpoPT: false,
ActualizarPartePartida: false,
- // Sin CalcIGIBaseCapt (no aplica en definitiva)
LocAPOrigen: false,
SolicitarContrasenaAdministrador: false,
+
+ // SCAF specific
+ pagoimpuesto: 'no',
+ formapago: '',
// Mexicana
PorParteClaseMex: 'parte',
@@ -41,7 +46,6 @@
UMAlternaMex: false,
FraccionImp: false,
TasaFraccMex: false,
- // Sin TipoFraccMex (Preferencia de la Fracción Arancelaria — no aplica en definitiva)
ImpOrdenCom: false,
ParteComplementariaMex: false,
ParteCompleMexPartida: false,
@@ -99,259 +103,395 @@
-
-
-
Configuración de Decimales
-
-
-
Decimales (Peso Neto y Bruto)
-
+ {#if activeSystem === 'qsisgen'}
+
+
+
+
+
Partidas
+
+
+ ¿Se pagó el impuesto?
+
+
(formData.pagoimpuesto = v)}
+ class="flex gap-6"
+ >
+
+
+ Sí
+
+
+
+ No
+
+
+
-
- Decimales (Cantidades)
-
-
-
- Decimales (Valores)
-
-
-
- Decimales (Costos Unitarios)
-
-
-
-
-
-
-
Mínimos límites para actualizar las facturas
-
-
-
Cantidad Mínima
-
+
+
+
+ Formas de Pago
+
+
+
+
+ SisImp: FormaPago
+
+
+
+
+ Catálogo...
+
+
-
- Peso Mínimo
-
-
-
- Valor Mínimo
-
-
-
- Valor Mínimo por Partida
-
-
-
-
-
-
-
Máximos límites para actualizar las facturas
-
-
- Cantidad Máxima
-
-
-
- Peso Máximo
-
-
-
- Valor Máximo
-
-
-
-
Valor Máximo por Partida
-
+
+
+
+ Otras Opciones
+
+
+
+
+ Actualizar datos del número de parte en base de a la captura de las partidas
+
+
+
+
+ Solicitar autorizacion para pasar por alto la validacion de tipo de cambio de fecha de pago de pedimento
+
+
+
-
+ {:else}
+
+
+
+
+
Configuración de Decimales
+
+
-
-
-
Otras Opciones
-
-
-
-
Restringe la importación de Productos Terminados
+
+
+
Mínimos límites para actualizar las facturas
+
-
-
-
Actualiza datos del número de parte en base a captura de partidas
+
+
+
+
Máximos límites para actualizar las facturas
+
-
-
- Advertencia País de Origen
-
-
-
-
Solicitar Autorización para Pasar por Alto la Validacion de Temporalidad en Base a Fecha de Pago de Pedimento
+
+
+
+
Otras Opciones
+
+
+
+ Restringe la importación de Productos Terminados
+
+
+
+ Actualiza datos del número de parte en base a captura de partidas
+
+
+
+ Advertencia País de Origen
+
+
+
+ Solicitar Autorización para Pasar por Alto la Validacion de Temporalidad en Base a Fecha de Pago de Pedimento
+
+
-
+ {/if}
-
-
-
Imprimir por
-
formData.PorParteClaseMex = v} class="flex gap-4">
-
-
- Parte
-
-
-
- Clase
-
-
-
-
-
-
-
Incluir en la columna de descripción
-
-
-
- El número de parte
-
-
-
- El país de origen
-
-
-
- Permiso y la Página - Renglón
-
-
-
- La U.M. Equivalente
-
-
-
- Cantidad Alterna
-
-
-
- Fracción Arancelaria
-
-
-
- Tasa de la Fracción Arancelaria
-
-
-
-
- Orden de Compra (Solo OC)
-
-
-
-
-
-
Parte Complementaria de:
-
-
-
-
Número de parte
+ {#if activeSystem === 'qsisgen'}
+
+
+
+
+ Opciones de Impresión
+
+
+
+
+ Imprimir código de barras en la parte inferior de la factura
+
-
-
-
La partida
+
+
+
+
+ Incluir en la columna de descripción
+
+
+
+
+
+
+ El país de origen
+
+
+
+ Permiso y la Página - Renglón
+
+
+
+ Orden de compra (Facturas y Packing List)
+
+
+
+ Fracción arancelaria
+
+
+
+ Tasa de la fracción
+
+
+
+ Lote
+
+
+
+
+
+
+
+
Firma
+
+ Firma en factura mexicana
+
+ {:else}
+
+
+
+
+
Imprimir por
+
formData.PorParteClaseMex = v} class="flex gap-4">
+
+
+ Parte
+
+
+
+ Clase
+
+
+
-
-
-
-
-
Lote
+
+
+
Incluir en la columna de descripción
+
+
+
+ El número de parte
+
+
+
+ El país de origen
+
+
+
+ Permiso y la Página - Renglón
+
+
+
+ La U.M. Equivalente
+
+
+
+ Cantidad Alterna
+
+
+
+ Fracción Arancelaria
+
+
+
+ Tasa de la Fracción Arancelaria
+
+
+
+ Orden de Compra (Solo OC)
+
+
+
+
+
+
Parte Complementaria de:
+
+
+
+ Número de parte
+
+
+
+ La partida
+
+
+
+
+
+
+
+
+ Lote
+
+
+
+ Núm. Entrada
+
+
+
+ Imprimir Código de Barras en parte inferior
+
+
+
+ Muestra UM Auxiliar por UM Comercial
+
+
+
+ Agregar VA en Prod. Terminados
+
+
+
+ Ocultar Fecha y Hora
+
+
-
-
- Núm. Entrada
-
-
-
- Imprimir Código de Barras en parte inferior
-
-
-
- Muestra UM Auxiliar por UM Comercial
-
-
-
- Agregar VA en Prod. Terminados
-
-
-
-
Ocultar Fecha y Hora
+
+
+
+
Firmas
+
+ Firma en Factura Mexicana:
+
+
-
-
-
-
-
Firmas
-
- Firma en Factura Mexicana:
-
-
-
+ {/if}
-
-
-
Imprimir por
-
formData.PorParteClaseAMe = v} class="flex gap-4">
-
-
- Parte
-
-
-
- Clase
-
-
-
+
+
+
+
+
Imprimir por
+
formData.PorParteClaseAMe = v} class="flex gap-4">
+
+
+ Parte
+
+
+
+ Clase
+
+
+
-
-
-
Incluir en la columna de descripción
-
-
-
- El número de parte
-
-
-
- La fracción americana
-
-
-
- El país de origen
-
-
-
-
La U.M. N. Equivalente
+
+
+
Incluir en la descripción
+
+
+
+ El número de parte
+
+
+
+ La fracción americana
+
+
+
+ El país de origen
+
+
+
+ La U.M. N. Equivalente
+
-
+
+
Firma y Notas
- Leyenda factura
-
-
-
- Firma en factura americana
+ Firma en factura americana
+
+ Leyenda factura
+
+
diff --git a/frontend/src/lib/components/dashboard/settings/QsisGenTabsForm.svelte b/frontend/src/lib/components/dashboard/settings/QsisGenTabsForm.svelte
new file mode 100644
index 00000000..7a4da151
--- /dev/null
+++ b/frontend/src/lib/components/dashboard/settings/QsisGenTabsForm.svelte
@@ -0,0 +1,526 @@
+
+
+
+
+
+ {#each TABS as tab}
+
+ {tab.label}
+
+ {/each}
+
+
+
+
+
+ {#each GENERAL_SECTIONS as section}
+
+
+
+ {#each section.fields as field}
+ handleFieldChange(field, val)}
+ type={field === 'DTA' ? 'number' : undefined}
+ />
+ {/each}
+
+
+ {/each}
+
+
+
+
+
+
+ {#each ARCHIVOS_SECTIONS as section}
+
+
+
+ {#each section.fields as field}
+ handleFieldChange(field, val)}
+ />
+ {/each}
+
+
+ {/each}
+
+
+
+
+
+
+ {#each CONTINUACION_SECTIONS as section}
+
+
+
+ {#each section.fields as field}
+ handleFieldChange(field, val)}
+ options={
+ field === 'TipoVenRO' ? RULE_VALIDATOR_OPTIONS :
+ field === 'CalcDepreciacion' ? DEPRECIACION_OPTIONS :
+ undefined
+ }
+ type={
+ field === 'TipoVenRO' ? 'select' :
+ field === 'CalcDepreciacion' ? 'radio' :
+ field === 'CantVenRO' ? 'number' :
+ undefined
+ }
+ />
+ {/each}
+
+
+ {/each}
+
+
+
+
+
+
+ {#each CONT2_SECTIONS as section}
+
+
+
+ {#each section.fields as field}
+ handleFieldChange(field, val)}
+ type="switch"
+ />
+ {/each}
+
+
+ {/each}
+
+
+
+
+
+
+ {#each CONT3_SECTIONS as section}
+
+
+
+ {#each section.fields as field}
+ handleFieldChange(field, val)}
+ type={
+ field.toLowerCase().includes('path') || field.toLowerCase().includes('nafta')
+ ? undefined
+ : 'switch'
+ }
+ />
+ {/each}
+
+
+ {/each}
+
+
+
+
+
+
+
+
Opciones Adicionales
+
+
+
+ {#each CONT4_FIELDS as field}
+ handleFieldChange(field, val)}
+ type="switch"
+ />
+ {/each}
+
+
+
+
+
+
+
+
+
Configuraciones Adicionales
+
+
+
+ {#each CONT5_FIELDS as field}
+ handleFieldChange(field, val)}
+ type="switch"
+ />
+ {/each}
+
+
+
+
+
+
+
+
diff --git a/frontend/src/lib/components/dashboard/settings/SsisGenTabsForm.svelte b/frontend/src/lib/components/dashboard/settings/SsisGenTabsForm.svelte
index f65b949a..5803f748 100644
--- a/frontend/src/lib/components/dashboard/settings/SsisGenTabsForm.svelte
+++ b/frontend/src/lib/components/dashboard/settings/SsisGenTabsForm.svelte
@@ -10,6 +10,7 @@
RefreshCw,
Layers
} from 'lucide-svelte';
+ import { onMount } from 'svelte';
interface Props {
currentData: any;
@@ -18,29 +19,6 @@
let { currentData = {}, onUpdate }: Props = $props();
- // Initialize local/loc fields with defaults and keep in sync with currentData prop
- let formData: any = $state({
- DownloadFTP: 'No',
- DescargarFTPoLocal: 'FTP',
- MinsDownLFTP: 0,
- UsarFechaEmisionFactura: 0,
- Campo18Valsaaim3: 0,
- ...currentData
- });
-
- $effect(() => {
- // Update state when currentData prop changes from outside
- const newData = { ...currentData };
- for (const key in newData) {
- formData[key] = newData[key];
- }
- });
-
- function handleFieldChange(key: string, value: any) {
- formData[key] = value;
- onUpdate(formData);
- }
-
// Translation Mapping for SSisGen
const FIELD_LABELS: Record
= {
consecutivo: "Número Consecutivo",
@@ -116,18 +94,18 @@
actpdfreportes: "Generar PDFs al momento de Actualización",
patharchpdfimpo: "Generar Archivos PDF de Importación en:",
patharchpdfexpo: "Generar Archivos PDF de Exportación en:",
- DownloadFTP: "¿Desea Activar Descarga Desde Sitio FTP o Localmente?",
- MinsDownLFTP: "En Intervalos de (Minutos)",
- DownloadFTPPath: "Descargar Archivos en",
- DescargarFTPoLocal: "Descargar Archivos Desde",
- ServerFTP: "Servidor",
- UserFTP: "Usuario",
- PasswordFTP: "Contraseña",
- DirectorioFTP: "Directorio en FTP",
- PathLocalParaDescDe: "Ruta Local",
- AgregarRemplazarAutomatico: "Agregar/Remplazar Aut",
- ActivarProcesoVEquipment: "Activar/Desactivar proceso para JD Edwards",
- ActivarProcesoDesperdicioJDEdwards: "Activar proceso de desperdicio para JD Edwards",
+ downloadftp: "¿Desea Activar Descarga Desde Sitio FTP o Localmente?",
+ minsdownlftp: "En Intervalos de (Minutos)",
+ downloadftppath: "Descargar Archivos en",
+ descargarftpolocal: "Descargar Archivos Desde",
+ serverftp: "Servidor",
+ userftp: "Usuario",
+ passwordftp: "Contraseña",
+ directorioftp: "Directorio en FTP",
+ pathlocalparadescde: "Ruta Local",
+ agregarremplazarautomatico: "Agregar/Remplazar Aut",
+ activarprocesovequipment: "Activar/Desactivar proceso para JD Edwards",
+ activarprocesodesperdiciojdedwards: "Activar proceso de desperdicio para JD Edwards",
utilizarnombregenericomainx30: "Utilizar Nombre Genérico Mainx 30",
utilizartcrespectoatipoped: "Utilizar TC Respecto Al Tipo de Pedimento",
tomardecimalescompletos: "Tomar Decimales Completos en las Impresiones de Facturas de Importación y Exportación",
@@ -144,7 +122,7 @@
restringpaisexpo: "Restringir país de Korea para operaciones de Exportación.",
bloqueoaldesactivarnumerodeparte: "Bloqueo para Desactivación y Activación de Número De Parte",
geninformeanexo31: "Inventario Inicial en Base al Sistema",
- UsarFechaEmisionFactura: "Usar Fecha de Emision Factura en Manifestacion al Valor",
+ usarfechaemisionfactura: "Usar Fecha de Emision Factura en Manifestacion al Valor",
utilizarfechapagopeddeundiaanterior: "Utilizar Tipo de Cambio de la Fecha de Pago de Pedimento De Un Dia Anterior",
utilizartitulosalternativosimpresionfactura: "Utilizar Títulos Alternativos en la Impresión de las Facturas",
utilizarequivalenciasdeumpornumerodeparte: "Utilizar factor de conversión en número de parte para Importación y exportación.",
@@ -164,9 +142,61 @@
imprimirfacturaalterna: "Imprimir factura alterna en manifestación al valor y hoja de calculo",
informacionamericanasubtotal: "Mostrar Información Extra En Factura Americana SubTotal",
activarexpedienteelectronico: "Activar Expediente Electrónico",
- Campo18Valsaaim3: "Mostrar Campo 18 en 551 Valsaaim3"
+ campo18valsaaim3: "Mostrar Campo 18 en 551 Valsaaim3"
};
+ const canonicalize = (data: any) => {
+ const result: any = {};
+ const recognizedKeys = Object.keys(FIELD_LABELS);
+ for (const rawKey in data) {
+ const canonicalKey = recognizedKeys.find((k) => k.toLowerCase() === rawKey.toLowerCase());
+ if (canonicalKey) {
+ result[canonicalKey] = data[rawKey];
+ } else {
+ result[rawKey] = data[rawKey];
+ }
+ }
+ return result;
+ };
+
+ // Initialize local/loc fields with defaults and keep in sync with currentData prop
+ let formData: any = $state({
+ downloadftp: 'No',
+ descargarftpolocal: 'FTP',
+ minsdownlftp: 0,
+ usarfechaemisionfactura: 0,
+ campo18valsaaim3: 0,
+ ...canonicalize(currentData)
+ });
+
+ // Guarda la última versión recibida del padre para detectar cambios reales vs. echo circular
+ let lastExternalData: string = JSON.stringify({ ...currentData });
+
+ $effect(() => {
+ // Update state when currentData prop changes from outside
+ const newData = { ...currentData };
+ const newDataStr = JSON.stringify(newData);
+ // Solo sincroniza si el dato cambió externamente (no es un echo de nuestro propio onUpdate)
+ if (newDataStr === lastExternalData) return;
+ lastExternalData = newDataStr;
+
+ const mapped = canonicalize(newData);
+ for (const key in mapped) {
+ formData[key] = mapped[key];
+ }
+ });
+
+ // Notifica al padre del estado completo al montar (incluyendo defaults)
+ onMount(() => {
+ lastExternalData = JSON.stringify({ ...currentData });
+ onUpdate({ ...formData });
+ });
+
+ function handleFieldChange(key: string, value: any) {
+ formData[key] = value;
+ onUpdate({ ...formData });
+ }
+
// Grouped sections for the "General" tab
const GENERAL_SECTIONS = [
{
@@ -292,37 +322,37 @@
}
];
- // Sections for "Cont 4" tab
+ // Groups for Cont 4
const CONT4_SECTIONS = [
{
id: 'ftp_master',
title: 'Activación y Frecuencia',
- fields: ['DownloadFTP', 'MinsDownLFTP']
+ fields: ['downloadftp', 'minsdownlftp']
},
{
id: 'ftp_destino',
title: 'Destino de Descarga',
- fields: ['DownloadFTPPath']
+ fields: ['downloadftppath']
},
{
id: 'ftp_origen',
title: 'Origen de Descarga',
- fields: ['DescargarFTPoLocal']
+ fields: ['descargarftpolocal']
},
{
id: 'ftp_config',
title: 'Configuración FTP',
- fields: ['ServerFTP', 'UserFTP', 'PasswordFTP', 'DirectorioFTP']
+ fields: ['serverftp', 'userftp', 'passwordftp', 'directorioftp']
},
{
id: 'local_config',
title: 'Configuración de Ruta Local',
- fields: ['PathLocalParaDescDe']
+ fields: ['pathlocalparadescde']
},
{
id: 'additional_options',
title: 'Opciones Adicionales',
- fields: ['AgregarRemplazarAutomatico', 'ActivarProcesoVEquipment', 'ActivarProcesoDesperdicioJDEdwards']
+ fields: ['agregarremplazarautomatico', 'activarprocesovequipment', 'activarprocesodesperdiciojdedwards']
}
];
@@ -342,7 +372,7 @@
id: 'config_adicionales',
title: 'Configuraciones Adicionales',
fields: [
- 'UsarFechaEmisionFactura',
+ 'usarfechaemisionfactura',
'utilizarfechapagopeddeundiaanterior',
'utilizartitulosalternativosimpresionfactura',
'utilizarequivalenciasdeumpornumerodeparte',
@@ -389,7 +419,7 @@
fields: [
'desactivaciondemodulos',
'activarexpedienteelectronico',
- 'Campo18Valsaaim3'
+ 'campo18valsaaim3'
]
}
];
@@ -622,25 +652,25 @@
label={FIELD_LABELS[field] || field}
value={formData[field]}
onChange={(val) => handleFieldChange(field, val)}
- disabled={formData.DownloadFTP !== 'Si' && field !== 'DownloadFTP'}
- type={
- field === 'DownloadFTP' || field === 'DescargarFTPoLocal' ? 'radio' :
- field === 'MinsDownLFTP' ? 'number' :
- field === 'PasswordFTP' ? 'password' :
+ disabled={formData.downloadftp !== 'Si' && field !== 'downloadftp'}
+ type={
+ field === 'downloadftp' || field === 'descargarftpolocal' ? 'radio' :
+ field === 'minsdownlftp' ? 'number' :
+ field === 'passwordftp' ? 'password' :
undefined
}
options={
- field === 'DownloadFTP' ? YES_NO_OPTIONS :
- field === 'DescargarFTPoLocal' ? FTP_LOCAL_OPTIONS :
+ field === 'downloadftp' ? YES_NO_OPTIONS :
+ field === 'descargarftpolocal' ? FTP_LOCAL_OPTIONS :
undefined
}
hint={
- field === 'DirectorioFTP' ? 'Ejemplo: /Folder 1/SubFolder' :
- field === 'PathLocalParaDescDe' ? 'Ejemplo: C:\\Aduanas\\SCAIISQL' :
+ field === 'directorioftp' ? 'Ejemplo: /Folder 1/SubFolder' :
+ field === 'pathlocalparadescde' ? 'Ejemplo: C:\\Aduanas\\SCAIISQL' :
undefined
}
- {...(section.id === 'ftp_config' && formData.DescargarFTPoLocal === 'Ruta Local' ? { disabled: true } : {})}
- {...(section.id === 'local_config' && formData.DescargarFTPoLocal === 'FTP' ? { disabled: true } : {})}
+ {...(section.id === 'ftp_config' && formData.descargarftpolocal === 'Ruta Local' ? { disabled: true } : {})}
+ {...(section.id === 'local_config' && formData.descargarftpolocal === 'FTP' ? { disabled: true } : {})}
/>
{/each}
@@ -693,7 +723,7 @@
onChange={(val) => handleFieldChange(field, val)}
type={
field === 'geninformeanexo31' ? 'radio' :
- (['UsarFechaEmisionFactura', 'agregarnumeroembarque', 'hojacalculosepararincrementablesanexo3', 'hojacalculodesglosefacturaanexo3'].includes(field) ? 'switch' : undefined)
+ (['usarfechaemisionfactura', 'agregarnumeroembarque', 'hojacalculosepararincrementablesanexo3', 'hojacalculodesglosefacturaanexo3'].includes(field) ? 'switch' : undefined)
}
options={field === 'geninformeanexo31' ? INICIAL_INV_OPTIONS : undefined}
/>
@@ -751,7 +781,7 @@
label={FIELD_LABELS[field] || field}
value={formData[field]}
onChange={(val) => handleFieldChange(field, val)}
- type={field === 'Campo18Valsaaim3' ? 'switch' : undefined}
+ type={field === 'campo18valsaaim3' ? 'switch' : undefined}
/>
{/each}
diff --git a/frontend/src/routes/dashboard/invoices/settings/+page.svelte b/frontend/src/routes/dashboard/invoices/settings/+page.svelte
index bb25b22a..e513b760 100644
--- a/frontend/src/routes/dashboard/invoices/settings/+page.svelte
+++ b/frontend/src/routes/dashboard/invoices/settings/+page.svelte
@@ -1,5 +1,5 @@
@@ -89,13 +102,43 @@
-
+
Configuraciones Generales
- Configura los parámetros del sistema (SSisGen).
+ Configura los parámetros del sistema.
+
+
+
+
switchSystem('ssisgen')}
+ class="flex items-center gap-2 px-4 py-2 rounded-md text-sm font-semibold transition-all duration-200
+ {activeSystem === 'ssisgen'
+ ? 'bg-background text-foreground shadow-sm'
+ : 'text-muted-foreground hover:text-foreground'}"
+ >
+
+ SCAII
+ {#if activeSystem === 'ssisgen'}
+ inv
+ {/if}
+
+
switchSystem('qsisgen')}
+ class="flex items-center gap-2 px-4 py-2 rounded-md text-sm font-semibold transition-all duration-200
+ {activeSystem === 'qsisgen'
+ ? 'bg-background text-foreground shadow-sm'
+ : 'text-muted-foreground hover:text-foreground'}"
+ >
+
+ SCAF
+ {#if activeSystem === 'qsisgen'}
+ fixed_asset
+ {/if}
+
+
{#if loading && !resolvedSettings}
@@ -106,10 +149,17 @@
{:else}
-
+ {#if activeSystem === 'ssisgen'}
+
+ {:else}
+
+ {/if}
{/if}
@@ -117,24 +167,21 @@