📚 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.

🅿️ PI 01 — ParkManager: Sistema de Gestão de Estacionamento

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

🎓 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.

—`

🎯 Objetivo & Escopo do Projeto

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.

—`

🧑‍💼 Fase 1 — Levantamento de Requisitos

O Briefing do Cliente (Proprietário de Rede de Estacionamentos)

“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.”

Requisitos Funcionais (RF) e Não-Funcionais (RNF)

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

—`

📋 Fase 2 — Backlog & User Stories

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

Quadro Kanban da Sprint

User Story To Do Doing Done
US01 — Registro de Entrada    
US02 — Tarifação & Saída    
US03 — Fechamento de Caixa    

—`

🌿 Fase 3 — Engenharia em Equipe (Git Flow & Setup)

# Branch da funcionalidade
git checkout -b feature/US01-parkmanager-entrada-saida

# Subir banco de dados local via Docker Compose
docker-compose up -d

—`

🛠️ Fase 4 — Implementação Guiada da Regra de Tarifação

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)));
    }
}

—`

🚀 Como Executar no Laboratório

1. Abra o terminal na pasta deste projeto

No seu editor/IDE, abra a pasta deste projeto (File > Open Folder) ou navegue via terminal:

cd fullstack_pi_01_parkmanager

2. Execute a aplicação e os testes

./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`

🧭 Decisões de Arquitetura (ADRs)

—`

🧪 Testes de Validação & Asserções

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"));

—`

✅ Checkpoint Final

  1. Ciclo completo de Entrada $\to$ Cálculo de Tarifação $\to$ Saída $\to$ Baixa de Caixa validado.
  2. Tolerância de carência de 15 minutos testada.

⬅️ Ver Todos os Projetos no Super-Hub 🏠 Página Inicial do Portal