Controle de faturas e bloqueio de usuários para o sistema de lojas web
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

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)