first commit
This commit is contained in:
42
Movement/Forms/FormsCalendar.py
Normal file
42
Movement/Forms/FormsCalendar.py
Normal file
@@ -0,0 +1,42 @@
|
||||
from django import forms
|
||||
from Movement import models
|
||||
from django.utils import timezone
|
||||
|
||||
class FormsCalendar(forms.ModelForm):
|
||||
class Meta:
|
||||
model = models.Calendar
|
||||
fields = [
|
||||
'client',
|
||||
'date',
|
||||
'time',
|
||||
'service',
|
||||
'pay_method',
|
||||
'professional',
|
||||
'first_time',
|
||||
# 'gross_value',
|
||||
# 'net_value',
|
||||
# 'value_cash',
|
||||
# 'prof_money',
|
||||
]
|
||||
widgets = {
|
||||
'client': forms.Select({'class': 'form-select'}),
|
||||
'time': forms.DateInput(format=('%Y-%m-%d'), attrs={'type': 'time', 'class': '',
|
||||
'value': timezone.localtime(timezone.now()).time()
|
||||
}),
|
||||
'date': forms.DateInput(format=('%Y-%m-%d'), attrs={'type': 'date', 'class':'',
|
||||
'value':timezone.localtime(timezone.now()).date()
|
||||
}),
|
||||
'service': forms.Select({'class': 'form-select'}),
|
||||
'pay_method': forms.Select({'class': 'form-select'}),
|
||||
'professional': forms.Select({'class': 'form-select'}),
|
||||
'first_time': forms.CheckboxInput({'class': ''}),
|
||||
}
|
||||
labels={
|
||||
'client':'Cliente',
|
||||
'date':'Data',
|
||||
'time':'Hora',
|
||||
'service':'Serviço',
|
||||
'pay_method':'Pagamento',
|
||||
'professional':'Profissional',
|
||||
'first_time':'Primeira Vez',
|
||||
}
|
||||
34
Movement/Forms/FormsExpense.py
Normal file
34
Movement/Forms/FormsExpense.py
Normal file
@@ -0,0 +1,34 @@
|
||||
from django import forms
|
||||
from Movement import models
|
||||
from django.utils import timezone
|
||||
|
||||
class FormsExpense(forms.ModelForm):
|
||||
class Meta:
|
||||
model = models.Expense
|
||||
fields = [
|
||||
'date',
|
||||
'chart_of_account',
|
||||
'bank',
|
||||
'firm',
|
||||
'professional',
|
||||
'gross_value',
|
||||
]
|
||||
widgets = {
|
||||
'date': forms.DateInput(format=('%Y-%m-%d'), attrs={'type': 'date', 'class': '',
|
||||
'value': timezone.localtime(timezone.now()).date()
|
||||
}),
|
||||
'chart_of_account': forms.Select({'class': 'form-select'}),
|
||||
'bank': forms.Select({'class': 'form-select'}),
|
||||
'firm': forms.CheckboxInput({'class': ''}),
|
||||
'professional': forms.Select({'class': 'form-select'}),
|
||||
'gross_value': forms.NumberInput(attrs={'step': 1}),
|
||||
|
||||
}
|
||||
labels={
|
||||
'date':'Data',
|
||||
'chart_of_account':'Plano de contas',
|
||||
'bank':'Banco',
|
||||
'firm':'Firma',
|
||||
'gross_value':'Valor',
|
||||
'professional':'Profissional',
|
||||
}
|
||||
39
Movement/Forms/FormsProduct.py
Normal file
39
Movement/Forms/FormsProduct.py
Normal file
@@ -0,0 +1,39 @@
|
||||
from django import forms
|
||||
from Movement import models
|
||||
from django.utils import timezone
|
||||
|
||||
class FormsProduct(forms.ModelForm):
|
||||
class Meta:
|
||||
model = models.Product
|
||||
fields = [
|
||||
'client',
|
||||
'date',
|
||||
'product',
|
||||
'quantity',
|
||||
'pay_method',
|
||||
'professional',
|
||||
# 'gross_value',
|
||||
# 'net_value',
|
||||
|
||||
]
|
||||
widgets = {
|
||||
'client': forms.Select({'class': 'form-select'}),
|
||||
'date': forms.DateInput(format=('%Y-%m-%d'), attrs={'type': 'date', 'class':'',
|
||||
'value':timezone.localtime(timezone.now()).date()
|
||||
}),
|
||||
'product': forms.Select({'class': 'form-select'}),
|
||||
'pay_method': forms.Select({'class': 'form-select'}),
|
||||
'professional': forms.Select({'class': 'form-select'}),
|
||||
'quantity': forms.NumberInput(attrs={'step': 1}, ),
|
||||
# 'gross_value': forms.NumberInput(attrs={'step': 1}),
|
||||
# 'net_value': forms.NumberInput(attrs={'step': 1}),
|
||||
}
|
||||
labels={
|
||||
'client':'Cliente',
|
||||
'date':'Data',
|
||||
'product':'Produto',
|
||||
'pay_method':'M. Pagamento',
|
||||
'professional':'Profissional',
|
||||
'quantity':'Quantiddade',
|
||||
# 'net_value':'Valor Liquido',
|
||||
}
|
||||
33
Movement/Forms/FormsStock.py
Normal file
33
Movement/Forms/FormsStock.py
Normal file
@@ -0,0 +1,33 @@
|
||||
from django import forms
|
||||
from Movement import models
|
||||
from django.utils import timezone
|
||||
|
||||
class FormsStock(forms.ModelForm):
|
||||
class Meta:
|
||||
model = models.Stock
|
||||
fields = [
|
||||
'date',
|
||||
'product',
|
||||
'quantity',
|
||||
'gross_value',
|
||||
'bank',
|
||||
'notes',
|
||||
]
|
||||
widgets = {
|
||||
'date': forms.DateInput(format=('%Y-%m-%d'), attrs={'type': 'date', 'class':'',
|
||||
'value':timezone.localtime(timezone.now()).date()
|
||||
}),
|
||||
'product': forms.Select({'class': 'form-select'}),
|
||||
'quantity': forms.NumberInput(attrs={'step': 1}),
|
||||
'gross_value': forms.NumberInput(attrs={'step': 1}),
|
||||
'bank': forms.Select({'class': 'form-select'}),
|
||||
'notes': forms.Textarea({'class': 'form-control', 'rows': 3, }),
|
||||
}
|
||||
labels={
|
||||
'date':'Data',
|
||||
'product':'Produto',
|
||||
'quantity':'Quantidade',
|
||||
'gross_value':'Valor',
|
||||
'bank':'Banco',
|
||||
'notes':'Notas',
|
||||
}
|
||||
BIN
Movement/Forms/__pycache__/FormsCalendar.cpython-312.pyc
Normal file
BIN
Movement/Forms/__pycache__/FormsCalendar.cpython-312.pyc
Normal file
Binary file not shown.
BIN
Movement/Forms/__pycache__/FormsExpense.cpython-312.pyc
Normal file
BIN
Movement/Forms/__pycache__/FormsExpense.cpython-312.pyc
Normal file
Binary file not shown.
BIN
Movement/Forms/__pycache__/FormsProduct.cpython-312.pyc
Normal file
BIN
Movement/Forms/__pycache__/FormsProduct.cpython-312.pyc
Normal file
Binary file not shown.
BIN
Movement/Forms/__pycache__/FormsStock.cpython-312.pyc
Normal file
BIN
Movement/Forms/__pycache__/FormsStock.cpython-312.pyc
Normal file
Binary file not shown.
BIN
Movement/Urls/__pycache__/urlsCalendar.cpython-312.pyc
Normal file
BIN
Movement/Urls/__pycache__/urlsCalendar.cpython-312.pyc
Normal file
Binary file not shown.
BIN
Movement/Urls/__pycache__/urlsExpense.cpython-312.pyc
Normal file
BIN
Movement/Urls/__pycache__/urlsExpense.cpython-312.pyc
Normal file
Binary file not shown.
BIN
Movement/Urls/__pycache__/urlsProduct.cpython-312.pyc
Normal file
BIN
Movement/Urls/__pycache__/urlsProduct.cpython-312.pyc
Normal file
Binary file not shown.
BIN
Movement/Urls/__pycache__/urlsStock.cpython-312.pyc
Normal file
BIN
Movement/Urls/__pycache__/urlsStock.cpython-312.pyc
Normal file
Binary file not shown.
16
Movement/Urls/urlsCalendar.py
Normal file
16
Movement/Urls/urlsCalendar.py
Normal file
@@ -0,0 +1,16 @@
|
||||
from django.urls import path
|
||||
# from django.contrib.auth import views as auth_views
|
||||
from Movement.Views import (
|
||||
viewsCalendar ,
|
||||
viewsCalendarCreateCustom
|
||||
)
|
||||
|
||||
urlpatterns = [
|
||||
# URLs de Professional
|
||||
path('/', viewsCalendar.CalendarListView.as_view(), name='MovCalendarListView'),
|
||||
# path('/Create', viewsCalendar.CalendarCreateView.as_view(), name='CalendarCreateView'),
|
||||
path('/<int:pk>/Detail', viewsCalendar.CalendarDetailView.as_view(), name='MovCalendarDetailView'),
|
||||
path('/<int:pk>/Update', viewsCalendar.CalendarUpdateView.as_view(), name='MovCalendarUpdateView'),
|
||||
path('/<int:pk>/Delete', viewsCalendar.CalendarDeleteView.as_view(), name='MovCalendarDeleteView'),
|
||||
path('/CreateCuston', viewsCalendarCreateCustom.CalendarCreateCustomView.as_view(), name='MovCalendarCreateCustom'),
|
||||
]
|
||||
16
Movement/Urls/urlsExpense.py
Normal file
16
Movement/Urls/urlsExpense.py
Normal file
@@ -0,0 +1,16 @@
|
||||
from django.urls import path
|
||||
# from django.contrib.auth import views as auth_views
|
||||
from Movement.Views import (
|
||||
viewsExpense ,
|
||||
)
|
||||
|
||||
urlpatterns = [
|
||||
# URLs de Professional
|
||||
path('/', viewsExpense.ExpenseListView.as_view(), name='MovExpenseListView'),
|
||||
path('/Create', viewsExpense.ExpenseCreateView.as_view(), name='MovExpenseCreateView'),
|
||||
path('/<int:pk>/Detail', viewsExpense.ExpenseDetailView.as_view(), name='MovExpenseDetailView'),
|
||||
path('/<int:pk>/Update', viewsExpense.ExpenseUpdateView.as_view(), name='MovExpenseUpdateView'),
|
||||
path('/<int:pk>/Delete', viewsExpense.ExpenseDeleteView.as_view(), name='MovExpenseDeleteView'),
|
||||
path('/CreateFirm', viewsExpense.ExpenseFirmCreateView.as_view(), name='MovExpenseFirmCreateView'),
|
||||
path('/CreateProf', viewsExpense.ExpenseProfCreateView.as_view(), name='MovExpenseProfCreateView'),
|
||||
]
|
||||
16
Movement/Urls/urlsProduct.py
Normal file
16
Movement/Urls/urlsProduct.py
Normal file
@@ -0,0 +1,16 @@
|
||||
from django.urls import path
|
||||
# from django.contrib.auth import views as auth_views
|
||||
from Movement.Views import (
|
||||
viewsProduct ,
|
||||
viewsProductCreateCustom
|
||||
)
|
||||
|
||||
urlpatterns = [
|
||||
# URLs de Professional
|
||||
path('/', viewsProduct.ProductListView.as_view(), name='MovProductListView'),
|
||||
# path('/Create', viewsProduct.ProductCreateView.as_view(), name='MovProductCreateView'),
|
||||
path('/<int:pk>/Detail', viewsProduct.ProductDetailView.as_view(), name='MovProductDetailView'),
|
||||
path('/<int:pk>/Update', viewsProduct.ProductUpdateView.as_view(), name='MovProductUpdateView'),
|
||||
path('/<int:pk>/Delete', viewsProduct.ProductDeleteView.as_view(), name='MovProductDeleteView'),
|
||||
path('/CreateCuston', viewsProductCreateCustom.ProductCreateCustomView.as_view(), name='MovProductCreateCustom'),
|
||||
]
|
||||
15
Movement/Urls/urlsStock.py
Normal file
15
Movement/Urls/urlsStock.py
Normal file
@@ -0,0 +1,15 @@
|
||||
from django.urls import path
|
||||
# from django.contrib.auth import views as auth_views
|
||||
from Movement.Views import (
|
||||
viewsStock ,
|
||||
)
|
||||
|
||||
urlpatterns = [
|
||||
# URLs de Professional
|
||||
path('/', viewsStock.StockListView.as_view(), name='MovStockListView'),
|
||||
path('/Create', viewsStock.StockCreateView.as_view(), name='MovStockCreateView'),
|
||||
path('/<int:pk>/Detail', viewsStock.StockDetailView.as_view(), name='MovStockDetailView'),
|
||||
path('/<int:pk>/Update', viewsStock.StockUpdateView.as_view(), name='MovStockUpdateView'),
|
||||
path('/<int:pk>/Delete', viewsStock.StockDeleteView.as_view(), name='MovStockDeleteView'),
|
||||
# path('/CreateCuston', viewsStockCreateCustom.StockCreateCustomView.as_view(), name='MovStockCreateCustom'),
|
||||
]
|
||||
BIN
Movement/Views/__pycache__/viewsCalendar.cpython-312.pyc
Normal file
BIN
Movement/Views/__pycache__/viewsCalendar.cpython-312.pyc
Normal file
Binary file not shown.
Binary file not shown.
BIN
Movement/Views/__pycache__/viewsExpense.cpython-312.pyc
Normal file
BIN
Movement/Views/__pycache__/viewsExpense.cpython-312.pyc
Normal file
Binary file not shown.
BIN
Movement/Views/__pycache__/viewsProduct.cpython-312.pyc
Normal file
BIN
Movement/Views/__pycache__/viewsProduct.cpython-312.pyc
Normal file
Binary file not shown.
Binary file not shown.
BIN
Movement/Views/__pycache__/viewsStock.cpython-312.pyc
Normal file
BIN
Movement/Views/__pycache__/viewsStock.cpython-312.pyc
Normal file
Binary file not shown.
39
Movement/Views/viewsCalendar.py
Normal file
39
Movement/Views/viewsCalendar.py
Normal file
@@ -0,0 +1,39 @@
|
||||
from django.views.generic import ListView, CreateView, UpdateView, DeleteView, DetailView
|
||||
from django.contrib.auth.mixins import LoginRequiredMixin, PermissionRequiredMixin
|
||||
from Movement.Forms import FormsCalendar
|
||||
from Movement import models
|
||||
from django.urls import reverse_lazy
|
||||
from django.utils import timezone
|
||||
|
||||
class CalendarListView(LoginRequiredMixin, PermissionRequiredMixin, ListView):
|
||||
model = models.Calendar
|
||||
template_name = 'Calendar/List.html'
|
||||
context_object_name = 'Calendar'
|
||||
paginate_by = 10
|
||||
permission_required = 'Base.view_'
|
||||
def get_queryset(self):
|
||||
queryset = super().get_queryset()
|
||||
date = self.request.GET.get('date')
|
||||
if date:
|
||||
queryset = queryset.filter(date__icontains=date)
|
||||
else:
|
||||
queryset = queryset.filter(date__icontains=timezone.localdate())
|
||||
return queryset
|
||||
|
||||
class CalendarDetailView(LoginRequiredMixin, PermissionRequiredMixin, DetailView):
|
||||
model = models.Calendar
|
||||
template_name = 'Calendar/Detail.html'
|
||||
permission_required = 'Base.view_'
|
||||
|
||||
class CalendarUpdateView(LoginRequiredMixin, PermissionRequiredMixin, UpdateView):
|
||||
model = models.Calendar
|
||||
template_name = 'Calendar/Update.html'
|
||||
form_class = FormsCalendar.FormsCalendar
|
||||
success_url = reverse_lazy('MovCalendarListView')
|
||||
permission_required = 'Base.change_'
|
||||
|
||||
class CalendarDeleteView(LoginRequiredMixin, PermissionRequiredMixin, DeleteView):
|
||||
model = models.Calendar
|
||||
template_name = 'Calendar/Delete.html'
|
||||
success_url = reverse_lazy('MovCalendarListView')
|
||||
permission_required = 'Base.delete_'
|
||||
54
Movement/Views/viewsCalendarCreateCustom.py
Normal file
54
Movement/Views/viewsCalendarCreateCustom.py
Normal file
@@ -0,0 +1,54 @@
|
||||
from django.views.generic import ListView, CreateView, UpdateView, DeleteView, DetailView
|
||||
from django.contrib.auth.mixins import LoginRequiredMixin, PermissionRequiredMixin
|
||||
from Movement.Forms import FormsCalendar
|
||||
from Movement import models
|
||||
from Client.models import Client
|
||||
from django.urls import reverse_lazy
|
||||
from django.contrib import messages
|
||||
|
||||
|
||||
class CalendarCreateCustomView(LoginRequiredMixin, PermissionRequiredMixin, CreateView):
|
||||
model = models.Calendar
|
||||
template_name = 'Calendar/Create/index.html'
|
||||
form_class = FormsCalendar.FormsCalendar
|
||||
success_url = reverse_lazy('MovCalendarListView')
|
||||
permission_required = 'Base.add_'
|
||||
|
||||
def get_context_data(self, **kwargs):
|
||||
context = super().get_context_data(**kwargs)
|
||||
# if self.request.GET.get('Client'):
|
||||
# filter_client = Client.objects.filter(
|
||||
# id=self.request.GET.get('Client') or ''
|
||||
# )
|
||||
# else: filter_client = Client.objects.none()
|
||||
# context['Client'] = filter_client
|
||||
return context
|
||||
|
||||
def get_form(self, form_class=None):
|
||||
form = super().get_form(form_class)
|
||||
client_id = self.request.GET.get('Client') or self.request.POST.get('client')
|
||||
if client_id:
|
||||
filter_client = Client.objects.filter(id=client_id)
|
||||
else:
|
||||
filter_client = Client.objects.none()
|
||||
form.fields['client'].queryset = filter_client.all()
|
||||
return form
|
||||
|
||||
def form_valid(self, form):
|
||||
gross_value = form.instance.service.value
|
||||
net_value = gross_value - ((gross_value * form.instance.pay_method.percentage) / 100)
|
||||
value_cash = ((100 - form.instance.professional.percentage) * net_value) / 100
|
||||
prof_money = (form.instance.professional.percentage * net_value) / 100
|
||||
#
|
||||
form.instance.gross_value = gross_value
|
||||
form.instance.net_value = net_value
|
||||
form.instance.value_cash = value_cash
|
||||
form.instance.prof_money = prof_money
|
||||
form.instance.created_by = self.request.user
|
||||
messages.success(self.request, 'Registro realizado com sucesso!')
|
||||
return super().form_valid(form)
|
||||
|
||||
def form_invalid(self, form):
|
||||
errors = form.errors.as_text()
|
||||
messages.error(self.request, f'Verifique os dados: {errors}')
|
||||
return super().form_invalid(form)
|
||||
102
Movement/Views/viewsExpense.py
Normal file
102
Movement/Views/viewsExpense.py
Normal file
@@ -0,0 +1,102 @@
|
||||
from django.views.generic import ListView, CreateView, UpdateView, DeleteView, DetailView
|
||||
from django.contrib.auth.mixins import LoginRequiredMixin , PermissionRequiredMixin
|
||||
from Movement.Forms import FormsExpense
|
||||
from Movement import models
|
||||
from Base.models import ChartOfAccount
|
||||
from django.urls import reverse_lazy
|
||||
from django.contrib import messages
|
||||
from django.utils import timezone
|
||||
|
||||
class ExpenseListView(LoginRequiredMixin, PermissionRequiredMixin, ListView):
|
||||
model = models.Expense
|
||||
template_name = 'Expense/List.html'
|
||||
context_object_name = 'Expenses'
|
||||
paginate_by = 10
|
||||
permission_required = 'Base.view_professional'
|
||||
def get_queryset(self):
|
||||
queryset = super().get_queryset()
|
||||
date = self.request.GET.get('date')
|
||||
if date:
|
||||
queryset = queryset.filter(date__icontains=date)
|
||||
else:
|
||||
queryset = queryset.filter(
|
||||
date__icontains=timezone.localtime(timezone.now()).month
|
||||
)
|
||||
return queryset
|
||||
|
||||
class ExpenseCreateView(LoginRequiredMixin,PermissionRequiredMixin, CreateView):
|
||||
model = models.Expense
|
||||
template_name = 'Expense/Create.html'
|
||||
form_class = FormsExpense.FormsExpense
|
||||
success_url = reverse_lazy('MovExpenseListView')
|
||||
permission_required = 'Base.add_professional'
|
||||
|
||||
class ExpenseDetailView(LoginRequiredMixin,PermissionRequiredMixin, DetailView):
|
||||
model = models.Expense
|
||||
template_name = 'Expense/Detail.html'
|
||||
permission_required = 'Base.view_professional'
|
||||
|
||||
class ExpenseUpdateView(LoginRequiredMixin,PermissionRequiredMixin, UpdateView):
|
||||
model = models.Expense
|
||||
template_name = 'Expense/Update.html'
|
||||
form_class = FormsExpense.FormsExpense
|
||||
success_url = reverse_lazy('ExpenseListView')
|
||||
permission_required = 'Base.change_professional'
|
||||
|
||||
class ExpenseDeleteView(LoginRequiredMixin,PermissionRequiredMixin, DeleteView):
|
||||
model = models.Expense
|
||||
template_name = 'Expense/Delete.html'
|
||||
success_url = reverse_lazy('MovExpenseListView')
|
||||
permission_required = 'Base.delete_professional'
|
||||
|
||||
class ExpenseFirmCreateView(LoginRequiredMixin,PermissionRequiredMixin, CreateView):
|
||||
model = models.Expense
|
||||
template_name = 'Expense/CreateFirm.html'
|
||||
form_class = FormsExpense.FormsExpense
|
||||
success_url = reverse_lazy('MovExpenseListView')
|
||||
permission_required = 'Base.add_professional'
|
||||
|
||||
def get_form(self, form_class=None):
|
||||
form = super().get_form(form_class)
|
||||
form.fields['chart_of_account'].queryset = ChartOfAccount.objects.filter(
|
||||
firm=True,
|
||||
debit=True,
|
||||
)
|
||||
return form
|
||||
|
||||
def form_valid(self, form):
|
||||
form.instance.firm = True
|
||||
form.instance.created_by = self.request.user
|
||||
messages.success(self.request, 'Registro realizado com sucesso!')
|
||||
return super().form_valid(form)
|
||||
|
||||
def form_invalid(self, form):
|
||||
errors = form.errors.as_text()
|
||||
messages.error(self.request, f'Verifique os dados: {errors}')
|
||||
return super().form_invalid(form)
|
||||
|
||||
class ExpenseProfCreateView(LoginRequiredMixin,PermissionRequiredMixin, CreateView):
|
||||
model = models.Expense
|
||||
template_name = 'Expense/CreateProf.html'
|
||||
form_class = FormsExpense.FormsExpense
|
||||
success_url = reverse_lazy('MovExpenseListView')
|
||||
permission_required = 'Base.add_professional'
|
||||
|
||||
def get_form(self, form_class=None):
|
||||
form = super().get_form(form_class)
|
||||
form.fields['chart_of_account'].queryset = ChartOfAccount.objects.filter(
|
||||
firm=False,
|
||||
debit=True,
|
||||
)
|
||||
return form
|
||||
|
||||
def form_valid(self, form):
|
||||
form.instance.firm = False
|
||||
form.instance.created_by = self.request.user
|
||||
messages.success(self.request, 'Registro realizado com sucesso!')
|
||||
return super().form_valid(form)
|
||||
|
||||
def form_invalid(self, form):
|
||||
errors = form.errors.as_text()
|
||||
messages.error(self.request, f'Verifique os dados: {errors}')
|
||||
return super().form_invalid(form)
|
||||
47
Movement/Views/viewsProduct.py
Normal file
47
Movement/Views/viewsProduct.py
Normal file
@@ -0,0 +1,47 @@
|
||||
from django.views.generic import ListView, CreateView, UpdateView, DeleteView, DetailView
|
||||
from django.contrib.auth.mixins import LoginRequiredMixin , PermissionRequiredMixin
|
||||
from Movement.Forms import FormsProduct
|
||||
from Movement import models
|
||||
from django.urls import reverse_lazy
|
||||
from django.utils import timezone
|
||||
|
||||
class ProductListView(LoginRequiredMixin, PermissionRequiredMixin, ListView):
|
||||
model = models.Product
|
||||
template_name = 'Product/List.html'
|
||||
context_object_name = 'Products'
|
||||
paginate_by = 10
|
||||
permission_required = 'Base.view_professional'
|
||||
def get_queryset(self):
|
||||
queryset = super().get_queryset()
|
||||
date = self.request.GET.get('date')
|
||||
print(date)
|
||||
if date:
|
||||
queryset = queryset.filter(date__icontains=date)
|
||||
else:
|
||||
queryset = queryset.filter(date__icontains=timezone.localdate())
|
||||
return queryset
|
||||
|
||||
# class ProductCreateView(LoginRequiredMixin,PermissionRequiredMixin, CreateView):
|
||||
# model = models.Product
|
||||
# template_name = 'Product/Create.html'
|
||||
# form_class = FormsProduct.FormsProduct
|
||||
# success_url = reverse_lazy('ProductListView')
|
||||
# permission_required = 'Base.add_professional'
|
||||
|
||||
class ProductDetailView(LoginRequiredMixin,PermissionRequiredMixin, DetailView):
|
||||
model = models.Product
|
||||
template_name = 'Product/Detail.html'
|
||||
permission_required = 'Base.view_professional'
|
||||
|
||||
class ProductUpdateView(LoginRequiredMixin,PermissionRequiredMixin, UpdateView):
|
||||
model = models.Product
|
||||
template_name = 'Product/Update.html'
|
||||
form_class = FormsProduct.FormsProduct
|
||||
success_url = reverse_lazy('ProductListView')
|
||||
permission_required = 'Base.change_professional'
|
||||
|
||||
class ProductDeleteView(LoginRequiredMixin,PermissionRequiredMixin, DeleteView):
|
||||
model = models.Product
|
||||
template_name = 'Product/Delete.html'
|
||||
success_url = reverse_lazy('MovProductListView')
|
||||
permission_required = 'Base.delete_professional'
|
||||
50
Movement/Views/viewsProductCreateCustom.py
Normal file
50
Movement/Views/viewsProductCreateCustom.py
Normal file
@@ -0,0 +1,50 @@
|
||||
from django.views.generic import ListView, CreateView, UpdateView, DeleteView, DetailView
|
||||
from django.contrib.auth.mixins import LoginRequiredMixin, PermissionRequiredMixin
|
||||
from Movement.Forms import FormsProduct
|
||||
from Movement import models
|
||||
from Client.models import Client
|
||||
from django.urls import reverse_lazy
|
||||
from django.contrib import messages
|
||||
|
||||
|
||||
class ProductCreateCustomView(LoginRequiredMixin, PermissionRequiredMixin, CreateView):
|
||||
model = models.Product
|
||||
template_name = 'Product/Create/index.html'
|
||||
form_class = FormsProduct.FormsProduct
|
||||
success_url = reverse_lazy('MovProductListView')
|
||||
permission_required = 'Base.add_'
|
||||
|
||||
def get_context_data(self, **kwargs):
|
||||
context = super().get_context_data(**kwargs)
|
||||
# if self.request.GET.get('Client'):
|
||||
# filter_client = Client.objects.filter(
|
||||
# id=self.request.GET.get('Client') or ''
|
||||
# )
|
||||
# else: filter_client = Client.objects.none()
|
||||
# context['Client'] = filter_client
|
||||
return context
|
||||
|
||||
def get_form(self, form_class=None):
|
||||
form = super().get_form(form_class)
|
||||
client_id = self.request.GET.get('Client') or self.request.POST.get('client')
|
||||
if client_id:
|
||||
filter_client = Client.objects.filter(id=client_id)
|
||||
else:
|
||||
filter_client = Client.objects.none()
|
||||
form.fields['client'].queryset = filter_client.all()
|
||||
return form
|
||||
|
||||
def form_valid(self, form):
|
||||
gross_value = form.instance.product.value
|
||||
quantity = form.instance.quantity
|
||||
net_value = gross_value - ((gross_value * form.instance.pay_method.percentage) / 100)
|
||||
form.instance.gross_value = gross_value * quantity
|
||||
form.instance.net_value = net_value * quantity
|
||||
form.instance.created_by = self.request.user
|
||||
messages.success(self.request, 'Registro realizado com sucesso!')
|
||||
return super().form_valid(form)
|
||||
|
||||
def form_invalid(self, form):
|
||||
errors = form.errors.as_text()
|
||||
messages.error(self.request, f'Verifique os dados: {errors}')
|
||||
return super().form_invalid(form)
|
||||
60
Movement/Views/viewsStock.py
Normal file
60
Movement/Views/viewsStock.py
Normal file
@@ -0,0 +1,60 @@
|
||||
from django.views.generic import ListView, CreateView, UpdateView, DeleteView, DetailView
|
||||
from django.contrib.auth.mixins import LoginRequiredMixin , PermissionRequiredMixin
|
||||
from Movement.Forms import FormsStock
|
||||
from Movement import models
|
||||
from django.urls import reverse_lazy
|
||||
from django.contrib import messages
|
||||
from django.utils import timezone
|
||||
|
||||
class StockListView(LoginRequiredMixin, PermissionRequiredMixin, ListView):
|
||||
model = models.Stock
|
||||
template_name = 'Stock/List.html'
|
||||
context_object_name = 'Stocks'
|
||||
paginate_by = 10
|
||||
permission_required = 'Base.view_professional'
|
||||
def get_queryset(self):
|
||||
queryset = super().get_queryset()
|
||||
date = self.request.GET.get('date')
|
||||
if date:
|
||||
queryset = queryset.filter(date__icontains=date)
|
||||
else:
|
||||
queryset = queryset.filter(date__icontains=timezone.localdate())
|
||||
return queryset
|
||||
|
||||
class StockCreateView(LoginRequiredMixin,PermissionRequiredMixin, CreateView):
|
||||
model = models.Stock
|
||||
template_name = 'Stock/Create.html'
|
||||
form_class = FormsStock.FormsStock
|
||||
success_url = reverse_lazy('MovStockListView')
|
||||
permission_required = 'Base.add_professional'
|
||||
|
||||
def form_valid(self, form):
|
||||
gross_value = form.instance.gross_value
|
||||
quantity = form.instance.quantity
|
||||
form.instance.unit_value = gross_value / quantity
|
||||
form.instance.created_by = self.request.user
|
||||
messages.success(self.request, 'Registro realizado com sucesso!')
|
||||
return super().form_valid(form)
|
||||
|
||||
def form_invalid(self, form):
|
||||
errors = form.errors.as_text()
|
||||
messages.error(self.request, f'Verifique os dados: {errors}')
|
||||
return super().form_invalid(form)
|
||||
|
||||
class StockDetailView(LoginRequiredMixin,PermissionRequiredMixin, DetailView):
|
||||
model = models.Stock
|
||||
template_name = 'Stock/Detail.html'
|
||||
permission_required = 'Base.view_professional'
|
||||
|
||||
class StockUpdateView(LoginRequiredMixin,PermissionRequiredMixin, UpdateView):
|
||||
model = models.Stock
|
||||
template_name = 'Stock/Update.html'
|
||||
form_class = FormsStock.FormsStock
|
||||
success_url = reverse_lazy('MovStockListView')
|
||||
permission_required = 'Base.change_professional'
|
||||
|
||||
class StockDeleteView(LoginRequiredMixin,PermissionRequiredMixin, DeleteView):
|
||||
model = models.Stock
|
||||
template_name = 'Stock/Delete.html'
|
||||
success_url = reverse_lazy('MovStockListView')
|
||||
permission_required = 'Base.delete_professional'
|
||||
0
Movement/__init__.py
Normal file
0
Movement/__init__.py
Normal file
3
Movement/admin.py
Normal file
3
Movement/admin.py
Normal file
@@ -0,0 +1,3 @@
|
||||
from django.contrib import admin
|
||||
|
||||
# Register your models here.
|
||||
6
Movement/apps.py
Normal file
6
Movement/apps.py
Normal file
@@ -0,0 +1,6 @@
|
||||
from django.apps import AppConfig
|
||||
|
||||
|
||||
class MovementConfig(AppConfig):
|
||||
default_auto_field = 'django.db.models.BigAutoField'
|
||||
name = 'Movement'
|
||||
102
Movement/migrations/0001_initial.py
Normal file
102
Movement/migrations/0001_initial.py
Normal file
@@ -0,0 +1,102 @@
|
||||
# Generated by Django 5.2.7 on 2025-11-01 11:15
|
||||
|
||||
import django.db.models.deletion
|
||||
from django.conf import settings
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
initial = True
|
||||
|
||||
dependencies = [
|
||||
('Base', '0001_initial'),
|
||||
('Client', '0001_initial'),
|
||||
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.CreateModel(
|
||||
name='Calendar',
|
||||
fields=[
|
||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('active', models.BooleanField(default=False)),
|
||||
('created_at', models.DateTimeField(auto_now_add=True)),
|
||||
('updated_at', models.DateTimeField(auto_now=True)),
|
||||
('date', models.DateField()),
|
||||
('time', models.TimeField()),
|
||||
('first_time', models.BooleanField(default=False)),
|
||||
('gross_value', models.DecimalField(decimal_places=2, max_digits=10)),
|
||||
('net_value', models.DecimalField(decimal_places=2, max_digits=10)),
|
||||
('value_cash', models.DecimalField(decimal_places=2, max_digits=10)),
|
||||
('prof_money', models.DecimalField(decimal_places=2, max_digits=10)),
|
||||
('client', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='CalendarClient', to='Client.client')),
|
||||
('created_by', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='%(class)s_created', to=settings.AUTH_USER_MODEL)),
|
||||
('pay_method', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='CalendarPayMethod', to='Base.paymethod')),
|
||||
('professional', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='CalendarProfessional', to='Base.professional')),
|
||||
('service', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='CalendarService', to='Base.servicelist')),
|
||||
('updated_by', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='%(class)s_updated', to=settings.AUTH_USER_MODEL)),
|
||||
],
|
||||
options={
|
||||
'ordering': ['date', 'time', 'professional'],
|
||||
},
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='Expense',
|
||||
fields=[
|
||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('active', models.BooleanField(default=False)),
|
||||
('created_at', models.DateTimeField(auto_now_add=True)),
|
||||
('updated_at', models.DateTimeField(auto_now=True)),
|
||||
('date', models.DateField()),
|
||||
('firm', models.BooleanField(default=True)),
|
||||
('gross_value', models.DecimalField(decimal_places=2, max_digits=10)),
|
||||
('bank', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='ExpenseBank', to='Base.bankaccount')),
|
||||
('chart_of_account', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='ExpenseChartOfAccount', to='Base.chartofaccount')),
|
||||
('created_by', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='%(class)s_created', to=settings.AUTH_USER_MODEL)),
|
||||
('professional', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='ExpenseProfessional', to='Base.professional')),
|
||||
('updated_by', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='%(class)s_updated', to=settings.AUTH_USER_MODEL)),
|
||||
],
|
||||
options={
|
||||
'ordering': ['date', 'chart_of_account'],
|
||||
},
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='Product',
|
||||
fields=[
|
||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('active', models.BooleanField(default=False)),
|
||||
('created_at', models.DateTimeField(auto_now_add=True)),
|
||||
('updated_at', models.DateTimeField(auto_now=True)),
|
||||
('date', models.DateField()),
|
||||
('quantity', models.DecimalField(decimal_places=0, default=1, max_digits=10)),
|
||||
('gross_value', models.DecimalField(decimal_places=2, max_digits=10)),
|
||||
('net_value', models.DecimalField(decimal_places=2, max_digits=10)),
|
||||
('client', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='ProductClient', to='Client.client')),
|
||||
('created_by', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='%(class)s_created', to=settings.AUTH_USER_MODEL)),
|
||||
('pay_method', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='ProductPayMethod', to='Base.paymethod')),
|
||||
('product', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='ProductProduct', to='Base.productlist')),
|
||||
('professional', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='ProductProfessional', to='Base.professional')),
|
||||
('updated_by', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='%(class)s_updated', to=settings.AUTH_USER_MODEL)),
|
||||
],
|
||||
options={
|
||||
'ordering': ['date', 'product'],
|
||||
},
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='Stock',
|
||||
fields=[
|
||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('date', models.DateField()),
|
||||
('quantity', models.DecimalField(decimal_places=0, default=1, max_digits=10)),
|
||||
('unit_value', models.DecimalField(decimal_places=2, max_digits=10)),
|
||||
('gross_value', models.DecimalField(decimal_places=2, max_digits=10)),
|
||||
('notes', models.TextField(blank=True, null=True)),
|
||||
('bank', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='StockBank', to='Base.bankaccount')),
|
||||
('product', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='StockProduct', to='Base.productlist')),
|
||||
],
|
||||
options={
|
||||
'ordering': ['product'],
|
||||
},
|
||||
),
|
||||
]
|
||||
0
Movement/migrations/__init__.py
Normal file
0
Movement/migrations/__init__.py
Normal file
BIN
Movement/migrations/__pycache__/0001_initial.cpython-312.pyc
Normal file
BIN
Movement/migrations/__pycache__/0001_initial.cpython-312.pyc
Normal file
Binary file not shown.
BIN
Movement/migrations/__pycache__/__init__.cpython-312.pyc
Normal file
BIN
Movement/migrations/__pycache__/__init__.cpython-312.pyc
Normal file
Binary file not shown.
129
Movement/models.py
Normal file
129
Movement/models.py
Normal file
@@ -0,0 +1,129 @@
|
||||
from django.db import models
|
||||
from Base.models import (
|
||||
Base,
|
||||
PayMethod,
|
||||
Professional ,
|
||||
ServiceList,
|
||||
ProductList,
|
||||
ChartOfAccount,
|
||||
BankAccount,
|
||||
)
|
||||
from Client.models import Client
|
||||
|
||||
# Movimento do Dia
|
||||
class Calendar(Base):
|
||||
client = models.ForeignKey(
|
||||
Client,
|
||||
on_delete=models.PROTECT,
|
||||
related_name='CalendarClient'
|
||||
)
|
||||
date = models.DateField()
|
||||
time = models.TimeField()
|
||||
service = models.ForeignKey(
|
||||
ServiceList,
|
||||
on_delete=models.PROTECT,
|
||||
related_name='CalendarService'
|
||||
)
|
||||
pay_method = models.ForeignKey(
|
||||
PayMethod,
|
||||
on_delete=models.PROTECT,
|
||||
related_name='CalendarPayMethod'
|
||||
)
|
||||
professional = models.ForeignKey(
|
||||
Professional,
|
||||
on_delete=models.PROTECT,
|
||||
related_name='CalendarProfessional'
|
||||
)
|
||||
first_time = models.BooleanField(default=False)
|
||||
# Value
|
||||
gross_value = models.DecimalField(max_digits=10, decimal_places=2)
|
||||
net_value = models.DecimalField(max_digits=10, decimal_places=2)
|
||||
value_cash = models.DecimalField(max_digits=10, decimal_places=2)
|
||||
prof_money = models.DecimalField(max_digits=10, decimal_places=2)
|
||||
|
||||
class Meta:
|
||||
ordering = ['date','time','professional',]
|
||||
def __str__(self):
|
||||
return f'{self.date} - {self.professional} - {self.time}'
|
||||
|
||||
# Estoque Entrada
|
||||
class Stock(models.Model):
|
||||
date = models.DateField()
|
||||
product = models.ForeignKey(
|
||||
ProductList,
|
||||
on_delete=models.PROTECT,
|
||||
related_name='StockProduct',
|
||||
)
|
||||
quantity = models.DecimalField(max_digits=10, default=1, decimal_places=0 )
|
||||
unit_value = models.DecimalField(max_digits=10, decimal_places=2)
|
||||
gross_value = models.DecimalField(max_digits=10, decimal_places=2)
|
||||
bank = models.ForeignKey(
|
||||
BankAccount,
|
||||
on_delete=models.PROTECT,
|
||||
related_name='StockBank',
|
||||
)
|
||||
notes = models.TextField(null=True, blank=True)
|
||||
class Meta:
|
||||
ordering = ['product']
|
||||
def __str__(self):
|
||||
return self.product
|
||||
|
||||
# Venda de Produtos
|
||||
class Product(Base):
|
||||
client = models.ForeignKey(
|
||||
Client,
|
||||
on_delete=models.PROTECT,
|
||||
related_name='ProductClient',
|
||||
)
|
||||
date = models.DateField()
|
||||
product = models.ForeignKey(
|
||||
ProductList,
|
||||
on_delete=models.PROTECT,
|
||||
related_name='ProductProduct',
|
||||
)
|
||||
pay_method = models.ForeignKey(
|
||||
PayMethod,
|
||||
on_delete=models.PROTECT,
|
||||
related_name='ProductPayMethod',
|
||||
)
|
||||
professional = models.ForeignKey(
|
||||
Professional,
|
||||
on_delete=models.PROTECT,
|
||||
related_name='ProductProfessional',
|
||||
)
|
||||
quantity = models.DecimalField(max_digits=10, default=1 ,decimal_places=0)
|
||||
# Value
|
||||
gross_value = models.DecimalField(max_digits=10, decimal_places=2)
|
||||
net_value = models.DecimalField(max_digits=10, decimal_places=2)
|
||||
|
||||
class Meta:
|
||||
ordering = ['date','product',]
|
||||
def __str__(self):
|
||||
return f'{self.date} - {self.product} '
|
||||
|
||||
# Despesas
|
||||
class Expense(Base):
|
||||
date = models.DateField()
|
||||
chart_of_account = models.ForeignKey(
|
||||
ChartOfAccount,
|
||||
on_delete=models.PROTECT,
|
||||
related_name='ExpenseChartOfAccount'
|
||||
)
|
||||
bank = models.ForeignKey(
|
||||
BankAccount,
|
||||
on_delete=models.PROTECT,
|
||||
related_name='ExpenseBank',
|
||||
)
|
||||
firm = models.BooleanField(default=True)
|
||||
professional = models.ForeignKey(
|
||||
Professional,
|
||||
on_delete=models.PROTECT,
|
||||
related_name='ExpenseProfessional',
|
||||
null=True, blank=True,
|
||||
)
|
||||
gross_value = models.DecimalField(max_digits=10, decimal_places=2)
|
||||
|
||||
class Meta:
|
||||
ordering = ['date','chart_of_account',]
|
||||
def __str__(self):
|
||||
return f'{self.date} - {self.chart_of_account} '
|
||||
8
Movement/templates/Calendar/Create/client.html
Normal file
8
Movement/templates/Calendar/Create/client.html
Normal file
@@ -0,0 +1,8 @@
|
||||
<div class="form-group">
|
||||
{% for cl in form.client.field.queryset %}
|
||||
<input type="hidden" name="client" value="{{ cl.id }}" >
|
||||
<h1> {{ cl.first_name }} {{ cl.last_name }} </h1>
|
||||
{% endfor %}
|
||||
</div> <br>
|
||||
|
||||
{#{{ form.client }}#}
|
||||
7
Movement/templates/Calendar/Create/date.html
Normal file
7
Movement/templates/Calendar/Create/date.html
Normal file
@@ -0,0 +1,7 @@
|
||||
{#<input type="hidden" name="date" value="2025-10-20" >#}
|
||||
<label> <div class=""> Dia </div>
|
||||
<input type="date" name="date"
|
||||
value="{% now 'Y-m-d' %}"
|
||||
class="date form-control"
|
||||
>
|
||||
</label><br>
|
||||
18
Movement/templates/Calendar/Create/first_time.html
Normal file
18
Movement/templates/Calendar/Create/first_time.html
Normal file
@@ -0,0 +1,18 @@
|
||||
{#<div class=""> Professional </div>#}
|
||||
{#<div class="form-group">#}
|
||||
{# {% for prof in form.professional.field.queryset %}#}
|
||||
{# <div class="form-check ">#}
|
||||
{# <label>#}
|
||||
{# <input type="radio" name="professional"#}
|
||||
{# value="{{ prof.id }}" class="form-check-input"#}
|
||||
{# >#}
|
||||
{# {{ prof.symbol }} {{ prof.name }}#}
|
||||
{# </label><br>#}
|
||||
{# </div>#}
|
||||
{# {% endfor %}#}
|
||||
{#</div> <br>#}
|
||||
<div class="form-check form-switch">
|
||||
<input class="form-check-input" type="checkbox" role="switch" id="switchCheckDefault"
|
||||
value="{{ form.first_time.field.queryset }}">
|
||||
<label class="form-check-label" for="switchCheckDefault">Primeira vez</label>
|
||||
</div>
|
||||
32
Movement/templates/Calendar/Create/index.html
Normal file
32
Movement/templates/Calendar/Create/index.html
Normal file
@@ -0,0 +1,32 @@
|
||||
{% extends "BaseLogin.html" %}
|
||||
{% block title %} Cadastro {% endblock %}
|
||||
{% block content %}
|
||||
|
||||
<div class="conteiner mt-4">
|
||||
<div class="card">
|
||||
<div class="card-body">
|
||||
<form method="post" class="form" id="FormPost" action="{% url 'MovCalendarCreateCustom' %}">
|
||||
{% csrf_token %}
|
||||
<div class="row">
|
||||
<div class="col-md-6">{% include 'Calendar/Create/client.html' %} </div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-md-2">{% include 'Calendar/Create/professional.html' %} </div>
|
||||
<div class="col-md-3">{% include 'Calendar/Create/pay_method.html' %} </div>
|
||||
<div class="col-md-3">{% include 'Calendar/Create/service.html' %} </div>
|
||||
<div class="col-md-2">
|
||||
{% include 'Calendar/Create/date.html' %}
|
||||
<br> {% include 'Calendar/Create/time.html' %}
|
||||
{% include 'Calendar/Create/first_time.html' %}
|
||||
</div>
|
||||
</div>
|
||||
<button type="submit" class="btn btn-primary"> Salvar </button>
|
||||
     
|
||||
<a href="{% url 'MovCalendarListView' %}" class="btn btn-secondary"> Cancelar </a>
|
||||
</form>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{% endblock %}
|
||||
13
Movement/templates/Calendar/Create/pay_method.html
Normal file
13
Movement/templates/Calendar/Create/pay_method.html
Normal file
@@ -0,0 +1,13 @@
|
||||
<div class=""> Metodo de Pagamento </div> <br>
|
||||
<div class="form-group">
|
||||
{% for Pay in form.pay_method.field.queryset %}
|
||||
<div class="form-check ">
|
||||
<label>
|
||||
<input type="radio" name="pay_method"
|
||||
value="{{ Pay.id }}" class="form-check-input"
|
||||
>
|
||||
{{ Pay.name }} - {{ Pay.bank }}
|
||||
</label><br>
|
||||
</div>
|
||||
{% endfor %}
|
||||
</div> <br>
|
||||
13
Movement/templates/Calendar/Create/professional.html
Normal file
13
Movement/templates/Calendar/Create/professional.html
Normal file
@@ -0,0 +1,13 @@
|
||||
<div class=""> Professional </div><br>
|
||||
<div class="form-group">
|
||||
{% for prof in form.professional.field.queryset %}
|
||||
<div class="form-check ">
|
||||
<label>
|
||||
<input type="radio" name="professional"
|
||||
value="{{ prof.id }}" class="form-check-input"
|
||||
>
|
||||
{{ prof.name }} {{ prof.symbol }}
|
||||
</label><br>
|
||||
</div>
|
||||
{% endfor %}
|
||||
</div> <br>
|
||||
13
Movement/templates/Calendar/Create/service.html
Normal file
13
Movement/templates/Calendar/Create/service.html
Normal file
@@ -0,0 +1,13 @@
|
||||
<div class=""> Serviço </div><br>
|
||||
<div class="form-group">
|
||||
{% for serv in form.service.field.queryset %}
|
||||
<div class="form-check ">
|
||||
<label>
|
||||
<input type="radio" name="service"
|
||||
value="{{ serv.id }}" class="form-check-input"
|
||||
>
|
||||
{{ serv.name }} - {{ serv.value }}
|
||||
</label><br>
|
||||
</div>
|
||||
{% endfor %}
|
||||
</div> <br>
|
||||
17
Movement/templates/Calendar/Create/time.html
Normal file
17
Movement/templates/Calendar/Create/time.html
Normal file
@@ -0,0 +1,17 @@
|
||||
<div class=""> Time </div>
|
||||
<div class="form-group">
|
||||
<label>
|
||||
<input type="time" name="time" id="id_time"
|
||||
{# value="{{ form.time.field.queryset }}"#}
|
||||
class="form-control"
|
||||
>
|
||||
</label>
|
||||
</div> <br>
|
||||
|
||||
<script>
|
||||
const timeInput = document.getElementById("id_time");
|
||||
const now = new Date();
|
||||
const hours = String(now.getHours()).padStart(2, '0');
|
||||
const minutes = String(now.getMinutes()).padStart(2, '0');
|
||||
timeInput.value = `${hours}:${minutes}`;
|
||||
</script>
|
||||
18
Movement/templates/Calendar/Delete.html
Normal file
18
Movement/templates/Calendar/Delete.html
Normal file
@@ -0,0 +1,18 @@
|
||||
{% extends "BaseLogin.html" %}
|
||||
{% block title %} Bank Accounts List {% endblock %}
|
||||
{% block content %}
|
||||
<div class="conteiner mt-4">
|
||||
<h3 class="display-6"> Deletar da Marcar </h3>
|
||||
<div class="card">
|
||||
<div class="card-body">
|
||||
<h3 class="card-title">Tem certeza que quer deletar ? </h3>
|
||||
<strong>{{ object.name }}</strong>
|
||||
<form method="post">
|
||||
{% csrf_token %}
|
||||
<button type="submit" class="btn btn-danger mt-3"> Deletar </button>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
<a href="{% url 'ServiceListListView' %}" class="btn btn-secondary mt-3 "> Cancelar e Voltar </a>
|
||||
</div>
|
||||
{% endblock %}
|
||||
16
Movement/templates/Calendar/Detail.html
Normal file
16
Movement/templates/Calendar/Detail.html
Normal file
@@ -0,0 +1,16 @@
|
||||
{% extends "BaseLogin.html" %}
|
||||
{% block title %} Bank Accounts List {% endblock %}
|
||||
{% block content %}
|
||||
<div class="conteiner mt-4">
|
||||
<h3 class="display-6"> Detalhes </h3>
|
||||
<div class="card">
|
||||
<div class="card-body">
|
||||
<h3 class="card-title">{{ object.name }}</h3>
|
||||
<h3 class="card-title">{{ object.value }}</h3>
|
||||
<p class="card-text">Descrição: {{ object.description }}</p>
|
||||
{# <a href="{% url 'BrandsUpdate' object.id %}" class="btn btn-secondary mt-3 "> Editar </a>#}
|
||||
</div>
|
||||
</div>
|
||||
<a href="{% url 'ServiceListListView' %}" class="btn btn-secondary mt-3 "> Cancelar e Voltar </a>
|
||||
</div>
|
||||
{% endblock %}
|
||||
62
Movement/templates/Calendar/List.html
Normal file
62
Movement/templates/Calendar/List.html
Normal file
@@ -0,0 +1,62 @@
|
||||
{% extends "BaseLogin.html" %}
|
||||
{% block title %} List {% endblock %}
|
||||
{% block content %}
|
||||
<h1> Agenda </h1><br>
|
||||
<div class="row mb-3">
|
||||
<div class="col-md-3">
|
||||
<form method="get" action="{% url 'MovCalendarListView' %}" id="filterForm">
|
||||
<div class="input-group">
|
||||
<input type="date" class="date form-control" name="date"
|
||||
placeholder="Dia" value="{{ request.GET.date }}"
|
||||
onchange="document.getElementById('filterForm').submit();"
|
||||
>
|
||||
<button type="submit" class="btn btn-primary">
|
||||
<i class="bi bi-search"></i>
|
||||
</button>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
<br><br>
|
||||
<div class="table-responsive">
|
||||
<table class="table table-striped table-bordered">
|
||||
<thead class="thead-dark">
|
||||
<tr align="center">
|
||||
{# <th> ID </th>#}
|
||||
<th> Hora </th>
|
||||
<th> professional </th>
|
||||
<th> Cliente </th>
|
||||
<th > service </th>
|
||||
<th width="15%"> Ações </th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for Cal in Calendar %}
|
||||
<tr align="center">
|
||||
{# <td> {{ Cal.id }} </td>#}
|
||||
<td> {{ Cal.time }} </td>
|
||||
<td> {{ Cal.professional }} </td>
|
||||
<td> {{ Cal.client }} </td>
|
||||
<td> {{ Cal.service }} </td>
|
||||
<td>
|
||||
<a href="{% url 'MovCalendarDetailView' Cal.id %}" class="btn btn-info btn-sm">
|
||||
<i class="bi bi-eye"></i>
|
||||
</a>
|
||||
{# {% if perms.brands.change_brands %}#}
|
||||
{# <a href="{% url 'MovCalendarUpdateView' Cal.id %}" class="btn btn-warning btn-sm">#}
|
||||
{# <i class="bi bi-pencil"></i>#}
|
||||
{# </a>#}
|
||||
{# {% endif %}#}
|
||||
{# {% if perms.brands.delete_brands %}#}
|
||||
<a href="{% url 'MovCalendarDeleteView' Cal.id %}" class="btn btn-danger btn-sm">
|
||||
<i class="bi bi-trash"></i>
|
||||
</a>
|
||||
{# {% endif %}#}
|
||||
</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
</div>
|
||||
{% include 'components/_pagination.html' %}
|
||||
{% endblock %}
|
||||
17
Movement/templates/Calendar/Update.html
Normal file
17
Movement/templates/Calendar/Update.html
Normal file
@@ -0,0 +1,17 @@
|
||||
{% extends "BaseLogin.html" %}
|
||||
{% block title %} Bank Accounts List {% endblock %}
|
||||
{% block content %}
|
||||
<div class="conteiner mt-4">
|
||||
<h3 class="display-6"> Editar Bancos </h3>
|
||||
<div class="card">
|
||||
<div class="card-body">
|
||||
<form method="post" class="form">
|
||||
{% csrf_token %}
|
||||
{{ form.as_p }}
|
||||
<button type="submit" class="btn btn-primary"> Salvar </button>
|
||||
</form>
|
||||
<a href="{% url 'BankAccountsListView' %}" class="btn btn-secondary mt-3 "> Cancelar e Voltar </a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
||||
19
Movement/templates/Expense/Create.html
Normal file
19
Movement/templates/Expense/Create.html
Normal file
@@ -0,0 +1,19 @@
|
||||
{% extends "BaseLogin.html" %}
|
||||
{% block title %} Bank Accounts List {% endblock %}
|
||||
{% block content %}
|
||||
|
||||
<div class="conteiner mt-4">
|
||||
<h3 class="display-6"> Cadastrar Banco </h3>
|
||||
<div class="card">
|
||||
<div class="card-body">
|
||||
<form method="post" class="form">
|
||||
{% csrf_token %}
|
||||
{{ form.as_p }}
|
||||
<button type="submit" class="btn btn-primary"> Salvar </button>
|
||||
</form>
|
||||
<a href="{% url 'ProfessionalListView' %}" class="btn btn-secondary mt-3 "> Cancelar e Voltar </a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{% endblock %}
|
||||
22
Movement/templates/Expense/CreateFirm.html
Normal file
22
Movement/templates/Expense/CreateFirm.html
Normal file
@@ -0,0 +1,22 @@
|
||||
{% extends "BaseLogin.html" %}
|
||||
{% block title %} Create {% endblock %}
|
||||
{% block content %}
|
||||
|
||||
<div class="conteiner mt-4">
|
||||
<h3 class="display-6"> Despesa da Firma </h3>
|
||||
<div class="card">
|
||||
<div class="card-body">
|
||||
<form method="post" class="form">
|
||||
{% csrf_token %}
|
||||
{{ form.date.label }} {{ form.date }} <br><br>
|
||||
{{ form.chart_of_account.label }}<br>{{ form.chart_of_account }} <br>
|
||||
{{ form.bank.label }}<br>{{ form.bank }} <br>
|
||||
{{ form.gross_value.label }} {{ form.gross_value }} <br><br>
|
||||
<button type="submit" class="btn btn-primary"> Salvar </button>
|
||||
</form>
|
||||
<a href="{% url 'ProfessionalListView' %}" class="btn btn-secondary mt-3 "> Cancelar e Voltar </a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{% endblock %}
|
||||
23
Movement/templates/Expense/CreateProf.html
Normal file
23
Movement/templates/Expense/CreateProf.html
Normal file
@@ -0,0 +1,23 @@
|
||||
{% extends "BaseLogin.html" %}
|
||||
{% block title %} Create {% endblock %}
|
||||
{% block content %}
|
||||
|
||||
<div class="conteiner mt-4">
|
||||
<h3 class="display-6"> Despesa Do Prof. </h3>
|
||||
<div class="card">
|
||||
<div class="card-body">
|
||||
<form method="post" class="form">
|
||||
{% csrf_token %}
|
||||
{{ form.date.label }} {{ form.date }} <br><br>
|
||||
{{ form.chart_of_account.label }}<br>{{ form.chart_of_account }} <br>
|
||||
{{ form.bank.label }}<br>{{ form.bank }} <br>
|
||||
{{ form.professional.label }}<br>{{ form.professional }} <br>
|
||||
{{ form.gross_value.label }} {{ form.gross_value }} <br><br>
|
||||
<button type="submit" class="btn btn-primary"> Salvar </button>
|
||||
</form>
|
||||
{# <a href="{% url 'ProfessionalListView' %}" class="btn btn-secondary mt-3 "> Cancelar e Voltar </a>#}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{% endblock %}
|
||||
18
Movement/templates/Expense/Delete.html
Normal file
18
Movement/templates/Expense/Delete.html
Normal file
@@ -0,0 +1,18 @@
|
||||
{% extends "BaseLogin.html" %}
|
||||
{% block title %} Bank Accounts List {% endblock %}
|
||||
{% block content %}
|
||||
<div class="conteiner mt-4">
|
||||
<h3 class="display-6"> Deletar da Marcar </h3>
|
||||
<div class="card">
|
||||
<div class="card-body">
|
||||
<h3 class="card-title">Tem certeza que quer deletar ? </h3>
|
||||
<strong>{{ object.name }}</strong>
|
||||
<form method="post">
|
||||
{% csrf_token %}
|
||||
<button type="submit" class="btn btn-danger mt-3"> Deletar </button>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
<a href="{% url 'ProfessionalListView' %}" class="btn btn-secondary mt-3 "> Cancelar e Voltar </a>
|
||||
</div>
|
||||
{% endblock %}
|
||||
15
Movement/templates/Expense/Detail.html
Normal file
15
Movement/templates/Expense/Detail.html
Normal file
@@ -0,0 +1,15 @@
|
||||
{% extends "BaseLogin.html" %}
|
||||
{% block title %} Bank Accounts List {% endblock %}
|
||||
{% block content %}
|
||||
<div class="conteiner mt-4">
|
||||
<h3 class="display-6"> Detalhes do Banco </h3>
|
||||
<div class="card">
|
||||
<div class="card-body">
|
||||
<h3 class="card-title">{{ object.name }}</h3>
|
||||
<p class="card-text">Descrição: {{ object.description }}</p>
|
||||
{# <a href="{% url 'BrandsUpdate' object.id %}" class="btn btn-secondary mt-3 "> Editar </a>#}
|
||||
</div>
|
||||
</div>
|
||||
<a href="{% url 'ProfessionalListView' %}" class="btn btn-secondary mt-3 "> Cancelar e Voltar </a>
|
||||
</div>
|
||||
{% endblock %}
|
||||
78
Movement/templates/Expense/List.html
Normal file
78
Movement/templates/Expense/List.html
Normal file
@@ -0,0 +1,78 @@
|
||||
{% extends "BaseLogin.html" %}
|
||||
{% block title %} List {% endblock %}
|
||||
{% block content %}
|
||||
<h1> Despesas </h1><br>
|
||||
<div class="row mb-3">
|
||||
<div class="col-md-3">
|
||||
<form method="get" action="{% url 'MovExpenseListView' %}" id="filterForm">
|
||||
<div class="input-group">
|
||||
<input type="date" class="date form-control" name="date"
|
||||
placeholder="Dia" value="{{ request.GET.date }}"
|
||||
onchange="document.getElementById('filterForm').submit();"
|
||||
>
|
||||
<button type="submit" class="btn btn-primary">
|
||||
<i class="bi bi-search"></i>
|
||||
</button>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
{# {% if perms.brands.add_brands %}#}
|
||||
{# <div class="col-md-1">#}
|
||||
{# <a href="{% url 'MovExpenseCreateView' %}" class="btn btn-success float-end">#}
|
||||
{# <i class="bi bi-plus"></i> Criar </a>#}
|
||||
{# </div>#}
|
||||
<div class="col-md-1">
|
||||
<a href="{% url 'MovExpenseFirmCreateView' %}" class="btn btn-success float-end">
|
||||
Criar Firm</a>
|
||||
</div>
|
||||
<div class="col-md-1">
|
||||
<a href="{% url 'MovExpenseProfCreateView' %}" class="btn btn-success float-end">
|
||||
Criar Prof</a>
|
||||
</div>
|
||||
{# {% endif %}#}
|
||||
</div>
|
||||
|
||||
<div class="table-responsive">
|
||||
<table class="table table-striped table-bordered">
|
||||
<thead class="thead-dark">
|
||||
<tr align="center">
|
||||
<th> Data </th>
|
||||
<th> Plano de Contas </th>
|
||||
<th> Banco </th>
|
||||
<th> Firma </th>
|
||||
<th> Prof </th>
|
||||
<th> Valor </th>
|
||||
<th width="15%"> Ações </th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for Exp in Expenses %}
|
||||
<tr align="center">
|
||||
<td> {{ Exp.date|date:"d/m/Y" }} </td>
|
||||
<td> {{ Exp.chart_of_account }} </td>
|
||||
<td> {{ Exp.bank }} </td>
|
||||
<td> {{ Exp.firm }} </td>
|
||||
<td> {{ Exp.professional }} </td>
|
||||
<td> {{ Exp.gross_value }} </td>
|
||||
<td>
|
||||
<a href="{% url 'MovExpenseDetailView' Exp.id %}" class="btn btn-info btn-sm">
|
||||
<i class="bi bi-eye"></i>
|
||||
</a>
|
||||
{# {% if perms.brands.change_brands %}#}
|
||||
<a href="{% url 'MovExpenseUpdateView' Exp.id %}" class="btn btn-warning btn-sm">
|
||||
<i class="bi bi-pencil"></i>
|
||||
</a>
|
||||
{# {% endif %}#}
|
||||
{# {% if perms.brands.delete_brands %}#}
|
||||
<a href="{% url 'MovExpenseDeleteView' Exp.id %}" class="btn btn-danger btn-sm">
|
||||
<i class="bi bi-trash"></i>
|
||||
</a>
|
||||
{# {% endif %}#}
|
||||
</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
{% include 'components/_pagination.html' %}
|
||||
{% endblock %}
|
||||
17
Movement/templates/Expense/Update.html
Normal file
17
Movement/templates/Expense/Update.html
Normal file
@@ -0,0 +1,17 @@
|
||||
{% extends "BaseLogin.html" %}
|
||||
{% block title %} Bank Accounts List {% endblock %}
|
||||
{% block content %}
|
||||
<div class="conteiner mt-4">
|
||||
<h3 class="display-6"> Editar Bancos </h3>
|
||||
<div class="card">
|
||||
<div class="card-body">
|
||||
<form method="post" class="form">
|
||||
{% csrf_token %}
|
||||
{{ form.as_p }}
|
||||
<button type="submit" class="btn btn-primary"> Salvar </button>
|
||||
</form>
|
||||
<a href="{% url 'ProfessionalListView' %}" class="btn btn-secondary mt-3 "> Cancelar e Voltar </a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
||||
4
Movement/templates/Product/Create/client.html
Normal file
4
Movement/templates/Product/Create/client.html
Normal file
@@ -0,0 +1,4 @@
|
||||
{% for cl in form.client.field.queryset %}
|
||||
<input type="hidden" name="client" value="{{ cl.id }}" >
|
||||
<h1> {{ cl.first_name }} {{ cl.last_name }} </h1>
|
||||
{% endfor %} <br>
|
||||
6
Movement/templates/Product/Create/date.html
Normal file
6
Movement/templates/Product/Create/date.html
Normal file
@@ -0,0 +1,6 @@
|
||||
<label> <div class=""> Dia </div>
|
||||
<input type="date" name="date"
|
||||
value="{% now 'Y-m-d' %}"
|
||||
class="date form-control"
|
||||
>
|
||||
</label><br><br>
|
||||
33
Movement/templates/Product/Create/index.html
Normal file
33
Movement/templates/Product/Create/index.html
Normal file
@@ -0,0 +1,33 @@
|
||||
{% extends "BaseLogin.html" %}
|
||||
{% block title %} Bank Accounts List {% endblock %}
|
||||
{% block content %}
|
||||
|
||||
<div class="conteiner mt-4">
|
||||
<h3 class="display-6"> Cadastrar </h3>
|
||||
<div class="row mb-3">
|
||||
<div class="col-md-8">
|
||||
<div class="card">
|
||||
<div class="card-body">
|
||||
<form method="post" class="form">
|
||||
{% csrf_token %}
|
||||
<div class="row">
|
||||
<div class="col-md-6">{% include 'Product/Create/client.html' %}</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-md-6">{% include 'Product/Create/date.html' %}</div>
|
||||
<div class="col-md-6">{{ form.quantity.label }} <br> {{ form.quantity }} </div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-md-4">{% include 'Product/Create/product.html' %}</div>
|
||||
<div class="col-md-4">{% include 'Product/Create/pay_method.html' %}</div>
|
||||
<div class="col-md-4">{% include 'Product/Create/professional.html' %}</div>
|
||||
</div>
|
||||
<button type="submit" class="btn btn-primary"> Salvar </button>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
<a href="{% url 'MovProductListView' %}" class="btn btn-secondary mt-3 "> Cancelar e Voltar </a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
||||
13
Movement/templates/Product/Create/pay_method.html
Normal file
13
Movement/templates/Product/Create/pay_method.html
Normal file
@@ -0,0 +1,13 @@
|
||||
<div class=""> Metodo de Pagamento </div> <br>
|
||||
<div class="form-group">
|
||||
{% for Pay in form.pay_method.field.queryset %}
|
||||
<div class="form-check ">
|
||||
<label>
|
||||
<input type="radio" name="pay_method"
|
||||
value="{{ Pay.id }}" class="form-check-input"
|
||||
>
|
||||
{{ Pay.name }} - {{ Pay.bank }}
|
||||
</label><br>
|
||||
</div>
|
||||
{% endfor %}
|
||||
</div> <br>
|
||||
13
Movement/templates/Product/Create/product.html
Normal file
13
Movement/templates/Product/Create/product.html
Normal file
@@ -0,0 +1,13 @@
|
||||
<div class=""> Produto </div> <br>
|
||||
<div class="form-group">
|
||||
{% for Pay in form.product.field.queryset %}
|
||||
<div class="form-check ">
|
||||
<label>
|
||||
<input type="radio" name="product"
|
||||
value="{{ Pay.id }}" class="form-check-input"
|
||||
>
|
||||
{{ Pay.name }} - {{ Pay.value }}
|
||||
</label><br>
|
||||
</div>
|
||||
{% endfor %}
|
||||
</div> <br>
|
||||
13
Movement/templates/Product/Create/professional.html
Normal file
13
Movement/templates/Product/Create/professional.html
Normal file
@@ -0,0 +1,13 @@
|
||||
<div class=""> Professional </div><br>
|
||||
<div class="form-group">
|
||||
{% for prof in form.professional.field.queryset %}
|
||||
<div class="form-check ">
|
||||
<label>
|
||||
<input type="radio" name="professional"
|
||||
value="{{ prof.id }}" class="form-check-input"
|
||||
>
|
||||
{{ prof.name }} {{ prof.symbol }}
|
||||
</label><br>
|
||||
</div>
|
||||
{% endfor %}
|
||||
</div> <br>
|
||||
8
Movement/templates/Product/Create/quantity.html
Normal file
8
Movement/templates/Product/Create/quantity.html
Normal file
@@ -0,0 +1,8 @@
|
||||
<div class="form-group">
|
||||
<div class="form-check">
|
||||
<label>
|
||||
<input type="number" name="quantity" class="form-control"
|
||||
>
|
||||
</label><br>
|
||||
</div>
|
||||
</div> <br>
|
||||
18
Movement/templates/Product/Delete.html
Normal file
18
Movement/templates/Product/Delete.html
Normal file
@@ -0,0 +1,18 @@
|
||||
{% extends "BaseLogin.html" %}
|
||||
{% block title %} Bank Accounts List {% endblock %}
|
||||
{% block content %}
|
||||
<div class="conteiner mt-4">
|
||||
<h3 class="display-6"> Deletar da Marcar </h3>
|
||||
<div class="card">
|
||||
<div class="card-body">
|
||||
<h3 class="card-title">Tem certeza que quer deletar ? </h3>
|
||||
<strong>{{ object.name }}</strong>
|
||||
<form method="post">
|
||||
{% csrf_token %}
|
||||
<button type="submit" class="btn btn-danger mt-3"> Deletar </button>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
<a href="{% url 'ProfessionalListView' %}" class="btn btn-secondary mt-3 "> Cancelar e Voltar </a>
|
||||
</div>
|
||||
{% endblock %}
|
||||
15
Movement/templates/Product/Detail.html
Normal file
15
Movement/templates/Product/Detail.html
Normal file
@@ -0,0 +1,15 @@
|
||||
{% extends "BaseLogin.html" %}
|
||||
{% block title %} Bank Accounts List {% endblock %}
|
||||
{% block content %}
|
||||
<div class="conteiner mt-4">
|
||||
<h3 class="display-6"> Detalhes do Banco </h3>
|
||||
<div class="card">
|
||||
<div class="card-body">
|
||||
<h3 class="card-title">{{ object.name }}</h3>
|
||||
<p class="card-text">Descrição: {{ object.description }}</p>
|
||||
{# <a href="{% url 'BrandsUpdate' object.id %}" class="btn btn-secondary mt-3 "> Editar </a>#}
|
||||
</div>
|
||||
</div>
|
||||
<a href="{% url 'ProfessionalListView' %}" class="btn btn-secondary mt-3 "> Cancelar e Voltar </a>
|
||||
</div>
|
||||
{% endblock %}
|
||||
75
Movement/templates/Product/List.html
Normal file
75
Movement/templates/Product/List.html
Normal file
@@ -0,0 +1,75 @@
|
||||
{% extends "BaseLogin.html" %}
|
||||
{% block title %} List {% endblock %}
|
||||
{% block content %}
|
||||
<h1> Produtos </h1><br>
|
||||
<div class="row mb-3">
|
||||
<div class="col-md-3">
|
||||
<form method="get" action="{% url 'MovProductListView' %}" id="filterForm">
|
||||
<div class="input-group">
|
||||
<input type="date" class="date form-control" name="date"
|
||||
placeholder="Dia" value="{{ request.GET.date }}"
|
||||
onchange="document.getElementById('filterForm').submit();"
|
||||
>
|
||||
<button type="submit" class="btn btn-primary">
|
||||
<i class="bi bi-search"></i>
|
||||
</button>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
{# {% if perms.brands.add_brands %}#}
|
||||
{# <div class="col-md-6">#}
|
||||
{# <a href="{% url 'MovProductCreateCustom' %}" class="btn btn-success float-end">#}
|
||||
{# <i class="bi bi-plus"></i> Criar </a>#}
|
||||
{# </div>#}
|
||||
{# {% endif %}#}
|
||||
</div>
|
||||
|
||||
<div class="table-responsive">
|
||||
<table class="table table-striped table-bordered">
|
||||
<thead class="thead-dark">
|
||||
<tr align="center">
|
||||
|
||||
<th> date </th>
|
||||
<th> product </th>
|
||||
<th> pay_method </th>
|
||||
<th> professional </th>
|
||||
<th> quantity </th>
|
||||
<th> gross_value </th>
|
||||
{# <th> net_value </th>#}
|
||||
<th> client </th>
|
||||
<th width="15%"> Ações </th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for Prod in Products %}
|
||||
<tr align="center">
|
||||
<td> {{ Prod.date|date:"d/m/Y" }} </td>
|
||||
<td> {{ Prod.product.name }} </td>
|
||||
<td> {{ Prod.pay_method }} </td>
|
||||
<td> {{ Prod.professional }} </td>
|
||||
<td> {{ Prod.quantity }} </td>
|
||||
<td> {{ Prod.gross_value }} </td>
|
||||
{# <td> {{ Prod.net_value }} </td>#}
|
||||
<td> {{ Prod.client }} </td>
|
||||
<td>
|
||||
<a href="{% url 'MovProductDetailView' Prod.id %}" class="btn btn-info btn-sm">
|
||||
<i class="bi bi-eye"></i>
|
||||
</a>
|
||||
{# {% if perms.brands.change_brands %}#}
|
||||
<a href="{% url 'MovProductUpdateView' Prod.id %}" class="btn btn-warning btn-sm">
|
||||
<i class="bi bi-pencil"></i>
|
||||
</a>
|
||||
{# {% endif %}#}
|
||||
{# {% if perms.brands.delete_brands %}#}
|
||||
<a href="{% url 'MovProductDeleteView' Prod.id %}" class="btn btn-danger btn-sm">
|
||||
<i class="bi bi-trash"></i>
|
||||
</a>
|
||||
{# {% endif %}#}
|
||||
</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
{% include 'components/_pagination.html' %}
|
||||
{% endblock %}
|
||||
17
Movement/templates/Product/Update.html
Normal file
17
Movement/templates/Product/Update.html
Normal file
@@ -0,0 +1,17 @@
|
||||
{% extends "BaseLogin.html" %}
|
||||
{% block title %} Bank Accounts List {% endblock %}
|
||||
{% block content %}
|
||||
<div class="conteiner mt-4">
|
||||
<h3 class="display-6"> Editar Bancos </h3>
|
||||
<div class="card">
|
||||
<div class="card-body">
|
||||
<form method="post" class="form">
|
||||
{% csrf_token %}
|
||||
{{ form.as_p }}
|
||||
<button type="submit" class="btn btn-primary"> Salvar </button>
|
||||
</form>
|
||||
<a href="{% url 'ProfessionalListView' %}" class="btn btn-secondary mt-3 "> Cancelar e Voltar </a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
||||
19
Movement/templates/Stock/Create.html
Normal file
19
Movement/templates/Stock/Create.html
Normal file
@@ -0,0 +1,19 @@
|
||||
{% extends "BaseLogin.html" %}
|
||||
{% block title %} Bank Accounts List {% endblock %}
|
||||
{% block content %}
|
||||
|
||||
<div class="conteiner mt-4">
|
||||
<h3 class="display-6"> Cadastrar Banco </h3>
|
||||
<div class="card">
|
||||
<div class="card-body">
|
||||
<form method="post" class="form">
|
||||
{% csrf_token %}
|
||||
{{ form.as_p }}
|
||||
<button type="submit" class="btn btn-primary"> Salvar </button>
|
||||
</form>
|
||||
<a href="{% url 'ProfessionalListView' %}" class="btn btn-secondary mt-3 "> Cancelar e Voltar </a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{% endblock %}
|
||||
18
Movement/templates/Stock/Delete.html
Normal file
18
Movement/templates/Stock/Delete.html
Normal file
@@ -0,0 +1,18 @@
|
||||
{% extends "BaseLogin.html" %}
|
||||
{% block title %} Bank Accounts List {% endblock %}
|
||||
{% block content %}
|
||||
<div class="conteiner mt-4">
|
||||
<h3 class="display-6"> Deletar da Marcar </h3>
|
||||
<div class="card">
|
||||
<div class="card-body">
|
||||
<h3 class="card-title">Tem certeza que quer deletar ? </h3>
|
||||
<strong>{{ object.name }}</strong>
|
||||
<form method="post">
|
||||
{% csrf_token %}
|
||||
<button type="submit" class="btn btn-danger mt-3"> Deletar </button>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
<a href="{% url 'ProfessionalListView' %}" class="btn btn-secondary mt-3 "> Cancelar e Voltar </a>
|
||||
</div>
|
||||
{% endblock %}
|
||||
15
Movement/templates/Stock/Detail.html
Normal file
15
Movement/templates/Stock/Detail.html
Normal file
@@ -0,0 +1,15 @@
|
||||
{% extends "BaseLogin.html" %}
|
||||
{% block title %} Bank Accounts List {% endblock %}
|
||||
{% block content %}
|
||||
<div class="conteiner mt-4">
|
||||
<h3 class="display-6"> Detalhes do Banco </h3>
|
||||
<div class="card">
|
||||
<div class="card-body">
|
||||
<h3 class="card-title">{{ object.name }}</h3>
|
||||
<p class="card-text">Descrição: {{ object.description }}</p>
|
||||
{# <a href="{% url 'BrandsUpdate' object.id %}" class="btn btn-secondary mt-3 "> Editar </a>#}
|
||||
</div>
|
||||
</div>
|
||||
<a href="{% url 'ProfessionalListView' %}" class="btn btn-secondary mt-3 "> Cancelar e Voltar </a>
|
||||
</div>
|
||||
{% endblock %}
|
||||
72
Movement/templates/Stock/List.html
Normal file
72
Movement/templates/Stock/List.html
Normal file
@@ -0,0 +1,72 @@
|
||||
{% extends "BaseLogin.html" %}
|
||||
{% block title %} List {% endblock %}
|
||||
{% block content %}
|
||||
<h1> Entrada de Estoque </h1><br>
|
||||
<div class="row mb-3">
|
||||
<div class="col-md-3">
|
||||
<form method="get" action="{% url 'MovStockListView' %}" id="filterForm">
|
||||
<div class="input-group">
|
||||
<input type="date" class="date form-control" name="date"
|
||||
placeholder="Dia" value="{{ request.GET.date }}"
|
||||
onchange="document.getElementById('filterForm').submit();"
|
||||
>
|
||||
<button type="submit" class="btn btn-primary">
|
||||
<i class="bi bi-search"></i>
|
||||
</button>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
{# {% if perms.brands.add_brands %}#}
|
||||
<div class="col-md-6">
|
||||
<a href="{% url 'MovStockCreateView' %}" class="btn btn-success float-end">
|
||||
<i class="bi bi-plus"></i> Criar </a>
|
||||
</div>
|
||||
{# {% endif %}#}
|
||||
</div>
|
||||
|
||||
<div class="table-responsive">
|
||||
<table class="table table-striped table-bordered">
|
||||
<thead class="thead-dark">
|
||||
<tr align="center">
|
||||
<th> date </th>
|
||||
<th> product </th>
|
||||
<th> quantity </th>
|
||||
<th> unit_value </th>
|
||||
<th> gross_value </th>
|
||||
<th> bank </th>
|
||||
<th> notes </th>
|
||||
<th width="15%"> Ações </th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for Stock in Stocks %}
|
||||
<tr align="center">
|
||||
<td> {{ Stock.date|date:"d/m/Y" }} </td>
|
||||
<td> {{ Stock.product.name }} </td>
|
||||
<td> {{ Stock.quantity }} </td>
|
||||
<td> {{ Stock.unit_value }} </td>
|
||||
<td> {{ Stock.gross_value }} </td>
|
||||
<td> {{ Stock.bank }} </td>
|
||||
<td> {{ Stock.notes }} </td>
|
||||
<td>
|
||||
<a href="{% url 'MovStockDetailView' Stock.id %}" class="btn btn-info btn-sm">
|
||||
<i class="bi bi-eye"></i>
|
||||
</a>
|
||||
{# {% if perms.brands.change_brands %}#}
|
||||
<a href="{% url 'MovStockUpdateView' Stock.id %}" class="btn btn-warning btn-sm">
|
||||
<i class="bi bi-pencil"></i>
|
||||
</a>
|
||||
{# {% endif %}#}
|
||||
{# {% if perms.brands.delete_brands %}#}
|
||||
<a href="{% url 'MovStockDeleteView' Stock.id %}" class="btn btn-danger btn-sm">
|
||||
<i class="bi bi-trash"></i>
|
||||
</a>
|
||||
{# {% endif %}#}
|
||||
</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
{% include 'components/_pagination.html' %}
|
||||
{% endblock %}
|
||||
17
Movement/templates/Stock/Update.html
Normal file
17
Movement/templates/Stock/Update.html
Normal file
@@ -0,0 +1,17 @@
|
||||
{% extends "BaseLogin.html" %}
|
||||
{% block title %} Bank Accounts List {% endblock %}
|
||||
{% block content %}
|
||||
<div class="conteiner mt-4">
|
||||
<h3 class="display-6"> Editar Bancos </h3>
|
||||
<div class="card">
|
||||
<div class="card-body">
|
||||
<form method="post" class="form">
|
||||
{% csrf_token %}
|
||||
{{ form.as_p }}
|
||||
<button type="submit" class="btn btn-primary"> Salvar </button>
|
||||
</form>
|
||||
<a href="{% url 'ProfessionalListView' %}" class="btn btn-secondary mt-3 "> Cancelar e Voltar </a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
||||
3
Movement/tests.py
Normal file
3
Movement/tests.py
Normal file
@@ -0,0 +1,3 @@
|
||||
from django.test import TestCase
|
||||
|
||||
# Create your tests here.
|
||||
Reference in New Issue
Block a user