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)