from typing import Optional, Any, Dict
from pydantic import BaseModel, Field
from decimal import Decimal

# --- Legacy Table Domains (Tarea 1) ---

class SSisGenSettings(BaseModel):
    """
    Legacy Table: SSisGen
    General system parameters migrated from Clarion/WinDev.
    """
    consecutivo: Optional[int] = None
    dta: Optional[int] = None
    dtaexpo: Optional[int] = None
    subempresa: Optional[str] = None
    patharch: Optional[str] = None
    patharchtransmision: Optional[str] = None
    pathtransexpo: Optional[str] = None
    pathrespuesta: Optional[str] = None
    patharchped: Optional[str] = None
    patharchpedconsm: Optional[str] = None
    pathgenimpotemp: Optional[str] = None
    pathgenexpo: Optional[str] = None
    actseguridad: Optional[int] = None
    controldes: Optional[int] = None
    diadesactual: Optional[int] = None
    diavencimiento: Optional[int] = None
    mensajevenc: Optional[int] = None
    fechades: Optional[int] = None
    factoriva: Optional[Decimal] = None
    validasifra: Optional[int] = None
    decimalespeso: Optional[int] = None
    decimalescant: Optional[int] = None
    decimalesvalor: Optional[int] = None
    calvalbasetcped: Optional[int] = None
    calvalbasetcpedexpo: Optional[int] = None
    filtrocantidad: Optional[Decimal] = None
    muestraarchcodbarras: Optional[int] = None
    datoshist: Optional[int] = None
    tipovenro: Optional[str] = None
    cantvenro: Optional[int] = None
    costoplanta: Optional[Decimal] = None
    firmapacking: Optional[int] = None
    advertenciatm: Optional[int] = None
    tomarsaldosvenc: Optional[int] = None
    costoimpofijo: Optional[int] = None
    valparteexiste: Optional[int] = None
    valmanifusado: Optional[int] = None
    temporalfechapago: Optional[int] = None
    asignadiasantdesc: Optional[int] = None
    diasantdesc: Optional[int] = None
    deshabilitardescparte: Optional[int] = None
    deshabilitardescparteing: Optional[int] = None
    asignafracameparte: Optional[int] = None
    validadecencant: Optional[int] = None
    usartranspamedocame: Optional[int] = None
    mostraradvertenciaro: Optional[int] = None
    escondaamexpacking: Optional[int] = None
    calcdutypacking: Optional[int] = None
    parammultiples: Optional[int] = None
    fraccnivelpais: Optional[int] = None
    covefechaemision: Optional[int] = None
    valordllstcfacturaexpo: Optional[int] = None
    interfaceaaconsolidada: Optional[int] = None
    interfaceaatcfpff: Optional[str] = None
    incluirobscoveobsimpo: Optional[int] = None
    agregarincreimpo: Optional[int] = None
    componentebom: Optional[int] = None
    limitesubensamble: Optional[int] = None
    actpdfreportes: Optional[int] = None
    patharchpdfimpo: Optional[str] = None
    patharchpdfexpo: Optional[str] = None
    noimprimircons: Optional[int] = None
    mostraradvertenciarovalor: Optional[int] = None
    partesypedimentosporcliente: Optional[str] = None
    mensajesvurfc: Optional[int] = None
    mostrarpackinglistingles: Optional[int] = None
    omitirempaqueencodigobarras: Optional[int] = None
    restringepaisimpo: Optional[int] = None
    bloqueoaldesactivarnumerodeparte: Optional[int] = None
    restringpaisexpo: Optional[int] = None
    geninformeanexo31: Optional[str] = None
    utilizarfechapagopeddeundiaanterior: Optional[int] = None
    utilizarequivalenciasdeumpornumerodeparte: Optional[int] = None
    utilizartitulosalternativosimpresionfactura: Optional[int] = None
    usarfactorconversionpornumerodeparte: Optional[int] = None
    usarvude128o256: Optional[int] = None
    usartcdelafechapagopedimpoendescarga: Optional[int] = None
    solicitarcontrasenaadministrador: Optional[int] = None
    agregarnumeroembarque: Optional[int] = None
    utilizarumdeexistenciaentransmisionvu: Optional[int] = None
    utilizarcodigodebrokerdeclienteenmainx30: Optional[int] = None
    hojacalculosepararincrementablesanexo3: Optional[int] = None
    hojacalculodesglosefacturaanexo3: Optional[int] = None
    usarvaloragregadoenfacturaamericana: Optional[int] = None
    ocultarinformacionfraccion: Optional[int] = None
    resaltarsaldostempconcolor: Optional[int] = None
    valoragregadoenfacturamexicana: Optional[int] = None
    validarsectorprosecr8: Optional[int] = None
    agregarsubtotalinterfazaa: Optional[int] = None
    utilizarnombregenericomainx30: Optional[int] = None
    utilizartcrespectoatipoped: Optional[int] = None
    tomardecimalescompletos: Optional[int] = None
    incluirremesaeninterfazaawinsaai: Optional[int] = None
    cambiarpesosporcostounitario: Optional[int] = None
    utilizarsolopartesnaftaenco: Optional[int] = None
    bloqueodeediciondefacturas: Optional[int] = None
    reasignafraccionclase: Optional[int] = None
    calcularcostounitarioenbaseavalortotal: Optional[int] = None
    parametroauxiliar: Optional[int] = None
    usarcontroldefechasdeversion: Optional[int] = None
    desactivaciondemodulos: Optional[int] = None
    imprimirfacturaalterna: Optional[int] = None
    activarexpedienteelectronico: Optional[int] = None
    activarcatalogofraccionesamericanassifra: Optional[int] = None
    informacionamericanasubtotal: Optional[int] = None
    mostrarprogramaimmexprosec: Optional[int] = None
    costounitarioporempaquefac: Optional[int] = None
    transmitirfacalterna: Optional[int] = None
    muestra_copias_codbarras: Optional[int] = None
    activar_revision_fracciones: Optional[int] = None
    usarcoveenarchsaaim3: Optional[int] = None
    downloadftp: Optional[str] = None
    minsdownlftp: Optional[int] = None
    downloadftppath: Optional[str] = None
    descargarftpolocal: Optional[str] = None
    serverftp: Optional[str] = None
    userftp: Optional[str] = None
    passwordftp: Optional[str] = None
    directorioftp: Optional[str] = None
    pathlocalparadescde: Optional[str] = None
    agregarremplazarautomatico: Optional[str] = None
    activarprocesovequipment: Optional[int] = None
    activarprocesodesperdiciojdedwards: Optional[int] = None
    usarfechaemisionfactura: Optional[int] = None
    campo18valsaaim3: Optional[int] = None
    actvaloragre: Optional[int] = None
    valoragregadogen: Optional[Decimal] = None
    validarseries: Optional[int] = None
    emailas: Optional[int] = None
    afostrofe: Optional[int] = None
    codigobarrasesp: Optional[int] = None
    asignainfoparte: Optional[int] = None
    pathnaftaccs: Optional[str] = None



