Exemple #1
0
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
Exemple #2
0
    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")
Exemple #3
0
    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")
Exemple #4
0
def validate_cards(cards):
    if type(cards) != str:
        raise BadRequestException("La tarjeta no es un string")
    return None
Exemple #5
0
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
Exemple #6
0
def validate_flag(flag):
    if type(flag) != str:
        raise BadRequestException("El flag no es un string")
    return None
Exemple #7
0
def validate_phone(phone):
    if type(phone) != str:
        raise BadRequestException("El celular no es un string")
    return None
Exemple #8
0
def validate_nit(nit):
    if type(nit) != str:
        raise BadRequestException("El NIT no es un string")
    return None
Exemple #9
0
def validate_names(names):
    if type(names) != str:
        raise BadRequestException("El nombre no es un string")
    return None
Exemple #10
0
def validate_terminals(terminals):
    if type(terminals) != str:
        raise BadRequestException("La terminal no es un string")
    return None
Exemple #11
0
def validate_codes(codes):
    if type(codes) != str:
        raise BadRequestException("El código no es un string")
    return None
Exemple #12
0
    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")