Files
plantillas-proyectos/frontend/src/lib/components/dashboard/settings/SsisGenTabsForm.svelte
2026-03-31 10:57:51 -05:00

855 lines
32 KiB
Svelte

<script lang="ts">
import { fade } from 'svelte/transition';
import * as Tabs from '$lib/components/ui/tabs';
import SettingFormField from './SettingFormField.svelte';
import { Button } from '$lib/components/ui/button';
import {
AlertTriangle,
CreditCard,
FileEdit,
RefreshCw,
Layers
} from 'lucide-svelte';
interface Props {
currentData: any;
onUpdate: (data: any) => void;
}
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<string, string> = {
consecutivo: "Número Consecutivo",
dta: "DTA (Derecho Trámite Aduanero)",
dtaexpo: "DTA Exportación",
subempresa: "Sub-Empresa / División",
patharch: "Generación de los archivos PDF por",
patharchtransmision: "Generación de archivos electrónicos por transmitir en",
pathtransexpo: "Ruta: Transmisión Exportación",
pathrespuesta: "Ruta: Respuestas SAAI",
patharchped: "Generación de archivos electrónicos para pedimentos en",
patharchpedconsm: "Ruta de los archivos TXT de los archivos previos para pedimentos consolidados",
pathgenimpotemp: "Ruta de los archivos CSV para importaciones",
pathgenexpo: "Ruta de los archivos CSV para exportación",
actseguridad: "Activar la seguridad del sistema",
controldes: "Asignar fecha límite para desactualizar facturas",
diadesactual: "Días para desactualizar facturas (Impo/Expo)",
diavencimiento: "Días de anticipación (vencimiento)",
mensajevenc: "Activar la advertencia de saldos vencidos",
fechades: "Fecha de Desactualización Automática",
factoriva: "Factor IVA (Aplica en compras)",
validasifra: "Validar Fracciones con SIFRA",
decimalespeso: "Peso neto y bruto",
decimalescant: "Cantidades",
decimalesvalor: "Valores y costos",
calvalbasetcped: "Cálculo en base al TC fecha pago (Importación)",
calvalbasetcpedexpo: "Cálculo en base al TC fecha pago (Exportación)",
filtrocantidad: "Omitir Cantidades con balance menor a",
muestraarchcodbarras: "Muestra archivo TXT al generar factura/remesa",
datoshist: "Permitir Datos Históricos",
tipovenro: "Tipo de validación para regla octava",
cantvenro: "Cantidad para validación (Porcentaje/Días)",
costoplanta: "Costo Directo en Planta",
firmapacking: "Esconder la firma en el packing list",
escondaamexpacking: "Esconde el agente aduanal mexicano en el packing list",
advertenciatm: "Advertencia del uso del tipo de moneda en facturas",
costoimpofijo: "Valida como inconsistencia si el costo de la parte es diferente al costo de la partida al actualizar la factura de importación",
tomarsaldosvenc: "Activar si desea tomar saldos temporales o vencidos para descargar",
valmanifusado: "Activar control de asignación de manifiestos en factura",
valparteexiste: "No mostrar ventanas de auto selección de partes y marcar error en caso de que no exista",
temporalfechapago: "Tomar temporalidad en base a la fecha de pago del pedimento",
muestra_copias_codbarras: "Imprimir código de barras en las demas copias, aparte de la copia del transportista",
mostrarpackinglistingles: "Mostrar packing list en inglés",
activar_revision_fracciones: "Activar revisión de fracciones",
transmitirfacalterna: "Transmitir Factura Alterna en VU",
deshabilitardescparte: "Deshabilitar la Descripción en Español del Número de Parte",
deshabilitardescparteing: "Deshabilitar la Descripción en Inglés del Número de Parte",
asignafracameparte: "Asignar Automáticamente Fracción Americana de Expo US Dutible en Base a la información de la Clase y Parte",
validadecencant: "En las Partidas de Factura se Restringe la Captura de Decimales en el Campo de Unidad de Medida Pza",
mostraradvertenciaro: "Mostrar Advertencia si el Costo del Permiso de Regla Octava es Diferente al Costo de la Partida al Momento de Guardarla",
mostraradvertenciarovalor: "Mostrar Advertencia si el Valor del Permiso de Regla Octava es Diferente al Valor de la Partida al Momento de Guardarla",
usartranspamedocame: "Mostrar Transportista Americano en vez del Mexicano en Packing List y Bill Of Lading de Exportación",
calcdutypacking: "Agregar el Valor de US Packing como Complemento del Valor Dutible para Exportación.",
parammultiples: "Activar Uso de Parámetros Multiples en Catálogos de Facturas Impo/Expo.",
fraccnivelpais: "Activar la Asignación de Fracción a Nivel Parte-Pais.",
valordllstcfacturaexpo: "Mostrar Valor en dolares conforme al Tipo de Cambio de Exportación (Facturas, Códigos de Barra y COVE)",
covefechaemision: "Tomar la fecha de Emision para la generación del COVE.",
usarcoveenarchsaaim3: "Usar COVE en Lugar del Número de Factura en el Archivo de Transferencia SAAIM3.",
interfaceaaconsolidada: "Generar la Interface Consolidada por Clase para el Agente Aduanal.",
incluirobscoveobsimpo: "Incluir las Observaciones del COVE en las Observaciones en Importación.",
activarcatalogofraccionesamericanassifra: "Activar Catálogo Fracciones Americanas Sifra",
mostrarprogramaimmexprosec: "Mostrar Autorización Prosec en Reportes de Saldos y Descargos",
costounitarioporempaquefac: "Mostrar Costo Unitario Por Empaque en Impresión de Facturas de Exportación",
actvaloragre: "Activar Valor Agregado General",
valoragregadogen: "Valor Agregado General",
interfaceaatcfpff: "En Interfaces (WINSAAI, SAAIM3), Usar Tipo de Cambio de:",
agregarincreimpo: "Agregar Incrementables, Fecha de Emisión y Factor Tipo de Cambio en Facturas de Importación",
componentebom: "No Permitir Capturar Componentes Diferentes en BOMs (Materias Primas)",
limitesubensamble: "Límite Sub Ensamble",
partesypedimentosporcliente: "Agregar y Filtrar Catálogo de Partes y Pedimentos por Cliente",
mensajesvurfc: "Desactivar Mensajes de RFC en transmisión de VU",
omitirempaqueencodigobarras: "Omitir en el Código de Barras el Valor del Empaque",
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",
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",
incluirremesaeninterfazaawinsaai: "Incluir Remesa en Interfaz AA (WINSAAI)",
cambiarpesosporcostounitario: "Cambiar Pesos Por Costo Unitario en Exportaciones Mexicanas y Bilingües",
utilizarsolopartesnaftaenco: "Utilizar Solo Partes Nafta En CO",
bloqueodeediciondefacturas: "Bloqueo De Edición De Facturas",
reasignafraccionclase: "Reasigna Fracción en Reporte de Descargos",
calcularcostounitarioenbaseavalortotal: "Calcula Costo Unitario en Base a Valor Total Capturado",
parametroauxiliar: "Seleccionar versión de B.O.M a Descargar",
usarcontroldefechasdeversion: "Control de Versiones de Bom por Fechas",
desactivaciondemodulos: "Activar/Desactivar Módulos",
restringepaisimpo: "Restringir país de Korea para operaciones de Importación.",
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",
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.",
usarfactorconversionpornumerodeparte: "Usar Factor de Conversión Por Número De Parte",
usartcdelafechapagopedimpoendescarga: "Usar Tipo de Cambio de la Fecha de Pago Pedimento de Importación en Descarga",
usarvude128o256: "Utilizar Ventanilla Unica con Encriptacion de 256",
agregarnumeroembarque: "Agregar Número Embarque",
utilizarumdeexistenciaentransmisionvu: "Utilizar UM de Existencia En Transmision VU",
utilizarcodigodebrokerdeclienteenmainx30: "Utilizar Codigo De Broker De Cliente En Main X 30",
hojacalculosepararincrementablesanexo3: "En la Hoja de Calculo Separar Incrementables en el Anexo 3",
hojacalculodesglosefacturaanexo3: "En la Hoja de Calculo Desglosar Facturas en el Anexo 3",
usarvaloragregadoenfacturaamericana: "Usar Valor Agregado En Factura Americana",
ocultarinformacionfraccion: "Ocultar Información Fracción",
resaltarsaldostempconcolor: "Resaltar Saldos Temporales con Color",
validarsectorprosecr8: "Validar Sector Prosec R8",
agregarsubtotalinterfazaa: "Agregar Sub Total al archivo TXT para la Interfaz del Agente Aduanal",
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"
};
// Grouped sections for the "General" tab
const GENERAL_SECTIONS = [
{
title: 'Parámetros del Sistema',
fields: ['factoriva', 'actseguridad']
},
{
title: 'Advertencias de Vencimiento',
fields: ['mensajevenc', 'diavencimiento']
},
{
title: 'Tipos de Cambio',
fields: ['calvalbasetcped', 'calvalbasetcpedexpo']
},
{
title: 'Desactualización de Facturas',
fields: ['controldes', 'diadesactual']
},
{
title: 'Número de decimales en reportes generales en',
fields: ['decimalespeso', 'decimalescant', 'decimalesvalor']
},
{
title: 'Filtrar por la cantidad',
fields: ['filtrocantidad']
},
{
title: 'Código de barras',
fields: ['muestraarchcodbarras']
}
];
// Grouped sections for "Archivos electrónicos" tab
const ARCHIVOS_SECTIONS = [
{
title: 'Gestión de Archivos PDF y Electrónicos',
fields: [
'patharch',
'patharchtransmision',
'patharchped',
'pathgenimpotemp',
'pathgenexpo',
'patharchpedconsm',
]
}
];
// Grouped sections for "Continuación" tab
const CONTINUACION_SECTIONS = [
{
title: 'Tipo de validación para regla octava',
fields: ['tipovenro', 'cantvenro']
},
{
title: 'Parámetros Adicionales y Visualización',
fields: [
'firmapacking',
'escondaamexpacking',
'advertenciatm',
'costoimpofijo',
'tomarsaldosvenc',
'valmanifusado',
'valparteexiste',
'temporalfechapago',
'muestra_copias_codbarras',
'mostrarpackinglistingles',
'activar_revision_fracciones'
]
}
];
// Grouped sections for "Cont 2" tab
const CONT2_SECTIONS = [
{
title: 'Configuraciones de Pantalla y Validación Avanzada',
fields: [
'deshabilitardescparte',
'deshabilitardescparteing',
'asignafracameparte',
'validadecencant',
'mostraradvertenciaro',
'mostraradvertenciarovalor',
'usartranspamedocame',
'calcdutypacking',
'parammultiples',
'fraccnivelpais',
'valordllstcfacturaexpo',
'covefechaemision',
'usarcoveenarchsaaim3',
'interfaceaaconsolidada',
'incluirobscoveobsimpo'
]
}
];
// Sections for "Cont 3" tab
const CONT3_SECTIONS = [
{
id: 'interface_tc',
title: 'Tipo de Cambio en Interfaces',
fields: ['interfaceaatcfpff']
},
{
id: 'config_general',
title: 'Opciones de Configuración General',
fields: [
'agregarincreimpo',
'componentebom',
'limitesubensamble',
'partesypedimentosporcliente',
'mensajesvurfc',
'omitirempaqueencodigobarras'
]
},
{
id: 'rutas_pdf',
title: 'Rutas y Archivos PDF',
fields: [
'actpdfreportes',
'patharchpdfimpo',
'patharchpdfexpo'
]
}
];
// Sections for "Cont 4" tab
const CONT4_SECTIONS = [
{
id: 'ftp_master',
title: 'Activación y Frecuencia',
fields: ['DownloadFTP', 'MinsDownLFTP']
},
{
id: 'ftp_destino',
title: 'Destino de Descarga',
fields: ['DownloadFTPPath']
},
{
id: 'ftp_origen',
title: 'Origen de Descarga',
fields: ['DescargarFTPoLocal']
},
{
id: 'ftp_config',
title: 'Configuración FTP',
fields: ['ServerFTP', 'UserFTP', 'PasswordFTP', 'DirectorioFTP']
},
{
id: 'local_config',
title: 'Configuración de Ruta Local',
fields: ['PathLocalParaDescDe']
},
{
id: 'additional_options',
title: 'Opciones Adicionales',
fields: ['AgregarRemplazarAutomatico', 'ActivarProcesoVEquipment', 'ActivarProcesoDesperdicioJDEdwards']
}
];
// Sections for redefined "Cont 5" tab
const CONT5_SECTIONS = [
{
id: 'restricciones',
title: 'Restricciones y Bloqueos Iniciales',
fields: ['restringepaisimpo', 'restringpaisexpo', 'bloqueoaldesactivarnumerodeparte']
},
{
id: 'inv_inicial',
title: 'Inventario Inicial (Agrupación)',
fields: ['geninformeanexo31']
},
{
id: 'config_adicionales',
title: 'Configuraciones Adicionales',
fields: [
'UsarFechaEmisionFactura',
'utilizarfechapagopeddeundiaanterior',
'utilizartitulosalternativosimpresionfactura',
'utilizarequivalenciasdeumpornumerodeparte',
'usarfactorconversionpornumerodeparte',
'usartcdelafechapagopedimpoendescarga',
'usarvude128o256',
'agregarnumeroembarque',
'utilizarumdeexistenciaentransmisionvu',
'utilizarcodigodebrokerdeclienteenmainx30',
'hojacalculosepararincrementablesanexo3',
'hojacalculodesglosefacturaanexo3'
]
}
];
// Sections for redefined "Cont 6" tab
const CONT6_SECTIONS = [
{
id: 'configuracion',
title: 'Opciones de Configuración',
fields: [
'usarvaloragregadoenfacturaamericana',
'ocultarinformacionfraccion',
'resaltarsaldostempconcolor',
'validarsectorprosecr8',
'agregarsubtotalinterfazaa',
'utilizarnombregenericomainx30',
'utilizartcrespectoatipoped',
'tomardecimalescompletos',
'cambiarpesosporcostounitario',
'utilizarsolopartesnaftaenco',
'bloqueodeediciondefacturas',
'reasignafraccionclase',
'calcularcostounitarioenbaseavalortotal',
'parametroauxiliar',
'usarcontroldefechasdeversion',
'imprimirfacturaalterna',
'informacionamericanasubtotal'
]
},
{
id: 'acciones_modulos',
title: 'Acciones y Módulos',
fields: [
'desactivaciondemodulos',
'activarexpedienteelectronico',
'Campo18Valsaaim3'
]
}
];
// Grouped sections for "Cont 7" tab
const CONT7_SECTIONS = [
{
title: 'Configuraciones de Fracciones y Transmisión',
fields: [
'activarcatalogofraccionesamericanassifra',
'mostrarprogramaimmexprosec',
'costounitarioporempaquefac',
'transmitirfacalterna'
]
}
];
const TABS = [
{ id: 'general', label: 'General' },
{ id: 'archivos', label: 'Archivos electrónicos' },
{ id: 'continuacion', label: 'Continuación' },
{ id: 'cont2', label: 'Cont 2' },
{ id: 'cont3', label: 'Cont 3' },
{ id: 'cont4', label: 'Cont 4' },
{ id: 'cont5', label: 'Cont 5' },
{ id: 'cont6', label: 'Cont 6' },
{ id: 'cont7', label: 'cont 7' }
];
// Options for the rule validator select
const RULE_VALIDATOR_OPTIONS = [
{ value: 'Porcentaje', label: 'Porcentaje' },
{ value: 'Dias', label: 'Días' },
{ value: 'No aplica', label: 'No aplica' }
];
// Options for the interface TC radio buttons
const INTERFACE_TC_OPTIONS = [
{ value: 'P', label: 'Fecha de Pago' },
{ value: 'F', label: 'Fecha de Factura' }
];
// Options for radio groups in Cont 4
const YES_NO_OPTIONS = [
{ value: 'Si', label: 'Si' },
{ value: 'No', label: 'No' }
];
const FTP_LOCAL_OPTIONS = [
{ value: 'FTP', label: 'FTP' },
{ value: 'Ruta Local', label: 'Ruta Local' }
];
// Options for Inventario Inicial in Cont 5
const INICIAL_INV_OPTIONS = [
{ value: 'AMBOS', label: 'AMBOS' },
{ value: 'SCAII', label: 'SCAII' },
{ value: 'SCAF', label: 'SCAF' }
];
</script>
<div class="h-full flex flex-col bg-[#080808] rounded-2xl border border-white/5 overflow-hidden shadow-2xl">
<Tabs.Root value="general" class="flex flex-col h-full">
<Tabs.List class="flex flex-wrap gap-1 p-3 bg-black/60 border-b border-white/5 h-auto">
{#each TABS as tab}
<Tabs.Trigger
value={tab.id}
class="px-5 py-2.5 text-xs font-bold uppercase tracking-wider data-[state=active]:bg-primary data-[state=active]:text-white rounded-lg opacity-40 data-[state=active]:opacity-100 hover:opacity-70"
>
{tab.label}
</Tabs.Trigger>
{/each}
</Tabs.List>
<Tabs.Content value="general" class="flex-1 overflow-hidden p-0 m-0 bg-transparent">
<div class="h-full w-full overflow-y-scroll custom-scrollbar p-6 space-y-12 min-h-[600px]">
{#each GENERAL_SECTIONS as section}
<div class="space-y-4">
<div class="flex items-center gap-4">
<h3 class="text-xs font-bold uppercase tracking-[0.2em] text-primary/80 whitespace-nowrap">
{section.title}
</h3>
<div class="h-[1px] w-full bg-gradient-to-r from-primary/20 to-transparent"></div>
</div>
<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6">
{#each section.fields as field}
<SettingFormField
key={field}
label={FIELD_LABELS[field] || field}
value={formData[field]}
onChange={(val) => handleFieldChange(field, val)}
/>
{/each}
</div>
</div>
{/each}
</div>
</Tabs.Content>
<Tabs.Content value="archivos" class="flex-1 overflow-hidden p-0 m-0 bg-transparent">
<div class="h-full w-full overflow-y-scroll custom-scrollbar p-6 space-y-8 min-h-[600px]">
{#each ARCHIVOS_SECTIONS as section}
<div class="space-y-6 max-w-3xl mx-auto">
<div class="flex items-center gap-4">
<h3 class="text-xs font-bold uppercase tracking-[0.2em] text-primary/80 whitespace-nowrap">
{section.title}
</h3>
<div class="h-[1px] w-full bg-gradient-to-r from-primary/20 to-transparent"></div>
</div>
<div class="grid grid-cols-1 gap-4">
{#each section.fields as field}
<SettingFormField
key={field}
label={FIELD_LABELS[field] || field}
value={formData[field]}
onChange={(val) => handleFieldChange(field, val)}
/>
{/each}
</div>
</div>
{/each}
</div>
</Tabs.Content>
<Tabs.Content value="continuacion" class="flex-1 overflow-hidden p-0 m-0 bg-transparent">
<div class="h-full w-full overflow-y-scroll custom-scrollbar p-6 space-y-12 min-h-[600px]">
{#each CONTINUACION_SECTIONS as section}
<div class="space-y-4">
<div class="flex items-center gap-4">
<h3 class="text-xs font-bold uppercase tracking-[0.2em] text-primary/80 whitespace-nowrap">
{section.title}
</h3>
<div class="h-[1px] w-full bg-gradient-to-r from-primary/20 to-transparent"></div>
</div>
<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6">
{#each section.fields as field}
<SettingFormField
key={field}
label={FIELD_LABELS[field] || field}
value={formData[field]}
onChange={(val) => handleFieldChange(field, val)}
options={field === 'tipovenro' ? RULE_VALIDATOR_OPTIONS : undefined}
/>
{/each}
</div>
</div>
{/each}
</div>
</Tabs.Content>
<Tabs.Content value="cont2" class="flex-1 overflow-hidden p-0 m-0 bg-transparent">
<div class="h-full w-full overflow-y-scroll custom-scrollbar p-6 space-y-8 min-h-[600px]">
{#each CONT2_SECTIONS as section}
<div class="space-y-6 max-w-4xl mx-auto">
<div class="flex items-center gap-4">
<h3 class="text-xs font-bold uppercase tracking-[0.2em] text-primary/80 whitespace-nowrap">
{section.title}
</h3>
<div class="h-[1px] w-full bg-gradient-to-r from-primary/20 to-transparent"></div>
</div>
<div class="grid grid-cols-1 gap-4">
{#each section.fields as field}
<SettingFormField
key={field}
label={FIELD_LABELS[field] || field}
value={formData[field]}
onChange={(val) => handleFieldChange(field, val)}
/>
{/each}
</div>
</div>
{/each}
</div>
</Tabs.Content>
<Tabs.Content value="cont3" class="flex-1 overflow-hidden p-0 m-0 bg-transparent">
<div class="h-full w-full overflow-y-scroll custom-scrollbar p-6 space-y-12 min-h-[600px]">
{#each CONT3_SECTIONS as section}
<div class="space-y-6 max-w-4xl mx-auto">
<div class="flex items-center gap-4">
<h3 class="text-xs font-bold uppercase tracking-[0.2em] text-primary/80 whitespace-nowrap">
{section.title}
</h3>
<div class="h-[1px] w-full bg-gradient-to-r from-primary/20 to-transparent"></div>
</div>
<div class="grid grid-cols-1 gap-4">
{#each section.fields as field}
<SettingFormField
key={field}
label={FIELD_LABELS[field] || field}
value={formData[field]}
onChange={(val) => handleFieldChange(field, val)}
type={
field === 'interfaceaatcfpff' ? 'radio' :
(field === 'limitesubensamble' ? 'input' :
(['agregarincreimpo', 'componentebom', 'partesypedimentosporcliente'].includes(field) ? 'switch' : undefined))
}
options={field === 'interfaceaatcfpff' ? INTERFACE_TC_OPTIONS : undefined}
/>
{/each}
</div>
</div>
{/each}
</div>
</Tabs.Content>
<Tabs.Content value="cont4" class="flex-1 overflow-hidden p-0 m-0 bg-transparent">
<div class="h-full w-full overflow-y-scroll custom-scrollbar p-6 space-y-8 min-h-[600px]">
<div class="max-w-4xl mx-auto space-y-12">
<div class="space-y-6 p-6 rounded-2xl border border-white/5 bg-white/[0.01]">
{#each CONT4_SECTIONS.filter(s => s.id !== 'additional_options') as section}
<div class="space-y-6">
<div class="flex items-center gap-4">
<h3 class="text-xs font-bold uppercase tracking-[0.2em] text-primary/80 whitespace-nowrap">
{section.title}
</h3>
<div class="h-[1px] w-full bg-gradient-to-r from-primary/20 to-transparent"></div>
</div>
<div class="grid grid-cols-1 md:grid-cols-2 gap-6">
{#each section.fields as field}
<SettingFormField
key={field}
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' :
undefined
}
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' :
undefined
}
{...(section.id === 'ftp_config' && formData.DescargarFTPoLocal === 'Ruta Local' ? { disabled: true } : {})}
{...(section.id === 'local_config' && formData.DescargarFTPoLocal === 'FTP' ? { disabled: true } : {})}
/>
{/each}
</div>
</div>
{/each}
</div>
<!-- Outside Options -->
<div class="space-y-6">
<div class="flex items-center gap-4">
<h3 class="text-xs font-bold uppercase tracking-[0.2em] text-white/40 whitespace-nowrap">
Opciones Adicionales
</h3>
<div class="h-[1px] w-full bg-gradient-to-r from-white/10 to-transparent"></div>
</div>
<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6">
{#each CONT4_SECTIONS.find(s => s.id === 'additional_options')?.fields || [] as field}
<SettingFormField
key={field}
label={FIELD_LABELS[field] || field}
value={formData[field]}
onChange={(val) => handleFieldChange(field, val)}
/>
{/each}
</div>
</div>
</div>
</div>
</Tabs.Content>
<Tabs.Content value="cont5" class="flex-1 overflow-hidden p-0 m-0 bg-transparent">
<div class="h-full w-full overflow-y-scroll custom-scrollbar p-6 space-y-12 min-h-[600px]">
<div class="max-w-4xl mx-auto space-y-12">
{#each CONT5_SECTIONS as section}
<div class="space-y-6 p-6 rounded-2xl border border-white/5 bg-white/[0.01]">
<div class="flex items-center gap-4">
<h3 class="text-xs font-bold uppercase tracking-[0.2em] text-primary/80 whitespace-nowrap">
{section.title}
</h3>
<div class="h-[1px] w-full bg-gradient-to-r from-primary/20 to-transparent"></div>
</div>
<div class="grid grid-cols-1 {section.id === 'inv_inicial' ? '' : 'md:grid-cols-2 lg:grid-cols-3'} gap-6">
{#each section.fields as field}
<SettingFormField
key={field}
label={FIELD_LABELS[field] || field}
value={formData[field]}
onChange={(val) => handleFieldChange(field, val)}
type={
field === 'geninformeanexo31' ? 'radio' :
(['UsarFechaEmisionFactura', 'agregarnumeroembarque', 'hojacalculosepararincrementablesanexo3', 'hojacalculodesglosefacturaanexo3'].includes(field) ? 'switch' : undefined)
}
options={field === 'geninformeanexo31' ? INICIAL_INV_OPTIONS : undefined}
/>
{/each}
</div>
</div>
{/each}
</div>
</div>
</Tabs.Content>
<Tabs.Content value="cont6" class="flex-1 overflow-hidden p-0 m-0 bg-transparent">
<div class="h-full w-full overflow-y-scroll custom-scrollbar p-6 min-h-[600px]">
<div class="max-w-5xl mx-auto grid grid-cols-1 lg:grid-cols-2 gap-12">
<!-- Columna Izquierda: Opciones de Configuración -->
<div class="space-y-8">
<div class="flex items-center gap-4">
<h3 class="text-xs font-bold uppercase tracking-[0.2em] text-primary/80 whitespace-nowrap">
Opciones de Configuración
</h3>
<div class="h-[1px] w-full bg-gradient-to-r from-primary/20 to-transparent"></div>
</div>
<div class="space-y-4">
{#each CONT6_SECTIONS.find(s => s.id === 'configuracion')?.fields || [] as field}
<div class="{field === 'usarcontroldefechasdeversion' ? 'ml-8 opacity-60' : ''} transition-opacity">
<SettingFormField
key={field}
label={FIELD_LABELS[field] || field}
value={formData[field]}
onChange={(val) => handleFieldChange(field, val)}
disabled={field === 'usarcontroldefechasdeversion' && !formData.parametroauxiliar}
type="switch"
/>
</div>
{/each}
</div>
</div>
<!-- Columna Derecha: Acciones y Módulos -->
<div class="space-y-12">
<!-- Módulos -->
<div class="space-y-8">
<div class="flex items-center gap-4">
<h3 class="text-xs font-bold uppercase tracking-[0.2em] text-primary/80 whitespace-nowrap">
Módulos del Sistema
</h3>
<div class="h-[1px] w-full bg-gradient-to-r from-primary/20 to-transparent"></div>
</div>
<div class="space-y-4">
{#each CONT6_SECTIONS.find(s => s.id === 'acciones_modulos')?.fields || [] as field}
<SettingFormField
key={field}
label={FIELD_LABELS[field] || field}
value={formData[field]}
onChange={(val) => handleFieldChange(field, val)}
type={field === 'Campo18Valsaaim3' ? 'switch' : undefined}
/>
{/each}
</div>
</div>
<!-- Acciones -->
<div class="space-y-8">
<div class="flex items-center gap-4">
<h3 class="text-xs font-bold uppercase tracking-[0.2em] text-white/40 whitespace-nowrap">
Acciones de Gestión
</h3>
<div class="h-[1px] w-full bg-gradient-to-r from-white/10 to-transparent"></div>
</div>
<div class="grid grid-cols-1 gap-4">
<Button variant="outline" class="w-full flex items-center justify-start gap-4 h-12 rounded-xl border-white/5 bg-white/[0.02] hover:bg-white/[0.05] text-white/80 group">
<AlertTriangle class="w-5 h-5 text-red-500 group-hover:scale-110 transition-transform" />
Eliminar Accesos Abiertos
</Button>
<Button variant="outline" class="w-full flex items-center justify-start gap-4 h-12 rounded-xl border-white/5 bg-white/[0.02] hover:bg-white/[0.05] text-white/80 group">
<CreditCard class="w-5 h-5 text-primary group-hover:scale-110 transition-transform" />
Asignar Formas de Pago Para Anexo 31
</Button>
<Button variant="outline" class="w-full flex items-center justify-start gap-4 h-12 rounded-xl border-white/5 bg-white/[0.02] hover:bg-white/[0.05] text-white/80 group">
<FileEdit class="w-5 h-5 text-primary group-hover:scale-110 transition-transform" />
Corrección de partidas expo
</Button>
<Button variant="outline" class="w-full flex items-center justify-start gap-4 h-12 rounded-xl border-white/5 bg-white/[0.02] hover:bg-white/[0.05] text-white/80 group">
<RefreshCw class="w-5 h-5 text-primary group-hover:scale-110 transition-transform" />
Actualizar Tarifa
</Button>
</div>
</div>
</div>
</div>
</div>
</Tabs.Content>
<Tabs.Content value="cont7" class="flex-1 overflow-hidden p-0 m-0 bg-transparent">
<div class="h-full w-full overflow-y-scroll custom-scrollbar p-6 space-y-8 min-h-[600px]">
{#each CONT7_SECTIONS as section}
<div class="space-y-6 max-w-4xl mx-auto">
<div class="flex items-center gap-4">
<h3 class="text-xs font-bold uppercase tracking-[0.2em] text-primary/80 whitespace-nowrap">
{section.title}
</h3>
<div class="h-[1px] w-full bg-gradient-to-r from-primary/20 to-transparent"></div>
</div>
<div class="grid grid-cols-1 gap-4">
<!-- Especial Row: Activar Valor Agregado Gral + Numeric Input -->
<div class="flex flex-col md:flex-row items-center gap-4 p-4 rounded-xl border border-white/5 bg-white/[0.02]">
<div class="flex-1">
<SettingFormField
key="actvaloragre"
label={FIELD_LABELS.actvaloragre}
value={formData.actvaloragre}
onChange={(val) => handleFieldChange('actvaloragre', val)}
/>
</div>
<div class="w-full md:w-32">
<SettingFormField
key="valoragregadogen"
label={FIELD_LABELS.valoragregadogen}
value={formData.valoragregadogen}
onChange={(val) => handleFieldChange('valoragregadogen', val)}
type="input"
/>
</div>
</div>
{#each section.fields as field}
<SettingFormField
key={field}
label={FIELD_LABELS[field] || field}
value={formData[field]}
onChange={(val) => handleFieldChange(field, val)}
/>
{/each}
</div>
</div>
{/each}
</div>
</Tabs.Content>
</Tabs.Root>
</div>
<style>
:global([data-radix-scroll-area-viewport]) {
scrollbar-width: none;
-ms-overflow-style: none;
}
:global([data-radix-scroll-area-viewport]::-webkit-scrollbar) {
display: none;
}
</style>