class SSisGen2Settings(BaseModel):
    """
    Legacy Table: SSisGen2
    Extended system parameters.
    """
    consecutivo: Optional[int] = None
    actvaloragre: Optional[int] = None
    valoragregadogen: Optional[Decimal] = None


class SSisGen3Settings(BaseModel):
    """
    Legacy Table: SSisGen3
    Additional name-value parameters.
    """
    parametro: Optional[str] = None
    valorparametro: Optional[int] = None


class SSisMexSettings(BaseModel):
    """Legacy Table: SSisMex (Mexican Purchases)"""
    consecutivo: Optional[int] = None
    prefijocm: Optional[str] = None
    consecutivocm: Optional[str] = None
    porparteclasemex: Optional[str] = None
    porparteclaseame: Optional[str] = None
    proveedor: Optional[str] = None
    vendidoconsignado: Optional[str] = None
    vendidoa: Optional[str] = None
    enviadotransferido: Optional[str] = None
    enviadoa: Optional[str] = None
    flete: Optional[Decimal] = None
    paisorigenmex: Optional[int] = None
    numpartemex: Optional[int] = None
    firmafmex: Optional[str] = None
    fraccionimp: Optional[int] = None
    tipofraccmex: Optional[int] = None
    tasafraccmex: Optional[int] = None
    umequivalentemex: Optional[int] = None
    numparteame: Optional[int] = None
    fraccioname: Optional[int] = None
    paisorigename: Optional[int] = None
    umequivalenteame: Optional[int] = None
    firmafame: Optional[str] = None
    impordencomp: Optional[int] = None
    decimalespeso: Optional[int] = None
    decimalescant: Optional[int] = None
    decimalesvalor: Optional[int] = None
    decimalescosto: Optional[int] = None
    tipomoneda: Optional[str] = None
    clavemoneda: Optional[str] = None
    umauxiliarmex: Optional[int] = None
    umalternamex: Optional[int] = None
    transportista: Optional[str] = None
    conductor: Optional[str] = None
    transporte: Optional[str] = None
    numtransporte: Optional[str] = None
    observacione: Optional[str] = None
    observacioni: Optional[str] = None
    clavebultos: Optional[str] = None
    packingordencompra: Optional[int] = None
    firmaelectronica: Optional[str] = None
    incluirlineadelpo: Optional[int] = None
    lineapersonaaa: Optional[int] = None
    agregarvaenprodterminados: Optional[int] = None
    ocultarfechahora: Optional[int] = None


class SSisDefSettings(BaseModel):
    """Legacy Table: SSisDef (Definitive Import)"""
    consecutivo: Optional[int] = None
    prefijoimpo: Optional[str] = None
    consecutivoimpo: Optional[str] = None
    porparteclasemex: Optional[str] = None
    porparteclaseame: Optional[str] = None
    pedimento: Optional[str] = None
    tipo: Optional[str] = None
    proveedor: Optional[str] = None
    vendidoconsignado: Optional[str] = None
    vendidoa: Optional[str] = None
    enviadotransferido: Optional[str] = None
    enviadoa: Optional[str] = None
    aaduanal: Optional[str] = None
    incoterm: Optional[str] = None
    flete: Optional[Decimal] = None
    identificador: Optional[str] = None
    firmafmex: Optional[str] = None
    firmafame: Optional[str] = None
    codigobarras: Optional[int] = None
    numpartemex: Optional[int] = None
    numparteame: Optional[int] = None
    fraccionimp: Optional[int] = None
    tasafraccmex: Optional[int] = None
    tipofraccmex: Optional[int] = None
    paisorigenmex: Optional[int] = None
    umequivalentemex: Optional[int] = None
    umauxiliarmex: Optional[int] = None
    fraccioname: Optional[int] = None
    paisorigename: Optional[int] = None
    umequivalenteame: Optional[int] = None
    impordencomp: Optional[int] = None
    decimalespeso: Optional[int] = None
    decimalescant: Optional[int] = None
    decimalesvalor: Optional[int] = None
    decimalescosto: Optional[int] = None
    tipomoneda: Optional[str] = None
    clavemoneda: Optional[str] = None
    cantlimite: Optional[Decimal] = None
    pesolimite: Optional[Decimal] = None
    valorlimite: Optional[Decimal] = None
    umalternamex: Optional[int] = None
    restringeimpopt: Optional[int] = None
    partecomplementariamex: Optional[int] = None
    pagoimpuesto: Optional[str] = None
    formapago: Optional[str] = None
    metvalor: Optional[str] = None
    transportista: Optional[str] = None
    aaduanalame: Optional[str] = None
    conductor: Optional[str] = None
    transporte: Optional[str] = None
    numtransporte: Optional[str] = None
    packingpedclave: Optional[int] = None
    porordenporocpack: Optional[str] = None
    actualizarpartepartida: Optional[int] = None
    observacione: Optional[str] = None
    observacioni: Optional[str] = None
    clavebultos: Optional[str] = None
    partecomplemexpartida: Optional[int] = None
    cantlimitemin: Optional[Decimal] = None
    pesolimitemin: Optional[Decimal] = None
    valorlimitemin: Optional[Decimal] = None
    packingordencompra: Optional[int] = None
    firmaelectronica: Optional[str] = None
    solicitarcontrasenaadministrador: Optional[int] = None
    incluirlineadelpo: Optional[int] = None
    lineapersonaaa: Optional[int] = None
    agregarvaenprodterminados: Optional[int] = None
    imprimirlote: Optional[int] = None
    imprimirnumentrada: Optional[int] = None
    ocultarfechahora: Optional[int] = None


