ExercicioDao exercicioDao = new ExercicioDao(null);
AcompReferenciaDao acompReferenciaDao = new AcompReferenciaDao(null);
AcompReferenciaItemDao acompReferenciaItemDao = new AcompReferenciaItemDao(null);
//Descobrir Meses
ItemEstrtIndResulIettr indicador = (ItemEstrtIndResulIettr) itemEstrtIndResulDao.buscar(ItemEstrtIndResulIettr.class, Long.valueOf(Pagina.getParamStr(request,"codIndicador")));
AcompReferenciaItemAri ari = (AcompReferenciaItemAri) acompReferenciaItemDao.buscar(AcompReferenciaItemAri.class, Long.valueOf(Pagina.getParamStr(request,"codAri")));
boolean comQtde = ("S".equals(Pagina.getParamStr(request, "comQtde")) ? true : false);
boolean soPrevisao = ("S".equals(Pagina.getParamStr(request, "soPrevisao")) ? true : false);
int[] meses = acompReferenciaItemDao.getMesAnoInicioFimMatrizProjecao(indicador, comQtde, soPrevisao);
int mesInicio = meses[0];
int anoInicio = meses[1];
if(soPrevisao){
mesInicio = Integer.valueOf(Pagina.getParamStr(request, "mesIni")).intValue();
anoInicio = Integer.valueOf(Pagina.getParamStr(request, "anoIni")).intValue();
}
else {
mesInicio = meses[0];
anoInicio = meses[1];
}
int mesFimRealizado = Integer.valueOf(ari.getAcompReferenciaAref().getMesAref()).intValue(); ;
int anoFimRealizado = Integer.valueOf(ari.getAcompReferenciaAref().getAnoAref()).intValue(); ;
TimeSeriesCollection data = new TimeSeriesCollection();
TimeSeries serie1 = new TimeSeries("Realizado", Month.class);
TimeSeries serie2 = new TimeSeries("Projetado", Month.class);
TimeSeries serie3 = new TimeSeries("Previsto", Month.class);
int auxMes = mesInicio;
int auxAno = anoInicio;
int i = 1;
double qtdeAnterior = 0;
while(auxAno < anoFimRealizado || (auxAno == anoFimRealizado && auxMes <= mesFimRealizado)){
String strMesInicio = Integer.valueOf(auxMes).toString();
if(strMesInicio.length() == 1)
strMesInicio = "0" + strMesInicio;
String strAnoInicio = Integer.valueOf(auxAno).toString();
Double qtde = new AcompRealFisicoDao(null).getQtdRealizadaMesAno(indicador, Long.valueOf(strMesInicio), Long.valueOf(strAnoInicio));
double qtdeSerie = 0;
//utilizar o valor refer�ncia para o in�cio da proje��o [por Thaise].
if (indicador.getIndiceMaisRecenteIettr()!= null && qtdeAnterior==0) {
qtdeAnterior = indicador.getIndiceMaisRecenteIettr().doubleValue();
}
if(qtde != null){
//qtdeSerie = qtdeAnterior + qtde.doubleValue();
//FIXME: Verificar regra do n�o-acumul�vel: Est� pegando o valor pq n�o tem uma lista de valores para comparar o �ltimo/maior.
if("S".equals(indicador.getIndAcumulavelIettr())){
qtdeSerie = qtdeAnterior + qtde.doubleValue();
}else {
qtdeSerie = qtde.doubleValue();
}
qtdeAnterior = qtdeSerie;
} else
qtdeSerie = qtdeAnterior;
serie1.add(new Month(auxMes, auxAno), qtdeSerie);
valuesProjection.add(qtdeSerie);
sMeses.add(Integer.valueOf(i));
sRealizado.add(new Double(qtdeSerie));
auxMes++;
if(auxMes == 13){
auxMes = 1;
auxAno++;
}
i++;
}
//Avan�a 1 mes
int mesAnt = auxMes;
int anoAnt = auxAno;
if(mesAnt - 1 == 0){
mesAnt = 12;
anoAnt--;
} else {
mesAnt--;
}
int mesFimProjecao = mesFimRealizado;
int anoFimProjecao = anoFimRealizado;
int xProjetado = 0;
int[] fimProjecao = acompReferenciaItemDao.getMesAnoFimProjecao(indicador);
mesFimProjecao = fimProjecao[0];
anoFimProjecao = fimProjecao[1];
//Descobrir o xProjetado (�ndice que mesFimProjecao/anoFimProjecao teria na matriz de realizados)
if(anoFimProjecao == anoFimRealizado){
xProjetado = i + (mesFimProjecao - mesFimRealizado);
} else {
while(anoFimProjecao > anoFimRealizado){ // Corre��o Thaise [antes era um !=]
mesFimRealizado++;
if(mesFimRealizado == 13){
anoFimRealizado++;
mesFimRealizado = 1;
}
xProjetado++;
}
xProjetado += i + mesFimProjecao;
}
//Descobrir at� onde vai o PREVISTO
String strMesInicio = Integer.valueOf(mesInicio).toString();
if(strMesInicio.length() == 1)
strMesInicio = "0" + strMesInicio;
String strMesFim = Integer.valueOf(mesFimProjecao).toString();
if(strMesFim.length() == 1)
strMesFim = "0" + strMesFim;
String strAnoInicio = Integer.valueOf(anoInicio).toString();
String strAnoFim = Integer.valueOf(anoFimProjecao).toString();
ExercicioExe exercicioInicial = acompReferenciaDao.getExercicio(strAnoInicio, strMesInicio);
ExercicioExe exercicioFinal = acompReferenciaDao.getExercicio(strAnoFim, strMesFim);
List exerciciosAnteriores = new ArrayList();
List exerciciosPosteriores = new ArrayList();
if(exercicioFinal!=null)
exerciciosAnteriores = exercicioDao.getExerciciosAnteriores(exercicioFinal);
if(exercicioInicial!=null)
exerciciosPosteriores = exercicioDao.getExerciciosPosteriores(exercicioInicial);
Set exerciciosDoPeriodo = new HashSet();
exerciciosDoPeriodo.addAll(Util.intersecao(exerciciosAnteriores, exerciciosPosteriores));
if(exercicioInicial!=null)
exerciciosDoPeriodo.add(exercicioInicial);
if(exercicioFinal!=null)
exerciciosDoPeriodo.add(exercicioFinal);
double previstoFinal = 0;
ArrayList<ItemEstrutFisicoIettf> previstos = new ArrayList<ItemEstrutFisicoIettf>(indicador.getItemEstrutFisicoIettfs());
if(previstos!=null && previstos.size()>0 && (previstos.get(0).getAnoIettf()!=anoInicio || previstos.get(0).getMesIettf()!=mesInicio)){
serie3.addOrUpdate(new Month(mesInicio,anoInicio),0);
}
for(ItemEstrutFisicoIettf previsto: previstos){
if("S".equals(indicador.getIndAcumulavelIettr())){
previstoFinal+=previsto.getQtdPrevistaIettf();
}else{
previstoFinal=previsto.getQtdPrevistaIettf();
}
serie3.addOrUpdate(new Month(previsto.getMesIettf(),previsto.getAnoIettf()),previstoFinal);
}
//plotar valores projetados at� ultimo mes de projecao, ou ent�o at� que projetado > previstoFinal
double ultimoProjetado = 0;
double projetadoAnterior = acompReferenciaItemDao.calcularPrevistoMes(sMeses, sRealizado, i);
while(i <= xProjetado){
i++;
auxMes++;
if(auxMes==13){
auxMes = 1;
auxAno++;
}
ultimoProjetado = acompReferenciaItemDao.calcularPrevistoMes(sMeses, sRealizado, i);
qtdeAnterior += (ultimoProjetado - projetadoAnterior);
projetadoAnterior = ultimoProjetado;
serie2.add(new Month(auxMes, auxAno), qtdeAnterior);
if(qtdeAnterior > previstoFinal) //qtdeAnterior jah � maior que previsto final, break it!
break;
}
//Continua a segunda s�rie at� ultrapassar previstoFinal (caso j� n�o tenha ultrapassado)
while(qtdeAnterior < previstoFinal && qtdeAnterior>0){
i++;
auxMes++;
if(auxMes > 12){
auxMes = 1;
auxAno++;
}
ultimoProjetado = acompReferenciaItemDao.calcularPrevistoMes(sMeses, sRealizado, i);
qtdeAnterior += (ultimoProjetado - projetadoAnterior);
projetadoAnterior = ultimoProjetado;
}
if(!soPrevisao)
data.addSeries(serie1);
if(comQtde){
Date start = getDataInicioProjecaoIndicador(Pagina.getParam(request, "codIndicador"), Pagina.getParam(request, "codAri"), comQtde, soPrevisao);
GregorianCalendar calendar = new GregorianCalendar();
calendar.setTime(start);
Projection myProjection = FactoryCalculoProjecao.getProjection(tipoProjecao, valuesProjection, calendar);
TimeSeries projectionSerie = new TimeSeries("Projetado", Month.class);
calendar.add(GregorianCalendar.MONTH,valuesProjection.size()-1);
Map<GregorianCalendar,Double> projection = myProjection.getMapProjection(calendar, myProjection.getDate(previstoFinal));
for(GregorianCalendar date: projection.keySet()){
projectionSerie.add(new Month(date.get(GregorianCalendar.MONTH) + 1, date.get(GregorianCalendar.YEAR)), projection.get(date));
}
data.addSeries(projectionSerie);
}
data.addSeries(serie3);
data.setDomainIsPointsInTime(true);
grafico = ChartFactory.createTimeSeriesChart(
indicador.getNomeIettir(),
"Meses",
"Quantidade Realizada",
data,
true,
true,