View Javadoc

1   /*
2    * Criado em 26/04/2005
3    *
4    */
5   package ecar.servlet.grafico;
6   
7   import java.awt.Font;
8   import java.io.IOException;
9   import java.util.Iterator;
10  import java.util.List;
11  import java.util.Set;
12  
13  import javax.servlet.ServletException;
14  import javax.servlet.http.HttpServlet;
15  import javax.servlet.http.HttpServletRequest;
16  import javax.servlet.http.HttpServletResponse;
17  
18  import org.apache.log4j.Logger;
19  import org.jfree.chart.ChartFactory;
20  import org.jfree.chart.ChartUtilities;
21  import org.jfree.chart.JFreeChart;
22  import org.jfree.chart.axis.CategoryAxis;
23  import org.jfree.chart.axis.ValueAxis;
24  import org.jfree.chart.labels.CategoryItemLabelGenerator;
25  import org.jfree.chart.labels.ItemLabelAnchor;
26  import org.jfree.chart.labels.ItemLabelPosition;
27  import org.jfree.chart.plot.CategoryPlot;
28  import org.jfree.chart.plot.PlotOrientation;
29  import org.jfree.chart.renderer.category.CategoryItemRenderer;
30  import org.jfree.chart.title.TextTitle;
31  import org.jfree.data.category.CategoryDataset;
32  import org.jfree.data.category.DefaultCategoryDataset;
33  import org.jfree.ui.TextAnchor;
34  
35  import comum.util.Pagina;
36  
37  import ecar.dao.AcompRealFisicoDao;
38  import ecar.dao.AcompReferenciaItemDao;
39  import ecar.dao.ExercicioDao;
40  import ecar.dao.ItemEstrtIndResulDao;
41  import ecar.exception.ECARException;
42  import ecar.pojo.AcompRealFisicoArf;
43  import ecar.pojo.AcompReferenciaItemAri;
44  import ecar.pojo.ExercicioExe;
45  import ecar.pojo.ItemEstrtIndResulIettr;
46  
47  /**
48   * @author evandro
49   *
50   */
51  public class GraficoRealizadoPorExercicio extends HttpServlet{
52      /**
53  	 * 
54  	 */
55  	private static final long serialVersionUID = 6114387130036357031L;
56  	private Logger logger = null;
57      
58      public GraficoRealizadoPorExercicio() {
59          this.logger = Logger.getLogger(this.getClass());
60          
61       }
62      
63      /**
64       * Gera Grafico com valores do realizado por exercicio.<br>
65       * 
66       * @author N/C
67       * @since N/C
68       * @version N/C
69       * @param HttpServletRequest request
70       * @param HttpServletResponse response
71       * @throws ServletException
72       * @throws IOException
73       */
74      public final void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
75          
76  	    try {
77  	        JFreeChart grafico;
78  	        DefaultCategoryDataset dataset = new DefaultCategoryDataset();
79  	        String categoria = "Total Realizado";
80  	        String serie = "";
81  	        String indicador = "";
82  	        int numExe = 0;
83  	        boolean existeLabelGrupo = false;
84  	        
85  	        AcompReferenciaItemDao acompRefItemDao = new AcompReferenciaItemDao(null);
86  	        AcompReferenciaItemAri acompRefItem = (AcompReferenciaItemAri) acompRefItemDao.buscar(AcompReferenciaItemAri.class, Long.valueOf(Pagina.getParamStr(request, "codAri")));
87  	        long mesRef = Long.valueOf(acompRefItem.getAcompReferenciaAref().getMesAref());
88  	        long anoRef = Long.valueOf(acompRefItem.getAcompReferenciaAref().getAnoAref());
89  	        
90  	        if(!"".equals(Pagina.getParamStr(request, "codExe"))){
91  	        	ExercicioDao exercicioDao = new ExercicioDao(null);
92  	        	ExercicioExe exercicio = (ExercicioExe) exercicioDao.buscar(ExercicioExe.class, Long.valueOf(Pagina.getParamStr(request, "codExe")));
93  	        	
94  	        	//List listaExeAnt = exercicioDao.getExerciciosAnteriores(exercicio);
95  	        	List listaExeAnt = exercicioDao.getExerciciosProjecao(acompRefItem.getItemEstruturaIett().getCodIett());
96  	        	numExe = listaExeAnt.size();
97  	        	//listaExeAnt.add(acompRefItem.getAcompReferenciaAref().getExercicioExe());
98  	        	
99  	        	if(!"".equals(Pagina.getParamStr(request, "codIettir"))){
100 	        		ItemEstrtIndResulDao indResulDao = new ItemEstrtIndResulDao(null);
101 	        		ItemEstrtIndResulIettr indResul = (ItemEstrtIndResulIettr) indResulDao.buscar(ItemEstrtIndResulIettr.class, Long.valueOf(Pagina.getParamStr(request, "codIettir")));
102 	        		
103 	        		indicador = indResul.getNomeIettir();
104 	        		String indAcumulavel = indResul.getIndAcumulavelIettr();
105 	        		
106 	        		AcompRealFisicoDao acompRealFisicoDao = new AcompRealFisicoDao(null);
107 	        		
108 	        		//Verifica, através da opção "Nome do agrupamento para o Gráfico de Grupos" da tela de cadastro de metas/indicadores, se o indicador pertence a algum grupo.
109 	        		existeLabelGrupo = indResul.getLabelGraficoGrupoIettir() != null;
110 	        		if(existeLabelGrupo){
111 		        		//Retorna um DefaultCategoryDataet com todas as metas/indicadores do item que participam do mesmo "Gráfico de Grupo do Indicador" e/ou que foram cadastradas como públicas
112 		        	    //e que participam do mesmo Gráfico de Grupo do Indicador.
113 	        			dataset = imprimeIndicadoresMesmoGrupo(indResul, listaExeAnt, dataset, mesRef, anoRef, request);	        		
114 	        		}else{
115 	        			
116 		        		Iterator it = listaExeAnt.iterator();
117 		        		
118 		        		while(it.hasNext()){
119 		        			ExercicioExe exercAnt = (ExercicioExe) it.next();
120 		        			double valor = 0;
121 	
122 		        			/*
123 		        			if(exercAnt.equals(acompRefItem.getAcompReferenciaAref().getExercicioExe())){
124 		        				
125 		        				if("S".equals(indAcumulavel)){
126 									AcompReferenciaAref aref = acompRefItem.getAcompReferenciaAref();
127 									int mesRef = Integer.valueOf(aref.getMesAref()).intValue();
128 									int anoRef = Integer.valueOf(aref.getAnoAref()).intValue();
129 									valor = acompRealFisicoDao.getQtdRealizadaExercicio(exercAnt, indResul, mesRef, anoRef);
130 		        				}
131 		        				else {
132 		        					valor = acompRealFisicoDao.getQtdRealizadaExercicioNaoAcumulavel(exercAnt, indResul);
133 		        				}
134 								
135 							} else {
136 								if("S".equals(indAcumulavel)){
137 									valor = acompRealFisicoDao.getQtdRealizadaExercicio(exercAnt, indResul);
138 								}
139 								else {
140 		        					valor = acompRealFisicoDao.getQtdRealizadaExercicioNaoAcumulavel(exercAnt, indResul);
141 								}
142 							}*/
143 	
144 		        			if("S".equals(indAcumulavel)){
145 								valor = acompRealFisicoDao.getQtdRealizadaExercicio(exercAnt, indResul, acompRefItem.getAcompReferenciaAref());
146 							}
147 							else {
148 	        					valor = acompRealFisicoDao.getQtdRealizadaExercicioNaoAcumulavel(exercAnt, indResul, acompRefItem.getAcompReferenciaAref());
149 							}
150 		        			
151 		        			serie = exercAnt.getDescricaoExe();
152 		            		dataset.addValue(valor, indResul.getNomeIettir(), serie);
153 		        		}	        		
154 	        		}
155 	        	}else{
156 	        		serie = exercicio.getDescricaoExe();
157 	        		dataset.addValue(0, categoria, serie);
158 	        	}
159 	        }else{
160 	            dataset.addValue(0, categoria, serie);
161 	        }
162 	        
163 	        if(existeLabelGrupo){
164 	        	indicador = "";
165 	        }
166 	
167 	        grafico = ChartFactory.createBarChart3D("Valores Realizado por Exercício",
168 	                                               "",
169 	                                               indicador,
170 	                                               dataset,
171 	                                               PlotOrientation.VERTICAL,
172 	                                               true,
173 	                                               true,
174 	                                               false);
175 	                
176 	        CategoryPlot plot = grafico.getCategoryPlot();
177 	        
178 	        CategoryItemRenderer renderer = plot.getRenderer();
179 	        ItemLabelPosition posicao = new ItemLabelPosition(ItemLabelAnchor.OUTSIDE12,TextAnchor.BOTTOM_CENTER,TextAnchor.CENTER,0);
180 	        renderer.setPositiveItemLabelPosition(posicao);
181 	        
182 	        renderer.setItemLabelsVisible(true);
183 	        Font labelFont = new Font("Times new Roman", 0, 15);
184 	        renderer.setItemLabelFont(labelFont);
185 //	        renderer.setLabelGenerator(new LabelGenerator());
186 	        
187 	        TextTitle title = new TextTitle();
188 	        title.setFont(new Font("Arial", Font.PLAIN, 15));
189 	        title.setText("Valores Realizado por Exercício");
190 	        
191 	        grafico.setTitle(title);
192 	        
193 	        CategoryAxis categoryaxis = plot.getDomainAxis();
194 	        categoryaxis.setTickLabelFont(new Font("Arial", Font.PLAIN, 8)); 
195 	
196 	        ValueAxis valueaxis = plot.getRangeAxis();
197 	        valueaxis.setTickLabelFont(new Font("Arial", Font.PLAIN, 8)); 
198 	                
199 	        CategoryDataset catDataset = plot.getDataset();
200 	                
201 	        // para o tamanho do gráfico é bom ser maior q 1
202 	        if(numExe < 2){
203 	        	numExe = 2;
204 	        }
205 	        
206 	        response.setContentType("image/jpeg");
207 	        int comp = (numExe * 150);
208 	        int altura = 400;
209 	        ChartUtilities.writeChartAsPNG(response.getOutputStream(), grafico, comp, altura);
210 	        response.getOutputStream().flush();
211 	        response.getOutputStream().close();
212 	        
213 	    }catch (IOException e) {            
214             this.logger.error(e);
215 	    }catch (ECARException e) {            
216             this.logger.error(e);
217 	    }
218     }
219     
220     /** Retorna um DefaultCategoryDataet com todas as metas/indicadores do item que participam do mesmo "Gráfico de Grupo do Indicador" e/ou que foram cadastradas como públicas
221      *  e que participam do mesmo Gráfico de Grupo do Indicador.
222      * 
223      * @param indResul
224      * @param listaExeAnt
225      * @param dataset
226      * @param request
227      * @return
228      * @throws ECARException
229      */
230     private DefaultCategoryDataset imprimeIndicadoresMesmoGrupo(ItemEstrtIndResulIettr indResul,List listaExeAnt,DefaultCategoryDataset dataset, Long mesRef, Long anoRef, HttpServletRequest request) throws ECARException{
231     	
232     	ItemEstrtIndResulDao indResulDao = new ItemEstrtIndResulDao(null);
233     	AcompRealFisicoDao acompRealFisicoDao = new AcompRealFisicoDao(null);
234     	List listaIndicadoresGrupo = indResulDao.retornaIndicadoresGraficoGrupo(indResul);
235 		Iterator itListaIndicadoresGrupo = listaIndicadoresGrupo.iterator();
236 		String serie = "";
237 		
238 		//Percorre todos os indicadores que pertencem ao mesmo Grupo indicador
239 		while(itListaIndicadoresGrupo.hasNext()){
240 			double valorIndicadorExterno = 0;
241 			ItemEstrtIndResulIettr itemIndicadorIettr = (ItemEstrtIndResulIettr) itListaIndicadoresGrupo.next();
242 			
243 			Set listaIndicadorAcompRealFisico = itemIndicadorIettr.getAcompRealFisicoArfs();
244 			Iterator itListaIndicadorAcompRealFisico = listaIndicadorAcompRealFisico.iterator();
245 			
246 			//Percorre os acompanhamentos físicos realizados de cada indicador
247 			while(itListaIndicadorAcompRealFisico.hasNext()){
248 				AcompRealFisicoArf indicadorAcompRealFisico = (AcompRealFisicoArf) itListaIndicadorAcompRealFisico.next();
249 				
250 				List exerciciosAnterioresIndicador = new ExercicioDao(request).getExerciciosProjecao(indicadorAcompRealFisico.getItemEstruturaIett().getCodIett());
251 				Iterator itExAnterioresIndicador = exerciciosAnterioresIndicador.iterator();
252 				
253 				//Percorre os exercícios de cada acompanhamento físico realizado.
254 				while(itExAnterioresIndicador.hasNext()){
255 					ExercicioExe exercicioIndicadorAnterior = (ExercicioExe) itExAnterioresIndicador.next();
256 					
257 					//Ignora os exercícios posteriores ao ano informado.
258 					if(Long.valueOf(exercicioIndicadorAnterior.getDescricaoExe())>anoRef){
259 						break;
260 					}
261 					
262 	        		Iterator itInterno = listaExeAnt.iterator();
263 					while(itInterno.hasNext()){
264 						
265 						ExercicioExe exercAntInterno = (ExercicioExe) itInterno.next();
266 
267 						//Compara os exercícios dos indicadores encontrados com o exercício do indicador utilizado como referência na geração do gráfico.
268 						if(exercAntInterno.equals(exercicioIndicadorAnterior)){
269 							
270 							//Caso a meta/indicador seja definida como acumulável, o valor do indicador será a soma dos valores encontrados nos meses do exercício em questão.
271 							if("S".equals(itemIndicadorIettr.getIndAcumulavelIettr())){
272 								valorIndicadorExterno = acompRealFisicoDao.getQtdIndicadorGrupoRealizadaExercicio(indicadorAcompRealFisico.getItemEstrtIndResulIettr(), exercAntInterno, anoRef, mesRef);
273 							}
274 							
275 							//Recupera a quantidade realizada do indicador não acumulável no exercício, podendo ser o "Último Valor" ou o "Maior Valor",
276 							//de acordo com o que foi setado na configuração da Meta/Indicador. 
277 							else{
278 								valorIndicadorExterno = acompRealFisicoDao.getQtdIndicadorGrupoRealizadaExercicioNaoAcumulavel(indicadorAcompRealFisico.getItemEstrtIndResulIettr(),exercAntInterno, anoRef, mesRef);
279 							}
280 							
281 							//Adiciona ao Dataset os valores do indicador encontrado
282 							serie = String.valueOf(exercAntInterno.getDescricaoExe());							
283 	        				dataset.addValue(valorIndicadorExterno, itemIndicadorIettr.getNomeIettir(), serie);
284 	        				break;
285 						}
286 					}
287 				}
288 			}	
289 		}
290     	return dataset;
291     }
292     
293     /**
294      * Classe responsável pela geração do label utilizado no gráfico.
295      */
296     static class LabelGenerator implements CategoryItemLabelGenerator {
297     	
298     	/**
299     	* Gera o label para o item especificado.
300     	*
301     	* @param dataset
302     	* @param series
303     	* @param category
304     	*
305     	* @return O label que será utilizado no gráfico
306     	*/    	
307 		public String generateLabel(CategoryDataset dataSet, int series, int category) {
308 			
309 	    	int valor = dataSet.getValue(series, category).intValue();
310 	    	if(valor == 0){
311 	    		return "";
312 	    	}else{
313 	    		return String.valueOf(valor);
314 	    	}
315 		}
316 
317 		public String generateColumnLabel(CategoryDataset arg0, int arg1) {
318 			// TODO Auto-generated method stub
319 			return null;
320 		}
321 
322 		public String generateRowLabel(CategoryDataset arg0, int arg1) {
323 			// TODO Auto-generated method stub
324 			return null;
325 		}
326     }
327     
328 }