View Javadoc

1   /*
2    * Created on 29/09/2006
3    *
4    */
5   package ecar.servlet.relatorio;
6   
7   import java.util.ArrayList;
8   import java.util.Collections;
9   import java.util.Comparator;
10  import java.util.Date;
11  import java.util.HashSet;
12  import java.util.Iterator;
13  import java.util.List;
14  import java.util.Set;
15  
16  import javax.servlet.http.HttpServletRequest;
17  
18  import org.hibernate.HibernateException;
19  
20  import comum.util.Data;
21  import comum.util.Mensagem;
22  import comum.util.Pagina;
23  import comum.util.Util;
24  import comum.util.XmlBuilder;
25  
26  import ecar.dao.AcompRealFisicoDao;
27  import ecar.dao.AcompReferenciaDao;
28  import ecar.dao.AcompReferenciaItemDao;
29  import ecar.dao.ConfigRelatorioCfgrelDAO;
30  import ecar.dao.ConfiguracaoDao;
31  import ecar.dao.CorDao;
32  import ecar.dao.EstruturaAtributoDao;
33  import ecar.dao.EstruturaFuncaoDao;
34  import ecar.dao.ExercicioDao;
35  import ecar.dao.ItemEstrtIndResulDao;
36  import ecar.dao.ItemEstruturaContaOrcamentoDao;
37  import ecar.dao.ItemEstruturaDao;
38  import ecar.dao.ItemEstruturaPrevisaoDao;
39  import ecar.dao.ItemEstruturaRealizadoDao;
40  import ecar.dao.ModeloRelatorioMrelDAO;
41  import ecar.exception.ECARException;
42  import ecar.pojo.AcompRealFisicoArf;
43  import ecar.pojo.AcompReferenciaAref;
44  import ecar.pojo.AcompReferenciaItemAri;
45  import ecar.pojo.AcompRelatorioArel;
46  import ecar.pojo.ConfigRelatorioCfgrel;
47  import ecar.pojo.ConfiguracaoCfg;
48  import ecar.pojo.EfItemEstContaEfiec;
49  import ecar.pojo.EfItemEstPrevisaoEfiep;
50  import ecar.pojo.ExercicioExe;
51  import ecar.pojo.ItemEstruturaIett;
52  import ecar.pojo.ModeloRelatorioMrel;
53  import ecar.util.Dominios;
54  
55  /**
56   * Servlet do Relatório de Acompanhamento. <br>
57   * Relatório antigamente feito em Access, foi convertido para Java (FOP).<br>
58   * 
59   * @author aleixo
60   * @since Outubro/2006.
61   * @see Mantis: 6052
62   */
63  
64  public class RelatorioAcompanhamento_BKP_07032007 extends AbstractServletReportXmlXsl {
65  
66      /**
67  	 * 
68  	 */
69  	private static final long serialVersionUID = 2395457474744685932L;
70  	
71  	private static final String MODELO_ESTRUTURA = "ECAR-001C";
72  	
73  	private HttpServletRequest request;
74  	private ConfiguracaoDao configDao;
75  	private ConfiguracaoCfg config;
76  	private AcompReferenciaDao acompReferenciaDao;
77  	private AcompReferenciaItemDao acompReferenciaItemDao;
78  	private AcompRealFisicoDao acompRealFisicoDao;
79  	private CorDao corDao;
80  	private ConfigRelatorioCfgrel configRel;
81  	private ConfigRelatorioCfgrelDAO configRelDao;
82  	private String pathEcar;
83  	private String modelo;
84  	private EstruturaAtributoDao estAtribDao;
85  	private EstruturaFuncaoDao estFuncDao;
86  	private ItemEstruturaDao itemEstruturaDao;
87  	private ItemEstruturaPrevisaoDao itemEstPrevDao;
88  	private ItemEstruturaRealizadoDao itemEstRealizadoDao;
89  	private ItemEstruturaContaOrcamentoDao itemEstContaOrcDao;
90  	private ItemEstrtIndResulDao itemEstrtIndResulDao;
91  	
92  	/**
93  	 * Gera XML.<br>
94  	 * 
95  	 * @author N/C
96       * @since N/C
97       * @version N/C
98  	 * @param HttpServletRequest request
99  	 * @return StringBuffer
100 	 * @throws ECARException
101 	 */
102 	public StringBuffer getXml(HttpServletRequest request) throws ECARException{
103 		XmlBuilder builder = new XmlBuilder();
104 		
105 		Util.liberarImagem();
106 		
107 		acompReferenciaDao = new AcompReferenciaDao(request);
108 		acompReferenciaItemDao = new AcompReferenciaItemDao(request);
109 		acompRealFisicoDao = new AcompRealFisicoDao(request);
110 		configDao = new ConfiguracaoDao(request);
111 		corDao = new CorDao(request);
112 		configRelDao = new ConfigRelatorioCfgrelDAO(request);
113 		estAtribDao = new EstruturaAtributoDao(request);
114 		estFuncDao = new EstruturaFuncaoDao(request);
115 		itemEstruturaDao = new ItemEstruturaDao(request);
116 		itemEstPrevDao = new ItemEstruturaPrevisaoDao(request);
117 		itemEstRealizadoDao = new ItemEstruturaRealizadoDao(request);
118 		itemEstContaOrcDao = new ItemEstruturaContaOrcamentoDao(request);
119 		itemEstrtIndResulDao = new ItemEstrtIndResulDao(request);
120 		
121 		this.request = request;
122 		config = configDao.getConfiguracao();
123 		pathEcar = request.getContextPath();
124 		configRel = configRelDao.getConfigRelatorioCfgrel();		
125 		
126 		String opcaoModelo = Pagina.getParamStr(request, "opcaoModelo");
127 		ModeloRelatorioMrel mrel = new ModeloRelatorioMrelDAO(request).getModeloRelatorioByCodAlfa(opcaoModelo);
128 		
129 		AcompReferenciaAref mesReferencia = (AcompReferenciaAref) acompReferenciaDao.buscar(AcompReferenciaAref.class, Long.valueOf(Pagina.getParamStr(request, "mesReferencia")));
130 		
131 		/*Definindo o título*/
132 		String titulo = "";
133 		if(!"".equals(Pagina.getParamStr(request, "tituloCustomizado")))
134 			titulo = Pagina.getParamStr(request, "tituloCustomizado");
135 		else {
136 			if(configRel != null && !"".equals(configRel.getTituloCfgrel()))
137 				titulo = configRel.getTituloCfgrel();
138 			else
139 				titulo = config.getTituloSistema();
140 				
141 		}
142 
143 		/*Definindo o rodapé*/
144 		String rodape = geraDataRodape();
145 		if(!"".equals(Pagina.getParamStr(request, "rodapeCustomizado")))
146 			rodape += " - "  + Pagina.getParamStr(request, "rodapeCustomizado");
147 		else {
148 			if(configRel != null && configRel.getNotaRodapeCfgrel() != null && !"".equals(configRel.getNotaRodapeCfgrel()))
149 				rodape += " - " + configRel.getNotaRodapeCfgrel();
150 		}
151 		
152 		String arisSelecionados = Pagina.getParamStr(request, "arisSelecionados");
153 		
154 		/*
155 		 * Se arisSelecionados == "", é por que o relatório foi pedido da tela de Opçoes,
156 		 * ou seja, se opcaoModelo == ECAR-001B, são escolhidos todos os itens de um órgão específico;
157 		 * se opcaoModelo == ECAR-002B, são escolhidos todos os itens que possuem uma situação específica.
158 		 * 
159 		 * Obs.: opcaoModelo só vai ter esses valores se arisSelecionados == "". Caso arisSelecionados != "",
160 		 * é por que os itens foram filtrados e as opções escolhidas virão da tela de Formato.
161 		 */
162 		
163 		List codArisSelecionados = new ArrayList();
164 		
165 		if(!"".equals(arisSelecionados)){
166 			String[] codAris = arisSelecionados.split(";");
167 			for(int i = 0; i < codAris.length; i++){
168 				if(!"".equals(codAris[i]) && !";".equals(codAris[i])){
169 					codArisSelecionados.add(Long.valueOf(codAris[i]));
170 				}
171 			}
172 		}
173 		
174 		List arels = acompReferenciaItemDao.getAcompRelatorioAcompanhamentoByAris(codArisSelecionados, mesReferencia, opcaoModelo, Pagina.getParamStr(request, "chaveEscolhida"), Pagina.getParamStr(request, "tipoFuncAcompTpfa"));
175 		
176 		/* Início do relatório */
177 		builder.addNode("relatorio", 
178 				" titulo=\"" + builder.normalize(titulo) + "\"" +
179 				" mesReferencia=\"" + builder.normalize(mesReferencia.getNomeAref()) + "\"" +
180 				" codModelo=\"" + builder.normalize(mrel.getCodAlfaMrel() + " - " + mrel.getClassifMrel()) + "\"" +
181 				" rodape=\"" + builder.normalize(rodape) + "\"" +
182 				"");
183 		
184 		modelo = mrel.getCodAlfaMrel();
185 		
186 		geraXmlPrincipal(builder, arels);
187 		
188 		builder.closeNode("relatorio");
189         return builder.toStringBuffer();
190     }
191     
192 	/**
193 	 * Gera xml principal.<br>
194 	 * 
195 	 * @author N/C
196      * @since N/C
197      * @version N/C
198 	 * @param XmlBuilder builder
199 	 * @param List arels
200 	 * @throws ECARException
201 	 */
202 	private void geraXmlPrincipal(XmlBuilder builder, List arels) throws ECARException{
203 		builder.addNode("principal");
204 		
205 		if(arels != null && !arels.isEmpty()){
206 			Iterator it = arels.iterator();
207 			boolean primeiroItem = true;
208 			String siglaOrgaoImpresso = "";
209 			
210 			long codIett = -1;
211 			int indice = 0;
212 			Set ascendentes = new HashSet();
213 			while(it.hasNext()){
214 				AcompRelatorioArel arel = (AcompRelatorioArel) it.next();
215 
216 				String siglaOrg = "";
217 				
218 				if(arel.getAcompReferenciaItemAri().getItemEstruturaIett().getOrgaoOrgByCodOrgaoResponsavel1Iett() != null){
219 					siglaOrg = arel.getAcompReferenciaItemAri().getItemEstruturaIett().getOrgaoOrgByCodOrgaoResponsavel1Iett().getSiglaOrg();
220 				}
221 				else {
222 					siglaOrg = "Órgão não informado";
223 				}
224 
225 				String siglaOrgItem = "";
226 				if(MODELO_ESTRUTURA.equals(modelo)){
227 					if(arel.getAcompReferenciaItemAri().getItemEstruturaIett().getOrgaoOrgByCodOrgaoResponsavel1Iett() != null){
228 						siglaOrgItem = arel.getAcompReferenciaItemAri().getItemEstruturaIett().getOrgaoOrgByCodOrgaoResponsavel1Iett().getSiglaOrg();
229 					}
230 					else {
231 						siglaOrgItem = "Órgão não informado";
232 					}
233 				}
234 				
235 				if(!siglaOrgaoImpresso.equals(siglaOrg)){
236 					siglaOrgaoImpresso = siglaOrg;
237 					if(!primeiroItem){
238 						builder.closeNode("itens");
239 					}
240 					
241 					String exibirOrgao = "S";
242 					String quebrarPaginaItens = "S";
243 					if(MODELO_ESTRUTURA.equals(modelo)){
244 						exibirOrgao = "N";
245 						quebrarPaginaItens = "N";
246 					}
247 					builder.addNode("itens", "orgao=\"" + builder.normalize(siglaOrgaoImpresso) + "\" exibirOrgao=\"" + builder.normalize(exibirOrgao) + "\" quebrarPaginaItens=\"" + builder.normalize(quebrarPaginaItens) + "\"");
248 				}
249 				
250 				
251 				if(codIett != arel.getAcompReferenciaItemAri().getItemEstruturaIett().getCodIett().longValue()){
252 					boolean geraHierarquia = primeiroItem || (ascendentes != null && !ascendentes.containsAll(itemEstruturaDao.getAscendentes(arel.getAcompReferenciaItemAri().getItemEstruturaIett())));
253 					codIett = arel.getAcompReferenciaItemAri().getItemEstruturaIett().getCodIett().longValue();
254 					ascendentes.addAll(geraXmlItens(builder, arel, estAtribDao.getDescricaoItemByAtributo(arel.getAcompReferenciaItemAri().getItemEstruturaIett(), arel.getAcompReferenciaItemAri().getAcompReferenciaAref().getTipoAcompanhamentoTa()), false, geraHierarquia, siglaOrgItem, primeiroItem));
255 					
256 				}
257 				else {
258 					boolean exibirComplemento = false;
259 					if((indice + 1) < arels.size() || (indice == arels.size() - 1)){
260 						int proximo = indice + 1;
261 						
262 						try{
263 							AcompRelatorioArel proximoArel = (AcompRelatorioArel) arels.get(proximo);
264 							exibirComplemento = !arel.getAcompReferenciaItemAri().equals(proximoArel.getAcompReferenciaItemAri());
265 						}
266 						catch (IndexOutOfBoundsException e) {
267 							//Não tem mais itens na lista, exibe o complemento.
268 							exibirComplemento = true;
269 						}
270 					}
271 					
272 					geraXmlItens(builder, arel, "", exibirComplemento, false, siglaOrgItem, primeiroItem);
273 				}
274 				indice++;
275 				primeiroItem = false;
276 				
277 			}
278 			builder.closeNode("itens");
279 		}
280 		else {
281 			builder.addClosedNode("semItens");			
282 		}
283 
284 		builder.closeNode("principal");
285 	}
286 	
287 	/**
288 	 * Gera itens xml.<br>
289 	 * 
290 	 * @author N/C
291      * @since N/C
292      * @version N/C
293      * @param XmlBuilder builder
294      * @param AcompRelatorioArel arel
295      * @param String nomeItem
296      * @param boolean exibirComplemento
297      * @param boolean gerarHierarquia
298      * @param String orgao
299      * @param boolean primeiroItem
300 	 * @return List
301 	 * @throws ECARException
302 	 */
303 	private List geraXmlItens(XmlBuilder builder, AcompRelatorioArel arel, String nomeItem, 
304 			boolean exibirComplemento, boolean gerarHierarquia, String orgao, boolean primeiroItem) throws ECARException{
305 
306 		if(!MODELO_ESTRUTURA.equals(modelo)){
307 			orgao = "";
308 		}
309 		
310 		builder.addNode("item", "nomeItem=\"" + builder.normalize(nomeItem) + "\" orgaoItem=\"" + builder.normalize(orgao) + "\"");
311 		List retorno = new ArrayList();
312 		
313 		if(MODELO_ESTRUTURA.equals(modelo) && gerarHierarquia){
314 			boolean quebrarPagina = true;
315 			
316 			if(primeiroItem)
317 				quebrarPagina = false;
318 			
319 			retorno = geraXmlHierarquia(builder, arel.getAcompReferenciaItemAri().getItemEstruturaIett(), quebrarPagina);
320 		}
321 
322 		String caminhoImagem = pathEcar + "/images/relAcomp/" + corDao.getImagemRelatorio(arel.getCor(), arel.getTipoFuncAcompTpfa());
323 		String descricao = Util.normalizaCaracterMarcador(arel.getDescricaoArel());
324 		String observacoes = Util.normalizaCaracterMarcador(arel.getComplementoArel());
325 		
326 		String ocultarObservacoesParecer = new ConfiguracaoDao(request).getConfiguracao().getIndOcultarObservacoesParecer();
327 		
328 		if(descricao != null && !"".equals(descricao)){
329 			if (ocultarObservacoesParecer == null || ocultarObservacoesParecer.equals("N")){
330 				
331 				builder.addClosedNode("parecer", 
332 						" caminhoImagem=\"" + builder.normalize(caminhoImagem) + "\"" +
333 						" descricao=\"" + builder.normalize(descricao) + "\"" +
334 						" observacoes=\"" + builder.normalize(observacoes) + "\"" +
335 						"");
336 			}
337 			else{
338 				
339 				builder.addClosedNode("parecer", 
340 						" caminhoImagem=\"" + builder.normalize(caminhoImagem) + "\"" +
341 						" descricao=\"" + builder.normalize(descricao) + "\"" +
342 						"");
343 			}
344 		}
345 		else{
346 			if (ocultarObservacoesParecer == null || ocultarObservacoesParecer.equals("N")){
347 				
348 				builder.addClosedNode("parecer", 
349 						" caminhoImagem=\"" + builder.normalize(caminhoImagem) + "\"" +
350 						" descricao=\"" + builder.normalize("Sem itens de parecer cadastrados") + "\"" +
351 						" observacoes=\"\"" +
352 						"");
353 			}
354 			else{
355 				
356 				builder.addClosedNode("parecer", 
357 						" caminhoImagem=\"" + builder.normalize(caminhoImagem) + "\"" +
358 						" descricao=\"" + builder.normalize("Sem itens de parecer cadastrados") + "\"" +						
359 						"");
360 			}
361 		}
362 		
363 		if(exibirComplemento){
364 			if("S".equals(Pagina.getParamStr(request, "indResultado"))){
365 				geraXMLIndicadores(builder, arel.getAcompReferenciaItemAri());
366 				
367 				String arisSelecionados = Pagina.getParamStr(request, "arisSelecionados");
368 				List codArisSelecionados = new ArrayList();
369 				
370 				if(!"".equals(arisSelecionados)){
371 					String[] codAris = arisSelecionados.split(";");
372 					for(int i = 0; i < codAris.length; i++){
373 						if(!"".equals(codAris[i]) && !";".equals(codAris[i])){
374 							codArisSelecionados.add(Long.valueOf(codAris[i]));
375 						}
376 					}
377 				}				
378 				
379     			builder.addNode("itensFilhos");
380 				List descendentes = new ItemEstruturaDao(request).getDescendentes(arel.getAcompReferenciaItemAri().getItemEstruturaIett(), true);
381 		        Iterator itDes = descendentes.iterator();
382 		        while(itDes.hasNext()){
383 		            ItemEstruturaIett item = (ItemEstruturaIett) itDes.next();
384 		            AcompReferenciaItemAri acompanhamentoFilho = acompReferenciaItemDao.getAcompReferenciaItemByItemEstruturaIett(arel.getAcompReferenciaItemAri().getAcompReferenciaAref(), item);
385 		            if(acompanhamentoFilho != null && !codArisSelecionados.contains(acompanhamentoFilho.getCodAri().toString())) {
386 		            	
387 		            	//FIXME: ver com Beier regra de ARF anteriores!!!
388 			            List listARF = acompRealFisicoDao.buscarPorIett(
389 			            		acompanhamentoFilho.getItemEstruturaIett().getCodIett(),
390 			            		Long.valueOf(acompanhamentoFilho.getAcompReferenciaAref().getMesAref()),
391 			            		Long.valueOf(acompanhamentoFilho.getAcompReferenciaAref().getAnoAref()));
392 			            if(listARF != null && !listARF.isEmpty()){
393 			            	geraXMLIndicadoresFilhos(builder, acompanhamentoFilho);		            	
394 			            }
395 		            }
396 		        }
397     			builder.closeNode("itensFilhos");
398 		            
399 			}
400 			if("S".equals(Pagina.getParamStr(request, "evolucaoFinanceira")))
401 				geraXmlEvolucaoFinanceira(builder, arel.getAcompReferenciaItemAri());
402 		}
403 		
404 		builder.closeNode("item");
405 		return retorno;
406 	}
407 	
408 	/**
409 	 * Gera hierarquia Xml.<br>
410 	 * 
411 	 * @author N/C
412      * @since N/C
413      * @version N/C
414 	 * @param XmlBuilder builder
415 	 * @param ItemEstruturaIett item
416 	 * @param boolean quebrarPagina
417 	 * @return List
418 	 * @throws ECARException
419 	 */
420 	private List geraXmlHierarquia(XmlBuilder builder, ItemEstruturaIett item, boolean quebrarPagina) throws ECARException{
421 		List ascendentes =  itemEstruturaDao.getAscendentes(item);
422 		
423 		if(ascendentes != null && !ascendentes.isEmpty()){
424 			if(quebrarPagina)
425 				builder.addNode("hierarquia", "quebrarPagina=\"S\"");
426 			else
427 				builder.addNode("hierarquia", "quebrarPagina=\"N\"");
428 			
429 			Iterator it = ascendentes.iterator();
430 			while(it.hasNext()){
431 				ItemEstruturaIett iettAsc = (ItemEstruturaIett) it.next();
432 				//System.out.println(iettAsc.getEstruturaEtt().getNomeEtt() + " - " + iettAsc.getNomeIett());
433 				String nomeItem = "";
434 				if(iettAsc.getSiglaIett() != null)
435 					nomeItem += "- ";
436 				nomeItem += iettAsc.getNomeIett();
437 				
438 				String siglaItem = iettAsc.getSiglaIett();
439 				
440 				builder.addClosedNode("itemHierarquia", "nomeItem=\"" + builder.normalize(nomeItem) + "\" nivel=\"" + builder.normalize(iettAsc.getNivelIett().toString()) + "\" sigla=\"" + builder.normalize(siglaItem) + "\"");
441 			}
442 			builder.closeNode("hierarquia");
443 		}
444 		return ascendentes;
445 	}
446 
447 
448 	/**
449 	 * Gera data Rodapé.<br>
450 	 * 
451 	 * @author N/C
452      * @since N/C
453      * @version N/C
454 	 * @return String
455 	 */
456 	private String geraDataRodape(){
457 		Date dataAtual = Data.getDataAtual();
458 		String dia = String.valueOf(Data.getDia(dataAtual));
459 		String mes = Data.getNomeMesExtenso(Data.getMes(dataAtual) + 1).toLowerCase();
460 		String ano = String.valueOf(Data.getAno(dataAtual));
461 		String hora = Data.getHorario(dataAtual);
462 				
463 		return Data.getDiaSemanaNomeExtenso(dataAtual) + ", " + dia + " de " + mes + " de " + ano + ", às " + hora; 
464 	}
465 	
466 	/**
467 	 * Pega o nome do arquivo xls.<br>
468 	 * 
469 	 * @author N/C
470      * @since N/C
471      * @version N/C
472      * @return String
473 	 */
474     public String getXslFileName() {
475         return "relatorioAcompanhamento.xsl";
476     }
477     
478     /**
479      * Pega o erro de pagina.<br>
480      * 
481      * @author N/C
482      * @since N/C
483      * @version N/C
484      * @param HttpServletRequest request
485      * @param String mensagem
486      * @return String
487      */
488     public String getErrorPage(HttpServletRequest request, String mensagem){        
489         String errorPage = "listaRelAcomp.jsp?msgOperacao=" + mensagem; 
490         return errorPage;
491     }
492     
493     /**
494      * Gera xml evolução financeira.<br>
495      * 
496      * @author N/C
497      * @since N/C
498      * @version N/C
499      * @param XmlBuilder builder
500      * @param AcompReferenciaItemAri itemAri
501      * @throws ECARException
502      */
503     private void geraXmlEvolucaoFinanceira(XmlBuilder builder, AcompReferenciaItemAri itemAri) throws ECARException{
504     	try{
505 	    	List lista = itemEstPrevDao.getListaItemEstruturaPrevisao(itemAri.getItemEstruturaIett(), itemAri.getAcompReferenciaAref().getExercicioExe());
506 	    	Iterator it = lista.iterator();
507 	    	
508 	    	EfItemEstPrevisaoEfiep itemEstPrev = new EfItemEstPrevisaoEfiep();
509 	    	
510 	    	if (it.hasNext()){
511 
512 	    		int colunas = 0;
513 
514 	    		boolean mostrarValores[] = new boolean[6];
515 
516 	    		String descricoes[] = new String[6];
517 	    		descricoes[0] = config.getFinanceiroDescValor1Cfg();
518 	    		descricoes[1] = config.getFinanceiroDescValor2Cfg();
519 	    		descricoes[2] = config.getFinanceiroDescValor3Cfg();
520 	    		descricoes[3] = config.getFinanceiroDescValor4Cfg();
521 	    		descricoes[4] = config.getFinanceiroDescValor5Cfg();
522 	    		descricoes[5] = config.getFinanceiroDescValor6Cfg();
523 	    		
524 				for(int i = 0; i < 6; i++){
525 	    			mostrarValores[i] = itemEstRealizadoDao.getVerificarMostrarValorByPosicaoCfg(i);
526 	    			if(mostrarValores[i]){
527 	    				colunas++;
528 	    			}
529 	    		}	    
530 				
531 	    		builder.addNode("evolucaoFinanceira", "colunasRealizadas=\"" + builder.normalize(String.valueOf(colunas)) + "\"");
532 	    		
533 	    		
534 	    		builder.addNode("colunas");
535 	    		
536 				builder.addClosedNode("coluna", "nome=\"\"");
537 				builder.addClosedNode("coluna", "nome=\"\"");
538 				builder.addClosedNode("coluna", "nome=\"Aprovado\"");
539 				builder.addClosedNode("coluna", "nome=\"Revisado\"");
540 	    		int numeroColunasExibidas = 2; //Aprovado - Revisado 
541 				
542 				for(int i = 0; i < 6; i++){
543 	    			mostrarValores[i] = itemEstRealizadoDao.getVerificarMostrarValorByPosicaoCfg(i);
544 	    			if(mostrarValores[i]){
545 	    				builder.addClosedNode("coluna", "nome=\"" + builder.normalize(descricoes[i]) + "\"");
546 	    				numeroColunasExibidas++;
547 	    			}
548 	    		}	    		
549 
550 				builder.closeNode("colunas");
551 
552 				/*
553 				 * 22.50cm / numeroColunasExibidas = tamanho de cada coluna dinâmica
554 				 * Quanto mais colunas, menos espaço no relatório.
555 				 */
556 				double t = 22.50;
557 				String tam = String.valueOf(t/numeroColunasExibidas) + "cm";
558 				
559 				builder.addNode("colunasHeader");
560 				for(int x = 1; x <= numeroColunasExibidas; x++){
561 					builder.addClosedNode("colunaHeader", "tamanho=\"" + builder.normalize(tam) + "\"");
562 				}
563 				builder.closeNode("colunasHeader");
564 	    		
565 				double totFonAprovado = 0, totFonRevisado = 0;
566 				double totGerAprovado = 0, totGerRevisado = 0;
567 				double[] totFonValor = new double[6];
568 				double[] totGerValor = new double[6];
569 				
570 				/*Inicializar os valores...*/
571 				for(int i = 0; i < 6; i++){
572 					totFonValor[i] = 0;
573 					totGerValor[i] = 0;
574 				}
575 				
576 				long codFonte = -1;
577 	    		while(it.hasNext()){
578 	    			itemEstPrev = (EfItemEstPrevisaoEfiep) it.next();
579 	    			
580 	    			/* ler EfItemEstContaEfiec */
581 	    			EfItemEstContaEfiec itemEstConta = 
582 	    					itemEstContaOrcDao.getItemEstruturaConta(
583 	    						itemAri.getItemEstruturaIett(),
584 	    						itemAri.getAcompReferenciaAref().getExercicioExe(),
585 	    						itemEstPrev.getFonteRecursoFonr(),
586 	    						itemEstPrev.getRecursoRec());
587 	    			
588 	    			/* verificar valores em Efier */
589 	    			Double[] valores = itemEstRealizadoDao.getSomaItemEstruturaRealizado(
590 	    					itemEstConta,
591 	    					itemAri.getAcompReferenciaAref().getExercicioExe());
592 	    			
593 	    			/* Ao trocar a fonte e ao iniciar imprimir linha de fonte */
594 	    			if(codFonte != itemEstPrev.getFonteRecursoFonr().getCodFonr().longValue()){
595 	    				/* se não é a primeira passada da fonte */
596 	    				if(codFonte != -1){
597 
598 	    					builder.closeNode("fonte");
599 		    				
600 	    					/* somar nos valores do total geral */
601 	    					totGerAprovado = totGerAprovado + totFonAprovado;
602 	    					totGerRevisado = totGerRevisado + totFonRevisado;
603 	    					
604 	    					for(int i = 0; i < 6; i++){
605 	    						if(mostrarValores[i])
606 	    							totGerValor[i] = totGerValor[i] + totFonValor[i];
607 	    					}
608 
609 	    					/* zerar os valores do total da fonte */
610 	    					totFonAprovado = 0;
611 	    					totFonRevisado = 0;
612 
613 	    					for(int i = 0; i < 6; i++){
614 	    						totFonValor[i] = 0;
615 	    					}
616 	    				}
617 	    				
618 	    				codFonte = itemEstPrev.getFonteRecursoFonr().getCodFonr().longValue();
619 	    				//IMPRIMIR FONTE
620 	    				builder.addNode("fonte", "nome=\"" + builder.normalize(itemEstPrev.getFonteRecursoFonr().getNomeFonr()) + "\"");
621 	    			}
622 	    			
623 	    			/* somar nos valores do total da fonte */
624 	    			totFonAprovado = totFonAprovado + itemEstPrev.getValorAprovadoEfiep().doubleValue();
625 	    			totFonRevisado = totFonRevisado + itemEstPrev.getValorRevisadoEfiep().doubleValue();
626 
627 	    			for(int i = 0; i < 6; i++){
628 						if(mostrarValores[i])
629 							totFonValor[i] = totFonValor[i] + valores[i].doubleValue();
630 	    			}
631 	    			
632 	    			//IMPRIMIR RECURSO
633 					builder.addNode("recurso", "nome=\"" + builder.normalize(itemEstPrev.getRecursoRec().getNomeRec()) + "\"");
634 					builder.addClosedNode("rec", "valor=\"" + builder.normalize(Util.formataNumeroSemDecimal(itemEstPrev.getValorAprovadoEfiep().doubleValue()))+ "\"");
635 					builder.addClosedNode("rec", "valor=\"" + builder.normalize(Util.formataNumeroSemDecimal(itemEstPrev.getValorRevisadoEfiep().doubleValue()))+ "\"");
636 					for(int i = 0; i < 6; i++){
637 						if(mostrarValores[i])
638 	    					builder.addClosedNode("rec", "valor=\"" + builder.normalize(Util.formataNumeroSemDecimal(valores[i].doubleValue()))+ "\"");
639 					}
640 					builder.closeNode("recurso");
641 	    		}
642 	    		
643 				builder.closeNode("fonte");
644 				
645 				/* somar nos valores do total geral */
646 				totGerAprovado = totGerAprovado + totFonAprovado;
647 				totGerRevisado = totGerRevisado + totFonRevisado;
648 
649 				for(int i = 0; i < 6; i++){
650 					if(mostrarValores[i])
651 						totGerValor[i] = totGerValor[i] + totFonValor[i];
652 				}
653 	    		
654 	    		//IMPRIMIR TOTAL
655 				builder.addNode("totalEvolucaoFinanceira");
656 				builder.addClosedNode("total", "valor=\"" + builder.normalize(Util.formataNumeroSemDecimal(totGerAprovado))+ "\"");
657 				builder.addClosedNode("total", "valor=\"" + builder.normalize(Util.formataNumeroSemDecimal(totGerRevisado))+ "\"");
658 				for(int i = 0; i < 6; i++){
659 					if(mostrarValores[i])
660     					builder.addClosedNode("total", "valor=\"" + builder.normalize(Util.formataNumeroSemDecimal(totGerValor[i]))+ "\"");
661 				}
662 				builder.closeNode("totalEvolucaoFinanceira");
663 
664 				builder.closeNode("evolucaoFinanceira");
665 	    	}
666     	} catch (HibernateException e){
667     		this.logger.error(e);
668     		throw new ECARException("Erro na criação do relatório: Evolução Financeira - " + e.getMessage());
669     	}
670     }
671 
672     /**
673      * Gera indicadores xml.<br>
674      * 
675      * @author N/C
676      * @since N/C
677      * @version N/C
678      * @param XmlBuilder builder
679      * @param AcompReferenciaItemAri itemAri
680      * @throws ECARException
681      */
682     private void geraXMLIndicadores(XmlBuilder builder, AcompReferenciaItemAri itemAri) throws ECARException{
683     	try {
684     		if(itemAri != null) {
685     			//FIXME
686     			/* Comentado pelo Claudismar, verificar com ele o que é...
687 				List exerciciosAnteriores = new ExercicioDao(null).getExerciciosAnteriores(itemAri.getAcompReferenciaAref().getExercicioExe());
688 				
689    				exerciciosAnteriores.add(itemAri.getAcompReferenciaAref().getExercicioExe());
690 				
691    				// recuperar os dois últimos anos
692    				String ano1 = "";
693    				String ano2 = "";
694   				
695    				String mostrarProjecao = ("S".equals(Pagina.getParamStr(request, "indProjecao"))) ? "S" : "N";
696    				
697   				ArrayList arrayListExercicios = new ArrayList();
698    				
699    				if(exerciciosAnteriores.size() == 1) {
700 					ExercicioExe exercicio = (ExercicioExe) exerciciosAnteriores.get(0);
701 					ano1 = exercicio.getDescricaoExe();
702 					arrayListExercicios.add(exercicio);
703    				}
704    				else if(exerciciosAnteriores.size() > 1) {
705 					ExercicioExe exercicio = (ExercicioExe) exerciciosAnteriores.get(exerciciosAnteriores.size() - 2);
706 					ano1 = exercicio.getDescricaoExe();
707 					arrayListExercicios.add(exercicio);
708 					exercicio = (ExercicioExe) exerciciosAnteriores.get(exerciciosAnteriores.size() - 1);
709 					ano2 = exercicio.getDescricaoExe();
710 					arrayListExercicios.add(exercicio);
711    				}
712   				
713 				List indResultados = acompRealFisicoDao.getIndResulByAcompRefItemBySituacao(itemAri, "T");
714 				if(indResultados != null && indResultados.size() > 0){
715 
716 					builder.addNode("indicadores", "labelFuncao=\"" + builder.normalize(estFuncDao.getLabelIndicadoresResultado(itemAri.getItemEstruturaIett().getEstruturaEtt())) + "\" ano1=\"" + builder.normalize(ano1) + "\" ano2=\"" + builder.normalize(ano2) + "\" mostrarProjecao=\"" + builder.normalize(mostrarProjecao) + "\"");
717 					
718 					Iterator itIndResult = indResultados.iterator();
719 					while(itIndResult.hasNext()){
720 						AcompRealFisicoArf indicador = (AcompRealFisicoArf) itIndResult.next();
721 
722 						String situacao = "";
723 						if(indicador.getSituacaoSit()!=null) {
724 							situacao = indicador.getSituacaoSit().getDescricaoSit();
725 						}
726 
727 						// OBS.: para o relatório haverá 0, 1 ou 2 exercícios
728 						ArrayList arrayRealizado = new ArrayList();
729 						ArrayList arrayPrevisto = new ArrayList();
730 						Iterator itValoresExAnt = arrayListExercicios.iterator();
731 						double totalRealizado = 0;
732 						double totalPrevisto = 0;
733 
734 						while(itValoresExAnt.hasNext()){
735 							ExercicioExe exercicioAnt = (ExercicioExe) itValoresExAnt.next();										
736 							double realizadoNoExercicio = 0;
737 							if(exercicioAnt.equals(itemAri.getAcompReferenciaAref().getExercicioExe())){
738 								// Se o exercício em questão é mesmo exercicio do periodo de referência e o indicador for acumulável
739 								// soma todas as quantidades até o mes/ano do periodo
740 								if("S".equals(indicador.getItemEstrtIndResulIettr().getIndAcumulavelIettr())){
741 									AcompReferenciaAref aref = itemAri.getAcompReferenciaAref();
742 									int mesRef = Integer.valueOf(aref.getMesAref()).intValue();
743 									int anoRef = Integer.valueOf(aref.getAnoAref()).intValue();
744 									realizadoNoExercicio = acompRealFisicoDao.getQtdRealizadaExercicio(exercicioAnt, indicador.getItemEstrtIndResulIettr(), mesRef, anoRef);																					
745 								} else {
746 									//se não for acumulável o realizado no exercicio é o realizado no periodo
747 									if (indicador.getQtdRealizadaArf() != null)
748 										realizadoNoExercicio = indicador.getQtdRealizadaArf().doubleValue();
749 								}
750 							} else {
751 								if("S".equals(indicador.getItemEstrtIndResulIettr().getIndAcumulavelIettr())){
752 									realizadoNoExercicio = acompRealFisicoDao.getQtdRealizadaExercicio(exercicioAnt, indicador.getItemEstrtIndResulIettr());										
753 								} else {
754 									realizadoNoExercicio = acompRealFisicoDao.getQtdRealizadaExercicioNaoAcumulavel(exercicioAnt, indicador.getItemEstrtIndResulIettr());																						
755 								}
756 							} 
757 							
758 							double previstoNoExercicio = new ItemEstrtIndResulDao(null).getQtdPrevistoExercicio(indicador.getItemEstrtIndResulIettr(), exercicioAnt);
759 							if("S".equals(indicador.getItemEstrtIndResulIettr().getIndAcumulavelIettr())){
760 								totalRealizado += realizadoNoExercicio;
761 								totalPrevisto += previstoNoExercicio;
762 							}else{
763 								totalRealizado = realizadoNoExercicio;
764 								totalPrevisto = previstoNoExercicio;											
765 							}
766 							
767 			   				arrayPrevisto.add(new Double(previstoNoExercicio));
768 							arrayRealizado.add(new Double(realizadoNoExercicio));
769 							
770 						}
771 
772 			  			String previstoAno1 = "";
773 			  			String realizadoAno1 = "";
774 			  			String previstoAno2 = ""; 
775 		  				String realizadoAno2 = "";
776 
777 		   				if(arrayPrevisto.size() == 1) {
778 				  			previstoAno1 = Pagina.trocaNullNumeroDecimalSemMilhar((Double)arrayPrevisto.get(0));
779 				  			realizadoAno1 = Pagina.trocaNullNumeroDecimalSemMilhar((Double)arrayRealizado.get(0));;
780 		  				}
781 		  				else if(arrayPrevisto.size() > 1) {
782 				  			previstoAno1 = Pagina.trocaNullNumeroDecimalSemMilhar((Double)arrayPrevisto.get(0));
783 				  			realizadoAno1 = Pagina.trocaNullNumeroDecimalSemMilhar((Double)arrayRealizado.get(0));;
784 
785 				  			previstoAno2 = Pagina.trocaNullNumeroDecimalSemMilhar((Double)arrayPrevisto.get(1));
786 				  			realizadoAno2 = Pagina.trocaNullNumeroDecimalSemMilhar((Double)arrayRealizado.get(1));;
787 		  				}
788 
789 						double realizadoPrevisto = 0;
790 						if(totalPrevisto > 0) {
791 							realizadoPrevisto = ((totalRealizado/totalPrevisto) * 100);
792 						}
793 
794 						String strProjecao = "";
795 						String strPorcentual = "-";
796 
797 						if("S".equals(indicador.getItemEstrtIndResulIettr().getIndProjecaoIettr()) && totalRealizado > 0){
798 							double resultado = acompReferenciaItemDao.calculoProjecao(indicador.getItemEstrtIndResulIettr(), itemAri);
799 							ExercicioExe exercicioPrevisto = itemEstrtIndResulDao.getMaiorExercicioIndicador(indicador.getItemEstrtIndResulIettr());
800 							double qtdePrevista = itemEstrtIndResulDao.getQtdPrevistoExercicio(indicador.getItemEstrtIndResulIettr(), exercicioPrevisto);
801 							
802 							Mensagem msg = new Mensagem(this.request.getSession().getServletContext());
803 
804 							if(resultado == qtdePrevista)
805 								strProjecao = msg.getMensagem("acompRelatorio.indicadorResultado.projecao.seraAtingida");
806 							if(resultado > qtdePrevista)
807 								strProjecao = msg.getMensagem("acompRelatorio.indicadorResultado.projecao.seraAtingidaAntes");												
808 							if(resultado < qtdePrevista){
809 								strProjecao = msg.getMensagem("acompRelatorio.indicadorResultado.projecao.naoSeraAtingida");																									
810 							}
811 							
812 							Double porcentagem = new Double((resultado/qtdePrevista) * 100);
813 							
814 							strPorcentual = Pagina.trocaNullNumeroDecimalSemMilhar(porcentagem);
815 						} else {
816 							if(totalRealizado == 0){
817 								strProjecao = "Não é possível realizar projeção sem informação de quantidades realizadas.";										
818 							} else {
819 								strProjecao = "N/A";
820 							}
821 						}
822 						builder.addClosedNode("indicador", 
823 	                         	"nome=\"" + builder.normalize(indicador.getItemEstrtIndResulIettr().getNomeIettir()) + "\"" + 
824 	                         	" situacao=\"" + builder.normalize(situacao) + "\"" +
825 	                         	" projecao=\"" + builder.normalize(strProjecao) + "\"" +
826 	                         	" percentualRealizadoPrevisto=\"" + builder.normalize(Pagina.trocaNullNumeroDecimalSemMilhar(new Double((realizadoPrevisto)))) + "\"" +
827 	                         	" percentual=\"" + builder.normalize(strPorcentual) + "\"" +
828 	                         	" totalPrevisto=\"" + builder.normalize(Pagina.trocaNullNumeroDecimalSemMilhar(new Double(totalPrevisto))) + "\"" +
829 	                         	" totalRealizado=\"" + builder.normalize(Pagina.trocaNullNumeroDecimalSemMilhar(new Double(totalRealizado))) + "\"" +
830 	                         	" realizadoNoMes=\"" + builder.normalize(Pagina.trocaNullNumeroDecimalSemMilhar(indicador.getQtdRealizadaArf()) + " " + indicador.getItemEstrtIndResulIettr().getUnidMedidaIettr()) + "\"" +
831 	                         	" previstoAno1=\"" + builder.normalize(previstoAno1) + "\"" +
832 	                         	" realizadoAno1=\"" + builder.normalize(realizadoAno1) + "\"" +
833 	                         	" previstoAno2=\"" + builder.normalize(previstoAno2) + "\"" +
834 	                         	" realizadoAno2=\"" + builder.normalize(realizadoAno2) + "\"" +
835 	                         	" mostrarProjecao=\"" + builder.normalize(mostrarProjecao) + "\""
836 	                         	);
837 					}
838 					builder.closeNode("indicadores");
839 				}
840 				*/
841 
842     			String mostrarProjecao = ("S".equals(Pagina.getParamStr(request, "indProjecao"))) ? "S" : "N";
843     			//List<ExercicioExe> exercicios = new ExercicioDao(null).getExerciciosProjecao(itemAri.getItemEstruturaIett().getCodIett());
844     			//Ref. mantis 7770: exibir os últimos quatro anos...
845     			//Pegando exercicios do mais novo para mais antigo para pegar os ultimos anos primeiro...
846     			List<ExercicioExe> todosExercicios = new ExercicioDao(null).listar(ExercicioExe.class, new String[] {"dataInicialExe","desc"});
847     			List<ExercicioExe> exercicios = new ArrayList<ExercicioExe>();
848 
849     			if(todosExercicios == null || todosExercicios.isEmpty()) {
850     				throw new Exception("Não existe exercícios cadastrado");
851     			}
852     			//Obtendo ultimos 4 anos...
853     			int qtdeAnos = 4;
854     			if(todosExercicios.size() < qtdeAnos) {
855     				qtdeAnos = todosExercicios.size(); 
856     			}
857     			exercicios.addAll(todosExercicios.subList(0, qtdeAnos));
858     			
859     			//Re-ordenando do mais antigo para o o mais novo... 
860     			Collections.reverse(exercicios);
861     			
862 				List indResultados = acompRealFisicoDao.getIndResulByAcompRefItemBySituacao(itemAri, Dominios.TODOS, true);
863 				if(indResultados != null && indResultados.size() > 0){
864 
865 					builder.addNode("indicadores", "labelFuncao=\"" + builder.normalize(estFuncDao.getLabelIndicadoresResultado(itemAri.getItemEstruturaIett().getEstruturaEtt())) + "\" mostrarProjecao=\"" + builder.normalize(mostrarProjecao) + "\"");
866 					
867 					int numeroExercicios = 0;
868 					for(ExercicioExe exercicio : exercicios){
869 						builder.addClosedNode("columnExercicio", "ano=\"" + builder.normalize(exercicio.getDescricaoExe()) + "\"");
870 						builder.addClosedNode("indExercicio", "exercicio=\"" + builder.normalize(exercicio.getDescricaoExe()) + "\"");
871 						numeroExercicios++;
872 					}
873 					
874 					Iterator itIndResult = indResultados.iterator();
875 					while(itIndResult.hasNext()){
876 						AcompRealFisicoArf indicador = (AcompRealFisicoArf) itIndResult.next();
877 						
878 						String situacao = "";
879 						if(indicador.getSituacaoSit()!=null) {
880 							situacao = indicador.getSituacaoSit().getDescricaoSit();
881 						}
882 
883 						double totalRealizado = 0;
884 						double totalPrevisto = 0;
885 						
886 						builder.addNode("indicador", 
887 	                         	"nome=\"" + builder.normalize(indicador.getItemEstrtIndResulIettr().getNomeIettir()) + "\"" + 
888 	                         	" situacao=\"" + builder.normalize(situacao) + "\"" +
889 	                         	" realizadoNoMes=\"" + builder.normalize(Pagina.trocaNullMoeda(indicador.getQtdRealizadaArf()) + " " + indicador.getItemEstrtIndResulIettr().getUnidMedidaIettr()) + "\"" +
890 	                         	" numeroExercicios=\"" + builder.normalize(String.valueOf(numeroExercicios)) + "\"" +
891 	                         	" mostrarProjecao=\"" + builder.normalize(mostrarProjecao) + "\""
892 	                         	);
893 						
894 
895 						for(ExercicioExe exercicio : exercicios){
896 							double realizadoNoExercicio = 0;
897 //							if(exercicio.equals(itemAri.getAcompReferenciaAref().getExercicioExe())){
898 //								// Se o exercício em questão é mesmo exercicio do periodo de referência e o indicador for acumulável
899 //								// soma todas as quantidades até o mes/ano do periodo
900 //								if("S".equals(indicador.getItemEstrtIndResulIettr().getIndAcumulavelIettr())){
901 //									AcompReferenciaAref aref = itemAri.getAcompReferenciaAref();
902 //									int mesRef = Integer.valueOf(aref.getMesAref()).intValue();
903 //									int anoRef = Integer.valueOf(aref.getAnoAref()).intValue();
904 //									realizadoNoExercicio = acompRealFisicoDao.getQtdRealizadaExercicio(exercicio, indicador.getItemEstrtIndResulIettr(), mesRef, anoRef);																					
905 //								} else {
906 //									//se não for acumulável o realizado no exercicio é o realizado no periodo
907 //									if (indicador.getQtdRealizadaArf() != null)
908 //										realizadoNoExercicio = indicador.getQtdRealizadaArf().doubleValue();
909 //								}
910 //							} else {
911 //								if("S".equals(indicador.getItemEstrtIndResulIettr().getIndAcumulavelIettr())){
912 //									realizadoNoExercicio = acompRealFisicoDao.getQtdRealizadaExercicio(exercicio, indicador.getItemEstrtIndResulIettr(), itemAri.getAcompReferenciaAref());										
913 //								} else {
914 //									realizadoNoExercicio = acompRealFisicoDao.getQtdRealizadaExercicioNaoAcumulavel(exercicio, indicador.getItemEstrtIndResulIettr(), itemAri.getAcompReferenciaAref());																						
915 //								}
916 //							} 
917 							
918 							if("S".equals(indicador.getItemEstrtIndResulIettr().getIndAcumulavelIettr())){
919 								realizadoNoExercicio = acompRealFisicoDao.getQtdRealizadaExercicio(exercicio, indicador.getItemEstrtIndResulIettr(), itemAri.getAcompReferenciaAref());										
920 							} else {
921 								realizadoNoExercicio = acompRealFisicoDao.getQtdRealizadaExercicioNaoAcumulavel(exercicio, indicador.getItemEstrtIndResulIettr(), itemAri.getAcompReferenciaAref());																						
922 							}
923 							
924 
925 							double previstoNoExercicio = new ItemEstrtIndResulDao(null).getQtdPrevistoExercicio(indicador.getItemEstrtIndResulIettr(), exercicio);
926 							if("S".equals(indicador.getItemEstrtIndResulIettr().getIndAcumulavelIettr())){
927 								totalRealizado += realizadoNoExercicio;
928 								totalPrevisto += previstoNoExercicio;
929 							}else{
930 								totalRealizado = realizadoNoExercicio;
931 								totalPrevisto = previstoNoExercicio;											
932 							}
933 
934 							builder.addClosedNode("valorExercicio", 
935 								"exercicio=\"" + builder.normalize(exercicio.getDescricaoExe()) + "\"" + 
936 								" valorPrevisto=\"" + builder.normalize(Pagina.trocaNullMoeda(previstoNoExercicio)) + "\"" +
937 								" valorRealizado=\"" + builder.normalize(Pagina.trocaNullMoeda(realizadoNoExercicio)) + "\"");								
938 						}
939 						
940 						double realizadoPrevisto = 0;
941 						if(totalPrevisto > 0) {
942 							realizadoPrevisto = ((totalRealizado/totalPrevisto) * 100);
943 						}
944 						builder.addClosedNode("valorTotal", 
945 	                         	" percentualRealizadoPrevisto=\"" + builder.normalize(Pagina.trocaNullNumeroDecimalSemMilhar(new Double((realizadoPrevisto)))) + "\"" +
946 	                         	" totalPrevisto=\"" + builder.normalize(Pagina.trocaNullMoeda(new Double(totalPrevisto))) + "\"" +
947 	                         	" totalRealizado=\"" + builder.normalize(Pagina.trocaNullMoeda(new Double(totalRealizado))) + "\""
948 	                         	);
949 						
950 
951 						String strProjecao = "";
952 						String strPorcentual = "-";
953 
954 						if("S".equals(indicador.getItemEstrtIndResulIettr().getIndProjecaoIettr()) && totalRealizado > 0){
955 							double resultado = acompReferenciaItemDao.calculoProjecao(indicador.getItemEstrtIndResulIettr(), itemAri);
956 							ExercicioExe exercicioPrevisto = itemEstrtIndResulDao.getMaiorExercicioIndicador(indicador.getItemEstrtIndResulIettr());
957 							double qtdePrevista = itemEstrtIndResulDao.getQtdPrevistoExercicio(indicador.getItemEstrtIndResulIettr(), exercicioPrevisto);
958 							
959 							Mensagem msg = new Mensagem(this.request.getSession().getServletContext());
960 
961 							if(resultado == qtdePrevista)
962 								strProjecao = msg.getMensagem("acompRelatorio.indicadorResultado.projecao.seraAtingida");
963 							if(resultado > qtdePrevista)
964 								strProjecao = msg.getMensagem("acompRelatorio.indicadorResultado.projecao.seraAtingidaAntes");												
965 							if(resultado < qtdePrevista){
966 								strProjecao = msg.getMensagem("acompRelatorio.indicadorResultado.projecao.naoSeraAtingida");																									
967 							}
968 							
969 							Double porcentagem = new Double((resultado/qtdePrevista) * 100);
970 							
971 							strPorcentual = Pagina.trocaNullNumeroDecimalSemMilhar(porcentagem);
972 						} else {
973 							if(totalRealizado == 0){
974 								strProjecao = "Não é possível realizar projeção sem informação de quantidades realizadas.";										
975 							} else {
976 								strProjecao = "N/A";
977 							}
978 						}
979 						
980 						builder.addClosedNode("valorProjecao",
981 	                         	" projecao=\"" + builder.normalize(strProjecao) + "\"" +
982 	                         	" mostrarProjecao=\"" + builder.normalize(mostrarProjecao) + "\"" +
983 	                         	" percentual=\"" + builder.normalize(strPorcentual) + "\"" +
984 	                         	" situacao=\"" + builder.normalize(situacao) + "\""
985 								);
986 						
987 						
988 						builder.closeNode("indicador");
989 
990 					}
991 					builder.closeNode("indicadores");
992 				}
993 			}
994 
995     	} catch(Exception e){
996     		this.logger.error(e);
997     		throw new ECARException("Erro na criação do relatório: Indicadores - " + e.getMessage());               
998     	}
999     }
1000 
1001     /**
1002      * Gera Relatorio IndicadoresFilhos.<br>
1003      * 
1004      * @author N/C
1005      * @since N/C
1006      * @version N/C
1007      * @param XmlBuilder builder
1008      * @param AcompReferenciaItemAri itemAri
1009      * @throws ECARException
1010      */
1011     private void geraXMLIndicadoresFilhos(XmlBuilder builder, AcompReferenciaItemAri itemAri) throws ECARException{
1012     	try {
1013     		String nomeItem = itemAri.getItemEstruturaIett().getNomeIett();
1014 			String siglaOrg = "";
1015 			
1016 			if(itemAri.getItemEstruturaIett().getOrgaoOrgByCodOrgaoResponsavel1Iett() != null){
1017 				siglaOrg = itemAri.getItemEstruturaIett().getOrgaoOrgByCodOrgaoResponsavel1Iett().getSiglaOrg();
1018 			}
1019 			else {
1020 				siglaOrg = "Órgão não informado";
1021 			}
1022 
1023     		builder.addNode("itemFilho", "nomeItem=\"" + builder.normalize(nomeItem) + "\" orgaoItem=\"" + builder.normalize(siglaOrg) + "\"");
1024     		geraXMLIndicadores(builder, itemAri);
1025 			builder.closeNode("itemFilho");
1026 
1027     	} catch(Exception e){
1028     		this.logger.error(e);
1029     		throw new ECARException("Erro na criação do relatório: IndicadoresFilhos - " + e.getMessage());               
1030     	}
1031     }
1032 }