1
resposta

Calculo valor monetario e data

Tenho um código que deve calcular o valor de um produto em tantos dias de uso... mas quando multiplico um valor por uma diferença entre datas, o resultado vem em dias e não em um número... como eu posso fazer pra trazer o valor do calculo em numeros reais?

def calcula_divida_real(request,aluno_id):
    """ Calcula o valor a pagar da dívida por mes, separadamente"""
    if request.user.is_authenticated:
        aluno=get_object_or_404(Aluno,pk=aluno_id)
        user= request.user.id
        dividas=Pagamentos.objects.filter(identificador_usuario=user).filter(codigo_aluno=str(aluno.id)).filter(situacao_pagamento='I')

        for deb in dividas:
            #Construindo string de data de vencimento
            dia_venc=deb.dia_vencimento
            mes_venc=deb.mes_vencimento
            ano_venc=deb.ano_vencimento

            data_venc=datetime.strptime('{}/{}/{}'.format(dia_venc,mes_venc,ano_venc),'%d/%m/%Y').date()

            #Data do pagamento
            data_pagamento=datetime.now().date()

            pagamentos=Pagamentos.objects.filter(identificador_usuario=user).filter(codigo_aluno=str(aluno.id)).filter(curso=str(deb.curso))
            dia_curso=Curso.objects.filter(identificador_usuario=user).filter(id=int(deb.codigo_curso)).values_list('dia')
            matricula=Matricula.objects.filter(identificador_usuario=user).filter(alunos=aluno.id).filter(curso=int(deb.codigo_curso))

            numero_dias_curso=[]
            data_matricula_dia=[]

            if len(pagamentos) == 1 and pagamentos.filter(situacao_pagamento='I'):
                #Calcula quantidade de dias tem o curso, para usar no valor parcial
                for dia in dia_curso:                    
                    for item in dia[0]:
                        numero_dias_curso.append(item)

                #Capturando a data da matricula e colocando numa lista para pegar somente a string
                for data in matricula:
                    data_matricula_dia.append(data.data_matricula_aluno)


                valor_mensalidade=deb.valor_bruto
                aulas_por_semana=len(numero_dias_curso)
                data_matricula=data_matricula_dia[0]


                dias_de_aula = data_venc-data_matricula


                #dias_desde_matricula=(data_matricula-data_venc)
                valor_a_pagar= float((valor_mensalidade/(aulas_por_semana*4)))*(dias_de_aula/4)

                deb.valor_a_pagar=float(valor_a_pagar)

                deb.save()

            else:
                print('Valor total')
1 resposta

Olá Raul, tudo bem com você?

Peço desculpas pela demora em lhe responder.

Quando estamos trabalhando com datas criadas através da biblioteca datetime e realizamos a operação de subtração entre datas, o resultado será dado por padrão em dias. Ao atribuirmos o resultado da operação a uma variável temos acesso ao atributo de nome days com o resultado dessa operação. É através da chamada do atributo days que realizaremos a operação da multiplicação, assim o resultado da operação será do tipo int ou float e não uma data.

Temos o seguinte exemplo onde é calculado a diferença entre duas datas, logo após realizamos a multiplicação dessa diferença por 5.5, observe o resultado.

from datetime import datetime

data_inicial = datetime.strptime('01/01/2023', '%d/%m/%Y').date()
data_final = datetime.strptime('11/01/2024', '%d/%m/%Y').date()
diferenca_entre_datas = data_final - data_inicial
mutiplicacao_data_valor = diferenca_entre_datas * 5.5
print(type(mutiplicacao_data_valor))
print(mutiplicacao_data_valor)

Resultado

<class 'datetime.timedelta'>
2062 days, 12:00:00

Note que o resultado apresentado é um objeto da classe datetime. Para o segundo exemplo, informaremos que queremos multiplicar o valor em dias presentes na variável diferenca_entre_datas chamando o tributo days. Note a diferença no código abaixo e seu resultado.

from datetime import datetime

data_inicial = datetime.strptime('01/01/2023', '%d/%m/%Y').date()
data_final = datetime.strptime('11/01/2024', '%d/%m/%Y').date()
diferenca_entre_datas = data_final - data_inicial
mutiplicacao_data_valor = diferenca_entre_datas.days * 5.5
print(type(mutiplicacao_data_valor))
print(mutiplicacao_data_valor)

Resultado

<class 'float'>
2062.5

Note que temos como resultado número do tipo float.

Realizando testes com o código apresentado, será necessário realizar a chamada do atributo days para que o resultado da operação seja apresentado no formato numérico e não de data. No momento em que é realizado o cálculo do valor a pagar e atribuição da variável valor_a_pagar, modifique a divisão da variável dias_de_aula deixando como apresentado abaixo.

valor_a_pagar= valor_mensalidade/(aulas_por_semana*4)*(dias_de_aula.days/4)

Realizando essa mudança o código estará realizando a divisão do valor presente no atributo days fazendo com que o resultado seja do tipo float.

Salve o arquivo após a mudança acima e realize testes e simulações.

Reforço que os testes foram realizados apenas usando o código apresentado caso o resultado não seja como esperado, peço que compartilhe o projeto completo, assim poderei realizar testes e simulações completas.

Fico à disposição em caso de dúvidas.

Abraços e bons estudos.

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓. Bons Estudos!