📚 Pré-requisitos Teóricos: este projeto aplica conceitos ensinados em Matriz de 20 Capítulos de Aplicações Full Stack (este módulo). Recomendado revisar antes de começar.
v1.0 — Projeto Integrador Full Stack, Tarifação por Hora, Vagas em Tempo Real e Checkout
Trilha de Especialização Pedagógica — Projeto Integrador 1 de 4
- ➡️ v1 (este): PI 01: ParkManager (Controle de Vagas, Tarifação, Entrada/Saída e Caixa)
- v2: PI 02: HealthClinic (Gestão de Prontuários e Agendamentos Médicos)
- v3: PI 03: EduTrack (Plataforma Acadêmica com Notas e Presenças)
- v4: PI 04: LogisFleet (Rastreamento de Frotas e Roteirização de Cargas)
🎓 Nível Profissional Simulado: Engenheiro Full Stack / Líder Técnico de PI. O Projeto Integrador (PI) é o divisor de águas da sua formação: aqui você aplica Engenharia de Requisitos, Modelagem UML, Banco de Dados, Backend e Frontend em um software completo e pronto para ser comercializado.
—`
Construir o sistema ParkManager, uma solução full stack completa para controle operacional de estacionamentos rotativos e mensalistas, com registro de entrada com placa e modelo, cálculo automático de permanência e tarifação progressiva na saída, liberação de vagas em tempo real e fechamento de caixa diário.
—`
“Gerencio 3 estacionamentos no centro da cidade e hoje o controle é em papel. O manobrista perde tempo calculando quanto cobrar e há carros que saem sem pagar. Preciso de um sistema onde o operador digite a placa do veículo na entrada e imprima o ticket. Na saída, ao ler a placa, o sistema deve calcular automaticamente o valor devido (primeira hora R$ 15,00 + R$ 5,00 a cada fração de 30 min), registrar a forma de pagamento (Pix, Cartão, Dinheiro) e liberar a vaga no mapa visual.”
| ID | Tipo | Descrição | Origem no Briefing |
|---|---|---|---|
| RF01 | Funcional | Registrar entrada de veículo gerando ticket com placa, modelo, cor e data/hora. | “digite a placa do veículo na entrada” |
| RF02 | Funcional | Calcular permanência e valor total na saída conforme tabela de tarifação progressiva. | “calcular automaticamente o valor devido” |
| RF03 | Funcional | Mapa visual de ocupação de vagas (Disponível em verde, Ocupada em vermelho). | “liberar a vaga no mapa visual” |
| RF04 | Funcional | Fechamento de caixa com totalizador por forma de pagamento (Pix, Cartão, Dinheiro). | “registrar a forma de pagamento” |
| RNF01 | Não-Funcional | Persistência transacional ACID garantida via PostgreSQL. | Confiabilidade Financeira |
| RNF02 | Não-Funcional | Interface com tempo de resposta sub-segundo para não gerar filas na cancela. | Operação em Tempo Real |
—`
| ID | User Story | Prioridade |
|---|---|---|
| US01 | Como operador, quero dar entrada no veículo em menos de 5 segundos digitando apenas a placa. | Alta |
| US02 | Como cliente, quero receber o valor exato calculado pela permanência com tolerância de 15 min. | Alta |
| US03 | Como gerente, quero emitir o relatório de fechamento de caixa ao final do turno. | Média |
| User Story | To Do | Doing | Done |
|---|---|---|---|
| US01 — Registro de Entrada | ✅ | ||
| US02 — Tarifação & Saída | ✅ | ||
| US03 — Fechamento de Caixa | ✅ |
—`
# Branch da funcionalidade
git checkout -b feature/US01-parkmanager-entrada-saida
# Subir banco de dados local via Docker Compose
docker-compose up -d
—`
public class TarifadorParkManager {
private static final BigDecimal VALOR_PRIMEIRA_HORA = new BigDecimal("15.00");
private static final BigDecimal VALOR_FRACAO_30MIN = new BigDecimal("5.00");
public BigDecimal calcularValor(Duration permanencia) {
long minutos = permanencia.toMinutes();
if (minutos <= 15) return BigDecimal.ZERO; // Tolerancia de 15 minutos gratuita
if (minutos <= 60) return VALOR_PRIMEIRA_HORA;
long minutosExcedentes = minutos - 60;
long fracoes = (long) Math.ceil((double) minutosExcedentes / 30.0);
return VALOR_PRIMEIRA_HORA.add(VALOR_FRACAO_30MIN.multiply(BigDecimal.valueOf(fracoes)));
}
}
—`
No seu editor/IDE, abra a pasta deste projeto (File > Open Folder) ou navegue via terminal:
cd fullstack_pi_01_parkmanager
./mvnw spring-boot:run
# No frontend: npm install && npm run dev
[!TIP] Dica para execução a partir da raiz do repositório: Se você abriu o repositório completo no VS Code, basta navegar até a pasta antes de executar: cd proj_aplicacoes_full_stack/projetos/fullstack_pi_01_parkmanager`
—`
TarifadorParkManager tarifador = new TarifadorParkManager();
assertThat(tarifador.calcularValor(Duration.ofMinutes(12))).isEqualByComparingTo(BigDecimal.ZERO);
assertThat(tarifador.calcularValor(Duration.ofMinutes(45))).isEqualByComparingTo(new BigDecimal("15.00"));
assertThat(tarifador.calcularValor(Duration.ofMinutes(85))).isEqualByComparingTo(new BigDecimal("20.00"));
—`
- Ciclo completo de Entrada $\to$ Cálculo de Tarifação $\to$ Saída $\to$ Baixa de Caixa validado.
- Tolerância de carência de 15 minutos testada.
| ⬅️ Ver Todos os Projetos no Super-Hub | 🏠 Página Inicial do Portal |