Fix get status sat, issue #422

This commit is contained in:
Mauricio Baeza 2021-02-09 22:49:57 -06:00
commit 537cecbb0b
6 changed files with 72 additions and 6 deletions

View File

@ -1,3 +1,8 @@
v 1.40.1 [10-Feb-2021]
----------------------
- Fix #422
v 1.40.0 [05-ene-2021] v 1.40.0 [05-ene-2021]
---------------------- ----------------------
- Error: Al parsear XML en Python 3.9+ - Error: Al parsear XML en Python 3.9+

View File

@ -1 +1 @@
1.40.0 1.40.1

View File

@ -430,9 +430,9 @@ def _get_uuid_fecha(xml):
return node.attrib['UUID'], node.attrib['FechaTimbrado'] return node.attrib['UUID'], node.attrib['FechaTimbrado']
def get_sat(xml): # ~ def get_sat(xml):
from .pac import get_status_sat # ~ from .pac import get_status_sat
return get_status_sat(xml) # ~ return get_status_sat(xml)
class LIBO(object): class LIBO(object):

View File

@ -32,6 +32,7 @@ import subprocess
import threading import threading
import zipfile import zipfile
from pathlib import Path from pathlib import Path
from urllib import request
from email.mime.multipart import MIMEMultipart from email.mime.multipart import MIMEMultipart
from email.mime.base import MIMEBase from email.mime.base import MIMEBase
@ -698,3 +699,63 @@ def cancel_xml_sign(invoice, auth, certificado):
data = {'ok': True, 'msg': msg, 'row': {'estatus': 'Cancelada'}, data = {'ok': True, 'msg': msg, 'row': {'estatus': 'Cancelada'},
'date': result['date'], 'acuse': result['acuse']} 'date': result['date'], 'acuse': result['acuse']}
return data return data
def _get_data_sat(xml):
BF = 'string(//*[local-name()="{}"]/@{})'
NS_CFDI = {'cfdi': 'http://www.sat.gob.mx/cfd/3'}
try:
tree = etree.fromstring(xml.encode())
emisor = escape(
tree.xpath('string(//cfdi:Emisor/@rfc)', namespaces=NS_CFDI) or
tree.xpath('string(//cfdi:Emisor/@Rfc)', namespaces=NS_CFDI)
)
receptor = escape(
tree.xpath('string(//cfdi:Receptor/@rfc)', namespaces=NS_CFDI) or
tree.xpath('string(//cfdi:Receptor/@Rfc)', namespaces=NS_CFDI)
)
total = tree.get('total') or tree.get('Total')
uuid = tree.xpath(BF.format('TimbreFiscalDigital', 'UUID'))
except Exception as e:
return ''
data = f'?re={emisor}&rr={receptor}&tt={total}&id={uuid}'
return data
def get_status_sat(xml):
data = _get_data_sat(xml)
if not data:
return 'XML inválido'
data = """<?xml version="1.0" encoding="UTF-8"?>
<soap:Envelope
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<soap:Header/>
<soap:Body>
<Consulta xmlns="http://tempuri.org/">
<expresionImpresa>
{}
</expresionImpresa>
</Consulta>
</soap:Body>
</soap:Envelope>""".format(data)
headers = {
'SOAPAction': '"http://tempuri.org/IConsultaCFDIService/Consulta"',
'Content-type': 'text/xml; charset="UTF-8"'
}
URL = 'https://consultaqr.facturaelectronica.sat.gob.mx/consultacfdiservice.svc'
try:
result = requests.post(URL, data=data, headers=headers)
tree = etree.fromstring(result.text)
node = tree.xpath("//*[local-name() = 'Estado']")[0]
except Exception as e:
return 'Error: {}'.format(str(e))
return node.text

View File

@ -5155,7 +5155,7 @@ class Facturas(BaseModel):
@classmethod @classmethod
def get_status_sat(cls, id): def get_status_sat(cls, id):
obj = Facturas.get(Facturas.id == id) obj = Facturas.get(Facturas.id == id)
estatus_sat = util.get_sat(obj.xml) estatus_sat = utils.get_status_sat(obj.xml)
if obj.estatus_sat != estatus_sat: if obj.estatus_sat != estatus_sat:
obj.estatus_sat = estatus_sat obj.estatus_sat = estatus_sat
obj.save() obj.save()

View File

@ -42,7 +42,7 @@ except ImportError:
DEBUG = DEBUG DEBUG = DEBUG
VERSION = '1.40.0' VERSION = '1.40.1'
EMAIL_SUPPORT = ('soporte@empresalibre.mx',) EMAIL_SUPPORT = ('soporte@empresalibre.mx',)
TITLE_APP = '{} v{}'.format(TITLE_APP, VERSION) TITLE_APP = '{} v{}'.format(TITLE_APP, VERSION)