From 8cb4bf3e18eedfa5fc56737c4a80aa43d69c7da8 Mon Sep 17 00:00:00 2001 From: Mauricio Baeza Date: Sat, 12 Dec 2020 18:43:27 -0600 Subject: [PATCH] Agregar test estatus de CFDI --- ...v5.pdf => ComercioDigital_Timbrado_v5.pdf} | Bin source/comerciodigital/comercio.py | 29 +++++++++++++++ source/tests/tests_comercio.py | 34 ++++++++++++++++++ 3 files changed, 63 insertions(+) rename doc/Comercio_Digital/{ComercioDigital_v5.pdf => ComercioDigital_Timbrado_v5.pdf} (100%) diff --git a/doc/Comercio_Digital/ComercioDigital_v5.pdf b/doc/Comercio_Digital/ComercioDigital_Timbrado_v5.pdf similarity index 100% rename from doc/Comercio_Digital/ComercioDigital_v5.pdf rename to doc/Comercio_Digital/ComercioDigital_Timbrado_v5.pdf diff --git a/source/comerciodigital/comercio.py b/source/comerciodigital/comercio.py index ad9d985..65e0a78 100644 --- a/source/comerciodigital/comercio.py +++ b/source/comerciodigital/comercio.py @@ -47,6 +47,7 @@ class PACComercioDigital(object): 'timbra': ws.format('ws', 'timbre/timbrarV5.aspx'), 'cancel': ws.format('cancela', 'cancela3/cancelarUuid'), 'cancelxml': ws.format('cancela', 'cancela3/cancelarXml'), + 'status': ws.format('cancela', 'arws/consultaEstatus'), 'client': api.format('x3/altaEmpresa'), 'saldo': api.format('x3/saldo'), 'timbres': api.format('x3/altaTimbres'), @@ -63,10 +64,12 @@ class PACComercioDigital(object): if DEBUG: ws = 'https://pruebas.comercio-digital.mx/{}' + ws6 = 'https://pruebas6.comercio-digital.mx/arws/{}' URL = { 'timbra': ws.format('timbre/timbrarV5.aspx'), 'cancel': ws.format('cancela3/cancelarUuid'), 'cancelxml': ws.format('cancela3/cancelarXml'), + 'status': ws6.format('consultaEstatus'), 'client': api.format('x3/altaEmpresa'), 'saldo': api.format('x3/saldo'), 'timbres': api.format('x3/altaTimbres'), @@ -241,6 +244,32 @@ class PACComercioDigital(object): return result.text + def status(self, data, auth={}): + if not auth: + auth = AUTH + url = self.URL['status'] + + data = ( + f"USER={auth['user']}", + f"PWDW={auth['pass']}", + f"RFCR={data['rfc_receptor']}", + f"RFCE={data['rfc_emisor']}", + f"TOTAL={data['total']}", + f"UUID={data['uuid']}", + ) + data = '\n'.join(data) + print(data) + result = self._post(url, data) + + if result is None: + return '' + + if result.status_code != 200: + self._error(result.status_code) + return self.error + + return result.text + def _get_data_client(self, auth, values): data = [f"usr_ws={auth['user']}", f"pwd_ws={auth['pass']}"] fields = ( diff --git a/source/tests/tests_comercio.py b/source/tests/tests_comercio.py index 83b5fb0..c176d1e 100644 --- a/source/tests/tests_comercio.py +++ b/source/tests/tests_comercio.py @@ -200,6 +200,40 @@ class TestStamp(unittest.TestCase): self.assertEqual(cfdi_uuid, uid) self.assertEqual(status, expected) + def test_cfdi_status(self): + expected = '' + cfdi = TestCfdi() + result = self.pac.stamp(cfdi.xml) + cfdi_uuid = self.pac.cfdi_uuid + + self.assertFalse(bool(self.pac.error)) + self.assertTrue(bool(uuid.UUID(cfdi_uuid))) + + NS_CFDI = { + 'cfdi': 'http://www.sat.gob.mx/cfd/3', + 'tdf': 'http://www.sat.gob.mx/TimbreFiscalDigital', + } + tree = ET.fromstring(result.encode()) + rfc_emisor = tree.xpath( + 'string(//cfdi:Comprobante/cfdi:Emisor/@Rfc)', + namespaces=NS_CFDI) + rfc_receptor = tree.xpath( + 'string(//cfdi:Comprobante/cfdi:Receptor/@Rfc)', + namespaces=NS_CFDI) + total = tree.xpath( + 'string(//cfdi:Comprobante/@Total)', + namespaces=NS_CFDI) + + time.sleep(3) + data = { + 'rfc_receptor': rfc_receptor, + 'rfc_emisor': rfc_emisor, + 'total': total, + 'uuid': cfdi_uuid, + } + result = self.pac.status(data) + self.assertEqual(result, expected) + if __name__ == '__main__': unittest.main()