// Emprestimo.cpp
// DEFINIÇÃO da classe cEmprestimo   ( Versão 3 )
// 8 de Novembro de 2001


// Introdução de objectos da classe cEscudo 
// NOTA : se substituir a palavra cEscudo por cEuro, 
//        passa a trabalhar com empréstimos em Euros   


 
#include <math.h>
#include "emprestimo.h"

// Assinatura da função Pmt
double Pmt( double TxJuroPer, int NPer, double Capital );



cEmprestimo::cEmprestimo()
{
	TaxaJuro = 0;
	NrPrestacoes = 0;
	//CapitalDivida = 0;
}

cEmprestimo::cEmprestimo( double TxJuro, int NrPrest, cEscudo Capital )
{
	TaxaJuro = TxJuro;
	NrPrestacoes = NrPrest;
	CapitalDivida = Capital;

	// Para demonstrar o funcionamento da atribuição mPrestacao = p
	// quer o construtor de conversão tenha o parâmetro formal com
	// passagem por valor quer por referência
	// double p;
	// mPrestacao = p;
	
	//  Só funciona com o construtor de conversão com passagem por valor 
	mPrestacao = Pmt( TaxaJuro / 12, NrPrestacoes, CapitalDivida.GetValor()  );
}

// Devolve o montante da prestação mensal a pagar	
cEscudo cEmprestimo::Prestacao()
{
	return mPrestacao;
}


// Pagamento de mais uma prestação
void cEmprestimo::PagarPrestacao()
{
	
	cEscudo Amortizacao;

	// A Amortização é a diferença entre a Prestação e os Juros devidos
 	Amortizacao = Prestacao() - (TaxaJuro/12)*CapitalDivida.GetValor (); 
	// O Capital em divida diminui no valor da amortização incluída na prestação
	CapitalDivida = CapitalDivida - Amortizacao;
	NrPrestacoes --;

}


// Amortização extra no valor do parâmetro Valor
void cEmprestimo::Amortizar( cEscudo Valor )
{
	CapitalDivida = CapitalDivida - Valor;
	mPrestacao = Pmt( TaxaJuro / 12, NrPrestacoes, CapitalDivida.GetValor() );
}


// Métodos de Acesso aos dados privados
cEscudo cEmprestimo::GetCapitalDivida()
{
	return CapitalDivida;
}


int cEmprestimo::GetNrPrestacoes()
{
	return NrPrestacoes;
}


double cEmprestimo::GetTaxaJuro()
{
	return TaxaJuro;
}

void cEmprestimo::SetTaxaJuro( double NovaTaxaJuro )
{
	TaxaJuro = NovaTaxaJuro;
	mPrestacao = Pmt( TaxaJuro / 12, NrPrestacoes, CapitalDivida.GetValor()  );
}







// Função Financeira Auxiliar
// Calcula o valor da prestação em função da taxa de juro, 
// do nr de períodos e do capital.
double Pmt( double TxJuroPer, int NPer, double Capital )
{
	double Soma;
	int n;

	Soma = 0;
	for( n=1; n <= NPer; n++ )
		Soma = Soma + 1 / pow( 1+TxJuroPer, n );

	return Capital / Soma;

}
