O BEM WMS é um sistema de controle de estoque desenvolvido para gerenciar materiais escolares, seus lotes, entradas, saídas e indicadores financeiros.
O projeto foi desenvolvido com ASP.NET Core Minimal API no back-end e HTML, CSS e JavaScript no front-end. A aplicação permite cadastrar materiais, controlar lotes, registrar saídas de estoque, editar dados cadastrados, remover materiais e visualizar informações consolidadas em um dashboard.
A interface foi construída em modo dark, com design minimalista, organizada para facilitar o uso das principais funcionalidades do sistema.
- Bruno Batista Xavier
- Emily Kristin Garcia
- Maria Eduarda Martins de Souza
O objetivo do BEM WMS é simular um sistema de gerenciamento de estoque para materiais escolares, permitindo o controle de entrada e saída de itens de forma organizada.
O sistema busca atender às seguintes necessidades:
- Cadastrar materiais escolares;
- Controlar materiais por lote;
- Registrar entrada de estoque;
- Registrar saída de estoque;
- Consultar materiais ativos e inativos;
- Editar materiais cadastrados;
- Remover materiais do sistema;
- Visualizar dados financeiros;
- Calcular lucro estimado;
- Calcular ROI;
- Consultar uma tabela geral de itens, códigos e lotes;
- Apresentar uma interface web simples e funcional.
- C#
- ASP.NET Core
- Minimal API
- Swagger
- .NET 10.0
- CORS
- HTML
- CSS
- JavaScript
- Live Server
ApiProdutos
├── Data
│ └── BancoSimulado.cs
│
├── Models
│ ├── MaterialEscolar.cs
│ ├── Lote.cs
│ └── SaidaEstoque.cs
│
├── Routes
│ ├── ROTA_GET.cs
│ ├── ROTA_GET_ATIVOS.cs
│ ├── ROTA_GET_INATIVOS.cs
│ ├── ROTA_POST.cs
│ ├── ROTA_PUT.cs
│ ├── ROTA_DELETE.cs
│ ├── ROTA_SAIDA.cs
│ └── ROTA_DASHBOARD.cs
│
├── frontend
│ ├── index.html
│ ├── style.css
│ └── script.js
│
├── Properties
│ └── launchSettings.json
│
├── Program.cs
├── appsettings.json
├── appsettings.Development.json
└── ApiProdutos.csproj
A entidade MaterialEscolar representa o item principal controlado pelo sistema.
| Atributo | Tipo | Descrição |
|---|---|---|
| Id | int | Identificador único do material |
| Nome | string | Nome do material escolar |
| Categoria | string | Categoria do material |
| Ativo | bool | Define se o material está ativo ou inativo |
| Lotes | List | Lista de lotes vinculados ao material |
Exemplos de materiais:
- Caderno Universitário
- Caneta Azul
- Cola Branca
- Lápis Grafite
- Borracha
- Régua
- Tesoura Escolar
- Estojo Escolar
- Tinta Guache
- Massa de Modelar
A entidade Lote representa os lotes vinculados aos materiais escolares.
| Atributo | Tipo | Descrição |
|---|---|---|
| Id | int | Identificador único do lote |
| Codigo | string | Código do lote |
| Quantidade | int | Quantidade disponível no lote |
| DataEntrada | DateTime | Data de entrada do lote no estoque |
| DataVencimento | DateTime? | Data de vencimento do lote, quando existir |
| ValorCusto | decimal | Valor de custo unitário do item |
| ValorVenda | decimal | Valor de venda unitário do item |
A data de vencimento é opcional, pois alguns materiais possuem validade, como cola, tinta e massa de modelar, enquanto outros não possuem, como caderno, lápis e régua.
A entidade SaidaEstoque representa a requisição usada para retirar materiais do estoque.
| Atributo | Tipo | Descrição |
|---|---|---|
| MaterialId | int | ID do material que terá saída |
| Quantidade | int | Quantidade que será retirada do estoque |
O sistema permite cadastrar novos materiais escolares informando:
- ID do material;
- Nome do material;
- Categoria;
- Status ativo ou inativo;
- ID do lote;
- Código do lote;
- Quantidade em estoque;
- Valor de custo unitário;
- Valor de venda unitário;
- Data de entrada;
- Data de vencimento, quando existir.
Essa funcionalidade utiliza a rota:
POST /api/materiais
O sistema permite listar todos os materiais cadastrados, exibindo:
- Nome;
- ID;
- Categoria;
- Status;
- Estoque total;
- Valor investido;
- Venda estimada;
- Lucro estimado;
- ROI;
- Lotes vinculados;
- Quantidade por lote;
- Custo unitário;
- Venda unitária.
Essa funcionalidade utiliza a rota:
GET /api/materiais
O sistema permite visualizar apenas os materiais ativos.
Essa funcionalidade utiliza a rota:
GET /api/materiais/ativos
O sistema permite visualizar apenas os materiais inativos.
Essa funcionalidade utiliza a rota:
GET /api/materiais/inativos
O sistema permite consultar um material específico pelo seu ID.
Essa funcionalidade utiliza a rota:
GET /api/materiais/{id}
O sistema permite consultar todos os lotes vinculados a um material específico.
Essa funcionalidade utiliza a rota:
GET /api/materiais/{id}/lotes
O sistema permite editar um material já cadastrado.
Ao clicar em Editar material, os dados do item são carregados no formulário. Depois da alteração, o sistema utiliza a rota PUT para atualizar as informações.
Essa funcionalidade permite editar:
- Nome;
- Categoria;
- Status;
- Dados do lote;
- Quantidade;
- Data de entrada;
- Data de vencimento;
- Valor de custo;
- Valor de venda.
Rota utilizada:
PUT /api/materiais/{id}
O sistema permite remover materiais cadastrados.
Essa funcionalidade utiliza a rota:
DELETE /api/materiais/{id}
O sistema permite registrar a saída de materiais do estoque.
Na tela, o usuário seleciona o material desejado e informa a quantidade que será retirada.
Essa funcionalidade utiliza a rota:
POST /api/materiais/saida
Exemplo de requisição:
{
"materialId": 1,
"quantidade": 10
}A saída de estoque considera os lotes disponíveis do material.
Quando o material possui data de vencimento, o sistema prioriza os lotes que vencem primeiro.
Essa regra é conhecida como:
FEFO - First Expire, First Out
Ou seja:
Primeiro que vence, primeiro que sai.
Para materiais sem data de vencimento, o sistema utiliza a data de entrada como critério de ordenação.
O BEM WMS possui um dashboard financeiro que apresenta os principais indicadores do estoque.
O dashboard exibe:
- Total de materiais;
- Total de itens ativos;
- Total de itens inativos;
- Total de unidades em estoque;
- Valor investido;
- Venda estimada;
- Lucro estimado;
- ROI percentual.
Essa funcionalidade utiliza a rota:
GET /api/dashboard
Além dos cards principais, o sistema apresenta uma tabela financeira por material.
A tabela exibe:
- Material;
- Categoria;
- Estoque;
- Valor investido;
- Venda estimada;
- Lucro;
- ROI.
Essa visualização permite analisar quais materiais possuem maior retorno financeiro estimado.
O sistema também possui uma tabela de consulta rápida com todos os itens, seus códigos e lotes.
A tabela apresenta:
- ID do material;
- Nome do material;
- Categoria;
- Status;
- ID do lote;
- Código do lote;
- Quantidade;
- Data de entrada;
- Data de vencimento;
- Custo unitário;
- Venda unitária.
Essa funcionalidade facilita a conferência dos dados cadastrados e a visualização dos lotes vinculados a cada item.
A interface possui filtros para melhorar a navegação:
- Todos;
- Ativos;
- Inativos;
- Dashboard;
- Cadastro;
- Tabela de Itens;
- Materiais.
Esses botões permitem navegar rapidamente entre as seções da tela e filtrar os dados exibidos.
| Método | Rota | Descrição |
|---|---|---|
| GET | / |
Verifica se a API está funcionando |
| GET | /api/materiais |
Lista todos os materiais cadastrados |
| GET | /api/materiais/{id} |
Busca um material pelo ID |
| GET | /api/materiais/{id}/lotes |
Lista os lotes de um material |
| GET | /api/materiais/ativos |
Lista materiais ativos |
| GET | /api/materiais/inativos |
Lista materiais inativos |
| POST | /api/materiais |
Cadastra um novo material |
| PUT | /api/materiais/{id} |
Atualiza um material cadastrado |
| DELETE | /api/materiais/{id} |
Remove um material pelo ID |
| POST | /api/materiais/saida |
Registra saída de estoque |
| GET | /api/dashboard |
Retorna indicadores financeiros e operacionais |
No terminal, acesse a pasta onde está o arquivo .csproj:
cd C:\Users\emily.garcia\WMS_API\WAREHOUSESYSTEM_BACKEND\ApiProdutosdotnet restoredotnet runAo executar, será exibida uma mensagem parecida com:
Now listening on: http://localhost:5181
Essa será a URL base da API.
Com a API rodando, abra no navegador:
http://localhost:5181/swagger
O Swagger permite testar todas as rotas da API diretamente pelo navegador.
O front-end está localizado na pasta:
frontend
Arquivos principais:
frontend
├── index.html
├── style.css
└── script.js
No arquivo script.js, verifique se a constante API_URL está apontando para a URL correta da API.
Exemplo:
const API_URL = "http://localhost:5181";Caso a API rode em outra porta, altere essa linha.
No VS Code:
- Clique com o botão direito no arquivo
index.html; - Clique em Open with Live Server;
- O navegador abrirá uma URL parecida com:
http://127.0.0.1:5500/frontend/index.html
A API precisa permanecer rodando no terminal com:
dotnet runPrimeiro execute o back-end com:
dotnet runDepois abra o front-end com Live Server.
Ao abrir o sistema, a área superior exibe os cards do dashboard.
Os cards mostram:
- Quantidade total de materiais;
- Quantidade de ativos;
- Quantidade de inativos;
- Total de unidades em estoque;
- Valor investido;
- Venda estimada;
- Lucro estimado;
- ROI.
Na seção Cadastrar material escolar, preencha os campos do material e do lote.
Depois clique em:
Cadastrar material
O material será enviado para a API por meio da rota:
POST /api/materiais
Na seção Materiais cadastrados, clique em:
Editar material
O sistema carrega os dados no formulário de cadastro.
Depois de alterar as informações, clique em:
Salvar alterações
O sistema enviará os dados atualizados para a API por meio da rota:
PUT /api/materiais/{id}
Caso o usuário clique em editar e não queira salvar as alterações, basta clicar em:
Cancelar edição
O formulário será limpo e voltará ao modo de cadastro.
Na seção Registrar saída de estoque:
- Selecione o material;
- Informe a quantidade de saída;
- Clique em Registrar saída.
O sistema atualiza a quantidade disponível em estoque e recalcula os indicadores financeiros.
Na seção Materiais cadastrados, clique em:
Remover material
Após confirmar, o sistema remove o material usando a rota:
DELETE /api/materiais/{id}
{
"id": 13,
"nome": "Mochila Escolar",
"categoria": "Mochila",
"ativo": true,
"lotes": [
{
"id": 13,
"codigo": "MOC001",
"quantidade": 20,
"dataEntrada": "2026-04-10T00:00:00",
"dataVencimento": null,
"valorCusto": 45.90,
"valorVenda": 89.90
}
]
}{
"id": 13,
"nome": "Mochila Escolar Reforçada",
"categoria": "Mochila",
"ativo": true,
"lotes": [
{
"id": 13,
"codigo": "MOC001",
"quantidade": 20,
"dataEntrada": "2026-04-10T00:00:00",
"dataVencimento": null,
"valorCusto": 45.90,
"valorVenda": 99.90
}
]
}Rota:
PUT /api/materiais/13
{
"materialId": 13,
"quantidade": 5
}Rota:
POST /api/materiais/saida
O valor investido é calculado com base na quantidade em estoque e no valor de custo unitário.
Valor Investido = Quantidade em Estoque × Valor de Custo Unitário
A venda estimada é calculada com base na quantidade em estoque e no valor de venda unitário.
Venda Estimada = Quantidade em Estoque × Valor de Venda Unitário
O lucro estimado representa a diferença entre a venda estimada e o valor investido.
Lucro Estimado = Venda Estimada - Valor Investido
O ROI representa o retorno sobre o investimento em percentual.
ROI (%) = (Lucro Estimado / Valor Investido) × 100
Arquivo principal da aplicação.
Responsável por:
- Criar a aplicação;
- Configurar Swagger;
- Configurar CORS;
- Registrar as rotas da API;
- Iniciar a execução do sistema.
Rotas registradas:
app.MapGetRoutes();
app.MapGetAtivosRoutes();
app.MapGetInativosRoutes();
app.MapPostRoutes();
app.MapPutRoutes();
app.MapDeleteRoutes();
app.MapSaidaRoutes();
app.MapDashboardRoutes();Arquivo responsável por armazenar os dados simulados em memória.
Como o projeto não utiliza banco de dados, os dados cadastrados ficam armazenados temporariamente em uma lista.
Define a estrutura da entidade MaterialEscolar.
Define a estrutura da entidade Lote.
Define a estrutura da requisição de saída de estoque.
Contém as rotas de consulta geral:
- Rota raiz;
- Listagem de materiais;
- Consulta por ID;
- Consulta de lotes por material.
Contém a rota responsável por listar somente os materiais ativos.
Contém a rota responsável por listar somente os materiais inativos.
Contém a rota responsável pelo cadastro de novos materiais.
Contém a rota responsável pela edição de materiais cadastrados.
Contém a rota responsável pela remoção de materiais.
Contém a rota responsável pela saída de estoque por lote.
Contém a rota responsável por retornar os indicadores do dashboard.
Este projeto utiliza dados simulados em memória.
Isso significa que os materiais cadastrados, editados ou removidos durante a execução serão perdidos quando a API for encerrada ou reiniciada.
Em uma versão futura, o sistema poderá ser integrado a um banco de dados, como:
- SQL Server;
- PostgreSQL;
- MySQL;
- SQLite.
- Integração com banco de dados;
- Histórico de movimentações;
- Registro detalhado de entradas e saídas;
- Cadastro de múltiplos lotes por material;
- Tela específica para editar lotes;
- Controle de usuários;
- Login e autenticação;
- Alertas para estoque baixo;
- Alertas para vencimento próximo;
- Relatórios exportáveis;
- Dashboard com gráficos;
- Integração com Power BI;
- Melhorias de acessibilidade;
- Controle de permissões por usuário.
O BEM WMS foi desenvolvido utilizando ASP.NET Core Minimal API, pois essa abordagem permite criar endpoints de forma simples, rápida e objetiva.
A separação das rotas em arquivos diferentes facilita a organização, a leitura e a manutenção do código. Cada arquivo possui uma responsabilidade específica dentro do projeto.
O uso de listas em memória permite demonstrar o funcionamento da API sem a necessidade de configurar um banco de dados, tornando o projeto mais simples para fins acadêmicos e de aprendizagem.
O Swagger foi utilizado para documentar e testar os endpoints da API diretamente pelo navegador.
O front-end foi desenvolvido com HTML, CSS e JavaScript puro, consumindo os endpoints da API por meio de requisições fetch.
A inclusão do dashboard financeiro permite analisar o estoque não apenas pela quantidade de materiais, mas também pelo valor investido, venda estimada, lucro estimado e ROI.
A saída de estoque por lote aproxima o sistema de um cenário real de WMS, pois considera a organização dos materiais por lote e a priorização de itens com vencimento mais próximo.