No entiendo muy bien lo que hace tu código, pero te voy a explicar como lo hago yo.
El procedimiento que muestro arriba está preparado para el calculo de cuotas de amortización leasing, por lo que voy a realizar unos pequeños cambios en las formulas para acoplarlo a tus necesidades, que se tratan de la amortización de un prestamo. Para el calculo de de la cuota voy a utilizar el metodo francés, que es el más utilizado para estos casos. En caso de querer utilizar otro sólo tendrías que cambiar la formula.
Las paremetros de entrada utilizados son los siguientes :
Código Delphi
[-]
in_codben : integer, in_anoben : integer, in_importe : Double, in_vresidual : numeric(15,2), in_interes : Double; in_periodicidade : integer; in_cuotas : integer; in_fecini : date; in_mult : integer, in_iso : Double
Los campos que no necesitas son utilizados para la gestión de inmovilizado y el cálculo de las cuotas fiscales.
El siguiente paso es calcular la cuota de amortización, aquí realicé unos pequeños cambios para ajustarlo a tus necesitades. El método utilizado es el método francés.
Código Delphi
[-]
v_int = (in_interes * in_periodicidade)/ 1200;
ou_cuota = Redondeo(in_importe * v_int, 2);
ou_cuota = Redondeo(ou_cuota / (1 - Exp((1 + v_int), - in_cuotas)), 2);
Una vez calculada la cuota a pagar pasamos a calcular qué parte de esa cuota corresponde a la amortización del préstamo y cuál al pago de los intereses en cada período.
Código Delphi
[-]
v_ncuota = 0; v_acumulado = 0; ou_pendente = in_importe; v_fecha = in_fecha
while (v_ncuota < in_cuotas - 1) do
begin
v_ncuota = v_ncuota +1;
if pago = finalperiodo then
Ou_cfin = Redondeo((ou_pendente) * v_int, 2)
else Ou_cfin = Redondeo((ou_pendente - Ou_cuota) * v_int, 2);
v_acumulado = Redondeo(v_acumulado + Ou_cfin, 2);
ou_pendente = Redondeo(ou_pendente - Ou_cuota + Ou_cfin, 2);
v_fecha = SiguienteFecha(v_fecha, in_periodicidade)
end
v_ncuota = v_ncuota + 1;
Ou_cfin = Redondeo(Ou_cuota * (v_ncuota) + in_vresidual - in_importe - v_acumulado, 2);
Ou_pendente = Redondeo(ou_pendente - ou_cuota + Ou_cfin, 2);
Espero que te sirva
Un saúdo.