├── main ├── __init__.py ├── migrations │ ├── __init__.py │ ├── __pycache__ │ │ ├── __init__.cpython-39.pyc │ │ ├── 0001_initial.cpython-39.pyc │ │ ├── 0006_corredor.cpython-39.pyc │ │ ├── 0005_delete_corredor.cpython-39.pyc │ │ ├── 0012_corredor_filial.cpython-39.pyc │ │ ├── 0007_categoria_produto.cpython-39.pyc │ │ ├── 0004_auto_20210419_1516.cpython-39.pyc │ │ ├── 0008_auto_20210419_1626.cpython-39.pyc │ │ ├── 0014_auto_20210420_1324.cpython-39.pyc │ │ ├── 0015_auto_20210420_1332.cpython-39.pyc │ │ ├── 0017_auto_20210420_1415.cpython-39.pyc │ │ ├── 0002_alter_corredor_codigo.cpython-39.pyc │ │ ├── 0013_alter_funcionario_filial.cpython-39.pyc │ │ ├── 0016_remove_funcionario_slug.cpython-39.pyc │ │ ├── 0018_produto_validade_produto.cpython-39.pyc │ │ ├── 0003_rename_user_funcionario_usuario.cpython-39.pyc │ │ ├── 0009_remove_conferencia_codigo_barras.cpython-39.pyc │ │ ├── 0010_alter_conferencia_data_conferencia.cpython-39.pyc │ │ └── 0011_alter_validade_produto_data_validade.cpython-39.pyc │ ├── 0005_delete_corredor.py │ ├── 0016_remove_funcionario_slug.py │ ├── 0009_remove_conferencia_codigo_barras.py │ ├── 0002_alter_corredor_codigo.py │ ├── 0003_rename_user_funcionario_usuario.py │ ├── 0011_alter_validade_produto_data_validade.py │ ├── 0010_alter_conferencia_data_conferencia.py │ ├── 0013_alter_funcionario_filial.py │ ├── 0012_corredor_filial.py │ ├── 0004_auto_20210419_1516.py │ ├── 0006_corredor.py │ ├── 0015_auto_20210420_1332.py │ ├── 0017_auto_20210420_1415.py │ ├── 0014_auto_20210420_1324.py │ ├── 0007_categoria_produto.py │ ├── 0001_initial.py │ ├── 0018_produto_validade_produto.py │ └── 0008_auto_20210419_1626.py ├── tests.py ├── __pycache__ │ ├── admin.cpython-39.pyc │ ├── apps.cpython-39.pyc │ ├── forms.cpython-39.pyc │ ├── models.cpython-39.pyc │ ├── urls.cpython-39.pyc │ ├── views.cpython-39.pyc │ ├── __init__.cpython-39.pyc │ └── filters.cpython-39.pyc ├── apps.py ├── static │ └── css │ │ └── main.css ├── templates │ └── main │ │ ├── index.html │ │ ├── produto_detail.html │ │ ├── nova_conferencia_itens.html │ │ ├── nova_conferencia.html │ │ ├── produto_list.html │ │ ├── conferencia_detail.html │ │ ├── conferencia_list.html │ │ └── base.html ├── forms.py ├── filters.py ├── urls.py ├── admin.py ├── models.py └── views.py ├── appvalidade ├── __init__.py ├── __pycache__ │ ├── urls.cpython-39.pyc │ ├── wsgi.cpython-39.pyc │ ├── __init__.cpython-39.pyc │ └── settings.cpython-39.pyc ├── asgi.py ├── wsgi.py ├── urls.py └── settings.py ├── requirements.txt ├── appValidade.sqlite3 ├── README.md ├── manage.py ├── templates └── registration │ └── login.html └── .gitignore /main/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /appvalidade/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /main/migrations/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /main/tests.py: -------------------------------------------------------------------------------- 1 | from django.test import TestCase 2 | 3 | # Create your tests here. 4 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rg3915/controle-validade/master/requirements.txt -------------------------------------------------------------------------------- /appValidade.sqlite3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rg3915/controle-validade/master/appValidade.sqlite3 -------------------------------------------------------------------------------- /main/__pycache__/admin.cpython-39.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rg3915/controle-validade/master/main/__pycache__/admin.cpython-39.pyc -------------------------------------------------------------------------------- /main/__pycache__/apps.cpython-39.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rg3915/controle-validade/master/main/__pycache__/apps.cpython-39.pyc -------------------------------------------------------------------------------- /main/__pycache__/forms.cpython-39.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rg3915/controle-validade/master/main/__pycache__/forms.cpython-39.pyc -------------------------------------------------------------------------------- /main/__pycache__/models.cpython-39.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rg3915/controle-validade/master/main/__pycache__/models.cpython-39.pyc -------------------------------------------------------------------------------- /main/__pycache__/urls.cpython-39.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rg3915/controle-validade/master/main/__pycache__/urls.cpython-39.pyc -------------------------------------------------------------------------------- /main/__pycache__/views.cpython-39.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rg3915/controle-validade/master/main/__pycache__/views.cpython-39.pyc -------------------------------------------------------------------------------- /main/__pycache__/__init__.cpython-39.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rg3915/controle-validade/master/main/__pycache__/__init__.cpython-39.pyc -------------------------------------------------------------------------------- /main/__pycache__/filters.cpython-39.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rg3915/controle-validade/master/main/__pycache__/filters.cpython-39.pyc -------------------------------------------------------------------------------- /appvalidade/__pycache__/urls.cpython-39.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rg3915/controle-validade/master/appvalidade/__pycache__/urls.cpython-39.pyc -------------------------------------------------------------------------------- /appvalidade/__pycache__/wsgi.cpython-39.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rg3915/controle-validade/master/appvalidade/__pycache__/wsgi.cpython-39.pyc -------------------------------------------------------------------------------- /appvalidade/__pycache__/__init__.cpython-39.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rg3915/controle-validade/master/appvalidade/__pycache__/__init__.cpython-39.pyc -------------------------------------------------------------------------------- /appvalidade/__pycache__/settings.cpython-39.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rg3915/controle-validade/master/appvalidade/__pycache__/settings.cpython-39.pyc -------------------------------------------------------------------------------- /main/migrations/__pycache__/__init__.cpython-39.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rg3915/controle-validade/master/main/migrations/__pycache__/__init__.cpython-39.pyc -------------------------------------------------------------------------------- /main/migrations/__pycache__/0001_initial.cpython-39.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rg3915/controle-validade/master/main/migrations/__pycache__/0001_initial.cpython-39.pyc -------------------------------------------------------------------------------- /main/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class MainConfig(AppConfig): 5 | default_auto_field = 'django.db.models.BigAutoField' 6 | name = 'main' 7 | -------------------------------------------------------------------------------- /main/migrations/__pycache__/0006_corredor.cpython-39.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rg3915/controle-validade/master/main/migrations/__pycache__/0006_corredor.cpython-39.pyc -------------------------------------------------------------------------------- /main/static/css/main.css: -------------------------------------------------------------------------------- 1 | p{ 2 | color: royalblue; 3 | } 4 | 5 | .titulo{ 6 | color: black; 7 | } 8 | 9 | .auth-card{ 10 | margin: 100px auto; 11 | } 12 | -------------------------------------------------------------------------------- /main/migrations/__pycache__/0005_delete_corredor.cpython-39.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rg3915/controle-validade/master/main/migrations/__pycache__/0005_delete_corredor.cpython-39.pyc -------------------------------------------------------------------------------- /main/migrations/__pycache__/0012_corredor_filial.cpython-39.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rg3915/controle-validade/master/main/migrations/__pycache__/0012_corredor_filial.cpython-39.pyc -------------------------------------------------------------------------------- /main/migrations/__pycache__/0007_categoria_produto.cpython-39.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rg3915/controle-validade/master/main/migrations/__pycache__/0007_categoria_produto.cpython-39.pyc -------------------------------------------------------------------------------- /main/templates/main/index.html: -------------------------------------------------------------------------------- 1 | {% extends 'main/base.html' %} 2 | 3 | {% block content %} 4 |

