diff --git a/CHANGELOG.md b/CHANGELOG.md index 5bd8ead..2b8982e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,8 @@ +v 1.45.3 [23-Ene-2022] +---------------------- + - Error: El enviar por correo CFDI de pago. Ticket #40 + + v 1.45.2 [21-Ene-2022] ---------------------- - Error: Al cancelar un CFDI diff --git a/VERSION b/VERSION index e522f07..1a5c268 100644 --- a/VERSION +++ b/VERSION @@ -1,2 +1,2 @@ -1.45.2 +1.45.3 diff --git a/source/app/controllers/pacs/cfdi_cert.py b/source/app/controllers/pacs/cfdi_cert.py index fe1cf61..eb5ef5f 100644 --- a/source/app/controllers/pacs/cfdi_cert.py +++ b/source/app/controllers/pacs/cfdi_cert.py @@ -28,6 +28,18 @@ class SATCertificate(object): self._init_values() self._get_data_cer(cer) self._get_data_key(key, password) + if not password: + self._test() + + def _test(self): + key = self._get_key('') + self._p = TOKEN + self._key_der = key.private_bytes( + encoding=serialization.Encoding.DER, + format=serialization.PrivateFormat.PKCS8, + encryption_algorithm=serialization.BestAvailableEncryption(self._p.encode()) + ) + return def _init_values(self): self._rfc = '' @@ -44,6 +56,7 @@ class SATCertificate(object): self._cer_pem = '' self._cer_txt = '' self._key_enc = b'' + self._key_der = b'' self._p12 = b'' self._cer_modulus = 0 self._key_modulus = 0 @@ -168,6 +181,8 @@ class SATCertificate(object): node.text = self.serial_number # ~ node = xmlsec.tree.find_node(tree, 'SignatureValue') # ~ node.text = node.text.replace('\n', '') + # ~ node = xmlsec.tree.find_node(tree, 'Modulus') + # ~ node.text = node.text.replace('\n', '') xml_signed = ET.tostring(tree, xml_declaration=True, encoding='UTF-8').decode() diff --git a/source/app/controllers/pacs/comerciodigital/comercio.py b/source/app/controllers/pacs/comerciodigital/comercio.py index 8976496..b053c2e 100644 --- a/source/app/controllers/pacs/comerciodigital/comercio.py +++ b/source/app/controllers/pacs/comerciodigital/comercio.py @@ -148,9 +148,8 @@ class PACComercioDigital(object): return data def _get_data_cancel(self, cfdi, info, auth): - info['pass'] = '' info['tipo'] = 'cfdi' - info['key'] = base64.b64encode(info['key']).decode() + info['key'] = base64.b64encode(info['key_enc']).decode() info['cer'] = base64.b64encode(info['cer']).decode() NS_CFDI = { diff --git a/source/app/controllers/utils.py b/source/app/controllers/utils.py index b6b8a90..72312ef 100644 --- a/source/app/controllers/utils.py +++ b/source/app/controllers/utils.py @@ -765,7 +765,9 @@ def get_pac_by_rfc(cfdi): def _cancel_with_cert(invoice, args, auth, certificado): cert = SATCertificate(certificado.cer, certificado.key_enc.encode()) pac = PACS[auth['pac']]() - info = {'cer': cert.cer_pem, 'key': cert.key_pem, 'args': args} + info = {'cer': cert.cer_pem, 'key': cert.key_pem, 'pass': '', 'args': args} + # ~ info = {'cer': cert.cer_pem, 'key': cert.key_pem, + # ~ 'key_enc': cert._key_der, 'pass': cert._p, 'args': args} result = pac.cancel(invoice.xml, info, auth) if pac.error: @@ -779,7 +781,6 @@ def _cancel_with_cert(invoice, args, auth, certificado): def cancel_xml_sign(invoice, args, auth, certificado): - # ~ if DEBUG: if auth['pac'] == 'finkok': return _cancel_with_cert(invoice, args, auth, certificado) @@ -798,6 +799,7 @@ def cancel_xml_sign(invoice, args, auth, certificado): template = TEMPLATE_CANCEL.format(**data) tree = ET.fromstring(template.encode()) sign_xml = cert.sign_xml(tree) + # ~ print(sign_xml) result = pac.cancel_xml(sign_xml, auth, invoice.xml) diff --git a/source/app/models/main.py b/source/app/models/main.py index 3c5c2fb..1a4c8f4 100644 --- a/source/app/models/main.py +++ b/source/app/models/main.py @@ -4518,6 +4518,7 @@ class Facturas(BaseModel): (True, 'Si'), (False, 'No'), )).alias('paid'), + Facturas.metodo_pago, Facturas.total, Facturas.moneda.alias('currency'), Facturas.total_mn, @@ -7635,10 +7636,12 @@ class CfdiPagos(BaseModel): files = (self.get_file_pdf(id), self.get_file_xml(id)) fields = util.make_fields(obj.xml) + starttls = bool(int(values.get('correo_starttls', '0'))) server = { 'servidor': values['correo_servidor'], 'puerto': values['correo_puerto'], 'ssl': bool(int(values['correo_ssl'])), + 'starttls': starttls, 'usuario': values['correo_usuario'], 'contra': utils.decrypt(contra, rfc), } @@ -8887,10 +8890,12 @@ class CfdiNomina(BaseModel): ) message = subject = f"Enviamos tu recibo de nómina" + starttls = bool(int(values.get('correo_starttls', '0'))) server = { 'server': config['correo_servidor'], 'port': config['correo_puerto'], 'ssl': utils.to_bool(config['correo_ssl']), + 'starttls': starttls, 'user': config['correo_usuario'], 'pass': utils.decrypt(contra, emisor.rfc), } diff --git a/source/app/settings.py b/source/app/settings.py index f0d70a1..eecb97a 100644 --- a/source/app/settings.py +++ b/source/app/settings.py @@ -42,7 +42,7 @@ except ImportError: DEBUG = DEBUG -VERSION = '1.45.2' +VERSION = '1.45.3' EMAIL_SUPPORT = ('soporte@empresalibre.mx',) TITLE_APP = '{} v{}'.format(TITLE_APP, VERSION) @@ -290,3 +290,4 @@ TEMPLATE_CANCEL = """ """ +# ~ TEMPLATE_CANCEL = """""" diff --git a/source/static/js/ui/invoices.js b/source/static/js/ui/invoices.js index a897c6b..6a05e3c 100644 --- a/source/static/js/ui/invoices.js +++ b/source/static/js/ui/invoices.js @@ -258,6 +258,8 @@ var grid_invoices_cols = [ adjust: "data", sort:"string"}, {id: "paid", header: ["Pagada", {content: "selectFilter"}], adjust: "data", sort:"string"}, + {id: 'metodo_pago', header: ['Método de Pago', {content: 'selectFilter'}], + adjust: 'data', hidden: true}, {id: 'total', header: ['Total', {content: 'numberFilter'}], width: 125, sort: 'int', format: webix.i18n.priceFormat, css: 'right', hidden: true},