View Javadoc

1   package ecar.servlet.relatorio;
2   
3   import java.util.ArrayList;
4   import java.util.Collections;
5   import java.util.Date;
6   import java.util.HashSet;
7   import java.util.Iterator;
8   import java.util.List;
9   import java.util.Set;
10  
11  import javax.servlet.http.HttpServletRequest;
12  
13  import org.hibernate.HibernateException;
14  
15  import comum.util.Data;
16  import comum.util.Mensagem;
17  import comum.util.Pagina;
18  import comum.util.Util;
19  import comum.util.XmlBuilder;
20  
21  import ecar.bean.AtributoEstruturaListagemItens;
22  import ecar.dao.AcompRealFisicoDao;
23  import ecar.dao.AcompReferenciaDao;
24  import ecar.dao.AcompReferenciaItemDao;
25  import ecar.dao.ConfiguracaoDao;
26  import ecar.dao.CorDao;
27  import ecar.dao.EstruturaDao;
28  import ecar.dao.EstruturaFuncaoDao;
29  import ecar.dao.ExercicioDao;
30  import ecar.dao.ItemEstrtIndResulDao;
31  import ecar.dao.ItemEstruturaContaOrcamentoDao;
32  import ecar.dao.ItemEstruturaDao;
33  import ecar.dao.ItemEstruturaPrevisaoDao;
34  import ecar.dao.ItemEstruturaRealizadoDao;
35  import ecar.dao.TipoAcompanhamentoDao;
36  import ecar.exception.ECARException;
37  import ecar.login.SegurancaECAR;
38  import ecar.permissao.ValidaPermissao;
39  import ecar.pojo.AcompRealFisicoArf;
40  import ecar.pojo.AcompReferenciaAref;
41  import ecar.pojo.AcompReferenciaItemAri;
42  import ecar.pojo.AcompRelatorioArel;
43  import ecar.pojo.AtributoLivre;
44  import ecar.pojo.ConfiguracaoCfg;
45  import ecar.pojo.EfItemEstContaEfiec;
46  import ecar.pojo.EfItemEstPrevisaoEfiep;
47  import ecar.pojo.ExercicioExe;
48  import ecar.pojo.ItemEstruturaIett;
49  import ecar.pojo.ItemEstruturaSisAtributoIettSatb;
50  import ecar.pojo.ObjetoEstrutura;
51  import ecar.pojo.StatusRelatorioSrl;
52  import ecar.pojo.TipoAcompanhamentoTa;
53  import ecar.pojo.TipoFuncAcompTpfa;
54  import ecar.util.Dominios;
55  
56  /**
57   * @author evandro
58   * @author cristiano
59   * @author claudismar
60   *
61   */
62  public class RelatorioAcompanhamentoImpresso extends AbstractServletReportXmlXsl {
63  	
64  	/**
65  	 * 
66  	 */
67  	private static final long serialVersionUID = 3230673174665052076L;
68  	
69  	private String realPath;
70  	
71  	private ConfiguracaoCfg configura;
72  	private List listaIett = new ArrayList();		// Lista de Ietts a partir dos Aris
73  	private List listFunAcomp;	// Funções Acomp - Posições
74  	
75  	boolean posicoes;
76  	boolean funcoes;
77  	boolean dadosGerais;
78  	boolean indicadores;
79  	boolean financeiro;
80  	boolean projecao;
81  	
82  	private HttpServletRequest request;
83  	private String codAriFilhos[];
84  	private List listaCompletaOrdenada = new ArrayList(); 
85  	private List listaAriCompleta = new ArrayList();
86  	private AcompReferenciaAref aref;
87  	
88  	private ItemEstruturaDao itemDao;
89  	private AcompReferenciaItemDao acompRefItemDao;
90  	
91  	/**
92  	 * CONSTANTES
93  	 */
94  	private static final int COMBOBOX = 1;
95  	private static final int CHECKBOX = 2;
96  	private static final int LISTBOX = 3;
97  	private static final int RADIO_BUTTON = 4;
98  	private static final int TEXT = 5;
99  	private static final int IMAGEM = 6;   
100 	private static final int MULTITEXTO = 7;   
101 	private static final int VALIDACAO = 8;
102 	private static final int MULTIPLO = 9;
103 	private static final int TEXTAREA = 10;	
104     
105 	/**
106 	 * Gera XML.<br>
107 	 * 
108 	 * @author N/C
109      * @since N/C
110      * @version N/C
111 	 * @param HttpServletRequest request
112 	 * @return StringBuffer
113 	 * @throws ECARException
114 	 */
115 	public StringBuffer getXml(HttpServletRequest request) throws ECARException{
116         ConfiguracaoDao configuracaoDao = new ConfiguracaoDao(null);
117         this.itemDao = new ItemEstruturaDao(null);
118         TipoAcompanhamentoDao tipoAcompDao = new TipoAcompanhamentoDao(null);
119         AcompReferenciaDao acompReferenciaDao = new AcompReferenciaDao(null);
120         this.acompRefItemDao = new AcompReferenciaItemDao(null);
121         
122         Util.liberarImagem();
123         
124 		this.request = request;
125 				
126         /* criar classe para geração de XML */
127         XmlBuilder builder = new XmlBuilder();
128         
129         configura = configuracaoDao.getConfiguracao();
130         
131         listFunAcomp = new ArrayList();
132         
133     	posicoes = false;
134     	funcoes = false;
135     	dadosGerais = false;
136     	indicadores = false;
137     	financeiro = false;
138         
139         /* atribui o endereço http */
140     	String protocol = ( request.getRequestURL().indexOf("https") == 0 ? "https://" : "http://" );
141         realPath = protocol + request.getLocalName() + ":" + request.getLocalPort();
142         this.defineFuncoes();        
143 
144         String datahora = Data.parseDateHour(new Date()).substring(0,16); //este método retorna dd/mm/aaaa hh:mm:ss:ssss. Faço Substring para poder pegar só "dd/mm/aaaa hh:mm"
145 
146         //Obter lista de itens descendentes dos selecionado na tela
147         Set listaItensSelecionadosComDescendentes = new HashSet();
148         String codigosItensSelecionadosTela = Pagina.getParamStr(request, "codigosItemSelecionadosTela");
149 		if(!"".equals(codigosItensSelecionadosTela)){
150 			String[] iettSelecionado = codigosItensSelecionadosTela.split(";");
151 			for(int i = 0; i < iettSelecionado.length; i++){
152 				if(!"".equals(iettSelecionado[i])){
153 					ItemEstruturaIett iett = (ItemEstruturaIett) itemDao.buscar(ItemEstruturaIett.class, new Long(iettSelecionado[i]));
154 					if(iett != null) {
155 						listaItensSelecionadosComDescendentes.add(iett);
156 						//Nao quer imprimir todos os filhos de cada item de estrutura, apenas os que foram selecionados na tela de monitoramento
157 						//listaItensSelecionadosComDescendentes.addAll(itemDao.getDescendentes(iett, true));
158 					}
159 				}
160 			}
161 		}
162 		//Chamando Garbage Collector para ver se melhora a performance.
163 		//TODO: Verificar se isso ajuda em alguma coisa...
164 		//System.out.println("===================== Chamando o Garbage Collector ===========================");
165 		System.gc();
166 		
167 		//TODO: Após gerar relatório para a SEPL mudar a regra abaixo
168 		if("/ecar".equals(request.getContextPath())) {
169 			// remover os itens com nível de estrutura maior que produto
170 
171 			//Melhoria de performance
172 			//Iterator it = listaItensSelecionadosComDescendentes.iterator();
173 	    	//while (it.hasNext()){
174 			for(Iterator it = listaItensSelecionadosComDescendentes.iterator(); it.hasNext();){
175 	    		ItemEstruturaIett iett = (ItemEstruturaIett) it.next();
176 	    		
177 	    		if(iett.getNivelIett().intValue() > 4) { //4 = Produto
178 	    			it.remove();
179 	    		}
180 	    	}
181 		}
182         
183         List listaCodigos = new ArrayList();
184 
185         String codigosAri = Pagina.getParamStr(request, "codigosAri");
186 		if(!"".equals(codigosAri)){
187 			String[] codAri = codigosAri.split(";");
188 			for(int i = 0; i < codAri.length; i++){
189 				if(!"".equals(codAri[i])){
190 					listaCodigos.add(codAri[i]);
191 				}
192 			}
193 		}
194         codAriFilhos = request.getParameterValues("codAriFilhos");
195         
196         TipoAcompanhamentoTa tipoAcomp = (TipoAcompanhamentoTa) tipoAcompDao.buscar(TipoAcompanhamentoTa.class, Long.valueOf(Pagina.getParamStr(request, "codTipoAcompanhamento")));
197         aref = (AcompReferenciaAref) acompReferenciaDao.buscar(AcompReferenciaAref.class, Long.valueOf(Pagina.getParamStr(request, "mesReferencia")));
198         
199 		listaCompletaOrdenada = itemDao.getItensOrdenados(new ArrayList(listaItensSelecionadosComDescendentes), aref.getTipoAcompanhamentoTa());
200 		
201 		String tipoDadosGerais = Pagina.getParamStr(request, "indTipoDadosGerais");
202 		
203         if("S".equals(Pagina.getParamStr(request, "dadosGerais"))) {
204 			if("L".equals(tipoDadosGerais)) {
205 				tipoDadosGerais = "Relação"; 
206 			} else if("R".equals(tipoDadosGerais)) {
207 				tipoDadosGerais = "Resumo"; 
208 			} else if("C".equals(tipoDadosGerais)) {
209 				tipoDadosGerais = "Completo"; 
210 			}
211         } else {
212         	tipoDadosGerais = "";
213         }
214 		
215 		builder.addNode("relatorio",
216     			"titulo=\"" + builder.normalize(this.configura.getTituloSistema()) + "\"" +
217     			" datahora=\"" + builder.normalize(datahora) + "\"" +
218     			" tipoAcomp=\"" + builder.normalize(tipoAcomp.getDescricaoTa()) + "\"" +
219     			" mesReferencia=\""+ builder.normalize(aref.getNomeAref() + " (" + aref.getMesAref() + "/" + aref.getAnoAref() + ")") +"\"" +
220     			" tipoDadosGerais=\"" + builder.normalize(tipoDadosGerais) + "\"");
221 
222 		// ARIs selecionados (EM NEGRITO)
223         if (listaCodigos != null && !listaCodigos.isEmpty()) {
224         	
225         	//Melhoria de Performance
226         	//Iterator it = listaCodigos.iterator();
227         	//while(it.hasNext()) {
228 
229         	/*
230         	for(Iterator it = listaCodigos.iterator(); it.hasNext();){
231         		AcompReferenciaItemAri ari = (AcompReferenciaItemAri) acompRefItemDao.buscar(AcompReferenciaItemAri.class, Long.valueOf((String)it.next()));
232         		if(ari != null) {
233         			listaAriCompleta.add(ari);
234         			listaIett.add(ari.getItemEstruturaIett());
235         		}
236         	}
237         	*/
238         	
239         	List[] arisIetts = this.acompRefItemDao.listarArisAndIetts(listaCodigos);
240         	listaAriCompleta.addAll(arisIetts[0]);
241         	listaIett.addAll(arisIetts[1]);
242         	
243         } else {
244         	String codAri = Pagina.getParamStr(request, "codAri");
245 
246         	AcompReferenciaItemAri ari = (AcompReferenciaItemAri) acompRefItemDao.buscar(AcompReferenciaItemAri.class, Long.valueOf(codAri));
247 
248     		if(ari != null) {
249     			listaAriCompleta.add(ari);
250     			listaIett.add(ari.getItemEstruturaIett());
251     		}
252         	
253         }
254 
255         // ARIs filhos selecionados (CHECKBOX)
256         if(codAriFilhos != null) {
257         	List listaCodAriFilhos = new ArrayList();
258         	for (int i = 0; i < codAriFilhos.length; i++) {
259         		/*
260         		AcompReferenciaItemAri ari = (AcompReferenciaItemAri) acompRefItemDao.buscar(AcompReferenciaItemAri.class, Long.valueOf(codAriFilhos[i]));
261         		if(ari != null) {
262         			listaAriCompleta.add(ari);
263         			listaIett.add(ari.getItemEstruturaIett());
264         		}
265         		*/
266         		
267         		listaCodAriFilhos.add(Long.valueOf(codAriFilhos[i]));
268         	}
269         	
270         	List[] arisIetts = this.acompRefItemDao.listarArisAndIetts(listaCodAriFilhos);
271         	listaAriCompleta.addAll(arisIetts[0]);
272         	listaIett.addAll(arisIetts[1]);
273         }
274         
275         geraXMLItensGeral(builder);        
276     	builder.closeNode("relatorio");
277     	
278     	
279         return builder.toStringBuffer();
280     }
281  
282 //	public void buscaFilhosLista(String codAriPai) throws ECARException
283 //	{
284 //        String codigo = "";
285 //        listaAriFilhos.clear();
286 //        listaIett.clear();
287 //        if(codAriFilhos != null){ 
288 //        	String buscaPai = codAriPai + "-";
289 //        	for (int i = 0; i < codAriFilhos.length; i++) {
290 //        		if(codAriFilhos[i].contains(buscaPai)){
291 //        			codigo = codAriFilhos[i].substring(codAriFilhos[i].indexOf('-')+1);
292 //        			AcompReferenciaItemAri acompRefItemFilho = (AcompReferenciaItemAri) acompRefItemDao.buscar(AcompReferenciaItemAri.class, Long.valueOf(codigo));
293 //        			listaAriFilhos.add(acompRefItemFilho);
294 //        			listaIett.add(acompRefItemFilho.getItemEstruturaIett());
295 //        		}
296 //        	}
297 //        }
298 //	}
299 			
300 	/**
301 	 * Define funções.<br>
302 	 * 
303 	 * @author N/C
304      * @since N/C
305      * @version N/C
306      * @throws ECARException
307 	 */
308 	private void defineFuncoes() throws ECARException 
309 	{
310 		String funcoesAcomp[] = request.getParameterValues("tipoFuncAcompTpfa");
311         if(funcoesAcomp != null){
312 			for (int i = 0; i < funcoesAcomp.length; i++) {
313 				TipoFuncAcompTpfa funcao = (TipoFuncAcompTpfa) this.itemDao.buscar(TipoFuncAcompTpfa.class, Long.valueOf(funcoesAcomp[i]));
314 				listFunAcomp.add(funcao);
315 			}
316         }
317 	        
318         posicoes = false;
319         funcoes = false;
320     	dadosGerais = false;
321        	indicadores = false;
322        	financeiro = false;
323        	projecao = false;
324        	
325         if("S".equals(Pagina.getParamStr(request, "todosOsItens"))) {
326 	    	posicoes = true;
327 	    	funcoes = true;
328 	    	dadosGerais = true;
329 	       	indicadores = true;
330 	       	projecao = true;
331 	       	financeiro = true;
332         }
333         
334         if("S".equals(Pagina.getParamStr(request, "posicoes")))
335         	posicoes = true;
336     
337         if(!listFunAcomp.isEmpty())
338         	funcoes = true;
339         
340         if("S".equals(Pagina.getParamStr(request, "dadosGerais")))
341         	dadosGerais = true;
342         
343         if("S".equals(Pagina.getParamStr(request, "indicadores")))
344         	indicadores = true;
345         
346         if("S".equals(Pagina.getParamStr(request, "financeiro")))
347         	financeiro = true;
348         
349         if("S".equals(Pagina.getParamStr(request, "projecao")))
350         	projecao = true;	        
351 	}
352 	
353 	/**
354 	 * Gera itens Geral xml.<br>
355 	 * 
356 	 * @author N/C
357      * @since N/C
358      * @version N/C
359 	 * @param XmlBuilder builder
360 	 * @throws ECARException
361 	 */
362     private void geraXMLItensGeral(XmlBuilder builder) throws ECARException{
363     	String mesRef = "";
364     	mesRef = aref.getMesAref() + "/";
365     	mesRef = mesRef + aref.getAnoAref();
366     	
367     	builder.addNode("itensGeral");
368     	
369     	geraXMLItens(builder);
370 
371     	builder.closeNode("itensGeral");
372     }
373     
374     /**
375      * Pega o nome do arquivo xsl.<br>
376      * 
377      * @author N/C
378      * @since N/C
379      * @version N/C
380      * @return String
381      */
382     public String getXslFileName() {
383         return "posicoes.xsl";
384     }
385     
386     /**
387      * Pega o erro de pagina.<br>
388      * 
389      * @author N/C
390      * @since N/C
391      * @version N/C
392      * @param HttpServletRequest request
393      * @param String mensagem
394      * @return String
395      */
396     public String getErrorPage(HttpServletRequest request, String mensagem){        
397         String errorPage = "acompanhamento/relAcompanhamento/relatorios/relatorioImpresso2.jsp?codAri=" + Pagina.getParamStr(request, "codAri") + "&mesReferencia=" + Pagina.getParamStr(request, "mesReferencia") + "&msgOperacao=" + mensagem; 
398         return errorPage;
399     }
400 
401     /**
402      * Gera itens xml.<br>
403      * 
404      * @author N/C
405      * @since N/C
406      * @version N/C
407      * @param XmlBuilder builder
408      * @throws ECARException
409      */
410     private void geraXMLItens(XmlBuilder builder) throws ECARException{
411     	if(!listaCompletaOrdenada.isEmpty()) {
412     	
413         	builder.addNode("itens");
414 	    	
415         	//Melhoria de performance
416         	//Iterator it = listaCompletaOrdenada.iterator();
417 	    	//while (it.hasNext()){
418         	for(Iterator it = listaCompletaOrdenada.iterator(); it.hasNext();){
419         		
420 	    		AtributoEstruturaListagemItens ae = (AtributoEstruturaListagemItens) it.next();
421 	    		ItemEstruturaIett iett = ae.getItem();
422 	    		
423 	        	String nomeItem = "";
424 	        	
425 	        	if(iett.getSiglaIett() != null && !"".equals(iett.getSiglaIett())){
426 	        		nomeItem = iett.getSiglaIett() + " - ";
427 	        	}
428 	        	
429 	        	nomeItem = iett.getEstruturaEtt().getNomeEtt() + ": " + nomeItem + ae.getDescricao();
430 	        	
431             	builder.addNode("item",	"nomeItem=\"" + builder.normalize(nomeItem) + "\"");
432             	geraXMLHierarquia(builder, iett);
433 	        	
434 	        	if(this.dadosGerais) {
435 	        		geraXMLDadosGerais(builder, iett);
436 	        	}
437 
438 	        	// Testar se o item tem ARI
439 	        	if(listaIett.contains(iett)) {
440 	        		
441 	        		//Melhoria de performance
442 			    	//Iterator itAri = listaAriCompleta.iterator();
443 			    	//while (itAri.hasNext()){
444 	        		for(Iterator itAri = listaAriCompleta.iterator(); itAri.hasNext();){
445 			        	AcompReferenciaItemAri ari = (AcompReferenciaItemAri) itAri.next();
446 
447 			    		if(ari.getItemEstruturaIett().equals(iett)) {
448 			    			geraXMLItemAri(builder, ari);
449 			    			break;
450 			    		}
451 	        		}
452 	        	}
453 
454 		    	builder.closeNode("item");
455 	    	}
456     		//Chamando Garbage Collector para ver se melhora a performance.
457 			//TODO: Verificar se isso ajuda em alguma coisa...
458     		//System.out.println("===================== Chamando o Garbage Collector ===========================");
459     		System.gc();
460 	    	
461 	    	builder.closeNode("itens");
462     	}
463     }
464 
465     /**
466      * Gera XML do ItemAri.<br>
467      * 
468      * @author N/C
469      * @since N/C
470      * @version N/C
471      * @param XmlBuilder builder
472      * @param AcompReferenciaItemAri itemAri
473      * @throws ECARException
474      */
475     private void geraXMLItemAri(XmlBuilder builder, AcompReferenciaItemAri itemAri) throws ECARException{
476 		itemAri = (AcompReferenciaItemAri) this.acompRefItemDao.buscar(AcompReferenciaItemAri.class, itemAri.getCodAri());
477 
478     	if(this.posicoes || this.funcoes) {
479 	    	
480 	    	if (itemAri.getAcompRelatorioArels() != null && itemAri.getAcompRelatorioArels().size() > 0){
481 		    	geraXMLAvaliacoes(builder, itemAri);
482 	    	}
483     	}
484 
485     	if(this.indicadores) {
486     		geraXMLIndicadores(builder, itemAri);
487     	}
488 
489     	if(this.financeiro) {
490     		geraXMLEvolucaoFinanceira(builder, itemAri);
491     	}
492     }
493     
494     /**
495      * Gera Hierarquia xml.<br>
496      * 
497      * 
498      * @author N/C
499      * @since N/C
500      * @version N/C
501      * @param XmlBuilder builder
502      * @param ItemEstruturaIett iett
503      * @throws ECARException
504      */
505     private void geraXMLHierarquia(XmlBuilder builder, ItemEstruturaIett iett) throws ECARException{
506     	try {
507 	    	List lista = this.itemDao.getAscendentes(iett);
508     		lista.add(iett);
509 	    	
510 	    	if(lista == null || lista.isEmpty()) {
511 	    		return;
512 	    	}
513 	    	
514 	    	//Melhoria de performance
515 	    	//Iterator it = lista.iterator();
516 	    	
517 	    	builder.addNode("hierarquia");
518 	    	
519 	    	//while(it.hasNext()){
520 	    	for(Iterator it = lista.iterator(); it.hasNext();){
521 	    		ItemEstruturaIett item = (ItemEstruturaIett) it.next();
522 	    		
523 	    		String descricaoItem = "";
524 	    		// Obter o nome do item de acordo com a configuração
525 	    		
526 	    		//Melhoria de performance
527 		    	//Iterator it2 = listaCompletaOrdenada.iterator();
528 		    	//while (it2.hasNext()){
529 	    		for(Iterator it2 = listaCompletaOrdenada.iterator(); it2.hasNext();){
530 		    		AtributoEstruturaListagemItens ae = (AtributoEstruturaListagemItens) it2.next();
531 		    		if(ae.getItem().equals(item)) {
532 		    			descricaoItem = ae.getDescricao();
533 		    			break;
534 		    		}
535 		    	}
536 		    	
537 		    	String destacarItem = "N";
538 		    	if(iett.equals(item)) {
539 		    		destacarItem = "S";
540 		    	}
541 				
542 	    		builder.addClosedNode("itemHierarquia", "nome=\"" + builder.normalize(descricaoItem) + "\"" +
543 							" nomeEstrutura=\"" + builder.normalize(item.getEstruturaEtt().getNomeEtt()) + "\"" +
544 							" nivel=\"" + builder.normalize(String.valueOf(item.getNivelIett().intValue()-1)) + "\"" +
545 							" destacarItem=\"" + builder.normalize(destacarItem) + "\"");
546 	    	}
547 	    	builder.closeNode("hierarquia");
548 	    	
549 	    } catch(Exception e){
550 	    	this.logger.error(e);
551 	        throw new ECARException("Erro na criação do relatório: Hierarquia - " + e.getMessage());               
552 	    }
553     }
554     
555     /**
556      * Gera avaliações xml.<br>
557      * 
558      * @author N/C
559      * @since N/C
560      * @version N/C
561      * @param XmlBuilder builder
562      * @param AcompReferenciaItemAri itemAri
563      * @throws ECARException
564      */
565     private void geraXMLAvaliacoes(XmlBuilder builder, AcompReferenciaItemAri itemAri) throws ECARException{
566         try{
567         	CorDao corDao = new CorDao(null);
568 
569         	String exigeLiberarAcompanhamento = itemAri.getAcompReferenciaAref().getTipoAcompanhamentoTa().getIndLiberarAcompTa();
570 
571         	String labelSituacaoListaParecer = new ConfiguracaoDao(request).getConfiguracao().getLabelSituacaoListaPareceres();	
572         	builder.addNode("avaliacoes",
573         			" labelSituacaoListaParecer=\"" + builder.normalize(labelSituacaoListaParecer) + "\"");
574 	    	
575 	    	List lista = new ArrayList();
576 	    	if("N".equals(exigeLiberarAcompanhamento) || itemAri.getAcompRelatorioArels() != null){
577 	    		lista = this.acompRefItemDao.getAcompRelatorioArelOrderByFuncaoAcomp(itemAri);
578 	    	}
579 	    
580 	    	String ocultarObservacoesParecer = new ConfiguracaoDao(request).getConfiguracao().getIndOcultarObservacoesParecer();
581 	    	
582 	    	//Melhoria de performance
583 	    	//Iterator it = lista.iterator();
584 	    	
585 	    	String descricao = "";
586 	    	String atribuidoPor = "";
587 	    	String situacao = "";
588 	    	String cor = "";
589 	    	String statusLiberadoRelatorio = "N";
590 	    	String complemento = "";
591 	    	String ultManutencao = "";
592 	    	
593 	    	StatusRelatorioSrl statusLiberado = (StatusRelatorioSrl) this.acompRefItemDao.buscar(StatusRelatorioSrl.class, Long.valueOf(AcompReferenciaItemDao.STATUS_LIBERADO));
594 	    	TipoAcompanhamentoTa tipoAcompanhamento = itemAri.getAcompReferenciaAref().getTipoAcompanhamentoTa();
595 	    	SegurancaECAR seguranca = (SegurancaECAR) request.getSession().getAttribute("seguranca");
596 	    	ValidaPermissao validaPermissao = new ValidaPermissao();
597 	    	List listaPermissaoTpfa = validaPermissao.permissaoVisualizarPareceres(tipoAcompanhamento,seguranca.getGruposAcesso());
598 	    	
599 	    	//while (it.hasNext()){
600 	    	for(Iterator it = lista.iterator(); it.hasNext();){
601 	    		AcompRelatorioArel acompRelatorio = (AcompRelatorioArel) it.next();
602 	    		
603 	    		if(listaPermissaoTpfa.contains(acompRelatorio.getTipoFuncAcompTpfa())){
604 	    		
605 		    		if(acompRelatorio.getUsuarioUsuUltimaManutencao() != null)
606 		    			atribuidoPor = acompRelatorio.getUsuarioUsuUltimaManutencao().getNomeUsuSent();
607 		    		else
608 		    			atribuidoPor = "N/I";
609 		    		
610 	    			if(acompRelatorio.getIndLiberadoArel() == null || "N".equals(acompRelatorio.getIndLiberadoArel())) {
611 		    			descricao = "";
612 		    			situacao = "";
613 		    			cor = "";
614 		    			statusLiberadoRelatorio = "N";
615 		    			complemento = "";
616 	    			} else if("N".equals(exigeLiberarAcompanhamento) || acompRelatorio.getAcompReferenciaItemAri().getStatusRelatorioSrl().equals(statusLiberado)) {
617 			    		statusLiberadoRelatorio = "S";
618 	
619 			    		if(acompRelatorio.getDescricaoArel() != null)
620 			    			descricao = Util.stripHTML(Util.normalizaCaracterMarcador(acompRelatorio.getDescricaoArel()));
621 			    		else
622 			    			descricao = "N/I";
623 			    		
624 			    		if(acompRelatorio.getSituacaoSit() != null)
625 			    			situacao = acompRelatorio.getSituacaoSit().getDescricaoSit();
626 			    		else
627 			    			situacao = "N/I";
628 			    		
629 		    			cor = realPath + request.getContextPath() + "/images/" + corDao.getImagemSinalRelPosicoes(acompRelatorio.getCor(), acompRelatorio.getTipoFuncAcompTpfa());
630 			    		
631 		    				    			
632 			    		if(acompRelatorio.getComplementoArel() != null)
633 			    			complemento = Util.normalizaCaracterMarcador(acompRelatorio.getComplementoArel());
634 			    		else
635 			    			complemento = "N/I";
636 	    			
637 			    		
638 			    		if(acompRelatorio.getDataUltManutArel() != null)
639 			    			ultManutencao = Data.parseDate(acompRelatorio.getDataUltManutArel());
640 			    		else if(acompRelatorio.getDataInclusaoArel() != null)
641 			    			ultManutencao = Data.parseDate(acompRelatorio.getDataInclusaoArel());
642 			    		else
643 			    			ultManutencao = "N/I";
644 		    		}
645 		    		
646 	        		//TODO: temporário SEPL
647 	//        		if(atribuidoPor.equals("Elmar Haas")) {
648 	//        			atribuidoPor = "SEPL";
649 	//        		} else if(atribuidoPor.equals("Sérgio Augusto Negrão")) {
650 	//        			atribuidoPor = "Regina Elena Sabóia Iório";
651 	//        		} else if(atribuidoPor.equals("Caroline Jablonski Ruppel Santos")) {
652 	//        			atribuidoPor = "Rosina Coeli Alice Parchen";
653 	//        		}
654 	
655 	    			
656 	    			String labelSituacaoParecer = new ConfiguracaoDao(request).getConfiguracao().getLabelSituacaoParecer();
657 	    			
658 	        		if(this.posicoes){
659 	        			
660 	        			if (ocultarObservacoesParecer == null || ocultarObservacoesParecer.equals("N")){
661 	        			
662 			    		builder.addClosedNode("avaliacao", 
663 			    				"label=\"" + builder.normalize(acompRelatorio.getTipoFuncAcompTpfa().getLabelPosicaoTpfa()) + "\"" + 
664 								" responsavel=\"" + builder.normalize(atribuidoPor) + "\"" +
665 								" labelSituacaoParecer=\"" + builder.normalize(labelSituacaoParecer) + "\"" +
666 								" situacao=\"" + builder.normalize(situacao) + "\"" + 
667 								" cor=\"" + builder.normalize(cor) + "\"" +
668 								" descricao=\"" + builder.normalize(descricao) + "\"" +
669 								" complemento=\"" + builder.normalize(complemento) + "\"" +
670 								" statusLiberado=\"" + builder.normalize(statusLiberadoRelatorio) + "\"" +
671 								" ultManutencao=\"" + builder.normalize(ultManutencao) + "\"");
672 	        			}
673 	        			else{
674 	        				
675 	        				builder.addClosedNode("avaliacao", 
676 	    		    				"label=\"" + builder.normalize(acompRelatorio.getTipoFuncAcompTpfa().getLabelPosicaoTpfa()) + "\"" + 
677 	    							" responsavel=\"" + builder.normalize(atribuidoPor) + "\"" +
678 	    							" labelSituacaoParecer=\"" + builder.normalize(labelSituacaoParecer) + "\"" +
679 	    							" situacao=\"" + builder.normalize(situacao) + "\"" + 
680 	    							" cor=\"" + builder.normalize(cor) + "\"" +
681 	    							" descricao=\"" + builder.normalize(descricao) + "\"" +   
682 	    							" complemento=\"ocultar\"" +
683 	    							" statusLiberado=\"" + builder.normalize(statusLiberadoRelatorio) + "\"" +
684 	    							" ultManutencao=\"" + builder.normalize(ultManutencao) + "\"");
685 	        			}
686 		    		}
687 		    		else if (funcoes){
688 		    			if(listFunAcomp.contains(acompRelatorio.getTipoFuncAcompTpfa())){
689 		    				
690 		    				if (ocultarObservacoesParecer == null || ocultarObservacoesParecer.equals("N")){
691 		    				
692 				    		builder.addClosedNode("avaliacao", 
693 				    				"label=\"" + builder.normalize(acompRelatorio.getTipoFuncAcompTpfa().getLabelPosicaoTpfa()) + "\"" + 
694 									" responsavel=\"" + builder.normalize(atribuidoPor) + "\"" +
695 									" labelSituacaoParecer=\"" + builder.normalize(labelSituacaoParecer) + "\"" +
696 									" situacao=\"" + builder.normalize(situacao) + "\"" + 
697 									" cor=\"" + builder.normalize(cor) + "\"" +
698 									" descricao=\"" + builder.normalize(descricao) + "\"" +
699 									" complemento=\"" + builder.normalize(complemento) + "\"" +
700 									" statusLiberado=\"" + builder.normalize(statusLiberadoRelatorio) + "\"" +
701 									" ultManutencao=\"" + builder.normalize(ultManutencao) + "\"");
702 		    				}
703 		    				else{
704 		    					
705 		    					builder.addClosedNode("avaliacao", 
706 		    		    				"label=\"" + builder.normalize(acompRelatorio.getTipoFuncAcompTpfa().getLabelPosicaoTpfa()) + "\"" + 
707 		    							" responsavel=\"" + builder.normalize(atribuidoPor) + "\"" +
708 		    							" labelSituacaoParecer=\"" + builder.normalize(labelSituacaoParecer) + "\"" +
709 		    							" situacao=\"" + builder.normalize(situacao) + "\"" + 
710 		    							" cor=\"" + builder.normalize(cor) + "\"" +
711 		    							" descricao=\"" + builder.normalize(descricao) + "\"" +   
712 		    							" complemento=\"\"" +
713 		    							" statusLiberado=\"" + builder.normalize(statusLiberadoRelatorio) + "\"" +
714 		    							" ultManutencao=\"" + builder.normalize(ultManutencao) + "\"");
715 		    				}
716 		    			}
717 		    		}
718 		    	}
719 	    	
720 	    	}
721 	    	
722 	    	builder.closeNode("avaliacoes");
723         } catch(Exception e){
724         	this.logger.error(e);
725             throw new ECARException("Erro na criação do relatório: Avaliações - " + e.getMessage());               
726         }
727     }
728     
729     /**
730      * Gera dados gerais xml.<br>
731      * 
732      * @author N/C
733      * @since N/C
734      * @version N/C
735      * @param XmlBuilder builder
736      * @param ItemEstruturaIett iett
737      * @throws ECARException
738      */
739     private void geraXMLDadosGerais(XmlBuilder builder, ItemEstruturaIett iett) throws ECARException{
740         try{
741         	builder.addNode("dadosGerais");
742             
743         	EstruturaDao estruturaDao = new EstruturaDao(null);
744             List atributos = estruturaDao.getAtributosEstruturaRelatorio(iett.getEstruturaEtt(), Pagina.getParamStr(request, "indTipoDadosGerais"));
745             
746             //Melhoria de performance
747             //Iterator itAtributos = atributos.iterator();
748             //while (itAtributos.hasNext()){
749             for(Iterator itAtributos = atributos.iterator(); itAtributos.hasNext();){
750             	ObjetoEstrutura atributo = (ObjetoEstrutura) itAtributos.next();
751             	
752             	String label = atributo.iGetLabel();
753             	String conteudo = atributo.iGetValor(iett);
754             	           	
755             	/*******Codigo responsavel pelos atributos livres no relatório******/
756             	
757               	if(iett.getItemEstruturaSisAtributoIettSatbs() != null){
758             		int tam = iett.getItemEstruturaSisAtributoIettSatbs().size();
759             		int pos = 1;
760         	    	Iterator itAtribLivres = iett.getItemEstruturaSisAtributoIettSatbs().iterator();
761         	    	while(itAtribLivres.hasNext()){
762         	    		ItemEstruturaSisAtributoIettSatb atr = (ItemEstruturaSisAtributoIettSatb) itAtribLivres.next();
763         	    		AtributoLivre atributoLivre = new AtributoLivre();
764         	    		atributoLivre.setSisAtributoSatb(atr.getSisAtributoSatb());
765         	    		atributoLivre.setInformacao(atr.getInformacaoIettSatb());
766         	    		
767         	    		if(!atributoLivre.getSisAtributoSatb().getSisGrupoAtributoSga().equals(atributo.iGetGrupoAtributosLivres()))
768         	    			continue;
769         	    		
770         	    		if((atributoLivre.getSisAtributoSatb()
771         	    				.getSisGrupoAtributoSga()
772         	    				.getSisTipoExibicGrupoSteg()
773         	    				.getCodSteg().intValue() != TEXT) && 
774         	    			(atributoLivre.getSisAtributoSatb()
775                 	    			.getSisGrupoAtributoSga()
776                 	    			.getSisTipoExibicGrupoSteg()
777                 	    			.getCodSteg().intValue() != TEXTAREA)) {
778         	    		
779             	    		String separador = "";
780             	    		if(tam > 1 && pos < tam){
781             	    			separador = ", ";
782             	    		}
783             	    		
784             	    		if(atributoLivre.getSisAtributoSatb() != null)
785             	    			conteudo += atributoLivre.getSisAtributoSatb().getDescricaoSatb() + separador;
786             	    		else
787             	    			conteudo += atributoLivre.getInformacao() + separador;
788             	    		
789             	    		pos++;
790         	    		} else {
791         	    			conteudo = atributoLivre.getInformacao();
792         	    		}
793         	    	}
794             	}
795               	
796               	/*******Codigo responsavel pelos atributos livres no relatório******/           	
797 
798             	
799             	if(label != null && !"".equals(label) && conteudo != null && !"".equals(conteudo)){
800             		
801             		//TODO: temporário SEPL
802 //            		if(conteudo.equals("Elmar Haas")) {
803 //            			conteudo = "SEPL";
804 //            		} else if(conteudo.equals("Sérgio Augusto Negrão")) {
805 //            			conteudo = "Regina Elena Sabóia Iório";
806 //            		} else if(conteudo.equals("Caroline Jablonski Ruppel Santos")) {
807 //            			conteudo = "Rosina Coeli Alice Parchen";
808 //            		}
809             		
810             		builder.addClosedNode("atributosDadosGerais",
811                 			"label=\"" + builder.normalize(label) + "\"" + 
812                 			" conteudo=\"" + builder.normalize(conteudo) + "\"");
813             	}
814             }
815     		
816             builder.closeNode("dadosGerais");
817             geraXMLDadosAbasItem(builder, iett);
818         } catch(Exception e){
819         	this.logger.error(e);
820             throw new ECARException("Erro na criação do relatório: Dados Gerais Itens Sem ARI - " + e.getMessage());               
821         }
822     }
823     
824     /**
825      * Gera XML dos Dados das Abas de itens.<br>
826      * 
827      * @author N/C
828      * @since N/C
829      * @version N/C
830      * @param XmlBuilder builder
831      * @param ItemEstruturaIett iett
832      * @throws ECARException
833      */
834     private void geraXMLDadosAbasItem(XmlBuilder builder, ItemEstruturaIett iett) throws ECARException{
835         try{
836             RelatorioItemEstrutura relatorioItemEstrutura = new RelatorioItemEstrutura();
837             
838             //"indTipoDadosGerais"
839         	// "C" = COMPLETO
840             // "R" = RESUMO
841             // "L" = RELAÇÃO
842 
843             relatorioItemEstrutura.geraXMLFuncoes(builder, iett, Pagina.getParamStr(request, "indTipoDadosGerais"), false);
844         } catch(Exception e){
845         	this.logger.error(e);
846             throw new ECARException("Erro na criação do relatório: Dados Gerais - " + e.getMessage());               
847         }
848     }
849     
850     /**
851      * Gera indicadores xml.<br>
852      * 
853      * @author N/C
854      * @since N/C
855      * @version N/C
856      * @param XmlBuilder builder
857      * @param AcompReferenciaItemAri itemAri
858      * @throws ECARException
859      */
860     private void geraXMLIndicadores(XmlBuilder builder, AcompReferenciaItemAri itemAri) throws ECARException{
861     	try {
862     		AcompRealFisicoDao acompRealFisicoDao = new AcompRealFisicoDao(null);
863     		ExercicioDao exercicioDao = new ExercicioDao(null);
864     		ItemEstrtIndResulDao itemEstrtIndResulDao = new ItemEstrtIndResulDao(null);
865     		EstruturaFuncaoDao estruturaFuncaoDao = new EstruturaFuncaoDao(null);
866 
867     		String mostrarProjecao = (projecao) ? "S" : "N";
868 			//List<ExercicioExe> exercicios = new ExercicioDao(null).getExerciciosProjecao(itemAri.getItemEstruturaIett().getCodIett());
869 			//Ref. mantis 7770: exibir os últimos quatro anos...
870 			//Pegando exercicios do mais novo para mais antigo para pegar os ultimos anos primeiro...
871 			//List<ExercicioExe> todosExercicios = exercicioDao.listar(ExercicioExe.class, new String[] {"dataInicialExe","desc"});
872     		
873 			//Mantis #11071: Ajustes no Relatório do PPA (metas físicas de exercícios)
874 			List<ExercicioExe> todosExercicios = exercicioDao.getExeByPerExe(itemAri.getAcompReferenciaAref().getExercicioExe());
875     		
876     		
877 			if(todosExercicios == null || todosExercicios.isEmpty()) {
878 				throw new Exception("Não existe exercícios cadastrado");
879 			}
880 			List<ExercicioExe> exercicios = new ArrayList<ExercicioExe>();
881 			//Obtendo ultimos 4 anos...
882 			int qtdeAnos = 4;
883 			if(todosExercicios.size() < qtdeAnos) {
884 				qtdeAnos = todosExercicios.size(); 
885 			}
886 			exercicios.addAll(todosExercicios.subList(0, qtdeAnos));
887 			//Re-ordenando do mais antigo para o o mais novo... 
888 			Collections.reverse(exercicios);
889 			
890 			List indResultados = acompRealFisicoDao.getIndResulByAcompRefItemBySituacao(itemAri, Dominios.TODOS, true);
891 			if(indResultados != null && indResultados.size() > 0){
892 
893 				String exibirSituacaoColuna = "N";					
894 				if("N".equals(mostrarProjecao)) {
895 					exibirSituacaoColuna = "S";					
896 				}
897 				builder.addNode("indicadores", "labelFuncao=\"" 
898 						+ builder.normalize(estruturaFuncaoDao.getLabelIndicadoresResultado(itemAri.getItemEstruturaIett().getEstruturaEtt())) 
899 						+ "\" mostrarProjecao=\"" + builder.normalize(mostrarProjecao) + "\""
900 						+ " exibirSituacaoColuna=\"" + builder.normalize(exibirSituacaoColuna) + "\"");
901 				
902 				int numeroExercicios = 0;
903 				for(ExercicioExe exercicio : exercicios){
904 					builder.addClosedNode("columnExercicio", "ano=\"" + builder.normalize(exercicio.getDescricaoExe()) + "\"");
905 					builder.addClosedNode("indExercicio", "exercicio=\"" + builder.normalize(exercicio.getDescricaoExe()) + "\"");
906 					numeroExercicios++;
907 				}
908 
909 				String grupoIndicador = "Indicador";
910 				String exibirGrupoIndicador = "N";
911 				
912 				//Melhoria de performance
913 				//Iterator itIndResult = indResultados.iterator();
914 				//while(itIndResult.hasNext()){
915 				for(Iterator itIndResult = indResultados.iterator(); itIndResult.hasNext();){
916 					AcompRealFisicoArf indicador = (AcompRealFisicoArf) itIndResult.next();
917 					String tipoQtde = indicador.getItemEstrtIndResulIettr().getIndTipoQtde();
918 					String situacao = "";
919 					if(indicador.getSituacaoSit()!=null) {
920 						situacao = indicador.getSituacaoSit().getDescricaoSit();
921 					}
922 					
923 					//TODO: temporário para SEPL:
924 //					if("/ecar".equals(request.getContextPath())) {
925 //						if("".equals(situacao)) {
926 //							situacao = "Em andamento";
927 //						}
928 //					}
929 
930 					exibirGrupoIndicador = "N";
931 
932 					if(configura.getSisGrupoAtributoSgaByCodSgaGrAtrMetasFisicas() != null){
933 						if(indicador.getItemEstrtIndResulIettr().getSisAtributoSatb() != null && !grupoIndicador.equals(indicador.getItemEstrtIndResulIettr().getSisAtributoSatb().getDescricaoSatb())){
934 							grupoIndicador = indicador.getItemEstrtIndResulIettr().getSisAtributoSatb().getDescricaoSatb();
935 							exibirGrupoIndicador = "S";
936 						}
937 						else if(indicador.getItemEstrtIndResulIettr().getSisAtributoSatb() == null && !"".equals(grupoIndicador)) {
938 							exibirGrupoIndicador = "S";
939 						}
940 					}
941 					
942 					double totalRealizado = 0;
943 					double totalPrevisto = 0;
944 					String labelSituacaoParecer = new ConfiguracaoDao(request).getConfiguracao().getLabelSituacaoParecer();
945 					
946 					builder.addNode("indicadorAcomp", 
947                          	"nome=\"" + builder.normalize(indicador.getItemEstrtIndResulIettr().getNomeIettir()) + "\"" + 
948                          	" labelSituacaoParecer=\"" + builder.normalize(labelSituacaoParecer) + "\"" +
949                          	" situacao=\"" + builder.normalize(situacao) + "\"" +
950                          	" realizadoNoMes=\"" + builder.normalize(Pagina.trocaNullMoeda(indicador.getQtdRealizadaArf()) + " " + indicador.getItemEstrtIndResulIettr().getUnidMedidaIettr()) + "\"" +
951                          	" numeroExercicios=\"" + builder.normalize(String.valueOf(numeroExercicios)) + "\"" +
952                          	" mostrarProjecao=\"" + builder.normalize(mostrarProjecao) + "\"" +
953                          	" grupoIndicador=\"" + builder.normalize(grupoIndicador) + "\"" +
954                          	" exibirGrupoIndicador=\"" + builder.normalize(exibirGrupoIndicador) + "\"" +
955                          	" numeroExe=\"" + builder.normalize(String.valueOf(numeroExercicios)) + "\""
956                          	);
957 					
958 					if(indicador.getItemEstrtIndResulIettr().getSisAtributoSatb() == null && !"".equals(grupoIndicador)) {
959 						grupoIndicador = "";
960 					}
961 
962 					List valoresR = new ArrayList();
963 					List valoresP = new ArrayList();
964 
965 					for(ExercicioExe exercicio : exercicios){
966 						double realizadoNoExercicio = 0;
967 						//Comentado por aleixo em 18/04/2007
968 //						if(exercicio.equals(itemAri.getAcompReferenciaAref().getExercicioExe())){
969 //							// Se o exercício em questão é mesmo exercicio do periodo de referência e o indicador for acumulável
970 //							// soma todas as quantidades até o mes/ano do periodo
971 //							if("S".equals(indicador.getItemEstrtIndResulIettr().getIndAcumulavelIettr())){
972 //								AcompReferenciaAref aref = itemAri.getAcompReferenciaAref();
973 //								int mesRef = Integer.valueOf(aref.getMesAref()).intValue();
974 //								int anoRef = Integer.valueOf(aref.getAnoAref()).intValue();
975 //								realizadoNoExercicio = acompRealFisicoDao.getQtdRealizadaExercicio(exercicio, indicador.getItemEstrtIndResulIettr(), mesRef, anoRef);																					
976 //							} else {
977 //								//se não for acumulável o realizado no exercicio é o realizado no periodo
978 //								/*if (indicador.getQtdRealizadaArf() != null)
979 //									realizadoNoExercicio = indicador.getQtdRealizadaArf().doubleValue();
980 //								*/
981 //								realizadoNoExercicio = acompRealFisicoDao.getQtdRealizadaExercicioNaoAcumulavel(exercicio, indicador.getItemEstrtIndResulIettr(), itemAri.getAcompReferenciaAref());
982 //							}
983 //						} else {
984 //							if("S".equals(indicador.getItemEstrtIndResulIettr().getIndAcumulavelIettr())){
985 //								realizadoNoExercicio = acompRealFisicoDao.getQtdRealizadaExercicio(exercicio, indicador.getItemEstrtIndResulIettr(), itemAri.getAcompReferenciaAref());										
986 //							} else {
987 //								realizadoNoExercicio = acompRealFisicoDao.getQtdRealizadaExercicioNaoAcumulavel(exercicio, indicador.getItemEstrtIndResulIettr(), itemAri.getAcompReferenciaAref());																						
988 //							}
989 //						} 
990 
991 						if("S".equals(indicador.getItemEstrtIndResulIettr().getIndAcumulavelIettr())){
992 							realizadoNoExercicio = acompRealFisicoDao.getQtdRealizadaExercicio(exercicio, indicador.getItemEstrtIndResulIettr(), aref);										
993 						} else {
994 							realizadoNoExercicio = acompRealFisicoDao.getQtdRealizadaExercicioNaoAcumulavel(exercicio, indicador.getItemEstrtIndResulIettr(), aref);																						
995 						}
996 
997 						double previstoNoExercicio = itemEstrtIndResulDao.getQtdPrevistoExercicio(indicador.getItemEstrtIndResulIettr(), exercicio);
998 						if("S".equals(indicador.getItemEstrtIndResulIettr().getIndAcumulavelIettr())){
999 							totalRealizado += realizadoNoExercicio;
1000 							totalPrevisto += previstoNoExercicio;
1001 						}else{
1002 							totalRealizado = realizadoNoExercicio;
1003 							totalPrevisto = previstoNoExercicio;											
1004 						}
1005 
1006 						valoresR.add(realizadoNoExercicio);
1007 						valoresP.add(previstoNoExercicio);
1008 
1009 						String strPrevistoExe = "";
1010 						String strRealizadoExe = "";
1011 						if ("Q".equalsIgnoreCase(tipoQtde)){ //Quantidade --> sem casas decimais
1012 							strPrevistoExe = Pagina.trocaNullNumeroSemDecimal(previstoNoExercicio);
1013 							strRealizadoExe = Pagina.trocaNullNumeroSemDecimal(realizadoNoExercicio);
1014 						}
1015 						else {
1016 							strPrevistoExe = Pagina.trocaNullMoeda(previstoNoExercicio);
1017 							strRealizadoExe = Pagina.trocaNullMoeda(realizadoNoExercicio);
1018 						}
1019 
1020 						
1021 						builder.addClosedNode("valorExercicio", 
1022 							"exercicio=\"" + builder.normalize(exercicio.getDescricaoExe()) + "\"" + 
1023 //							" valorPrevisto=\"" + builder.normalize(Pagina.trocaNullMoeda(previstoNoExercicio)) + "\"" +
1024 //							" valorRealizado=\"" + builder.normalize(Pagina.trocaNullMoeda(realizadoNoExercicio)) + "\"");
1025 							" valorPrevisto=\"" + builder.normalize(strPrevistoExe) + "\"" +
1026 							" valorRealizado=\"" + builder.normalize(strRealizadoExe) + "\"");								
1027 					}
1028 
1029 					Collections.reverse(valoresR);
1030 					Collections.reverse(valoresP);
1031 					
1032 					totalPrevisto = acompRealFisicoDao.getSomaValoresArfs(indicador.getItemEstrtIndResulIettr(), valoresP).doubleValue();
1033 					totalRealizado = acompRealFisicoDao.getSomaValoresArfs(indicador.getItemEstrtIndResulIettr(), valoresR).doubleValue();
1034 
1035 					double realizadoPrevisto = 0;
1036 					if(totalPrevisto > 0) {
1037 						realizadoPrevisto = ((totalRealizado/totalPrevisto) * 100);
1038 					}
1039 
1040 					String strTotalPrevisto = "";
1041 					String strTotalRealizado = "";
1042 					if ("Q".equalsIgnoreCase(tipoQtde)){ //Quantidade --> sem casas decimais
1043 						strTotalPrevisto = Pagina.trocaNullNumeroSemDecimal(totalPrevisto);
1044 						strTotalRealizado = Pagina.trocaNullNumeroSemDecimal(totalRealizado);
1045 					}
1046 					else {
1047 						strTotalPrevisto = Pagina.trocaNullMoeda(totalPrevisto);
1048 						strTotalRealizado = Pagina.trocaNullMoeda(totalRealizado);
1049 					}
1050 
1051 					
1052 					builder.addClosedNode("valorTotal", 
1053                          	" percentualRealizadoPrevisto=\"" + builder.normalize(Pagina.trocaNullMoeda(new Double((realizadoPrevisto)))) + "\"" +
1054 //                         	" totalPrevisto=\"" + builder.normalize(Pagina.trocaNullMoeda(new Double(totalPrevisto))) + "\"" +
1055 //                         	" totalRealizado=\"" + builder.normalize(Pagina.trocaNullMoeda(new Double(totalRealizado))) + "\""
1056                          	" totalPrevisto=\"" + builder.normalize(strTotalPrevisto) + "\"" +
1057                          	" totalRealizado=\"" + builder.normalize(strTotalRealizado) + "\""
1058                          	);
1059 					
1060 
1061 					String strProjecao = "";
1062 					String strPorcentual = "-";
1063 
1064 					if("S".equals(indicador.getItemEstrtIndResulIettr().getIndProjecaoIettr()) && totalRealizado > 0){
1065 						double resultado = this.acompRefItemDao.calculoProjecao(indicador.getItemEstrtIndResulIettr(), itemAri);
1066 						ExercicioExe exercicioPrevisto = itemEstrtIndResulDao.getMaiorExercicioIndicador(indicador.getItemEstrtIndResulIettr());
1067 						double qtdePrevista = itemEstrtIndResulDao.getQtdPrevistoExercicio(indicador.getItemEstrtIndResulIettr(), exercicioPrevisto);
1068 						
1069 						Mensagem msg = new Mensagem(this.request.getSession().getServletContext());
1070 
1071 						if(resultado == qtdePrevista)
1072 							strProjecao = msg.getMensagem("acompRelatorio.indicadorResultado.projecao.seraAtingida");
1073 						if(resultado > qtdePrevista)
1074 							strProjecao = msg.getMensagem("acompRelatorio.indicadorResultado.projecao.seraAtingidaAntes");												
1075 						if(resultado < qtdePrevista){
1076 							strProjecao = msg.getMensagem("acompRelatorio.indicadorResultado.projecao.naoSeraAtingida");																									
1077 						}
1078 						
1079 						Double porcentagem = new Double((resultado/qtdePrevista) * 100);
1080 						
1081 						strPorcentual = Pagina.trocaNullNumeroDecimalSemMilhar(porcentagem);
1082 					} else {
1083 						if(totalRealizado == 0){
1084 							strProjecao = "Não é possível realizar projeção sem informação de quantidades realizadas.";										
1085 						} else {
1086 							strProjecao = "N/A";
1087 						}
1088 					}
1089 					
1090 					builder.addClosedNode("valorProjecao",
1091                          	" projecao=\"" + builder.normalize(strProjecao) + "\"" +
1092                          	" mostrarProjecao=\"" + builder.normalize(mostrarProjecao) + "\"" +
1093                          	" percentual=\"" + builder.normalize(strPorcentual) + "\""
1094 							);
1095 					
1096 					
1097 					builder.closeNode("indicadorAcomp");
1098 
1099 				}
1100 				builder.closeNode("indicadores");
1101 			}
1102     	} catch(Exception e){
1103     		this.logger.error(e);
1104     		throw new ECARException("Erro na criação do relatório: Indicadores - " + e.getMessage());               
1105     	}
1106     }
1107     
1108     /**
1109      * Gera evolução financeira xml.<br>
1110      * 
1111      * @author N/C
1112      * @since N/C
1113      * @version N/C
1114      * @param XmlBuilder builder
1115      * @param AcompReferenciaItemAri itemAri
1116      * @throws ECARException
1117      */
1118     private void geraXMLEvolucaoFinanceira(XmlBuilder builder, AcompReferenciaItemAri itemAri) throws ECARException{
1119     	try{
1120     		ItemEstruturaPrevisaoDao itemEstPrevDao = new ItemEstruturaPrevisaoDao(null);
1121     		ItemEstruturaRealizadoDao itemEstRealizadoDao = new ItemEstruturaRealizadoDao(null);
1122     		ItemEstruturaContaOrcamentoDao itemEstContaOrcDao = new ItemEstruturaContaOrcamentoDao(null);
1123 
1124     		
1125     		List listaExercicios = itemEstPrevDao.getListaExerciciosItemEstruturaPrevisao(itemAri.getItemEstruturaIett());
1126     		
1127     		//List lista = itemEstPrevDao.getListaItemEstruturaPrevisao(itemAri.getItemEstruturaIett(), itemAri.getAcompReferenciaAref().getExercicioExe());
1128     		List lista = itemEstPrevDao.getListaItemEstruturaPrevisao(itemAri.getItemEstruturaIett(), null);
1129     		
1130     		//Melhoria de performance
1131     		//Iterator it = lista.iterator();
1132 	    	
1133 	    	EfItemEstPrevisaoEfiep itemEstPrev = new EfItemEstPrevisaoEfiep();
1134 	    	
1135 	    	//if (it.hasNext()){
1136 	    	if (lista != null && !lista.isEmpty()){
1137 
1138 	    		int colunas = 0;
1139 
1140 	    		int numeroColunasExibidas = 0; 
1141 
1142 	    		String descFinanceiro[] = new String[3];
1143 	    		boolean mostrarDescFinanceiro[] = new boolean[3];
1144 	    		descFinanceiro[0] = configura.getRecursoDescValor1Cfg();
1145 	    		descFinanceiro[1] = configura.getRecursoDescValor2Cfg();
1146 	    		descFinanceiro[2] = configura.getRecursoDescValor3Cfg();
1147 	    		
1148 	    		
1149 	    		boolean mostrarValores[] = new boolean[6];
1150 
1151 	    		String descricoes[] = new String[6];
1152 	    		descricoes[0] = configura.getFinanceiroDescValor1Cfg();
1153 	    		descricoes[1] = configura.getFinanceiroDescValor2Cfg();
1154 	    		descricoes[2] = configura.getFinanceiroDescValor3Cfg();
1155 	    		descricoes[3] = configura.getFinanceiroDescValor4Cfg();
1156 	    		descricoes[4] = configura.getFinanceiroDescValor5Cfg();
1157 	    		descricoes[5] = configura.getFinanceiroDescValor6Cfg();
1158 	    		
1159 				for(int i = 0; i < 6; i++){
1160 	    			mostrarValores[i] = itemEstRealizadoDao.getVerificarMostrarValorByPosicaoCfg(i);
1161 	    			if(mostrarValores[i]){
1162 	    				colunas++;
1163 	    			}
1164 	    		}	    
1165 				
1166 	    		builder.addNode("evolucaoFinanceira", "colunasRealizadas=\"" + builder.normalize(String.valueOf(colunas)) + "\"");
1167 	    		
1168 	    		
1169 	    		builder.addNode("colunas");
1170 	    		
1171 				builder.addClosedNode("coluna", "nome=\"Categoria Econômica\"");
1172 				builder.addClosedNode("coluna", "nome=\"Fonte\"");
1173 				//builder.addClosedNode("coluna", "nome=\"Aprovado\"");
1174 				//builder.addClosedNode("coluna", "nome=\"Revisado\"");
1175 	    		//int numeroColunasExibidas = 2; //Aprovado - Revisado 
1176 				
1177 	    		for(int i = 0; i < 3; i++){
1178 	    			mostrarDescFinanceiro[i] = itemEstRealizadoDao.getVerificarMostrarRecursoByPosicaoCfg(i);
1179 	    			if(mostrarDescFinanceiro[i]){
1180 	    				builder.addClosedNode("coluna", "nome=\"" + builder.normalize(descFinanceiro[i]) + "\"");
1181 	    				numeroColunasExibidas++;
1182 	    			}
1183 	    		}
1184 				
1185 				for(int i = 0; i < 6; i++){
1186 	    			mostrarValores[i] = itemEstRealizadoDao.getVerificarMostrarValorByPosicaoCfg(i);
1187 	    			if(mostrarValores[i]){
1188 	    				builder.addClosedNode("coluna", "nome=\"" + builder.normalize(descricoes[i]) + "\"");
1189 	    				numeroColunasExibidas++;
1190 	    			}
1191 	    		}	    		
1192 
1193 				builder.closeNode("colunas");
1194 
1195 				/*
1196 				 * 13.62cm / numeroColunasExibidas = tamanho de cada coluna dinâmica
1197 				 * Quanto mais colunas, menos espaço no relatório.
1198 				 */
1199 				double t = 13.62;
1200 				String tam = String.valueOf(t/numeroColunasExibidas) + "cm";
1201 				
1202 				builder.addNode("colunasHeader");
1203 				for(int x = 1; x <= numeroColunasExibidas; x++){
1204 					builder.addClosedNode("colunaHeader", "tamanho=\"" + builder.normalize(tam) + "\"");
1205 				}
1206 				builder.closeNode("colunasHeader");
1207 	    		
1208 				double totFonAprovado = 0, totFonRevisado = 0;
1209 				double totGerAprovado = 0, totGerRevisado = 0;
1210 				double[] totFonValor = new double[6];
1211 				double[] totGerValor = new double[6];
1212 				
1213 				/*Inicializar os valores...*/
1214 				for(int i = 0; i < 6; i++){
1215 					totFonValor[i] = 0;
1216 					totGerValor[i] = 0;
1217 				}
1218 				
1219 				//Melhoria de performance
1220 				//Iterator itExe = listaExercicios.iterator();
1221 				//while(itExe.hasNext()){
1222 				for(Iterator itExe = listaExercicios.iterator(); itExe.hasNext();){
1223 					ExercicioExe exercicio = (ExercicioExe) itExe.next();
1224 					String exercicioDesc = exercicio.getDescricaoExe();
1225 					String exercicioDescTotal = exercicioDesc;
1226 					double totExeAprovado = 0, totExeRevisado = 0; 
1227 					double[] totExeValor = new double[6];
1228 					
1229 					/*Inicializar os valores...*/
1230 					for(int i = 0; i < 6; i++){
1231 						totExeValor[i] = 0;
1232 					}
1233 					
1234 					
1235 					lista = itemEstPrevDao.getListaItemEstruturaPrevisao(itemAri.getItemEstruturaIett(), exercicio);
1236 					
1237 					//it = lista.iterator();
1238 					long codFonte = -1;
1239 		    		//while(it.hasNext()){
1240 					for(Iterator it = lista.iterator(); it.hasNext();){
1241 		    			itemEstPrev = (EfItemEstPrevisaoEfiep) it.next();
1242 		    			
1243 		    			/* ler EfItemEstContaEfiec */
1244 		    			EfItemEstContaEfiec itemEstConta = 
1245 		    					itemEstContaOrcDao.getItemEstruturaConta(
1246 		    						itemAri.getItemEstruturaIett(),
1247 		    						exercicio,
1248 		    						itemEstPrev.getFonteRecursoFonr(),
1249 		    						itemEstPrev.getRecursoRec());
1250 		    			
1251 		    			/* verificar valores em Efier */
1252 		    			Double[] valores = itemEstRealizadoDao.getSomaItemEstruturaRealizado(
1253 		    					itemEstConta,
1254 		    					exercicio);
1255 		    			
1256 		    			/* Ao trocar a fonte e ao iniciar imprimir linha de fonte */
1257 		    			if(codFonte != itemEstPrev.getFonteRecursoFonr().getCodFonr().longValue()){
1258 		    				/* se não é a primeira passada da fonte */
1259 		    				if(codFonte != -1){
1260 	
1261 		    					builder.closeNode("fonte");
1262 			    				
1263 		    					/* zerar os valores do total da fonte */
1264 		    					totFonAprovado = 0;
1265 		    					totFonRevisado = 0;
1266 	
1267 		    					for(int i = 0; i < 6; i++){
1268 		    						totFonValor[i] = 0;
1269 		    					}
1270 		    				}
1271 		    				
1272 		    				codFonte = itemEstPrev.getFonteRecursoFonr().getCodFonr().longValue();
1273 		    				//IMPRIMIR FONTE
1274 		    				builder.addNode("fonte", "nome=\"" + builder.normalize(itemEstPrev.getFonteRecursoFonr().getNomeFonr()) + "\" exercicio=\"" + builder.normalize(exercicioDesc) + "\"");
1275 		    				exercicioDesc = "";
1276 		    			}
1277 
1278 		    			/* somar nos valores do total da fonte */
1279 		    			if(itemEstPrev.getValorAprovadoEfiep() != null){
1280 		    				totFonAprovado = totFonAprovado + itemEstPrev.getValorAprovadoEfiep().doubleValue();
1281 		    				totExeAprovado = totExeAprovado + itemEstPrev.getValorAprovadoEfiep().doubleValue();
1282 		    			}
1283 		    			if(itemEstPrev.getValorRevisadoEfiep() != null){
1284 		    				totFonRevisado = totFonRevisado + itemEstPrev.getValorRevisadoEfiep().doubleValue();
1285 		    				totExeRevisado = totExeRevisado + itemEstPrev.getValorRevisadoEfiep().doubleValue();
1286 		    			}
1287 	
1288 		    			for(int i = 0; i < 6; i++){
1289 							if(mostrarValores[i]){
1290 								totFonValor[i] = totFonValor[i] + valores[i].doubleValue();
1291 								totExeValor[i] = totExeValor[i] + valores[i].doubleValue();
1292 							}
1293 		    			}
1294 		    			
1295 		    			//IMPRIMIR RECURSO
1296 						builder.addNode("recursoFinanceiro", "nome=\"" + builder.normalize(itemEstPrev.getRecursoRec().getNomeRec()) + "\"");
1297 						//builder.addClosedNode("rec", "valor=\"" + builder.normalize(Util.formataNumeroSemDecimal(itemEstPrev.getValorAprovadoEfiep().doubleValue()))+ "\"");
1298 						//builder.addClosedNode("rec", "valor=\"" + builder.normalize(Util.formataNumeroSemDecimal(itemEstPrev.getValorRevisadoEfiep().doubleValue()))+ "\"");
1299 						
1300 		    			for(int i = 0; i < 3; i++){
1301 							if(mostrarDescFinanceiro[i]){
1302 								if(i == 0)
1303 									builder.addClosedNode("rec", "valor=\"" + builder.normalize(Pagina.trocaNullNumeroSemDecimal(itemEstPrev.getValorAprovadoEfiep())) + "\"");
1304 								if(i == 1)
1305 									builder.addClosedNode("rec", "valor=\"" + builder.normalize(Pagina.trocaNullNumeroSemDecimal(itemEstPrev.getValorRevisadoEfiep())) + "\"");
1306 							}
1307 						}
1308 						
1309 						for(int i = 0; i < 6; i++){
1310 							if(mostrarValores[i])
1311 		    					builder.addClosedNode("rec", "valor=\"" + builder.normalize(Util.formataNumeroSemDecimal(valores[i].doubleValue()))+ "\"");
1312 						}
1313 						builder.closeNode("recursoFinanceiro");
1314 		    		}
1315 		    		
1316 					//builder.closeNode("fonte");
1317 					
1318 					/* somar nos valores do total geral */
1319 					totGerAprovado = totGerAprovado + totExeAprovado;
1320 					totGerRevisado = totGerRevisado + totExeRevisado;
1321 					
1322 					for(int i = 0; i < 6; i++){
1323 						if(mostrarValores[i])
1324 							totGerValor[i] = totGerValor[i] + totExeValor[i];
1325 					}
1326 					
1327 		    		//IMPRIMIR TOTAL
1328 					builder.addNode("totalEvolucaoFinanceiraExercicio", "exercicio=\"" + builder.normalize(exercicioDescTotal) + "\"");
1329 					//builder.addClosedNode("total", "valor=\"" + builder.normalize(Util.formataNumeroSemDecimal(totGerAprovado))+ "\"");
1330 					//builder.addClosedNode("total", "valor=\"" + builder.normalize(Util.formataNumeroSemDecimal(totGerRevisado))+ "\"");
1331 					
1332 	    			for(int i = 0; i < 3; i++){
1333 						if(mostrarDescFinanceiro[i]){
1334 							if(i == 0)
1335 								builder.addClosedNode("total", "valor=\"" + builder.normalize(Util.formataNumeroSemDecimal(totExeAprovado))+ "\"");
1336 							if(i == 1)
1337 								builder.addClosedNode("total", "valor=\"" + builder.normalize(Util.formataNumeroSemDecimal(totExeRevisado))+ "\"");
1338 						}
1339 					}
1340 					
1341 					for(int i = 0; i < 6; i++){
1342 						if(mostrarValores[i])
1343 	    					builder.addClosedNode("total", "valor=\"" + builder.normalize(Util.formataNumeroSemDecimal(totExeValor[i]))+ "\"");
1344 					}
1345 					builder.closeNode("totalEvolucaoFinanceiraExercicio");
1346 					
1347 		    		
1348 					builder.closeNode("fonte");
1349 				}
1350 	    		//IMPRIMIR TOTAL
1351 				builder.addNode("totalEvolucaoFinanceira");
1352 				//builder.addClosedNode("total", "valor=\"" + builder.normalize(Util.formataNumeroSemDecimal(totGerAprovado))+ "\"");
1353 				//builder.addClosedNode("total", "valor=\"" + builder.normalize(Util.formataNumeroSemDecimal(totGerRevisado))+ "\"");
1354 				
1355     			for(int i = 0; i < 3; i++){
1356 					if(mostrarDescFinanceiro[i]){
1357 						if(i == 0)
1358 							builder.addClosedNode("total", "valor=\"" + builder.normalize(Util.formataNumeroSemDecimal(totGerAprovado))+ "\"");
1359 						if(i == 1)
1360 							builder.addClosedNode("total", "valor=\"" + builder.normalize(Util.formataNumeroSemDecimal(totGerRevisado))+ "\"");
1361 					}
1362 				}
1363 				
1364 				for(int i = 0; i < 6; i++){
1365 					if(mostrarValores[i])
1366     					builder.addClosedNode("total", "valor=\"" + builder.normalize(Util.formataNumeroSemDecimal(totGerValor[i]))+ "\"");
1367 				}
1368 				builder.closeNode("totalEvolucaoFinanceira");
1369 
1370 				builder.closeNode("evolucaoFinanceira");
1371 	    	}
1372     	} catch (HibernateException e){
1373     		this.logger.error(e);
1374     		throw new ECARException("Erro na criação do relatório: Evolução Financeira - " + e.getMessage());
1375     	}
1376     }
1377 }