Bem-vindo ao sistema de controle de validade!

5 | 6 | {% endblock content %} 7 | -------------------------------------------------------------------------------- /main/migrations/__pycache__/0004_auto_20210419_1516.cpython-39.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rg3915/controle-validade/master/main/migrations/__pycache__/0004_auto_20210419_1516.cpython-39.pyc -------------------------------------------------------------------------------- /main/migrations/__pycache__/0008_auto_20210419_1626.cpython-39.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rg3915/controle-validade/master/main/migrations/__pycache__/0008_auto_20210419_1626.cpython-39.pyc -------------------------------------------------------------------------------- /main/migrations/__pycache__/0014_auto_20210420_1324.cpython-39.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rg3915/controle-validade/master/main/migrations/__pycache__/0014_auto_20210420_1324.cpython-39.pyc -------------------------------------------------------------------------------- /main/migrations/__pycache__/0015_auto_20210420_1332.cpython-39.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rg3915/controle-validade/master/main/migrations/__pycache__/0015_auto_20210420_1332.cpython-39.pyc -------------------------------------------------------------------------------- /main/migrations/__pycache__/0017_auto_20210420_1415.cpython-39.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rg3915/controle-validade/master/main/migrations/__pycache__/0017_auto_20210420_1415.cpython-39.pyc -------------------------------------------------------------------------------- /main/migrations/__pycache__/0002_alter_corredor_codigo.cpython-39.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rg3915/controle-validade/master/main/migrations/__pycache__/0002_alter_corredor_codigo.cpython-39.pyc -------------------------------------------------------------------------------- /main/migrations/__pycache__/0013_alter_funcionario_filial.cpython-39.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rg3915/controle-validade/master/main/migrations/__pycache__/0013_alter_funcionario_filial.cpython-39.pyc -------------------------------------------------------------------------------- /main/migrations/__pycache__/0016_remove_funcionario_slug.cpython-39.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rg3915/controle-validade/master/main/migrations/__pycache__/0016_remove_funcionario_slug.cpython-39.pyc -------------------------------------------------------------------------------- /main/migrations/__pycache__/0018_produto_validade_produto.cpython-39.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rg3915/controle-validade/master/main/migrations/__pycache__/0018_produto_validade_produto.cpython-39.pyc -------------------------------------------------------------------------------- /main/migrations/__pycache__/0003_rename_user_funcionario_usuario.cpython-39.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rg3915/controle-validade/master/main/migrations/__pycache__/0003_rename_user_funcionario_usuario.cpython-39.pyc -------------------------------------------------------------------------------- /main/migrations/__pycache__/0009_remove_conferencia_codigo_barras.cpython-39.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rg3915/controle-validade/master/main/migrations/__pycache__/0009_remove_conferencia_codigo_barras.cpython-39.pyc -------------------------------------------------------------------------------- /main/migrations/__pycache__/0010_alter_conferencia_data_conferencia.cpython-39.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rg3915/controle-validade/master/main/migrations/__pycache__/0010_alter_conferencia_data_conferencia.cpython-39.pyc -------------------------------------------------------------------------------- /main/migrations/__pycache__/0011_alter_validade_produto_data_validade.cpython-39.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rg3915/controle-validade/master/main/migrations/__pycache__/0011_alter_validade_produto_data_validade.cpython-39.pyc -------------------------------------------------------------------------------- /main/migrations/0005_delete_corredor.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2 on 2021-04-19 15:28 2 | 3 | from django.db import migrations 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('main', '0004_auto_20210419_1516'), 10 | ] 11 | 12 | operations = [ 13 | migrations.DeleteModel( 14 | name='Corredor', 15 | ), 16 | ] 17 | -------------------------------------------------------------------------------- /main/migrations/0016_remove_funcionario_slug.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2 on 2021-04-20 13:58 2 | 3 | from django.db import migrations 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('main', '0015_auto_20210420_1332'), 10 | ] 11 | 12 | operations = [ 13 | migrations.RemoveField( 14 | model_name='funcionario', 15 | name='slug', 16 | ), 17 | ] 18 | -------------------------------------------------------------------------------- /main/migrations/0009_remove_conferencia_codigo_barras.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2 on 2021-04-19 16:34 2 | 3 | from django.db import migrations 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('main', '0008_auto_20210419_1626'), 10 | ] 11 | 12 | operations = [ 13 | migrations.RemoveField( 14 | model_name='conferencia', 15 | name='codigo_barras', 16 | ), 17 | ] 18 | -------------------------------------------------------------------------------- /main/migrations/0002_alter_corredor_codigo.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2 on 2021-04-19 15:37 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('main', '0001_initial'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AlterField( 14 | model_name='corredor', 15 | name='codigo', 16 | field=models.IntegerField(), 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /appvalidade/asgi.py: -------------------------------------------------------------------------------- 1 | """ 2 | ASGI config for appvalidade project. 3 | 4 | It exposes the ASGI callable as a module-level variable named ``application``. 5 | 6 | For more information on this file, see 7 | https://docs.djangoproject.com/en/3.2/howto/deployment/asgi/ 8 | """ 9 | 10 | import os 11 | 12 | from django.core.asgi import get_asgi_application 13 | 14 | os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'appvalidade.settings') 15 | 16 | application = get_asgi_application() 17 | -------------------------------------------------------------------------------- /appvalidade/wsgi.py: -------------------------------------------------------------------------------- 1 | """ 2 | WSGI config for appvalidade project. 3 | 4 | It exposes the WSGI callable as a module-level variable named ``application``. 5 | 6 | For more information on this file, see 7 | https://docs.djangoproject.com/en/3.2/howto/deployment/wsgi/ 8 | """ 9 | 10 | import os 11 | 12 | from django.core.wsgi import get_wsgi_application 13 | 14 | os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'appvalidade.settings') 15 | 16 | application = get_wsgi_application() 17 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## Como rodar o projeto? 2 | 3 | * Clone esse repositório. 4 | * Crie um virtualenv com Python 3. 5 | * Ative o virtualenv. 6 | * Instale as dependências. 7 | * Rode as migrações. 8 | 9 | ``` 10 | git clone https://github.com/dyego1912/controle-validade.git 11 | cd controle-validade 12 | python -m venv .venv 13 | source .venv/bin/activate 14 | pip install -r requirements.txt 15 | python manage.py migrate 16 | python manage.py createsuperuser --username="admin" --email="" 17 | ``` -------------------------------------------------------------------------------- /main/migrations/0003_rename_user_funcionario_usuario.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2 on 2021-04-19 11:58 2 | 3 | from django.db import migrations 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('main', '0002_alter_corredor_codigo'), 10 | ] 11 | 12 | operations = [ 13 | migrations.RenameField( 14 | model_name='funcionario', 15 | old_name='user', 16 | new_name='usuario', 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /main/templates/main/produto_detail.html: -------------------------------------------------------------------------------- 1 | {% extends 'main/base.html' %} 2 | 3 | {% block title %} {{ produto.descricao }} {% endblock title %} 4 | 5 | {% block content %} 6 |

