Exemplo n.º 1
0
def remover_produto_carrinho(carrinho):
    """
    Funcao para remover produtos do carrinho
    :param carrinho: lista de carrinho de compras
    :return: lista de carrinho de compras sem os produtos removidos
    """
    repetir = True
    while repetir:
        if not aux.checa_vazio(carrinho):
            aux.ver_estoque_ou_carrinho(carrinho, 'Carrinho')

            num_produto_remover = input(
                'Digite o numero do produto a ser '
                'removido do carrinho (0 (zero) para cancelar): ')

            produto_valido, num_produto = aux.valida_produto(
                num_produto_remover, carrinho)

            if produto_valido:
                if num_produto == 0:  # Cancelar operacao
                    print('Operacao cancelada')
                    return carrinho
                else:
                    # Tem que remover 1 de num_produto pois o indice de lista comeca em zero
                    produto_removido = carrinho.pop(num_produto - 1)

                # Pergunta se o usuario deseja repetir a operacao
                print(f'O produto {produto_removido["Produto"]} foi removido.')
                print('\nDeseja repetir a operacao?')
                repetir = aux.confirmacao()
        else:
            print('O carrinho estah vazio')
            break

    return carrinho
Exemplo n.º 2
0
def fechar_compra(carrinho, estoque, arquivo_com_estoque):
    """
    Funcao para remover a quantidade de cada produto comprada do estoque e salvar o novo estoque
    :param carrinho: lista com os produtos a serem comprados
    :param estoque:  lista com os produtos em estoque
    :param arquivo_com_estoque: arquivo ".txt" contendo o estoque
    :return: None
    """
    print('Compras finalizadas!')
    if not aux.checa_vazio(carrinho):
        aux.ver_estoque_ou_carrinho(carrinho, 'Carrinho')

        # Loop para remover os produtos comprados do estoque
        indice_inicial = 0
        for item_carrinho in carrinho:
            for indice in range(indice_inicial, len(estoque)):
                if estoque[indice]['Produto'] == item_carrinho['Produto']:
                    estoque[indice]['Em estoque'] -= item_carrinho['Carrinho']
                    # No proximo item do carrinho, pode procurar a partir de onde parou no estoque
                    # para economizar alguns loops (porque as listas estao em ordem alfabetica)
                    indice_inicial = indice + 1
                    break

        # Salvando o estado atual do estoque
        aux.atualiza_arquivo(arquivo_com_estoque, estoque)
Exemplo n.º 3
0
def remover_produto(arquivo_estoque):
    """
    Essa funcao remove produtos do estoque e salva o arquivo atualizado
    :param arquivo_estoque: string com o nome do arquivo ".txt" com os cadastros do usuario.
                            O arquivo deve conter uma lista de dicionarios com chaves = Produto, Preco, Em estoque
    :return: estoque atualizado
    """
    # Sequencia para cadastrar produtos
    while True:
        # Recupera o estoque mais atualizado
        print()
        estoque = recupera_estoque(arquivo_estoque)

        # Se o estoque esta vazio volta para o menu anterior
        if len(estoque) == 0:
            return estoque

        # Imprime o estoque na tela
        aux.ver_estoque_ou_carrinho(estoque)

        num_produto = input(
            '\nDigite o numero do produto a ser removido: (0 (zero) para cancelar) '
        )

        produto_valido, num_produto = aux.valida_produto(num_produto, estoque)

        if produto_valido:
            # Zero para cancelar a remocao
            if num_produto == 0:
                return estoque
            else:
                print(
                    f'\nConfirma a remocao de {estoque[num_produto - 1]["Produto"]} do estoque?'
                )

                if aux.confirmacao():
                    # Removendo o produto. (Como o indice comeca em zero, tem que retirar um de "produto")
                    dic_produto = estoque.pop(num_produto - 1)
                    print(
                        f'\nO produto ({dic_produto["Produto"]}) foi removido com sucesso.'
                    )

                    # Atualizando o arquivo de estoque
                    aux.atualiza_arquivo(arquivo_estoque, estoque)

                    # Pergunta se o usuario deseja repetir a operacao
                    print('\nDeseja repetir a operacao?')
                    if not aux.confirmacao():
                        break

    return estoque