class SSisExpoSettings(BaseModel):
    """Legacy Table: SSisExpo (Exports)"""
    tipofactura: Optional[str] = None
    porparteclasemex: Optional[str] = None
    porparteclaseame: Optional[str] = None
    prefijoexpo: Optional[str] = None
    consecutivoexpo: Optional[str] = None
    pedimento: Optional[str] = None
    proveedor: Optional[str] = None
    vendidoconsignado: Optional[str] = None
    vendidoa: Optional[str] = None
    enviadotransferido: Optional[str] = None
    enviadoa: Optional[str] = None
    vendidopor: Optional[str] = None
    aaduanal: Optional[str] = None
    tipo: Optional[str] = None
    incoterm: Optional[str] = None
    flete: Optional[Decimal] = None
    identificador: Optional[str] = None
    tipomoneda: Optional[str] = None
    moneda: Optional[str] = None
    decimalespeso: Optional[int] = None
    decimalescant: Optional[int] = None
    decimalesvalor: Optional[int] = None
    decimalescosto: Optional[int] = None
    numpartemex: Optional[int] = None
    paisorigenmex: Optional[int] = None
    fraccionexp: Optional[int] = None
    tasafraccmex: Optional[int] = None
    costounitmex: Optional[int] = None
    ordencompmex: Optional[int] = None
    consfacmex: Optional[int] = None
    umequivalentemex: Optional[int] = None
    ocultarempaquemex: Optional[int] = None
    costounitmpmex: Optional[int] = None
    codigobarras: Optional[int] = None
    partecomplementariamex: Optional[int] = None
    valordllsmexpesos: Optional[int] = None
    cantpncodbar: Optional[int] = None
    dtacerocodbar: Optional[int] = None
    firmafmex: Optional[str] = None
    numparteame: Optional[int] = None
    firmafame: Optional[str] = None
    fraccioname: Optional[int] = None
    paisorigename: Optional[int] = None
    ordencompame: Optional[int] = None
    umequivalenteame: Optional[int] = None
    fdainformacioname: Optional[int] = None
    paisopcame: Optional[int] = None
    muestrafree: Optional[int] = None
    fraccmexdes: Optional[int] = None
    tipofraccmexdes: Optional[int] = None
    colvalordes: Optional[int] = None
    colpesodes: Optional[int] = None
    descargaclase: Optional[int] = None
    descargasust: Optional[int] = None
    descargadef: Optional[int] = None
    ventqueueact: Optional[int] = None
    codigoscac: Optional[int] = None
    formadesperdicio: Optional[str] = None
    calvalorbasecosto: Optional[int] = None
    calvabasecapt: Optional[int] = None
    calpesobasedescarga: Optional[int] = None
    calempaquebasecapt: Optional[int] = None
    ocultcantcons: Optional[int] = None
    prefijofraccmult: Optional[int] = None
    cantlimite: Optional[Decimal] = None
    pesolimite: Optional[Decimal] = None
    valorlimite: Optional[Decimal] = None
    costamepaisparte: Optional[int] = None
    basecostompototal: Optional[str] = None
    umequivalentemex2: Optional[int] = None
    umequivalenteame2: Optional[int] = None
    totalequivmex: Optional[int] = None
    totalequivame: Optional[int] = None
    infoadicional: Optional[str] = None
    restringeexpomp: Optional[int] = None
    calvatotagremp: Optional[str] = None
    activaadvpedrtv1: Optional[int] = None
    asignafrac9801: Optional[int] = None
    valorexcfrac9801: Optional[Decimal] = None
    pagoimpuesto: Optional[str] = None
    formapago: Optional[str] = None
    scrapsolonoduty: Optional[int] = None
    descextraamepartes: Optional[int] = None
    incambioregdesc: Optional[int] = None
    escambioregimen: Optional[str] = None
    descnocontemcant: Optional[int] = None
    metvalor: Optional[str] = None
    ocultarempaqueame: Optional[int] = None
    transportista: Optional[str] = None
    aaduanalame: Optional[str] = None
    pesonetodesdiffac: Optional[Decimal] = None
    enviadoporvendidopor: Optional[str] = None
    conductor: Optional[str] = None
    transporte: Optional[str] = None
    numtransporte: Optional[str] = None
    observacione: Optional[str] = None
    observacioni: Optional[str] = None
    clavebultos: Optional[str] = None
    ocultacolva: Optional[int] = None
    calccostosamebasemex: Optional[int] = None
    proveedorexportador: Optional[str] = None
    tipofraccmex: Optional[int] = None
    partecomplemexpartida: Optional[int] = None
    validacantparcandes: Optional[int] = None
    cantlimitemin: Optional[Decimal] = None
    pesolimitemin: Optional[Decimal] = None
    valorlimitemin: Optional[Decimal] = None
    costosamepais: Optional[str] = None
    incluirfracamebil: Optional[int] = None
    solicitarpswdactual: Optional[int] = None
    solicitarpswddesactual: Optional[int] = None
    buscarsaldosrecientes: Optional[int] = None
    packingordenventa: Optional[int] = None
    imprimirordenventa: Optional[int] = None
    firmaelectronica: Optional[str] = None
    mpf: Optional[int] = None
    valormpf: Optional[Decimal] = None
    colcantporpeso: Optional[int] = None
    packingpedclave: Optional[int] = None
    generafacturaimd: Optional[str] = None
    generafacturaimdenbasea: Optional[str] = None
    solicitarcontrasenaadministrador: Optional[int] = None
    incluirlineadelpo: Optional[int] = None
    valorpacking1dlls: Optional[int] = None
    tomarvalormexenfacame: Optional[int] = None
    lineapersonaaa: Optional[int] = None
    calamebasemexmp: Optional[int] = None
    calamebasemexva: Optional[int] = None
    calamebasemexempaque: Optional[int] = None
    usarvaenfacturaamericana: Optional[int] = None
    activarfechacortesaldos: Optional[int] = None
    fechacortesaldos: Optional[int] = None
    imprimirlote: Optional[int] = None
    imprimirnumentrada: Optional[int] = None
    respaldardescargaendescargam: Optional[int] = None
    ocultarfechahora: Optional[int] = None
    calcularvaloresamericanosenbaseapartida: Optional[int] = None
    validarestatusped: Optional[int] = None
    descapais: Optional[int] = None


