Fix: Facho para habilitacion de nomina python 3.9
This commit is contained in:
@@ -53,20 +53,14 @@ class FechaPago(Fecha):
|
||||
|
||||
@dataclass
|
||||
class Novedad:
|
||||
# cune de nomina a relacionar
|
||||
# NIE204
|
||||
cune: str
|
||||
# NIE199
|
||||
activa: bool = False
|
||||
value: False
|
||||
|
||||
def apply(self, fragment):
|
||||
if self.cune != "":
|
||||
fragment.set_attributes('./Novedad',
|
||||
CUNENov=self.cune,
|
||||
)
|
||||
|
||||
fragment.set_attributes('./Novedad',
|
||||
CUNENov=self.value,
|
||||
)
|
||||
def post_apply(self, fexml, scopexml, fragment):
|
||||
scopexml.set_element('./Novedad', self.activa)
|
||||
scopexml.set_element('./Novedad', "false")
|
||||
|
||||
|
||||
@dataclass
|
||||
@@ -144,12 +138,13 @@ class Proveedor:
|
||||
ambiente = fexml.get_element_attribute(scopexml.xpath_from_root('/InformacionGeneral'), 'Ambiente')
|
||||
codigo_qr = f"https://catalogo-vpfe.dian.gov.co/document/searchqr?documentkey={cune}"
|
||||
|
||||
if InformacionGeneral.AMBIENTE_PRUEBAS == ambiente:
|
||||
if InformacionGeneral.AMBIENTE_PRUEBAS.same(ambiente):
|
||||
codigo_qr = f"https://catalogo-vpfe-hab.dian.gov.co/document/searchqr?documentkey={cune}"
|
||||
elif ambiente is None:
|
||||
raise RuntimeError('fail to get InformacionGeneral/@Ambiente')
|
||||
|
||||
scopexml.set_element('./CodigoQR', codigo_qr)
|
||||
scopexml.set_element('./Novedad', "false")
|
||||
|
||||
# NIE020
|
||||
software_code = self._software_security_code(fexml, scopexml)
|
||||
@@ -182,16 +177,14 @@ class Metadata:
|
||||
proveedor: Proveedor
|
||||
|
||||
def apply(self, novedad, numero_secuencia_xml, lugar_generacion_xml, proveedor_xml):
|
||||
if novedad:
|
||||
self.novedad.apply(novedad)
|
||||
self.novedad.apply(novedad)
|
||||
self.secuencia.apply(numero_secuencia_xml)
|
||||
self.lugar_generacion.apply(lugar_generacion_xml, './LugarGeneracionXML')
|
||||
self.proveedor.apply(proveedor_xml)
|
||||
|
||||
def post_apply(self, fexml, scopexml, novedad, numero_secuencia_xml, lugar_generacion_xml, proveedor_xml):
|
||||
self.proveedor.post_apply(fexml, scopexml, proveedor_xml)
|
||||
if novedad:
|
||||
self.novedad.post_apply(fexml, scopexml, proveedor_xml)
|
||||
self.novedad.post_apply(fexml, scopexml, proveedor_xml)
|
||||
|
||||
@dataclass
|
||||
class PeriodoNomina:
|
||||
@@ -219,8 +212,9 @@ class InformacionGeneral:
|
||||
class TIPO_AMBIENTE:
|
||||
valor: str
|
||||
|
||||
def __eq__(self, other):
|
||||
return self.valor == str(other)
|
||||
@classmethod
|
||||
def same(cls, value):
|
||||
return cls.valor == str(value)
|
||||
|
||||
# TABLA 5.1.1
|
||||
@dataclass
|
||||
@@ -234,28 +228,6 @@ class InformacionGeneral:
|
||||
class AMBIENTE_PRUEBAS(TIPO_AMBIENTE):
|
||||
valor: str = '2'
|
||||
|
||||
def __str__(self):
|
||||
self.valor
|
||||
|
||||
# TABLA 5.5.7
|
||||
@dataclass
|
||||
class TIPO_XML:
|
||||
valor: str
|
||||
|
||||
def __eq__(self, other):
|
||||
return self.valor == str(other)
|
||||
|
||||
@dataclass
|
||||
class TIPO_XML_NORMAL(TIPO_XML):
|
||||
valor: str = '102'
|
||||
|
||||
def __str__(self):
|
||||
self.valor
|
||||
|
||||
@dataclass
|
||||
class TIPO_XML_AJUSTES(TIPO_XML):
|
||||
valor: str = '103'
|
||||
|
||||
def __str__(self):
|
||||
self.valor
|
||||
|
||||
@@ -264,7 +236,6 @@ class InformacionGeneral:
|
||||
periodo_nomina: PeriodoNomina
|
||||
tipo_moneda: TipoMoneda
|
||||
tipo_ambiente: TIPO_AMBIENTE
|
||||
tipo_xml: TIPO_XML
|
||||
software_pin: str
|
||||
|
||||
def __post_init__(self):
|
||||
@@ -279,7 +250,7 @@ class InformacionGeneral:
|
||||
# NIE202
|
||||
# TABLA 5.5.2
|
||||
# TODO(bit4bit) solo NominaIndividual
|
||||
TipoXML = self.tipo_xml.valor,
|
||||
TipoXML = '102',
|
||||
# NIE024
|
||||
CUNE = None,
|
||||
# NIE025
|
||||
@@ -338,18 +309,15 @@ class DianXMLExtensionSigner(fe.DianXMLExtensionSigner):
|
||||
|
||||
|
||||
class DIANNominaXML:
|
||||
def __init__(self, tag_document, xpath_ajuste=None, schemaLocation=None, namespace_ajuste=None):
|
||||
def __init__(self, tag_document, xpath_ajuste=None,schemaLocation=None):
|
||||
self.informacion_general_version = None
|
||||
|
||||
self.tag_document = tag_document
|
||||
self.fexml = fe.FeXML(tag_document, 'http://www.dian.gov.co/contratos/facturaelectronica/v1')
|
||||
|
||||
if namespace_ajuste:
|
||||
self.fexml = fe.FeXML(tag_document, namespace_ajuste)
|
||||
else:
|
||||
self.fexml = fe.FeXML(tag_document, 'dian:gov:co:facturaelectronica:NominaIndividual')
|
||||
|
||||
self.fexml.root.set("SchemaLocation", "")
|
||||
self.fexml.root.set("schemaLocation", schemaLocation)
|
||||
if schemaLocation is not None:
|
||||
self.fexml.root.set("SchemaLocation", "")
|
||||
self.fexml.root.set("change", schemaLocation)
|
||||
|
||||
# layout, la dian requiere que los elementos
|
||||
# esten ordenados segun el anexo tecnico
|
||||
@@ -361,8 +329,7 @@ class DIANNominaXML:
|
||||
self.root_fragment = self.fexml.fragment(xpath_ajuste)
|
||||
self.root_fragment.placeholder_for('./ReemplazandoPredecesor', optional=True)
|
||||
self.root_fragment.placeholder_for('./EliminandoPredecesor', optional=True)
|
||||
if not namespace_ajuste:
|
||||
self.root_fragment.placeholder_for('./Novedad', optional=False)
|
||||
self.root_fragment.placeholder_for('./Novedad', optional=False)
|
||||
self.root_fragment.placeholder_for('./Periodo')
|
||||
self.root_fragment.placeholder_for('./NumeroSecuenciaXML')
|
||||
self.root_fragment.placeholder_for('./LugarGeneracionXML')
|
||||
@@ -375,10 +342,8 @@ class DIANNominaXML:
|
||||
self.root_fragment.placeholder_for('./FechasPagos')
|
||||
self.root_fragment.placeholder_for('./Devengados/Basico')
|
||||
self.root_fragment.placeholder_for('./Devengados/Transporte', optional=True)
|
||||
if not namespace_ajuste:
|
||||
self.novedad = self.root_fragment.fragment('./Novedad')
|
||||
else:
|
||||
self.novedad = None
|
||||
|
||||
self.novedad = self.root_fragment.fragment('./Novedad')
|
||||
self.informacion_general_xml = self.root_fragment.fragment('./InformacionGeneral')
|
||||
self.periodo_xml = self.root_fragment.fragment('./Periodo')
|
||||
self.fecha_pagos_xml = self.root_fragment.fragment('./FechasPagos')
|
||||
@@ -398,7 +363,6 @@ class DIANNominaXML:
|
||||
if not isinstance(metadata, Metadata):
|
||||
raise ValueError('se espera tipo Metadata')
|
||||
self.metadata = metadata
|
||||
|
||||
self.metadata.apply(self.novedad, self.numero_secuencia_xml, self.lugar_generacion_xml, self.proveedor_xml)
|
||||
|
||||
def asignar_informacion_general(self, general):
|
||||
@@ -555,8 +519,6 @@ class DIANNominaXML:
|
||||
devengados_total = Amount(0.0)
|
||||
for devengado in devengados:
|
||||
devengados_total += devengado
|
||||
# TODO(bit4bit) nque valor va redondeado?
|
||||
# NIE186
|
||||
self.root_fragment.set_element('./Redondeo', str(round(0,2)))
|
||||
self.root_fragment.set_element('./DevengadosTotal', str(round(devengados_total,2)))
|
||||
|
||||
@@ -592,8 +554,6 @@ class DIANNominaIndividualDeAjuste(DIANNominaXML):
|
||||
fecha_generacion: str
|
||||
|
||||
def apply(self, fragment):
|
||||
# NIAE214
|
||||
fragment.set_element('./TipoNota', '1')
|
||||
fragment.set_element('./Reemplazar/ReemplazandoPredecesor', None,
|
||||
# NIAE090
|
||||
NumeroPred = self.numero,
|
||||
@@ -604,11 +564,9 @@ class DIANNominaIndividualDeAjuste(DIANNominaXML):
|
||||
)
|
||||
|
||||
def __init__(self):
|
||||
schema = "dian:gov:co:facturaelectronica:NominaIndividualDeAjuste NominaIndividualDeAjusteElectronicaXSD.xsd"
|
||||
|
||||
super().__init__('NominaIndividualDeAjuste', './Reemplazar', schemaLocation=schema, namespace_ajuste='dian:gov:co:facturaelectronica:NominaIndividualDeAjuste')
|
||||
|
||||
self.informacion_general_version = 'V1.0: Nota de Ajuste de Documento Soporte de Pago de Nómina Electrónica'
|
||||
super().__init__('NominaIndividualDeAjuste', './Reemplazar')
|
||||
# NIAE214
|
||||
self.root_fragment.set_element('./TipoNota', '1')
|
||||
|
||||
def asignar_predecesor(self, predecesor):
|
||||
if not isinstance(predecesor, self.Predecesor):
|
||||
@@ -625,7 +583,6 @@ class DIANNominaIndividualDeAjuste(DIANNominaXML):
|
||||
fecha_generacion: str
|
||||
|
||||
def apply(self, fragment):
|
||||
fragment.set_element('./TipoNota', '2')
|
||||
fragment.set_element('./Eliminar/EliminandoPredecesor', None,
|
||||
# NIAE090
|
||||
NumeroPred = self.numero,
|
||||
@@ -636,9 +593,9 @@ class DIANNominaIndividualDeAjuste(DIANNominaXML):
|
||||
)
|
||||
|
||||
def __init__(self):
|
||||
schema = "dian:gov:co:facturaelectronica:NominaIndividualDeAjuste NominaIndividualDeAjusteElectronicaXSD.xsd"
|
||||
super().__init__('NominaIndividualDeAjuste', './Eliminar', schemaLocation=schema, namespace_ajuste='dian:gov:co:facturaelectronica:NominaIndividualDeAjuste')
|
||||
super().__init__('NominaIndividualDeAjuste', './Eliminar')
|
||||
|
||||
self.root_fragment.set_element('./TipoNota', '2')
|
||||
self.informacion_general_version = "V1.0: Nota de Ajuste de Documento Soporte de Pago de Nómina Electrónica"
|
||||
|
||||
def asignar_predecesor(self, predecesor):
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
from dataclasses import dataclass, field
|
||||
from dataclasses import dataclass
|
||||
|
||||
from ..amount import Amount
|
||||
|
||||
@@ -29,7 +29,7 @@ class Trabajador:
|
||||
|
||||
codigo_trabajador: str = None
|
||||
otros_nombres: str = None
|
||||
sub_tipo: SubTipoTrabajador = field(default_factory=lambda: SubTipoTrabajador(code='00'))
|
||||
sub_tipo: SubTipoTrabajador = SubTipoTrabajador(code='00')
|
||||
|
||||
def apply(self, fragment):
|
||||
fragment.set_attributes('./Trabajador',
|
||||
|
||||
Reference in New Issue
Block a user