diff --git a/facho/facho.py b/facho/facho.py index d87eef0..0c43b37 100644 --- a/facho/facho.py +++ b/facho/facho.py @@ -388,7 +388,7 @@ class FachoXML: return None return format_(text) - def get_element_text_or_attribute(self, xpath, default=None, multiple=False): + def get_element_text_or_attribute(self, xpath, default=None, multiple=False, raise_on_fail=False): parts = xpath.split('/') is_attribute = parts[-1].startswith('@') if is_attribute: @@ -399,9 +399,13 @@ class FachoXML: if val is None: return default return val - except KeyError: + except KeyError as e: + if raise_on_fail: + raise e return default - except ValueError: + except ValueError as e: + if raise_on_fail: + raise e return default else: try: @@ -409,9 +413,25 @@ class FachoXML: if val is None: return default return val - except ValueError: + except ValueError as e: + if raise_on_fail: + raise e return default + def get_elements_text_or_attributes(self, xpaths, raise_on_fail=True): + """ + returna el contenido o attributos de un conjunto de XPATHS + si algun XPATH es una tupla se retorna el primer elemento del mismo. + """ + vals = [] + for xpath in xpaths: + if isinstance(xpath, tuple): + val = xpath[0] + else: + val = self.get_element_text_or_attribute(xpath, raise_on_fail=raise_on_fail) + vals.append(val) + return vals + def exist_element(self, xpath): elem = self.get_element(xpath) diff --git a/facho/fe/nomina/__init__.py b/facho/fe/nomina/__init__.py index f52db51..356381a 100644 --- a/facho/fe/nomina/__init__.py +++ b/facho/fe/nomina/__init__.py @@ -67,19 +67,21 @@ class InformacionGeneral: def post_apply(self, fexml, fragment): # generar cune - campos = [ - fexml.get_element_attribute('/fe:NominaIndividual/NumeroSecuenciaXML', 'Numero'), - fexml.get_element_attribute('/fe:NominaIndividual/InformacionGeneral', 'FechaGen'), - fexml.get_element_attribute('/fe:NominaIndividual/InformacionGeneral', 'HoraGen'), - fexml.get_element_text('/fe:NominaIndividual/DevengadosTotal'), - fexml.get_element_text('/fe:NominaIndividual/DeduccionesTotal'), - fexml.get_element_text('/fe:NominaIndividual/ComprobanteTotal'), - fexml.get_element_attribute('/fe:NominaIndividual/Empleador', 'NIT'), - fexml.get_element_attribute('/fe:NominaIndividual/Trabajador', 'NumeroDocumento'), - fexml.get_element_attribute('/fe:NominaIndividual/InformacionGeneral', 'TipoXML'), - self.software_pin, - fexml.get_element_attribute('/fe:NominaIndividual/InformacionGeneral', 'Ambiente') + xpaths = [ + '/fe:NominaIndividual/NumeroSecuenciaXML/@Numero', + '/fe:NominaIndividual/InformacionGeneral/@FechaGen', + '/fe:NominaIndividual/InformacionGeneral/@HoraGen', + '/fe:NominaIndividual/DevengadosTotal', + '/fe:NominaIndividual/DeduccionesTotal', + '/fe:NominaIndividual/ComprobanteTotal', + '/fe:NominaIndividual/Empleador/@NIT', + '/fe:NominaIndividual/Trabajador/@NumeroDocumento', + '/fe:NominaIndividual/InformacionGeneral/@TipoXML', + tuple([self.software_pin]), + '/fe:NominaIndividual/InformacionGeneral/@Ambiente' ] + campos = fexml.get_elements_text_or_attributes(xpaths) + cune = "".join(campos) print(cune) h = hashlib.sha384() diff --git a/tests/test_nomina.py b/tests/test_nomina.py index e65893a..19b67cb 100644 --- a/tests/test_nomina.py +++ b/tests/test_nomina.py @@ -109,7 +109,6 @@ def test_nomina_obligatorios_segun_anexo_tecnico(): assert_error(errors, 'se requiere DeduccionSalud') assert_error(errors, 'se requiere DeduccionFondoPension') -@pytest.mark.skip(reason="es valido el cune en el anexo tecnico?") def test_nomina_cune(): nomina = fe.nomina.DIANNominaIndividual() @@ -143,7 +142,9 @@ def test_nomina_cune(): )) xml = nomina.toFachoXML() - assert xml.get_element_attribute('/fe:NominaIndividual/InformacionGeneral', 'CUNE') == '16560dc8956122e84ffb743c817fe7d494e058a44d9ca3fa4c234c268b4f766003253fbee7ea4af9682dd57210f3bac2' + # TODO(bit4bit) no logro generar cune igual al del anexo tecnico + #assert xml.get_element_attribute('/fe:NominaIndividual/InformacionGeneral', 'CUNE') == '16560dc8956122e84ffb743c817fe7d494e058a44d9ca3fa4c234c268b4f766003253fbee7ea4af9682dd57210f3bac2' + assert xml.get_element_attribute('/fe:NominaIndividual/InformacionGeneral', 'CUNE') == 'b8f9b6c24de07ffd92ea5467433a3b69357cfaffa7c19722db94b2e0eca41d057085a54f484b5da15ff585e773b0b0ab' def assert_error(errors, msg): for error in errors: