estagio/fixtures/py/insert_6_Recebimento.py
#-*- coding: UTF-8 -*-
# from fixtures.py.insert_6_Recebimento import *
from django.utils.timezone import utc
from numpy import random as np
from datetime import timedelta
import random
from contas_receber.models import ParcelasContasReceber, Recebimento
from caixa.funcoes import caixa_aberto
from configuracoes.models import Parametrizacao
class ProcessoGeraRecebimento(object):
def gera_recebimento(self):
print('Etapa 6 - Início do procedimento de inserção de Recebimentos.')
if caixa_aberto():
# Busca todas as parcelas que ainda não foram quitadas e que a conta na qual se originam está com status 'Aberta'
lista_parcelas = ParcelasContasReceber.objects.filter(status=False, contas_receber__status=False).values_list('pk', 'contas_receber__data')
for p in lista_parcelas:
pula_parcela = bool(np.choice([True, False], p=[0.6, 0.4]))
if pula_parcela:
continue
quantidade_recebimentos = int(np.choice([1, 2, 3], p=[0.8, 0.15, 0.05]))
for i in range(quantidade_recebimentos):
ultimo_recebimento = Recebimento.objects.filter(parcelas_contas_receber__pk=p[0]).values_list('data').order_by('-data')
parcela = ParcelasContasReceber.objects.get(pk=p[0])
valor_a_receber = parcela.valor_a_receber()
valor_a_receber_juros = parcela.calculo_juros()
valor_a_receber_multa = parcela.calculo_multa()
if not ultimo_recebimento:
data_recebimento = p[1] + timedelta(days=random.randint(0,50))
# Trata valor dos recebimentos de acordo com o percentual do valor mínimo definido nas configurações do sistema
if quantidade_recebimentos != 1:
perc_valor_minimo_recebimento = Parametrizacao.objects.all().values_list('perc_valor_minimo_recebimento')[0][0]
valor_a_receber = round((parcela.valor_total() * perc_valor_minimo_recebimento) / 100, 2)
else:
data_recebimento = ultimo_recebimento[0][0] + timedelta(days=random.randint(0,10))
# Divide o valor a ser recebido caso ainda haja nova iteração
if (quantidade_recebimentos == 3 and (i == 0 or i == 1)) or (quantidade_recebimentos == 2 and i == 0):
valor_a_receber = valor_a_receber / 2
#Insere registro de recebimento
Recebimento(data=data_recebimento.replace(tzinfo=utc),
valor=valor_a_receber,
juros=valor_a_receber_juros,
multa=valor_a_receber_multa,
desconto=0.00,
parcelas_contas_receber=parcela
).save()