From 0a04ec6c2637d84f686e2e2dd10c053fb087d2e2 Mon Sep 17 00:00:00 2001 From: Mauricio Baeza Date: Sun, 3 Jan 2021 19:44:52 -0600 Subject: [PATCH] Cancel old with Finkok --- .../pacs/comerciodigital/comercio.py | 9 ++++- source/app/controllers/pacs/finkok/finkok.py | 8 ++++- source/app/controllers/utils.py | 34 ++++++++++++++----- source/app/models/main.py | 6 ++-- 4 files changed, 43 insertions(+), 14 deletions(-) diff --git a/source/app/controllers/pacs/comerciodigital/comercio.py b/source/app/controllers/pacs/comerciodigital/comercio.py index b9aea73..365b47e 100644 --- a/source/app/controllers/pacs/comerciodigital/comercio.py +++ b/source/app/controllers/pacs/comerciodigital/comercio.py @@ -249,7 +249,14 @@ class PACComercioDigital(object): self._error(result.headers['errmsg']) return '' - return result.text + tree = ET.fromstring(result.text) + date_cancel = tree.xpath('string(//Acuse/@Fecha)')[:19] + + data = { + 'acuse': result.text, + 'date': date_cancel, + } + return data def status(self, data, auth={}): if not auth: diff --git a/source/app/controllers/pacs/finkok/finkok.py b/source/app/controllers/pacs/finkok/finkok.py index 76c936a..e9bfa6f 100644 --- a/source/app/controllers/pacs/finkok/finkok.py +++ b/source/app/controllers/pacs/finkok/finkok.py @@ -196,7 +196,7 @@ class PACFinkok(object): return rfc_emisor, cfdi_uuid def cancel(self, cfdi, info, auth={}): - if not auth: + if DEBUG or not auth: auth = AUTH rfc_emisor, cfdi_uuid = self._get_data_cancel(cfdi) @@ -255,6 +255,12 @@ class PACFinkok(object): folio = result['Folios']['Folio'][0] status = folio['EstatusUUID'] + + if status == '708': + self._error = 'Error 708 del SAT, intenta más tarde.' + log.error(self.error) + return '' + if status != '201': log.debug(f'Cancel status: {status} -') diff --git a/source/app/controllers/utils.py b/source/app/controllers/utils.py index 3300f05..232ac37 100644 --- a/source/app/controllers/utils.py +++ b/source/app/controllers/utils.py @@ -657,13 +657,32 @@ def get_pac_by_rfc(cfdi): return RFCS[rfc_pac] +def _cancel_finkok(invoice, auth, certificado): + cert = SATCertificate(certificado.cer, certificado.key_enc.encode()) + pac = PACS[auth['pac']]() + info = {'cer': cert.cer_pem, 'key': cert.key_pem} + + result = pac.cancel(invoice.xml, info, auth) + if pac.error: + data = {'ok': False, 'msg': pac.error, 'row': {}} + return data + + msg = 'Factura cancelada correctamente' + data = {'ok': True, 'msg': msg, 'row': {'estatus': 'Cancelada'}, + 'date': result['date'], 'acuse': result['acuse']} + return data + + def cancel_xml_sign(invoice, auth, certificado): + if auth['pac'] == 'finkok': + return _cancel_finkok(invoice, auth, certificado) + cert = SATCertificate(certificado.cer, certificado.key_enc.encode()) pac = PACS[auth['pac']]() data = { 'rfc': certificado.rfc, 'fecha': now().isoformat()[:19], - 'uuid': invoice.uuid, + 'uuid': str(invoice.uuid).upper(), } template = TEMPLATE_CANCEL.format(**data) tree = ET.fromstring(template.encode()) @@ -672,13 +691,10 @@ def cancel_xml_sign(invoice, auth, certificado): result = pac.cancel_xml(sign_xml, auth, invoice.xml) if pac.error: - result = {'ok': False, 'msg': pac.error, 'row': {}} - return result - - tree = ET.fromstring(result) - date_cancel = tree.xpath('string(//Acuse/@Fecha)')[:19] + data = {'ok': False, 'msg': pac.error, 'row': {}} + return data msg = 'Factura cancelada correctamente' - result = {'ok': True, 'msg': msg, 'row': {'estatus': 'Cancelada'}, - 'Fecha': date_cancel, 'Acuse': result} - return result + data = {'ok': True, 'msg': msg, 'row': {'estatus': 'Cancelada'}, + 'date': result['date'], 'acuse': result['acuse']} + return data diff --git a/source/app/models/main.py b/source/app/models/main.py index 5e5d3db..1679bea 100644 --- a/source/app/models/main.py +++ b/source/app/models/main.py @@ -392,7 +392,7 @@ class Configuracion(BaseModel): return True return False - def _get_partners(self): + def _get_partners(self, args={}): fields = ( 'chk_config_change_balance_partner', ) @@ -3879,8 +3879,8 @@ class Facturas(BaseModel): invoice.estatus = 'Cancelada' invoice.error = '' invoice.cancelada = True - invoice.fecha_cancelacion = result['Fecha'] - invoice.acuse = result['Acuse'] or '' + invoice.fecha_cancelacion = result['date'] + invoice.acuse = result['acuse'] or '' cls._actualizar_saldo_cliente(cls, invoice, True) cls._update_inventory(cls, invoice, True) cls._uncancel_tickets(cls, invoice)