se adicionan mas campos requeridos para NominaIndividual
FossilOrigin-Name: 12c10fc4b3e4b69c665c8cde599a788266402977af62eed9b9a25459e1545f02
This commit is contained in:
		| @@ -101,3 +101,4 @@ SubTipoTrabajador = CodeList(path_for_codelist('SubTipoTrabajador-2.1.gc'), 'cod | ||||
| TipoContrato = CodeList(path_for_codelist('TipoContrato-2.1.gc'), 'code', 'name') | ||||
| PeriodoNomina = CodeList(path_for_codelist('PeriodoNomina-2.1.gc'), 'code', 'name') | ||||
| TipoMoneda = CodeList(path_for_codelist('TipoMoneda-2.1.gc'), 'code', 'name') | ||||
| IdiomaISO6391 = CodeList(path_for_codelist('Idioma-2.1.gc'), 'iso-639-1', 'name') | ||||
|   | ||||
| @@ -17,23 +17,65 @@ from .deduccion import * | ||||
| from .trabajador import * | ||||
| from .empleador import * | ||||
| from .pago import * | ||||
|  | ||||
| from .pais import Pais | ||||
| from .departamento import Departamento | ||||
| from .municipio import Municipio | ||||
| from .lugar import Lugar | ||||
|  | ||||
| from .amount import Amount | ||||
| from .exception import * | ||||
|  | ||||
| @dataclass | ||||
| class NumeroSecuencia: | ||||
|     consecutivo: int | ||||
|     numero: str | ||||
|  | ||||
|     def apply(self, fragment): | ||||
|         fragment.set_attributes('./NumeroSecuenciaXML', | ||||
|                                 # NIE011 | ||||
|                                 Consecutivo=self.consecutivo, | ||||
|                                 # NIE012 | ||||
|                                 Numero = self.numero) | ||||
|          | ||||
|  | ||||
|  | ||||
| @dataclass | ||||
| class Proveedor: | ||||
|     nit: str | ||||
|     dv: int | ||||
|     software_id: str | ||||
|     software_sc: str | ||||
|  | ||||
|     def apply(self, fragment): | ||||
|         fragment.set_attributes('./ProveedorXML', | ||||
|                                 # NIE017 | ||||
|                                 NIT=self.nit, | ||||
|                                 # NIE018 | ||||
|                                 DV=self.dv, | ||||
|                                 # NIE019 | ||||
|                                 SoftwareID=self.software_id, | ||||
|                                 # NIE020 | ||||
|                                 SoftwareSC=self.software_sc, | ||||
|                                 ) | ||||
|  | ||||
|     def post_apply(self, fexml, fragment): | ||||
|         cune_xpath = fexml.xpath_from_root('/InformacionGeneral') | ||||
|         cune = fexml.get_element_attribute(cune_xpath, 'CUNE') | ||||
|         codigo_qr = f"https://catalogo‐vpfe.dian.gov.co/document/searchqr?documentkey={cune}" | ||||
|         fragment.set_attributes('./ProveedorXML', | ||||
|                                 CodigoQR=codigo_qr) | ||||
|          | ||||
| @dataclass | ||||
| class Metadata: | ||||
|     secuencia: NumeroSecuencia | ||||
|     # NIE013, NIE014, NIE015, NIE016 | ||||
|     lugar_generacion: Lugar | ||||
|     proveedor: Proveedor | ||||
|  | ||||
|     def apply(self, numero_secuencia_xml, lugar_generacion_xml, proveedor_xml): | ||||
|         self.secuencia.apply(numero_secuencia_xml) | ||||
|         self.lugar_generacion.apply(lugar_generacion_xml, './LugarGeneracionXML') | ||||
|         self.proveedor.apply(proveedor_xml) | ||||
|  | ||||
|     def post_apply(self, fexml, numero_secuencia_xml, lugar_generacion_xml, proveedor_xml): | ||||
|         self.proveedor.post_apply(fexml, proveedor_xml) | ||||
|          | ||||
| @dataclass | ||||
| class PeriodoNomina: | ||||
|     code: str | ||||
| @@ -138,7 +180,12 @@ class DIANNominaXML: | ||||
|  | ||||
|         # layout, la dian requiere que los elementos | ||||
|         # esten ordenados segun el anexo tecnico | ||||
|         self.fexml.placeholder_for('./UBLExtensions') | ||||
|         self.fexml.placeholder_for('./Novedad', optional=True) | ||||
|         self.fexml.placeholder_for('./Periodo') | ||||
|         self.fexml.placeholder_for('./NumeroSecuenciaXML') | ||||
|         self.fexml.placeholder_for('./LugarGeneracionXML') | ||||
|         self.fexml.placeholder_for('./ProveedorXML') | ||||
|         self.fexml.placeholder_for('./InformacionGeneral') | ||||
|         self.fexml.placeholder_for('./Empleador') | ||||
|         self.fexml.placeholder_for('./Trabajador') | ||||
| @@ -149,6 +196,8 @@ class DIANNominaXML: | ||||
|  | ||||
|         self.informacion_general_xml = self.fexml.fragment('./InformacionGeneral') | ||||
|         self.numero_secuencia_xml = self.fexml.fragment('./NumeroSecuenciaXML') | ||||
|         self.lugar_generacion_xml = self.fexml.fragment('./LugarGeneracionXML') | ||||
|         self.proveedor_xml = self.fexml.fragment('./ProveedorXML') | ||||
|         self.empleador = self.fexml.fragment('./Empleador') | ||||
|         self.trabajador = self.fexml.fragment('./Trabajador') | ||||
|         self.pago_xml = self.fexml.fragment('./Pago') | ||||
| @@ -156,12 +205,14 @@ class DIANNominaXML: | ||||
|         self.deducciones = self.fexml.fragment('./Deducciones') | ||||
|  | ||||
|         self.informacion_general = None | ||||
|         self.metadata = None | ||||
|  | ||||
|     def asignar_numero_secuencia(self, secuencia): | ||||
|         if not isinstance(secuencia, NumeroSecuencia): | ||||
|             raise ValueError('se espera tipo NumeroSecuencia') | ||||
|         secuencia.apply(self.numero_secuencia_xml) | ||||
|  | ||||
|     def asignar_metadata(self, metadata): | ||||
|         if not isinstance(metadata, Metadata): | ||||
|             raise ValueError('se espera tipo Metadata') | ||||
|         self.metadata = metadata | ||||
|         self.metadata.apply(self.numero_secuencia_xml, self.lugar_generacion_xml, self.proveedor_xml) | ||||
|          | ||||
|     def asignar_informacion_general(self, general): | ||||
|         if not isinstance(general, InformacionGeneral): | ||||
|             raise ValueError('se espera tipo InformacionGeneral') | ||||
| @@ -246,13 +297,16 @@ class DIANNominaXML: | ||||
|         self._devengados_total() | ||||
|         self._deducciones_total() | ||||
|         self._comprobante_total() | ||||
|          | ||||
|  | ||||
|         if self.informacion_general is not None: | ||||
|             #TODO(bit4bit) acoplamiento temporal | ||||
|             # es importante el orden de ejecucion | ||||
|  | ||||
|             self.informacion_general.post_apply(self.fexml, self.informacion_general_xml) | ||||
|  | ||||
|         if self.metadata is not None: | ||||
|             self.metadata.post_apply(self.fexml, self.numero_secuencia_xml, self.lugar_generacion_xml, self.proveedor_xml) | ||||
|  | ||||
|         return self.fexml | ||||
|  | ||||
|     def _comprobante_total(self): | ||||
|   | ||||
		Reference in New Issue
	
	Block a user