You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
321 lines
13 KiB
321 lines
13 KiB
from datetime import datetime
|
|
from decimal import Decimal
|
|
import MySQLdb
|
|
from django.contrib.auth.mixins import LoginRequiredMixin, PermissionRequiredMixin
|
|
from django.contrib import messages
|
|
from django.db.models import ProtectedError
|
|
from django.http import HttpResponseRedirect
|
|
from django.shortcuts import render
|
|
from django.urls import reverse_lazy
|
|
from django.views.generic import CreateView, DeleteView, DetailView, UpdateView, View
|
|
from django_filters.views import FilterView
|
|
from controle.filters import ClienteFiltro, PessoaFiltro
|
|
from controle.forms.clientesForm import BoletoFormSet, ClienteForm, TelefoneFormSet as TelefoneClienteFormSet
|
|
from controle.forms.pessoasForm import EmailsFormSet, EnderecoFormSet, NotasFormSet, TelefoneFormSet
|
|
from controle.models import Boleto, Cliente, Pessoa
|
|
from controleFaturas.mixins import FormSetCreateView, FormSetUpdateView, HistoricView, LogChangeMixin, LogCreateMixin, LogDeleteMixin, LogFormsetCreateMixin
|
|
from braces.views import FormMessagesMixin
|
|
from django.utils.translation import ugettext_lazy as _
|
|
from decouple import config
|
|
from dj_database_url import parse as db_url
|
|
|
|
|
|
class IndexView(LoginRequiredMixin, View):
|
|
def get(self, request):
|
|
clientes = Cliente.objects.all()
|
|
context = {
|
|
'pessoas': Pessoa.objects.all(),
|
|
'clientes': {
|
|
'ativos': clientes.filter(ativo=True).count(),
|
|
'inativos': clientes.filter(ativo=False).count(),
|
|
'total': clientes.count(),
|
|
'em_dia': clientes.filter(ativo=True, situacao='E').count(),
|
|
'atrasados': clientes.filter(ativo=True, situacao='A').count(),
|
|
}
|
|
}
|
|
|
|
return render(request, 'controle/index.html', context)
|
|
|
|
|
|
class PessoasIndexView(LoginRequiredMixin, View):
|
|
def get(self, request):
|
|
context = {
|
|
'pessoas': Pessoa.objects.all()
|
|
}
|
|
|
|
return render(request, 'controle/cadastros/pessoa_index.html', context)
|
|
|
|
|
|
class PessoasListaView(LoginRequiredMixin, FilterView):
|
|
model = Pessoa
|
|
template_name = 'controle/cadastros/pessoa_lista.html'
|
|
paginate_by = 50
|
|
filterset_class = PessoaFiltro
|
|
|
|
def get(self, request, *args, **kwargs):
|
|
return super(PessoasListaView, self).get(request, *args, **kwargs)
|
|
|
|
def get_context_data(self, **kwargs):
|
|
response = super(PessoasListaView, self).get_context_data(**kwargs)
|
|
return response
|
|
|
|
|
|
class PessoasCriarView(LoginRequiredMixin, PermissionRequiredMixin, FormSetCreateView, FormMessagesMixin, LogCreateMixin, LogFormsetCreateMixin, CreateView):
|
|
model = Pessoa
|
|
template_name = 'controle/cadastros/pessoa_form.html'
|
|
fields = '__all__'
|
|
success_url = reverse_lazy('pessoas-lista')
|
|
form_valid_message = _('Pessoa adicionada com sucesso')
|
|
form_invalid_message = _('Falha ao adicionar Pessoa, verifique os erros')
|
|
permission_required = 'pessoa.add_pessoa'
|
|
formset_classes = [
|
|
NotasFormSet,
|
|
EmailsFormSet,
|
|
TelefoneFormSet,
|
|
EnderecoFormSet,
|
|
]
|
|
|
|
def get(self, request, *args, **kwargs):
|
|
return super(PessoasCriarView, self).get(request, *args, **kwargs)
|
|
|
|
def get_context_data(self, **kwargs):
|
|
response = super(PessoasCriarView, self).get_context_data(**kwargs)
|
|
return response
|
|
|
|
|
|
class PessoasAtualizarView(LoginRequiredMixin, PermissionRequiredMixin, FormSetUpdateView, FormMessagesMixin, LogChangeMixin, UpdateView):
|
|
model = Pessoa
|
|
template_name = 'controle/cadastros/pessoa_form.html'
|
|
fields = '__all__'
|
|
success_url = reverse_lazy('pessoas-lista')
|
|
form_valid_message = _('Pessoa atualizada com sucesso')
|
|
form_invalid_message = _('Falha ao atualizar Pessoa, verifique os erros')
|
|
permission_required = 'pessoa.change_pessoa'
|
|
formset_classes = [
|
|
NotasFormSet,
|
|
EmailsFormSet,
|
|
TelefoneFormSet,
|
|
EnderecoFormSet,
|
|
]
|
|
|
|
def get(self, request, *args, **kwargs):
|
|
return super(PessoasAtualizarView, self).get(request, *args, **kwargs)
|
|
|
|
def get_context_data(self, **kwargs):
|
|
response = super(PessoasAtualizarView, self).get_context_data(**kwargs)
|
|
return response
|
|
|
|
|
|
class PessoasApagarView(LoginRequiredMixin, PermissionRequiredMixin, FormMessagesMixin, LogDeleteMixin, DeleteView):
|
|
model = Pessoa
|
|
template_name = 'controle/cadastros/pessoa_apagar.html'
|
|
success_url = reverse_lazy('pessoas-lista')
|
|
form_valid_message = _('Pessoa removida com sucesso')
|
|
form_invalid_message = _('Falha ao remover a pessoa')
|
|
permission_required = 'pessoa.delete_pessoa'
|
|
|
|
def delete(self, request, *args, **kwargs):
|
|
try:
|
|
return super(PessoasApagarView, self).delete(request, *args, **kwargs)
|
|
except ProtectedError:
|
|
messages.error(request, _(
|
|
u'Este registro contém dependências e não pode ser apagado.'))
|
|
return HttpResponseRedirect(self.success_url)
|
|
|
|
|
|
class PessoasHistoricoView(LoginRequiredMixin, HistoricView):
|
|
model = Pessoa
|
|
success_url = reverse_lazy('pessoas-lista')
|
|
|
|
|
|
class ClientesIndexView(LoginRequiredMixin, View):
|
|
def get(self, request):
|
|
clientes = Cliente.objects.all()
|
|
context = {
|
|
'clientes': {
|
|
'ativos': clientes.filter(ativo=True).count(),
|
|
'inativos': clientes.filter(ativo=False).count(),
|
|
'total': clientes.count(),
|
|
'em_dia': clientes.filter(ativo=True, situacao='E').count(),
|
|
'atrasados': clientes.filter(ativo=True, situacao='A').count(),
|
|
}
|
|
|
|
}
|
|
|
|
return render(request, 'controle/cadastros/cliente/cliente_index.html', context)
|
|
|
|
|
|
class ClientesListaView(LoginRequiredMixin, FilterView):
|
|
model = Cliente
|
|
template_name = 'controle/cadastros/cliente/cliente_lista.html'
|
|
paginate_by = 50
|
|
filterset_class = ClienteFiltro
|
|
|
|
def get(self, request, *args, **kwargs):
|
|
return super(ClientesListaView, self).get(request, *args, **kwargs)
|
|
|
|
def get_context_data(self, **kwargs):
|
|
response = super(ClientesListaView, self).get_context_data(**kwargs)
|
|
return response
|
|
|
|
|
|
class ClientesCriarView(LoginRequiredMixin, PermissionRequiredMixin, FormSetCreateView, FormMessagesMixin, LogCreateMixin, LogFormsetCreateMixin, CreateView):
|
|
model = Cliente
|
|
template_name = 'controle/cadastros/cliente/cliente_form.html'
|
|
success_url = reverse_lazy('clientes-lista')
|
|
form_valid_message = _('Cliente adicionado com sucesso')
|
|
form_invalid_message = _('Falha ao adicionar Cliente, verifique os erros')
|
|
permission_required = 'cliente.add_cliente'
|
|
form_class = ClienteForm
|
|
formset_classes = [TelefoneClienteFormSet]
|
|
|
|
def get(self, request, *args, **kwargs):
|
|
return super(ClientesCriarView, self).get(request, *args, **kwargs)
|
|
|
|
def get_context_data(self, **kwargs):
|
|
response = super(ClientesCriarView, self).get_context_data(**kwargs)
|
|
return response
|
|
|
|
|
|
class ClientesDetalhesView(LoginRequiredMixin, DetailView):
|
|
model = Cliente
|
|
success_url = reverse_lazy('clientes-lista')
|
|
template_name = 'controle/cadastros/cliente/cliente_detalhes.html'
|
|
|
|
def get(self, request, *args, **kwargs):
|
|
return super(ClientesDetalhesView, self).get(request, *args, **kwargs)
|
|
|
|
def get_context_data(self, **kwargs):
|
|
response = super(ClientesDetalhesView, self).get_context_data(**kwargs)
|
|
return response
|
|
|
|
def post(self, request, *args, **kwargs):
|
|
obj = self.get_object()
|
|
post_data = request.POST.copy()
|
|
|
|
if post_data.get('ativo'):
|
|
obj.ativo = post_data.get('ativo') == 'true'
|
|
obj.save()
|
|
messages.success(
|
|
request, f'Cliente {obj} {"ativado" if obj.ativo else "inativado"} com sucesso!')
|
|
return HttpResponseRedirect(request.path)
|
|
|
|
if post_data.get('usuarios_bloqueados'):
|
|
conf = config(
|
|
'DATABASE_URL',
|
|
default='sqlite:///db.sqlite3',
|
|
cast=db_url,
|
|
)
|
|
connection = MySQLdb.connect(
|
|
host=conf["HOST"], user=conf["USER"], passwd=conf["PASSWORD"], db=obj.nome_banco_dados)
|
|
cur = connection.cursor()
|
|
if post_data.get('usuarios_bloqueados') == 'true':
|
|
obj.usuarios_bloqueados = 1
|
|
obj.save()
|
|
count = cur.execute(
|
|
"update core_user set is_blocked = 1 where email <> 'suporte@nexverse.com.br'")
|
|
messages.success(
|
|
request, f'{count} usuários bloqueados com sucesso!')
|
|
return HttpResponseRedirect(request.path)
|
|
else:
|
|
obj.usuarios_bloqueados = 0
|
|
obj.save()
|
|
count = cur.execute(
|
|
"update core_user set is_blocked = 0 where email <> 'suporte@nexverse.com.br'")
|
|
messages.success(
|
|
request, f'{count} usuários desbloqueados com sucesso!')
|
|
return HttpResponseRedirect(request.path)
|
|
|
|
|
|
class ClientesAtualizarView(LoginRequiredMixin, PermissionRequiredMixin, FormSetUpdateView, FormMessagesMixin, LogChangeMixin, UpdateView):
|
|
model = Cliente
|
|
template_name = 'controle/cadastros/cliente/cliente_form.html'
|
|
form_class = ClienteForm
|
|
success_url = reverse_lazy('clientes-lista')
|
|
form_valid_message = _('Cliente atualizado com sucesso')
|
|
form_invalid_message = _('Falha ao atualizar Cliente, verifique os erros')
|
|
permission_required = 'cliente.change_cliente'
|
|
formset_classes = [TelefoneClienteFormSet]
|
|
|
|
def get(self, request, *args, **kwargs):
|
|
return super(ClientesAtualizarView, self).get(request, *args, **kwargs)
|
|
|
|
def get_context_data(self, **kwargs):
|
|
response = super(ClientesAtualizarView,
|
|
self).get_context_data(**kwargs)
|
|
return response
|
|
|
|
|
|
class ClientesApagarView(LoginRequiredMixin, PermissionRequiredMixin, FormMessagesMixin, LogDeleteMixin, DeleteView):
|
|
model = Cliente
|
|
template_name = 'controle/cadastros/cliente/cliente_apagar.html'
|
|
success_url = reverse_lazy('clientes-lista')
|
|
form_valid_message = _('Cliente removida com sucesso')
|
|
form_invalid_message = _('Falha ao remover a cliente')
|
|
permission_required = 'cliente.delete_cliente'
|
|
|
|
def delete(self, request, *args, **kwargs):
|
|
try:
|
|
return super(ClientesApagarView, self).delete(request, *args, **kwargs)
|
|
except ProtectedError:
|
|
messages.error(request, _(
|
|
u'Este registro contém dependências e não pode ser apagado.'))
|
|
return HttpResponseRedirect(self.success_url)
|
|
|
|
|
|
class ClientesHistoricoView(LoginRequiredMixin, HistoricView):
|
|
model = Cliente
|
|
success_url = reverse_lazy('clientes-lista')
|
|
|
|
|
|
class ClientesBoletosView(LoginRequiredMixin, PermissionRequiredMixin, DetailView):
|
|
model = Cliente
|
|
template_name = 'controle/cadastros/cliente/cliente_boletos.html'
|
|
success_url = reverse_lazy('clientes-lista')
|
|
permission_required = 'cliente.change_cliente'
|
|
|
|
def get(self, request, *args, **kwargs):
|
|
return super(ClientesBoletosView, self).get(request, *args, **kwargs)
|
|
|
|
def get_context_data(self, **kwargs):
|
|
response = super(ClientesBoletosView,
|
|
self).get_context_data(**kwargs)
|
|
return response
|
|
|
|
def post(self, request, *args, **kwargs):
|
|
post_data = request.POST.copy()
|
|
|
|
if post_data['boleto'] != '':
|
|
if post_data['delete'] != 'S':
|
|
boleto = Boleto.objects.get(pk=post_data['boleto'])
|
|
boleto.numero_boleto = post_data['numero_boleto']
|
|
boleto.data_vencimento = datetime.strptime(
|
|
post_data['data_vencimento'], '%Y-%m-%d')
|
|
boleto.data_geracao = datetime.strptime(
|
|
post_data['data_geracao'], '%Y-%m-%d')
|
|
boleto.situacao = post_data['situacao']
|
|
boleto.valor = Decimal(post_data['valor'])
|
|
boleto.save()
|
|
messages.success(
|
|
request, f'Boleto {boleto.numero_boleto} atualizado com sucesso!')
|
|
else:
|
|
boleto = Boleto.objects.get(pk=post_data['boleto'])
|
|
oldBoleto = boleto.numero_boleto
|
|
boleto.delete()
|
|
messages.success(
|
|
request, f'Boleto {oldBoleto} apagado com sucesso!')
|
|
else:
|
|
cliente = self.get_object()
|
|
boleto = Boleto.objects.create(
|
|
numero_boleto=post_data['numero_boleto'],
|
|
data_vencimento=datetime.strptime(
|
|
post_data['data_vencimento'], '%Y-%m-%d'),
|
|
data_geracao=datetime.strptime(
|
|
post_data['data_geracao'], '%Y-%m-%d'),
|
|
situacao=post_data['situacao'],
|
|
valor=Decimal(post_data['valor']),
|
|
cliente=cliente
|
|
)
|
|
messages.success(
|
|
request, f'Boleto {boleto.numero_boleto} criado com sucesso!')
|
|
return HttpResponseRedirect(request.path)
|