Ejemplo n.º 1
0
    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()
Ejemplo n.º 2
0
    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()
Ejemplo n.º 3
0
    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()
Ejemplo n.º 4
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()