Scenarios 1 a ‘straightforward’ case where a 25-page document is translated, court fees are paid in addition to lawyers’ charges for five hours The average cost of exequatur proceedings
4.2 Feedback from the Research on Key Issues
5.1.3 Recent Case Law Interface between Brussels 1 and Arbitration
def web_services_sri(xml, clave_acceso, id_documento, id_tipo_ambiente, token, password, logo, key, tipo_doc, codigo_numerico, comprobante, nombre_comercial, datos_empresa):
"""
Ejecuta el proceso de envío, validación y autorización de comprobantes tributarios
parm: xml, clave_acceso, id_documento, id_tipo_ambiente, token, password, logo, key, tipo_doc, codigo_numerico,
:param comprobante
:param nombre_comercial Se usa para el email """ if tipo_doc == 1: tabla_comprobante = 'factura' elif tipo_doc == 7: tabla_comprobante = 'retencion' elif tipo_doc == 4: tabla_comprobante = 'nota_credito' in_xml = 'xml/' + xml
u.firmar_xml(in_xml, xml, token, password) if not os.path.isfile('xml_signed/' + xml): print 'No se encuentra el xml firmado!' return 1
factura_file = open('xml_signed/' + xml, "r") factura_xml = factura_file.read() factura_file.close() factura_firmada_xml = libxml2.parseDoc(factura_xml) archivo_xml = base64.encodestring(factura_firmada_xml.serialize()) if id_tipo_ambiente == 1:
print 'Ambiente de PRUEBAS'
url = ("https://celcer.sri.gob.ec/comprobantes-electronicos-ws/" "RecepcionComprobantes?wsdl")
url2 = ("https://celcer.sri.gob.ec/comprobantes-" "electronicos-ws/AutorizacionComprobantes?wsdl") elif id_tipo_ambiente == 2:
print 'Ambiente de PRODUCCION'
url = ("https://cel.sri.gob.ec/comprobantes-electronicos-ws/" "RecepcionComprobantes?wsdl") url2 = ("https://cel.sri.gob.ec/comprobantes-" "electronicos-ws/AutorizacionComprobantes?wsdl") enviar_nuevamente = False ciclo_clave_registrada = False while True: # Ciclo general
while True: # Ciclo de envio de comprobante try:
print 'Enviando comprobante...' client = suds.client.Client(url)
respuesta_envio_comprobante = client.service.validarComprobante(archivo_xml) break
except Exception, e: print e
print 'WebService Recepcion Comprobante NO disponible!!!' if respuesta_envio_comprobante:
estado_comprobante = respuesta_envio_comprobante[0] enviar_nuevamente = False
while True: # ciclo de CLAVE ACCESO REGISTRADA if estado_comprobante == 'RECIBIDA':
ciclo_clave_registrada = True print 'Se ha recibido el comprobante!' reintento_respuesta = 0
while True: # Ciclo de respuesta
while True: # Ciclo de autorizacion de comprobante try:
client = suds.client.Client(url2)
respuesta_autorizacion = client.service.autorizacionComprobante(clave_acceso) break
except Exception, e: print e
print 'WebService de Consulta Autorizacion NO disponible' print 'Reintentando...'
if respuesta_autorizacion:
print 'Numero de envios al SRI: %d' % (int(respuesta_autorizacion[1]),) numero_intentos_autorizacion = int(respuesta_autorizacion[1]) print 'Clave: ', respuesta_autorizacion[0]
i = 0
if respuesta_autorizacion[1] == 0: print 'Esperando Respuesta....' time.sleep(3) continue try: j = respuesta_autorizacion.autorizaciones[0] except Exception, e: reintento_respuesta += 1
print 'Respuesta vacia Reintento %s...' % (reintento_respuesta,) time.sleep(3)
if reintento_respuesta == 6: enviar_nuevamente = True
break # Rompe el ciclo de respuesta continue # Vuelve ciclo de respuesta
for autorizacion in respuesta_autorizacion.autorizaciones[0]: i += 1
if autorizacion.estado == 'NO AUTORIZADO': u.create_dir('no_aut')
archivos = open('no_aut/' + xml, 'a') archivos.write(str(respuesta_autorizacion)) archivos.close()
print '\nIntento:', i
print 'ERROR AL AUTORIZAR COMPROBANTE!!!' print '\nEstado: ', autorizacion.estado
estado = autorizacion.estado
print 'Fecha de autorizacion: ', autorizacion.fechaAutorizacion fecha_autorizacion = autorizacion.fechaAutorizacion #print 'Tipo ambiente: ', autorizacion.ambiente desc_error = []
codigo_error = [] info_adicional = [] ind = 0
try:
for mensaje in autorizacion.mensajes[0]: print 'Nro Identificador:', mensaje.identificador print 'Mensaje: ', mensaje.mensaje
print 'Tipo de mensaje: ', mensaje.tipo if mensaje.tipo == 'ERROR':
codigo_error.append(mensaje.identificador) desc_error.append(mensaje.mensaje) try:
print 'Información adicional: ', mensaje.informacionAdicional info_adicional.append(mensaje.informacionAdicional) except Exception, e: info_adicional.append('') ind += 1 except Exception: pass
# CLAVE ACCESO REGISTRADA if int(codigo_error[0]) == 43: sql = '''SELECT count(*) FROM %s
WHERE clave_acceso = '%s' AND NOT dado_baja ''' % (tabla_comprobante, clave_acceso)
resp = u.data_read(sql) numero_comprobante = resp[0]
n_comprobantes = int(numero_comprobante['count']) if n_comprobantes <= 1:
for aut in respuesta_autorizacion.autorizaciones[0]: if aut.estado == 'AUTORIZADO':
fecha_autorizacion = aut.fechaAutorizacion num_autorizacion = aut.numeroAutorizacion u.create_dir('aut')
archivos = codecs.open('aut/' + clave_acceso + 'sri.xml', 'w', encoding='utf-8')
archivos.write(aut.comprobante) archivos.close()
u.create_dir('ride')
if tipo_doc == FACTURA or tipo_doc == NOTA_CREDITO: pdf_generator.generarPdf('aut/' + clave_acceso + 'sri.xml', 'ride/' + clave_acceso + '.pdf',
num_autorizacion, fecha_autorizacion, key, logo, key, datos_empresa, comprobante) elif tipo_doc == RETENCION:
pdf_generator_retencion.generar_pdf('aut/' + clave_acceso + 'sri.xml', 'ride/' + clave_acceso + '.pdf', num_autorizacion, fecha_autorizacion,
key, logo, key)
ruta_ride = os.getcwd() + '/ride/' + clave_acceso + '.pdf' sql = ''' UPDATE %s SET clave_acceso = '%s', estado_autorizacion = '%s', fecha_hora_autorizacion ='%s', numero_autorizacion='%s', numero_intentos_autorizacion='%s', ruta_ride='%s' WHERE id = %s;
''' % (tabla_comprobante, clave_acceso, aut.estado,
fecha_autorizacion.strftime('%Y-%m-%d %H:%M:%S'), num_autorizacion,
numero_intentos_autorizacion, ruta_ride, id_documento) u.updateSql(sql)
print 'DOCUMENTO AUTORIZADO ANTERIORMENTE OK...' print 'ID: ', id_documento, ' actualizado.\n'
print 'KEY FIREBIRD: ', key, '\n\n' elif n_comprobantes > 1:
print 'Documento DUPLICADO %s veces ' % (n_comprobantes,) sql = ''' UPDATE %s SET clave_acceso='%s', estado_autorizacion='%s', codigo_error=%d, nombre_error='%s', fecha_hora_autorizacion='%s', descripcion_error='%s', numero_intentos_autorizacion= %s WHERE id = %s;
''' % (tabla_comprobante, clave_acceso, estado, int(codigo_error[0]), desc_error[0], fecha_autorizacion.strftime('%Y-%m-%d %H:%M:%S'), 'DUPLICADO', numero_intentos_autorizacion, id_documento) u.updateSql(sql)
print 'ID: ', id_documento, ' actualizada.\n' print 'KEY FIREBIRD: ', key, '\n\n' else: sql = ''' UPDATE %s SET clave_acceso='%s', estado_autorizacion='%s', codigo_error=%d, nombre_error='%s', fecha_hora_autorizacion='%s', descripcion_error='%s', numero_intentos_autorizacion= %s WHERE id = %s;
''' % (tabla_comprobante, clave_acceso, estado, int(codigo_error[ind-1]), desc_error[ind-1], fecha_autorizacion.strftime('%Y-%m-%d %H:%M:%S'), info_adicional[ind-1], numero_intentos_autorizacion, id_documento) u.updateSql(sql)
print 'ID: ', id_documento, ' actualizado.\n' print 'KEY FIREBIRD: ', key, '\n\n' if autorizacion.estado == 'AUTORIZADO': print 'ÉXITO!!!'
print ('El SRI retorno una AUTORIZACION válida para el comprobante:'), clave_acceso print '\nEstado: ', autorizacion.estado
estado = autorizacion.estado
print 'Fecha de autorizacion: ', autorizacion.fechaAutorizacion fecha_autorizacion = autorizacion.fechaAutorizacion
print 'Numero de Autorizacion: ', autorizacion.numeroAutorizacion num_autorizacion = autorizacion.numeroAutorizacion
#print 'Tipo ambiente: ', unicode(autorizacion.ambiente) try:
for mensaje in autorizacion.mensajes[0]: print 'Nro Identificador:', mensaje.identificador print 'Tipo de mensaje: ', mensaje.tipo print 'Mensaje: ', mensaje.mensaje try:
print 'Información adicional: ', mensaje.informacionAdicional except Exception:
pass except Exception: pass
u.create_dir('aut')
archivos = codecs.open('aut/' + clave_acceso + 'sri.xml', 'w', encoding='utf-8') archivos.write(autorizacion.comprobante)
archivos.close() u.create_dir('felect')
archivos = open('felect/' + clave_acceso + '.xml', 'w')
resp_xml = client.last_received().getChild("soap:Envelope").getChild( "soap:Body").getChild("ns2:autorizacionComprobanteResponse").getChild( "RespuestaAutorizacionComprobante") archivos.write(str(resp_xml)) archivos.close() ruta = os.getcwd()
rutaxml = ruta + '/felect/' + clave_acceso + '.xml' u.create_dir('ride')
if tipo_doc == FACTURA or tipo_doc == NOTA_CREDITO: pdf_generator.generarPdf('aut/' + clave_acceso + 'sri.xml', 'ride/' + clave_acceso + '.pdf',
num_autorizacion, fecha_autorizacion, key, logo, key, datos_empresa, comprobante)
elif tipo_doc == RETENCION:
pdf_generator_retencion.generar_pdf('aut/' + clave_acceso + 'sri.xml', 'ride/' + clave_acceso + '.pdf',
num_autorizacion, fecha_autorizacion, key, logo, key)
ruta_ride = os.getcwd() + '/ride/' + clave_acceso + '.pdf' sql = ''' UPDATE %s SET clave_acceso = '%s', estado_autorizacion = '%s', fecha_hora_autorizacion ='%s', numero_autorizacion='%s', numero_intentos_autorizacion='%s', ruta_xml='%s', ruta_ride='%s' WHERE id = %s;
''' % (tabla_comprobante, clave_acceso, estado,
fecha_autorizacion.strftime('%Y-%m-%d %H:%M:%S'), num_autorizacion,
numero_intentos_autorizacion, rutaxml, ruta_ride, id_documento) u.updateSql(sql)
print '\nID DOCUMENTO ACTUALIZADO: %s' % (id_documento,) print 'KEY FIREBIRD:', key
email = str(comprobante['email']) # email = '[email protected]'
if email_regex.match(email):
numero_doc = '%s %s %s' % (comprobante['establecimiento'], comprobante['punto_venta'],
comprobante['numero_documento']) if tipo_doc == FACTURA:
tipo_documento = 'FACTURA'
cliente = comprobante['razonsocialcomprador'] elif tipo_doc == RETENCION:
tipo_documento = 'RETENCION'
cliente = comprobante['razonsocialsujetoretenido'] elif tipo_doc == NOTA_CREDITO:
tipo_documento = 'NOTA CREDITO' cliente = comprobante['razonsocialcomprador'] subproceso = Thread(target=u.enviar_correo, args=(email, cliente,
numero_doc, clave_acceso, num_autorizacion,
tipo_documento, nombre_comercial, [ruta_ride, rutaxml])) subproceso.start()
else:
print 'Correo %s inválido' % (email, ) if respuesta_autorizacion[1] > 1:
break
break # Rompe ciclo de respuesta if ciclo_clave_registrada:
break # Rompe ciclo de clave acceso registrada else:
print 'El Documento NO FUE RECIBIDO...' estado = respuesta_envio_comprobante[0] ciclo_clave_registrada = True
for res_comprobante in respuesta_envio_comprobante.comprobantes[0]: print 'ERROR EN RECEPCIÓN DEL COMPROBANTE!!!!' print 'Comprobante: ', res_comprobante.claveAcceso print '*** DETALLES DEL ERROR ***'
for mensajes in res_comprobante.mensajes: for mensaje in mensajes[1]:
print 'Mensaje: ', mensaje.mensaje msj = mensaje.mensaje
codigo_error = int(mensaje.identificador) print 'Identificador: ', mensaje.identificador print 'Tipo: ', mensaje.tipo
try:
print 'Información Adicional: ', mensaje.informacionAdicional info_adicional = mensaje.informacionAdicional except Exception: info_adicional = ""+"\n" if codigo_error == 43: ciclo_clave_registrada = True print '\n************************************' print '* CLAVE ACCESO REGISTRADA *' print '* Verificando en la base duplicado *' print '************************************' sql = '''SELECT count(*)
FROM %s
WHERE clave_acceso = '%s' AND NOT dado_baja ''' % (tabla_comprobante, clave_acceso)
resp = u.data_read(sql) numero_comprobante = resp[0]
n_comprobantes = int(numero_comprobante['count']) if n_comprobantes <= 1:
print '...No existe Duplicado' estado_comprobante = 'RECIBIDA' continue
print '...Documento Duplicado...'
# si el numero de autorizaciones mas 3 incremento el codigo numerico
if codigo_error == 70 and int(comprobante['numero_intentos_autorizacion']) > 2: cod_numerico = int(codigo_numerico) + 1
sql = ''' UPDATE %s SET codigo_numerico = %d WHERE id = %s
''' % (tabla_comprobante, cod_numerico, id_documento) u.updateSql(sql) sql = ''' UPDATE %s SET clave_acceso = '%s', estado_autorizacion = '%s', nombre_error = '%s', descripcion_error = '%s', codigo_error = %d WHERE id = %s ''' % (tabla_comprobante, res_comprobante.claveAcceso, estado, msj, info_adicional.replace("'", ''), codigo_error, id_documento) u.updateSql(sql)
print 'ID DOCUMENTO ACTUALIZADO:', id_documento print 'KEY FIREBIRD:', key
if ciclo_clave_registrada:
break # termino ciclo de clave registrada # fin ciclo clave acceso registrada
else:
print 'Error en la recepcion del documento' if not enviar_nuevamente:
break # Rompe el ciclo general
3.4.3.4. Función que me permite mostrar los comprobantes emitidos en la aplicación