Aqui está o diagrama de classes para as entidades principais do sistema:
classDiagram
direction LR
class Fornecedor {
+String nome
+String cnpj
+String telefone
+String endereco
+datetime criado_em
+datetime atualizado_em
}
class Remedio {
+String nome
+String descricao
+Float preco
+datetime validade
+ObjectId fornecedor_id
+datetime criado_em
+datetime atualizado_em
}
class Estoque {
+ObjectId remedio_id
+Int quantidade
+datetime data_entrada
+datetime validade
+datetime criado_em
+datetime atualizado_em
}
Fornecedor "1" --> "0..*" Remedio : fornece
Remedio "1" --> "0..*" Estoque : tem
Estoque "0..*" --> "1" Fornecedor : pertence_a
O diagrama mostra as seguintes relações:
- Um Fornecedor pode fornecer vários Remédios.
- Relacionamento 1 para muitos (um fornecedor pode ter 0 ou mais remédios).
- Um Remédio pode estar presente em vários registros de Estoque.
- Relacionamento 1 para muitos (um remédio pode ter 0 ou mais estoques).
- Embora a relação direta no diagrama entre Estoque e Fornecedor não seja explicitada no objeto Estoque (ele se relaciona ao Remédio, que por sua vez tem referência ao Fornecedor), o diagrama indica que um Estoque também está associado a um Fornecedor.
- Essa associação pode ser derivada indiretamente através do remédio, pois o remédio possui um fornecedor_id.
O exemplo de PUT atualiza um estoque e, ao mesmo tempo, permite atualizar os dados do remédio vinculado (embora, na prática, a atualização do remédio possa ser gerenciada por outra rota ou lógica de negócio, dependendo da arquitetura).
O uso de criado_em, atualizado_em e campos de validade em ambas as entidades (Remedio e Estoque) é essencial para rastrear a evolução dos registros e gerenciar prazos de validade, o que é especialmente importante em ambientes regulados como o de medicamentos.
As relações estabelecem uma estrutura que facilita consultas agregadas, como “todos os remédios de um fornecedor” ou “estoques disponíveis para um determinado remédio”, permitindo um gerenciamento integrado do sistema.
Esta aplicação foi construída utilizando o framework FastAPI e a biblioteca Odmantic para interação com o MongoDB. O objetivo é gerenciar um sistema de estoque de medicamentos, permitindo operações de CRUD (Create, Read, Update, Delete) em medicamentos, fornecedores e estoques, com suporte a relações entre as entidades.
- FastAPI: Framework para criação da API.
- Odmantic: ORM assíncrono para MongoDB.
- Motor: Motor assíncrono para conexão com MongoDB.
- MongoDB: Banco de dados NoSQL.
- Pydantic: Validação de dados.
- Uvicorn: Servidor ASGI.
- Python 3.7+
- MongoDB em execução local ou remota.
-
Clone o repositório:
git clone https://github.com/seu-repositorio/estoque-medicamentos.git cd estoque-medicamentos
-
Instale as dependências:
pip install -r requirements.txt
-
Inicie o servidor:
uvicorn main:app --reload
Acesse
http://127.0.0.1:8000
.
- Swagger UI:
http://127.0.0.1:8000/docs
- ReDoc:
http://127.0.0.1:8000/redoc
- Fornecedor: Representa fornecedores de medicamentos.
- Remédio: Armazena informações dos medicamentos.
- Estoque: Controla a quantidade de medicamentos disponíveis.
from odmantic import Model, Field
from datetime import datetime
class Fornecedor(Model):
nome: str
cnpj: str
telefone: str
endereco: str
criado_em: datetime = Field(default_factory=datetime.utcnow)
atualizado_em: datetime = Field(default_factory=datetime.utcnow)
{
"nome": "Fornecedor ABC",
"cnpj": "12.345.678/0001-99",
"telefone": "(11) 1234-5678",
"endereco": "Rua Exemplo, 123, São Paulo, SP",
"criado_em": "2025-02-21T15:00:00",
"atualizado_em": "2025-02-21T15:00:00"
}
{
"nome": "Fornecedor AAAAAAAAAAAA",
"cnpj": "12.345.678/0001-99",
"telefone": "(11) 1234-5678",
"endereco": "Rua Exemplo, 123, São Paulo, SP",
"criado_em": "2025-02-21T15:00:00",
"atualizado_em": "2025-02-22T21:49:12.371Z"
}
from odmantic import Model, Field
from datetime import datetime
from bson import ObjectId
class Remedio(Model):
nome: str
descricao: str
preco: float = Field(gt=0)
validade: datetime
fornecedor_id: ObjectId
criado_em: datetime = Field(default_factory=datetime.utcnow)
atualizado_em: datetime = Field(default_factory=datetime.utcnow)
{
"nome": "Mangaa 750mg",
"descricao": "Analgésico e antitérmico",
"preco": 12.5,
"validade": "2025-12-31T00:00:00Z",
"fornecedor_id": "67ba15648b5583d2b4a8b95e",
"criado_em": "2025-02-22T23:24:54.848Z",
"atualizado_em": "2025-02-22T23:24:54.848Z"
}
{
"nome": "Regis Pires Magalhães 750mg",
"descricao": "Analgésico e antitérmico",
"preco": 12.5,
"validade": "2025-12-31T00:00:00",
"fornecedor_id": "67ba15648b5583d2b4a8b95e",
"criado_em": "2025-02-22T23:24:54.848000",
"atualizado_em": "2025-02-22T23:24:54.848000"
}
from odmantic import Model, Field
from datetime import datetime
from bson import ObjectId
class Estoque(Model):
remedio_id: ObjectId
quantidade: int
data_entrada: datetime
validade: datetime
criado_em: datetime = Field(default_factory=datetime.utcnow)
atualizado_em: datetime = Field(default_factory=datetime.utcnow)
{
"remedio": {
"nome": "Paracetamol 750mg",
"descricao": "Analgésico e antitérmico",
"preco": 12.5,
"validade": "2025-12-31T00:00:00",
"fornecedor_id": "67ba15648b5583d2b4a8b95e",
"criado_em": "2025-02-21T15:00:00",
"atualizado_em": "2025-02-21T15:00:00",
"id": "67ba17e7e178545bca028c99"
},
"quantidade": 100,
"data_entrada": "2025-02-21T15:00:00",
"validade": "2025-12-31T00:00:00",
"criado_em": "2025-02-21T15:00:00",
"atualizado_em": "2025-02-21T15:00:00",
"id": "67ba17e7e178545bca028c99"
}
{
"remedio": {
"nome": "Paracetamol 500mg",
"descricao": "Analgésico e antitérmico, com nova dosagem",
"preco": 15.0,
"validade": "2025-12-31T00:00:00",
"fornecedor_id": "67ba15648b5583d2b4a8b95e",
"criado_em": "2025-02-21T15:00:00",
"atualizado_em": "2025-02-21T15:00:00"
},
"quantidade": 100,
"data_entrada": "2025-02-25T10:00:00",
"validade": "2025-12-31T00:00:00",
"criado_em": "2025-02-25T10:00:00",
"atualizado_em": "2025-02-25T10:00:00"
}
POST /fornecedores/
→ Cria um novo fornecedor.GET /fornecedores/{id}
→ Recupera informações de um fornecedor.PUT /fornecedores/{id}
→ Atualiza as informações de um fornecedor.DELETE /fornecedores/{id}
→ Deleta um fornecedor.
POST /remedios/
→ Cria um novo remédio.GET /remedios/{id}
→ Recupera informações sobre um remédio.PUT /remedios/{id}
→ Atualiza informações sobre um remédio.DELETE /remedios/{id}
→ Deleta um remédio.
POST /estoques/
→ Cria um novo registro de estoque.GET /estoques/{id}
→ Recupera informações sobre o estoque de um remédio.PUT /estoques/{id}
→ Atualiza informações sobre o estoque de um remédio.DELETE /estoques/{id}
→ Deleta um registro de estoque.
Este projeto foi desenvolvido para fins educacionais, com potencial para expansão. FastAPI e Odmantic garantem performance assíncrona e escalabilidade. O sistema facilita a gestão do estoque de medicamentos, permitindo o cadastro e controle de fornecedores, remédios e seus respectivos estoques.