Aplicação FullStack desenvolvida usando Djanto e Djanto REST framework para fazer o gerenciamento de estoque.
A aplicação possui uma interface web para manipulação de informações, bem como uma API RESTful, além disso, há integração com uma aplicação de notificações para o envio de notificações por e-mail e WhatsApp via API do CallMeBot.
Além disso, utiliza a IA generativa da OpenAI para fornecer de insights e recomendações sobre os produtos do estoque.
🌐 Acesse: https://django-sge.onrender.com
⏰ Nota: Como esta é uma aplicação de demonstração hospedada no plano gratuito do Render, o primeiro acesso após período de inatividade pode levar 30-60 segundos para carregar, exibindo a tela padrão de carregamento do Render. Acessos subsequentes são instantâneos!
- Python
- Django
- Django REST framework
- PostgreSQL
- Autenticação com JWT para proteger os endpoints da API.
- Integração via Webhook para disparo de notificações de movimentação de estoque.
- Listagem, criação, atualização e deleção de produtos.
- Listagem, criação, atualização e deleção de marcas de produtos.
- Listagem, criação, atualização e deleção de categorias de produtos.
- Listagem, criação, atualização e deleção de fornecedores de produtos.
- Listagem, criação, atualização e deleção de entradas e saídas de produtos.
Certifique-se de ter o Docker e Docker Compose instalados, em seguida siga os seguintes passos:
- Clone o repositório
git clone https://github.com/elainefs/django-sge.git
cd django-sge- Crie um arquivo
.envna raiz do projeto
O arquivo .env-example é um modelo de como o seu arquivo .env deve ser.
Para gerar uma nova SECRET_KEY, a partir da raiz do projeto, use o seguinte comando no terminal:
python -c "from django.core.management.utils import get_random_secret_key; print(get_random_secret_key())"Adicione a sua SECRET_KEY a sua .env e edite as demais informações conforme suas preferências.
Forneça a url do sistema de notificações em NOTIFICATION_URL.
Para usar o recurso de IA é necessário fornecer o modelo e a chave de API através das variáveis OPENAI_API_KEY e OPENAI_MODEL.
- Execute o Docker Compose
docker compose up --build -d- Crie um super usuário
docker exec -it sge_web python manage.py createsuperuserPara executar essa aplicação siga os seguintes passos:
- Clone o repositório
git clone https://github.com/elainefs/django-sge.git
cd django-sge- Crie e ative um ambiente virtual
python3 -m venv .venv # Para Windows use: python -m venv .venv
source .venv/bin/activate # Para Windows use: .venv\Scripts\activate- Instale as dependências do projeto
pip install -r requirements.txt- Crie um arquivo
.envna raiz do projeto
O arquivo .env-example é um modelo de como o seu arquivo .env deve ser.
Para gerar uma nova SECRET_KEY, a partir da raiz do projeto, use o seguinte comando no terminal:
python -c "from django.core.management.utils import get_random_secret_key; print(get_random_secret_key())"Adicione a sua SECRET_KEY a sua .env e edite as demais informações conforme suas preferências.
Forneça a url do sistema de notificações em NOTIFICATION_URL.
Para usar o recurso de IA é necessário fornecer o modelo e a chave de API através das variáveis OPENAI_API_KEY e OPENAI_MODEL.
- Execute as migrações no banco de dados
python3 manage.py migrate- Crie um super usuário
python3 manage.py createsuperuser- Execute a aplicação
python3 manage.py runserverA aplicação estará disponível em http://localhost:8000.
O gerenciamento pode ser feito através da interface do Django Admin em: http://localhost:8000/admin/
Você pode interagir com a API utilizando ferramentas como Postman, Insomnia, entre outras.
Para ter acesso aos dados da API é necessário um token JWT.
O access token possui validade de 1 dia e o refresh de 7 dias.
POST - http://localhost:8000/api/v1/authentication/token/
Passe as informações do usuário cadastrado no sistema no body da requisição:
{
"username": "admin",
"password": "admin"
}
POST - http://localhost:8000/api/v1/authentication/token/verify/
Passe o access token obtido na criação no body da requisição:
{
"token": "access_token"
}
POST - http://localhost:8000/api/v1/authentication/token/refresh/
Passe o refresh token obtido na criação no body da requisição:
{
"refresh": "refresh_token"
}
POST - http://localhost:8000/brands/api/v1/
Campos do header da requisição:
| Campo | Valor |
|---|---|
| Authorization | Bearer token |
Request Body:
{
"name": "Dell",
"description": "Descrição da marca"
}GET - http://localhost:8000/brands/api/v1/
Campos do header da requisição:
| Campo | Valor |
|---|---|
| Authorization | Bearer token |
GET - http://localhost:8000/brands/api/v1/{id}/
Campos do header da requisição:
| Campo | Valor |
|---|---|
| Authorization | Bearer token |
Parâmetros
| Campo | Valor |
|---|---|
| id | id_da_marca |
PUT - http://localhost:8000/brands/api/v1/{id}/
Campos do header da requisição:
| Campo | Valor |
|---|---|
| Authorization | Bearer token |
Parâmetros
| Campo | Valor |
|---|---|
| id | id_da_marca |
Request Body:
{
"name": "Dell",
"description": "Descrição da marca"
}DELETE - http://localhost:8000/brands/api/v1/{id}/
Campos do header da requisição:
| Campo | Valor |
|---|---|
| Authorization | Bearer token |
Parâmetros
| Campo | Valor |
|---|---|
| id | id_da_marca |
POST - http://localhost:8000/categories/api/v1/
Campos do header da requisição:
| Campo | Valor |
|---|---|
| Authorization | Bearer token |
Request Body:
{
"name": "Notebook",
"description": "Descrição da categoria"
}GET - http://localhost:8000/categories/api/v1/
Campos do header da requisição:
| Campo | Valor |
|---|---|
| Authorization | Bearer token |
GET - http://localhost:8000/categories/api/v1/{id}/
Campos do header da requisição:
| Campo | Valor |
|---|---|
| Authorization | Bearer token |
Parâmetros
| Campo | Valor |
|---|---|
| id | id_da_categoria |
PUT - http://localhost:8000/categories/api/v1/{id}/
Campos do header da requisição:
| Campo | Valor |
|---|---|
| Authorization | Bearer token |
Parâmetros
| Campo | Valor |
|---|---|
| id | id_da_categoria |
Request Body:
{
"name": "Notebook",
"description": "Descrição da categoria"
}DELETE - http://localhost:8000/categories/api/v1/{id}/
Campos do header da requisição:
| Campo | Valor |
|---|---|
| Authorization | Bearer token |
Parâmetros
| Campo | Valor |
|---|---|
| id | id_da_categoria |
POST - http://localhost:8000/inflows/api/v1/
Campos do header da requisição:
| Campo | Valor |
|---|---|
| Authorization | Bearer token |
Request Body:
{
"product": 1
"supplier": 1,
"quantity": 10,
"description": "Compra de 10 notebooks.",
}GET - http://localhost:8000/inflows/api/v1/
Campos do header da requisição:
| Campo | Valor |
|---|---|
| Authorization | Bearer token |
GET - http://localhost:8000/inflows/api/v1/{id}/
Campos do header da requisição:
| Campo | Valor |
|---|---|
| Authorization | Bearer token |
Parâmetros
| Campo | Valor |
|---|---|
| id | id_da_entrada |
Para manter a integridade do banco, a menos que o usuário seja um super usuário logado pelo painel administrativo do Django, não é permitido excluir ou atualizar entradas.
POST - http://localhost:8000/outflows/api/v1/
Campos do header da requisição:
| Campo | Valor |
|---|---|
| Authorization | Bearer token |
Request Body:
{
"product": 1,
"quantity": 10,
"description": "Venda de 10 notebooks."
}GET - http://localhost:8000/outflows/api/v1/
Campos do header da requisição:
| Campo | Valor |
|---|---|
| Authorization | Bearer token |
GET - http://localhost:8000/outflows/api/v1/{id}/
Campos do header da requisição:
| Campo | Valor |
|---|---|
| Authorization | Bearer token |
Parâmetros
| Campo | Valor |
|---|---|
| id | id_da_saida |
Para manter a integridade do banco, a menos que o usuário seja um super usuário logado pelo painel administrativo do Django, não é permitido excluir ou atualizar saídas.
POST - http://localhost:8000/products/api/v1/
Campos do header da requisição:
| Campo | Valor |
|---|---|
| Authorization | Bearer token |
Request Body:
{
"title": "Rayzen 5 5500U",
"description": "Processador para notebooks.",
"serie_number": "40180480180810",
"cost_price": "150.00",
"selling_price": "239.00",
"quantity": 7,
"category": 3,
"brand": 4
}GET - http://localhost:8000/products/api/v1/
Campos do header da requisição:
| Campo | Valor |
|---|---|
| Authorization | Bearer token |
GET - http://localhost:8000/products/api/v1/{id}/
Campos do header da requisição:
| Campo | Valor |
|---|---|
| Authorization | Bearer token |
Parâmetros
| Campo | Valor |
|---|---|
| id | id_do_produto |
PUT - http://localhost:8000/products/api/v1/{id}/
Campos do header da requisição:
| Campo | Valor |
|---|---|
| Authorization | Bearer token |
Parâmetros
| Campo | Valor |
|---|---|
| id | id_do_produto |
Request Body:
{
"title": "Rayzen 5 5500U",
"description": "Processador para notebooks.",
"serie_number": "40180480180810",
"cost_price": "150.00",
"selling_price": "239.00",
"quantity": 7,
"category": 3,
"brand": 4
}DELETE - http://localhost:8000/products/api/v1/{id}/
Campos do header da requisição:
| Campo | Valor |
|---|---|
| Authorization | Bearer token |
Parâmetros
| Campo | Valor |
|---|---|
| id | id_da_produto |
POST - http://localhost:8000/suppliers/api/v1/
Campos do header da requisição:
| Campo | Valor |
|---|---|
| Authorization | Bearer token |
Request Body:
{
"nome": "AMD LTDA",
"description": "Empresa de processador para notebooks."
}GET - http://localhost:8000/suppliers/api/v1/
Campos do header da requisição:
| Campo | Valor |
|---|---|
| Authorization | Bearer token |
GET - http://localhost:8000/suppliers/api/v1/{id}/
Campos do header da requisição:
| Campo | Valor |
|---|---|
| Authorization | Bearer token |
Parâmetros
| Campo | Valor |
|---|---|
| id | id_do_fornecedor |
PUT - http://localhost:8000/suppliers/api/v1/{id}/
Campos do header da requisição:
| Campo | Valor |
|---|---|
| Authorization | Bearer token |
Parâmetros
| Campo | Valor |
|---|---|
| id | id_do_fornecedor |
Request Body:
{
"nome": "AMD LTDA",
"description": "Empresa de processador para notebooks."
}DELETE - http://localhost:8000/suppliers/api/v1/{id}/
Campos do header da requisição:
| Campo | Valor |
|---|---|
| Authorization | Bearer token |
Parâmetros
| Campo | Valor |
|---|---|
| id | id_do_fornecedor |
Este projeto está sobre a licença MIT. Veja o arquivo LICENSE para mais informações.
Made with ❤️ by Elaine Ferreira
