def update_discount(): try: data = request.json get_rede_validator(data) info = data try: info = Sifco.get_sifco_from_card(data) info['name'], info['terminal'], info['tipo_trx'], info['code'] = \ data['name'], data["terminal"], 'redención', data['code'] except NotFoundException as ex: pass codes_query = Sifco_discount.update_code_from_discount(info) Sifco_request.update_request_redeem(info, info['name'], codes_query) trx_from_card = Sifco_request.get_trx_from_card(info) if trx_from_card > 3: raise BadRequestException( "No se permiten más intentos de redención") if codes_query == 0: return "El código no es válido" else: return "La información se actualizó correctamente", 200 except NotFoundException as ex: return jsonify(message=ex.__str__()), 404 except BadRequestException as ex: return jsonify(message=ex.__str__()), 400 except KeyErrorException as ex: return jsonify(message=ex.__str__()), 400 except Exception as ex: return jsonify(message=ex.__str__()), 500
def update_request_assign(input, name): tz = pytz.timezone('America/Bogota') date = datetime.datetime.now(tz = tz).strftime('%Y/%m/%d') time = datetime.datetime.now(tz = tz).strftime('%H:%M:%S') col_names = ['nu_tarjeta_sha256', 'status', 'terminal', 'cluster', 'monto_trx_cliente_historico', 'pckt_mcc_cant_trx', 'pckt_mcc_tck', 'activo_3m', 'no_trx_time', 'perc_cant_trx_total_historico', 'perc_cant_cliente_historico', 'perc_cant_trx_competencia_historico', 'perc_monto_trx_total_historico', 'perc_monto_cliente_historico', 'perc_monto_trx_competencia_historico', 'fecha', 'tipo_trx', 'hora'] if len(input) == 3: input['card'] = input['card'] if len(input['card']) == 64 else hashlib.sha256( str.encode(input['card'])).hexdigest() values = tuple([input['card']] + ['404'] + [input['terminal']] + [None] * (len(col_names) - 5) + [date] + ['cliente_nuevo']) else: input['status'], input['fecha'], input['hora'] = '200', date, time values = tuple([str(input[key]) for key in col_names if key in input]) nombres_col = ','.join([nombre.lower() for nombre in col_names]) try: cursor = db.cursor() strings = ['%s' for i in range(len(nombres_col.split(',')))] sql_insert_query = """ insert into sifco_requests_"""+name+""" (""" + \ nombres_col + """ ) values ( """ + ','.join( strings) + """) """ cursor.execute(sql_insert_query, values) db.commit() cursor.close() return None except (Exception, psycopg2.Error) as error: raise BadRequestException("Falla en la carga de datos")
def update_request_redeem(input, name, codes_query): # sólo se guardan las transacciones no exitosas de redención en base de datos, la transacción # exitosa se puede ver en la tabla sifco_discount # codes_query == 0 -> la tarjeta es nueva # codes_query == 1 -> el código es válido # codes_query == 2 -> el código no es válido colnames = [column.lower() for column in input] input = dict(zip(colnames, input.values())) tz = pytz.timezone('America/Bogota') date = datetime.datetime.now(tz=tz).strftime('%Y/%m/%d %H:%M:%S') col_names = ['nu_tarjeta_sha256', 'status', 'terminal', 'cluster', 'monto_trx_cliente_historico', 'pckt_mcc_cant_trx', 'pckt_mcc_tck', 'activo_3m', 'no_trx_time', 'perc_cant_trx_total_historico', 'perc_cant_cliente_historico', 'perc_cant_trx_competencia_historico', 'perc_monto_trx_total_historico', 'perc_monto_cliente_historico', 'perc_monto_trx_competencia_historico', 'fecha', 'tipo_trx'] if len(input) == 4: input['card'] = input['card'] if len(input['card']) == 64 else hashlib.sha256( str.encode(input['card'])).hexdigest() values = tuple( [input['card']] + ['404'] + [input['terminal']] + [None] * (len(col_names) - 5) + [date] + [ 'redención']) else: input['status'], input['fecha'] = '200', date values = tuple([str(input[key]) for key in col_names if key in input]) nombres_col = ','.join([nombre.lower() for nombre in col_names]) try: if codes_query == 1 or codes_query == 0: cursor = db.cursor() strings = ['%s' for i in range(len(nombres_col.split(',')))] sql_insert_query = """ insert into sifco_requests_""" + name + """ (""" + \ nombres_col + """ ) values ( """ + ','.join( strings) + """) """ cursor.execute(sql_insert_query, values) db.commit() cursor.close() return None except (Exception, psycopg2.Error) as error: raise BadRequestException("Falló la carga de los datos")
def validate_cards(cards): if type(cards) != str: raise BadRequestException("La tarjeta no es un string") return None
def validate_table(name): tables = Sifco.get_tables_name(name) tables = [table[0] for table in tables] if not set({'sifco_' + name}).issubset(set(tables)): raise BadRequestException("La tabla sifco_" + name + " no existe") return None
def validate_flag(flag): if type(flag) != str: raise BadRequestException("El flag no es un string") return None
def validate_phone(phone): if type(phone) != str: raise BadRequestException("El celular no es un string") return None
def validate_nit(nit): if type(nit) != str: raise BadRequestException("El NIT no es un string") return None
def validate_names(names): if type(names) != str: raise BadRequestException("El nombre no es un string") return None
def validate_terminals(terminals): if type(terminals) != str: raise BadRequestException("La terminal no es un string") return None
def validate_codes(codes): if type(codes) != str: raise BadRequestException("El código no es un string") return None
def create_code(input, terminal, name): tz = pytz.timezone('America/Bogota') promotion_dic = Sifco_offers.get_offers(name) input['fecha_compra'] = datetime.datetime.now( tz=tz).strftime('%Y/%m/%d, %H:%M:%S') input['fecha_expiracion'] = ( datetime.datetime.now(tz=tz) + datetime.timedelta( days=promotion_dic[str(input['client_type'])][1]) ).strftime('%Y/%m/%d') input['descuento'] = promotion_dic[str(input['client_type'])][0] input['terminal_compra'] = terminal input["cluster"] = input['client_type'] def new_code(n): codes_num = [[ str(np.random.randint(100, 999, n)[i]), str(date.today().strftime("%m")), str(date.today().strftime("%d")) ] for i in range(n)] codes_num = [random.sample(lista, k=3) for lista in codes_num] codes_num = [lista[0] + lista[1] + lista[2] for lista in codes_num] codes = [hashlib.sha1(lista.encode()) for lista in codes_num] codes = [lista.hexdigest() for lista in codes] return codes, codes_num codes = [] while len(codes) < 1: new_codes = new_code(1 - len(codes)) query = """ select codigo from sifco_discount_{} as sp where sp.codigo = '{}' and sp.fecha_redencion is null and current_date <= fecha_expiracion """.format(name, new_codes[0][0]) cursor = db.cursor() cursor.execute(query) results = cursor.fetchall() cursor.close() active_codes = list(map(lambda x: x[0], results)) valid_codes = list( set(new_codes[0]) - set(active_codes) - set(codes)) codes = codes + valid_codes input['codigo'] = codes[0] col_names = [ 'nu_tarjeta_sha256', 'codigo', 'descuento', 'fecha_compra', 'fecha_expiracion', 'terminal_compra', 'cluster' ] tuplas = tuple([str(input[key]) for key in col_names if key in input]) nombres_col = ','.join([nombre.lower() for nombre in col_names]) try: cursor = db.cursor() strings = ['%s' for i in range(len(nombres_col.split(',')))] sql_insert_query = """ insert into sifco_discount_""" + name + """ (""" + nombres_col + """ ) values ( """ + ','.join( strings) + """) """ cursor.execute(sql_insert_query, tuplas) db.commit() cursor.close() input['codigo'] = new_codes[1][0] del input['client_type'] return input except (Exception, psycopg2.Error) as error: raise BadRequestException("Falla en la carga de datos")