Descricão: {{ produto.descricao }}

7 |

Código: {{ produto.codigo }} 8 |
9 | Código de barras: {{ produto.codigo_barras }} 10 |
11 | Preço de venda: R$ {{ produto.preco_venda }} 12 |
13 | Categoria: {{ produto.categoria }} 14 |

15 | {% endblock content %} 16 | 17 | 18 | -------------------------------------------------------------------------------- /main/templates/main/nova_conferencia_itens.html: -------------------------------------------------------------------------------- 1 | {% extends 'main/base.html' %} 2 | 3 | {% load bootstrap %} 4 | 5 | {% block title %} Nova conferência {% endblock %} 6 | 7 | {%block content %} 8 |
9 |
10 |
11 | {% csrf_token %} 12 | {{ form|bootstrap }} 13 | 14 | 15 | 16 |
17 |
18 |
19 | 20 | {% endblock %} -------------------------------------------------------------------------------- /main/templates/main/nova_conferencia.html: -------------------------------------------------------------------------------- 1 | {% extends 'main/base.html' %} 2 | 3 | {% load bootstrap %} 4 | 5 | {% block title %} Nova Conferência {% endblock title %} 6 | 7 | {% block content %} 8 | 9 |
10 |
11 |
12 | {% csrf_token %} 13 | {{ form|bootstrap }} 14 | 15 | 16 | 17 |
18 |
19 |
20 | {% endblock content %} -------------------------------------------------------------------------------- /main/migrations/0011_alter_validade_produto_data_validade.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2 on 2021-04-19 16:47 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('main', '0010_alter_conferencia_data_conferencia'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AlterField( 14 | model_name='validade_produto', 15 | name='data_validade', 16 | field=models.DateField(), 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /main/migrations/0010_alter_conferencia_data_conferencia.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2 on 2021-04-19 16:45 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('main', '0009_remove_conferencia_codigo_barras'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AlterField( 14 | model_name='conferencia', 15 | name='data_conferencia', 16 | field=models.DateField(auto_now_add=True), 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /main/migrations/0013_alter_funcionario_filial.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2 on 2021-04-20 10:10 2 | 3 | from django.db import migrations, models 4 | import django.db.models.deletion 5 | 6 | 7 | class Migration(migrations.Migration): 8 | 9 | dependencies = [ 10 | ('main', '0012_corredor_filial'), 11 | ] 12 | 13 | operations = [ 14 | migrations.AlterField( 15 | model_name='funcionario', 16 | name='filial', 17 | field=models.ForeignKey(default=1, on_delete=django.db.models.deletion.CASCADE, related_name='filial_funcionario', to='main.filial'), 18 | ), 19 | ] 20 | -------------------------------------------------------------------------------- /main/migrations/0012_corredor_filial.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2 on 2021-04-20 10:08 2 | 3 | from django.db import migrations, models 4 | import django.db.models.deletion 5 | 6 | 7 | class Migration(migrations.Migration): 8 | 9 | dependencies = [ 10 | ('main', '0011_alter_validade_produto_data_validade'), 11 | ] 12 | 13 | operations = [ 14 | migrations.AddField( 15 | model_name='corredor', 16 | name='filial', 17 | field=models.ForeignKey(default=1, on_delete=django.db.models.deletion.CASCADE, related_name='filial_corredor', to='main.filial'), 18 | ), 19 | ] 20 | -------------------------------------------------------------------------------- /main/templates/main/produto_list.html: -------------------------------------------------------------------------------- 1 | 2 | {% extends 'main/base.html' %} 3 | 4 | {% block title %} Produtos {% endblock %} 5 | 6 | {% block content %} 7 | {% for p in produtos %} 8 | 9 |
10 |

{{ p.descricao }}

11 |

Código: {{ p.codigo }}

12 |

Preço de venda: R$ {{ p.preco_venda }}

13 |

Código de barras: {{ p.codigo_barras }}

14 |

Categoria: {{ p.categoria }}

15 | 16 |
17 | 18 | 19 | 20 | {% endfor %} 21 | 22 | {% endblock %} -------------------------------------------------------------------------------- /main/forms.py: -------------------------------------------------------------------------------- 1 | # from django.forms import ModelForm 2 | from .models import Conferencia, Validade_Produto 3 | 4 | from django import forms 5 | 6 | # Criação do formulário de conferência 7 | 8 | class ConferenciaForm(forms.ModelForm): 9 | class Meta: 10 | model = Conferencia 11 | fields = ['corredor'] 12 | 13 | # widgets = {'corredor': forms.TextInput} 14 | 15 | class ValidadeProdutoForm(forms.ModelForm): 16 | class Meta: 17 | model = Validade_Produto 18 | # campo conferência vai ser preenchido usando o id da conferência criada 19 | fields = ['codigo_barras', 'data_validade', 'quantidade'] 20 | widgets = {'codigo_barras': forms.TextInput} 21 | 22 | -------------------------------------------------------------------------------- /manage.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | """Django's command-line utility for administrative tasks.""" 3 | import os 4 | import sys 5 | 6 | 7 | def main(): 8 | """Run administrative tasks.""" 9 | os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'appvalidade.settings') 10 | try: 11 | from django.core.management import execute_from_command_line 12 | except ImportError as exc: 13 | raise ImportError( 14 | "Couldn't import Django. Are you sure it's installed and " 15 | "available on your PYTHONPATH environment variable? Did you " 16 | "forget to activate a virtual environment?" 17 | ) from exc 18 | execute_from_command_line(sys.argv) 19 | 20 | 21 | if __name__ == '__main__': 22 | main() 23 | -------------------------------------------------------------------------------- /main/filters.py: -------------------------------------------------------------------------------- 1 | import django_filters as filters 2 | 3 | from django_filters import DateFilter 4 | 5 | from .models import Conferencia, Produto 6 | 7 | class ConferenciaFilter(filters.FilterSet): 8 | 9 | #data_conferencia = filters.CharFilter(label='Data da Conferência') 10 | 11 | class Meta: 12 | model = Conferencia 13 | fields = ('data_conferencia',) 14 | # exclude = ['funcionario'] 15 | 16 | def __init__(self, *args, **kwargs): 17 | super(ConferenciaFilter, self).__init__(*args, **kwargs) 18 | self.filters['data_conferencia'].label = 'Data da Conferência' 19 | 20 | class ProdutoFilter(filters.FilterSet): 21 | class Meta: 22 | model = Produto 23 | fields = ('codigo_barras',) 24 | -------------------------------------------------------------------------------- /main/migrations/0004_auto_20210419_1516.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2 on 2021-04-19 15:16 2 | 3 | from django.db import migrations, models 4 | import django.db.models.deletion 5 | 6 | 7 | class Migration(migrations.Migration): 8 | 9 | dependencies = [ 10 | ('main', '0003_rename_user_funcionario_usuario'), 11 | ] 12 | 13 | operations = [ 14 | migrations.AlterModelOptions( 15 | name='filial', 16 | options={'verbose_name_plural': 'Filiais'}, 17 | ), 18 | migrations.AddField( 19 | model_name='funcionario', 20 | name='filial', 21 | field=models.ForeignKey(default=1, on_delete=django.db.models.deletion.CASCADE, related_name='filial', to='main.filial'), 22 | ), 23 | ] 24 | -------------------------------------------------------------------------------- /main/migrations/0006_corredor.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2 on 2021-04-19 15:29 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('main', '0005_delete_corredor'), 10 | ] 11 | 12 | operations = [ 13 | migrations.CreateModel( 14 | name='Corredor', 15 | fields=[ 16 | ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), 17 | ('nome', models.CharField(max_length=30)), 18 | ('descricao', models.CharField(max_length=50)), 19 | ], 20 | options={ 21 | 'verbose_name_plural': 'Corredores', 22 | }, 23 | ), 24 | ] 25 | -------------------------------------------------------------------------------- /main/urls.py: -------------------------------------------------------------------------------- 1 | # Importa o módulo path 2 | from django.urls import path 3 | 4 | # import o arquivo de views 5 | from . import views 6 | 7 | app_name = 'main' 8 | 9 | urlpatterns = [ 10 | # path("produtos/", views.produto_list, name='lista_produtos'), 11 | # path("produtos//", views.produto_detalhes, name='detalhes_produtos'), 12 | # path('login/', views.login_pagina, name='login_pagina'), 13 | path('', views.index, name='index'), 14 | path("conferencias/", views.conferencia_list, name='lista_conferencia'), 15 | path("conferencias//", views.detalhes_conferencia, name='detalhes_conferencia'), 16 | path("nova-conferencia/", views.nova_conferencia, name='nova_conferencia'), 17 | path("nova-conferencia-itens/", views.nova_conferecia_itens, name='nova_conferencia_itens'), 18 | ] 19 | 20 | -------------------------------------------------------------------------------- /main/migrations/0015_auto_20210420_1332.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2 on 2021-04-20 13:32 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('main', '0014_auto_20210420_1324'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AlterField( 14 | model_name='corredor', 15 | name='slug', 16 | field=models.SlugField(max_length=30, unique=True), 17 | ), 18 | migrations.AlterField( 19 | model_name='filial', 20 | name='slug', 21 | field=models.SlugField(max_length=30, unique=True), 22 | ), 23 | migrations.AlterField( 24 | model_name='funcionario', 25 | name='slug', 26 | field=models.SlugField(unique=True), 27 | ), 28 | ] 29 | -------------------------------------------------------------------------------- /main/templates/main/conferencia_detail.html: -------------------------------------------------------------------------------- 1 | {% extends 'main/base.html' %} 2 | 3 | {% block title %} Produtos Conferidos {% endblock %} 4 | 5 | {% block content %} 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | {% for p in produtos_conferencia %} 17 | 18 | 19 | 20 | 21 | 22 | 24 | 25 | 26 | 27 | {% endfor %} 28 | 29 |
ProdutoVencimentoQuantidade
{{ p.codigo_barras }} {{ p.data_validade }}{{ p.quantidade }} 23 |
30 | 31 | {% endblock %} -------------------------------------------------------------------------------- /main/migrations/0017_auto_20210420_1415.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2 on 2021-04-20 14:15 2 | 3 | from django.db import migrations 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('main', '0016_remove_funcionario_slug'), 10 | ] 11 | 12 | operations = [ 13 | migrations.RemoveField( 14 | model_name='validade_produto', 15 | name='codigo_barras', 16 | ), 17 | migrations.RemoveField( 18 | model_name='validade_produto', 19 | name='conferencia', 20 | ), 21 | migrations.AlterModelOptions( 22 | name='filial', 23 | options={'ordering': ['nome'], 'verbose_name_plural': 'Filiais'}, 24 | ), 25 | migrations.DeleteModel( 26 | name='Produto', 27 | ), 28 | migrations.DeleteModel( 29 | name='Validade_Produto', 30 | ), 31 | ] 32 | -------------------------------------------------------------------------------- /appvalidade/urls.py: -------------------------------------------------------------------------------- 1 | """appvalidade URL Configuration 2 | 3 | The `urlpatterns` list routes URLs to views. For more information please see: 4 | https://docs.djangoproject.com/en/3.2/topics/http/urls/ 5 | Examples: 6 | Function views 7 | 1. Add an import: from my_app import views 8 | 2. Add a URL to urlpatterns: path('', views.home, name='home') 9 | Class-based views 10 | 1. Add an import: from other_app.views import Home 11 | 2. Add a URL to urlpatterns: path('', Home.as_view(), name='home') 12 | Including another URLconf 13 | 1. Import the include() function: from django.urls import include, path 14 | 2. Add a URL to urlpatterns: path('blog/', include('blog.urls')) 15 | """ 16 | from django.contrib import admin 17 | from django.urls import path, include 18 | 19 | urlpatterns = [ 20 | path('admin/', admin.site.urls), 21 | path('', include('main.urls', namespace='main')), 22 | path('accounts/', include('django.contrib.auth.urls')), 23 | ] 24 | -------------------------------------------------------------------------------- /templates/registration/login.html: -------------------------------------------------------------------------------- 1 | {% extends 'main/base.html' %} 2 | 3 | {% load bootstrap %} 4 | 5 | {% block title %} Acessar Sistema{% endblock title %} 6 | 7 | {% block content %} 8 |
9 |
10 |
11 |
12 |

Acessar o sistema

13 | 14 |
15 | {% csrf_token %} 16 | 17 | {{ form|bootstrap }} 18 | 19 |
20 |
21 |
22 |
23 |
24 | {% endblock content %} 25 | 26 | 27 | -------------------------------------------------------------------------------- /main/templates/main/conferencia_list.html: -------------------------------------------------------------------------------- 1 | {% extends 'main/base.html' %} 2 | 3 | {% block title %} Conferências {% endblock title %} 4 | 5 | {% block content %} 6 | 7 |
8 | 9 | {{ filtro.form }} 10 | 11 | 12 | 13 |
14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | {% for c in conferencias %} 26 | 27 | 28 | 29 | 30 | 31 | 33 | 34 | 35 | {% endfor %} 36 | 37 |
LocalFuncionárioData
{{ c.corredor.slug }} {{ c.funcionario }}{{ c.data_conferencia }} 32 |
38 | {% endblock content %} -------------------------------------------------------------------------------- /main/migrations/0014_auto_20210420_1324.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2 on 2021-04-20 13:24 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('main', '0013_alter_funcionario_filial'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AlterModelOptions( 14 | name='categoria', 15 | options={'ordering': ['descricao']}, 16 | ), 17 | migrations.AlterModelOptions( 18 | name='funcionario', 19 | options={'ordering': ['usuario']}, 20 | ), 21 | migrations.AddField( 22 | model_name='corredor', 23 | name='slug', 24 | field=models.SlugField(default='teste', max_length=30), 25 | ), 26 | migrations.AddField( 27 | model_name='filial', 28 | name='slug', 29 | field=models.SlugField(default='teste', max_length=30), 30 | ), 31 | migrations.AddField( 32 | model_name='funcionario', 33 | name='slug', 34 | field=models.SlugField(default='teste'), 35 | ), 36 | ] 37 | -------------------------------------------------------------------------------- /main/migrations/0007_categoria_produto.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2 on 2021-04-19 15:50 2 | 3 | from django.db import migrations, models 4 | import django.db.models.deletion 5 | 6 | 7 | class Migration(migrations.Migration): 8 | 9 | dependencies = [ 10 | ('main', '0006_corredor'), 11 | ] 12 | 13 | operations = [ 14 | migrations.CreateModel( 15 | name='Categoria', 16 | fields=[ 17 | ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), 18 | ('descricao', models.CharField(max_length=255, unique=True)), 19 | ], 20 | ), 21 | migrations.CreateModel( 22 | name='Produto', 23 | fields=[ 24 | ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), 25 | ('codigo', models.IntegerField(unique=True)), 26 | ('codigo_barras', models.IntegerField(unique=True)), 27 | ('descricao', models.CharField(max_length=255)), 28 | ('preco_venda', models.DecimalField(decimal_places=2, max_digits=6)), 29 | ('categoria', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='main.categoria')), 30 | ], 31 | ), 32 | ] 33 | -------------------------------------------------------------------------------- /main/migrations/0001_initial.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2 on 2021-04-19 15:37 2 | 3 | from django.conf import settings 4 | from django.db import migrations, models 5 | import django.db.models.deletion 6 | 7 | 8 | class Migration(migrations.Migration): 9 | 10 | initial = True 11 | 12 | dependencies = [ 13 | migrations.swappable_dependency(settings.AUTH_USER_MODEL), 14 | ] 15 | 16 | operations = [ 17 | migrations.CreateModel( 18 | name='Corredor', 19 | fields=[ 20 | ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), 21 | ('codigo', models.IntegerField(max_length=2)), 22 | ('descricao', models.CharField(max_length=50)), 23 | ], 24 | ), 25 | migrations.CreateModel( 26 | name='Filial', 27 | fields=[ 28 | ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), 29 | ('nome', models.CharField(max_length=30)), 30 | ], 31 | ), 32 | migrations.CreateModel( 33 | name='Funcionario', 34 | fields=[ 35 | ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), 36 | ('cargo', models.CharField(max_length=20)), 37 | ('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='profile', to=settings.AUTH_USER_MODEL)), 38 | ], 39 | ), 40 | ] 41 | -------------------------------------------------------------------------------- /main/migrations/0018_produto_validade_produto.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2 on 2021-04-20 14:15 2 | 3 | from django.db import migrations, models 4 | import django.db.models.deletion 5 | 6 | 7 | class Migration(migrations.Migration): 8 | 9 | dependencies = [ 10 | ('main', '0017_auto_20210420_1415'), 11 | ] 12 | 13 | operations = [ 14 | migrations.CreateModel( 15 | name='Produto', 16 | fields=[ 17 | ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), 18 | ('codigo', models.IntegerField(unique=True)), 19 | ('codigo_barras', models.IntegerField(unique=True)), 20 | ('descricao', models.CharField(max_length=255)), 21 | ('preco_venda', models.DecimalField(decimal_places=2, max_digits=6)), 22 | ('slug', models.SlugField(max_length=255, unique=True)), 23 | ('categoria', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='main.categoria')), 24 | ], 25 | ), 26 | migrations.CreateModel( 27 | name='Validade_Produto', 28 | fields=[ 29 | ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), 30 | ('data_validade', models.DateField()), 31 | ('quantidade', models.IntegerField()), 32 | ('codigo_barras', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='main.produto')), 33 | ('conferencia', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='main.conferencia')), 34 | ], 35 | ), 36 | ] 37 | -------------------------------------------------------------------------------- /main/migrations/0008_auto_20210419_1626.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2 on 2021-04-19 16:26 2 | 3 | from django.db import migrations, models 4 | import django.db.models.deletion 5 | 6 | 7 | class Migration(migrations.Migration): 8 | 9 | dependencies = [ 10 | ('main', '0007_categoria_produto'), 11 | ] 12 | 13 | operations = [ 14 | migrations.CreateModel( 15 | name='Conferencia', 16 | fields=[ 17 | ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), 18 | ('data_conferencia', models.DateTimeField(auto_now_add=True)), 19 | ('codigo_barras', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='main.produto')), 20 | ], 21 | ), 22 | migrations.AlterModelOptions( 23 | name='corredor', 24 | options={'ordering': ['nome'], 'verbose_name_plural': 'Corredores'}, 25 | ), 26 | migrations.CreateModel( 27 | name='Validade_Produto', 28 | fields=[ 29 | ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), 30 | ('data_validade', models.DateTimeField()), 31 | ('quantidade', models.IntegerField()), 32 | ('codigo_barras', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='main.produto')), 33 | ('conferencia', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='main.conferencia')), 34 | ], 35 | ), 36 | migrations.AddField( 37 | model_name='conferencia', 38 | name='corredor', 39 | field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='main.corredor'), 40 | ), 41 | migrations.AddField( 42 | model_name='conferencia', 43 | name='funcionario', 44 | field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='main.funcionario'), 45 | ), 46 | ] 47 | -------------------------------------------------------------------------------- /main/admin.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | from .models import ( 3 | Categoria, 4 | Conferencia, 5 | ConferenciaItens, 6 | Corredor, 7 | Filial, 8 | Funcionario, 9 | Produto, 10 | Validade_Produto, 11 | ) 12 | 13 | 14 | @admin.register(Funcionario) 15 | class Funcionario(admin.ModelAdmin): 16 | fields = ('cargo', 'usuario', 'filial', ) 17 | list_display = ('id', 'usuario', 'cargo', 'slug_filial', 'first_name') 18 | 19 | def slug_filial(self, obj): 20 | return obj.filial.slug 21 | 22 | def first_name(self, obj): 23 | return obj.usuario.first_name 24 | 25 | 26 | @admin.register(Filial) 27 | class Filial(admin.ModelAdmin): 28 | fields = ('nome', 'slug') 29 | list_display = ('nome',) 30 | 31 | 32 | @admin.register(Corredor) 33 | class Corredor(admin.ModelAdmin): 34 | fields = ('nome', 'descricao', 'filial', 'slug',) 35 | list_display = ('id', 'nome', 'descricao', 'slug', 'slug_filial',) 36 | 37 | prepopulated_fields = {'slug': ('filial', 'nome',)} 38 | 39 | search_fields = ['descricao'] # Campo de busca 40 | 41 | # retorna o slug_filial no display 42 | def slug_filial(self, obj): 43 | return obj.filial.slug 44 | 45 | def get_queryset(self, request): 46 | return super(Corredor, self).get_queryset(request).select_related('filial') 47 | 48 | 49 | @admin.register(Categoria) 50 | class Categoria(admin.ModelAdmin): 51 | fields = ('descricao',) 52 | list_display = ('descricao',) 53 | 54 | 55 | @admin.register(Produto) 56 | class Produto(admin.ModelAdmin): 57 | fields = ('codigo', 'codigo_barras', 'descricao', 'preco_venda', 'categoria', 'slug',) 58 | list_display = ('id', 'descricao', 'codigo_barras', 'categoria',) 59 | 60 | prepopulated_fields = {'slug': ('codigo', 'descricao',)} 61 | 62 | 63 | class ConferenciaItensInline(admin.TabularInline): 64 | list_display = ('conferencia', 'produto', 'quantidade', 'data_validade') 65 | model = ConferenciaItens 66 | extra = 0 67 | 68 | 69 | @admin.register(Conferencia) 70 | class Conferencia(admin.ModelAdmin): 71 | fields = ('funcionario', 'corredor',) 72 | list_display = ('id', 'funcionario', 'data_conferencia', 'slug_corredor',) 73 | inlines = (ConferenciaItensInline,) 74 | 75 | def slug_corredor(self, obj): 76 | return obj.corredor.slug 77 | 78 | 79 | @admin.register(Validade_Produto) 80 | class Validade_Produto(admin.ModelAdmin): 81 | fields = ('conferencia', 'codigo_barras', 'data_validade', 'quantidade',) 82 | list_display = ('conferencia', 'codigo_barras', 'data_validade',) 83 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Byte-compiled / optimized / DLL files 2 | __pycache__/ 3 | *.py[cod] 4 | *$py.class 5 | 6 | # C extensions 7 | *.so 8 | 9 | # Distribution / packaging 10 | .Python 11 | build/ 12 | develop-eggs/ 13 | dist/ 14 | downloads/ 15 | eggs/ 16 | .eggs/ 17 | lib/ 18 | lib64/ 19 | parts/ 20 | sdist/ 21 | var/ 22 | wheels/ 23 | pip-wheel-metadata/ 24 | share/python-wheels/ 25 | *.egg-info/ 26 | .installed.cfg 27 | *.egg 28 | MANIFEST 29 | 30 | # PyInstaller 31 | # Usually these files are written by a python script from a template 32 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 33 | *.manifest 34 | *.spec 35 | 36 | # Installer logs 37 | pip-log.txt 38 | pip-delete-this-directory.txt 39 | 40 | # Unit test / coverage reports 41 | htmlcov/ 42 | .tox/ 43 | .nox/ 44 | .coverage 45 | .coverage.* 46 | .cache 47 | nosetests.xml 48 | coverage.xml 49 | *.cover 50 | *.py,cover 51 | .hypothesis/ 52 | .pytest_cache/ 53 | 54 | # Translations 55 | *.mo 56 | *.pot 57 | 58 | # Django stuff: 59 | *.log 60 | local_settings.py 61 | db.sqlite3 62 | db.sqlite3-journal 63 | 64 | # Flask stuff: 65 | instance/ 66 | .webassets-cache 67 | 68 | # Scrapy stuff: 69 | .scrapy 70 | 71 | # Sphinx documentation 72 | docs/_build/ 73 | 74 | # PyBuilder 75 | target/ 76 | 77 | # Jupyter Notebook 78 | .ipynb_checkpoints 79 | 80 | # IPython 81 | profile_default/ 82 | ipython_config.py 83 | 84 | # pyenv 85 | .python-version 86 | 87 | # pipenv 88 | # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. 89 | # However, in case of collaboration, if having platform-specific dependencies or dependencies 90 | # having no cross-platform support, pipenv may install dependencies that don't work, or not 91 | # install all needed dependencies. 92 | #Pipfile.lock 93 | 94 | # PEP 582; used by e.g. github.com/David-OConnor/pyflow 95 | __pypackages__/ 96 | 97 | # Celery stuff 98 | celerybeat-schedule 99 | celerybeat.pid 100 | 101 | # SageMath parsed files 102 | *.sage.py 103 | 104 | # Environments 105 | .env 106 | .venv 107 | env/ 108 | venv/ 109 | ENV/ 110 | env.bak/ 111 | venv.bak/ 112 | 113 | # Spyder project settings 114 | .spyderproject 115 | .spyproject 116 | 117 | # Rope project settings 118 | .ropeproject 119 | 120 | # mkdocs documentation 121 | /site 122 | 123 | # mypy 124 | .mypy_cache/ 125 | .dmypy.json 126 | dmypy.json 127 | 128 | # Pyre type checker 129 | .pyre/ 130 | 131 | .DS_Store 132 | 133 | media/ 134 | staticfiles/ 135 | .idea 136 | .ipynb_checkpoints/ 137 | .vscode 138 | -------------------------------------------------------------------------------- /main/templates/main/base.html: -------------------------------------------------------------------------------- 1 | {% load static %} 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | {% block title %} {% endblock %} 13 | 14 | 15 | {% if user.is_authenticated %} 16 | 17 | 56 | 57 | {% endif %} 58 | 59 |
60 | {% block content%} 61 | 62 | {% endblock %} 63 |
64 | 65 | 66 | 67 | 68 | 69 | 70 | -------------------------------------------------------------------------------- /appvalidade/settings.py: -------------------------------------------------------------------------------- 1 | """ 2 | Django settings for appvalidade project. 3 | 4 | Generated by 'django-admin startproject' using Django 3.2. 5 | 6 | For more information on this file, see 7 | https://docs.djangoproject.com/en/3.2/topics/settings/ 8 | 9 | For the full list of settings and their values, see 10 | https://docs.djangoproject.com/en/3.2/ref/settings/ 11 | """ 12 | 13 | from pathlib import Path 14 | import os 15 | 16 | # Build paths inside the project like this: BASE_DIR / 'subdir'. 17 | BASE_DIR = Path(__file__).resolve().parent.parent 18 | 19 | 20 | # Quick-start development settings - unsuitable for production 21 | # See https://docs.djangoproject.com/en/3.2/howto/deployment/checklist/ 22 | 23 | # SECURITY WARNING: keep the secret key used in production secret! 24 | SECRET_KEY = 'django-insecure-xkg&fg&ez=i9k2#q%^5_e=g!9(5xhgru1*j11_5hur2k!wob7f' 25 | 26 | # SECURITY WARNING: don't run with debug turned on in production! 27 | DEBUG = True 28 | 29 | ALLOWED_HOSTS = ['*'] 30 | 31 | 32 | # Application definition 33 | 34 | INSTALLED_APPS = [ 35 | 'django.contrib.admin', 36 | 'django.contrib.auth', 37 | 'django.contrib.contenttypes', 38 | 'django.contrib.sessions', 39 | 'django.contrib.messages', 40 | 'django.contrib.staticfiles', 41 | 'main.apps.MainConfig', 42 | 'bootstrapform', 43 | ] 44 | 45 | MIDDLEWARE = [ 46 | 'django.middleware.security.SecurityMiddleware', 47 | 'django.contrib.sessions.middleware.SessionMiddleware', 48 | 'django.middleware.common.CommonMiddleware', 49 | 'django.middleware.csrf.CsrfViewMiddleware', 50 | 'django.contrib.auth.middleware.AuthenticationMiddleware', 51 | 'django.contrib.messages.middleware.MessageMiddleware', 52 | 'django.middleware.clickjacking.XFrameOptionsMiddleware', 53 | ] 54 | 55 | ROOT_URLCONF = 'appvalidade.urls' 56 | 57 | TEMPLATES = [ 58 | { 59 | 'BACKEND': 'django.template.backends.django.DjangoTemplates', 60 | 'DIRS': [os.path.join(BASE_DIR, 'templates')], 61 | 'APP_DIRS': True, 62 | 'OPTIONS': { 63 | 'context_processors': [ 64 | 'django.template.context_processors.debug', 65 | 'django.template.context_processors.request', 66 | 'django.contrib.auth.context_processors.auth', 67 | 'django.contrib.messages.context_processors.messages', 68 | ], 69 | }, 70 | }, 71 | ] 72 | 73 | WSGI_APPLICATION = 'appvalidade.wsgi.application' 74 | 75 | 76 | # Database 77 | # https://docs.djangoproject.com/en/3.2/ref/settings/#databases 78 | 79 | DATABASES = { 80 | 'default': { 81 | 'ENGINE': 'django.db.backends.sqlite3', 82 | 'NAME': BASE_DIR / 'appValidade.sqlite3', 83 | } 84 | } 85 | 86 | 87 | # Password validation 88 | # https://docs.djangoproject.com/en/3.2/ref/settings/#auth-password-validators 89 | 90 | AUTH_PASSWORD_VALIDATORS = [ 91 | { 92 | 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', 93 | }, 94 | { 95 | 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', 96 | }, 97 | { 98 | 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', 99 | }, 100 | { 101 | 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', 102 | }, 103 | ] 104 | 105 | 106 | # Internationalization 107 | # https://docs.djangoproject.com/en/3.2/topics/i18n/ 108 | 109 | LANGUAGE_CODE = 'pt-br' 110 | 111 | TIME_ZONE = 'America/Rio_Branco' 112 | 113 | USE_I18N = True 114 | 115 | USE_L10N = True 116 | 117 | USE_TZ = False 118 | 119 | 120 | # Static files (CSS, JavaScript, Images) 121 | # https://docs.djangoproject.com/en/3.2/howto/static-files/ 122 | 123 | STATIC_URL = '/static/' 124 | 125 | # Default primary key field type 126 | # https://docs.djangoproject.com/en/3.2/ref/settings/#default-auto-field 127 | 128 | DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' 129 | 130 | LOGIN_REDIRECT_URL = '/' 131 | 132 | LOGOUT_REDIRECT_URL = '/accounts/login' -------------------------------------------------------------------------------- /main/models.py: -------------------------------------------------------------------------------- 1 | from django.db import models 2 | from django.contrib.auth.models import User 3 | from django.urls import reverse # Importa o módulo responsável por retornar o url reverso 4 | 5 | 6 | class TimeStampedModel(models.Model): 7 | created = models.DateTimeField( 8 | 'criado em', 9 | auto_now_add=True, 10 | auto_now=False 11 | ) 12 | modified = models.DateTimeField( 13 | 'modificado em', 14 | auto_now_add=False, 15 | auto_now=True 16 | ) 17 | 18 | class Meta: 19 | abstract = True 20 | 21 | 22 | class Filial(models.Model): 23 | # id automático 24 | nome = models.CharField(max_length=30) 25 | slug = models.SlugField(max_length=30, unique=True) 26 | 27 | class Meta: 28 | verbose_name_plural = 'Filiais' 29 | ordering = ['nome'] 30 | 31 | def __str__(self): 32 | return str(self.nome) 33 | 34 | 35 | class Funcionario(models.Model): 36 | # Chave estrangeira para o perfil, usando o model User default 37 | usuario = models.OneToOneField(User, related_name='profile', on_delete=models.CASCADE) 38 | filial = models.ForeignKey(Filial, default=1, related_name='filial_funcionario', on_delete=models.CASCADE) 39 | cargo = models.CharField(max_length=20) 40 | #slug = models.SlugField(max_length=50, unique=True) 41 | 42 | class Meta: 43 | ordering = ['usuario'] 44 | 45 | def __str__(self): 46 | return str(self.usuario) 47 | 48 | 49 | class Corredor(models.Model): 50 | # id automático 51 | nome = models.CharField(max_length=30) 52 | slug = models.SlugField(max_length=30, unique=True) 53 | descricao = models.CharField(max_length=50) 54 | filial = models.ForeignKey(Filial, default=1, related_name='filial_corredor', on_delete=models.CASCADE) 55 | 56 | class Meta: 57 | verbose_name_plural = 'Corredores' 58 | ordering = ['nome'] 59 | 60 | def __str__(self): 61 | filial = str(self.filial) 62 | corredor = str(self.nome) 63 | return str(filial + ' - ' + corredor) 64 | 65 | 66 | class Categoria(models.Model): 67 | # id automático 68 | descricao = models.CharField(max_length=255, unique=True) 69 | 70 | class Meta: 71 | ordering = ['descricao'] 72 | 73 | def __str__(self): 74 | return self.descricao 75 | 76 | 77 | class Produto(models.Model): 78 | # id automático 79 | codigo = models.IntegerField(unique=True) 80 | codigo_barras = models.IntegerField(unique=True) 81 | descricao = models.CharField(max_length=255, unique=False) 82 | preco_venda = models.DecimalField(decimal_places=2, max_digits=6) 83 | categoria = models.ForeignKey(Categoria, on_delete=models.CASCADE) 84 | slug = models.SlugField(max_length=255, unique=True) 85 | 86 | class Meta: 87 | verbose_name_plural = 'Produtos' 88 | 89 | def __str__(self): 90 | 91 | # Sempre que printar o id do objeto, irá retornar codigo_barras + descricao 92 | 93 | cod = str(self.codigo_barras) 94 | desc = self.descricao 95 | return str(cod + ' - ' + desc) 96 | 97 | def get_absolute_url(self): 98 | # app_name:nome_do_url, kwargs = {"campo_bd":"self.campo_bd"} 99 | return reverse("main:detalhes_produtos", kwargs={"slug": self.slug}) 100 | 101 | 102 | class Conferencia(models.Model): 103 | # id automático 104 | funcionario = models.ForeignKey(Funcionario, on_delete=models.CASCADE) 105 | corredor = models.ForeignKey(Corredor, on_delete=models.CASCADE) 106 | data_conferencia = models.DateField(auto_now_add=True) 107 | 108 | def __str__(self): 109 | cod = str(self.id) 110 | data = str(self.data_conferencia) 111 | return str(cod + ' - ' + data) 112 | 113 | def get_absolute_url(self): 114 | return reverse("main:detalhes_conferencia", kwargs={"id": self.id}) 115 | 116 | 117 | class Validade_Produto(models.Model): 118 | # id automático 119 | conferencia = models.ForeignKey(Conferencia, on_delete=models.CASCADE, unique=False) 120 | codigo_barras = models.ForeignKey(Produto, on_delete=models.CASCADE, unique=False) 121 | data_validade = models.DateField(unique=False) 122 | quantidade = models.IntegerField() 123 | 124 | ''' 125 | def get_absolute_url(self): 126 | return reverse("main/detalhes_conferencia", kwargs={"id": self.id}) 127 | ''' 128 | 129 | 130 | class ConferenciaItens(TimeStampedModel): 131 | conferencia = models.ForeignKey( 132 | Conferencia, 133 | on_delete=models.CASCADE 134 | ) 135 | produto = models.ForeignKey( 136 | Produto, 137 | on_delete=models.CASCADE 138 | ) 139 | quantidade = models.PositiveSmallIntegerField() 140 | data_validade = models.DateField() 141 | 142 | class Meta: 143 | ordering = ('-created',) 144 | verbose_name = 'conferência item' 145 | verbose_name_plural = 'conferência itens' 146 | 147 | def __str__(self): 148 | return f'{self.produto}' 149 | -------------------------------------------------------------------------------- /main/views.py: -------------------------------------------------------------------------------- 1 | from django.shortcuts import render, get_object_or_404, redirect 2 | from django.contrib.auth.decorators import login_required 3 | from django.http import HttpResponse 4 | 5 | from django.urls import reverse 6 | 7 | from django.core.exceptions import ValidationError 8 | 9 | # from django.forms.models import inlineformset_factory 10 | 11 | # DetailView -> Lista os detalhes 12 | # ListView -> Lista os posts 13 | 14 | # from django.views.generic import DetailView, ListView 15 | 16 | from .models import Produto, Conferencia, Validade_Produto, Funcionario 17 | from .filters import * 18 | from .forms import ConferenciaForm, ValidadeProdutoForm 19 | 20 | ''' 21 | class ProdutoListView(ListView): 22 | model = Produto 23 | 24 | class ProdutoDetailView(DetailView): 25 | model = Produto 26 | 27 | class ConferenciaListView(ListView): 28 | model = Conferencia 29 | 30 | class ConferenciaDetailView(DetailView): 31 | model = Conferencia 32 | 33 | class ValidadeProdutoListView(ListView): 34 | model = Validade_Produto 35 | 36 | class ValidadeProdutoDetailView(DetailView): 37 | model = Validade_Produto 38 | ''' 39 | 40 | ''' 41 | def produto_list(request): 42 | produtos = Produto.objects.all().order_by('codigo') # Pega todos os produtos 43 | return render(request, 'main/produto_list.html', {'produtos': produtos}) 44 | 45 | def produto_detalhes(request, slug): 46 | produto = get_object_or_404(Produto, slug=slug) 47 | return render(request, 'main/produto_detail.html', {'produto':produto}) 48 | ''' 49 | @login_required 50 | def index(request): 51 | #form = Funcionario.objects.get(id=4) 52 | return render(request, 'main/index.html') 53 | 54 | @login_required 55 | def conferencia_list(request): 56 | conferencias = Conferencia.objects.all() 57 | filtro = ConferenciaFilter(request.GET, queryset = conferencias) 58 | conferencias = filtro.qs 59 | return render(request, 'main/conferencia_list.html', {'conferencias': conferencias, 'filtro': filtro}) 60 | 61 | ''' 62 | @login_required 63 | def produto_list(requsest, codigo_barras): 64 | produtos = Produto.objects.all() 65 | filtro = ProdutoFilter(request.GET, queryset = produtos) 66 | produtos = filtro.qs 67 | 68 | return render(request, 'main/produto_list.html', {'Produtos': produtos, 'filtro': filtro}) 69 | ''' 70 | 71 | @login_required 72 | def detalhes_conferencia(request, id): 73 | # conferencia = get_object_or_404(Validade_Produto, id=id) 74 | produtos_conferencia = Validade_Produto.objects.filter(conferencia_id = id).order_by('codigo_barras') 75 | print("detalhes_conferencia") 76 | return render(request, 'main/conferencia_detail.html', {'produtos_conferencia':produtos_conferencia}) 77 | 78 | @login_required 79 | def nova_conferencia(request): 80 | print("nova_conferencia") 81 | formulario_conferencia = ConferenciaForm() 82 | print(request.method) 83 | 84 | if request.method == 'POST': 85 | print("if") 86 | formulario_conferencia = ConferenciaForm(request.POST) 87 | 88 | if(formulario_conferencia.is_valid()): 89 | print("válido") 90 | nova_conferencia = formulario_conferencia.save(commit=False) 91 | func_id = request.user.id 92 | funcionario = Funcionario.objects.get(usuario_id = func_id) 93 | corredor_conferencia = formulario_conferencia.cleaned_data['corredor'] 94 | 95 | nova_conferencia = Conferencia(corredor = corredor_conferencia, funcionario=funcionario) 96 | nova_conferencia.save() 97 | 98 | id_conferencia = nova_conferencia.id 99 | 100 | print('func: ',func_id) 101 | print('corredor: ',corredor_conferencia) 102 | context = {'id_conf': id_conferencia} 103 | print(context) 104 | # print(reverse('detalhes_conferencia', id_conferencia)) 105 | #else: 106 | #print(formulario_validade_produtos.errors) 107 | 108 | # return redirect(reverse('detalhes_conferencia', id_conferencia)) 109 | # return redirect('/conferencias/'+str(id_conferencia)) # redirecionar para a página de adição de itens 110 | return redirect('/nova-conferencia-itens/') # redirecionar para a página de adição de itens 111 | 112 | elif(request.method == 'GET'): 113 | formulario_conferencia = ConferenciaForm() 114 | 115 | # Se for um get, redireciona pra página de nova conferência 116 | return render(request, 'main/nova_conferencia.html', {'form': formulario_conferencia}) 117 | 118 | def nova_conferecia_itens(request): 119 | form = ValidadeProdutoForm() 120 | 121 | if request.method == 'POST': 122 | print('método post') 123 | formulario_validade_produtos = ConferenciaForm(request.POST) 124 | 125 | if (formulario_validade_produtos.is_valid()): 126 | codigo_barras = formulario_validade_produtos.cleaned_data['data_barras'] 127 | data_validade = formulario_validade_produtos.cleaned_data['data_validade'] 128 | quantidade = formulario_validade_produtos.cleaned_data['validade'] 129 | 130 | produto = Validade_Produto( 131 | codigo_barras=codigo_barras, 132 | conferencia=id_conferencias, 133 | data_validade=data_validade, 134 | quantidade=quantidade) 135 | 136 | return render(request, 'main/nova_conferencia_itens.html', {'form': formulario_validade_produtos}) 137 | 138 | elif request.method == 'GET': 139 | form = ValidadeProdutoForm() 140 | 141 | return render(request, 'main/nova_conferencia_itens.html', {'form': form}) 142 | 143 | 144 | def busca_produto(request, codigo_barras): 145 | produto = Produto.objects.get(codigo_barras=codigo_barras) 146 | 147 | 148 | 149 | ''' 150 | print(formulario_validade_produtos['codigo_barras'].value()) 151 | campo_codigo = formulario_validade_produtos['codigo_barras'].value() 152 | 153 | try: 154 | produto = Produto.objects.get(codigo_barras='7894561230') 155 | except Produto.DoesNotExist: 156 | raise ValidationError("Produto não encontrado") 157 | ''' 158 | 159 | ''' 160 | codigo = produto 161 | data_validade = formulario_validade_produtos.cleaned_data['data_validade'] 162 | quantidade = formulario_validade_produtos.cleaned_data['quantidade'] 163 | 164 | print(codigo) 165 | print(data_validade) 166 | print(quantidade) 167 | 168 | produto = Validade_Produto(codigo_barras=codigo, conferencia=nova_conferencia, data_validade=data_validade, quantidade=quantidade) 169 | produto.save() 170 | ''' --------------------------------------------------------------------------------