https://github.com/elainefs/django-sge
SGE - Sistema de Gerenciamento de Estoque
https://github.com/elainefs/django-sge
bootstrap chartjs django django-rest-framework docker postgresql python
Last synced: 2 months ago
JSON representation
SGE - Sistema de Gerenciamento de Estoque
- Host: GitHub
- URL: https://github.com/elainefs/django-sge
- Owner: elainefs
- License: mit
- Created: 2025-04-14T02:11:58.000Z (about 1 year ago)
- Default Branch: main
- Last Pushed: 2026-02-18T19:19:04.000Z (5 months ago)
- Last Synced: 2026-02-18T23:26:13.580Z (5 months ago)
- Topics: bootstrap, chartjs, django, django-rest-framework, docker, postgresql, python
- Language: Python
- Homepage: https://django-sge.onrender.com
- Size: 373 KB
- Stars: 0
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
Sistema de Gerenciamento de Estoque - SGE
## š Sobre
Aplicação FullStack desenvolvida usando Django e Django 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](https://github.com/elainefs/django-sge-notify) para o envio de notificações por e-mail e WhatsApp via API do [CallMeBot](https://www.callmebot.com/).
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](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!

## š»ļø Tecnologias
- Python
- Django
- Django REST framework
- PostgreSQL
## ā
Funcionalidade
- [x] Autenticação com JWT para proteger os endpoints da API.
- [x] Integração via Webhook para disparo de notificações de movimentação de estoque.
- [x] Listagem, criação, atualização e deleção de produtos.
- [x] Listagem, criação, atualização e deleção de marcas de produtos.
- [x] Listagem, criação, atualização e deleção de categorias de produtos.
- [x] Listagem, criação, atualização e deleção de fornecedores de produtos.
- [x] Listagem, criação, atualização e deleção de entradas e saĆdas de produtos.
## āļø Como usar
### Executar a aplicação via Docker
Certifique-se de ter o Docker e Docker Compose instalados, em seguida siga os seguintes passos:
1. Clone o repositório
```bash
git clone https://github.com/elainefs/django-sge.git
cd django-sge
```
2. Crie um arquivo `.env` na 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:
```bash
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`.
3. Execute o Docker Compose
```bash
docker compose up --build -d
```
4. Crie um super usuƔrio
```bash
docker exec -it sge_web python manage.py createsuperuser
```
### Executar a aplicação localmente sem Docker
Para executar essa aplicação siga os seguintes passos:
1. Clone o repositório
```bash
git clone https://github.com/elainefs/django-sge.git
cd django-sge
```
2. Crie e ative um ambiente virtual
```bash
python3 -m venv .venv # Para Windows use: python -m venv .venv
source .venv/bin/activate # Para Windows use: .venv\Scripts\activate
```
3. Instale as dependĆŖncias do projeto
```bash
pip install -r requirements.txt
```
4. Crie um arquivo `.env` na 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:
```bash
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`.
5. Execute as migraƧƵes no banco de dados
```bash
python3 manage.py migrate
```
6. Crie um super usuƔrio
```bash
python3 manage.py createsuperuser
```
7. Execute a aplicação
```bash
python3 manage.py runserver
```
A 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/`
Para interagir com a API você pode usar o Swagger UI ou outra aplicação de requisições HTTP de sua preferência, como Postman, Insomnia, entre outras.
- **Swagger UI**: Acesse a documentação interativa da API em `http://0.0.0.0:8000/api/swagger/` ou `http://localhost:8000/api/swagger/`
- **Redoc**: Você também pode ver a descrição completa dos endpoints através da documentação pelo Redoc em `http://0.0.0.0:8000/api/redoc/` ou `http://localhost:8000/api/redoc/`
## š Endpoints da API
### Autenticação JWT
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.
#### Criação de Token
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"
}
```
#### Verificação do Token
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"
}
```
#### Refresh 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"
}
```
### Marcas
#### Criar marcas de produtos
POST - `http://localhost:8000/brands/api/v1/`
Campos do header da requisição:
| Campo | Valor |
| ------------- | ------------ |
| Authorization | Bearer token |
Request Body:
```json
{
"name": "Dell",
"description": "Descrição da marca"
}
```
#### Listar todas as marcas
GET - `http://localhost:8000/brands/api/v1/`
Campos do header da requisição:
| Campo | Valor |
| ------------- | ------------ |
| Authorization | Bearer token |
#### Listar marca por ID
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 |
#### Atualizar 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:
```json
{
"name": "Dell",
"description": "Descrição da marca"
}
```
#### Excluir 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 |
### Categorias
#### Criar categoria de produtos
POST - `http://localhost:8000/categories/api/v1/`
Campos do header da requisição:
| Campo | Valor |
| ------------- | ------------ |
| Authorization | Bearer token |
Request Body:
```json
{
"name": "Notebook",
"description": "Descrição da categoria"
}
```
#### Listar todas as categorias
GET - `http://localhost:8000/categories/api/v1/`
Campos do header da requisição:
| Campo | Valor |
| ------------- | ------------ |
| Authorization | Bearer token |
#### Listar categorias por ID
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 |
#### Atualizar 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:
```json
{
"name": "Notebook",
"description": "Descrição da categoria"
}
```
#### Excluir 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 |
### Entradas de produtos
#### Criar entrada de produtos
POST - `http://localhost:8000/inflows/api/v1/`
Campos do header da requisição:
| Campo | Valor |
| ------------- | ------------ |
| Authorization | Bearer token |
Request Body:
```json
{
"product": 1
"supplier": 1,
"quantity": 10,
"description": "Compra de 10 notebooks.",
}
```
#### Listar todas as entradas
GET - `http://localhost:8000/inflows/api/v1/`
Campos do header da requisição:
| Campo | Valor |
| ------------- | ------------ |
| Authorization | Bearer token |
#### Listar entrada por ID
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.**
### SaĆdas de produtos
#### Criar saĆda de produtos
POST - `http://localhost:8000/outflows/api/v1/`
Campos do header da requisição:
| Campo | Valor |
| ------------- | ------------ |
| Authorization | Bearer token |
Request Body:
```json
{
"product": 1,
"quantity": 10,
"description": "Venda de 10 notebooks."
}
```
#### Listar todas as saĆdas
GET - `http://localhost:8000/outflows/api/v1/`
Campos do header da requisição:
| Campo | Valor |
| ------------- | ------------ |
| Authorization | Bearer token |
#### Listar entrada por ID
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.**
### Produtos
#### Criar produto
POST - `http://localhost:8000/products/api/v1/`
Campos do header da requisição:
| Campo | Valor |
| ------------- | ------------ |
| Authorization | Bearer token |
Request Body:
```json
{
"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
}
```
#### Listar todos os produtos
GET - `http://localhost:8000/products/api/v1/`
Campos do header da requisição:
| Campo | Valor |
| ------------- | ------------ |
| Authorization | Bearer token |
#### Listar produtos por ID
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 |
#### Atualizar 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:
```json
{
"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
}
```
#### Excluir produto
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 |
### Fornecedores
#### Criar fornecedor de produtos
POST - `http://localhost:8000/suppliers/api/v1/`
Campos do header da requisição:
| Campo | Valor |
| ------------- | ------------ |
| Authorization | Bearer token |
Request Body:
```json
{
"nome": "AMD LTDA",
"description": "Empresa de processador para notebooks."
}
```
#### Listar todos os fornecedores
GET - `http://localhost:8000/suppliers/api/v1/`
Campos do header da requisição:
| Campo | Valor |
| ------------- | ------------ |
| Authorization | Bearer token |
#### Listar fornecedores por ID
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 |
#### Atualizar produto
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:
```json
{
"nome": "AMD LTDA",
"description": "Empresa de processador para notebooks."
}
```
#### Excluir fornecedor
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 |
## š LicenƧa
Este projeto estƔ sobre a licenƧa MIT. Veja o arquivo [LICENSE](https://github.com/elainefs/django-sge/blob/main/LICENSE) para mais informaƧƵes.
---
Made with ā¤ļø by [Elaine Ferreira](https://github.com/elainefs)