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)
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()