}
//creare una rata riferita solo a movimenti di tipo R che NON sono stati stornati - luisa 20101028
if(listaRimborsiNonStornati.size()>0){
for(MovimentoRimborsoGraduato rimborso : listaRimborsiNonStornati){
debitoResiduoAttuale -= rimborso.getImportoMovimento();
Rata rata = new Rata();
rata.setDtScadRata(rimborso.getDataMovimento());
rata.setQuotaCapitale(rimborso.getImportoMovimento());
rata.setQuotaInteressi(0d);
rata.setQuotaSpese(0d);
rata.setImpRata(rimborso.getImportoMovimento());
rata.setCodicePosizioneRata(5);
rata.setCapitaleResiduo(debitoResiduoAttuale);
rata.setTipoRata("C");
rata.setPgrRataPrec(0);
rateDaNonRicalcolare.add(rata);
}
}
Collections.sort(rateDaNonRicalcolare, new RataComparator("dtScadRata", true));
for(int i = 0 ;i < rateDaNonRicalcolare.size() ; i ++ ){
if(rateDaNonRicalcolare.get(i).getTipoRata().equals("I") &&
(i+1)!=rateDaNonRicalcolare.get(i).getProgressivoRata()){
rateDaNonRicalcolare.get(i).setPgrRataPrec(rateDaNonRicalcolare.get(i).getProgressivoRata());
}else{
rateDaNonRicalcolare.get(i).setPgrRataPrec(0);
}
rateDaNonRicalcolare.get(i).setProgressivoRata(i+1);
}
Date dataDecorrenza = new Date(finanziamento.getDataDecorrenzaMutuo().getTime());
dataRimborsoAttuale = DateUtility.setMeseGiorno(dataDecorrenza,
finanziamento.getModalitaRimborso().getMesePrimoRimborso(),
finanziamento.getModalitaRimborso().getGiornoPrimoRimborso());
while(!dataRimborsoAttuale.after(finanziamento.getDataRiferimento())){
dataRimborsoAttuale = DateUtils.addMonths(dataRimborsoAttuale,finanziamento.getModalitaRimborso().getPeriodicitaRimborso());
}
Double nuovoInteressiPerIndicizzazione=0d;
Double nuovoInteressiContrattuali=0d;
Double nuovoRimborsoMinimo=0d;
Double nuovoDebitoResiduo=finanziamento.getImportoFinanziato()-totaleRimborsiEffettuati;
Double vecchioDebitoResiduo=finanziamento.getImportoFinanziato()-totaleRimborsiEffettuati;
Double nuovoImportoRata=0d;
boolean rataInPeriodoInd=false;
String tipoRicalcolo=getMediaOPercentuali(finanziamento);
if(tipoRicalcolo.equals("M")){
nuovoRimborsoMinimo=calcoloRimborsoMedio(finanziamento);
}
log.debug("tipoRicalcolo :"+ tipoRicalcolo);
log.debug("rimborso minimo :"+ nuovoRimborsoMinimo);
List<Rata> rateDaAggiungere = new ArrayList<Rata>(0);
int progRata = rateDaNonRicalcolare==null?0:rateDaNonRicalcolare.size();
double dietimiInEccesso = 0.0;
Collections.sort(rateDaRicalcolare, new RataComparator("dtScadRata", true));
for(Rata rataRicalc : rateDaRicalcolare){
rataInPeriodoInd=false;
progRata++;
log.debug("ciclo in rateDaRicalcolare " + progRata);
log.debug("dataRimborsoAttuale" + sdf.format(dataRimborsoAttuale) + " dataScadRata " + sdf.format(rataRicalc.getDtScadRata()));
Rata rata = new Rata();
rata.setDtScadRata(rataRicalc.getDtScadRata());
if(dataRimborsoAttuale.before(rataRicalc.getDtScadRata())){
if(tipoRicalcolo.equals("P")){
if(finanziamento.isRicalcoloTaegDatiRimbGrad()){
if("I".equals( finanziamento.getFlagIpoteca())){
nuovoRimborsoMinimo = calcoloRimborsoPercentuale(finanziamento,dataRimborsoAttuale);
}else{
nuovoRimborsoMinimo = 0d;
}
}else{
nuovoRimborsoMinimo = calcoloRimborsoPercentuale(finanziamento,dataRimborsoAttuale);
}
}
log.debug("nuovoDebitoResiduo " + nuovoDebitoResiduo);
log.debug("nuovoRimborsoMinimo " + nuovoRimborsoMinimo);
if( (nuovoDebitoResiduo.doubleValue() - (nuovoRimborsoMinimo.doubleValue() + rimborsoAVista.doubleValue()) > 0) && !fineCalcolo){
if(nuovoRimborsoMinimo+rimborsoAVista>0){
log.debug("primo if ");
rata.setProgressivoRata(progRata);
rata.setPgrRataPrec(0);
rata.setDtScadRata(dataRimborsoAttuale);
rata.setQuotaInteressi(0d);
rata.setQuotaDietimi(0d);
rata.setQuotaSpese(0d);
rata.setQuotaCapitale(nuovoRimborsoMinimo+rimborsoAVista);
rata.setImpRata(nuovoRimborsoMinimo+rimborsoAVista);
rata.setCodiceFormaPagamento(rataRicalc.getCodiceFormaPagamento());
rata.setNumeroIndirizzo(rataRicalc.getNumeroIndirizzo());
//Mi porto dietro i dati del risconto 05/11/2010
rata.setQuotaRisconto(rataRicalc.getQuotaRisconto());
rata.setRiscontoCalcolato(rataRicalc.getRiscontoCalcolato());
if(finanziamento.getModalitaRimborso().getTipoGenerazionePiano().equals("I")){
rata.setCodicePosizioneRata(0);
}else{
rata.setCodicePosizioneRata(2);
}
nuovoDebitoResiduo -=(nuovoRimborsoMinimo+rimborsoAVista);
rata.setCapitaleResiduo(nuovoDebitoResiduo);
rata.setTipoRata("C");
rimborsoAVista=0d;
progRata++;
dataIndicizzazione = dataPrimaIndicizzazione;
while(dataIndicizzazione.before(dataRimborsoAttuale)){
dataIndicizzazione = DateUtils.addMonths(dataIndicizzazione, finanziamento.getPeriodicitaIndicizzazione());
}
if(!rataRicalc.getDtScadRata().after(dataIndicizzazione) || finanziamento.getTipoPeriodicita() == 1 ){
rataInPeriodoInd=true;
}else{
rataInPeriodoInd=false;
}
rateDaAggiungere.add(rata);
}
}else if(!fineCalcolo){
if(nuovoDebitoResiduo>1d){
log.debug("not fine calcolo ");
rata.setProgressivoRata(progRata);
rata.setPgrRataPrec(0);
rata.setDtScadRata(dataRimborsoAttuale);
rata.setQuotaInteressi(0d);
rata.setQuotaDietimi(0d);
rata.setQuotaSpese(0d);
rata.setQuotaCapitale(nuovoDebitoResiduo-1d);
rata.setImpRata(nuovoDebitoResiduo-1d);
rata.setCodiceFormaPagamento(rataRicalc.getCodiceFormaPagamento());
rata.setNumeroIndirizzo(rataRicalc.getNumeroIndirizzo());
if(finanziamento.getModalitaRimborso().getTipoGenerazionePiano().equals("I")){
rata.setCodicePosizioneRata(0);
}else{
rata.setCodicePosizioneRata(2);
}
//Mi porto dietro i dati del risconto 05/11/2010
rata.setQuotaRisconto(rataRicalc.getQuotaRisconto());
rata.setRiscontoCalcolato(rataRicalc.getRiscontoCalcolato());
nuovoDebitoResiduo =1d;
rimborsoAVista=0d;
rata.setCapitaleResiduo(nuovoDebitoResiduo);
rata.setTipoRata("C");
progRata++;
dataIndicizzazione = dataPrimaIndicizzazione;
while(dataIndicizzazione.before(dataRimborsoAttuale)){
dataIndicizzazione = DateUtils.addMonths(dataIndicizzazione, finanziamento.getPeriodicitaIndicizzazione());
}
if(!rataRicalc.getDtScadRata().after(dataIndicizzazione) || finanziamento.getTipoPeriodicita() == 1){
rataInPeriodoInd=true;
}else{
rataInPeriodoInd=false;
}
rateDaAggiungere.add(rata);
}
fineCalcolo=true;
}
dataRimborsoAttuale= DateUtils.addMonths(dataRimborsoAttuale, finanziamento.getModalitaRimborso().getPeriodicitaRimborso());
}
if(!rataInPeriodoInd){
nuovoInteressiContrattuali=RoundUtils.round2Cifre(nuovoDebitoResiduo * finanziamento.getTassoPeriodale());
nuovoInteressiPerIndicizzazione=RoundUtils.round2Cifre(nuovoDebitoResiduo * tassoCalcolo);
}else{
nuovoInteressiContrattuali=RoundUtils.round2Cifre(vecchioDebitoResiduo * finanziamento.getTassoPeriodale());
nuovoInteressiPerIndicizzazione=RoundUtils.round2Cifre(vecchioDebitoResiduo * tassoCalcolo);
}
nuovoImportoRata=nuovoInteressiPerIndicizzazione+(rataRicalc.getQuotaDietimi()==null?0:rataRicalc.getQuotaDietimi());
if(rataRicalc.getProgressivoRata()!=progRata){
rataRicalc.setPgrRataPrec(rataRicalc.getProgressivoRata());
}else{
rataRicalc.setPgrRataPrec(0);
}
rataRicalc.setProgressivoRata(progRata);
//20110225: cambiato per ripetere la modifica al calcolo fatta il 18/03/2009 da giangy
if(rataRicalc.getCodicePosizioneRata() == null || rataRicalc.getCodicePosizioneRata() == 1 ) {
// if(rataRicalc.getCodicePosizioneRata() == null || rataRicalc.getCodicePosizioneRata() < 2 ) {
//luisa e alberto 20101029
/*
* 0 = rata di capitale fittizio
* 1 = rata di interessi NON indicizzati
*/
if(!rataInPeriodoInd){
rataRicalc.setCapitaleResiduo(nuovoDebitoResiduo);
vecchioDebitoResiduo = nuovoDebitoResiduo;
}else{
rataRicalc.setCapitaleResiduo(vecchioDebitoResiduo);
}
if( nuovoInteressiPerIndicizzazione + NumberUtils.checkNull(rataRicalc.getQuotaDietimi()) <0 ){
nuovoImportoRata = 0.0;
dietimiInEccesso += nuovoInteressiPerIndicizzazione + NumberUtils.checkNull(rataRicalc.getQuotaDietimi());
rataRicalc.setQuotaDietimi(-1 * nuovoInteressiPerIndicizzazione);
}else{
if( dietimiInEccesso + nuovoInteressiPerIndicizzazione + NumberUtils.checkNull(rataRicalc.getQuotaDietimi()) >=0 ){
nuovoImportoRata = dietimiInEccesso + nuovoInteressiPerIndicizzazione + NumberUtils.checkNull(rataRicalc.getQuotaDietimi());
rataRicalc.setQuotaDietimi(NumberUtils.checkNull(rataRicalc.getQuotaDietimi())+dietimiInEccesso);
dietimiInEccesso = 0.0;
}else{
nuovoImportoRata = 0.0;
dietimiInEccesso += nuovoInteressiPerIndicizzazione + NumberUtils.checkNull(rataRicalc.getQuotaDietimi());
rataRicalc.setQuotaDietimi(-1 * nuovoInteressiPerIndicizzazione);
}
}
rataRicalc.setQuotaCapitale(0d);
rataRicalc.setQuotaInteressi(nuovoInteressiContrattuali);
rataRicalc.setQuotaIndicizzo(nuovoInteressiPerIndicizzazione-nuovoInteressiContrattuali);
rataRicalc.setImpRata(nuovoImportoRata+rataRicalc.getQuotaSpese());
if(nuovoImportoRata <= 0d) {
//Albe 20110228: perch� aggionra la rata anzich� rataRicalc??? lo cambio...
rataRicalc.setCodicePosizioneRata(1);
if(RoundUtils.round2Cifre(rataRicalc.getQuotaInteressi()) <= 0d &&
RoundUtils.round2Cifre(rataRicalc.getQuotaIndicizzo()) <= 0d) {
//non caricare rate con importi a zero!
rataRicalc.setQuotaInteressi(0.01d);
rataRicalc.setQuotaIndicizzo(-0.01d);
}
}
//la parte qui sotto � SBAGLIATA!!!!!
/*if((nuovoImportoRata+rataRicalc.getQuotaSpese()) <= 0d ){
rataRicalc.setCodicePosizioneRata(0);
}else{
if(rataRicalc.getCodicePosizioneRata() != null && rataRicalc.getCodicePosizioneRata() == 0){
rataRicalc.setCodicePosizioneRata(1);
}
}*/
}// else {
/*
* 0 = rata di capitale fittizio
* 2 = rata indicizzata (tipoRata = I)
* 3 = disposizione (tipoRata = I)
* 4 = distinta in banca (tipoRata = I)
* 5 = pagata (tipoRata = I oppure C - I = interessi, C = capitale)
*/
// if(nuovoImportoRata <= 0d) {
// rata.setCodicePosizioneRata(0);
// }
//}
}//end ciclo for
Rata ultimaRata = new Rata();
progRata++;
ultimaRata.setProgressivoRata(progRata);
ultimaRata.setPgrRataPrec(0);
ultimaRata.setDtScadRata(rateDaRicalcolare.get(rateDaRicalcolare.size()-1).getDtScadRata());
ultimaRata.setQuotaInteressi(0d);
ultimaRata.setQuotaDietimi(0d);
ultimaRata.setQuotaCapitale(nuovoDebitoResiduo);
ultimaRata.setImpRata(nuovoDebitoResiduo);
ultimaRata.setQuotaSpese(0d);
ultimaRata.setCapitaleResiduo(0d);
ultimaRata.setTipoRata("C");
ultimaRata.setCodiceFormaPagamento(rateDaRicalcolare.get(rateDaRicalcolare.size()-1).getCodiceFormaPagamento());
ultimaRata.setNumeroIndirizzo(rateDaRicalcolare.get(rateDaRicalcolare.size()-1).getNumeroIndirizzo());
//Mi porto dietro i dati del risconto 05/11/2010
ultimaRata.setQuotaRisconto(rateDaRicalcolare.get(rateDaRicalcolare.size()-1).getQuotaRisconto());
ultimaRata.setRiscontoCalcolato(rateDaRicalcolare.get(rateDaRicalcolare.size()-1).getRiscontoCalcolato());
if(finanziamento.getModalitaRimborso().getTipoGenerazionePiano().equals("I")){
ultimaRata.setCodicePosizioneRata(0);
}
finanziamento.setRateNonRicalcolate(rateDaNonRicalcolare);
rateDaRicalcolare.addAll(rateDaNonRicalcolare);