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,7 +120,6 @@ 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) | ||||||
|   | |||||||
| @@ -136,21 +136,30 @@ def test_invoice_totals(simple_invoice_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() | ||||||
|     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( | ||||||
|  |             1.00, '94'), | ||||||
|         description='producto', |         description='producto', | ||||||
|         item=form.StandardItem(111), |         item=form.StandardItem(111), | ||||||
|         price=form.Price(form.Amount(1_500_000), '01', ''), |         price=form.Price(form.Amount(1_500_000), '01', ''), | ||||||
| @@ -159,7 +168,9 @@ def test_invoice_cufe(simple_invoice_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() | ||||||
| @@ -171,34 +182,49 @@ def test_invoice_cufe(simple_invoice_without_lines): | |||||||
|         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" | ||||||
|  |  | ||||||
| @@ -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