diff --git a/facho/fe/nomina/__init__.py b/facho/fe/nomina/__init__.py index 9acd574..96156a2 100644 --- a/facho/fe/nomina/__init__.py +++ b/facho/fe/nomina/__init__.py @@ -172,6 +172,16 @@ class InformacionGeneral: CUNE = cune_hash ) +class DianXMLExtensionSigner(fe.DianXMLExtensionSigner): + + def __init__(self, pkcs12_path, passphrase=None, mockpolicy=False): + super().__init__(pkcs12_path, passphrase=passphrase, mockpolicy=mockpolicy) + + def build(self, fachoxml): + signature = self.sign_xml_element(fachoxml.root) + xpath = fachoxml.xpath_from_root('/ext:UBLExtensions/ext:UBLExtension/ext:ExtensionContent') + extcontent = fachoxml.get_element(xpath) + fachoxml.append_element(extcontent, signature) class DIANNominaXML: def __init__(self, tag_document): @@ -180,7 +190,7 @@ class DIANNominaXML: # layout, la dian requiere que los elementos # esten ordenados segun el anexo tecnico - self.fexml.placeholder_for('./UBLExtensions') + self.fexml.placeholder_for('./ext:UBLExtensions/ext:UBLExtension/ext:ExtensionContent') self.fexml.placeholder_for('./Novedad', optional=True) self.fexml.placeholder_for('./Periodo') self.fexml.placeholder_for('./NumeroSecuenciaXML') diff --git a/tests/test_nomina.py b/tests/test_nomina.py index 961f9b2..f575d0e 100644 --- a/tests/test_nomina.py +++ b/tests/test_nomina.py @@ -9,6 +9,15 @@ import pytest from facho import fe +import helpers + +def assert_error(errors, msg): + for error in errors: + if str(error) == msg: + return True + + raise "wants error: %s" % (msg) + def test_adicionar_devengado_Basico(): nomina = fe.nomina.DIANNominaIndividual() @@ -210,13 +219,6 @@ def test_nomina_xml(): assert xml.get_element_text_or_attribute('/fe:NominaIndividual/ProveedorXML/@SoftwareSC') == 'yy' assert xml.get_element_text_or_attribute('/fe:NominaIndividual/ProveedorXML/@CodigoQR') != None -def assert_error(errors, msg): - for error in errors: - if str(error) == msg: - return True - - raise "wants error: %s" % (msg) - def test_asignar_pago(): nomina = fe.nomina.DIANNominaIndividual() @@ -224,3 +226,16 @@ def test_asignar_pago(): forma = fe.nomina.FormaPago(code='1'), metodo = fe.nomina.MetodoPago(code='1') )) + +def test_nomina_xmlsign(monkeypatch): + nomina = fe.nomina.DIANNominaIndividual() + xml = nomina.toFachoXML() + + signer = fe.nomina.DianXMLExtensionSigner('./tests/example.p12') + with monkeypatch.context() as m: + helpers.mock_urlopen(m) + xml.add_extension(signer) + + print(xml.tostring()) + elem = xml.get_element('/fe:NominaIndividual/ext:UBLExtensions/ext:UBLExtension/ext:ExtensionContent/ds:Signature') + assert elem is not None