class SSisImpoSettings(BaseModel):
    """Legacy Table: SSisImpo (General Import)"""
    consecutivo: Optional[int] = None
    prefijoimpo: Optional[str] = None
    prefijocr: Optional[str] = None
    consecutivoimpo: Optional[str] = None
    consecutivocr: Optional[int] = None
    porparteclasemex: Optional[str] = None
    porparteclaseame: Optional[str] = None
    pedimento: Optional[str] = None
    tipo: Optional[str] = None
    proveedor: Optional[str] = None
    vendidoconsignado: Optional[str] = None
    vendidoa: Optional[str] = None
    enviadotransferido: Optional[str] = None
    enviadoa: Optional[str] = None
    aaduanal: Optional[str] = None
    incoterm: Optional[str] = None
    flete: Optional[Decimal] = None
    identificador: Optional[str] = None
    numpartemex: Optional[int] = None
    numparteame: Optional[int] = None
    firmafmex: Optional[str] = None
    firmafame: Optional[str] = None
    codigobarras: Optional[int] = None
    fraccionimp: Optional[int] = None
    tasafraccmex: Optional[int] = None
    tipofraccmex: Optional[int] = None
    paisorigenmex: Optional[int] = None
    umequivalentemex: Optional[int] = None
    umauxiliarmex: Optional[int] = None
    perpagrenglon: Optional[int] = None
    fraccioname: Optional[int] = None
    paisorigename: Optional[int] = None
    umequivalenteame: Optional[int] = None
    impordencomp: Optional[int] = None
    decimalespeso: Optional[int] = None
    decimalescant: Optional[int] = None
    decimalesvalor: Optional[int] = None
    decimalescosto: Optional[int] = None
    tipomoneda: Optional[str] = None
    clavemoneda: Optional[str] = None
    cantlimite: Optional[Decimal] = None
    pesolimite: Optional[Decimal] = None
    valorlimite: Optional[Decimal] = None
    valorlimitepar: Optional[Decimal] = None
    umalternamex: Optional[int] = None
    restringeimpopt: Optional[int] = None
    controlremesa: Optional[str] = None
    remesainicio: Optional[int] = None
    remesafinal: Optional[int] = None
    leyendafacame: Optional[str] = None
    calcigibasecapt: Optional[int] = None
    umequivalentemex2: Optional[int] = None
    umequivalenteame2: Optional[int] = None
    partecomplementariamex: Optional[int] = None
    pagoimpuesto: Optional[str] = None
    formapago: Optional[str] = None
    metvalor: Optional[str] = None
    transportista: Optional[str] = None
    aaduanalame: Optional[str] = None
    conductor: Optional[str] = None
    transporte: Optional[str] = None
    numtransporte: Optional[str] = None
    packingpedclave: Optional[int] = None
    porordenporocpack: Optional[str] = None
    actualizarpartepartida: Optional[int] = None
    observacione: Optional[str] = None
    observacioni: Optional[str] = None
    clavebultos: Optional[str] = None
    partecomplemexpartida: Optional[int] = None
    cantlimitemin: Optional[Decimal] = None
    pesolimitemin: Optional[Decimal] = None
    valorlimitemin: Optional[Decimal] = None
    valorlimiteparmin: Optional[Decimal] = None
    packingordencompra: Optional[int] = None
    firmaelectronica: Optional[str] = None
    solicitarcontrasenaadministrador: Optional[int] = None
    incluirlineadelpo: Optional[int] = None
    lineapersonaaa: Optional[int] = None
    agregarvaenprodterminados: Optional[int] = None
    imprimirlote: Optional[int] = None
    imprimirnumentrada: Optional[int] = None
    ocultarfechahora: Optional[int] = None





