diff --git a/facho/fe/fe.py b/facho/fe/fe.py index 48d11d6..e75dd25 100644 --- a/facho/fe/fe.py +++ b/facho/fe/fe.py @@ -8,13 +8,15 @@ import xades from datetime import datetime import OpenSSL import zipfile -import warnings +# import warnings import hashlib from contextlib import contextmanager from .data.dian import codelist from . import form from collections import defaultdict -from pathlib import Path +# from pathlib import Path + +from cryptography.hazmat.primitives.serialization import pkcs12 AMBIENTE_PRUEBAS = codelist.TipoAmbiente.by_name('Pruebas')['code'] AMBIENTE_PRODUCCION = codelist.TipoAmbiente.by_name('Producción')['code'] @@ -68,11 +70,11 @@ NAMESPACES = { } - def fe_from_string(document: str) -> FachoXML: return FeXML.from_string(document) -from contextlib import contextmanager + +# from contextlib import contextmanager @contextmanager def mock_xades_policy(): from mock import patch @@ -90,7 +92,7 @@ def mock_xades_policy(): mock.return_value = UrllibPolicyMock() yield - + class FeXML(FachoXML): def __init__(self, root, namespace): @@ -118,8 +120,7 @@ class FeXML(FachoXML): class DianXMLExtensionCUDFE(FachoXMLExtension): - - def __init__(self, invoice, tipo_ambiente = AMBIENTE_PRUEBAS): + def __init__(self, invoice, tipo_ambiente=AMBIENTE_PRUEBAS): self.tipo_ambiente = tipo_ambiente self.invoice = invoice @@ -351,7 +352,6 @@ class DianXMLExtensionSoftwareSecurityCode(FachoXMLExtension): class DianXMLExtensionSigner: - def __init__(self, pkcs12_path, passphrase=None, localpolicy=True): self._pkcs12_data = open(pkcs12_path, 'rb').read() self._passphrase = None @@ -362,7 +362,6 @@ class DianXMLExtensionSigner: @classmethod def from_bytes(cls, data, passphrase=None, localpolicy=True): self = cls.__new__(cls) - self._pkcs12_data = data self._passphrase = None self._localpolicy = localpolicy @@ -394,7 +393,6 @@ class DianXMLExtensionSigner: ) xml.append(signature) - ref = xmlsig.template.add_reference( signature, xmlsig.constants.TransformSha256, uri="", name="xmldsig-%s-ref0" % (id_uuid) ) @@ -428,9 +426,13 @@ class DianXMLExtensionSigner: POLICY_NAME, xmlsig.constants.TransformSha256) ctx = xades.XAdESContext(policy) - ctx.load_pkcs12(OpenSSL.crypto.load_pkcs12(self._pkcs12_data, - self._passphrase)) + ctx.load_pkcs12(pkcs12.load_key_and_certificates( + self._pkcs12_data, + self._passphrase)) + # ctx.load_pkcs12(OpenSSL.crypto.load_pkcs12( + # self._pkcs12_data, + # self._passphrase)) if self._localpolicy: with mock_xades_policy(): ctx.sign(signature) @@ -438,7 +440,7 @@ class DianXMLExtensionSigner: else: ctx.sign(signature) ctx.verify(signature) - #xmlsig take parent root + # xmlsig take parent root xml.remove(signature) return signature diff --git a/tests/test_fe_form.py b/tests/test_fe_form.py index 9b28f2e..ccd4576 100644 --- a/tests/test_fe_form.py +++ b/tests/test_fe_form.py @@ -127,39 +127,50 @@ def test_invoice_totals(simple_invoice_without_lines): simple_invoice.invoice_supplier.ident = '700085371' simple_invoice.invoice_customer.ident = '800199436' simple_invoice.add_invoice_line(form.InvoiceLine( - quantity = form.Quantity(1, '94'), - description = 'producto', - item = form.StandardItem(9999), - price = form.Price(form.Amount(1_500_000), '01', ''), - tax = form.TaxTotal( - subtotals = [ + quantity=form.Quantity(1, '94'), + description='producto', + item=form.StandardItem(9999), + price=form.Price(form.Amount(1_500_000), '01', ''), + tax=form.TaxTotal( + subtotals=[ form.TaxSubTotal( - scheme = form.TaxScheme('01'), - percent = 19.0 - )]) + scheme=form.TaxScheme('01'), + percent=19.0 + )]), + withholding=form.WithholdingTaxTotal( + subtotals=[]) )) simple_invoice.calculate() assert 1 == len(simple_invoice.invoice_lines) - assert form.Amount(1_500_000) == simple_invoice.invoice_legal_monetary_total.line_extension_amount - assert form.Amount(1_785_000) == simple_invoice.invoice_legal_monetary_total.payable_amount + assert form.Amount(1_500_000) == ( + simple_invoice.invoice_legal_monetary_total.line_extension_amount) + assert form.Amount(1_785_000) == ( + simple_invoice.invoice_legal_monetary_total.payable_amount) + def test_invoice_cufe(simple_invoice_without_lines): simple_invoice = simple_invoice_without_lines simple_invoice.invoice_ident = '323200000129' - simple_invoice.invoice_issue = datetime.strptime('2019-01-16 10:53:10-05:00', '%Y-%m-%d %H:%M:%S%z') - simple_invoice.invoice_supplier.ident = form.PartyIdentification('700085371', '5', '31') - simple_invoice.invoice_customer.ident = form.PartyIdentification('800199436', '5', '31') + simple_invoice.invoice_issue = datetime.strptime( + '2019-01-16 10:53:10-05:00', '%Y-%m-%d %H:%M:%S%z') + simple_invoice.invoice_supplier.ident = form.PartyIdentification( + '700085371', '5', '31') + simple_invoice.invoice_customer.ident = form.PartyIdentification( + '800199436', '5', '31') simple_invoice.add_invoice_line(form.InvoiceLine( - quantity = form.Quantity(1.00, '94'), - description = 'producto', - item = form.StandardItem(111), - price = form.Price(form.Amount(1_500_000), '01', ''), - tax = form.TaxTotal( - subtotals = [ + quantity=form.Quantity( + 1.00, '94'), + description='producto', + item=form.StandardItem(111), + price=form.Price(form.Amount(1_500_000), '01', ''), + tax=form.TaxTotal( + subtotals=[ form.TaxSubTotal( - scheme = form.TaxScheme('01'), - percent = 19.0 - )]) + scheme=form.TaxScheme('01'), + percent=19.0 + )]), + withholding=form.WithholdingTaxTotal( + subtotals=[]) )) simple_invoice.calculate() @@ -167,39 +178,54 @@ def test_invoice_cufe(simple_invoice_without_lines): cufe_extension = fe.DianXMLExtensionCUFE( simple_invoice, - tipo_ambiente = fe.AMBIENTE_PRODUCCION, - clave_tecnica = '693ff6f2a553c3646a063436fd4dd9ded0311471' + tipo_ambiente=fe.AMBIENTE_PRODUCCION, + clave_tecnica='693ff6f2a553c3646a063436fd4dd9ded0311471' ) formatVars = cufe_extension.formatVars() - #NumFac + + # NumFac assert formatVars[0] == '323200000129', "NumFac" - #FecFac + + # FecFac assert formatVars[1] == '2019-01-16', "FecFac" - #HoraFac + + # HoraFac assert formatVars[2] == '10:53:10-05:00', "HoraFac" - #ValorBruto + + # ValorBruto assert formatVars[3] == '1500000.00', "ValorBruto" - #CodImpuesto1 + + # CodImpuesto1 assert formatVars[4] == '01', "CodImpuesto1" - #ValorImpuesto1 + + # ValorImpuesto1 assert formatVars[5] == '285000.00', "ValorImpuesto1" - #CodImpuesto2 + + # CodImpuesto2 assert formatVars[6] == '04', "CodImpuesto2" - #ValorImpuesto2 + + # ValorImpuesto2 assert formatVars[7] == '0.00', "ValorImpuesto2" - #CodImpuesto3 + + # CodImpuesto3 assert formatVars[8] == '03', "CodImpuesto3" - #ValorImpuesto3 + + # ValorImpuesto3 assert formatVars[9] == '0.00', "ValorImpuesto3" - #ValTotFac + + # ValTotFac assert formatVars[10] == '1785000.00', "ValTotFac" - #NitOFE + + # NitOFE assert formatVars[11] == '700085371', "NitOFE" - #NumAdq + + # NumAdq assert formatVars[12] == '800199436', "NumAdq" - #ClTec + + # ClTec assert formatVars[13] == '693ff6f2a553c3646a063436fd4dd9ded0311471', "ClTec" - #TipoAmbiente + + # TipoAmbiente assert formatVars[14] == '1', "TipoAmbiente" xml_invoice.add_extension(cufe_extension) @@ -229,7 +255,9 @@ def test_credit_note_cude(simple_credit_note_without_lines): form.TaxSubTotal( scheme=form.TaxScheme('01'), percent=19.0 - )]) + )]), + withholding=form.WithholdingTaxTotal( + subtotals=[]) )) simple_invoice.calculate() diff --git a/tests/test_form_xml.py b/tests/test_form_xml.py index 01d87be..97b5ef4 100644 --- a/tests/test_form_xml.py +++ b/tests/test_form_xml.py @@ -62,6 +62,8 @@ def test_allowance_charge_in_invoice(simple_invoice_without_lines): form.TaxSubTotal( percent=19.0, )]), + withholding=form.WithholdingTaxTotal( + subtotals=[]) )) inv.add_allowance_charge(form.AllowanceCharge(amount=form.Amount(19.0))) @@ -92,8 +94,9 @@ def test_allowance_charge_in_invoice_line(simple_invoice_without_lines): subtotals=[ form.TaxSubTotal( percent=19.0, - )] - ), + )]), + withholding=form.WithholdingTaxTotal( + subtotals=[]), allowance_charge=[ form.AllowanceChargeAsDiscount(amount=form.Amount(10.0)) ]