diff --git a/avaliacoes/restaurante/pom.xml b/avaliacoes/restaurante/pom.xml
new file mode 100644
index 0000000..357b724
--- /dev/null
+++ b/avaliacoes/restaurante/pom.xml
@@ -0,0 +1,16 @@
+
+
+ 4.0.0
+
+ com.restaurante
+ restaurante
+ 1.0-SNAPSHOT
+
+
+ 17
+ 17
+
+
+
\ No newline at end of file
diff --git a/avaliacoes/restaurante/src/main/java/com/restaurante/Main.java b/avaliacoes/restaurante/src/main/java/com/restaurante/Main.java
new file mode 100644
index 0000000..c6fed11
--- /dev/null
+++ b/avaliacoes/restaurante/src/main/java/com/restaurante/Main.java
@@ -0,0 +1,253 @@
+package com.restaurante;
+
+import com.restaurante.controllers.cliente.*;
+import com.restaurante.controllers.funcionario.*;
+import com.restaurante.controllers.mesa.*;
+import com.restaurante.controllers.produto.*;
+import com.restaurante.controllers.endereco.*;
+import com.restaurante.model.Endereco;
+
+import java.util.List;
+import java.util.Scanner;
+
+/**
+ * Classe principal da aplicação Restaurante.
+ *
+ * Exibe um menu interativo no console para o usuário gerenciar Clientes, Funcionários, Mesas, Produtos e Endereços.
+ * Utiliza controllers específicos para realizar operações de criação, listagem, busca e remoção.
+ * Mantém uma lista compartilhada de endereços em memória para facilitar operações relacionadas a Endereço.
+ *
+ * A aplicação encerra quando o usuário escolhe a opção 0.
+ *
+ */
+public class Main {
+
+ /**
+ * Ponto de entrada da aplicação.
+ * Inicializa controllers, lista de endereços e controla o menu principal de opções.
+ *
+ * @param args argumentos de linha de comando (não utilizados)
+ */
+ public static void main(String[] args) {
+ Scanner scanner = new Scanner(System.in);
+
+ // Instancia controllers
+ CreateClienteController createCliente = new CreateClienteController();
+ DeleteClienteController deleteCliente = new DeleteClienteController();
+ SearchClienteController searchCliente = new SearchClienteController();
+
+ CreateFuncionarioController createFuncionario = new CreateFuncionarioController();
+ DeleteFuncionarioController deleteFuncionario = new DeleteFuncionarioController();
+ SearchFuncionarioController searchFuncionario = new SearchFuncionarioController();
+
+ CreateMesaController createMesa = new CreateMesaController();
+ DeleteMesaController deleteMesa = new DeleteMesaController();
+ SearchMesaController searchMesa = new SearchMesaController();
+
+ CreateProdutoController createProduto = new CreateProdutoController();
+ DeleteProdutoController deleteProduto = new DeleteProdutoController();
+ SearchProdutoController searchProduto = new SearchProdutoController();
+
+ CreateEnderecoController createEndereco = new CreateEnderecoController();
+ DeleteEnderecoController deleteEndereco = new DeleteEnderecoController();
+ SearchEnderecoController searchEndereco = new SearchEnderecoController();
+
+ // Carrega lista compartilhada de endereços
+ List listaEnderecos = createEndereco.listarEnderecos();
+
+ int opcao = -1;
+ while (opcao != 0) {
+ System.out.println("\n--- MENU PRINCIPAL ---");
+ System.out.println("1. Cliente");
+ System.out.println("2. Funcionário");
+ System.out.println("3. Mesa");
+ System.out.println("4. Produto");
+ System.out.println("5. Endereço");
+ System.out.println("0. Sair");
+ System.out.print("Escolha uma opção: ");
+ opcao = Integer.parseInt(scanner.nextLine());
+
+ switch (opcao) {
+ case 1 -> menuCliente(scanner, createCliente, deleteCliente, searchCliente, listaEnderecos);
+ case 2 -> menuFuncionario(scanner, createFuncionario, deleteFuncionario, searchFuncionario, listaEnderecos);
+ case 3 -> menuMesa(scanner, createMesa, deleteMesa, searchMesa);
+ case 4 -> menuProduto(scanner, createProduto, deleteProduto, searchProduto);
+ case 5 -> menuEndereco(scanner, createEndereco, deleteEndereco, searchEndereco, listaEnderecos);
+ case 0 -> System.out.println("Saindo...");
+ default -> System.out.println("Opção inválida.");
+ }
+ }
+
+ scanner.close();
+ }
+
+ /**
+ * Menu de operações para a entidade Cliente.
+ *
+ * @param scanner Scanner para entrada do usuário
+ * @param c Controller de criação de cliente
+ * @param d Controller de remoção de cliente
+ * @param s Controller de busca/listagem de cliente
+ * @param listaEnderecos Lista compartilhada de endereços para associar clientes
+ */
+ private static void menuCliente(Scanner scanner,
+ CreateClienteController c,
+ DeleteClienteController d,
+ SearchClienteController s,
+ List listaEnderecos) {
+ System.out.println("\n--- CLIENTE ---");
+ System.out.println("1. Cadastrar");
+ System.out.println("2. Listar");
+ System.out.println("3. Remover");
+ System.out.print("Escolha: ");
+ int opcao = Integer.parseInt(scanner.nextLine());
+
+ switch (opcao) {
+ case 1 -> c.executar(listaEnderecos);
+ case 2 -> s.executar();
+ case 3 -> d.executar();
+ default -> System.out.println("Opção inválida.");
+ }
+ }
+
+ /**
+ * Menu de operações para a entidade Funcionário.
+ *
+ * @param scanner Scanner para entrada do usuário
+ * @param c Controller de criação de funcionário
+ * @param d Controller de remoção de funcionário
+ * @param s Controller de busca/listagem de funcionário
+ * @param listaEnderecos Lista compartilhada de endereços (não utilizada no menu atual, pode ser removida)
+ */
+ private static void menuFuncionario(Scanner scanner,
+ CreateFuncionarioController c,
+ DeleteFuncionarioController d,
+ SearchFuncionarioController s,
+ List listaEnderecos) {
+ System.out.println("\n--- FUNCIONÁRIO ---");
+ System.out.println("1. Cadastrar");
+ System.out.println("2. Listar");
+ System.out.println("3. Remover");
+ System.out.print("Escolha: ");
+ int opcao = Integer.parseInt(scanner.nextLine());
+
+ switch (opcao) {
+ case 1 -> c.executar();
+ case 2 -> s.executar();
+ case 3 -> d.executar();
+ default -> System.out.println("Opção inválida.");
+ }
+ }
+
+ /**
+ * Menu de operações para a entidade Mesa.
+ *
+ * @param scanner Scanner para entrada do usuário
+ * @param c Controller de criação de mesa
+ * @param d Controller de remoção de mesa
+ * @param s Controller de busca/listagem de mesa
+ */
+ private static void menuMesa(Scanner scanner,
+ CreateMesaController c,
+ DeleteMesaController d,
+ SearchMesaController s) {
+ System.out.println("\n--- MESA ---");
+ System.out.println("1. Adicionar");
+ System.out.println("2. Listar");
+ System.out.println("3. Remover");
+ System.out.print("Escolha: ");
+ int opcao = Integer.parseInt(scanner.nextLine());
+
+ try {
+ switch (opcao) {
+ case 1 -> c.adicionarMesa();
+ case 2 -> s.listarMesas();
+ case 3 -> d.removerMesa();
+ default -> System.out.println("Opção inválida.");
+ }
+ } catch (Exception e) {
+ System.out.println("Erro: " + e.getMessage());
+ }
+ }
+
+ /**
+ * Menu de operações para a entidade Produto.
+ *
+ * @param scanner Scanner para entrada do usuário
+ * @param c Controller de criação de produto
+ * @param d Controller de remoção de produto
+ * @param s Controller de busca/listagem de produto
+ */
+ private static void menuProduto(Scanner scanner,
+ CreateProdutoController c,
+ DeleteProdutoController d,
+ SearchProdutoController s) {
+ System.out.println("\n--- PRODUTO ---");
+ System.out.println("1. Adicionar");
+ System.out.println("2. Listar");
+ System.out.println("3. Remover");
+ System.out.print("Escolha: ");
+ int opcao = Integer.parseInt(scanner.nextLine());
+
+ try {
+ switch (opcao) {
+ case 1 -> c.adicionarProduto();
+ case 2 -> s.listarProdutos();
+ case 3 -> d.removerProduto();
+ default -> System.out.println("Opção inválida.");
+ }
+ } catch (Exception e) {
+ System.out.println("Erro: " + e.getMessage());
+ }
+ }
+
+ /**
+ * Menu de operações para a entidade Endereço.
+ *
+ * @param scanner Scanner para entrada do usuário
+ * @param c Controller de criação de endereço
+ * @param d Controller de remoção de endereço
+ * @param s Controller de busca/listagem de endereço
+ * @param listaEnderecos Lista compartilhada de endereços em memória
+ */
+ private static void menuEndereco(Scanner scanner,
+ CreateEnderecoController c,
+ DeleteEnderecoController d,
+ SearchEnderecoController s,
+ List listaEnderecos) {
+ System.out.println("\n--- ENDEREÇO ---");
+ System.out.println("1. Cadastrar");
+ System.out.println("2. Listar");
+ System.out.println("3. Buscar por CEP");
+ System.out.println("4. Remover");
+ System.out.print("Escolha: ");
+ int opcao = Integer.parseInt(scanner.nextLine());
+
+ switch (opcao) {
+ case 1 -> c.criarEndereco(listaEnderecos);
+ case 2 -> {
+ if (listaEnderecos.isEmpty()) {
+ System.out.println("Nenhum endereço cadastrado.");
+ } else {
+ System.out.println("Lista de Endereços:");
+ for (Endereco e : listaEnderecos) {
+ System.out.printf("%s, %d, CEP: %s%n", e.getTipo(), e.getNumero(), e.getCep());
+ }
+ }
+ }
+ case 3 -> {
+ System.out.print("Digite o CEP para busca: ");
+ String cep = scanner.nextLine();
+ Endereco endereco = s.buscarPorCep(listaEnderecos, cep);
+ if (endereco != null) {
+ System.out.printf("Endereço encontrado: %s, %d, CEP: %s%n",
+ endereco.getTipo(), endereco.getNumero(), endereco.getCep());
+ } else {
+ System.out.println("Endereço não encontrado.");
+ }
+ }
+ case 4 -> d.deletarEndereco(listaEnderecos);
+ default -> System.out.println("Opção inválida.");
+ }
+ }
+}
diff --git a/avaliacoes/restaurante/src/main/java/com/restaurante/controllers/cliente/CreateClienteController.java b/avaliacoes/restaurante/src/main/java/com/restaurante/controllers/cliente/CreateClienteController.java
new file mode 100644
index 0000000..40158e6
--- /dev/null
+++ b/avaliacoes/restaurante/src/main/java/com/restaurante/controllers/cliente/CreateClienteController.java
@@ -0,0 +1,94 @@
+package com.restaurante.controllers.cliente;
+
+import com.restaurante.dao.ClienteDAO;
+import com.restaurante.dao.EnderecoDAO;
+import com.restaurante.model.Cliente;
+import com.restaurante.model.Endereco;
+import com.restaurante.view.ClienteView;
+import com.restaurante.controllers.endereco.SearchEnderecoController;
+
+import java.util.List;
+import java.util.Scanner;
+
+/**
+ * Controller responsável por lidar com a criação de clientes no sistema.
+ *
+ * Esta classe realiza a captura de dados do cliente através da view,
+ * permite a seleção ou criação de um endereço, associa o endereço ao cliente
+ * e persiste os dados utilizando os DAOs.
+ *
+ * Funciona em conjunto com a camada de visualização ({@link ClienteView}),
+ * os modelos {@link Cliente} e {@link Endereco}, e os DAOs correspondentes.
+ */
+public class CreateClienteController {
+
+ /** Interface de entrada e saída para o usuário. */
+ private ClienteView view = new ClienteView();
+
+ /** Objeto de acesso a dados para clientes. */
+ private ClienteDAO dao = new ClienteDAO();
+
+ /** Objeto de acesso a dados para endereços. */
+ private EnderecoDAO enderecoDAO = new EnderecoDAO();
+
+ /** Controlador de busca de endereços por CEP. */
+ private SearchEnderecoController searchEndereco = new SearchEnderecoController();
+
+ /** Lista de endereços disponíveis no sistema. */
+ private List enderecos;
+
+ /**
+ * Executa o fluxo completo de cadastro de um novo cliente.
+ *
+ * O método captura os dados do cliente, solicita ao usuário que selecione ou
+ * cadastre um endereço, associa o endereço ao cliente e salva o cliente no sistema.
+ *
+ * @param enderecos lista de endereços existentes no sistema
+ */
+ public void executar(List enderecos) {
+ this.enderecos = enderecos;
+
+ Cliente cliente = view.capturarCliente();
+ Endereco endereco = buscarOuCriarEndereco();
+ cliente.setEndereco(endereco);
+
+ dao.salvar(cliente);
+ view.mostrarMensagem("Cliente cadastrado com sucesso!");
+ }
+
+ /**
+ * Permite ao usuário buscar um endereço existente ou cadastrar um novo.
+ *
+ * O método pergunta ao usuário se ele deseja usar um endereço já existente
+ * (com base no CEP) ou cadastrar um novo endereço preenchendo os dados manualmente.
+ *
+ * @return o endereço selecionado ou recém-cadastrado
+ */
+ private Endereco buscarOuCriarEndereco() {
+ Scanner scanner = view.getScanner();
+ System.out.println("Deseja:");
+ System.out.println("1. Escolher um endereço existente");
+ System.out.println("2. Cadastrar novo endereço");
+ System.out.print("Opção: ");
+ int opcao = Integer.parseInt(scanner.nextLine());
+
+ if (opcao == 1) {
+ System.out.print("Digite o CEP do endereço: ");
+ String cep = scanner.nextLine();
+ return searchEndereco.buscarPorCep(enderecos, cep);
+ }
+
+ // Criar novo
+ System.out.print("Tipo (Rua, Av...): ");
+ String tipo = scanner.nextLine();
+ System.out.print("Número: ");
+ int numero = Integer.parseInt(scanner.nextLine());
+ System.out.print("CEP: ");
+ String cep = scanner.nextLine();
+
+ Endereco novo = new Endereco(tipo, cep, numero);
+ enderecoDAO.salvarEndereco(novo);
+ enderecos.add(novo);
+ return novo;
+ }
+}
diff --git a/avaliacoes/restaurante/src/main/java/com/restaurante/controllers/cliente/DeleteClienteController.java b/avaliacoes/restaurante/src/main/java/com/restaurante/controllers/cliente/DeleteClienteController.java
new file mode 100644
index 0000000..367f795
--- /dev/null
+++ b/avaliacoes/restaurante/src/main/java/com/restaurante/controllers/cliente/DeleteClienteController.java
@@ -0,0 +1,40 @@
+package com.restaurante.controllers.cliente;
+
+import com.restaurante.dao.ClienteDAO;
+import com.restaurante.view.ClienteView;
+
+/**
+ * Controller responsável por excluir um cliente do sistema.
+ *
+ * Esta classe interage com a camada de visualização ({@link ClienteView})
+ * para capturar o CPF do cliente a ser removido e utiliza a {@link ClienteDAO}
+ * para realizar a exclusão no banco de dados.
+ *
+ * Exibe mensagens ao usuário informando se a remoção foi bem-sucedida ou não.
+ *
+ */
+public class DeleteClienteController {
+
+ /** Interface de entrada e saída para o usuário. */
+ private ClienteView view = new ClienteView();
+
+ /** Objeto de acesso a dados para clientes. */
+ private ClienteDAO dao = new ClienteDAO();
+
+ /**
+ * Executa o processo de remoção de um cliente com base no CPF fornecido pelo usuário.
+ *
+ * Caso o cliente seja encontrado e removido com sucesso, uma mensagem de confirmação
+ * é exibida. Caso contrário, informa que o cliente não foi encontrado.
+ */
+ public void executar() {
+ String cpf = view.capturarCpf();
+ boolean removido = dao.remover(cpf);
+
+ if (removido) {
+ view.mostrarMensagem("Cliente removido com sucesso!");
+ } else {
+ view.mostrarMensagem("Cliente não encontrado.");
+ }
+ }
+}
diff --git a/avaliacoes/restaurante/src/main/java/com/restaurante/controllers/cliente/SearchClienteController.java b/avaliacoes/restaurante/src/main/java/com/restaurante/controllers/cliente/SearchClienteController.java
new file mode 100644
index 0000000..9d5b2ef
--- /dev/null
+++ b/avaliacoes/restaurante/src/main/java/com/restaurante/controllers/cliente/SearchClienteController.java
@@ -0,0 +1,32 @@
+package com.restaurante.controllers.cliente;
+
+import com.restaurante.dao.ClienteDAO;
+import com.restaurante.model.Cliente;
+import com.restaurante.view.ClienteView;
+
+/**
+ * Controller responsável por listar todos os clientes cadastrados no sistema.
+ *
+ * Esta classe utiliza a {@link ClienteDAO} para recuperar os clientes do banco de dados
+ * e a {@link ClienteView} para exibi-los ao usuário.
+ *
+ */
+public class SearchClienteController {
+
+ /** Interface de entrada e saída para o usuário. */
+ private ClienteView view = new ClienteView();
+
+ /** Objeto de acesso a dados para clientes. */
+ private ClienteDAO dao = new ClienteDAO();
+
+ /**
+ * Executa a listagem de todos os clientes cadastrados.
+ *
+ * Recupera a lista de clientes por meio do DAO e exibe cada cliente na tela.
+ */
+ public void executar() {
+ for (Cliente c : dao.listar()) {
+ view.mostrar(c);
+ }
+ }
+}
diff --git a/avaliacoes/restaurante/src/main/java/com/restaurante/controllers/endereco/CreateEnderecoController.java b/avaliacoes/restaurante/src/main/java/com/restaurante/controllers/endereco/CreateEnderecoController.java
new file mode 100644
index 0000000..b71928c
--- /dev/null
+++ b/avaliacoes/restaurante/src/main/java/com/restaurante/controllers/endereco/CreateEnderecoController.java
@@ -0,0 +1,50 @@
+package com.restaurante.controllers.endereco;
+
+import com.restaurante.dao.EnderecoDAO;
+import com.restaurante.model.Endereco;
+import com.restaurante.view.EnderecoView;
+
+import java.util.List;
+
+/**
+ * Controller responsável pela criação e listagem de endereços no sistema.
+ *
+ * Esta classe permite que o usuário cadastre um novo endereço e o adicione à lista atual,
+ * além de fornecer acesso à listagem completa dos endereços armazenados.
+ *
+ * Utiliza {@link EnderecoView} para interagir com o usuário e {@link EnderecoDAO}
+ * para persistência dos dados.
+ */
+public class CreateEnderecoController {
+
+ /** Objeto de acesso a dados para endereços. */
+ private EnderecoDAO dao = new EnderecoDAO();
+
+ /** Interface de entrada e saída para o usuário. */
+ private EnderecoView view = new EnderecoView();
+
+ /**
+ * Cria um novo endereço com base nas informações fornecidas pelo usuário.
+ *
+ * O endereço é adicionado à lista local e também salvo no banco de dados.
+ *
+ * @param listaEnderecos lista local de endereços onde o novo endereço será adicionado
+ */
+ public void criarEndereco(List listaEnderecos) {
+ Endereco novo = view.capturarEndereco();
+ listaEnderecos.add(novo);
+ dao.salvarEndereco(novo);
+ view.mostrarMensagem("Endereço criado com sucesso!");
+ }
+
+ /**
+ * Retorna a lista de endereços cadastrados no sistema.
+ *
+ * Este método permite acessar os endereços diretamente da base de dados.
+ *
+ * @return uma lista de endereços cadastrados
+ */
+ public List listarEnderecos() {
+ return dao.listarEnderecos();
+ }
+}
diff --git a/avaliacoes/restaurante/src/main/java/com/restaurante/controllers/endereco/DeleteEnderecoController.java b/avaliacoes/restaurante/src/main/java/com/restaurante/controllers/endereco/DeleteEnderecoController.java
new file mode 100644
index 0000000..b219a34
--- /dev/null
+++ b/avaliacoes/restaurante/src/main/java/com/restaurante/controllers/endereco/DeleteEnderecoController.java
@@ -0,0 +1,46 @@
+package com.restaurante.controllers.endereco;
+
+import com.restaurante.dao.EnderecoDAO;
+import com.restaurante.model.Endereco;
+import com.restaurante.view.EnderecoView;
+
+import java.util.List;
+
+/**
+ * Controller responsável por excluir endereços do sistema com base no CEP.
+ *
+ * Interage com o usuário por meio da {@link EnderecoView} para capturar o CEP
+ * do endereço a ser removido e utiliza a {@link EnderecoDAO} para realizar a exclusão
+ * tanto na lista local quanto na persistência (se aplicável).
+ *
+ * Exibe mensagens informando se a exclusão foi realizada com sucesso ou se o endereço
+ * não foi encontrado.
+ *
+ */
+public class DeleteEnderecoController {
+
+ /** Objeto de acesso a dados para endereços. */
+ private EnderecoDAO dao = new EnderecoDAO();
+
+ /** Interface de entrada e saída para o usuário. */
+ private EnderecoView view = new EnderecoView();
+
+ /**
+ * Exclui um endereço da lista com base no CEP informado pelo usuário.
+ *
+ * O método busca o endereço na lista fornecida e, se encontrado,
+ * o remove e informa o sucesso da operação. Caso contrário,
+ * informa que o endereço não foi encontrado.
+ *
+ * @param listaEnderecos lista de endereços disponíveis no sistema
+ */
+ public void deletarEndereco(List listaEnderecos) {
+ String cep = view.capturarCep();
+ boolean removido = dao.deletarEnderecoPorCep(listaEnderecos, cep);
+ if (removido) {
+ view.mostrarMensagem("Endereço removido com sucesso.");
+ } else {
+ view.mostrarMensagem("Endereço não encontrado.");
+ }
+ }
+}
diff --git a/avaliacoes/restaurante/src/main/java/com/restaurante/controllers/endereco/SearchEnderecoController.java b/avaliacoes/restaurante/src/main/java/com/restaurante/controllers/endereco/SearchEnderecoController.java
new file mode 100644
index 0000000..53b7730
--- /dev/null
+++ b/avaliacoes/restaurante/src/main/java/com/restaurante/controllers/endereco/SearchEnderecoController.java
@@ -0,0 +1,62 @@
+package com.restaurante.controllers.endereco;
+
+import com.restaurante.model.Endereco;
+import com.restaurante.view.EnderecoView;
+
+import java.util.List;
+
+/**
+ * Controller responsável por listar e buscar endereços cadastrados no sistema.
+ *
+ * Esta classe permite ao usuário visualizar todos os endereços disponíveis ou
+ * realizar buscas específicas por CEP. A exibição dos dados é feita por meio
+ * da {@link EnderecoView}.
+ *
+ * Também disponibiliza um método público para busca direta por CEP, útil para
+ */
+public class SearchEnderecoController {
+
+ /** Interface de entrada e saída para o usuário. */
+ private EnderecoView view = new EnderecoView();
+
+ /**
+ * Lista todos os endereços fornecidos na lista.
+ *
+ * Utiliza a view para exibir a lista completa.
+ *
+ * @param listaEnderecos lista de endereços a serem exibidos
+ */
+ public void listarEnderecos(List listaEnderecos) {
+ view.mostrarListaEnderecos(listaEnderecos);
+ }
+
+ /**
+ * Solicita ao usuário um CEP, busca o endereço correspondente
+ * na lista fornecida e exibe o resultado.
+ *
+ * Caso o CEP não seja encontrado, exibe uma mensagem com valor nulo.
+ *
+ * @param listaEnderecos lista de endereços onde será feita a busca
+ */
+ public void buscarPorCep(List listaEnderecos) {
+ String cep = view.capturarCep();
+ Endereco e = buscarPorCep(listaEnderecos, cep);
+ view.mostrarEndereco(e);
+ }
+
+ /**
+ * Busca diretamente por um endereço com o CEP especificado.
+ *
+ * Este método pode ser utilizado por outros controllers para reutilização da lógica.
+ *
+ * @param listaEnderecos lista de endereços onde será realizada a busca
+ * @param cep o CEP a ser pesquisado
+ * @return o endereço correspondente ao CEP ou {@code null} se não for encontrado
+ */
+ public Endereco buscarPorCep(List listaEnderecos, String cep) {
+ return listaEnderecos.stream()
+ .filter(end -> end.getCep().equals(cep))
+ .findFirst()
+ .orElse(null);
+ }
+}
diff --git a/avaliacoes/restaurante/src/main/java/com/restaurante/controllers/funcionario/CreateFuncionarioController.java b/avaliacoes/restaurante/src/main/java/com/restaurante/controllers/funcionario/CreateFuncionarioController.java
new file mode 100644
index 0000000..43dd589
--- /dev/null
+++ b/avaliacoes/restaurante/src/main/java/com/restaurante/controllers/funcionario/CreateFuncionarioController.java
@@ -0,0 +1,58 @@
+package com.restaurante.controllers.funcionario;
+
+import java.util.List;
+
+import com.restaurante.dao.FuncionarioDAO;
+import com.restaurante.dao.MesaDAO;
+import com.restaurante.model.Funcionario;
+import com.restaurante.model.Mesa;
+import com.restaurante.view.FuncionarioView;
+
+/**
+ * Controller responsável por cadastrar um novo funcionário no sistema.
+ *
+ * Esta classe interage com a {@link FuncionarioView} para capturar os dados do funcionário,
+ * incluindo a seleção das mesas existentes para associar,
+ * e utiliza a {@link FuncionarioDAO} para persistir os dados no armazenamento.
+ *
+ * Caso não existam mesas cadastradas, informa o usuário para cadastrá-las antes.
+ * Exibe mensagens de sucesso ou erro durante o processo.
+ */
+public class CreateFuncionarioController {
+
+ /** Interface para interação com o usuário. */
+ private FuncionarioView funcionarioView = new FuncionarioView();
+
+ /** Objeto de acesso a dados para funcionários. */
+ private FuncionarioDAO funcionarioDAO = new FuncionarioDAO();
+
+ /** Objeto de acesso a dados para mesas. */
+ private MesaDAO mesaDAO = new MesaDAO();
+
+ /**
+ * Executa o fluxo de cadastro do funcionário.
+ *
+ * Passos:
+ * - Lista as mesas já cadastradas no sistema.
+ * - Caso não existam mesas, informa para cadastrar mesas antes.
+ * - Solicita os dados do funcionário, permitindo associação com mesas existentes.
+ * - Salva o funcionário no armazenamento.
+ * - Exibe mensagens de sucesso ou falha na operação.
+ */
+ public void executar() {
+ try {
+ List mesasExistentes = mesaDAO.listar();
+
+ if (mesasExistentes.isEmpty()) {
+ funcionarioView.mostrarMensagem("Não há mesas cadastradas. Cadastre mesas antes de criar um funcionário.");
+ return;
+ }
+
+ Funcionario funcionario = funcionarioView.capturarFuncionarioComMesasExistentes(mesasExistentes);
+ funcionarioDAO.salvar(funcionario);
+ funcionarioView.mostrarMensagem("Funcionário cadastrado com sucesso!");
+ } catch (Exception e) {
+ funcionarioView.mostrarMensagem("Erro ao cadastrar funcionário: " + e.getMessage());
+ }
+ }
+}
diff --git a/avaliacoes/restaurante/src/main/java/com/restaurante/controllers/funcionario/DeleteFuncionarioController.java b/avaliacoes/restaurante/src/main/java/com/restaurante/controllers/funcionario/DeleteFuncionarioController.java
new file mode 100644
index 0000000..75cb29e
--- /dev/null
+++ b/avaliacoes/restaurante/src/main/java/com/restaurante/controllers/funcionario/DeleteFuncionarioController.java
@@ -0,0 +1,39 @@
+package com.restaurante.controllers.funcionario;
+
+import com.restaurante.dao.FuncionarioDAO;
+import com.restaurante.view.FuncionarioView;
+
+/**
+ * Controller responsável por excluir um funcionário do sistema com base no CPF.
+ *
+ * Esta classe interage com a {@link FuncionarioView} para capturar o CPF do funcionário
+ * e utiliza a {@link FuncionarioDAO} para realizar a remoção no banco de dados.
+ *
+ * Informa ao usuário se a remoção foi bem-sucedida ou se o CPF não foi encontrado.
+ */
+public class DeleteFuncionarioController {
+
+ /** Interface de entrada e saída com o usuário. */
+ private FuncionarioView view = new FuncionarioView();
+
+ /** Objeto de acesso a dados para funcionários. */
+ private FuncionarioDAO dao = new FuncionarioDAO();
+
+ /**
+ * Executa o processo de remoção de um funcionário com base no CPF.
+ *
+ * Caso o funcionário seja encontrado e removido com sucesso,
+ * exibe uma mensagem de confirmação. Caso contrário,
+ * informa que o funcionário não foi encontrado.
+ */
+ public void executar() {
+ String cpf = view.capturarCpf();
+ boolean removido = dao.remover(cpf);
+
+ if (removido) {
+ view.mostrarMensagem("Funcionário removido com sucesso!");
+ } else {
+ view.mostrarMensagem("Funcionário não encontrado.");
+ }
+ }
+}
diff --git a/avaliacoes/restaurante/src/main/java/com/restaurante/controllers/funcionario/SearchFuncionarioController.java b/avaliacoes/restaurante/src/main/java/com/restaurante/controllers/funcionario/SearchFuncionarioController.java
new file mode 100644
index 0000000..5809d35
--- /dev/null
+++ b/avaliacoes/restaurante/src/main/java/com/restaurante/controllers/funcionario/SearchFuncionarioController.java
@@ -0,0 +1,34 @@
+package com.restaurante.controllers.funcionario;
+
+import com.restaurante.dao.FuncionarioDAO;
+import com.restaurante.model.Funcionario;
+import com.restaurante.view.FuncionarioView;
+
+/**
+ * Controller responsável por listar todos os funcionários cadastrados no sistema.
+ *
+ * Esta classe recupera os dados de todos os funcionários utilizando a {@link FuncionarioDAO}
+ * e exibe essas informações ao usuário por meio da {@link FuncionarioView}.
+ *
+ * Útil para visualização geral e conferência dos registros de funcionários.
+ */
+public class SearchFuncionarioController {
+
+ /** Interface de entrada e saída com o usuário. */
+ private FuncionarioView view = new FuncionarioView();
+
+ /** Objeto de acesso a dados para funcionários. */
+ private FuncionarioDAO dao = new FuncionarioDAO();
+
+ /**
+ * Executa a listagem de todos os funcionários cadastrados no sistema.
+ *
+ * Recupera a lista de funcionários do DAO e utiliza a view para exibir
+ * cada registro ao usuário.
+ */
+ public void executar() {
+ for (Funcionario f : dao.listar()) {
+ view.mostrar(f);
+ }
+ }
+}
diff --git a/avaliacoes/restaurante/src/main/java/com/restaurante/controllers/mesa/CreateMesaController.java b/avaliacoes/restaurante/src/main/java/com/restaurante/controllers/mesa/CreateMesaController.java
new file mode 100644
index 0000000..efcdc85
--- /dev/null
+++ b/avaliacoes/restaurante/src/main/java/com/restaurante/controllers/mesa/CreateMesaController.java
@@ -0,0 +1,48 @@
+package com.restaurante.controllers.mesa;
+
+import java.io.IOException;
+
+import com.restaurante.dao.MesaDAO;
+import com.restaurante.model.Mesa;
+import com.restaurante.view.MesaView;
+
+/**
+ * Controller responsável pela criação de mesas no sistema.
+ *
+ * Esta classe interage com o usuário através da {@link MesaView} para capturar
+ * as informações necessárias sobre a mesa (número e local), cria o objeto {@link Mesa}
+ * e persiste seus dados usando a {@link MesaDAO}.
+ *
+ * Pode lançar exceções de entrada/saída durante o processo de captura dos dados.
+ */
+public class CreateMesaController {
+
+ /** Objeto de acesso a dados para mesas. */
+ private MesaDAO dao;
+
+ /** Interface de entrada e saída para o usuário. */
+ private MesaView view;
+
+ /**
+ * Construtor que inicializa os DAOs e Views necessários.
+ */
+ public CreateMesaController(){
+ this.dao = new MesaDAO();
+ this.view = new MesaView();
+ }
+
+ /**
+ * Captura os dados da mesa, cria o objeto Mesa e salva no banco de dados.
+ *
+ * Informa no console se a mesa foi adicionada com sucesso.
+ *
+ * @throws IOException caso ocorra erro na entrada de dados pelo usuário
+ */
+ public void adicionarMesa() throws IOException {
+ String numero = view.pedirNumeroMesa();
+ String local = view.pedirLocalMesa();
+ Mesa mesa = new Mesa(numero, local);
+ dao.salvar(mesa);
+ System.out.println("Mesa adicionada com sucesso!");
+ }
+}
diff --git a/avaliacoes/restaurante/src/main/java/com/restaurante/controllers/mesa/DeleteMesaController.java b/avaliacoes/restaurante/src/main/java/com/restaurante/controllers/mesa/DeleteMesaController.java
new file mode 100644
index 0000000..1ac9e4b
--- /dev/null
+++ b/avaliacoes/restaurante/src/main/java/com/restaurante/controllers/mesa/DeleteMesaController.java
@@ -0,0 +1,46 @@
+package com.restaurante.controllers.mesa;
+
+import java.io.IOException;
+
+import com.restaurante.dao.MesaDAO;
+import com.restaurante.view.MesaView;
+
+/**
+ * Controller responsável pela remoção de mesas do sistema.
+ *
+ * Esta classe utiliza a {@link MesaView} para capturar o número da mesa que deve ser removida
+ * e a {@link MesaDAO} para deletar a mesa da base de dados.
+ *
+ * Exibe uma mensagem no console informando que a mesa foi removida, caso existisse.
+ *
+ * Pode lançar exceções de entrada/saída durante a captura dos dados.
+ */
+public class DeleteMesaController {
+
+ /** Objeto de acesso a dados para mesas. */
+ private MesaDAO dao;
+
+ /** Interface de entrada e saída para o usuário. */
+ private MesaView view;
+
+ /**
+ * Construtor que inicializa os DAOs e Views necessários.
+ */
+ public DeleteMesaController(){
+ this.dao = new MesaDAO();
+ this.view = new MesaView();
+ }
+
+ /**
+ * Captura o número da mesa e remove a mesa correspondente do banco de dados.
+ *
+ * Exibe mensagem informativa no console, independentemente de a mesa existir ou não.
+ *
+ * @throws IOException caso ocorra erro na entrada de dados pelo usuário
+ */
+ public void removerMesa() throws IOException {
+ String numero = view.pedirNumeroMesa();
+ dao.deletar(numero);
+ System.out.println("Mesa removida (se existia)!");
+ }
+}
diff --git a/avaliacoes/restaurante/src/main/java/com/restaurante/controllers/mesa/SearchMesaController.java b/avaliacoes/restaurante/src/main/java/com/restaurante/controllers/mesa/SearchMesaController.java
new file mode 100644
index 0000000..352f8ab
--- /dev/null
+++ b/avaliacoes/restaurante/src/main/java/com/restaurante/controllers/mesa/SearchMesaController.java
@@ -0,0 +1,43 @@
+package com.restaurante.controllers.mesa;
+
+import java.io.IOException;
+import java.util.List;
+
+import com.restaurante.dao.MesaDAO;
+import com.restaurante.model.Mesa;
+import com.restaurante.view.MesaView;
+
+/**
+ * Controller responsável por listar as mesas cadastradas no sistema.
+ *
+ * Esta classe utiliza a {@link MesaDAO} para recuperar a lista de mesas
+ * e a {@link MesaView} para exibir as mesas ao usuário.
+ *
+ * Pode lançar exceções de entrada/saída durante a operação de exibição.
+ */
+public class SearchMesaController {
+
+ /** Objeto de acesso a dados para mesas. */
+ private MesaDAO dao;
+
+ /** Interface de entrada e saída para o usuário. */
+ private MesaView view;
+
+ /**
+ * Construtor que inicializa os DAOs e Views necessários.
+ */
+ public SearchMesaController(){
+ this.dao = new MesaDAO();
+ this.view = new MesaView();
+ }
+
+ /**
+ * Recupera a lista de mesas do banco de dados e as exibe ao usuário.
+ *
+ * @throws IOException caso ocorra erro na operação de exibição
+ */
+ public void listarMesas() throws IOException {
+ List mesas = dao.listar();
+ view.exibirMesas(mesas);
+ }
+}
diff --git a/avaliacoes/restaurante/src/main/java/com/restaurante/controllers/produto/CreateProdutoController.java b/avaliacoes/restaurante/src/main/java/com/restaurante/controllers/produto/CreateProdutoController.java
new file mode 100644
index 0000000..80b6b70
--- /dev/null
+++ b/avaliacoes/restaurante/src/main/java/com/restaurante/controllers/produto/CreateProdutoController.java
@@ -0,0 +1,51 @@
+package com.restaurante.controllers.produto;
+
+import java.io.IOException;
+
+import com.restaurante.dao.ProdutoDAO;
+import com.restaurante.model.Produto;
+import com.restaurante.view.ProdutoView;
+
+/**
+ * Controller responsável pela criação de produtos no sistema.
+ *
+ * Esta classe captura os dados do produto através da {@link ProdutoView},
+ * cria um novo objeto {@link Produto} e persiste no banco de dados
+ * utilizando a {@link ProdutoDAO}.
+ *
+ * Pode lançar exceções relacionadas à entrada de dados durante a captura.
+ *
+ * Informa ao usuário sobre o sucesso da operação via console.
+ */
+public class CreateProdutoController {
+
+ /** Objeto de acesso a dados para produtos. */
+ private ProdutoDAO dao;
+
+ /** Interface de entrada e saída para o usuário. */
+ private ProdutoView view;
+
+ /**
+ * Construtor que inicializa os objetos DAO e View.
+ */
+ public CreateProdutoController() {
+ dao = new ProdutoDAO();
+ view = new ProdutoView();
+ }
+
+ /**
+ * Captura os dados do produto, cria o objeto Produto e salva no banco de dados.
+ *
+ * Exibe uma mensagem de sucesso no console após a operação.
+ *
+ * @throws IOException caso ocorra erro durante a entrada de dados
+ */
+ public void adicionarProduto() throws IOException {
+ String nome = view.pedirNomeProduto();
+ float valor = view.pedirValorProduto();
+
+ dao.salvar(new Produto(nome, valor));
+ System.out.println("Produto adicionado com sucesso!");
+ }
+}
+
diff --git a/avaliacoes/restaurante/src/main/java/com/restaurante/controllers/produto/DeleteProdutoController.java b/avaliacoes/restaurante/src/main/java/com/restaurante/controllers/produto/DeleteProdutoController.java
new file mode 100644
index 0000000..10144e7
--- /dev/null
+++ b/avaliacoes/restaurante/src/main/java/com/restaurante/controllers/produto/DeleteProdutoController.java
@@ -0,0 +1,44 @@
+package com.restaurante.controllers.produto;
+
+import java.io.IOException;
+
+import com.restaurante.dao.ProdutoDAO;
+import com.restaurante.view.ProdutoView;
+
+/**
+ * Controller responsável pela remoção de produtos do sistema com base no nome.
+ *
+ * Esta classe interage com a {@link ProdutoView} para capturar o nome do produto
+ * a ser removido e utiliza a {@link ProdutoDAO} para realizar a exclusão no banco de dados.
+ *
+ * Exibe mensagem informativa no console após a remoção.
+ */
+public class DeleteProdutoController {
+
+ /** Objeto de acesso a dados para produtos. */
+ private ProdutoDAO dao;
+
+ /** Interface de entrada e saída para o usuário. */
+ private ProdutoView view;
+
+ /**
+ * Construtor que inicializa os objetos DAO e View.
+ */
+ public DeleteProdutoController() {
+ dao = new ProdutoDAO();
+ view = new ProdutoView();
+ }
+
+ /**
+ * Captura o nome do produto e remove o produto correspondente do banco de dados.
+ *
+ * Exibe mensagem no console informando que o produto foi removido.
+ *
+ * @throws IOException caso ocorra erro na entrada de dados pelo usuário
+ */
+ public void removerProduto() throws IOException {
+ String nome = view.pedirNomeProduto();
+ dao.removerPorNome(nome);
+ System.out.println("Produto removido!");
+ }
+}
diff --git a/avaliacoes/restaurante/src/main/java/com/restaurante/controllers/produto/SearchProdutoController.java b/avaliacoes/restaurante/src/main/java/com/restaurante/controllers/produto/SearchProdutoController.java
new file mode 100644
index 0000000..72b4c0f
--- /dev/null
+++ b/avaliacoes/restaurante/src/main/java/com/restaurante/controllers/produto/SearchProdutoController.java
@@ -0,0 +1,45 @@
+package com.restaurante.controllers.produto;
+
+import java.io.IOException;
+import java.util.List;
+
+import com.restaurante.dao.ProdutoDAO;
+import com.restaurante.model.Produto;
+import com.restaurante.view.ProdutoView;
+
+/**
+ * Controller responsável por listar todos os produtos cadastrados no sistema.
+ *
+ * Esta classe utiliza a {@link ProdutoDAO} para recuperar a lista de produtos
+ * e a {@link ProdutoView} para exibir essas informações ao usuário.
+ *
+ * Pode lançar exceções relacionadas à entrada/saída durante a exibição.
+ *
+ * Útil para visualização geral dos produtos disponíveis.
+ */
+public class SearchProdutoController {
+
+ /** Objeto de acesso a dados para produtos. */
+ private ProdutoDAO dao;
+
+ /** Interface de entrada e saída para o usuário. */
+ private ProdutoView view;
+
+ /**
+ * Construtor que inicializa os objetos DAO e View.
+ */
+ public SearchProdutoController() {
+ dao = new ProdutoDAO();
+ view = new ProdutoView();
+ }
+
+ /**
+ * Recupera a lista de todos os produtos cadastrados e os exibe ao usuário.
+ *
+ * @throws IOException caso ocorra erro na operação de exibição
+ */
+ public void listarProdutos() throws IOException {
+ List produtos = dao.listarTodos();
+ view.exibirProdutos(produtos);
+ }
+}
diff --git a/avaliacoes/restaurante/src/main/java/com/restaurante/dao/ClienteDAO.java b/avaliacoes/restaurante/src/main/java/com/restaurante/dao/ClienteDAO.java
new file mode 100644
index 0000000..0899d61
--- /dev/null
+++ b/avaliacoes/restaurante/src/main/java/com/restaurante/dao/ClienteDAO.java
@@ -0,0 +1,132 @@
+package com.restaurante.dao;
+
+import com.restaurante.model.Cliente;
+import com.restaurante.model.Endereco;
+
+import java.io.*;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Scanner;
+
+/**
+ * Data Access Object (DAO) para manipulação persistente de dados de clientes.
+ *
+ * Esta classe realiza operações de leitura, escrita e remoção de clientes
+ * em um arquivo de texto denominado {@code clientes.txt}.
+ *
+ * O cliente é salvo com seu endereço serializado em formato simples (CSV),
+ * e na leitura o endereço é desserializado para o objeto {@link Endereco}.
+ *
+ * O arquivo é manipulado diretamente, e erros de E/S são tratados com mensagens no console.
+ *
+ */
+public class ClienteDAO {
+
+ /** Nome do arquivo usado para armazenar os dados dos clientes. */
+ private static final String ARQUIVO = "clientes.txt";
+
+ /**
+ * Salva um cliente no arquivo, adicionando ao final do arquivo existente.
+ *
+ * O endereço do cliente, se existir, é serializado no formato "tipo,numero,cep".
+ *
+ * @param cliente o cliente a ser salvo
+ */
+ public void salvar(Cliente cliente) {
+ try (PrintWriter writer = new PrintWriter(new FileWriter(ARQUIVO, true))) {
+ String enderecoStr = "";
+ Endereco e = cliente.getEndereco();
+ if (e != null) {
+ // formato: tipo,numero,cep
+ enderecoStr = e.getTipo() + "," + e.getNumero() + "," + e.getCep();
+ }
+ writer.println(cliente.getNome() + ";" +
+ cliente.getCpf() + ";" +
+ cliente.getNumFid() + ";" +
+ enderecoStr);
+ } catch (IOException ex) {
+ System.out.println("Erro ao salvar cliente: " + ex.getMessage());
+ }
+ }
+
+ /**
+ * Lista todos os clientes armazenados no arquivo.
+ *
+ * Realiza a leitura do arquivo, desserializando as informações do cliente
+ * e seu endereço (quando presente) para objetos correspondentes.
+ *
+ * @return uma lista contendo todos os clientes encontrados no arquivo;
+ * lista vazia se o arquivo não existir ou estiver vazio
+ */
+ public List listar() {
+ List clientes = new ArrayList<>();
+ File file = new File(ARQUIVO);
+
+ if (!file.exists()) {
+ return clientes;
+ }
+
+ try (Scanner scanner = new Scanner(file)) {
+ while (scanner.hasNextLine()) {
+ String linha = scanner.nextLine();
+ String[] partes = linha.split(";", 4);
+ if (partes.length >= 3) {
+ String nome = partes[0];
+ String cpf = partes[1];
+ int numFid = Integer.parseInt(partes[2]);
+
+ Endereco endereco = null;
+ if (partes.length == 4 && !partes[3].isEmpty()) {
+ String[] dadosEndereco = partes[3].split(",");
+ if (dadosEndereco.length == 3) {
+ String tipo = dadosEndereco[0];
+ int numero = Integer.parseInt(dadosEndereco[1]);
+ String cep = dadosEndereco[2];
+ endereco = new Endereco(tipo, cep, numero);
+ }
+ }
+
+ clientes.add(new Cliente(nome, cpf, endereco, numFid));
+ }
+ }
+ } catch (IOException ex) {
+ System.out.println("Erro ao ler clientes: " + ex.getMessage());
+ }
+
+ return clientes;
+ }
+
+ /**
+ * Remove um cliente do arquivo com base no CPF informado.
+ *
+ * A operação recarrega todos os clientes, remove o cliente com o CPF especificado
+ * e reescreve o arquivo com os dados atualizados.
+ *
+ * @param cpf o CPF do cliente que deve ser removido
+ * @return {@code true} se um cliente foi removido; {@code false} caso contrário
+ */
+ public boolean remover(String cpf) {
+ List clientes = listar();
+ boolean removido = clientes.removeIf(c -> c.getCpf().equals(cpf));
+
+ if (removido) {
+ try (PrintWriter writer = new PrintWriter(new FileWriter(ARQUIVO))) {
+ for (Cliente c : clientes) {
+ String enderecoStr = "";
+ Endereco e = c.getEndereco();
+ if (e != null) {
+ enderecoStr = e.getTipo() + "," + e.getNumero() + "," + e.getCep();
+ }
+ writer.println(c.getNome() + ";" +
+ c.getCpf() + ";" +
+ c.getNumFid() + ";" +
+ enderecoStr);
+ }
+ } catch (IOException ex) {
+ System.out.println("Erro ao reescrever arquivo: " + ex.getMessage());
+ }
+ }
+
+ return removido;
+ }
+}
diff --git a/avaliacoes/restaurante/src/main/java/com/restaurante/dao/EnderecoDAO.java b/avaliacoes/restaurante/src/main/java/com/restaurante/dao/EnderecoDAO.java
new file mode 100644
index 0000000..4aca861
--- /dev/null
+++ b/avaliacoes/restaurante/src/main/java/com/restaurante/dao/EnderecoDAO.java
@@ -0,0 +1,109 @@
+package com.restaurante.dao;
+
+import com.restaurante.model.Endereco;
+
+import java.io.*;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Data Access Object (DAO) responsável pela persistência e manipulação de dados de endereços.
+ *
+ * Esta classe realiza operações de salvar, listar e deletar endereços em um arquivo de texto
+ * denominado {@code enderecos.txt}, armazenando as informações no formato delimitado por ponto e vírgula.
+ *
+ * Trata exceções de E/S exibindo mensagens no console.
+ *
+ */
+public class EnderecoDAO {
+
+ /** Nome do arquivo usado para armazenar os endereços. */
+ private static final String ARQUIVO = "enderecos.txt";
+
+ /**
+ * Salva um endereço no arquivo, adicionando ao final do arquivo existente.
+ *
+ * O endereço é formatado como "tipo;numero;cep" para armazenamento.
+ *
+ * @param endereco o endereço a ser salvo
+ */
+ public void salvarEndereco(Endereco endereco) {
+ try (BufferedWriter writer = new BufferedWriter(new FileWriter(ARQUIVO, true))) {
+ writer.write(formatarEndereco(endereco));
+ writer.newLine();
+ System.out.println("Endereço salvo no arquivo com sucesso.");
+ } catch (IOException e) {
+ System.out.println("Erro ao salvar endereço no arquivo: " + e.getMessage());
+ }
+ }
+
+ /**
+ * Formata os dados do endereço para o formato de texto que será salvo no arquivo.
+ *
+ * @param e o endereço a ser formatado
+ * @return string formatada contendo tipo, número e CEP separados por ponto e vírgula
+ */
+ private String formatarEndereco(Endereco e) {
+ return e.getTipo() + ";" + e.getNumero() + ";" + e.getCep();
+ }
+
+ /**
+ * Lista todos os endereços armazenados no arquivo.
+ *
+ * Realiza a leitura do arquivo, cria objetos {@link Endereco} e os adiciona a uma lista.
+ *
+ * @return lista contendo todos os endereços encontrados no arquivo;
+ * lista vazia caso o arquivo não exista ou esteja vazio
+ */
+ public List listarEnderecos() {
+ List lista = new ArrayList<>();
+ try (BufferedReader reader = new BufferedReader(new FileReader(ARQUIVO))) {
+ String linha;
+ while ((linha = reader.readLine()) != null) {
+ String[] partes = linha.split(";");
+ if (partes.length == 3) {
+ String tipo = partes[0];
+ int numero = Integer.parseInt(partes[1]);
+ String cep = partes[2];
+ lista.add(new Endereco(tipo, cep, numero));
+ }
+ }
+ } catch (FileNotFoundException e) {
+ // Arquivo não existe ainda, não é considerado erro
+ } catch (IOException e) {
+ System.out.println("Erro ao ler arquivo de endereços: " + e.getMessage());
+ }
+ return lista;
+ }
+
+ /**
+ * Remove um endereço da lista com base no CEP e atualiza o arquivo com a lista atualizada.
+ *
+ * @param lista lista de endereços em memória
+ * @param cep o CEP do endereço que deve ser removido
+ * @return {@code true} se algum endereço foi removido; {@code false} caso contrário
+ */
+ public boolean deletarEnderecoPorCep(List lista, String cep) {
+ boolean removido = lista.removeIf(e -> e.getCep().equals(cep));
+ if (removido) {
+ salvarListaAtualizada(lista);
+ }
+ return removido;
+ }
+
+ /**
+ * Salva a lista atualizada de endereços no arquivo, sobrescrevendo o conteúdo existente.
+ *
+ * @param lista a lista atualizada de endereços
+ */
+ private void salvarListaAtualizada(List lista) {
+ try (BufferedWriter writer = new BufferedWriter(new FileWriter(ARQUIVO, false))) {
+ for (Endereco e : lista) {
+ writer.write(formatarEndereco(e));
+ writer.newLine();
+ }
+ } catch (IOException e) {
+ System.out.println("Erro ao salvar arquivo atualizado: " + e.getMessage());
+ }
+ }
+}
diff --git a/avaliacoes/restaurante/src/main/java/com/restaurante/dao/FuncionarioDAO.java b/avaliacoes/restaurante/src/main/java/com/restaurante/dao/FuncionarioDAO.java
new file mode 100644
index 0000000..2b1f52c
--- /dev/null
+++ b/avaliacoes/restaurante/src/main/java/com/restaurante/dao/FuncionarioDAO.java
@@ -0,0 +1,144 @@
+package com.restaurante.dao;
+
+import com.restaurante.model.Funcionario;
+import com.restaurante.model.Mesa;
+
+import java.io.*;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Data Access Object (DAO) responsável pela persistência e manipulação de dados dos funcionários.
+ *
+ * Esta classe realiza operações de salvar, listar e remover funcionários
+ * em um arquivo de texto denominado {@code funcionarios.txt}.
+ *
+ * Os funcionários são armazenados com suas mesas associadas serializadas em formato texto.
+ *
+ * Os dados das mesas são serializados como "numero,local" separados por pipe "|".
+ *
+ * Exibe mensagens no console em caso de erros de I/O.
+ *
+ */
+public class FuncionarioDAO {
+
+ /** Nome do arquivo usado para armazenar os dados dos funcionários. */
+ private static final String ARQUIVO = "funcionarios.txt";
+
+ /**
+ * Salva um funcionário no arquivo, adicionando ao final.
+ *
+ * Serializa a lista de mesas associadas ao funcionário no formato
+ * "numero,local|numero,local|...".
+ *
+ * @param funcionario o funcionário a ser salvo
+ */
+ public void salvar(Funcionario funcionario) {
+ try (PrintWriter writer = new PrintWriter(new FileWriter(ARQUIVO, true))) {
+ StringBuilder sbMesas = new StringBuilder();
+ if (funcionario.getMesas() != null) {
+ for (int i = 0; i < funcionario.getMesas().size(); i++) {
+ Mesa m = funcionario.getMesas().get(i);
+ sbMesas.append(m.getNumero()).append(",").append(m.getLocal());
+ if (i < funcionario.getMesas().size() - 1) {
+ sbMesas.append("|");
+ }
+ }
+ }
+ writer.println(funcionario.getNome() + ";" +
+ funcionario.getCpf() + ";" +
+ funcionario.getCtp() + ";" +
+ funcionario.getCargo() + ";" +
+ sbMesas.toString());
+ } catch (IOException e) {
+ System.out.println("Erro ao salvar funcionário: " + e.getMessage());
+ }
+ }
+
+ /**
+ * Lista todos os funcionários armazenados no arquivo.
+ *
+ * Desserializa as informações dos funcionários e suas mesas para objetos correspondentes.
+ *
+ * @return lista com todos os funcionários encontrados no arquivo;
+ * lista vazia se o arquivo não existir ou estiver vazio
+ */
+ public List listar() {
+ List funcionarios = new ArrayList<>();
+ File file = new File(ARQUIVO);
+
+ if (!file.exists()) {
+ return funcionarios;
+ }
+
+ try (BufferedReader reader = new BufferedReader(new FileReader(ARQUIVO))) {
+ String linha;
+ while ((linha = reader.readLine()) != null) {
+ String[] partes = linha.split(";", 5);
+ if (partes.length >= 5) {
+ String nome = partes[0];
+ String cpf = partes[1];
+ String ctp = partes[2];
+ String cargo = partes[3];
+ String mesasStr = partes[4];
+
+ List mesas = new ArrayList<>();
+ if (!mesasStr.isEmpty()) {
+ String[] mesasArray = mesasStr.split("\\|");
+ for (String mesaDados : mesasArray) {
+ String[] dados = mesaDados.split(",");
+ if (dados.length == 2) {
+ mesas.add(new Mesa(dados[0], dados[1]));
+ }
+ }
+ }
+ funcionarios.add(new Funcionario(nome, cpf, null, ctp, cargo, mesas));
+ }
+ }
+ } catch (IOException e) {
+ System.out.println("Erro ao ler funcionários: " + e.getMessage());
+ }
+
+ return funcionarios;
+ }
+
+ /**
+ * Remove um funcionário do arquivo com base no CPF informado.
+ *
+ * Recarrega todos os funcionários, remove o funcionário com o CPF especificado
+ * e reescreve o arquivo com os dados atualizados.
+ *
+ * @param cpf o CPF do funcionário a ser removido
+ * @return {@code true} se um funcionário foi removido; {@code false} caso contrário
+ */
+ public boolean remover(String cpf) {
+ List funcionarios = listar();
+ boolean removido = funcionarios.removeIf(f -> f.getCpf().equals(cpf));
+
+ if (removido) {
+ try (PrintWriter writer = new PrintWriter(new FileWriter(ARQUIVO))) {
+ for (Funcionario f : funcionarios) {
+ StringBuilder sbMesas = new StringBuilder();
+ if (f.getMesas() != null) {
+ for (int i = 0; i < f.getMesas().size(); i++) {
+ Mesa m = f.getMesas().get(i);
+ sbMesas.append(m.getNumero()).append(",").append(m.getLocal());
+ if (i < f.getMesas().size() - 1) {
+ sbMesas.append("|");
+ }
+ }
+ }
+ writer.println(f.getNome() + ";" +
+ f.getCpf() + ";" +
+ f.getCtp() + ";" +
+ f.getCargo() + ";" +
+ sbMesas.toString());
+ }
+ } catch (IOException e) {
+ System.out.println("Erro ao reescrever arquivo: " + e.getMessage());
+ }
+ }
+
+ return removido;
+ }
+}
diff --git a/avaliacoes/restaurante/src/main/java/com/restaurante/dao/MesaDAO.java b/avaliacoes/restaurante/src/main/java/com/restaurante/dao/MesaDAO.java
new file mode 100644
index 0000000..80ec4b8
--- /dev/null
+++ b/avaliacoes/restaurante/src/main/java/com/restaurante/dao/MesaDAO.java
@@ -0,0 +1,91 @@
+package com.restaurante.dao;
+
+import java.io.*;
+import java.util.ArrayList;
+import java.util.List;
+
+import com.restaurante.model.Mesa;
+
+/**
+ * Data Access Object (DAO) responsável pela persistência e manipulação dos dados das mesas.
+ *
+ * Esta classe realiza operações de salvar, listar e deletar mesas em um arquivo de texto
+ * denominado {@code mesas.txt}, armazenando as informações no formato delimitado por ponto e vírgula.
+ *
+ * Operações suportadas:
+ *
+ * - Salvar uma mesa (append no arquivo)
+ * - Listar todas as mesas
+ * - Deletar uma mesa pelo número e atualizar o arquivo
+ *
+ *
+ * Exceções de I/O são propagadas para o chamador tratar.
+ */
+public class MesaDAO {
+
+ /** Nome do arquivo usado para armazenar as mesas. */
+ private static final String FILE_NAME = "mesas.txt";
+
+ /**
+ * Salva uma mesa no arquivo, adicionando ao final do arquivo existente.
+ *
+ * O formato utilizado para armazenamento é "numero;local".
+ *
+ * @param mesa a mesa a ser salva
+ * @throws IOException caso ocorra erro na operação de escrita no arquivo
+ */
+ public void salvar(Mesa mesa) throws IOException {
+ try (BufferedWriter writer = new BufferedWriter(new FileWriter(FILE_NAME, true))) {
+ writer.write(mesa.getNumero() + ";" + mesa.getLocal());
+ writer.newLine();
+ }
+ }
+
+ /**
+ * Lista todas as mesas armazenadas no arquivo.
+ *
+ * Realiza a leitura do arquivo, criando objetos {@link Mesa} para cada linha.
+ *
+ * @return lista contendo todas as mesas encontradas no arquivo;
+ * lista vazia caso o arquivo não exista ou esteja vazio
+ * @throws IOException caso ocorra erro na operação de leitura do arquivo
+ */
+ public List listar() throws IOException {
+ List mesas = new ArrayList<>();
+ File arquivo = new File(FILE_NAME);
+
+ if (!arquivo.exists()) {
+ return mesas;
+ }
+
+ try (BufferedReader reader = new BufferedReader(new FileReader(FILE_NAME))) {
+ String linha;
+ while ((linha = reader.readLine()) != null) {
+ String[] dados = linha.split(";");
+ mesas.add(new Mesa(dados[0], dados[1]));
+ }
+ }
+ return mesas;
+ }
+
+ /**
+ * Remove uma mesa do arquivo com base no número informado.
+ *
+ * A operação recarrega todas as mesas, remove a mesa com o número especificado,
+ * e reescreve o arquivo com as mesas restantes.
+ *
+ * @param numero o número da mesa que deve ser removida
+ * @throws IOException caso ocorra erro na operação de leitura ou escrita no arquivo
+ */
+ public void deletar(String numero) throws IOException {
+ List mesas = listar();
+ try (BufferedWriter writer = new BufferedWriter(new FileWriter(FILE_NAME))) {
+ for (Mesa m : mesas) {
+ if (!m.getNumero().equals(numero)) {
+ writer.write(m.getNumero() + ";" + m.getLocal());
+ writer.newLine();
+ }
+ }
+ }
+ }
+}
diff --git a/avaliacoes/restaurante/src/main/java/com/restaurante/dao/ProdutoDAO.java b/avaliacoes/restaurante/src/main/java/com/restaurante/dao/ProdutoDAO.java
new file mode 100644
index 0000000..eb99711
--- /dev/null
+++ b/avaliacoes/restaurante/src/main/java/com/restaurante/dao/ProdutoDAO.java
@@ -0,0 +1,87 @@
+package com.restaurante.dao;
+
+import java.io.*;
+import java.util.ArrayList;
+import java.util.List;
+
+import com.restaurante.model.Produto;
+
+/**
+ * Data Access Object (DAO) responsável pela persistência e manipulação dos dados dos produtos.
+ *
+ * Esta classe realiza operações de salvar, listar e remover produtos
+ * em um arquivo de texto denominado {@code produtos.txt},
+ * armazenando as informações no formato delimitado por ponto e vírgula.
+ *
+ * Exceções de I/O são propagadas para o chamador tratar.
+ *
+ */
+public class ProdutoDAO {
+
+ /** Nome do arquivo usado para armazenar os produtos. */
+ private static final String FILE_NAME = "produtos.txt";
+
+ /**
+ * Salva um produto no arquivo, adicionando ao final do arquivo existente.
+ *
+ * O formato utilizado para armazenamento é "nome;valor".
+ *
+ * @param produto o produto a ser salvo
+ * @throws IOException caso ocorra erro na operação de escrita no arquivo
+ */
+ public void salvar(Produto produto) throws IOException {
+ try (BufferedWriter writer = new BufferedWriter(new FileWriter(FILE_NAME, true))) {
+ writer.write(produto.getNome() + ";" + produto.getValorProd());
+ writer.newLine();
+ }
+ }
+
+ /**
+ * Lista todos os produtos armazenados no arquivo.
+ *
+ * Realiza a leitura do arquivo, criando objetos {@link Produto} para cada linha.
+ *
+ * @return lista contendo todos os produtos encontrados no arquivo;
+ * lista vazia caso o arquivo não exista ou esteja vazio
+ * @throws IOException caso ocorra erro na operação de leitura do arquivo
+ */
+ public List listarTodos() throws IOException {
+ List produtos = new ArrayList<>();
+ File arquivo = new File(FILE_NAME);
+
+ if (!arquivo.exists()) {
+ return produtos;
+ }
+
+ try (BufferedReader reader = new BufferedReader(new FileReader(FILE_NAME))) {
+ String linha;
+ while ((linha = reader.readLine()) != null) {
+ String[] dados = linha.split(";");
+ produtos.add(new Produto(dados[0], Float.parseFloat(dados[1])));
+ }
+ }
+ return produtos;
+ }
+
+ /**
+ * Remove um produto do arquivo com base no nome informado.
+ *
+ * A operação recarrega todos os produtos, remove o produto com o nome especificado,
+ * e reescreve o arquivo com os produtos restantes.
+ *
+ * @param nome o nome do produto que deve ser removido
+ * @throws IOException caso ocorra erro na operação de leitura ou escrita no arquivo
+ */
+ public void removerPorNome(String nome) throws IOException {
+ List produtos = listarTodos();
+
+ try (BufferedWriter writer = new BufferedWriter(new FileWriter(FILE_NAME))) {
+ for (Produto p : produtos) {
+ if (!p.getNome().equals(nome)) {
+ writer.write(p.getNome() + ";" + p.getValorProd());
+ writer.newLine();
+ }
+ }
+ }
+ }
+}
diff --git a/avaliacoes/restaurante/src/main/java/com/restaurante/model/Cliente.java b/avaliacoes/restaurante/src/main/java/com/restaurante/model/Cliente.java
new file mode 100644
index 0000000..621758b
--- /dev/null
+++ b/avaliacoes/restaurante/src/main/java/com/restaurante/model/Cliente.java
@@ -0,0 +1,46 @@
+package com.restaurante.model;
+
+/**
+ * Representa um cliente do restaurante, que é uma especialização de {@link Pessoa}.
+ *
+ * Além dos atributos herdados de Pessoa (nome, cpf, endereço),
+ * o cliente possui um número de fidelidade.
+ *
+ * @see Pessoa
+ */
+public class Cliente extends Pessoa {
+
+ /** Número de fidelidade do cliente. */
+ private int numFid;
+
+ /**
+ * Construtor para criar um cliente com nome, CPF, endereço e número de fidelidade.
+ *
+ * @param nome nome do cliente
+ * @param cpf CPF do cliente
+ * @param endereco endereço do cliente
+ * @param numFid número de fidelidade do cliente
+ */
+ public Cliente(String nome, String cpf, Endereco endereco, int numFid) {
+ super(nome, cpf, endereco);
+ this.numFid = numFid;
+ }
+
+ /**
+ * Obtém o número de fidelidade do cliente.
+ *
+ * @return número de fidelidade
+ */
+ public int getNumFid() {
+ return numFid;
+ }
+
+ /**
+ * Define o número de fidelidade do cliente.
+ *
+ * @param numFid novo número de fidelidade
+ */
+ public void setNumFid(int numFid) {
+ this.numFid = numFid;
+ }
+}
diff --git a/avaliacoes/restaurante/src/main/java/com/restaurante/model/Endereco.java b/avaliacoes/restaurante/src/main/java/com/restaurante/model/Endereco.java
new file mode 100644
index 0000000..5ca3c7f
--- /dev/null
+++ b/avaliacoes/restaurante/src/main/java/com/restaurante/model/Endereco.java
@@ -0,0 +1,92 @@
+package com.restaurante.model;
+
+/**
+ * Representa um endereço com tipo, CEP e número.
+ *
+ * Exemplo de tipo: "Rua", "Avenida", etc.
+ *
+ * Contém métodos para obter e modificar seus atributos,
+ * além de um método para retornar uma descrição simples do endereço.
+ *
+ */
+public class Endereco {
+
+ /** Tipo do endereço (ex: Rua, Avenida). */
+ private String tipo;
+
+ /** Código de Endereçamento Postal (CEP). */
+ private String cep;
+
+ /** Número do endereço. */
+ private int numero;
+
+ /**
+ * Construtor para criar um endereço.
+ *
+ * @param tipo tipo do endereço (ex: Rua, Avenida)
+ * @param cep CEP do endereço
+ * @param numero número do endereço
+ */
+ public Endereco(String tipo, String cep, int numero) {
+ this.tipo = tipo;
+ this.cep = cep;
+ this.numero = numero;
+ }
+
+ /**
+ * Obtém o tipo do endereço.
+ * @return tipo do endereço
+ */
+ public String getTipo() {
+ return tipo;
+ }
+
+ /**
+ * Define o tipo do endereço.
+ * @param tipo novo tipo do endereço
+ */
+ public void setTipo(String tipo) {
+ this.tipo = tipo;
+ }
+
+ /**
+ * Obtém o CEP do endereço.
+ * @return CEP do endereço
+ */
+ public String getCep() {
+ return cep;
+ }
+
+ /**
+ * Define o CEP do endereço.
+ * @param cep novo CEP do endereço
+ */
+ public void setCep(String cep) {
+ this.cep = cep;
+ }
+
+ /**
+ * Obtém o número do endereço.
+ * @return número do endereço
+ */
+ public int getNumero() {
+ return numero;
+ }
+
+ /**
+ * Define o número do endereço.
+ * @param numero novo número do endereço
+ */
+ public void setNumero(int numero) {
+ this.numero = numero;
+ }
+
+ /**
+ * Retorna uma descrição simples do endereço no formato "tipo, número".
+ *
+ * @return descrição do endereço
+ */
+ public String getEndereco() {
+ return this.tipo + ", " + this.numero;
+ }
+}
diff --git a/avaliacoes/restaurante/src/main/java/com/restaurante/model/Funcionario.java b/avaliacoes/restaurante/src/main/java/com/restaurante/model/Funcionario.java
new file mode 100644
index 0000000..345aade
--- /dev/null
+++ b/avaliacoes/restaurante/src/main/java/com/restaurante/model/Funcionario.java
@@ -0,0 +1,95 @@
+package com.restaurante.model;
+
+import java.util.List;
+
+/**
+ * Representa um funcionário do restaurante, que é uma especialização de {@link Pessoa}.
+ *
+ * Além dos atributos herdados de Pessoa (nome, cpf, endereço),
+ * o funcionário possui carteira de trabalho (CTP), cargo e uma lista de mesas que ele atende.
+ *
+ * @see Pessoa
+ *
+ */
+public class Funcionario extends Pessoa {
+
+ /** Número da Carteira de Trabalho e Previdência Social do funcionário. */
+ private String ctp;
+
+ /** Cargo ocupado pelo funcionário. */
+ private String cargo;
+
+ /** Lista de mesas atribuídas ao funcionário. */
+ private List mesas;
+
+ /**
+ * Construtor para criar um funcionário com nome, CPF, endereço, CTP, cargo e lista de mesas.
+ *
+ * @param nome nome do funcionário
+ * @param cpf CPF do funcionário
+ * @param endereco endereço do funcionário
+ * @param ctp número da carteira de trabalho
+ * @param cargo cargo do funcionário
+ * @param mesas lista de mesas que o funcionário atende
+ */
+ public Funcionario(String nome, String cpf, Endereco endereco, String ctp, String cargo, List mesas) {
+ super(nome, cpf, endereco);
+ this.ctp = ctp;
+ this.cargo = cargo;
+ this.mesas = mesas;
+ }
+
+ /**
+ * Obtém o número da carteira de trabalho do funcionário.
+ *
+ * @return número da CTP
+ */
+ public String getCtp() {
+ return ctp;
+ }
+
+ /**
+ * Define o número da carteira de trabalho do funcionário.
+ *
+ * @param ctp novo número da CTP
+ */
+ public void setCtp(String ctp) {
+ this.ctp = ctp;
+ }
+
+ /**
+ * Obtém o cargo do funcionário.
+ *
+ * @return cargo do funcionário
+ */
+ public String getCargo() {
+ return cargo;
+ }
+
+ /**
+ * Define o cargo do funcionário.
+ *
+ * @param cargo novo cargo do funcionário
+ */
+ public void setCargo(String cargo) {
+ this.cargo = cargo;
+ }
+
+ /**
+ * Obtém a lista de mesas que o funcionário atende.
+ *
+ * @return lista de mesas
+ */
+ public List getMesas() {
+ return mesas;
+ }
+
+ /**
+ * Define a lista de mesas que o funcionário atende.
+ *
+ * @param mesas nova lista de mesas
+ */
+ public void setMesas(List mesas) {
+ this.mesas = mesas;
+ }
+}
diff --git a/avaliacoes/restaurante/src/main/java/com/restaurante/model/Mesa.java b/avaliacoes/restaurante/src/main/java/com/restaurante/model/Mesa.java
new file mode 100644
index 0000000..353e5a3
--- /dev/null
+++ b/avaliacoes/restaurante/src/main/java/com/restaurante/model/Mesa.java
@@ -0,0 +1,63 @@
+package com.restaurante.model;
+
+/**
+ * Representa uma mesa do restaurante, identificada por número e localização.
+ *
+ * Esta classe encapsula os atributos básicos de uma mesa,
+ * incluindo seu número identificador e o local onde está posicionada.
+ */
+public class Mesa {
+
+ /** Número identificador da mesa. */
+ private String numero;
+
+ /** Localização da mesa no restaurante. */
+ private String local;
+
+ /**
+ * Construtor para criar uma mesa com número e local definidos.
+ *
+ * @param numero número identificador da mesa
+ * @param local localização da mesa
+ */
+ public Mesa(String numero, String local) {
+ this.numero = numero;
+ this.local = local;
+ }
+
+ /**
+ * Obtém o número da mesa.
+ *
+ * @return número da mesa
+ */
+ public String getNumero() {
+ return numero;
+ }
+
+ /**
+ * Define o número da mesa.
+ *
+ * @param numero novo número da mesa
+ */
+ public void setNumero(String numero) {
+ this.numero = numero;
+ }
+
+ /**
+ * Obtém a localização da mesa.
+ *
+ * @return local da mesa
+ */
+ public String getLocal() {
+ return local;
+ }
+
+ /**
+ * Define a localização da mesa.
+ *
+ * @param local nova localização da mesa
+ */
+ public void setLocal(String local) {
+ this.local = local;
+ }
+}
diff --git a/avaliacoes/restaurante/src/main/java/com/restaurante/model/Pessoa.java b/avaliacoes/restaurante/src/main/java/com/restaurante/model/Pessoa.java
new file mode 100644
index 0000000..59f83ae
--- /dev/null
+++ b/avaliacoes/restaurante/src/main/java/com/restaurante/model/Pessoa.java
@@ -0,0 +1,87 @@
+package com.restaurante.model;
+
+/**
+ * Representa uma pessoa genérica com nome, CPF e endereço.
+ *
+ * Esta classe serve como base para outras classes que representam
+ * tipos específicos de pessoas, como Cliente e Funcionario.
+ *
+ */
+public class Pessoa {
+
+ /** Nome da pessoa. */
+ private String nome;
+
+ /** CPF da pessoa. */
+ private String cpf;
+
+ /** Endereço da pessoa. */
+ private Endereco endereco;
+
+ /**
+ * Construtor para criar uma pessoa com nome, CPF e endereço.
+ *
+ * @param nome nome da pessoa
+ * @param cpf CPF da pessoa
+ * @param endereco endereço da pessoa
+ */
+ public Pessoa(String nome, String cpf, Endereco endereco) {
+ this.nome = nome;
+ this.cpf = cpf;
+ this.endereco = endereco;
+ }
+
+ /**
+ * Obtém o nome da pessoa.
+ *
+ * @return nome da pessoa
+ */
+ public String getNome() {
+ return nome;
+ }
+
+ /**
+ * Define o nome da pessoa.
+ *
+ * @param nome novo nome da pessoa
+ */
+ public void setNome(String nome) {
+ this.nome = nome;
+ }
+
+ /**
+ * Obtém o CPF da pessoa.
+ *
+ * @return CPF da pessoa
+ */
+ public String getCpf() {
+ return cpf;
+ }
+
+ /**
+ * Define o CPF da pessoa.
+ *
+ * @param cpf novo CPF da pessoa
+ */
+ public void setCpf(String cpf) {
+ this.cpf = cpf;
+ }
+
+ /**
+ * Obtém o endereço da pessoa.
+ *
+ * @return endereço da pessoa
+ */
+ public Endereco getEndereco() {
+ return endereco;
+ }
+
+ /**
+ * Define o endereço da pessoa.
+ *
+ * @param endereco novo endereço da pessoa
+ */
+ public void setEndereco(Endereco endereco) {
+ this.endereco = endereco;
+ }
+}
diff --git a/avaliacoes/restaurante/src/main/java/com/restaurante/model/Produto.java b/avaliacoes/restaurante/src/main/java/com/restaurante/model/Produto.java
new file mode 100644
index 0000000..631bccd
--- /dev/null
+++ b/avaliacoes/restaurante/src/main/java/com/restaurante/model/Produto.java
@@ -0,0 +1,121 @@
+package com.restaurante.model;
+
+/**
+ * Representa um produto do restaurante, com nome, valor base,
+ * percentual de lucro e valor do IVA (Imposto sobre Valor Agregado).
+ *
+ * O valor do produto pode ser ajustado com base no lucro e no IVA.
+ */
+public class Produto {
+
+ /** Nome do produto. */
+ private String nome;
+
+ /** Valor base do produto (antes de impostos e lucro). */
+ private float valorProd;
+
+ /** Percentual de lucro aplicado sobre o valor base (ex: 5%). */
+ private int lucro = 5;
+
+ /** Valor do IVA aplicado sobre o valor base (ex: 1.23 corresponde a 23%). */
+ private float iva = 1.23f;
+
+ /**
+ * Construtor para criar produto com nome e valor base.
+ * Usa valores padrão para lucro (5%) e IVA (1.23).
+ *
+ * @param nome nome do produto
+ * @param valorProd valor base do produto
+ */
+ public Produto(String nome, float valorProd) {
+ this.nome = nome;
+ this.valorProd = valorProd;
+ }
+
+ /**
+ * Construtor completo para criar produto com todos os parâmetros.
+ *
+ * @param nome nome do produto
+ * @param valorProd valor base do produto
+ * @param lucro percentual de lucro aplicado
+ * @param iva valor do IVA aplicado
+ */
+ public Produto(String nome, float valorProd, int lucro, float iva) {
+ this.nome = nome;
+ this.valorProd = valorProd;
+ this.lucro = lucro;
+ this.iva = iva;
+ }
+
+ /**
+ * Obtém o nome do produto.
+ *
+ * @return nome do produto
+ */
+ public String getNome() {
+ return nome;
+ }
+
+ /**
+ * Define o nome do produto.
+ *
+ * @param nome novo nome do produto
+ */
+ public void setNome(String nome) {
+ this.nome = nome;
+ }
+
+ /**
+ * Obtém o valor base do produto.
+ *
+ * @return valor base do produto
+ */
+ public float getValorProd() {
+ return valorProd;
+ }
+
+ /**
+ * Define o valor base do produto.
+ *
+ * @param valorProd novo valor base do produto
+ */
+ public void setValorProd(float valorProd) {
+ this.valorProd = valorProd;
+ }
+
+ /**
+ * Obtém o valor do IVA aplicado ao produto.
+ *
+ * @return valor do IVA
+ */
+ public float getIva() {
+ return iva;
+ }
+
+ /**
+ * Define o valor do IVA aplicado ao produto.
+ *
+ * @param iva novo valor do IVA
+ */
+ public void setIva(float iva) {
+ this.iva = iva;
+ }
+
+ /**
+ * Obtém o percentual de lucro aplicado ao produto.
+ *
+ * @return percentual de lucro
+ */
+ public int getLucro() {
+ return lucro;
+ }
+
+ /**
+ * Define o percentual de lucro aplicado ao produto.
+ *
+ * @param lucro novo percentual de lucro
+ */
+ public void setLucro(int lucro) {
+ this.lucro = lucro;
+ }
+}
diff --git a/avaliacoes/restaurante/src/main/java/com/restaurante/view/ClienteView.java b/avaliacoes/restaurante/src/main/java/com/restaurante/view/ClienteView.java
new file mode 100644
index 0000000..7f5f473
--- /dev/null
+++ b/avaliacoes/restaurante/src/main/java/com/restaurante/view/ClienteView.java
@@ -0,0 +1,78 @@
+package com.restaurante.view;
+
+import java.util.Scanner;
+import com.restaurante.model.Cliente;
+
+/**
+ * Classe responsável pela interação com o usuário para operações
+ * relacionadas a clientes, incluindo captura de dados e exibição de informações.
+ *
+ * Utiliza a entrada padrão (Scanner) para capturar dados do usuário.
+ *
+ */
+public class ClienteView {
+
+ /** Scanner para entrada de dados via teclado. */
+ private Scanner scanner = new Scanner(System.in);
+
+ /**
+ * Captura os dados básicos de um cliente pelo teclado:
+ * nome, CPF e número de fidelidade.
+ * O endereço não é capturado aqui e deve ser setado posteriormente.
+ *
+ * @return objeto Cliente criado com os dados capturados
+ */
+ public Cliente capturarCliente() {
+ System.out.print("Nome: ");
+ String nome = scanner.nextLine();
+ System.out.print("CPF: ");
+ String cpf = scanner.nextLine();
+ System.out.print("Número de Fidelidade: ");
+ int numFid = Integer.parseInt(scanner.nextLine());
+
+ return new Cliente(nome, cpf, null, numFid); // Endereço será setado depois
+ }
+
+ /**
+ * Captura o CPF do cliente via entrada padrão.
+ *
+ * @return CPF capturado como String
+ */
+ public String capturarCpf() {
+ System.out.print("Digite o CPF do cliente: ");
+ return scanner.nextLine();
+ }
+
+ /**
+ * Exibe os dados de um cliente formatados no console,
+ * incluindo nome, CPF, número de fidelidade e, se existir, o endereço.
+ *
+ * @param c cliente cujos dados serão exibidos
+ */
+ public void mostrar(Cliente c) {
+ System.out.println("Nome: " + c.getNome());
+ System.out.println("CPF: " + c.getCpf());
+ System.out.println("Número de Fidelidade: " + c.getNumFid());
+ if (c.getEndereco() != null)
+ System.out.println("Endereço: " + c.getEndereco().getEndereco() + " - " + c.getEndereco().getCep());
+ System.out.println("--------------------------");
+ }
+
+ /**
+ * Exibe uma mensagem genérica no console.
+ *
+ * @param msg mensagem a ser exibida
+ */
+ public void mostrarMensagem(String msg) {
+ System.out.println(msg);
+ }
+
+ /**
+ * Retorna o objeto Scanner usado para captura de entrada.
+ *
+ * @return Scanner associado à entrada padrão
+ */
+ public Scanner getScanner() {
+ return scanner;
+ }
+}
diff --git a/avaliacoes/restaurante/src/main/java/com/restaurante/view/EnderecoView.java b/avaliacoes/restaurante/src/main/java/com/restaurante/view/EnderecoView.java
new file mode 100644
index 0000000..ecb1586
--- /dev/null
+++ b/avaliacoes/restaurante/src/main/java/com/restaurante/view/EnderecoView.java
@@ -0,0 +1,91 @@
+package com.restaurante.view;
+
+import java.util.List;
+import java.util.Scanner;
+import com.restaurante.model.Endereco;
+
+/**
+ * Classe responsável pela interação com o usuário para operações
+ * relacionadas a endereços, incluindo captura e exibição de dados.
+ * Utiliza a entrada padrão (Scanner) para capturar dados do usuário.
+ *
+ * Fornece métodos para capturar um endereço completo, capturar um CEP,
+ * mostrar um endereço individual, mostrar uma lista de endereços e
+ * exibir mensagens gerais.
+ */
+public class EnderecoView {
+
+ /** Scanner para entrada de dados via teclado. */
+ private Scanner scanner = new Scanner(System.in);
+
+ /**
+ * Captura os dados necessários para criar um objeto Endereco,
+ * solicitando tipo, número e CEP ao usuário.
+ *
+ * @return objeto Endereco criado com os dados capturados
+ */
+ public Endereco capturarEndereco() {
+ System.out.print("Tipo (Rua, Av...): ");
+ String tipo = scanner.nextLine();
+
+ System.out.print("Número: ");
+ int numero = Integer.parseInt(scanner.nextLine());
+
+ System.out.print("CEP: ");
+ String cep = scanner.nextLine();
+
+ return new Endereco(tipo, cep, numero);
+ }
+
+ /**
+ * Captura o CEP do usuário via entrada padrão.
+ *
+ * @return CEP capturado como String
+ */
+ public String capturarCep() {
+ System.out.print("Digite o CEP: ");
+ return scanner.nextLine();
+ }
+
+ /**
+ * Exibe as informações de um endereço formatadas no console.
+ * Caso o endereço seja nulo, exibe uma mensagem informando que
+ * o endereço não foi encontrado.
+ *
+ * @param e endereço a ser exibido
+ */
+ public void mostrarEndereco(Endereco e) {
+ if (e != null) {
+ System.out.printf("Endereço: %s, %d, CEP: %s%n", e.getTipo(), e.getNumero(), e.getCep());
+ } else {
+ System.out.println("Endereço não encontrado.");
+ }
+ }
+
+ /**
+ * Exibe uma lista de endereços no console, formatando cada um.
+ * Caso a lista esteja vazia, exibe uma mensagem informando que
+ * não há endereços cadastrados.
+ *
+ * @param enderecos lista de endereços a ser exibida
+ */
+ public void mostrarListaEnderecos(List enderecos) {
+ if (enderecos.isEmpty()) {
+ System.out.println("Nenhum endereço cadastrado.");
+ } else {
+ System.out.println("Lista de endereços:");
+ for (Endereco e : enderecos) {
+ System.out.printf("- %s, %d, CEP: %s%n", e.getTipo(), e.getNumero(), e.getCep());
+ }
+ }
+ }
+
+ /**
+ * Exibe uma mensagem genérica no console.
+ *
+ * @param msg mensagem a ser exibida
+ */
+ public void mostrarMensagem(String msg) {
+ System.out.println(msg);
+ }
+}
diff --git a/avaliacoes/restaurante/src/main/java/com/restaurante/view/FuncionarioView.java b/avaliacoes/restaurante/src/main/java/com/restaurante/view/FuncionarioView.java
new file mode 100644
index 0000000..41c1098
--- /dev/null
+++ b/avaliacoes/restaurante/src/main/java/com/restaurante/view/FuncionarioView.java
@@ -0,0 +1,155 @@
+package com.restaurante.view;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Scanner;
+
+import com.restaurante.model.Funcionario;
+import com.restaurante.model.Mesa;
+
+/**
+ * Classe responsável pela interação com o usuário para operações relacionadas a funcionários,
+ * incluindo captura de dados e exibição de informações.
+ *
+ * Permite capturar informações de um funcionário, associando mesas já existentes ou criando novas mesas,
+ * capturar CPF para buscas ou remoções, mostrar detalhes do funcionário e exibir mensagens genéricas.
+ *
+ */
+public class FuncionarioView {
+ private Scanner scanner = new Scanner(System.in);
+
+ /**
+ * Captura os dados para criar um funcionário associando mesas já existentes.
+ * Exibe a lista de mesas disponíveis para seleção e permite que o usuário selecione múltiplas mesas.
+ *
+ * @param mesasExistentes lista de mesas já cadastradas e disponíveis para associação
+ * @return um objeto Funcionario criado com os dados fornecidos e as mesas selecionadas
+ */
+ public Funcionario capturarFuncionarioComMesasExistentes(List mesasExistentes) {
+ System.out.print("Nome: ");
+ String nome = scanner.nextLine();
+ System.out.print("CPF: ");
+ String cpf = scanner.nextLine();
+ System.out.print("CTP: ");
+ String ctp = scanner.nextLine();
+ System.out.print("Cargo: ");
+ String cargo = scanner.nextLine();
+
+ List mesasSelecionadas = new ArrayList<>();
+ String opcao = "s";
+
+ while (opcao.equalsIgnoreCase("s")) {
+ System.out.println("Mesas disponíveis:");
+ for (int i = 0; i < mesasExistentes.size(); i++) {
+ Mesa m = mesasExistentes.get(i);
+ System.out.printf("%d - Mesa %s - Local: %s%n", i + 1, m.getNumero(), m.getLocal());
+ }
+ System.out.print("Escolha o número da mesa para associar: ");
+ int escolha;
+ try {
+ escolha = Integer.parseInt(scanner.nextLine());
+ } catch (NumberFormatException e) {
+ System.out.println("Entrada inválida, tente novamente.");
+ continue;
+ }
+
+ if (escolha >= 1 && escolha <= mesasExistentes.size()) {
+ Mesa mesaEscolhida = mesasExistentes.get(escolha - 1);
+ if (!mesasSelecionadas.contains(mesaEscolhida)) {
+ mesasSelecionadas.add(mesaEscolhida);
+ } else {
+ System.out.println("Mesa já selecionada.");
+ }
+ } else {
+ System.out.println("Opção inválida.");
+ }
+
+ System.out.print("Deseja adicionar outra mesa? (s/n): ");
+ opcao = scanner.nextLine();
+ }
+
+ return new Funcionario(nome, cpf, null, ctp, cargo, mesasSelecionadas);
+ }
+
+ /**
+ * Captura os dados para criar um funcionário incluindo mesas criadas manualmente.
+ * Permite adicionar múltiplas mesas informando número e local.
+ *
+ * @return um objeto Funcionario criado com os dados fornecidos e mesas informadas manualmente
+ */
+ public Funcionario capturarFuncionario() {
+ System.out.print("Nome: ");
+ String nome = scanner.nextLine();
+ System.out.print("CPF: ");
+ String cpf = scanner.nextLine();
+ System.out.print("CTP: ");
+ String ctp = scanner.nextLine();
+ System.out.print("Cargo: ");
+ String cargo = scanner.nextLine();
+
+ List mesas = new ArrayList<>();
+ String opcao = "s";
+
+ while (opcao.equalsIgnoreCase("s")) {
+ System.out.print("Número da mesa: ");
+ String numero = scanner.nextLine();
+ System.out.print("Local da mesa: ");
+ String local = scanner.nextLine();
+
+ mesas.add(new Mesa(numero, local));
+
+ System.out.print("Deseja adicionar outra mesa? (s/n): ");
+ opcao = scanner.nextLine();
+ }
+
+ return new Funcionario(nome, cpf, null, ctp, cargo, mesas);
+ }
+
+ /**
+ * Captura o CPF do funcionário via entrada padrão.
+ *
+ * @return CPF capturado como String
+ */
+ public String capturarCpf() {
+ System.out.print("Digite o CPF do funcionário: ");
+ return scanner.nextLine();
+ }
+
+ /**
+ * Exibe as informações de um funcionário formatadas no console,
+ * incluindo nome, CPF, CTP, cargo e mesas associadas.
+ *
+ * @param f funcionário cujos dados serão exibidos
+ */
+ public void mostrar(Funcionario f) {
+ System.out.println("Nome: " + f.getNome());
+ System.out.println("CPF: " + f.getCpf());
+ System.out.println("CTP: " + f.getCtp());
+ System.out.println("Cargo: " + f.getCargo());
+ if (f.getMesas() != null && !f.getMesas().isEmpty()) {
+ System.out.println("Mesas:");
+ for (Mesa m : f.getMesas()) {
+ System.out.println(" - Mesa " + m.getNumero() + " - Local: " + m.getLocal());
+ }
+ }
+ System.out.println("--------------------------");
+ }
+
+ /**
+ * Exibe uma mensagem genérica no console.
+ *
+ * @param msg mensagem a ser exibida
+ */
+ public void mostrarMensagem(String msg) {
+ System.out.println(msg);
+ }
+
+ /**
+ * Retorna o objeto Scanner usado para captura de entrada.
+ *
+ * @return Scanner associado à entrada padrão
+ */
+ public Scanner getScanner() {
+ return scanner;
+ }
+}
diff --git a/avaliacoes/restaurante/src/main/java/com/restaurante/view/MesaView.java b/avaliacoes/restaurante/src/main/java/com/restaurante/view/MesaView.java
new file mode 100644
index 0000000..7808df1
--- /dev/null
+++ b/avaliacoes/restaurante/src/main/java/com/restaurante/view/MesaView.java
@@ -0,0 +1,56 @@
+package com.restaurante.view;
+
+import java.util.Scanner;
+import com.restaurante.model.Mesa;
+import java.util.List;
+
+/**
+ * Classe responsável pela interação com o usuário para operações
+ * relacionadas a mesas, incluindo captura e exibição de dados.
+ * Utiliza a entrada padrão (Scanner) para capturar dados do usuário.
+ *
+ * Fornece métodos para pedir o número e o local da mesa,
+ * além de exibir uma lista de mesas cadastradas.
+ *
+ */
+public class MesaView {
+
+ /** Scanner para entrada de dados via teclado. */
+ private Scanner scanner = new Scanner(System.in);
+
+ /**
+ * Solicita ao usuário o número da mesa.
+ *
+ * @return número da mesa informado pelo usuário
+ */
+ public String pedirNumeroMesa() {
+ System.out.print("Número da mesa: ");
+ return scanner.nextLine();
+ }
+
+ /**
+ * Solicita ao usuário o local da mesa.
+ *
+ * @return local da mesa informado pelo usuário
+ */
+ public String pedirLocalMesa() {
+ System.out.print("Local da mesa: ");
+ return scanner.nextLine();
+ }
+
+ /**
+ * Exibe a lista de mesas no console.
+ * Caso a lista esteja vazia, exibe uma mensagem informando que não há mesas cadastradas.
+ *
+ * @param mesas lista de mesas a ser exibida
+ */
+ public void exibirMesas(List mesas) {
+ if (mesas.isEmpty()) {
+ System.out.println("Nenhuma mesa cadastrada.");
+ } else {
+ for (Mesa m : mesas) {
+ System.out.println("Mesa " + m.getNumero() + " - Local: " + m.getLocal());
+ }
+ }
+ }
+}
diff --git a/avaliacoes/restaurante/src/main/java/com/restaurante/view/ProdutoView.java b/avaliacoes/restaurante/src/main/java/com/restaurante/view/ProdutoView.java
new file mode 100644
index 0000000..aebe24a
--- /dev/null
+++ b/avaliacoes/restaurante/src/main/java/com/restaurante/view/ProdutoView.java
@@ -0,0 +1,74 @@
+package com.restaurante.view;
+
+import java.util.Scanner;
+import java.util.List;
+import com.restaurante.model.Produto;
+
+/**
+ * Classe responsável pela interface de entrada e saída de dados relacionada aos produtos.
+ * Utiliza Scanner para capturar dados do usuário e exibe informações dos produtos no console.
+ *
+ * Permite capturar o nome e o valor do produto com validação para entrada numérica,
+ * além de exibir uma lista de produtos formatada.
+ *
+ */
+public class ProdutoView {
+ /** Scanner para entrada de dados do usuário */
+ private Scanner scanner;
+
+ /**
+ * Construtor que inicializa o Scanner para leitura da entrada padrão.
+ */
+ public ProdutoView() {
+ scanner = new Scanner(System.in);
+ }
+
+ /**
+ * Solicita ao usuário o nome do produto.
+ *
+ * @return nome do produto informado pelo usuário
+ */
+ public String pedirNomeProduto() {
+ System.out.print("Nome do produto: ");
+ return scanner.nextLine();
+ }
+
+ /**
+ * Solicita ao usuário o valor do produto e valida a entrada.
+ * Repete a solicitação enquanto o valor informado não for válido (float).
+ *
+ * @return valor do produto informado pelo usuário
+ */
+ public float pedirValorProduto() {
+ float valor = 0;
+ boolean valido = false;
+
+ while (!valido) {
+ try {
+ System.out.print("Valor do produto: ");
+ valor = Float.parseFloat(scanner.nextLine());
+ valido = true;
+ } catch (NumberFormatException e) {
+ System.out.println("Valor inválido. Tente novamente.");
+ }
+ }
+
+ return valor;
+ }
+
+ /**
+ * Exibe a lista de produtos no console.
+ * Caso a lista esteja vazia, exibe uma mensagem informando que nenhum produto foi encontrado.
+ *
+ * @param produtos lista de produtos a ser exibida
+ */
+ public void exibirProdutos(List produtos) {
+ if (produtos.isEmpty()) {
+ System.out.println("Nenhum produto encontrado.");
+ } else {
+ for (Produto p : produtos) {
+ System.out.printf("Produto: %-20s | Valor: R$ %.2f%n | \n ", p.getNome(), p.getValorProd());
+ }
+ }
+ }
+}