class QSisCMexSettings(BaseModel):
    """Legacy Table: QSisCMex (Fixed Asset Mexican Purchase)"""
    consecutivo: Optional[int] = None
    prefijocm: Optional[str] = None
    consecutivocm: Optional[str] = None
    proveedor: Optional[str] = None
    vendidoconsignado: Optional[str] = None
    vendidoa: Optional[str] = None
    enviadotransferido: Optional[str] = None
    enviadoa: Optional[str] = None
    flete: Optional[Decimal] = None
    paisorigenmex: Optional[int] = None
    firmafmex: Optional[str] = None
    fraccionimp: Optional[int] = None
    tipofraccmex: Optional[int] = None
    tasafraccmex: Optional[int] = None
    impordencomp: Optional[int] = None
    decimalespeso: Optional[int] = None
    decimalescant: Optional[int] = None
    decimalesvalor: Optional[int] = None
    decimalescosto: Optional[int] = None
    tipomoneda: Optional[str] = None
    clavemoneda: Optional[str] = None
    transportista: Optional[str] = None
    conductor: Optional[str] = None
    transporte: Optional[str] = None
    numtransporte: Optional[str] = None
    observacione: Optional[str] = None
    observacioni: Optional[str] = None
    packingordencompra: Optional[int] = None
    imprimirlote: Optional[int] = None
    imprimirnumentrada: Optional[int] = None


class QSisDefSettings(BaseModel):
    """Legacy Table: QSisDef (Fixed Asset Definitive Import)"""
    consecutivo: Optional[int] = None
    prefijoimpo: Optional[str] = None
    consecutivoimpo: Optional[str] = None
    pedimento: Optional[str] = None
    tipo: Optional[str] = None
    proveedor: Optional[str] = None
    vendidoconsignado: Optional[str] = None
    vendidoa: Optional[str] = None
    enviadotransferido: Optional[str] = None
    enviadoa: Optional[str] = None
    aaduanal: Optional[str] = None
    incoterm: Optional[str] = None
    flete: Optional[Decimal] = None
    identificador: Optional[str] = None
    firmafmex: Optional[str] = None
    firmafame: Optional[str] = None
    generarassettag: Optional[int] = None
    codigobarras: Optional[int] = None
    fraccionimp: Optional[int] = None
    tasafraccmex: Optional[int] = None
    tipofraccmex: Optional[int] = None
    fraccioname: Optional[int] = None
    paisorigenmex: Optional[int] = None
    paisorigename: Optional[int] = None
    impordencomp: Optional[int] = None
    decimalespeso: Optional[int] = None
    decimalescant: Optional[int] = None
    decimalesvalor: Optional[int] = None
    decimalescosto: Optional[int] = None
    tipomoneda: Optional[str] = None
    tipomn: Optional[str] = None
    tipome: Optional[str] = None
    clavemoneda: Optional[str] = None
    controlremesa: Optional[str] = None
    remesainicio: Optional[int] = None
    remesafinal: Optional[int] = None
    cantlimite: Optional[Decimal] = None
    pesolimite: Optional[Decimal] = None
    valorlimite: Optional[Decimal] = None
    metvalor: Optional[str] = None
    pagoimpuesto: Optional[str] = None
    formapago: Optional[str] = None
    transportista: Optional[str] = None
    aaduanalame: Optional[str] = None
    conductor: Optional[str] = None
    transporte: Optional[str] = None
    numtransporte: Optional[str] = None
    observacione: Optional[str] = None
    observacioni: Optional[str] = None
    numpartemex: Optional[int] = None
    numparteame: Optional[int] = None
    cantlimitemin: Optional[Decimal] = None
    pesolimitemin: Optional[Decimal] = None
    valorlimitemin: Optional[Decimal] = None
    actualizarpartepartida: Optional[int] = None
    packingordencompra: Optional[int] = None
    solicitarcontrasenaadministrador: Optional[int] = None
    imprimirlote: Optional[int] = None
    imprimirnumentrada: Optional[int] = None


