• No results found

Recent Case Law Interface between Brussels 1 and Arbitration

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