//--------------------
double capitaleTotale = 0.0;
//Cerco la rata successiva al movimento e quella immediatamente precedente
Rata primaRataSuccessiva = null;
Rata ultimaDaNonRicalcolare = null;
Collections.sort(finanziamento.getPam(), rataComparator);
for(Rata rata : finanziamento.getPam() ){
if( rata.getDtScadRata().after(finanziamento.getDataRiferimento())
&& rata.getCodicePosizioneRata().intValue() <= 2
&& rata.getCodicePosizioneRata().intValue() > 0){
primaRataSuccessiva = rata;
break;
}
if( "I".equals(rata.getTipoRata()) )
ultimaDaNonRicalcolare = rata;
}
//Prendo la rata di interessi immediatamente prima dell'incasso
Rata rataPerIlConteggioCapitaleResiduo = null;
Collections.sort(rateDaNonRicalcolare, rataComparator);
if( rateDaNonRicalcolare != null && rateDaNonRicalcolare.size()>0 ){
rataPerIlConteggioCapitaleResiduo = rateDaNonRicalcolare.get(rateDaNonRicalcolare.size()-1);
}
if( rataPerIlConteggioCapitaleResiduo == null )
rataPerIlConteggioCapitaleResiduo = primaRataSuccessiva;
//Calcolo il capitale residuo totale (residuo - nuovo incasso)
capitaleTotale = getCapitaleResiduo(finanziamento.getImportoFinanziato(), rateDaNonRicalcolare);
// capitaleTotale = rataPerIlConteggioCapitaleResiduo.getCapitaleResiduo().doubleValue();
//+ rataPerIlConteggioCapitaleResiduo.getQuotaCapitale().doubleValue();
//ultimaDaNonRicalcolare.getCapitaleResiduo().doubleValue();
capitaleTotale -= nuovoMovimento.getImportoMovimento();
log.debug("Capitale Totale = "+capitaleTotale);
//Numero totale di rate per un cost
int maxNumeroRate = finanziamento.getMaxNumeroRateMutuoCostante().intValue() + finanziamento.getNumeroRate().intValue();
if( ultimaDaNonRicalcolare == null )
ultimaDaNonRicalcolare = rataPerIlConteggioCapitaleResiduo;
//Recupero le spese dal piano
double quotaSpese = ultimaDaNonRicalcolare.getQuotaSpese();
log.debug("Quota Spese = "+quotaSpese);
double quotaCommGestione = NumberUtils.checkNull(ultimaDaNonRicalcolare.getQuotaCommGest());
log.debug("Quota Commissioni di Gestione = "+quotaCommGestione);
String codiceFormaPagamento = ultimaDaNonRicalcolare.getCodiceFormaPagamento();
log.debug("Codice Forma Pagamento = "+codiceFormaPagamento);
//--------------------------------------------------------------
//Creo una rata di solo capitale pari all'importo del rimborso
Rata rataCapitale = new Rata();
rataCapitale.setQuotaDietimi(0.0);
rataCapitale.setQuotaInteressi(0.0);
rataCapitale.setQuotaCapitale(nuovoMovimento.getImportoMovimento());
rataCapitale.setImpRata(nuovoMovimento.getImportoMovimento());
rataCapitale.setQuotaCommGest(0.0);
rataCapitale.setQuotaSpese(0.0);
rataCapitale.setDtScadRata(nuovoMovimento.getDataMovimento());
rataCapitale.setCodiceFormaPagamento(ultimaDaNonRicalcolare.getCodiceFormaPagamento());
rataCapitale.setCapitaleResiduo(capitaleTotale);
rataCapitale.setTipoRata("C");
rataCapitale.setCodicePosizioneRata(5);
rataCapitale.setNumeroIndirizzo(ultimaDaNonRicalcolare.getNumeroIndirizzo());
//Ricavo la data di ultima indicizzazione
// Date dataScadenzaRata = ultimaDaNonRicalcolare.getDtScadRata();
Date dataUltimaIndicizzazione = null;
if( finanziamento.getDataUltimaIndicizzazione() == null )
dataUltimaIndicizzazione = finanziamento.getDataPrimaIndicizzazione();
else
dataUltimaIndicizzazione = finanziamento.getDataUltimaIndicizzazione();
double importoRataIniziale = primaRataSuccessiva.getImpRata() - NumberUtils.checkNull(primaRataSuccessiva.getQuotaDietimi());
//prima di ricalcolare il piano, al debito residuo tolgo le quote capitale di tutte
//le rate successive ma non ricalcolate.
for(Rata rata : rateDaRicalcolare ){
if( rata.getDtScadRata().after(finanziamento.getDataRiferimento())
&& rata.getCodicePosizioneRata().intValue() > 2 && "I".equals(rata.getTipoRata())){
capitaleTotale -= NumberUtils.checkNull(rata.getQuotaCapitale());
}
}
//------------------------------------------------------
//Eseguo il ricalcolo del piano a rata costante
List<Rata> rateRicalcolate = ricalcolaPiano(finanziamento, capitaleTotale,
quotaSpese, quotaCommGestione, ultimaDaNonRicalcolare,
dataUltimaIndicizzazione, rateDaRicalcolare, rateDaNonRicalcolare,
importoRataIniziale, nuovoMovimento.getTassoCalcoloDietimi());
//------------------------------------------------------------------------------
//Verifico che il numero di rate nuove non superi il massimo consentito (escluse le rate di capitale)
for(Rata r : rateDaNonRicalcolare){
if( "C".equals(r.getTipoRata()) )
maxNumeroRate++;
}
if( rateDaNonRicalcolare.size() + rateRicalcolate.size() > maxNumeroRate ){
//Forse Devo ricalcolare il piano perche ho superato il max numero rate
//Sommo l'importo delle rate (al netto spese) che eccedono il numero max di rate
double sommaCapitaleRateOltreLimite = 0.0;
double sommaInteressiRateOltreLimite = 0.0;
double sommaIndicizzoRateOltreLimite = 0.0;
for(int i=maxNumeroRate ; i < rateRicalcolate.size() ; i++){
sommaCapitaleRateOltreLimite += rateRicalcolate.get(i).getQuotaCapitale();
sommaInteressiRateOltreLimite += rateRicalcolate.get(i).getQuotaInteressi();
sommaIndicizzoRateOltreLimite += rateRicalcolate.get(i).getQuotaIndicizzo();
rateRicalcolate.remove(i);
}
//Aggiungo ancora l'importo netto della rata numMax
sommaCapitaleRateOltreLimite += rateRicalcolate.get(maxNumeroRate-1).getQuotaCapitale();
sommaInteressiRateOltreLimite += rateRicalcolate.get(maxNumeroRate-1).getQuotaInteressi();
sommaIndicizzoRateOltreLimite += rateRicalcolate.get(maxNumeroRate-1).getQuotaIndicizzo();
//Aggionrno l'ultima rara
rateRicalcolate.get(maxNumeroRate-1).setQuotaCapitale(sommaCapitaleRateOltreLimite);
rateRicalcolate.get(maxNumeroRate-1).setQuotaInteressi(sommaInteressiRateOltreLimite);
rateRicalcolate.get(maxNumeroRate-1).setQuotaIndicizzo(sommaIndicizzoRateOltreLimite);
rateRicalcolate.get(maxNumeroRate-1).setCapitaleResiduo(0.0);
rateRicalcolate.get(maxNumeroRate-1).setImpRata(sommaCapitaleRateOltreLimite +
sommaInteressiRateOltreLimite +sommaIndicizzoRateOltreLimite);
//Controllo che la somma non superi il massimo consentito se resto sotto allora
//il piano va bene cos�
if( rateRicalcolate.get(maxNumeroRate-1).getImpRata() > getMaxImportoMutuoCostante().doubleValue() ){
//Non va bene... devo ricalcolare il piano alzando la rata
//Calcolo l'importo della rata
int numeroRate = maxNumeroRate - rateDaNonRicalcolare.size();
double importoRata = capitaleTotale * nuovoMovimento.getTassoCalcoloDietimi().doubleValue() /100 ;
double unoPiuTassoElevatoAlNumeroRate = Math.pow(1+nuovoMovimento.getTassoCalcoloDietimi().doubleValue()/100, numeroRate);
importoRata = importoRata * unoPiuTassoElevatoAlNumeroRate;
importoRata = importoRata / ( unoPiuTassoElevatoAlNumeroRate - 1 );
importoRata = NumberUtils.arrotonda(importoRata, UtilityMatematiche.ARROTONDAMENTO_RATA);
log.debug("Importo Rata = "+importoRata);
rateRicalcolate = ricalcolaPiano(finanziamento, capitaleTotale,
quotaSpese, quotaCommGestione, ultimaDaNonRicalcolare,
dataUltimaIndicizzazione, rateDaRicalcolare, rateDaNonRicalcolare,
importoRata, nuovoMovimento.getTassoCalcoloDietimi());
}
}
//-------------------------------------------------------------------------------
//Anomalia segnalata da Colombo il 13/01/2010...
//Attenzione: aggiungo le rate che sono dopo la rata di capitale ma che hanno
//posizione >2
//-------------------------------------------
for( Rata r: rateDaRicalcolare ){
if( NumberUtils.checkNull(r.getCodicePosizioneRata()).intValue() > 2 )
rateRicalcolate.add(r);
}
//----------------------------------------------------
//Salvo il progr precedente ed i dietimi precedenti
Collections.sort(rateRicalcolate, rataComparator);
Iterator<Rata> rateRicalcIter = rateRicalcolate.iterator();
Iterator<Rata> rateDaRicalcIter = rateDaRicalcolare.iterator();
while( rateDaRicalcIter.hasNext() ){
Rata rataOld = rateDaRicalcIter.next();
if( rateRicalcIter.hasNext() ){
Rata nuova = rateRicalcIter.next();
nuova.setPgrRataPrec(rataOld.getProgressivoRata());
nuova.setQuotaDietimiPrec(rataOld.getQuotaDietimi());
nuova.setQuotaDietimi(rataOld.getQuotaDietimi());
nuova.setImpRata(nuova.getImpRata()+NumberUtils.checkNull(nuova.getQuotaDietimi()));
nuova.setCodicePosizioneRata(rataOld.getCodicePosizioneRata());
nuova.setDataRegIndicizzazione(rataOld.getDataRegIndicizzazione());
nuova.setStatoIndicizzazione(rataOld.getStatoIndicizzazione());
nuova.setQuotaRisconto(rataOld.getQuotaRisconto());
nuova.setRiscontoCalcolato(rataOld.getRiscontoCalcolato());
}
}
//Aggiungo la rata di capitale
rateRicalcolate.add(rataCapitale);