def gera_contas_receber(self): print('Etapa 4 - Início do procedimento de inserção de Contas a Receber.') lista_clientes = Cliente.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)): cliente = random.choice(lista_clientes) 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 = ContasReceber(data=data, valor_total=valor_total, descricao=u'Criado à partir de procedimento de geração automática de registros.', vendas=None, cliente=cliente, forma_pagamento=forma_pagamento, grupo_encargo=grupo_encargo, status=False ) conta.save() # Atualiza as datas de recebimentos e movimentos de caixa lista_recebimentos = Recebimento.objects.filter(parcelas_contas_receber__contas_receber__descricao__contains='Criado à partir de procedimento de geração automática de registros.', parcelas_contas_receber__contas_receber__forma_pagamento__carencia=0, parcelas_contas_receber__num_parcelas=1 ).values_list('pk', 'data', 'parcelas_contas_receber__contas_receber__data') for l in lista_recebimentos: if l[1].date() != l[2]: r = Recebimento.objects.get(pk=l[0]) r.data = l[2] r.save() m = MovimentosCaixa.objects.get(recebimento__pk=l[0]) m.data = l[2] m.save()
def gera_venda(self): print('Etapa 2 - Início do procedimento de inserção de Vendas.') lista_clientes = Cliente.objects.filter(status=1) lista_formas_pagamento = FormaPagamento.objects.filter(status=1) lista_grupos_encargo = GrupoEncargo.objects.filter(status=1) lista_produtos = Produtos.objects.filter(status=1) caixa_aberto = Caixa.objects.filter(status=1).values()[0] data_atual = datetime.utcnow().replace(microsecond=0).replace(tzinfo=utc) if caixa_aberto["status"]: data = caixa_aberto["data_abertura"] # Equanto a data de abertura do caixa não for igual a data atual... 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 # ...Será realizado numa quantidade aleatória de vezes a inserção de uma venda no banco de dados for i in range(random.randint(0,10)): cliente = random.choice(lista_clientes) forma_pagamento = random.choice(lista_formas_pagamento) grupo_encargo = random.choice(lista_grupos_encargo) lista_quantidade_produto = [] lista_itens_venda = [] valor_venda = 0 for ic in range(random.randint(1,15)): produto = random.choice(lista_produtos) quantidade = random.randint(1,10) # Valida quantidade de itens em estoque #--------------------------------------------------------------------------------------------------- valida_itens_estoque = Produtos.objects.filter(pk=produto.pk).values_list('pk', 'quantidade')[0] try: quant_itens_interacao = [ q[1] for q in lista_quantidade_produto if q[0] == produto.pk ][0] or 0 existe_item_lista_quantidade_produto = True except IndexError: quant_itens_interacao = 0 existe_item_lista_quantidade_produto = False if ((valida_itens_estoque[1] - (quant_itens_interacao + quantidade)) < 0): continue else: if existe_item_lista_quantidade_produto: for lqp in lista_quantidade_produto: if (lqp[0] == produto.pk): item_produto, item_quantidade = lqp[0], lqp[1] + quantidade lista_quantidade_produto.remove(lqp) lista_quantidade_produto.append(((item_produto),(item_quantidade))) else: lista_quantidade_produto.append(((produto),(quantidade))) #--------------------------------------------------------------------------------------------------- valor_unitario = Produtos.objects.get(pk=produto.pk).preco_venda percentual_desconto = int(self.define_percentual_desconto()) valor_total = self.calcula_valor_total_item_venda(quantidade, valor_unitario, percentual_desconto) valor_venda += valor_total itens_venda = ItensVenda() itens_venda.produto = produto itens_venda.quantidade = quantidade itens_venda.valor_unitario = valor_unitario itens_venda.desconto = percentual_desconto itens_venda.valor_total = valor_total itens_venda.remove_estoque = False # Insere os itens na lista antes de registrá-los lista_itens_venda.append(itens_venda) # cálculo do valor total da compra percentual_desconto = int(self.define_percentual_desconto()) valor_a_descontar = (valor_venda * percentual_desconto) / 100 valor_venda = valor_venda - valor_a_descontar # Determina se é pedido ou não, com probabilidade de 70% para que não seja. pedido = str(np.choice(['S', 'N'], p=[0.7, 0.3])) if pedido == 'S': data_pedido = data status_pedido = bool(np.choice([True, False], p=[0.2, 0.8])) if status_pedido: data_venda = data else: data_venda = None else: status_pedido = False data_pedido = None data_venda = data venda = Venda( total=valor_venda, data_venda=data_venda, data_pedido=data_pedido, data_cancelamento=None, desconto=percentual_desconto, status=False, cliente=cliente, forma_pagamento=forma_pagamento, grupo_encargo=grupo_encargo, observacao=u'Criado à partir de procedimento de geração automática de registros.', pedido=pedido, status_pedido=status_pedido ) [ venda.save() for _ in range(2) ] for ic in lista_itens_venda: ic.vendas = venda # Suplo save para que seja acrescido ao estoque, atendendo as condições declaradas no método save() [ ic.save() for _ in range(2) ] # Cancela alguns registros de venda/pedido de venda vendas = Venda.objects.filter(status=False) for i in vendas: conta_gerada = Recebimento.objects.filter(parcelas_contas_receber__contas_receber__vendas=i.pk).exists() if not conta_gerada: cancela = bool(np.choice([True, False], p=[0.3, 0.7])) if cancela: c = Venda.objects.get(pk=i.pk) c.status = False c.data_cancelamento = (c.data_venda or c.data_pedido) + timedelta(days=random.randint(0,10)) c.botao_acionado = '_addcancelavenda' c.save()
def gera_compra(self): print('Etapa 1 - Início do procedimento de inserção de Compras.') lista_fornecedores = Fornecedor.objects.filter(status=1) lista_formas_pagamento = FormaPagamento.objects.filter(status=1) lista_grupos_encargo = GrupoEncargo.objects.filter(status=1) lista_produtos = Produtos.objects.filter(status=1) caixa_aberto = Caixa.objects.filter(status=1).values()[0] data_atual = datetime.utcnow().replace(microsecond=0).replace(tzinfo=utc) if caixa_aberto["status"]: data = caixa_aberto["data_abertura"] # Equanto a data de abertura do caixa não for igual a data atual... 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 # ...Será realizado numa quantidade aleatória de vezes a inserção de uma compra no banco de dados 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) lista_itens_compra = [] valor_compra = 0 for ic in range(random.randint(1,15)): produto = random.choice(lista_produtos) quantidade = random.randint(1,10) valor_unitario = Produtos.objects.get(pk=produto.pk).preco percentual_desconto = int(self.define_percentual_desconto()) valor_total = self.calcula_valor_total_item_compra(quantidade, valor_unitario, percentual_desconto) valor_compra += valor_total itens_compra = ItensCompra() itens_compra.produto = produto itens_compra.quantidade = quantidade itens_compra.valor_unitario = valor_unitario itens_compra.desconto = percentual_desconto itens_compra.valor_total = valor_total itens_compra.add_estoque = False # Insere os itens na lista antes de registrá-los lista_itens_compra.append(itens_compra) # cálculo do valor total da compra percentual_desconto = int(self.define_percentual_desconto()) valor_a_descontar = (valor_compra * percentual_desconto) / 100 valor_compra = valor_compra - valor_a_descontar # Determina se é pedido ou não, com probabilidade de 70% para que não seja. pedido = str(np.choice(['S', 'N'], p=[0.7, 0.3])) if pedido == 'S': data_pedido = data status_pedido = bool(np.choice([True, False], p=[0.2, 0.8])) if status_pedido: data_compra = data else: data_compra = None else: status_pedido = False data_pedido = None data_compra = data compra = Compra(total=valor_compra, data_compra=data_compra, data_pedido=data_pedido, data_cancelamento=None, desconto=percentual_desconto, status=False, fornecedor=fornecedor, forma_pagamento=forma_pagamento, grupo_encargo=grupo_encargo, observacao=u'Criado à partir de procedimento de geração automática de registros.', pedido=pedido, status_pedido=status_pedido ) [ compra.save() for _ in range(2) ] for ic in lista_itens_compra: ic.compras = compra # Suplo save para que seja acrescido ao estoque, atendendo as condições declaradas no método save() [ ic.save() for _ in range(2) ] # Cancela alguns registros de compra/pedido de compra compras = Compra.objects.filter(status=False) for i in compras: conta_gerada = Pagamento.objects.filter(parcelas_contas_pagar__contas_pagar__compras=i.pk).exists() if not conta_gerada: cancela = bool(np.choice([True, False], p=[0.3, 0.7])) if cancela: c = Compra.objects.get(pk=i.pk) # Se não tiver confirmado a compra, define de antemão o status do registro para cancelado. # Do contrário, a lógica do método save() garantirá a correta movimentação do cancelamento de um compra confirmada... # Caso registro não seja confirmada, o pedido é apenas definido como cancelado. Senão, a compra/pedido é definido como cancelado, e o itens de compra são alterados. c.status = False if (c.pedido == 'N' or (c.pedido == 'S' and c.status_pedido)) else True c.data_cancelamento = (c.data_compra or c.data_pedido) + timedelta(days=random.randint(0,10)) c.botao_acionado = '_addcancelacompra' c.save()
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()