Exemplo n.º 4
0
def cliente_acesso(lista_comandos, arquivo_com_estoque):
    # Recuperando o estoque
    estoque = adm.recupera_estoque(arquivo_com_estoque)

    # Se o estoque estah vazio, retorna None para voltar ao menu principal
    # Eh necessario ter itens no estoque para que o cliente possa comprar
    if aux.checa_vazio(estoque):
        print(
            'O estoque estah vazio. Eh necessario adicionar itens ao estoque primeiro.'
        )
        return None

    # Criando o carrinho
    carrinho = []

    # Loop de rotina de cliente
    while True:
        # Print para separar os comandos
        aux.separar_comandos_print()

        # Imprime os comandos para administradores
        print(f'Acessado como cliente.')
        aux.imprimir_comandos(lista_comandos)

        # Pede que o usuario escolha uma opcao ate ser dado um comando valido
        comando = aux.checa_comando(lista_comandos)
        print()

        # Chama a funcao que o usuario pediu
        if comando == 1:  # Ver carrinho
            aux.ver_estoque_ou_carrinho(carrinho, 'Carrinho')
        elif comando == 2:  # Adicionar um produto ao carrinho
            carrinho = cli.adicionar_produto_carrinho(estoque, carrinho)
        elif comando == 3:  # Remover um produto do carrinho
            carrinho = cli.remover_produto_carrinho(carrinho)
        elif comando == 4:  # Alterar quantidade de um produto
            if not aux.checa_vazio(carrinho):
                carrinho = cli.alterar_quantidade_carrinho(estoque, carrinho)
            else:
                print('O carrinho estah vazio')
        elif comando == 5:  # Fechar a compra
            cli.fechar_compra(carrinho, estoque, arquivo_com_estoque)
            break
        elif comando == 0:  # Sair
            break
Exemplo n.º 5
0
def adicionar_produto_carrinho(estoque, carrinho):
    """
    Adiciona um produto do estoque ao carrinho (se nao estiver adicionado ainda)
    :param estoque: lista com o estoque mais atualizado
    :param carrinho: lista com carrinho de compras mais atualizado
    :return: carrinho
    """
    repetir = True
    while repetir:
        aux.ver_estoque_ou_carrinho(estoque)

        if not aux.checa_vazio(carrinho):
            print()
            aux.ver_estoque_ou_carrinho(carrinho, 'Carrinho')

        produtos_no_carrinho = [produto['Produto'] for produto in carrinho]

        num_produto_para_add = input(
            'Digite o numero do produto a ser '
            'adicionado ao carrinho (0 (zero) para cancelar): ')

        produto_valido, num_produto = aux.valida_produto(
            num_produto_para_add, estoque)

        if produto_valido:
            if num_produto == 0:  # Cancelar operacao
                print('Operacao cancelada')
                return carrinho
            else:
                # Tem que remover 1 de num_produto pois o indice de lista comeca em zero
                if estoque[num_produto - 1]["Produto"] in produtos_no_carrinho:
                    print('Este produto ja estah no carrinho.')
                else:
                    carrinho.append(estoque[num_produto - 1].copy())
                    carrinho = alterar_quantidade_carrinho(
                        estoque, carrinho, True)
                    carrinho.sort(
                        key=lambda dict_produto: dict_produto['Produto'])

            # Pergunta se o usuario deseja repetir a operacao
            print('\nDeseja repetir a operacao?')
            repetir = aux.confirmacao()

    return carrinho
