mimus-assa / enerv-sage

0 stars 0 forks source link

cambios dependiendo de fondedoras(corrida de intereses) #6

Open mimus-assa opened 2 months ago

mimus-assa commented 2 months ago

se debe de estandarisar

cuando se mete un credito por fondos gto se debe de subir un porcentaje y cambiar el metodo de pago(los porcentajes de distribucion)

fondos gto: 12%

mimus-assa commented 1 month ago

creo que esto es mejor hacerlo dando otro excel con la corrida, creo que este codigo nos puede servir


from datetime import datetime
import pandas as pd
from werkzeug.utils import secure_filename
import openpyxl  # Importa la biblioteca para manejar archivos Excel
import os
from flask import send_from_directory

def calcular_amortizacion(capital, tasa_anual, plazo, gracia, fecha_alta):
    # Convertir la tasa anual a tasa mensual
    tasa_mensual = tasa_anual / 12 / 100
    num_pagos = plazo

    # Calcular el pago mensual de la amortización
    if plazo > gracia:
        factor_amortizacion = (tasa_mensual * (1 + tasa_mensual) ** (plazo - gracia)) / (((1 + tasa_mensual) ** (plazo - gracia)) - 1)
        pago_mensual = capital * factor_amortizacion
    else:
        pago_mensual = 0

    # Lista para almacenar la información de la tabla de amortización
    amortizacion = []

    # Saldo inicial del préstamo
    saldo = capital
    fecha_pago = fecha_alta

    for pago_num in range(1, num_pagos + 1):
        if pago_num <= gracia:
            # Durante el periodo de gracia se pagan solo intereses
            pago_capital = 0
            pago_intereses = saldo * tasa_mensual
        else:
            # Después del periodo de gracia se paga tanto el capital como los intereses
            pago_intereses = saldo * tasa_mensual
            pago_capital = pago_mensual - pago_intereses
            saldo -= pago_capital

        # Se asegura que el saldo no sea negativo
        saldo = max(0, saldo)

        # Agrega el pago actual a la lista
        amortizacion.append({
            'Fecha Pago': fecha_pago.strftime('%d/%m/%Y'),
            'Saldo Inicial': round(capital, 2),
            'Pago Capital': round(pago_capital, 2),
            'Pago Intereses': round(pago_intereses, 2),
            'Saldo Insoluto': round(saldo, 2),
            'Pago Mensual': round(pago_intereses + pago_capital, 2)
        })

        # Calcula la fecha del próximo pago
        mes = (fecha_pago.month % 12) + 1
        año = fecha_pago.year + ((fecha_pago.month + 1) // 13)
        fecha_pago = datetime(año, mes, fecha_pago.day)

        # Actualiza el saldo inicial para el siguiente período
        capital = saldo

    # Convertir la lista en un DataFrame de Pandas
    df_amortizacion = pd.DataFrame(amortizacion)
    return df_amortizacion

def validar_entradas(form):
    required_fields = ['cliente', 'capital', 'tasa_anual', 'plazo', 'gracia', 'fecha_alta']
    return all(field in form for field in required_fields)

def obtener_datos(form):
    cliente = form['cliente']
    capital = float(form['capital'])
    tasa_anual = float(form['tasa_anual'])
    plazo = int(form['plazo'])
    gracia = int(form['gracia'])
    fecha_alta = datetime.strptime(form['fecha_alta'], '%d/%m/%Y')
    return cliente, capital, tasa_anual, plazo, gracia, fecha_alta

def escribir_excel(cliente, capital,tasa_anual, plazo,gracia, fecha_alta, df_amortizacion):
    filename = secure_filename("pagos.xlsx")
    filepath = os.path.join('docs', filename)
    workbook = openpyxl.load_workbook(filepath)

    sheet = workbook.active

    sheet['C8'] = cliente
    sheet['G10'] = capital
    sheet['G11'] = tasa_anual
    sheet['G12'] = plazo
    sheet['G13'] = gracia
    sheet['D10'] = fecha_alta.strftime('%d/%m/%Y')
    escribir_datos_en_hoja(sheet, df_amortizacion)
    workbook.save(filepath)

    return filepath

def escribir_datos_en_hoja(sheet, df_amortizacion):
    columns = {
        'B': 'Saldo Inicial',
        'C': 'Pago Capital',
        'D': 'Pago Intereses',
        'F': 'Saldo Insoluto',
        'G': 'Pago Mensual'
    }
    for col, key in columns.items():
        for index, value in enumerate(df_amortizacion[key], start=18):
            sheet[f'{col}{index}'].value = value

def descargar_archivo(filepath):
    return send_from_directory(directory='docs', path=os.path.basename(filepath), as_attachment=True)

hay que pensar como implementarlo

mimus-assa commented 1 month ago

esto es modificando el promtp

Objetivo: Implementar un modelo "Enerv Sage" diseñado para analizar recibos de electricidad, calcular el consumo energético específico para cotizar la  instalacion de paneles solares. Este modelo actualizará un archivo de Excel "cotizacion.xlsx", específicamente la hoja "SFV", con información calculada a partir de los datos del recibo usando fórmulas exactas.

Restricciones Importantes: El modelo debe basarse únicamente en la información proporcionada por el usuario y las instrucciones detalladas aquí, sin hacer suposiciones ni usar datos no especificados.

Inicio de la Interacción: el usuario entrega al modelo:

    Recibo de luz (PDF o imagen)

Entrada: Datos del Recibo de Luz

    NOMBRE_CLIENTE 
    DIRECCION_CLIENTE
    TARIFA
    CONSUMO_PERIODO_ACTUAL
    CONSUMO_HISTORICO (nota: no incluir CONSUMO_PERIODO_ACTUAL)
    DEMANDA_CONTRATADA (solo si tarifa es GDMTH o GDMTO)
    TOTAL_A_PAGAR

Proceso Detallado:

    Extracción de Información: extraer del recibo los datos especificados anteriormente. 

    creacion del diccionario de informacion

        # Datos del recibo extraídos manualmente
        datos_recibo = {
            "nombre_cliente": NOMBRE_CLIENTE, #STR
            "direccion_cliente": DIRECCION_CLIENTE, #STR
            "tarifa": TARIFA, #STR
            "consumo_periodo_actual": CONSUMO_PERIODO_ACTUAL, #FLOAT  
            "consumos_historicos": CONSUMO_HISTORICO,  #LIST
            "demanda_contratada": DEMANDA_CONTRATADA, #FLOAT
            "total_a_pagar": TOTAL_A_PAGAR #FLOAT
        }

    nota:Para el análisis de estos datos, aseguraremos la correcta importación de los módulos necesarios, como 'analisis_de_recibo.py', en nuestro entorno de ejecución. Esto implicará verificar y adaptar la configuración del entorno, como el sys.path

    usa la funcion run del archivo llamado run.py la cual requiere como argumentos el diccionario anterior de los datos del recibo

        outputs:    
            str: La función retorna la ruta del archivo Excel actualizado. Esto permite saber dónde se ha guardado el archivo modificado y facilita su posterior recuperación o uso.

Calculo de Instalacion Parcial(opcional solo si el usuario lo pide)

    Usa la funcion consumo_parcial del archivo consumo_parcial.py para calcular el costo que tendria el recibo despues de instalar una cantidad de paneles menor a la necesaria
        Inputs:
            numero_de_paneles (int)
            consumo_real(float)
            tarifa (str)
            TOTAL_A_PAGAR: (float) 
        Outputs:
            costo_del_recibo
Salida Esperada:

    Archivo de texto con análisis, cálculos y recomendaciones.
    Archivo xlsx modificado con el nombre correcto.
mimus-assa commented 1 month ago

hay que hacer que este prompt ejecute el segundo codigo pero hay que abrir un nuevo issue para mejorar el prompt antes de hacer esto

mimus-assa commented 1 month ago

https://github.com/mimus-assa/enerv-sage/issues/11

aqui esta lo referente a este tema