Example #1
0
    def save(self, *args, **kwargs):
        """
        Método que trata a geração e cálculo da parte financeira de uma compra.
        """

        if self.pk:

            conta_gerada = ContasPagar.objects.filter(compras=self.pk).exists()
            super(Compra, self).save(*args, **kwargs)

            # Gera financeiro somente se compra for confirmada
            if self.pedido == 'N' and self.data_compra and not conta_gerada or (
                    self.status_pedido and not conta_gerada):

                # Descrição informada no contas à pagar
                descricao = _(
                    u"Conta aberta proveniente de compra %(compra)s") % {
                        'compra': self
                    }

                # Insere o contas à pagar
                conta = ContasPagar(data=self.data_compra,
                                    valor_total=self.total,
                                    descricao=descricao,
                                    compras=self,
                                    fornecedores=self.fornecedor,
                                    forma_pagamento=self.forma_pagamento,
                                    grupo_encargo=self.grupo_encargo,
                                    status=False)
                conta.save()

            try:
                cancela_compra = self.botao_acionado
            except:
                cancela_compra = None

            # trata cancelamento de compra efetuada
            if not self.status and cancela_compra == '_addcancelacompra' and (
                    self.pedido == 'N' or
                (self.pedido == 'S' and self.status_pedido)):
                # Define a compra com status cancelado
                self.status = True
                self.save()

                # Numa compra cancelada: decrescenta a quantidade dos produtos cancelados novamente ao estoque.
                for i in ItensCompra.objects.filter(
                        compras=self.pk).values_list('id', 'produto',
                                                     'quantidade'):
                    produto = Produtos.objects.get(pk=i[1])
                    produto.quantidade = produto.quantidade - i[2]
                    produto.save()

                    itens_compra = ItensCompra.objects.get(pk=i[0])
                    itens_compra.add_estoque = False
                    itens_compra.save()

                # Fecha a conta à pagar
                conta = ContasPagar.objects.get(compras=self.pk)
                conta.status = True
                conta.save()

        else:

            # Chama a função save original para o save atual do modelo
            super(Compra, self).save(*args, **kwargs)
Example #2
0
    def gera_contas_pagar(self):
        print(
            'Etapa 3 - Início do procedimento de inserção de Contas a Pagar.')

        lista_fornecedores = Fornecedor.objects.filter(status=1)
        lista_formas_pagamento = FormaPagamento.objects.filter(status=1)
        lista_grupos_encargo = GrupoEncargo.objects.filter(status=1)
        caixa_aberto = Caixa.objects.filter(status=1).values()[0]

        if caixa_aberto["status"]:
            caixa_data_abertura = caixa_aberto["data_abertura"]
            data_atual = datetime.utcnow().replace(microsecond=0).replace(
                tzinfo=utc)

            quant_dias = caixa_data_abertura.date() - data_atual.date()

            data = caixa_data_abertura
            while not data >= data_atual:

                data = data + timedelta(days=random.randint(0, 10))
                data = dia_util(data)

                # Quebra iteração caso data de geração do registro seja maior que data atual
                if data > data_atual:
                    break

                for i in range(random.randint(0, 10)):
                    fornecedor = random.choice(lista_fornecedores)
                    forma_pagamento = random.choice(lista_formas_pagamento)
                    grupo_encargo = random.choice(lista_grupos_encargo)
                    valor_total = decimal.Decimal(random.random() *
                                                  1000).quantize(
                                                      decimal.Decimal('.01'))

                    conta = ContasPagar(
                        data=data,
                        valor_total=valor_total,
                        descricao=
                        u'Criado à partir de procedimento de geração automática de registros.',
                        compras=None,
                        fornecedores=fornecedor,
                        forma_pagamento=forma_pagamento,
                        grupo_encargo=grupo_encargo,
                        status=False)
                    conta.save()

        # Atualiza as datas de pagamentos e movimentos de caixa
        lista_pagamentos = Pagamento.objects.filter(
            parcelas_contas_pagar__contas_pagar__descricao__contains=
            'Criado à partir de procedimento de geração automática de registros.',
            parcelas_contas_pagar__contas_pagar__forma_pagamento__carencia=0,
            parcelas_contas_pagar__num_parcelas=1).values_list(
                'pk', 'data', 'parcelas_contas_pagar__contas_pagar__data')
        for l in lista_pagamentos:
            if l[1].date() != l[2]:
                r = Pagamento.objects.get(pk=l[0])
                r.data = l[2]
                r.save()
                m = MovimentosCaixa.objects.get(pagamento__pk=l[0])
                m.data = l[2]
                m.save()