class QSisGenSettings(BaseModel):
    """Legacy Table: QSisGen (Fixed Asset General)"""
    consecutivo: Optional[int] = None
    dta: Optional[int] = None
    dtaexpo: Optional[int] = None
    subempresa: Optional[str] = None
    patharch: Optional[str] = None
    patharchtransmision: Optional[str] = None
    pathrespuesta: Optional[str] = None
    patharchped: Optional[str] = None
    patharchpedconsm: Optional[str] = None
    pathgenimpotemp: Optional[str] = None
    pathgenexpo: Optional[str] = None
    aplicapermat: Optional[int] = None
    actseguridad: Optional[int] = None
    controldes: Optional[int] = None
    diadesactual: Optional[int] = None
    fechades: Optional[int] = None
    ubiplanta: Optional[str] = None
    datoshistoricos: Optional[int] = None
    tipovenro: Optional[str] = None
    cantvenro: Optional[int] = None
    omitirimposubpcodbarras: Optional[str] = None
    muestraarchcodbarras: Optional[int] = None
    calvalbasetcped: Optional[int] = None
    calvalbasetcpedexpo: Optional[int] = None
    decimalespeso: Optional[int] = None
    decimalescant: Optional[int] = None
    decimalesvalor: Optional[int] = None
    factoriva: Optional[Decimal] = None
    filtrocantidad: Optional[Decimal] = None
    firmapacking: Optional[int] = None
    advertenciatm: Optional[int] = None
    calcdepreciacion: Optional[str] = None
    valmanifusado: Optional[int] = None
    validadecencant: Optional[int] = None
    mostraradvertenciaro: Optional[int] = None
    usartranspamedocame: Optional[int] = None
    escondaamexpacking: Optional[int] = None
    cantvscantseries: Optional[int] = None
    covefechaemision: Optional[int] = None
    interfaceaaconsolidada: Optional[int] = None
    interfaceaatcfpff: Optional[str] = None
    incluirobscoveobsimpo: Optional[int] = None
    agregarincreimpo: Optional[int] = None
    repdescargolineal: Optional[int] = None
    identificadornodoseriecove: Optional[int] = None
    actpdfreportes: Optional[int] = None
    patharchpdfimpo: Optional[str] = None
    patharchpdfexpo: Optional[str] = None
    mensajesvurfc: Optional[int] = None
    mostrarpackinglistingles: Optional[int] = None
    enviarsubpartidascove: Optional[int] = None
    restringepaisimpo: Optional[int] = None
    restringpaisexpo: Optional[int] = None
    utilizarfechapagopeddeundiaanterior: Optional[int] = None
    utilizartitulosalternativosimpresionfactura: Optional[int] = None
    usartcdelafechapagopedimpoendescarga: Optional[int] = None
    usarvude128o256: Optional[int] = None
    agregarnumeroembarque: Optional[int] = None
    utilizarumdeexistenciaentransmisionvu: Optional[int] = None
    utilizarcodigodebrokerdeclienteenmainx30: Optional[int] = None
    hojacalculosepararincrementablesanexo3: Optional[int] = None
    hojacalculodesglosefacturaanexo3: Optional[int] = None
    utilizarnombregenericomainx30: Optional[int] = None
    utilizartcrespectoatipoped: Optional[int] = None
    utilizarsolopartesnaftaenco: Optional[int] = None
    cambiarpesosporcostounitario: Optional[int] = None
    bloqueodeediciondefacturas: Optional[int] = None
    calcularcostounitarioenbaseavalortotalscaf: Optional[int] = None
    impresionfacturaalterna: Optional[int] = None
    transmitirfacalterna: Optional[int] = None
    validarseries: Optional[int] = None
    emailas: Optional[int] = None
    afostrofe: Optional[int] = None
    codigobarrasesp: Optional[int] = None
    muestra_copias_codbarras: Optional[int] = None
    asignainfoparte: Optional[int] = None
    pathnaftaccs: Optional[str] = None


class QSisExpoRepSettings(BaseModel):
    """Legacy Table: QSisExpoRep (Fixed Asset Export Repeat?)"""
    tipofactura: Optional[str] = None
    prefijoexpo: Optional[str] = None
    consecutivoexpo: Optional[str] = None
    pedimento: Optional[str] = None
    tipo: Optional[str] = None
    proveedor: Optional[str] = None
    vendidoconsignado: Optional[str] = None
    vendidoa: Optional[str] = None
    enviadotransferido: Optional[str] = None
    enviadoa: Optional[str] = None
    vendidopor: Optional[str] = None
    aaduanal: Optional[str] = None
    incoterm: Optional[str] = None
    flete: Optional[Decimal] = None
    identificador: Optional[str] = None
    codigobarras: Optional[int] = None
    cantpncodbar: Optional[int] = None
    dtacerocodbar: Optional[int] = None
    cbarrasvalor: Optional[str] = None
    firmafmex: Optional[str] = None
    fraccionexp: Optional[int] = None
    tasafraccmex: Optional[int] = None
    tipofraccmex: Optional[int] = None
    numpartemex: Optional[int] = None
    paisorigenmex: Optional[int] = None
    firmafame: Optional[str] = None
    fraccioname: Optional[int] = None
    paisorigename: Optional[int] = None
    numparteame: Optional[int] = None
    codigoscac: Optional[int] = None
    impordencomp: Optional[int] = None
    decimalespeso: Optional[int] = None
    decimalescant: Optional[int] = None
    decimalesvalor: Optional[int] = None
    decimalescosto: Optional[int] = None
    tipomoneda: Optional[str] = None
    clavemoneda: Optional[str] = None
    tipomn: Optional[str] = None
    tipome: Optional[str] = None
    mostrarvalact: Optional[int] = None
    pepsporclase: Optional[int] = None
    pepsporfraccion: Optional[int] = None
    pepspordescripcion: Optional[int] = None
    cantlimite: Optional[Decimal] = None
    pesolimite: Optional[Decimal] = None
    valorlimite: Optional[Decimal] = None
    ventqueueact: Optional[int] = None
    valfacttc: Optional[str] = None
    metvalor: Optional[str] = None
    pagoimpuesto: Optional[str] = None
    formapago: Optional[str] = None
    transportista: Optional[str] = None
    aaduanalame: Optional[str] = None
    enviadoporvendidopor: Optional[str] = None
    conductor: Optional[str] = None
    transporte: Optional[str] = None
    numtransporte: Optional[str] = None
    observacione: Optional[str] = None
    observacioni: Optional[str] = None
    proveedorexportador: Optional[str] = None
    cantlimitemin: Optional[Decimal] = None
    pesolimitemin: Optional[Decimal] = None
    valorlimitemin: Optional[Decimal] = None
    solicitarpswdactual: Optional[int] = None
    solicitarpswddesactual: Optional[int] = None
    packingordenventa: Optional[int] = None
    imprimirpo: Optional[int] = None
    fdainformacioname: Optional[int] = None
    packingpedclave: Optional[int] = None
    solicitarcontrasenaadministrador: Optional[int] = None
    imprimirlote: Optional[int] = None
    imprimirnumentrada: Optional[int] = None


