Sistema web monolítico para gerenciamento de produção e distribuição de sorvetes de uma fábrica central para as lojas da rede.
A interface principal é server-side (Spring MVC + Thymeleaf), com autenticação JWT (cookie HTTP-only e POST /auth/login em JSON). O restante dos fluxos ocorre em páginas HTML autenticadas.
Uma rede de sorveterias possui uma fábrica central responsável pela produção dos sabores. Após a produção, os lotes precisam ser distribuídos entre as lojas da rede. O sistema permite registrar lotes de produção, distribuir quantidades para lojas cadastradas e manter rastreabilidade de todas as movimentações.
O sistema cobre o ciclo de produção → distribuição → controle de estoque das lojas por baixa manual.
O sistema não gerencia vendas, clientes, preços ou pagamentos. O controle de estoque das lojas é feito por baixa manual: o operador registra as quantidades consumidas pela loja, e o sistema calcula o saldo atual com base no total recebido via distribuição menos as baixas informadas.
Atualmente a rede não possui controle estruturado para:
- Registrar as quantidades produzidas por lote e sabor
- Controlar a quantidade disponível em cada lote após distribuições parciais
- Registrar e auditar as distribuições realizadas
- Garantir que não sejam distribuídas quantidades superiores às disponíveis
- Acompanhar o estoque atual de cada loja
- Diferenciar permissões entre administradores e operadores de produção
Legenda de status na implementação atual:
| Status | Significado |
|---|---|
| ✅ | Atendido no código |
| Atendido em parte | |
| ❌ | Ainda não implementado |
| ID | Descrição | Status |
|---|---|---|
| RF-01 | Cadastrar sabores com nome, descrição e status ativo/inativo | ✅ |
| RF-02 | Listar, editar e inativar sabores cadastrados | ✅ |
| ID | Descrição | Status |
|---|---|---|
| RF-03 | Registrar lote de produção informando sabor, quantidade e data | ✅ |
| RF-04 | Exibir quantidade disponível de cada lote em tempo real | ✅ |
| RF-05 | Listar lotes com filtros por sabor, status e período |
| ID | Descrição | Status |
|---|---|---|
| RF-06 | Cadastrar lojas com nome, endereço e status ativo | ✅ Endereço estruturado (CEP, UF, cidade, logradouro, número, complemento) |
| RF-07 | Listar e editar lojas cadastradas | ✅ Inativação incluída |
| ID | Descrição | Status |
|---|---|---|
| RF-08 | Registrar distribuição associando lote, loja e quantidade | ✅ Apenas perfil ADMIN |
| RF-09 | Impedir distribuição quando a quantidade exceder o saldo do lote | ✅ |
| RF-10 | Listar histórico de distribuições com filtros por loja, lote e período | |
| RF-11 | Cancelar distribuição e estornar saldo ao lote de origem | ✅ |
| ID | Descrição | Status |
|---|---|---|
| RF-15 | Registrar baixa manual de estoque informando loja, lote e quantidade consumida | ✅ |
| RF-16 | Exibir saldo atual da loja por sabor (total recebido − total de baixas) | ✅ Tela Estoque atual (/estoque) e fluxo de baixa |
| RF-17 | Listar histórico de baixas por loja e período |
| ID | Descrição | Status |
|---|---|---|
| RF-12 | Autenticar usuários com e-mail e senha, retornando token JWT | ✅ |
| RF-13 | Perfil ADMIN: acesso total ao sistema | ✅ |
| RF-14 | Perfil OPERADOR: registro de lotes, baixas e consultas | ✅ Sem lojas, distribuições nem CRUD de sabores |
| ID | Descrição | Categoria | Status |
|---|---|---|---|
| RNF-03 | Senhas armazenadas com hash BCrypt (fator mínimo 10) | Segurança | ✅ |
| RNF-04 | Tokens JWT com expiração configurável (padrão 8h) | Segurança | ✅ jwt.expiration-ms |
| RNF-05 | Endpoints protegidos por autorização baseada em roles (RBAC) | Segurança | ✅ |
| RNF-06 | Operações de distribuição e baixa atômicas (transação única no banco) | Confiabilidade | ✅ @Transactional nos services |
| RNF-07 | Erros de validação com mensagens descritivas no corpo da resposta | Usabilidade | /auth/login; telas MVC usam mensagens na página |
| RNF-08 | Código organizado em camadas: Controller → Service → Repository | Manutenibilidade | ✅ |
| RNF-09 | Migrações de banco gerenciadas por Flyway | Manutenibilidade | ✅ |
| Módulo | Rota | Observação |
|---|---|---|
| Estoque atual | /, /estoque |
Página inicial — CD + lojas |
| Sabores | /sabores |
CRUD/inativar: ADMIN |
| Lotes | /lotes |
Criar e listar |
| Lojas | /lojas |
ADMIN |
| Distribuições | /distribuicoes |
ADMIN |
| Baixas | /baixas |
Filtro opcional por loja |
| Operadores | /usuarios |
ADMIN |
| Login | /login, /auth/login |
JWT em cookie |
Usuário seed (dev): admin@aisecream.com / admin123
Versão LTS. Runtime e linguagem do projeto.
Framework principal: servidor Tomcat embutido, Spring Data JPA, Spring Security, Bean Validation e Thymeleaf para a interface web.
Banco relacional (aisecream), transações ACID, compatível com o ecossistema MySQL/MariaDB.
Persistência via JpaRepository, @Transactional nas operações de escrita (distribuição, baixa, etc.).
Autenticação com JWT (jjwt), filtro JwtAuthFilter, roles ADMIN e OPERADOR, senhas com BCrypt.
Versionamento do schema em src/main/resources/db/migration (V1 a V4).
Build e execução sem instalar Maven globalmente: .\mvnw.cmd (Windows) ou ./mvnw (Linux/macOS).
Validação em entidades, DTOs e formulários com @Valid.
Monolito em camadas:
Browser (Thymeleaf + login AJAX)
↓
Controller (@Controller / @RestController)
↓
Service (regras de negócio + @Transactional)
↓
Repository (Spring Data JPA)
↓
MariaDB (Flyway)
A segurança intercepta requisições via JwtAuthFilter e regras em SecurityConfig.
Diagramas C4 em src/architecture/ (c4-nivel2-containers.puml, c4-nivel3-components.puml).
| Versão | Conteúdo |
|---|---|
| V1 | Tabelas base do domínio |
| V2 | Usuário administrador inicial |
| V3 | Campos históricos em distribuicao |
| V4 | Endereço estruturado em loja |
spring.jpa.hibernate.ddl-auto=validate — alterações de schema apenas via Flyway.
- Java 21
- MariaDB em execução (ex.:
localhost:3306) - IntelliJ IDEA ou outra IDE (opcional)
-
Clone o repositório
-
Configure o banco em
src/main/resources/application.properties:spring.datasource.url=jdbc:mariadb://localhost:3306/aisecream spring.datasource.username=root spring.datasource.password=
-
Baixe dependências (se necessário):
.\mvnw.cmd dependency:resolve -U -
Execute a aplicação:
.\mvnw.cmd spring-boot:run -
Acesse http://localhost:8080 (redireciona para o estoque atual após login).
Se uma migração falhar no histórico:
.\mvnw.cmd flyway:repairSe Port 8080 was already in use, encerre o processo anterior ou use server.port=8081 em application.properties.
src/main/java/com/aisecream/
├── config/ # SecurityConfig
├── controller/ # MVC + AuthController
├── dto/
├── exception/ # ApiExceptionHandler (REST)
├── model/
├── repository/
├── security/
└── service/
src/main/resources/
├── application.properties
├── db/migration/
└── templates/
Testes automatizados: AisecreanApplicationTests (carga de contexto).