Sistema de gerenciamento de reservas de viagens desenvolvido em Java Swing. O software permite o cadastro de clientes, gestão de pacotes turísticos (nacionais e internacionais), controle de reservas e emissão de relatórios financeiros.
Este projeto foi desenvolvido como trabalho prático da disciplina de Engenharia de Software / Programação Orientada a Objetos.
- Controle de Acesso (RBAC):
- Gerente: Acesso total (CRUD de pacotes, usuários, relatórios financeiros e exclusão de reservas).
- Atendente: Acesso operacional (Venda de reservas, cadastro de clientes).
- Gestão de Pacotes:
- Diferenciação entre Nacionais (Taxa Turismo) e Internacionais (Cotação Dólar/Euro).
- Cálculo automático de preços.
- Fluxo de Reservas:
- Busca de clientes por CPF.
- Simulação de valores em tempo real.
- Pagamento via PIX (À vista) ou Cartão (+2.5%).
- Geração de Recibo em HTML.
- Regras de Negócio:
- Bloqueio de duplicidade (cliente não pode reservar o mesmo pacote duas vezes se já estiver ativo).
- Integridade referencial (não permite excluir pacotes/clientes com histórico de reservas).
- Cancelamento restrito (apenas Gerentes cancelam reservas já confirmadas).
- Linguagem: Java (JDK 17+)
- Interface Gráfica: Java Swing (Puro)
- Estilização: Custom Look & Feel (
AppTheme) para design flat moderno. - Persistência: Arquivos de Texto (.csv)
- IDE: IntelliJ IDEA
Certifique-se de ter o Java Development Kit (JDK) 17 ou superior instalado.
- Clone o repositório:
git clone [https://github.com/Skrewed/agencia.git]
- Abra o projeto na sua IDE (Recomendamos o IntelliJ IDEA).
- Localize a classe principal:
- Caminho:
src/agencia/Main.java
- Caminho:
- Execute a classe
Main.
Ao executar pela primeira vez, o sistema criará automaticamente um usuário administrador:
- Login:
admin - Senha:
admin
Após logar, você pode ir na aba "Gestão de Usuários" (exclusiva do gerente) e cadastrar novos atendentes.
O projeto foi estruturado seguindo o padrão MVC (Model-View-Controller) adaptado para Camadas (Layers), visando desacoplamento e facilidade de manutenção.
agencia.modelo: Classes POJO que representam as entidades (Cliente, Reserva, Pacote).agencia.repositorios(DAO): Camada responsável exclusivamente pela persistência em arquivo CSV. Nenhum código de tela acessa o arquivo diretamente.agencia.ui: Camada de apresentação (Telas Swing).agencia.servicos: Lógica de negócios complexa (ex: Simulador de Preços).agencia.pagamento(Strategy): Implementação do padrão Strategy para cálculo de taxas de pagamento.agencia.exception: Exceções personalizadas para controle de fluxo e validação.
Optou-se pelo uso de arquivos .csv (Comma Separated Values) ao invés de um banco de dados relacional para:
- Simplificar a execução em qualquer máquina sem necessidade de instalar SGBDs.
- Facilitar a depuração (arquivos legíveis por humanos).
- Demonstrar a manipulação de I/O em Java (
BufferedReader,PrintWriter). - Estratégia de Cache: Os DAOs carregam os dados para a memória (Listas) na inicialização e reescrevem o arquivo nas operações de escrita, garantindo performance.
Para evitar o visual datado do Swing padrão ("Metal"), implementamos uma classe utilitária AppTheme.
- Uso de
CardLayoutpara navegação fluida (Single Window Application). - Componentes customizados (
RoundedPanel, botões sem borda) para uma experiência de usuário (UX) moderna.
- DAO (Data Access Object): Para abstrair a complexidade de leitura/escrita dos arquivos CSV.
- Strategy: Na interface
Pagavel, permitindo quePagamentoPixePagamentoCartaotenham lógicas de cálculo diferentes sem encher o código deif/else. - Factory Method (Simplificado): Na leitura dos arquivos, para instanciar
PacoteNacionalouPacoteInternacionaldependendo da flag no CSV. - Singleton (Implícito): O
MainFrameatua como controlador central da sessão do usuário.
- Exceções Personalizadas: Uso de
ValidacaoExceptionpara diferenciar erros de regra de negócio (ex: tentar excluir cliente com reserva) de erros técnicos. - Integridade Referencial: O sistema verifica dependências antes de excluir registros para evitar corromper os arquivos CSV.
- Senhas: As senhas são armazenadas no arquivo de usuários (em um cenário real, aplicaríamos Hashing/BCrypt aqui).
- Skrewed: André Andrade
- gfraga126-gif: Gabriel Henrique
- VashCuBIT: Vitor Hugo