List<Rata> rateRicalcolate = new ArrayList<Rata>(0);
tassoCalcolo = RoundUtils.round5Cifre(tassoCalcolo);
//Recupero le spese di incasso
Spesa sIncasso = null;
if( fin.getSpese() != null )
for(Spesa s : fin.getSpese() )
if( CostantiSpese.SPESE_INCASSO.value().equals(s.getCodiceSpesa()) )
sIncasso = s;
//Spese di incasso
Date dataScadenzaSpese = null;
if( sIncasso != null && "A".equals(sIncasso.getBaseSpesa()) ){
//Se le spese sono su base annuale recupero la rata di addebito spese
//Ordino descending
RataComparator rc = new RataComparator("dtScadRata", false);
Collections.sort(rateDaNonRicalcolare, rc);
for(Rata r : rateDaNonRicalcolare ){
if( r.getQuotaSpese().doubleValue() != 0.0 ){
//Essendo le spese su base annuale a partire dal basso prendo la scadenza
//della rata che ha le spese valorizzate
dataScadenzaSpese = r.getDtScadRata();
break;
}
}
rc.setAscending(true);
//Riordino in ascending
Collections.sort(rateDaNonRicalcolare, rc);
}
//Commissioni di gestione
Spesa sGest = null;
if( fin.getSpese() != null )
for(Spesa s : fin.getSpese() )
if( CostantiSpese.COMMISSIONI_DI_GESTIONE.value().equals(s.getCodiceSpesa()) )
sGest = s;
Date dataScadenzaCommissioni = null;
if( sGest != null && "A".equals(sGest.getBaseSpesa()) ){
//Se le spese sono su base annuale recupero la rata di addebito spese
//Ordino descending
RataComparator rc = new RataComparator("dtScadRata", false);
Collections.sort(rateDaNonRicalcolare, rc);
for(Rata r : rateDaNonRicalcolare ){
if( r.getQuotaSpese().doubleValue() != 0.0 ){
//Essendo le spese su base annuale a partire dal basso prendo la scadenza
//della rata che ha le spese valorizzate
dataScadenzaCommissioni = r.getDtScadRata();
break;
}
}
rc.setAscending(true);
//Riordino in ascending
Collections.sort(rateDaNonRicalcolare, rc);
}
//Provo a ricalcolare il piano con la rata originaria+nuovo capitale + nuovo tasso
while( residuo > 0 ){
Rata r = new Rata();
//Rate del piano definitivo quindi ho sia quota capitale che quota interessi
double quotaInteressi = NumberUtils.arrotonda(
residuo * tassoCalcolo / 100,
UtilityMatematiche.ARROTONDAMENTO_RATA);
//Mi serve per calcolare la quota di indicizzo
double quotaInteressiVecchio = NumberUtils.arrotonda(
residuo * fin.getTassoPeriodale() ,
UtilityMatematiche.ARROTONDAMENTO_RATA);
double quotaCapitale = importoRata - quotaInteressi;
if( quotaCapitale > residuo ){ //Per sistemare gli arrotondamenti sull'ultima rata
quotaCapitale = residuo;
importoRata = quotaCapitale + quotaInteressi;
}
residuo -= quotaCapitale;
r.setQuotaInteressi(quotaInteressiVecchio);
r.setQuotaIndicizzo(quotaInteressi - quotaInteressiVecchio);
r.setQuotaCapitale(quotaCapitale);
r.setCapitaleResiduo(residuo);
dataScadenzaRata = DateUtility.addMese(dataScadenzaRata, 1);
r.setDtScadRata(dataScadenzaRata);
r.setDataRegIndicizzazione(null);
r.setCodiceFormaPagamento(primaRataSuccessiva.getCodiceFormaPagamento());
r.setNumeroIndirizzo(primaRataSuccessiva.getNumeroIndirizzo());
r.setNumeroRinnovo(primaRataSuccessiva.getNumeroRinnovo());
r.setTassoApplicato( RoundUtils.round5Cifre(tassoCalcolo*12/fin.getTipoPeriodicita()) );
r.setTipoRata(primaRataSuccessiva.getTipoRata());
r.setCodicePosizioneRata(1);
r.setStatoIndicizzazione(null);
r.setTassoIndicizzazione(primaRataSuccessiva.getTassoIndicizzazione());
//Spese incasso
if( dataScadenzaSpese != null ){
if( DateUtility.addMese(dataScadenzaSpese, 12).equals(dataScadenzaRata) ){
r.setQuotaSpese(sIncasso.getImportoFisso());
//porto avanti alla prossima data di addebito spese
dataScadenzaSpese = DateUtility.addMese(dataScadenzaSpese, 12);
}else{
r.setQuotaSpese(0.0);
}
}else{
r.setQuotaSpese(quotaSpese);
}
//Commissioni di gestione
if( dataScadenzaCommissioni != null ){
if( DateUtility.addMese(dataScadenzaCommissioni, 12).equals(dataScadenzaRata) ){
r.setQuotaCommGest(sGest.getImportoFisso());
//porto avanti alla prossima data di addebito commissioni gest
dataScadenzaCommissioni = DateUtility.addMese(dataScadenzaCommissioni, 12);
}else{
r.setQuotaCommGest(0.0);
}