Exemplo n.º 6
0
def adm_acesso(lista_comandos, arquivo_adms, arquivo_estoque):
    """
    Funcao com o fluxo de um adm

    :param lista_comandos: lista com os comandos possiveis para os adms
    :param arquivo_adms: string com o nome do arquivo ".txt" com os cadastros do usuario.
                         O arquivo deve conter um dicionario com chave = nome do usuario
                         e valor = senha criptografada
    :param arquivo_estoque: string com o nome do arquivo ".txt" com os cadastros do usuario.
                            O arquivo deve conter uma lista de dicionarios com chaves = Produto, Preco, Em estoque
    :return:
    """
    # Print para separar os comandos
    aux.separar_comandos_print()

    # Primeira coisa a ser feita eh recuperar os adms cadastrados
    adms = adm.dados_registrados(arquivo_adms)

    # Se nao tiver nenhum cadastrado, pedir para cadastrar o primeiro
    if len(adms) == 0:
        print(
            'Ainda nao ha administradores cadastrados. Eh necessario cadastrar o primeiro administrador.'
        )
        # Cadastrando
        adms, usuario_cadastrado = adm.cadastrar_adm(arquivo_adms)
        logado, usuario_ativo = True, usuario_cadastrado
    else:
        logado, usuario_ativo = adm.login(adms)

    # Se nao logou, eh pra sair e voltar pro menu principal
    if not logado:
        # Retornando None pra sair da funcao
        return None

    # Se logou, entra no menu dos administradores
    while True:
        # Se o usuario remover todos os adms (possivel), deve sair da area de adm
        if len(adms) == 0:
            # Retornando None pra sair da funcao
            return None

        # Print para separar os comandos
        aux.separar_comandos_print()

        # Imprime os comandos para administradores
        print(f'Acessado como administrador ({usuario_ativo})')
        aux.imprimir_comandos(lista_comandos)

        # Pede que o usuario escolha uma opcao ate ser dado um comando valido
        comando = aux.checa_comando(lista_comandos)
        print()

        # Chama a funcao que o usuario pediu
        if comando == 1:  # Ver estoque
            estoque = adm.recupera_estoque(arquivo_estoque)
            aux.ver_estoque_ou_carrinho(estoque)
        elif comando == 2:  # Cadastrar novo produto
            adm.cadastrar_produto(arquivo_estoque)
        elif comando == 3:  # Remover um produto da lista
            adm.remover_produto(arquivo_estoque)
        elif comando == 4:  # Alterar preco de um produto
            adm.alterar_preco_ou_quantidade('loja_estoque.txt', 'preco')
        elif comando == 5:  # Atualizar estoque de um produto
            adm.alterar_preco_ou_quantidade('loja_estoque.txt', 'quantidade')
        elif comando == 6:  # Adicionar novo administrador
            adms, usuario_cadastrado = adm.cadastrar_adm(arquivo_adms)
        elif comando == 7:  # Remover administrador
            adms, usuario_removido = adm.remover_adm(arquivo_adms)

            # Se o adm se removeu do cadastro, deve voltar para a funcao principal e pedir novo login
            if usuario_ativo == usuario_removido:
                print()
                print(
                    'O usuario ativo foi removido do cadastro. Eh necessaria nova autenticacao.'
                )
                break
        elif comando == 0:  # Sair
            break
Exemplo n.º 7
0
def alterar_quantidade_carrinho(estoque, carrinho, adicionando=False):
    # Se o produto estah sendo adicionado ao carrinho, nao eh necessario pedir o numero do produto
    # O numero sera -1 (ultimo da lista, que depois sera ordenada) e sera um produto valido
    indice_produto = -1
    produto_valido = True
    repetir = True

    while repetir:
        # Se nao estah adicionando (estah so alterando) um produto, eh preciso pedir o numero do produto e validar
        if not adicionando:
            aux.ver_estoque_ou_carrinho(estoque)
            aux.ver_estoque_ou_carrinho(carrinho, 'Carrinho')

            num_produto_para_alterar = input(
                'Digite o numero do produto a ser '
                'alterado no carrinho (0 (zero) para cancelar): ')

            produto_valido, indice_produto = aux.valida_produto(
                num_produto_para_alterar, carrinho)

            # Se zero, o usuario deseja cancelar
            if indice_produto == 0:
                print('Operacao cancelada.')
                return carrinho

            indice_produto -= 1  # O indice da lista comeca em zero

        if produto_valido:
            while True:
                quantidade = input(
                    f'Digite a quantidade de {carrinho[indice_produto]["Produto"]} '
                    f'que deseja manter no carrinho: ')

                try:
                    # Transforma em float para conseguir validar se a informacao do usuario eh int ou float
                    quantidade = float(quantidade)

                    if quantidade < 0 or quantidade > carrinho[indice_produto][
                            "Em estoque"]:
                        raise ValueError
                    elif int(quantidade) != float(quantidade):
                        raise ValueError
                except ValueError:
                    print(
                        f'Digite um numero valido (inteiro entre 0 e {carrinho[indice_produto]["Em estoque"]}).'
                    )
                else:
                    quantidade = int(quantidade)
                    carrinho[indice_produto]['Carrinho'] = quantidade
                    carrinho[indice_produto]['Total'] = carrinho[indice_produto]['Preco'] * \
                                                        carrinho[indice_produto]['Carrinho']
                    break

            # Se o produto esta sendo adicionado ao carrinho, o loop deve ser executado so uma vez
            if adicionando:
                break
            else:
                # Pergunta se o usuario deseja repetir a operacao
                print('\nDeseja repetir a operacao?')
                repetir = aux.confirmacao()

    # Loop para retirar produtos com quantidade = 0
    carrinho = [item for item in carrinho if item['Carrinho'] != 0]

    return carrinho
