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