Projeto 4 - Aplicativo de pizzaria

Componentes: Iohana Linzmeyer 

Objetivos: O objetivo do projeto é apresentar um aplicativo para a compra de uma pizza contendo informações como os sabores da pizza, o tamanho, o valor, a entrega entre outras coisas. 

Metodologia de desenvolvimento:  Foi realizado o código usando a programação orientada a objetos contendo os requisitos como encapsulamento, herança e etc. 

Projeto 4 - código fonte

class Cliente:

    def __init__(self, nome, telefone, endereco):

        self.nome = nome

        self.telefone = telefone

        self.endereco = endereco


    def fazer_pedido(self, pizzas):

        pedido = Pedido(self, pizzas)

        return pedido


class Pizza:

    def __init__(self, tamanho):

        self.__tamanho = tamanho

        self.__sabores = []

        self.__valor_base = {'P': 20.0, 'M': 30.0, 'G': 40.0}

        self.__valor_adicional = 5.0

        self.__formas_pagamento = ['Dinheiro', 'Cartão de crédito', 'Cartão de débito', 'Pix']

        self.__opcoes_retirada = ['Balcão', 'Entrega em casa']

        self.__valor_entrega = 10.0


    def add_sabor(self, sabor):

        if len(self.__sabores) < self.__max_sabores():

            self.__sabores.append(sabor)

            return True

        return False


    def rmv_sabor(self, sabor):

        if sabor in self.__sabores:

            self.__sabores.remove(sabor)


    def __max_sabores(self):

        if self.__tamanho == 'P':

            return 2

        elif self.__tamanho == 'M':

            return 3

        elif self.__tamanho == 'G':

            return 4

        return 0


    def calc_total(self):

        valor_total = self.__valor_base[self.__tamanho]

        if len(self.__sabores) > self.__max_sabores():

            return None

        valor_total += len(self.__sabores) * self.__valor_adicional

        return valor_total


    def calc_entrega(self, opcao_retirada):

        return self.__valor_entrega if opcao_retirada == 'Entrega em casa' else 0.0


    def get_sabores_disponiveis(self):

        return [

            '4 queijos', 'Pepperoni', 'Napolitana', 'Lombinho', 'Alho e óleo',

            'Palmito', 'Camarão', 'Bacon', 'California', 'Vegetariana'

        ]


    def get_pagamento(self):

        return self.__formas_pagamento


    def get_retirada(self):

        return self.__opcoes_retirada


    def get_tamanho(self):

        return self.__tamanho


    def get_sabores(self):

        return self.__sabores


    def descricao_tipo(self):

        return f"Esta é uma pizza normal de tamanho {self.__tamanho}"



class PizzaSalgada(Pizza):

    def __init__(self, tamanho):

        super().__init__(tamanho)


    def get_sabores_disponiveis(self):

        return super().get_sabores_disponiveis()


    def descricao_tipo(self):

        return f"Esta é uma pizza salgada de tamanho {self.get_tamanho()}"



class PizzaDoce(Pizza):

    def __init__(self, tamanho):

        super().__init__(tamanho)

        self.__sabores_disponiveis = [

            'Chocolate', 'Prestígio', 'Romeu e Julieta', 'Sensação', 'Beijinho'

        ]


    def get_sabores_disponiveis(self):

        return self.__sabores_disponiveis


    def descricao_tipo(self):

        return f"Esta é uma pizza doce de tamanho {self.get_tamanho()}"



class Pedido:

    def __init__(self, cliente, pizzas):

        self.cliente = cliente

        self.pizzas = pizzas

        self.total_pizza = sum(pizza.calc_total() for pizza in pizzas)

        self.frete = None


    def calcular_total(self, distancia_km):

        frete = self.calcular_frete(distancia_km)

        self.frete = frete

        self.total = self.total_pizza + frete


    @staticmethod

    def calcular_frete(distancia_km):

        return 10.0 * distancia_km



# Menu interativo

def exibir_menu_pizza():

    print("===== Bem-vindo à Pizzaria =====")

    tipo_pizza = input("Escolha o tipo de pizza (Normal/Salgada/Doce): ").capitalize()

    tamanho = input("Escolha o tamanho da pizza (P/M/G): ").upper()


    if tipo_pizza == "Salgada":

        pizza_cliente = PizzaSalgada(tamanho)

    elif tipo_pizza == "Doce":

        pizza_cliente = PizzaDoce(tamanho)

    else:

        pizza_cliente = Pizza(tamanho)


    print("\nSabores disponíveis:")

    for i, sabor in enumerate(pizza_cliente.get_sabores_disponiveis(), 1):

        print(f"{i}. {sabor}")


    while True:

        sabor = input("\nEscolha um sabor pelo número (ou digite 'sair' para terminar): ")

        if sabor.lower() == 'sair':

            break

        if not sabor.isdigit() or int(sabor) < 1 or int(sabor) > len(pizza_cliente.get_sabores_disponiveis()):

            print("Escolha inválida, tente novamente.")

        else:

            if pizza_cliente.add_sabor(pizza_cliente.get_sabores_disponiveis()[int(sabor) - 1]):

                print("Sabor adicionado com sucesso!")

            else:

                print("Não é possível adicionar mais sabores para o tamanho escolhido.")


    valor_total = pizza_cliente.calc_total()


    print("\nFormas de pagamento disponíveis:")

    for i, forma in enumerate(pizza_cliente.get_pagamento(), 1):

        print(f"{i}. {forma}")


    forma_pagamento = input("Escolha a forma de pagamento pelo número: ")


    print("\nOpções de retirada:")

    for i, opcao in enumerate(pizza_cliente.get_retirada(), 1):

        print(f"{i}. {opcao}")


    opcao_retirada = input("Escolha a opção de retirada pelo número: ")

    valor_entrega = pizza_cliente.calc_entrega(pizza_cliente.get_retirada()[int(opcao_retirada) - 1])


    observacao_cliente = input("Alguma observação para o pedido? ")


    print("\n===== Resumo do Pedido =====")

    print(f"Tamanho da pizza: {pizza_cliente.get_tamanho()}")

    print(f"Sabores escolhidos: {pizza_cliente.get_sabores()}")

    print(f"Valor total da pizza: R$ {valor_total:.2f}")

    print(f"Valor da entrega: R$ {valor_entrega:.2f}")

    print(f"Forma de pagamento: {pizza_cliente.get_pagamento()[int(forma_pagamento) - 1]}")

    print(f"Opção de retirada: {pizza_cliente.get_retirada()[int(opcao_retirada) - 1]}")

    print(f"Observação do cliente: {observacao_cliente}")

    print(f"Descrição do tipo de pizza: {pizza_cliente.descricao_tipo()}")



exibir_menu_pizza()