def DiferenciasRemesas(patrimonio, fechaCorteInicio, fechaCorteFin): try: consultaDiferenciaRemesas, mensaje = RespaldoRev.cuadratura_remesas() conexionDB = conexion() diferenciasMontos = dict() with conexionDB.cursor() as consulta_db: for i in range(0, 1): consulta_db.execute(consultaDiferenciaRemesas[i], pat_consulta=patrimonio, fecha_inicio=fechaCorteInicio, fecha_fin=fechaCorteFin) columns = [col[0] for col in consulta_db.description] consulta_db.rowfactory = lambda *args: dict(zip(columns, args)) data = consulta_db.fetchall() for diferencias in range(0, len(data)): fechaCorte = data[diferencias]['MOV_FECHA_MOVIMIENTO'] diferencia = data[diferencias]['DIFERENCIA'] if type(fechaCorte) is datetime.datetime: fechaCorte = fechaCorte.strftime("%d%m%Y") if not diferenciasMontos.get(fechaCorte): diferenciasMontos[fechaCorte] = { 'DIFERENCIA_POR_CUENTAS': diferencia } else: diferenciasMontos[fechaCorte][ 'DIFERENCIA_POR_CUENTAS'] += diferencia diferenciaPorCuentas = [data, columns] return diferenciasMontos, diferenciaPorCuentas except Exception as e: raise Exception('Error en DiferenciasRemesas: %s' % e)
def MovimientosDuplicados(patrimonio, fechaCorteInicio, fechaCorteFin): try: consultaAsientosContDuplicados, mensaje = RespaldoRev.cuadratura_remesas( ) conexionDB = conexion() movimientosDuplicados = dict() with conexionDB.cursor() as consulta_db: for i in range(1, 2): consulta_db.execute(consultaAsientosContDuplicados[i], pat_consulta=patrimonio, fecha_inicio=fechaCorteInicio, fecha_fin=fechaCorteFin) columns = [col[0] for col in consulta_db.description] consulta_db.rowfactory = lambda *args: dict(zip(columns, args)) data = consulta_db.fetchall() for duplicados in range(0, len(data)): fechaCorte = data[duplicados]['FECHA_MOVIMIENTO'] if type(fechaCorte) is datetime.datetime: fechaCorte = fechaCorte.strftime("%d%m%Y") movimientosDuplicados[fechaCorte] = { 'MOV_DUPLICADOS': data[duplicados]['CANTIDAD'] } return movimientosDuplicados except Exception as e: raise Exception('Error en MovimientosDuplicados: %s' % e)
def testClienteDuplicado(): patrimonio = 4 fecha_corte = '18012019' revisiones = 7 consultas, mensaje = RespaldoRev.detalle_valdiario('FIP', '') registrosXlsx = [] encabezadoDbXlsx = [] conexion_db = conexion() titulos = ( 'NEGOCIOS CON TIPO DE DOCUMENTO NULL', 'NEGOCIOS DUPLICADOS', 'CUOTAS DUPLICADAS', 'CUOTAS SIN NEGOCIO', 'NUMERO DE NEGOCIO NULL', 'MOVIMIENTOS INTERES EXTRAFIN SIN CUOTAS (006)', 'MOVIMIENTOS SIN CUOTAS (004, 007, 008, 009, 010, 011, 014, 016)', 'CLIENTES DUPLICADOS PATRIMONIOS TC') with conexion_db.cursor() as cursor: if revisiones == 7: for k in range(0, len(consultas[revisiones])): patTC = PATRIMONIOS_TC.get(patrimonio) cursor.execute(consultas[revisiones][k], pat_consulta=patrimonio, fecha_consulta=fecha_corte, pat_consultatc=patTC) columns = [col[0] for col in cursor.description] cursor.rowfactory = lambda *args: dict(zip(columns, args)) data = cursor.fetchall() encabezadoDbXlsx.append(columns) if len(data) > 0: registrosXlsx.append(data) else: registrosXlsx.append('') print(k) return registrosXlsx
async def vpnActiveLinux(ctx): try: cp = subprocess.run('sudo bash /usr/bin/start_vpn.sh', shell=True) await ctx.channel.send('Conectando VPN: %s' % cp.returncode) conexionDB = conexion() await ctx.send('Conexion con DB: %s OK' % str(conexionDB)) conexionDB.close except Exception as e: await ctx.send('Error VPN: %s' % e)
def DiferenciasAsientosContables(patrimonio, fechaCorte): try: consultaMontosAsientosCont, mensaje = RespaldoRev.cuadratura_remesas() conexionDB = conexion() diferenciasTRX = {'DIFERENCIA_TRX': 0} data = [] with conexionDB.cursor() as consulta_db: for i in range(2, 4): consulta_db.execute(consultaMontosAsientosCont[i], pat_consulta=patrimonio, fecha_inicio=fechaCorte) columns = [col[0] for col in consulta_db.description] consulta_db.rowfactory = lambda *args: dict(zip(columns, args)) data.append(consulta_db.fetchone()) for valor in range(0, len(data)): if data[valor] is not None: diferenciasTRX['DIFERENCIA_TRX'] += int( data[valor]['DIFERENCIA']) return diferenciasTRX except Exception as e: raise Exception('Error en DiferenciasAsientosContables: %s' % e)
async def revision_proceso_diario(ctx, patrimonio: int, fecha_corte: str): registrosRespaldo = [] nota = False await ctx.channel.send( ':regional_indicator_i::regional_indicator_n::regional_indicator_i::regional_indicator_c::regional_indicator_i::regional_indicator_o: -> PATRIMONIO: %s FECHA_CORTE: %s, porfavor espere...' % (patrimonio, fecha_corte)) try: conexionDB = conexion() entorno = ENTORNO_FIP['DB'] dblink = ENTORNO_FIP['DBLINK'] # Se crea el cuadro para dar el resumen de los resultados embed = discord.Embed( title= ':hugging: Carga correcta y sin inconsistencias encontradas :thumbsup:', description= "Este es el resumen de las validaciones realizadas para el patrimonio: %s y fecha de corte: %s" % (patrimonio, fecha_corte), timestamp=datetime.datetime.utcnow(), color=discord.Color.green()) # Consultas SQL y texto para seguimiento consultaDiario, mensaje = RespaldoRev.consulta_diario(entorno, dblink) await ctx.channel.send('Iniciando las consultas DB: %s' % str(conexionDB)) # Revision para el aptrimonio y fecha de corte with conexionDB.cursor() as consulta_db: for i in range(0, len(consultaDiario)): await ctx.channel.send(':fast_forward: Consultando ' + ':white_check_mark: ' + mensaje[i]) consulta_db.execute(consultaDiario[i], pat_consulta=patrimonio, fecha_consulta=fecha_corte) resultado = consulta_db.fetchone() if resultado[0] > 0: registrosRespaldo.append(resultado[0]) embed.add_field(name=mensaje[i], value=resultado[0], inline=True) if len(registrosRespaldo) == 6: erroresEncontrados = [] await ctx.channel.send( ':bar_chart: Existen registros para el patrimonio: ' + str(patrimonio) + ' fecha de corte: ' + fecha_corte) await ctx.channel.send( '.:regional_indicator_r::regional_indicator_e::regional_indicator_v::regional_indicator_i::regional_indicator_s::regional_indicator_i::regional_indicator_o::regional_indicator_n: :regional_indicator_d::regional_indicator_e: :regional_indicator_l::regional_indicator_a: :regional_indicator_d::regional_indicator_a::regional_indicator_t::regional_indicator_a:' ) # Consultas SQL y texto para seguimiento consultaValidarCarga, mensajeValidacion = RespaldoRev.validaciones_diario( entorno, dblink) with conexionDB.cursor() as consulta_db: for i in range(0, len(consultaValidarCarga)): await ctx.channel.send( ':fast_forward: Consultando :white_check_mark: ' + mensajeValidacion[i]) if i == 7: patTC = PATRIMONIOS_TC.get(patrimonio) consulta_db.execute(consultaValidarCarga[i], pat_consulta=patrimonio, fecha_consulta=fecha_corte, pat_consultatc=patTC) else: consulta_db.execute(consultaValidarCarga[i], pat_consulta=patrimonio, fecha_consulta=fecha_corte) resultado = consulta_db.fetchone() erroresEncontrados.append(resultado[0]) await ctx.channel.send( '.:regional_indicator_f::regional_indicator_i::regional_indicator_n: :regional_indicator_d::regional_indicator_e: :regional_indicator_l::regional_indicator_a: :regional_indicator_r::regional_indicator_e::regional_indicator_v::regional_indicator_i::regional_indicator_s::regional_indicator_i::regional_indicator_o::regional_indicator_n:' ) # erroresEncontrados = [(1,),(1,),(1,),(1,),(1,)] archivoSqlAdjunto = [] archivo_sql = 0 archivo_xls = 0 # Bloque para agregar las inconsistencias a la salida por pantalla for i in range(0, len(erroresEncontrados)): if erroresEncontrados[i] > 0: embed.add_field(name=':x: %s' % mensajeValidacion[i], value=str(erroresEncontrados[i]), inline=False) embed.title = ':thinking: Carga completa pero con inconsistencias encontradas :thumbsdown:' embed.color = discord.Color.red() # Script para corregir inconsistencia if i != 8: if ScriptSQL.crear(i, patrimonio, fecha_corte, erroresEncontrados[i]): archivo_sql += 1 archivoSqlAdjunto.append(i) else: error = 'El Patrimonio: %s fecha de corte: %s tiene una ejeucion en el SATELITE.' % ( patrimonio, fecha_corte) recomendaciones = 'Si no reconoce esta ejeucion y desea realizar una nueva favor informar al correo: [email protected] y solicite script para realizar el borrado del proceso existente.' embed.add_field( name=':no_entry_sign: ERROR ENCONTRADO', value=error, inline=False) embed.add_field(name=':loudspeaker: RECOMENDACIONES', value=recomendaciones, inline=False) #Parametro para controlar los archivos que se adjuntaran al correo # Bloque para enviar correo if len(archivoSqlAdjunto) > 0: consultaErrorData, mensajeErrorData = RespaldoRev.detalle_valdiario( entorno, dblink) data_xls = crear_xls(patrimonio, fecha_corte, archivoSqlAdjunto, consultaErrorData, mensajeErrorData) if data_xls: archivo_xls += 1 # Se envia correo con las indicaciones repuesta = Correo.enviar(archivoSqlAdjunto, patrimonio, fecha_corte) respuesta_embed = 'Se envio un correo a la direccion: :incoming_envelope: %s con %s archivo .XLSX y %s scripts .SQL con las indicaciones para realizar las correcciones.' % ( repuesta, str(archivo_xls), str(archivo_sql)) embed.add_field(name='NOTA', value=respuesta_embed, inline=False) else: dblink_reports = ENTORNO_REPORTS['DBLINK'] await ctx.channel.send( ':x: No existen registros para el patrimonio: ' + str(patrimonio) + ' fecha de corte: ' + fecha_corte) embed.title = ':dizzy_face: Carga de la información para realizar revisón INCOMPLETA :thumbsdown:' embed.color = discord.Color.red() # Consultas SQL y texto para seguimiento consulta_reports, mensaje_reports = RespaldoRev.consulta_neg_remesas( 'reports', dblink_reports) data_reports = [] # Se valida que la informacion este cargada en el Reports await ctx.channel.send('Consultas adicionales...') with conexionDB.cursor() as consulta_db: for i in range(0, len(consulta_reports)): await ctx.channel.send( ':fast_forward: Consultando en Reports: ' + mensaje_reports[i]) consulta_db.execute(consulta_reports[i], pat_consulta=patrimonio, fecha_consulta=fecha_corte) data_reports.append(consulta_db.fetchone()) negocios_remesas = int(data_reports[0][0]) + int( data_reports[1][0]) remesas_reports = int(data_reports[1][0]) negocios_reports = int(data_reports[0][0]) if negocios_remesas == 0: error, recomendado, nota_msj = Mensaje.fip_wrap2_3( patrimonio, fecha_corte) elif remesas_reports == 0: error, recomendado, nota_msj = Mensaje.fip_wrap3( negocios_reports, patrimonio, fecha_corte) elif negocios_reports == 0: error, recomendado, nota_msj = Mensaje.fip_wrap2( patrimonio, fecha_corte) else: error, recomendado, nota_msj = Mensaje.reports_odi( patrimonio, fecha_corte) if len(registrosRespaldo) >= 1: nota_msj = "Si ya realizo la ejecucion del proceso ODI, espere a que este finalice y luego vuelva a ejecutar la revisión" embed.color = discord.Color.dark_gold() embed.add_field(name=':no_entry_sign: ERROR ENCONTRADO', value=error, inline=False) embed.add_field(name=':loudspeaker: RECOMENDACIONES', value=recomendado, inline=False) embed.add_field(name=':memo: NOTA', value=nota_msj, inline=False) await ctx.send(embed=embed) except Exception as e: embed = discord.Embed(title='Error no manejado :person_facepalming:', description='%s' % e, color=discord.Color.dark_red()) await ctx.send(embed=embed)
def crear_xls(patrimonio, fecha_corte, revisiones: [], consultas: (), mensaje: ()): nombre_archivo = 'INCONSISTENCIAS_PAT-%s_FCORT-%s' % (patrimonio, fecha_corte) workbook = xlsxwriter.Workbook('%s/csv_data/%s.xlsx' % (PAT_BOT['PATH'], nombre_archivo)) conexion_db = conexion() titulos = ( 'NEGOCIOS CON TIPO DE DOCUMENTO NULL', 'NEGOCIOS DUPLICADOS', 'CUOTAS DUPLICADAS', 'CUOTAS SIN NEGOCIO', 'NUMERO DE NEGOCIO NULL', 'MOVIMIENTOS INTERES EXTRAFIN SIN CUOTAS (006)', 'MOVIMIENTOS SIN CUOTAS (004, 007, 008, 009, 010, 011, 014, 016)', 'CLIENTES DUPLICADOS PATRIMONIOS TC') TablasClientesDup = [{ 0: '' }, { 1: 'FIP.FIP_CUENTAS' }, { 2: 'FIP.FIP_DIARIO_NEGOCIOS' }, { 3: 'FIP.FIP_EXTRA_IC' }, { 4: 'FIP.FIP_NEGOCIOS' }, { 5: 'FIP.FIP_CUENTA_CREDITO_IC' }] columnas = ('A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J') bold = workbook.add_format({ 'bold': True, 'font_name': 'Arial', 'font_size': 13, 'align': 'center', 'valign': 'vcenter', 'locked': True, 'border': 2, 'bg_color': '#3CB371' }) bold2 = workbook.add_format({ 'bold': True, 'font_name': 'Arial', 'font_size': 10, 'align': 'center', 'valign': 'vcenter', 'locked': True, 'border': 2, 'bg_color': '#FFA500' }) bold3 = workbook.add_format({ 'bold': True, 'font_name': 'Arial', 'font_size': 10, 'align': 'left', 'valign': 'vcenter', 'locked': True }) format_data = workbook.add_format({ 'font_name': 'Arial', 'font_size': 9, 'align': 'center', 'locked': True, 'border': 1 }) try: for i in range(0, len(revisiones)): registrosXlsx = [] encabezadoDbXlsx = [] # Nombrando cada hoja worksheet = workbook.add_worksheet('%s' % mensaje[revisiones[i]]) # Ingresando el titulo de cada hoja worksheet.merge_range('A1:F1', '%s' % titulos[revisiones[i]], bold) # Inmovilizar paneles worksheet.freeze_panes('A3') # Ajustar ancho de columnas with conexion_db.cursor() as cursor: if revisiones[i] == 7: for k in range(0, len(consultas[revisiones[i]])): patTC = PATRIMONIOS_TC.get(patrimonio) cursor.execute(consultas[revisiones[i]][k], pat_consulta=patrimonio, fecha_consulta=fecha_corte, pat_consultatc=patTC) columns = [col[0] for col in cursor.description] cursor.rowfactory = lambda *args: dict( zip(columns, args)) data = cursor.fetchall() encabezadoDbXlsx.append(columns) if len(data) > 0: registrosXlsx.append(data) else: registrosXlsx.append('') else: cursor.execute(consultas[revisiones[i]], pat_consulta=patrimonio, fecha_consulta=fecha_corte) columns = [col[0] for col in cursor.description] cursor.rowfactory = lambda *args: dict(zip(columns, args)) data = cursor.fetchall() encabezadoDbXlsx.append(columns) if len(data) > 0: registrosXlsx.append(data) else: registrosXlsx.append('') row = 1 for consulta in range(0, len(registrosXlsx)): col = 0 if consulta > 0: worksheet.write(row, 0, TablasClientesDup[consulta].get(consulta), bold3) row += 1 for k in encabezadoDbXlsx[consulta]: ajustar = '%s%s:%s%s' % (columnas[col], 2, columnas[col], 2) worksheet.set_column(ajustar, 20) worksheet.write(row, col, k, bold2) col += 1 row += 1 for fila in range(0, len(registrosXlsx[consulta])): col = 0 for key, valor in registrosXlsx[consulta][fila].items(): if type(valor) is datetime.datetime: valor = valor.strftime("%d/%m/%Y") worksheet.write(row, col, valor, format_data) worksheet.write( row + 1, col, '', ) col += 1 row += 1 row += 1 workbook.close() return True except Exception as e: raise Exception("Error al crear archivo .XLS. Error: %s" % (e))