Exemplo n.º 8
0
    }, {
        'Produto': 'Leite',
        'Preco': 3.5,
        'Em estoque': 10
    }, {
        'Produto': 'Suco',
        'Preco': 4.5,
        'Em estoque': 10
    }]
    aux.atualiza_arquivo('teste_loja_estoque.txt', estoque_teste)
    estoque = recupera_estoque(arquivo_teste_estoque)
    carrinho = []

    carrinho = adicionar_produto_carrinho(estoque, carrinho)
    print('\n' * 3, 'RESULTADO:', sep='\n')
    aux.ver_estoque_ou_carrinho(carrinho, 'carrinho')
    aux.separar_comandos_print()

    ######################################################################

    print('TESTANDO A FUNCAO PARA REMOVER PRODUTOS DO CARRINHO')

    # Um carrinho generico para testar
    carrinho = [{
        'Produto': 'Cafe',
        'Preco': 6.0,
        'Em estoque': 20,
        'Carrinho': 10,
        'Total': 60
    }, {
        'Produto': 'Cerveja',
Exemplo n.º 9
0
def alterar_preco_ou_quantidade(arquivo_estoque,
                                preco_ou_quantidade='quantidade'):
    """
    Essa funcao altera o preco ou a quantidade em estoque de um produto e salva o arquivo atualizado
    :param arquivo_estoque: string com o nome do arquivo ".txt" com os cadastros do usuario.
                            O arquivo deve conter uma lista de dicionarios com chaves = Produto, Preco, Em estoque
    :param preco_ou_quantidade: String 'quantidade' ou 'preco' para indical qual variavel sera alterada
    :return: estoque atualizado
    """
    repetir = True
    while repetir:
        # Recupera o estoque mais atualizado
        print()
        estoque = recupera_estoque(arquivo_estoque)
        aux.ver_estoque_ou_carrinho(estoque)

        # Se o estoque esta vazio volta para o menu anterior
        if len(estoque) == 0:
            return estoque

        if preco_ou_quantidade == 'quantidade':
            num_produto = input(
                '\nDigite o numero do produto para alterar a quantidade (0 (zero) para cancelar): '
            )
        else:  # Preco
            num_produto = input(
                '\nDigite o numero do produto para alterar o preco (0 (zero) para cancelar): '
            )

        produto_valido, num_produto = aux.valida_produto(num_produto, estoque)

        if produto_valido:
            # Zero para cancelar a remocao
            if num_produto == 0:
                return estoque
            # Pedindo o novo preco ou nova quantidade
            else:
                while True:
                    if preco_ou_quantidade == 'quantidade':
                        nova_variavel = input(
                            f'Digite a nova quantidade do produto '
                            f'({estoque[num_produto - 1]["Produto"]}): ')
                    else:
                        nova_variavel = input(
                            f'Digite o novo preco '
                            f'do produto ({estoque[num_produto - 1]["Produto"]}): '
                        )

                    try:
                        if preco_ou_quantidade == 'quantidade':
                            nova_variavel = float(nova_variavel)

                            # A quantidade deve ser um numero inteiro
                            if not float(nova_variavel) == int(nova_variavel):
                                raise ValueError
                            else:
                                nova_variavel = int(nova_variavel)
                        else:  # Preco
                            nova_variavel = float(nova_variavel)

                        # Zero deixado intencionalmente
                        if nova_variavel < 0:
                            raise ValueError
                    except ValueError:
                        if preco_ou_quantidade == 'quantidade':
                            print(
                                f'Digite um numero valido (inteiro nao-negativo).'
                            )
                        else:
                            print(f'Digite um numero valido (nao-negativo).')
                    else:
                        break

            # Alterando o preco (tem que remover 1 pois o indice de lista comeca em zero)
            if preco_ou_quantidade == 'quantidade':
                estoque[num_produto - 1]['Em estoque'] = nova_variavel
            else:
                estoque[num_produto - 1]['Preco'] = nova_variavel

            # Salvando as alteracoes no arquivo
            aux.atualiza_arquivo(arquivo_estoque, estoque)

            # Pergunta se o usuario deseja repetir a operacao
            print('\nDeseja repetir a operacao?')
            repetir = aux.confirmacao()

    return estoque
Exemplo n.º 10
0
def cadastrar_produto(arquivo_estoque):
    """
    Essa funcao cadastra novos produtos no estoque e salva o arquivo atualizado
    :param arquivo_estoque: string com o nome do arquivo ".txt" com os cadastros do usuario.
                            O arquivo deve conter uma lista de dicionarios com chaves = Produto, Preco, Em estoque
    :return: estoque atualizado
    """
    # Recupera o estoque mais atualizado
    estoque = recupera_estoque(arquivo_estoque)
    aux.ver_estoque_ou_carrinho(estoque)

    # Produtos ja cadastrados para evitar repeticao
    produtos_cadastrados = [
        dic_produto['Produto'].capitalize() for dic_produto in estoque
    ]

    # Sequencia para cadastrar produtos
    repetir = True
    while repetir:
        produto = input(
            '\nDigite o produto a ser adicionado (0 (zero) para cancelar): ')

        # Se usuario digitou para sair, volta ao menu
        if produto == "0":
            return estoque
        else:
            produto = produto.capitalize()

        # Se o produto ja esta cadastrado, nao cadastra de novo
        if produto in produtos_cadastrados:
            print('Esse produto ja esta cadastrado.')
            print(
                f'Os produtos cadastrados sao: {", ".join(produtos_cadastrados)}'
            )
        else:
            # Se nao tem esse produto, pede preco e quantidade para adicionar
            while True:
                preco = input('Digite o preco, em reais, do produto: ')

                # Checa se o preco passado eh numero
                try:
                    preco = float(preco)

                    # O preco nao deve ser negativo (zero foi deixado intencionalmente)
                    if preco < 0:
                        raise ValueError
                except ValueError:
                    print('O preco informado deve ser um numero positivo.')
                # Se deu tudo certo, sai do loop do preco
                else:
                    break

            # Adicionando a quantidade
            while True:
                quantidade = input(
                    f'Digite a quantidade de {produto} em estoque: ')

                # Checa se a quantidade passada eh numero inteiro
                try:
                    quantidade = float(quantidade)

                    # A quantidade nao deve ser negativa
                    if quantidade < 0:
                        raise ValueError
                    elif int(quantidade) != float(quantidade):
                        raise ValueError
                except ValueError:
                    print(
                        'A quantidade informada deve ser um numero inteiro igual ou maior que zero.'
                    )
                # Se deu tudo certo, sai do loop da quantidade
                else:
                    quantidade = int(quantidade)
                    break

            # Adicionando ao estoque
            dic_produto = {
                'Produto': produto,
                'Preco': preco,
                'Em estoque': quantidade
            }
            estoque.append(dic_produto)
            estoque.sort(key=lambda dic_produto: dic_produto['Produto'])

            # Salvando no arquivo
            aux.atualiza_arquivo(arquivo_estoque, estoque)

            # Pergunta se o usuario deseja repetir a operacao
            print('\nDeseja repetir a operacao?')
            repetir = aux.confirmacao()

    # Quando o usuario nao quiser mais adicionar produtos, deve retornar o estoque final
    return estoque
Exemplo n.º 11
0
        'Preco': 5,
        'Em estoque': 10
    }, {
        'Produto': 'Biscoito',
        'Preco': 5,
        'Em estoque': 10
    }]

    # Salvando no estoque de teste
    aux.atualiza_arquivo(arquivo_teste_estoque, estoque_teste)

    # Cadastrando novo produto
    estoque_teste = cadastrar_produto(arquivo_teste_estoque)

    print('\n' * 1, 'RESULTADO:', sep='\n')
    aux.ver_estoque_ou_carrinho(estoque_teste)
    aux.separar_comandos_print()

    ######################################################################

    print('TESTANDO A FUNCAO PARA REMOVER PRODUTOS')
    # Um estoque generico para testar
    estoque_teste = [{
        'Produto': 'Arroz',
        'Preco': 5,
        'Em estoque': 10
    }, {
        'Produto': 'Biscoito',
        'Preco': 5,
        'Em estoque': 10
    }, {