class QSisImpoSettings(BaseModel):
    """Legacy Table: QSisImpo (Fixed Asset Import)"""
    consecutivo: Optional[int] = None
    prefijoimpo: Optional[str] = None
    consecutivoimpo: Optional[str] = None
    pedimento: Optional[str] = None
    tipo: Optional[str] = None
    proveedor: Optional[str] = None
    vendidoconsignado: Optional[str] = None
    vendidoa: Optional[str] = None
    enviadotransferido: Optional[str] = None
    enviadoa: Optional[str] = None
    aaduanal: Optional[str] = None
    incoterm: Optional[str] = None
    flete: Optional[Decimal] = None
    identificador: Optional[str] = None
    firmafmex: Optional[str] = None
    firmafame: Optional[str] = None
    codigobarras: Optional[int] = None
    fraccionimp: Optional[int] = None
    tasafraccmex: Optional[int] = None
    tipofraccmex: Optional[int] = None
    fraccioname: Optional[int] = None
    paisorigenmex: Optional[int] = None
    paisorigename: Optional[int] = None
    impordencomp: Optional[int] = None
    generarassettag: Optional[int] = None
    decimalespeso: Optional[int] = None
    decimalescant: Optional[int] = None
    decimalesvalor: Optional[int] = None
    decimalescosto: Optional[int] = None
    tipomoneda: Optional[str] = None
    tipomn: Optional[str] = None
    tipome: Optional[str] = None
    clavemoneda: Optional[str] = None
    controlremesa: Optional[str] = None
    remesainicio: Optional[int] = None
    remesafinal: Optional[int] = None
    perpagrenglon: Optional[int] = None
    cantlimite: Optional[Decimal] = None
    pesolimite: Optional[Decimal] = None
    valorlimite: Optional[Decimal] = None
    metvalor: Optional[str] = None
    pagoimpuesto: Optional[str] = None
    formapago: Optional[str] = None
    transportista: Optional[str] = None
    aaduanalame: Optional[str] = None
    conductor: Optional[str] = None
    transporte: Optional[str] = None
    numtransporte: Optional[str] = None
    observacione: Optional[str] = None
    observacioni: Optional[str] = None
    numpartemex: Optional[int] = None
    numparteame: Optional[int] = None
    cantlimitemin: Optional[Decimal] = None
    pesolimitemin: Optional[Decimal] = None
    valorlimitemin: Optional[Decimal] = None
    actualizarpartepartida: Optional[int] = None
    packingordencompra: Optional[int] = None
    solicitarcontrasenaadministrador: Optional[int] = None
    imprimirlote: Optional[int] = None
    imprimirnumentrada: Optional[int] = None


class QSisImpoRepSettings(BaseModel):
    """Legacy Table: QSisImpoRep (Fixed Asset Import Repeat?)"""
    tipofactura: Optional[str] = None
    consecutivo: Optional[int] = None
    prefijoimpo: Optional[str] = None
    consecutivoimpo: Optional[str] = None
    pedimento: Optional[str] = None
    tipo: Optional[str] = None
    proveedor: Optional[str] = None
    vendidoconsignado: Optional[str] = None
    vendidoa: Optional[str] = None
    enviadotransferido: Optional[str] = None
    enviadoa: Optional[str] = None
    aaduanal: Optional[str] = None
    incoterm: Optional[str] = None
    flete: Optional[Decimal] = None
    identificador: Optional[str] = None
    firmafmex: Optional[str] = None
    firmafame: Optional[str] = None
    codigobarras: Optional[int] = None
    fraccionimp: Optional[int] = None
    tasafraccmex: Optional[int] = None
    tipofraccmex: Optional[int] = None
    fraccioname: Optional[int] = None
    paisorigenmex: Optional[int] = None
    paisorigename: Optional[int] = None
    impordencomp: Optional[int] = None
    generarassettag: Optional[int] = None
    decimalespeso: Optional[int] = None
    decimalescant: Optional[int] = None
    decimalesvalor: Optional[int] = None
    decimalescosto: Optional[int] = None
    tipomoneda: Optional[str] = None
    tipomn: Optional[str] = None
    tipome: Optional[str] = None
    clavemoneda: Optional[str] = None
    controlremesa: Optional[str] = None
    remesainicio: Optional[int] = None
    remesafinal: Optional[int] = None
    perpagrenglon: Optional[int] = None
    cantlimite: Optional[Decimal] = None
    pesolimite: Optional[Decimal] = None
    valorlimite: Optional[Decimal] = None
    ventqueueact: Optional[int] = None
    metvalor: Optional[str] = None
    pagoimpuesto: Optional[str] = None
    formapago: Optional[str] = None
    transportista: Optional[str] = None
    aaduanalame: Optional[str] = None
    conductor: Optional[str] = None
    transporte: Optional[str] = None
    numtransporte: Optional[str] = None
    observacione: Optional[str] = None
    observacioni: Optional[str] = None
    numpartemex: Optional[int] = None
    numparteame: Optional[int] = None
    cantlimitemin: Optional[Decimal] = None
    pesolimitemin: Optional[Decimal] = None
    valorlimitemin: Optional[Decimal] = None
    packingordencompra: Optional[int] = None
    solicitarcontrasenaadministrador: Optional[int] = None


class QSisExpoSettings(BaseModel):
    """Legacy Table: QSisExpo (Fixed Asset Export)"""
    tipofactura: Optional[str] = None
    escambioregimen: Optional[str] = None
    prefijoexpo: Optional[str] = None
    consecutivoexpo: Optional[str] = None
    pedimento: Optional[str] = None
    tipo: Optional[str] = None
    proveedor: Optional[str] = None
    vendidoconsignado: Optional[str] = None
    vendidoa: Optional[str] = None
    enviadotransferido: Optional[str] = None
    enviadoa: Optional[str] = None
    vendidopor: Optional[str] = None
    aaduanal: Optional[str] = None
    incoterm: Optional[str] = None
    flete: Optional[Decimal] = None
    identificador: Optional[str] = None
    codigobarras: Optional[int] = None
    cantpncodbar: Optional[int] = None
    dtacerocodbar: Optional[int] = None
    cbarrasvalor: Optional[str] = None
    firmafmex: Optional[str] = None
    fraccionexp: Optional[int] = None
    tasafraccmex: Optional[int] = None
    tipofraccmex: Optional[int] = None
    numpartemex: Optional[int] = None
    paisorigenmex: Optional[int] = None
    costounitmex: Optional[int] = None
    ocultarempaquemex: Optional[int] = None
    firmafame: Optional[str] = None
    fraccioname: Optional[int] = None
    paisorigename: Optional[int] = None
    fdainformacioname: Optional[int] = None
    numparteame: Optional[int] = None
    codigoscac: Optional[int] = None
    impordencomp: Optional[int] = None
    decimalespeso: Optional[int] = None
    decimalescant: Optional[int] = None
    decimalesvalor: Optional[int] = None
    decimalescosto: Optional[int] = None
    tipomoneda: Optional[str] = None
    clavemoneda: Optional[str] = None
    tipomn: Optional[str] = None
    tipome: Optional[str] = None
    mostrarvalact: Optional[int] = None
    pepsporclase: Optional[int] = None
    pepsporfraccion: Optional[int] = None
    pepspordescripcion: Optional[int] = None
    pepsporfraccalterna: Optional[int] = None
    cantlimite: Optional[Decimal] = None
    pesolimite: Optional[Decimal] = None
    valorlimite: Optional[Decimal] = None
    ventqueueact: Optional[int] = None
    valfacttc: Optional[str] = None
    metvalor: Optional[str] = None
    pagoimpuesto: Optional[str] = None
    formapago: Optional[str] = None
    colcantporpeso: Optional[int] = None
    transportista: Optional[str] = None
    aaduanalame: Optional[str] = None
    enviadoporvendidopor: Optional[str] = None
    conductor: Optional[str] = None
    transporte: Optional[str] = None
    numtransporte: Optional[str] = None
    observacione: Optional[str] = None
    observacioni: Optional[str] = None
    proveedorexportador: Optional[str] = None
    cantlimitemin: Optional[Decimal] = None
    pesolimitemin: Optional[Decimal] = None
    valorlimitemin: Optional[Decimal] = None
    solicitarpswdactual: Optional[int] = None
    solicitarpswddesactual: Optional[int] = None
    packingordenventa: Optional[int] = None
    imprimirpo: Optional[int] = None
    packingpedclave: Optional[int] = None
    generafacturaimd: Optional[str] = None
    generafacturaimdenbasea: Optional[str] = None
    solicitarcontrasenaadministrador: Optional[int] = None
    imprimirlote: Optional[int] = None
    imprimirnumentrada: Optional[int] = None


class SettingsPayload(BaseModel):
    """
    Master container for all possible overrides.
    Using Optional fields so only the delta is required in JSONB.
    """
    # SCAII (Invoices / Inventory)
    ssisgen: Optional[SSisGenSettings] = None
    ssisgen2: Optional[SSisGen2Settings] = None
    ssisgen3: Optional[SSisGen3Settings] = None
    ssismex: Optional[SSisMexSettings] = None
    ssisdef: Optional[SSisDefSettings] = None
    ssisexpo: Optional[SSisExpoSettings] = None
    ssisimpo: Optional[SSisImpoSettings] = None
    
    # SCAF (Fixed Assets)
    qsiscmex: Optional[QSisCMexSettings] = None
    qsisdef: Optional[QSisDefSettings] = None
    qsisgen: Optional[QSisGenSettings] = None
    qsisexporep: Optional[QSisExpoRepSettings] = None
    qsisimpo: Optional[QSisImpoSettings] = None
    qsisimporep: Optional[QSisImpoRepSettings] = None
    qsisexpo: Optional[QSisExpoSettings] = None
    
    # Unified Invoice Settings
    invoices: Optional["InvoiceSettingsMap"] = None

class InvoiceSettingsData(BaseModel):
    """Container for form-specific invoice settings"""
    InvoiceTopFieldsFormData: Optional[Dict[str, Any]] = None
    generalFormData: Optional[Dict[str, Any]] = None
    observationFormData: Optional[Dict[str, Any]] = None
    itemsFormData: Optional[Dict[str, Any]] = None
    othersFormData: Optional[Dict[str, Any]] = None
    continuationFormData: Optional[Dict[str, Any]] = None

class InvoiceSettingsMap(BaseModel):
    """
    Map of invoice settings indexed by operation_type (imp/exp) 
    and then by invoice_type.
    Example: {"imp": {"factura_importacion": {...}}}
    """
    types: Optional[Dict[str, Dict[str, InvoiceSettingsData]]] = None

class AppSettingRequest(BaseModel):
    tenant_id: Optional[int] = None
    company_id: Optional[int] = None
    settings: SettingsPayload

class AppSettingResponse(BaseModel):
    id: int
    tenant_id: Optional[int]
    company_id: Optional[int]
    settings: Dict[str, Any]
    
    class Config:
        from_attributes = True

