View Javadoc

1   /*
2    * Created on 19/05/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.Iterator;
11  import java.util.List;
12  import java.util.Set;
13  
14  import javax.servlet.http.HttpServletRequest;
15  
16  import comum.util.Data;
17  import comum.util.Pagina;
18  import comum.util.Util;
19  import comum.util.XmlBuilder;
20  
21  import ecar.bean.FonteRecursosPPA;
22  import ecar.bean.IndResulExercicioBean;
23  import ecar.bean.TotalizadorRelatorios;
24  import ecar.dao.ExercicioDao;
25  import ecar.dao.ItemEstLocalRevIettlrDAO;
26  import ecar.dao.ItemEstrtIndResulDao;
27  import ecar.dao.ItemEstruturaDao;
28  import ecar.dao.ItemEstruturaPrevisaoDao;
29  import ecar.exception.ECARException;
30  import ecar.pojo.EfIettFonteTotEfieft;
31  import ecar.pojo.EfItemEstPrevisaoEfiep;
32  import ecar.pojo.ExercicioExe;
33  import ecar.pojo.IettIndResulRevIettrr;
34  import ecar.pojo.ItemEstFisicoRevIettfr;
35  import ecar.pojo.ItemEstLocalRevIettlr;
36  import ecar.pojo.ItemEstrtIndResulIettr;
37  import ecar.pojo.ItemEstrutFisicoIettf;
38  import ecar.pojo.ItemEstrutLocalIettl;
39  import ecar.pojo.ItemEstruturaIett;
40  import ecar.pojo.ItemEstruturarevisaoIettrev;
41  import ecar.util.Dominios;
42  
43  /**
44   * @author aleixo
45   *
46   */
47  public class RelatorioApendiceDois extends AbstractServletReportXmlXsl {
48  
49      /**
50  	 * 
51  	 */
52  	private static final long serialVersionUID = 2395457474744685932L;
53  	private static final int nivelPrograma = 2;
54  	private static final int nivelAcao = 3;
55  	private static final int nivelProduto = 4;
56  	
57  	private ItemEstruturaDao itemEstruturaDao;
58  	private ItemEstLocalRevIettlrDAO itemEstLocalDao;
59  	private ItemEstruturaPrevisaoDao itemEstruturaPrevisaoDao;
60  	private ExercicioDao exercicioDao;
61  	private ItemEstrtIndResulDao indResulDao;
62  	
63  	private String periodoIni;
64  	private String periodoFim;
65  	private int paginaInicial;
66  	private String titulo;
67  	private List todosItens;
68  	private String tipoRelatorio;
69  	private List idsFontesRecursos;
70  	private List fontesRecursosPPAs;
71  	private String tipoValor;
72  	
73  	private List idsEstrutura;
74  	private List totalizadorEstrutura;
75  	private List idsValores;
76  	private List totalizadorValores;
77  	
78  	private double totalGeralProgramas;
79  	private double totalGeralAcoes;
80  	
81  	/**
82  	 * Gera XML.<br>
83  	 * 
84  	 * @author N/C
85       * @since N/C
86       * @version N/C
87  	 * @param HttpServletRequest request
88  	 * @return StringBuffer
89  	 * @throws ECARException
90  	 */
91  	public StringBuffer getXml(HttpServletRequest request) throws ECARException{
92  		XmlBuilder builder = new XmlBuilder();
93  		itemEstruturaDao = new ItemEstruturaDao(request);
94  		itemEstLocalDao = new ItemEstLocalRevIettlrDAO(request);
95  		itemEstruturaPrevisaoDao = new ItemEstruturaPrevisaoDao(request);
96  		exercicioDao = new ExercicioDao(request);
97  		indResulDao = new ItemEstrtIndResulDao(request);
98  		
99  		idsFontesRecursos = new ArrayList();
100 		fontesRecursosPPAs = new ArrayList();
101 		idsEstrutura = new ArrayList();
102 		idsValores = new ArrayList();
103 		totalizadorEstrutura = new ArrayList();
104 		totalizadorValores = new ArrayList();
105 		
106 		totalGeralAcoes = 0;
107 		totalGeralProgramas = 0;
108 		
109 		periodoIni = Pagina.getParamStr(request, "periodoIni");
110 		periodoFim = Pagina.getParamStr(request, "periodoFim");
111 		paginaInicial = Pagina.getParamInt(request, "paginaInicial");
112 		tipoRelatorio = Pagina.getParamStr(request, "indTipoRelatorio");
113 		tipoValor = Pagina.getParamStr(request, "indTipoValor");
114 		
115 		titulo = "ESTADO DO PARANÁ - PPA " + periodoIni + "/" + periodoFim + " - Atualizado";
116 		
117 		Util.liberarImagem();
118 		
119 		String nomeRelatorio = "";
120 		String valorRelatorio = ""; //A = Valores Aprovados, R = Valores Revisados (Não aparece este último pq é o oficial
121 		String indMostrarTotalizador = Pagina.getParamStr(request, "indMostrarTotalizador");
122 
123 		if("A".equals(tipoValor)){
124 			valorRelatorio = " - Valores Aprovados (Histórico)";
125 		}
126 
127 		nomeRelatorio = "REVISÃO DO PPA " + periodoIni + "-" + periodoFim + " - PPA ATUALIZADO";
128 		
129 		String mesAnoGeracao = Data.getNomeMesExtenso(Data.getMes(Data.getDataAtual()) + 1).toUpperCase() + " " + String.valueOf(Data.getAno(Data.getDataAtual()));
130 		
131 		builder.addNode("relatorio", 
132 				" titulo=\"" + builder.normalize(titulo) + "\"" +
133 				" capa=\"" + builder.normalize(String.valueOf(paginaInicial)) + "\"" +
134 				" paginaInicial=\"" + builder.normalize(String.valueOf(paginaInicial+3)) + "\"" +
135 				" nomeRelatorio=\"" + builder.normalize(nomeRelatorio) + "\"" +
136 				" nomeRelatorioRodape=\"" + builder.normalize(valorRelatorio) + "\"" +
137 				" tipo=\"" + builder.normalize(tipoRelatorio) + "\"" +
138 				" anoIni=\"" + builder.normalize(periodoIni) + "\"" +
139 				" anoFim=\"" + builder.normalize(periodoFim) + "\"" +
140 				" valores=\"" + builder.normalize(tipoValor) + "\"" +
141 				" mesAnoGeracao=\"" + builder.normalize(mesAnoGeracao) + "\"" +
142 				" mostrarTotalizador=\"" + builder.normalize(indMostrarTotalizador) + "\"");
143 		
144 		todosItens = new ArrayList(itemEstruturaDao.getArvoreItensIettComRevisao(tipoRelatorio, periodoIni, periodoFim));
145 		
146 		geraXMLItens(builder);
147 		
148 		geraXMLTotalizador(builder);
149 		
150 		geraXMLTotalizadorValores(builder);
151 		
152 		builder.closeNode("relatorio");
153         return builder.toStringBuffer();
154     }
155     
156 
157 	/**
158 	 * pega o nome do arq xsl.<br>
159 	 * 
160 	 * @author N/C
161      * @since N/C
162      * @version N/C
163 	 * @return String
164 	 */
165     public String getXslFileName() {
166         return "relatorioApendice.xsl";
167     }
168     
169     /**
170      * Pega o erro de pagina.<br>
171      * 
172      * @author N/C
173      * @since N/C
174      * @version N/C
175      * @param HttpServletRequest request
176      * @param String mensagem
177      * @return String
178      */
179     public String getErrorPage(HttpServletRequest request, String mensagem){        
180         String errorPage = "relatorios/ctrl_ppa.jsp?msgOperacao=" + mensagem; 
181         return errorPage;
182     }
183     
184     /**
185      * Gera itens XML.<br>
186      * 
187      * @author N/C
188      * @since N/C
189      * @version N/C
190      * @param XmlBuilder builder
191      * @throws ECARException
192      */
193     public void geraXMLItens (XmlBuilder builder) throws ECARException {
194     	List itens = new ArrayList(todosItens);
195     	
196     	if(itens != null){
197     		Iterator itItens = itens.iterator();
198     		while(itItens.hasNext()){
199     			ItemEstruturaIett iett = (ItemEstruturaIett) itItens.next();
200     			
201     			if(iett.getNivelIett().intValue() == nivelPrograma){
202     				//if(verificarProgramaApresentaFilhos(iett))
203     					geraXMLPrograma(builder, iett);
204     			}
205     		}
206     	}
207     }
208     
209     /**
210      * gera tag Programa no XML.<br>
211      * 
212      * @author N/C
213      * @since N/C
214      * @version N/C
215      * @param XmlBuilder builder
216      * @param ItemEstruturaIett item
217      * @throws ECARException
218      */
219     public void geraXMLPrograma(XmlBuilder builder, ItemEstruturaIett item) throws ECARException{
220 
221     	//this.incrementarTotalizadorEstrutura(item.getEstruturaEtt().getCodEtt(), "Quantidade de Programas");
222     	String nomePrograma = item.getNomeIett();
223     	String codigoPrograma = item.getSiglaIett();
224     	
225     	builder.addNode("programa", 
226     			"nome=\"" + builder.normalize(nomePrograma) + "\"" +
227     			" codigo=\"" + builder.normalize(codigoPrograma) + "\"");
228     	
229     	geraXMLDadosPrograma(builder, item);
230     	
231    		geraXMLValoresFinanceiros(builder, item);
232     	
233     	builder.addNode("acao", 
234     			"periodo=\"" + builder.normalize(periodoIni + "-" + periodoFim) + "\"" +
235     			" tipoApendice=\"" + builder.normalize(tipoRelatorio) + "\"");
236     	
237     	//Para cada Programa, gerar as ações...
238     	List itensAcao = new ArrayList(todosItens);
239     	Iterator itAcao = itensAcao.iterator();
240     	boolean gerouAcao = false;
241     	while(itAcao.hasNext()){
242     		ItemEstruturaIett iettAcao = (ItemEstruturaIett) itAcao.next();
243     		if(iettAcao.getNivelIett().intValue() == nivelAcao && item.equals(iettAcao.getItemEstruturaIett())){
244     			boolean aux = geraXMLAcao(builder, iettAcao);
245     			gerouAcao = gerouAcao || aux;
246     			/*
247     			 * Foi necessário criar uma variavel, pois se fizer:
248     			 * gerouAcao = gerouAcao || geraXMLAcao() e gerouAcao for setada como true,
249     			 * nas próximas vezes o método que gera as ações nem é executado.
250     			 */
251     		}
252     	}
253     	
254     	if(gerouAcao)
255     		this.incrementarTotalizadorEstrutura(item.getEstruturaEtt().getCodEtt(), "Quantidade de Programas");
256     	
257     	builder.closeNode("acao");
258     	
259     	builder.closeNode("programa");
260     }
261 
262     /**
263      * Gera dados XML Programa.<br>
264      * 
265      * @author N/C
266      * @since N/C
267      * @version N/C
268      * @param XmlBuilder builder
269      * @param ItemEstruturaIett item
270      * @throws ECARException
271      */
272     public void geraXMLDadosPrograma(XmlBuilder builder, ItemEstruturaIett item) throws ECARException{
273     	builder.addNode("dados");
274     	String orgao = "";
275     	if(item.getOrgaoOrgByCodOrgaoResponsavel2Iett() != null)
276     		orgao = item.getOrgaoOrgByCodOrgaoResponsavel2Iett().getDescricaoOrg();
277     	
278     	//String objetivo = item.getObjetivoGeralIett();
279     	String objetivo = item.getObjetivoEspecificoIett(); //Segundo conversa com Igor, é para pegar objetivo específico.
280     	String publicoAlvo = item.getDescricaoR2();
281     	builder.addClosedNode("campo", "label=\"Órgão Resp.\" valor=\"" + builder.normalize(orgao) + "\"");
282     	builder.addClosedNode("campo", "label=\"Objetivo\" valor=\"" + builder.normalize(objetivo) + "\"");
283     	builder.addClosedNode("campo", "label=\"Público-Alvo\" valor=\"" + builder.normalize(publicoAlvo) + "\"");
284     	builder.closeNode("dados");
285     }
286 
287     /**
288      * Gera valores financeiros XML.<br>
289      * 
290      * @author N/C
291      * @since N/C
292      * @version N/C
293      * @param XmlBuilder builder
294      * @param ItemEstruturaIett item
295      * @throws ECARException
296      */
297     public void geraXMLValoresFinanceiros(XmlBuilder builder, ItemEstruturaIett item) throws ECARException{
298     	builder.addNode("valores-financeiros", "periodo=\"" + periodoIni + "-" + periodoFim + "\"");
299     	/*
300     	valores financeiros são somados todos os valores revisados de todas as ações do programa no período
301     	
302     	*/
303     	geraXMLValoresFinanceirosItem(builder, item);
304     	
305     	builder.closeNode("valores-financeiros");
306     }
307     
308     /**
309      * Gera  valor finaceiro itens xml.<br>
310      * 
311      * @author N/C
312      * @since N/C
313      * @version N/C
314      * @param XmlBuilder builder
315      * @param ItemEstruturaIett item
316      * @throws ECARException
317      */
318     public void geraXMLValoresFinanceirosItem(XmlBuilder builder, ItemEstruturaIett item) throws ECARException{
319 		//Soma todos os valoresRevisados das revisoes de todas as ações do programa no periodo,
320 		//Separando por Correntes e Capital (ver rel. impresso)
321     	
322     	String valor = "";
323     	double valorTotal = 0;
324     	limparIdsFontesRecursos();
325     	
326     	List itensTemp = new ArrayList(todosItens);
327     	Iterator itTudo = itensTemp.iterator();
328     	while(itTudo.hasNext()){
329     		ItemEstruturaIett iett = (ItemEstruturaIett) itTudo.next();
330     		if(nivelAcao == iett.getNivelIett().intValue() && iett.getItemEstruturaIett().equals(item)){
331     			
332     			
333     			ItemEstruturarevisaoIettrev ultRevAcao = getUltimaRevisaoIett(iett.getItemEstruturarevisaoIettrevs());
334     			
335     			if(ultRevAcao != null && "E".equals(ultRevAcao.getSituacaoIettrev())){
336     				//Se a ação possuir revisão com situacao = Excluída, não contabilizar os valores porque esta ação não irá aparecer no relatorio.
337     				continue;
338     			}
339     			
340     			/* 
341     			 * Se for valores aprovados e a ação tiver revisões, a ação não será gerada, portanto seus valores serão ignorados.*/
342     			if("A".equals(tipoValor)){
343     				if(ultRevAcao != null){
344     					continue;
345     				}
346     			}
347 
348     			List listFontes = new ArrayList(iett.getEfIettFonteTotEfiefts());
349     			Iterator itFontes = listFontes.iterator();
350     			while(itFontes.hasNext()){
351     				EfIettFonteTotEfieft fonte = (EfIettFonteTotEfieft) itFontes.next();
352 
353 	    			valor = "0";
354     				List listaRecursos = itemEstruturaPrevisaoDao.getRecursosByFonteRecurso(fonte.getFonteRecursoFonr().getCodFonr(), fonte.getItemEstruturaIett().getCodIett(), Dominios.SIM);
355     				Iterator itRecursos = listaRecursos.iterator();
356     				while(itRecursos.hasNext()){
357     					EfItemEstPrevisaoEfiep recurso = (EfItemEstPrevisaoEfiep) itRecursos.next();
358     	    			
359     	    			if(recurso.getExercicioExe() != null &&
360     	    			   recurso.getExercicioExe().getDataInicialExe() != null &&
361     	    			   recurso.getExercicioExe().getDataFinalExe() != null
362     	    			){
363     	    				int exeAnoIni = Data.getAno(recurso.getExercicioExe().getDataInicialExe());
364     	    				int exeAnoFim = Data.getAno(recurso.getExercicioExe().getDataFinalExe());
365     	    				if(exeAnoIni >= Integer.parseInt(periodoIni) && exeAnoFim <= Integer.parseInt(periodoFim)){
366     	    					if("A".equals(tipoValor)){
367     	    						valor = String.valueOf(recurso.getValorAprovadoEfiep());
368     	    						totalGeralProgramas += recurso.getValorAprovadoEfiep().doubleValue();
369     	    					}
370     	    					if("R".equals(tipoValor)){
371     	    						valor = String.valueOf(recurso.getValorRevisadoEfiep());
372     	    						totalGeralProgramas += recurso.getValorRevisadoEfiep().doubleValue();
373     	    					}
374     	        				incrementarFonteRecurso(fonte.getFonteRecursoFonr().getCodFonr(), fonte.getFonteRecursoFonr().getNomeFonr(), Double.valueOf(valor).doubleValue());
375     	        				incrementarTotalizadorValor(fonte.getFonteRecursoFonr().getCodFonr(), fonte.getFonteRecursoFonr().getNomeFonr(), Double.valueOf(valor).doubleValue());
376     	    				}
377     	    			}
378     				}
379     			}
380     		}
381     	}
382     	
383     	Iterator itFontesPPA = fontesRecursosPPAs.iterator();
384     	while(itFontesPPA.hasNext()){
385     		FonteRecursosPPA fonteIncluida = (FonteRecursosPPA) itFontesPPA.next();
386 			builder.addClosedNode("valor", 
387 					"label=\"" + builder.normalize(fonteIncluida.getLabel()) + "\"" +
388 					" valor=\"" + builder.normalize("R$ " + Util.formataMoeda(fonteIncluida.getValor())) + "\"");
389 			valorTotal +=  fonteIncluida.getValor();
390     	}
391     	    	
392     	builder.addClosedNode("valor", "label=\"Total\" valor=\"" + builder.normalize("R$ " + Util.formataMoeda(valorTotal)) + "\"");
393     	
394     }
395     
396     /**
397      * gera tag Ação no XML.<br>
398      * 
399      * @author N/C
400      * @since N/C
401      * @version N/C
402      * @param XmlBuilder builder
403      * @param ItemEstruturaIett item
404      * @return boolean
405      * @throws ECARException
406      */   
407   
408     public boolean geraXMLAcao(XmlBuilder builder, ItemEstruturaIett item) throws ECARException{
409 
410 		String nome = "";
411     	String situacaoAcao = "";
412     	String tipoSituacaoAcao = "";
413     	
414     	boolean gerouAcao = false;
415     	boolean acaoExcluida = false;
416     	boolean gerarAcao = true;
417     	
418     	if(item.getItemEstruturarevisaoIettrevs() != null && item.getItemEstruturarevisaoIettrevs().size() > 0){
419     		ItemEstruturarevisaoIettrev ultRevAcao = getUltimaRevisaoIett(item.getItemEstruturarevisaoIettrevs());
420     		if(ultRevAcao != null){
421     			tipoSituacaoAcao = ultRevAcao.getSituacaoIettrev();
422     			
423     			if(ultRevAcao.getDescricaoR3rev() != null && !"".equals(ultRevAcao.getDescricaoIettrev()))
424     				nome = ultRevAcao.getDescricaoR3rev();
425     			else
426     				nome = ultRevAcao.getNomeIettrev();
427     			
428     			if("I".equals(tipoSituacaoAcao))
429     				situacaoAcao = " (Ação Incluída)";
430     			if("A".equals(tipoSituacaoAcao))
431     				situacaoAcao = " (Ação Alterada)";
432     			if("E".equals(tipoSituacaoAcao)){
433     				acaoExcluida = true;
434     			}
435     			
436     			//Se for valores aprovados (histórico) e possuir revisão, não gerar ação.
437     			if("A".equals(tipoValor)){
438     				gerarAcao = false;
439     			}
440     		}
441     	}
442 
443     	if(!acaoExcluida && gerarAcao){
444     		if("".equals(nome)){
445 				if(item.getDescricaoR3() != null && !"".equals(item.getDescricaoR3()))
446 					nome = item.getDescricaoR3();
447 				else
448 					nome = item.getNomeIett();
449     		}
450 			
451 			String valorTotal = "";
452 			if("A".equals(tipoValor)){
453 				valorTotal = somaValoresAprovadosAcao(item);
454 			}
455 			if("R".equals(tipoValor)){
456 				valorTotal = somaValoresRevisadosAcao(item);
457 			}
458 				
459 	    	builder.addNode("itemAcao", 
460 	    			//"nome=\"" + builder.normalize(item.getNomeIett()) + "\"" +
461 	    			"nome=\"" + builder.normalize(nome.toUpperCase()) + "\"" +
462 	    			" codigo=\"" + builder.normalize(item.getSiglaIett()) + "\"" +
463 	    			" valorTotal=\""+ builder.normalize(valorTotal) +"\"" +
464 	    			" tipoSituacaoAcao=\"" + builder.normalize(tipoSituacaoAcao) + "\"" +
465 	    			" situacaoAcao=\"" + builder.normalize(situacaoAcao) + "\"" +
466 	    			" justificativa=\"\"" +  //É necessário colocar este campo, pois ele é usado no Apendice 3, e tanto o Apendice 2 como o Apendice 3 utilizam o mesmo XSL.
467 	    			" larguraColAcao=\"21cm\"" + 
468 	    			" larguraColAux=\"0.1mm\"");
469 	    	/*valorTotal é a soma dos valores revisados da ação no período*/
470 
471 	    	this.incrementarTotalizadorEstrutura(item.getEstruturaEtt().getCodEtt(), "Quantidade de Ações");	
472 	    	gerouAcao = true;
473 	    	
474 	    	//Para cada Ação, gerar os produtos...
475 	    	List itensProduto = new ArrayList(todosItens);
476 	    	Iterator itProduto = itensProduto.iterator();
477 	    	boolean gerouProduto = false;
478 	    	while(itProduto.hasNext()){
479 	    		ItemEstruturaIett iettProduto = (ItemEstruturaIett) itProduto.next();
480 	    		if(iettProduto.getNivelIett().intValue() == nivelProduto && item.equals(iettProduto.getItemEstruturaIett())){
481 	    			boolean aux = geraXMLProduto(builder, iettProduto);
482 	    			gerouProduto = gerouProduto || aux;
483 	    			/*
484 	    			 * Foi necessário criar uma variavel, pois se fizer:
485 	    			 * gerouProduto = gerouProduto || geraXMLProduto() e gerouProduto for setada como true,
486 	    			 * nas próximas vezes o método que gera os produtos nem é executado.
487 	    			 */
488 	    			
489 	    		}
490 	    	}
491 	    	
492 	    	//gerouAcao = gerouProduto;
493 	    	
494 	    	//if(gerouAcao)
495 		   // 	this.incrementarTotalizadorEstrutura(item.getEstruturaEtt().getCodEtt(), "Quantidade de Ações");
496 		    	
497 	    	builder.closeNode("itemAcao");
498     	}
499 
500     	return gerouAcao;
501     }
502     
503     /**
504      * Verifica produtos excluidos.<br>
505      * 
506      * @author N/C
507      * @since N/C
508      * @version N/C
509      * @param ItemEstruturaIett acao
510      * @return boolean
511      */
512     public boolean verificarProdutosExcluidos(ItemEstruturaIett acao){
513     	List itensProduto = new ArrayList(todosItens);
514     	Iterator itProduto = itensProduto.iterator();
515     	while(itProduto.hasNext()){
516     		ItemEstruturaIett produto = (ItemEstruturaIett) itProduto.next();
517     		if(produto.getNivelIett().intValue() == nivelProduto && acao.equals(produto.getItemEstruturaIett())){
518     			if(produto.getItemEstruturarevisaoIettrevs() != null && produto.getItemEstruturarevisaoIettrevs().size() > 0){
519     				Iterator itRevisoesProduto = produto.getItemEstruturarevisaoIettrevs().iterator();
520     				while(itRevisoesProduto.hasNext()){
521     					ItemEstruturarevisaoIettrev revProduto = (ItemEstruturarevisaoIettrev) itRevisoesProduto.next();
522     					if("E".equals(revProduto.getSituacaoIettrev())){
523     						return true;
524     					}
525     				}
526     			}
527     		}
528     	}
529     	return false;
530     }
531     
532     /**
533      * Soma todos os valoresRevisados da ação no periodo.<br>
534      * 
535      * @author N/C
536      * @since N/C
537      * @version N/C
538      * @param ItemEstruturaIett item
539      * @return String
540      * @throws ECARException
541      */
542     public String somaValoresRevisadosAcao(ItemEstruturaIett item) throws ECARException{
543    		//Soma todos os valoresRevisados da ação no periodo.
544     	double valorTotal = 0;
545 		List iettsFontes = new ArrayList(item.getEfIettFonteTotEfiefts());
546 		Iterator itFontes = iettsFontes.iterator();
547 		while(itFontes.hasNext()){
548 			EfIettFonteTotEfieft fonte = (EfIettFonteTotEfieft) itFontes.next();
549 			Iterator itRecursos = itemEstruturaPrevisaoDao.getRecursosByFonteRecurso(fonte.getFonteRecursoFonr().getCodFonr(), item.getCodIett(), Dominios.SIM).iterator();
550 			while(itRecursos.hasNext()){
551 				EfItemEstPrevisaoEfiep recurso = (EfItemEstPrevisaoEfiep) itRecursos.next();
552     			if(recurso.getExercicioExe() != null &&
553    			       recurso.getExercicioExe().getDataInicialExe() != null &&
554     	    	   recurso.getExercicioExe().getDataFinalExe() != null
555     	    	){
556     				int exeAnoIni = Data.getAno(recurso.getExercicioExe().getDataInicialExe());
557     				int exeAnoFim = Data.getAno(recurso.getExercicioExe().getDataFinalExe());
558     				if(exeAnoIni >= Integer.parseInt(periodoIni) && exeAnoFim <= Integer.parseInt(periodoFim)){
559     					valorTotal += recurso.getValorRevisadoEfiep().doubleValue();
560     				}
561     			}
562 			}
563 		}
564 		totalGeralAcoes += valorTotal;
565 		return "R$ " + Util.formataMoeda(valorTotal);
566     }
567 
568     /**
569      * Soma todos os valoresAprovados da ação no periodo.<br>
570      * 
571      * @author N/C
572      * @since N/C
573      * @version N/C
574      * @param ItemEstruturaIett item
575      * @return String
576      * @throws ECARException
577      */
578     public String somaValoresAprovadosAcao(ItemEstruturaIett item) throws ECARException{
579    		//Soma todos os valoresRevisados da ação no periodo.
580     	double valorTotal = 0;
581 		List iettsFontes = new ArrayList(item.getEfIettFonteTotEfiefts());
582 		Iterator itFontes = iettsFontes.iterator();
583 		while(itFontes.hasNext()){
584 			EfIettFonteTotEfieft fonte = (EfIettFonteTotEfieft) itFontes.next();
585 			Iterator itRecursos = itemEstruturaPrevisaoDao.getRecursosByFonteRecurso(fonte.getFonteRecursoFonr().getCodFonr(), item.getCodIett(), Dominios.SIM).iterator();
586 			while(itRecursos.hasNext()){
587 				EfItemEstPrevisaoEfiep recurso = (EfItemEstPrevisaoEfiep) itRecursos.next();
588     			if(recurso.getExercicioExe() != null &&
589    			       recurso.getExercicioExe().getDataInicialExe() != null &&
590     	    	   recurso.getExercicioExe().getDataFinalExe() != null
591     	    	){
592     				int exeAnoIni = Data.getAno(recurso.getExercicioExe().getDataInicialExe());
593     				int exeAnoFim = Data.getAno(recurso.getExercicioExe().getDataFinalExe());
594     				if(exeAnoIni >= Integer.parseInt(periodoIni) && exeAnoFim <= Integer.parseInt(periodoFim)){
595     					valorTotal += recurso.getValorAprovadoEfiep().doubleValue();
596     				}
597     			}
598 			}
599 		}
600 		totalGeralAcoes += valorTotal;
601 		return "R$ " + Util.formataMoeda(valorTotal);
602     }
603 
604     /**
605      * gera tag Produto no XML.<br>
606      * 
607      * @author N/C
608      * @since N/C
609      * @version N/C
610      * @param XmlBuilder builder
611      * @param ItemEstruturaIett item
612      * @return boolean
613      * @throws ECARException
614      */
615     public boolean geraXMLProduto(XmlBuilder builder, ItemEstruturaIett item) throws ECARException{
616     	boolean gerouProduto = false;
617     	
618     	String nome = "";
619     	String tipo = "";
620     	String unidade = "";
621     	String tipoSituacao = "";
622     	String regiao = "";
623     	String valor = "";
624 
625 		/* Se for Valores Aprovados, pegar valores dos indicadores do item (qtdes previstas)*/
626     	if("A".equals(tipoValor)){
627 
628     		/*
629     		 * Se for valores aprovados, mostrar itens que não possuem revisão.*/
630     		ItemEstruturarevisaoIettrev ultRevProduto = getUltimaRevisaoIett(item.getItemEstruturarevisaoIettrevs());
631     		if(ultRevProduto == null){
632 	        	List indicadores = new ArrayList(item.getItemEstrtIndResulIettrs());
633 	        	if(indicadores != null && indicadores.size() > 0){
634 		    		Iterator itInd = indicadores.iterator();
635 		    		while(itInd.hasNext()){
636 		    			ItemEstrtIndResulIettr indicador = (ItemEstrtIndResulIettr) itInd.next();
637 		    			
638 		    			nome = item.getDescricaoR3(); //NomePPA
639 		    			tipo = indicador.getNomeIettir();
640 		    			unidade = indicador.getUnidMedidaIettr();
641 	
642 		    			if(item.getItemEstrutLocalIettls() != null && item.getItemEstrutLocalIettls().size() > 0){
643 		    				List lLocal = new ArrayList(item.getItemEstrutLocalIettls());
644 		    				ItemEstrutLocalIettl local = (ItemEstrutLocalIettl) lLocal.get(0);
645 		    				//regiao = local.getLocalItemLit().getLocalGrupoLgp().getIdentificacaoLgp();
646 		    				regiao = local.getLocalItemLit().getIdentificacaoLit();
647 		    			}
648 	
649 		    			tipoSituacao = "";
650 		    			
651 		    			valor = indResulDao.getSomaQuantidadePrevista(indicador);
652 		    			
653 		    			geraXMLItemProduto(builder, item, nome, tipo, unidade, tipoSituacao, regiao, valor, "");
654 		    			gerouProduto = true;
655 		    		}
656 	        	}
657     		}
658     	}
659     	/* Se for Valores Revisados, pegar valores dos indicadores das revisões (qtdes revisadas)*/
660     	else if ("R".equals(tipoValor)){
661     		
662     		/* Alteração ref. Mantis 5879.
663     		 * 
664     		 * Caso o item tenha sido modificado ou incluído, então valem as metas físicas da revisão. 
665     		 * Se o item não passou por mudança, então valem as quantidades da tabela original.
666     		 * */
667     		List revisoes = new ArrayList(item.getItemEstruturarevisaoIettrevs());
668     		if(revisoes.isEmpty()){
669     			//Se não possui revisões, pegar dados da tabela original
670 	        	List indicadores = new ArrayList(item.getItemEstrtIndResulIettrs());
671 	        	if(indicadores != null && indicadores.size() > 0){
672 		    		Iterator itInd = indicadores.iterator();
673 		    		while(itInd.hasNext()){
674 		    			ItemEstrtIndResulIettr indicador = (ItemEstrtIndResulIettr) itInd.next();
675 		    			
676 		    			nome = item.getDescricaoR3(); //NomePPA
677 		    			tipo = indicador.getNomeIettir();
678 		    			unidade = indicador.getUnidMedidaIettr();
679 	
680 		    			if(item.getItemEstrutLocalIettls() != null && item.getItemEstrutLocalIettls().size() > 0){
681 		    				List lLocal = new ArrayList(item.getItemEstrutLocalIettls());
682 		    				ItemEstrutLocalIettl local = (ItemEstrutLocalIettl) lLocal.get(0);
683 		    				//regiao = local.getLocalItemLit().getLocalGrupoLgp().getIdentificacaoLgp();
684 		    				regiao = local.getLocalItemLit().getIdentificacaoLit();
685 		    			}
686 	
687 		    			tipoSituacao = "";
688 		    			
689 		    			valor = indResulDao.getSomaQuantidadePrevista(indicador);
690 		    			
691 		    			geraXMLItemProduto(builder, item, nome, tipo, unidade, tipoSituacao, regiao, valor, "");
692 		    			gerouProduto = true;
693 		    		}
694 	        	}
695     		}
696     		else {
697     			//Possui revisões
698     			
699 	    		Iterator itRevisoes = revisoes.iterator();
700 	    		while(itRevisoes.hasNext()){
701 	    			ItemEstruturarevisaoIettrev iettRev = (ItemEstruturarevisaoIettrev) itRevisoes.next();
702 	    			
703 	    			/*
704 	    			 * Ref Mantis 6264:
705 	    			 * 1) Ao somar as quantidades do exercícios das metas físicas de revisão, se um exercício 
706 	    			 * estiver nulo/não foi informado então buscar o valor de exercício correspondente na 
707 	    			 * meta física do item.
708 	    			 * Ex.: Na revisão foi informado apenas o ano 2004. Deve-se somar o ano de 2004 da revisão 
709 	    			 * com os anos 2005, 2006, 2007 informado no cadastro de item.
710 	    			 * 
711 	    			 * 2) Ao somar as quantidades, respeitar as regras do Indicador (se permite 
712 	    			 * totalização, maior, último, etc..)
713 	    			 * 
714 	    			 * O exercício da meta física do item é o que foi informado na meta física de revisão.
715 	    			 * Conforme conversa com elmar em 17/08/2006, se esta meta física do item não foi 
716 	    			 * informada da meta física de revisão, deve-se para a geração do relatório e exibir
717 	    			 * mensagem de erro com o item que falta a informação.
718 	    			 */
719 	    			
720 	    			if(iettRev.getIettIndResulRevIettrrs() != null && iettRev.getIettIndResulRevIettrrs().size() > 0){
721 		    			//Se a revisão possui indicadores de revisão, fazer um "merge" entre os valores da meta física
722 		    			//de revisão e a meta física do item. Ex.: Na revisão foi informado apenas o ano 2004. 
723 		    			//Deve-se somar o ano de 2004 da revisão com os anos 2005, 2006, 2007 
724 		    			//informado no cadastro de item.
725 	    				Iterator itIndRev = iettRev.getIettIndResulRevIettrrs().iterator();
726 	    				while(itIndRev.hasNext()){
727 	    					IettIndResulRevIettrr indRev = (IettIndResulRevIettrr) itIndRev.next();
728 	    					
729 	    					nome = "";
730 	    					if(iettRev.getDescricaoR3rev() != null && !"".equals(iettRev.getDescricaoR3rev()))
731 	    						nome = iettRev.getDescricaoR3rev();
732 	    					else
733 	    						nome = iettRev.getNomeIettrev();
734 	    					
735 	    					if("".equals(nome)){
736 	    						if(item.getDescricaoR3() != null && !"".equals(item.getDescricaoR3()))
737 	    							nome = item.getDescricaoR3(); //NomePPA
738 	    						else
739 	    							nome = item.getNomeIett();
740 	    					}
741 	    					
742     						/*
743     						 * Ref Mantis 6010
744     						 * Se a revisão não possuir o indicador informado, pegar os dados
745     						 * do primeiro indicador do item informado
746     						 * 
747     						 * NOVA REGRA: Ref. Mantis 6264, se a revisão possui meta física
748     						 * mas a meta física de revisão não possui associação com o indicador
749     						 * do item, então exibir mensagem de erro e para a geração de relatório.
750     						 */
751 	    					
752 	    					
753 	    					if(indRev.getItemEstrtIndResulIettr() == null)
754 	    						throw new ECARException("Erro na geração do Relatório do Apêndice 2 do PPA: O Item \"" + item.getSiglaIett() + "-" + item.getNomeIett() + "\" possui Meta Física de Revisão sem tipo informado.");	
755 	    					
756 	    					tipo = indRev.getItemEstrtIndResulIettr().getNomeIettir();
757 	    					unidade = indRev.getItemEstrtIndResulIettr().getUnidMedidaIettr();
758 	    					valor = somaValoresMetasRevisadas(indRev);
759 	    					
760 	    					//regiao = itemEstLocalDao.getAbrangencia(iettRev.getCodIettrev());
761 	    					
762 	    					if(iettRev.getItemEstLocalRevIettlrs() != null && iettRev.getItemEstLocalRevIettlrs().size() > 0){
763 	    						List lLocal = new ArrayList(iettRev.getItemEstLocalRevIettlrs());
764 	    						ItemEstLocalRevIettlr local = (ItemEstLocalRevIettlr) lLocal.get(0);
765 	    						regiao = local.getLocalItemLit().getIdentificacaoLit();
766 	    					}
767 	    					else {
768 	    						//Se a revisão não possui locais cadastrados, buscar local do item. Ref Mantis: 6010
769 	    						if(item.getItemEstrutLocalIettls() != null && item.getItemEstrutLocalIettls().size() > 0){
770 	    							List lLocal = new ArrayList(item.getItemEstrutLocalIettls());
771 	    							ItemEstrutLocalIettl local = (ItemEstrutLocalIettl) lLocal.get(0);
772 	    							regiao = local.getLocalItemLit().getIdentificacaoLit();
773 	    						}
774 	    					}
775 	    					
776 	    					tipoSituacao = iettRev.getSituacaoIettrev();
777 	    					
778 	    					if(!"E".equals(tipoSituacao)){
779 		    					geraXMLItemProduto(builder, item, nome, tipo, unidade, tipoSituacao, regiao, valor, "");
780 		    					gerouProduto = true;
781 	    					}
782 	    				}
783 	    			}
784 	    			else{
785 	    				//Se a revisão não possui indicadores na revisão, 
786 	    				//somar somente os indicadores do item da revisão
787     					nome = "";
788     					if(iettRev.getDescricaoR3rev() != null && !"".equals(iettRev.getDescricaoR3rev()))
789     						nome = iettRev.getDescricaoR3rev();
790     					else
791     						nome = iettRev.getNomeIettrev();
792     					
793     					if("".equals(nome)){
794     						if(item.getDescricaoR3() != null && !"".equals(item.getDescricaoR3()))
795     							nome = item.getDescricaoR3(); //NomePPA
796     						else
797     							nome = item.getNomeIett();
798     					}
799     					/*
800     					 * Ref. Mantis 6010:
801   						 * Se a revisão não possuir o indicador informado, pegar os dados
802  						 * do primeiro indicador do item informado
803  						 * 
804  						 * Como aqui a revisão não possui metas físicas cadastradas, valem os valores
805  						 * e regras do indicador do item. 
806     					 */
807     					tipo = "não informado";
808     					unidade = "não informado";
809     					valor = "-";
810     					
811     					List indResulIett = new ArrayList(item.getItemEstrtIndResulIettrs());
812     					if(indResulIett != null && !indResulIett.isEmpty()){
813     						ItemEstrtIndResulIettr indResul = (ItemEstrtIndResulIettr) indResulIett.get(0);
814     						tipo = indResul.getNomeIettir();
815     						unidade = indResul.getUnidMedidaIettr();
816     						valor = indResulDao.getSomaQuantidadePrevista(indResul);
817     					}
818     					
819     					//regiao = itemEstLocalDao.getAbrangencia(iettRev.getCodIettrev());
820     					if(iettRev.getItemEstLocalRevIettlrs() != null && iettRev.getItemEstLocalRevIettlrs().size() > 0){
821     						List lLocal = new ArrayList(iettRev.getItemEstLocalRevIettlrs());
822     						ItemEstLocalRevIettlr local = (ItemEstLocalRevIettlr) lLocal.get(0);
823     						regiao = local.getLocalItemLit().getIdentificacaoLit();
824     					}
825     					else {
826     						//Se a revisão não possui locais cadastrados, buscar local do item. Ref Mantis: 6010
827     						if(item.getItemEstrutLocalIettls() != null && item.getItemEstrutLocalIettls().size() > 0){
828     							List lLocal = new ArrayList(item.getItemEstrutLocalIettls());
829     							ItemEstrutLocalIettl local = (ItemEstrutLocalIettl) lLocal.get(0);
830     							regiao = local.getLocalItemLit().getIdentificacaoLit();
831     						}
832     					}
833     					
834     					tipoSituacao = iettRev.getSituacaoIettrev();
835     					
836     					if(!"E".equals(tipoSituacao)){
837 	    					geraXMLItemProduto(builder, item, nome, tipo, unidade, tipoSituacao, regiao, valor, "");
838 	    					gerouProduto = true;
839     					}
840 	    			}
841 	    		}
842     		}
843     	}
844     	return gerouProduto;
845     }
846 
847     /**
848      * Gera item produto xml.<br>
849      * 
850      * @author N/C
851      * @since N/C
852      * @version N/C
853      * @param XmlBuilder builder
854      * @param ItemEstruturaIett item
855      * @param String nome
856      * @param String tipo
857      * @param String unidade
858      * @param String tipoSituacao
859      * @param String regiao
860      * @param String valor
861      * @param jString ustificativa
862      */
863     public void geraXMLItemProduto(XmlBuilder builder, ItemEstruturaIett item, String nome, String tipo, 
864     		String unidade, String tipoSituacao, String regiao, String valor, String justificativa){
865     	String situacao = "";
866     	if("I".equals(tipoSituacao)){
867 			situacao = "(Incluído)";
868 		}
869 		if("A".equals(tipoSituacao)){
870 			situacao = "(Alterado)";
871 		}
872 
873     	this.incrementarTotalizadorEstrutura(item.getEstruturaEtt().getCodEtt(), "Quantidade de Produtos");
874 		
875     	builder.addClosedNode("produto", 
876     			"nome=\"" + builder.normalize(nome) + "\" " +
877     			"tipo=\"" + builder.normalize(tipo) + "\" " +
878     			"unidade=\"" + builder.normalize(unidade) + "\" " +
879     			"situacao=\"" + builder.normalize(situacao) + "\" " +
880     			"tipoSituacao=\"" + builder.normalize(tipoSituacao) + "\" " +
881     			"regiao=\"" + builder.normalize(regiao) + "\" " +
882     			"valor=\"" + builder.normalize(valor) + "\" " +
883     			"justificativa=\"" + builder.normalize(justificativa) + "\" " +
884     			"tipoRelatorio=\"" + builder.normalize(tipoRelatorio) + "\"");
885     }
886     /**
887      * Com base na tabela de exercícios do sistema, o método verifica se o exercicio existe
888      * na meta fisica de revisão.<br>
889      * Se existir soma.<br>
890      * Se não existir verifica se o exercício existe na meta física do item.<br>
891      * 
892      * @author N/C
893      * @since N/C
894      * @version N/C
895      * @param IettIndResulRevIettrr metaRevisao
896      * @return String - Soma das quantidades previstas revisadas
897      * @throws ECARException
898      */
899     public String somaValoresMetasRevisadas(IettIndResulRevIettrr metaRevisao) throws ECARException{
900     	List qtdesPrevistas = new ArrayList();
901     	
902     	List exerciciosValidos = exercicioDao.listar(ExercicioExe.class, new String[]{"descricaoExe","desc"});
903     	Iterator itExe = exerciciosValidos.iterator();
904     	while(itExe.hasNext()){
905     		ExercicioExe exe = (ExercicioExe) itExe.next();
906     		if(exe.getDataInicialExe() != null && exe.getDataFinalExe() != null){
907 				int exeAnoIni = Data.getAno(exe.getDataInicialExe());
908 				int exeAnoFim = Data.getAno(exe.getDataFinalExe());
909 				
910 				//Verifica se o exercício está dentro do período informado
911 				if(exeAnoIni >= Integer.parseInt(periodoIni) && exeAnoFim <= Integer.parseInt(periodoFim)){
912 					
913 					boolean possuiExercicioNaRevisao = false;
914 					
915 					//Procura valor do exercício nas metas físicas de revisão
916 					if(metaRevisao.getItemEstFisicoRevIettfrs() != null && metaRevisao.getItemEstFisicoRevIettfrs().size() > 0){
917 						Iterator itEstRev = metaRevisao.getItemEstFisicoRevIettfrs().iterator();
918 						while(itEstRev.hasNext()){
919 							ItemEstFisicoRevIettfr estRev = (ItemEstFisicoRevIettfr) itEstRev.next();
920 							if(exe.equals(estRev.getExercicioExe()) && "S".equals(estRev.getIndAtivoIettfr())){
921 								possuiExercicioNaRevisao = true;
922 								IndResulExercicioBean indResulExeBean = new IndResulExercicioBean();
923 								indResulExeBean.setCodExe(estRev.getExercicioExe().getCodExe());
924 								indResulExeBean.setValor(estRev.getQtdPrevistaIettfr());
925 								
926 								qtdesPrevistas.add(indResulExeBean);
927 								break;
928 							}
929 						}
930 					}
931 					
932 					if(!possuiExercicioNaRevisao){
933 						//Procura valor do exercício nas metas físicas do item
934 						Iterator itEstItem = metaRevisao.getItemEstrtIndResulIettr().getItemEstrutFisicoIettfs().iterator();
935 						while(itEstItem.hasNext()){
936 							ItemEstrutFisicoIettf estItem = (ItemEstrutFisicoIettf) itEstItem.next();
937 							if(exe.equals(estItem.getExercicioExe()) && "S".equals(estItem.getIndAtivoIettf())){
938 								IndResulExercicioBean indResulExeBean = new IndResulExercicioBean();
939 								indResulExeBean.setCodExe(estItem.getExercicioExe().getCodExe());
940 								indResulExeBean.setValor(estItem.getQtdPrevistaIettf());
941 								
942 								qtdesPrevistas.add(indResulExeBean);
943 								break;
944 							}
945 						}
946 					}
947 					
948 				}//if validacao periodo exe
949     		} //if validacao exe
950     	} //while exe
951     	
952     	//Verificar na lista de totais as regras do indicador...
953     	String retorno = "0";
954     	String indAcumulavel = metaRevisao.getItemEstrtIndResulIettr().getIndAcumulavelIettr();
955     	String indValorFinal = metaRevisao.getItemEstrtIndResulIettr().getIndValorFinalIettr();
956     	
957     	/* =========== Verificação das regras de totalização ============== */
958         double total = 0;
959         
960         if ("S".equals(indAcumulavel)){
961             Iterator it = qtdesPrevistas.iterator();
962             while (it.hasNext()) {
963             	IndResulExercicioBean valor = (IndResulExercicioBean) it.next();
964            		total += valor.getValor().doubleValue();
965             }
966             retorno = Util.formataNumeroSemDecimal(total);
967         }else{
968         	
969         	/*
970         	 * Anotação ref. Mantis 5016:
971         	 * - Maior: obter o maior valor de ItemEstrutFisicoIettf
972         	 * - Último: obter valor do último exercício informado de ItemEstrutFisicoIettf
973         	 * - Não se aplica: soma total ItemEstrutFisicoIettf
974         	 */
975         	
976         	if("M".equals(indValorFinal)){ //Maior
977    	            Iterator it = qtdesPrevistas.iterator();
978 	            double maior = 0;
979 	            while (it.hasNext()) {
980 	            	IndResulExercicioBean valor = (IndResulExercicioBean) it.next();
981             		if(valor.getValor().doubleValue() > maior){
982             			maior = valor.getValor().doubleValue();
983             		}
984             		total = maior;
985 	            }
986 	            retorno = Util.formataNumeroSemDecimal(total);
987         	}
988         	else if("U".equals(indValorFinal)){ //Ultimo
989 	            double ultimo = 0;
990         		ExercicioExe ultimoExe = indResulDao.getMaiorExercicioIndicador(metaRevisao.getItemEstrtIndResulIettr());
991         		
992    	            Iterator it = qtdesPrevistas.iterator();
993 	            while (it.hasNext()) {
994 	            	IndResulExercicioBean valor = (IndResulExercicioBean) it.next();
995             		if(valor.getCodExe().equals(ultimoExe.getCodExe())){
996             			ultimo = valor.getValor().doubleValue();
997             			break;
998             		}
999 	            }
1000     	        retorno = Util.formataNumeroSemDecimal(ultimo);
1001         	}
1002         	else if("N".equals(indValorFinal)){ //Não se aplica
1003         		retorno = "Não se aplica";
1004         	}
1005         }
1006     	/* =========== Fim da Verificação das regras de totalização ============== */
1007     	
1008     	return retorno;
1009     }
1010 
1011     /**
1012      * Pega ultima revisão iett.<br>
1013      * 
1014      * @author N/C
1015      * @since N/C
1016      * @version N/C
1017      * @param Set listaRevisoes
1018      * @return ItemEstruturarevisaoIettrev
1019      */
1020     public ItemEstruturarevisaoIettrev getUltimaRevisaoIett(Set listaRevisoes){
1021     	ItemEstruturarevisaoIettrev retorno = null;
1022     	if(listaRevisoes != null && listaRevisoes.size() > 0){
1023     		List revisoes = new ArrayList(listaRevisoes);
1024     		Collections.sort(revisoes,
1025     			new Comparator(){
1026 					public int compare(Object o1, Object o2) {
1027 						ItemEstruturarevisaoIettrev iett1 = (ItemEstruturarevisaoIettrev) o1;
1028 						ItemEstruturarevisaoIettrev iett2 = (ItemEstruturarevisaoIettrev) o2;
1029 						
1030 						/*
1031 						String data1 = Data.parseDate(iett1.getDataInclusaoIettrev());
1032 						String data2 = Data.parseDate(iett2.getDataInclusaoIettrev());
1033 						
1034 						//dd/mm/yyyy -> yyyymmaa
1035 						data1 = data1.substring(6) + data1.substring(3, 5) + data1.substring(0, 2);
1036 						data2 = data2.substring(6) + data2.substring(3, 5) + data2.substring(0, 2);
1037 						
1038 						return data1.compareTo(data2);*/
1039 						return iett1.getDataInclusaoIettrev().compareTo(iett2.getDataInclusaoIettrev());
1040 					}	
1041     			}
1042     		);
1043     		ItemEstruturarevisaoIettrev ultimoIettRev = (ItemEstruturarevisaoIettrev) revisoes.get(revisoes.size() - 1);
1044     		retorno = ultimoIettRev;
1045     	}
1046     	
1047     	return retorno;
1048     }
1049     
1050     /**
1051      * Verifica programa Apresenta Filhos.<br>
1052      * 
1053      * @author N/C
1054      * @since N/C
1055      * @version N/C
1056      * @param ItemEstruturaIett item
1057      * @return boolean
1058      */
1059     public boolean verificarProgramaApresentaFilhos(ItemEstruturaIett item){
1060     	boolean achou = false;
1061     	List lTodos = new ArrayList(todosItens);
1062     	Iterator it = lTodos.iterator();
1063     	while(it.hasNext()){
1064     		ItemEstruturaIett iett = (ItemEstruturaIett) it.next();
1065     		if(iett.getItemEstruturaIett() != null && iett.getItemEstruturaIett().equals(item)){
1066     			achou = true;
1067     			break;
1068     		}
1069     	}
1070     	
1071     	//if (!achou)
1072     		//System.out.println("Programa sem filhos: " + item.getSiglaIett() + " - " + item.getNomeIett());
1073     	
1074     	return true;
1075     }
1076     
1077     /**
1078      * Incrementa fonte Recurso.<br>
1079      * 
1080      * @author N/C
1081      * @since N/C
1082      * @version N/C
1083      * @param Long idFonteRecurso
1084      * @param String label
1085      * @param double valor
1086      * 
1087      */
1088     public void incrementarFonteRecurso(Long idFonteRecurso, String label, double valor){
1089     	if(!idsFontesRecursos.contains(idFonteRecurso)){
1090     		FonteRecursosPPA fonteBean = new FonteRecursosPPA();
1091     		fonteBean.setId(idFonteRecurso);
1092     		fonteBean.setLabel(label);
1093     		fonteBean.setValor(valor);
1094     		
1095     		idsFontesRecursos.add(idFonteRecurso);
1096     		fontesRecursosPPAs.add(fonteBean);
1097     	}
1098     	else {
1099     		Iterator itFontesBean = fontesRecursosPPAs.iterator();
1100     		while(itFontesBean.hasNext()){
1101     			FonteRecursosPPA fonteBean = (FonteRecursosPPA) itFontesBean.next();
1102     			if(fonteBean.getId().equals(idFonteRecurso)){
1103     				fonteBean.somaValor(valor);
1104     				break;
1105     			}
1106     		}
1107     	}
1108     }
1109     
1110     /**
1111      * Limpa id's das fontes recursos.<br>
1112      * 
1113      * @author N/C
1114      * @since N/C
1115      * @version N/C
1116      */
1117     public void limparIdsFontesRecursos(){
1118     	idsFontesRecursos.clear();
1119     	fontesRecursosPPAs.clear();
1120     }
1121     
1122     /**
1123      * Incrementa totalizador estrutura.<br>
1124      * 
1125      * @author N/C
1126      * @since N/C
1127      * @version N/C
1128      * @param Long idEstrutura
1129      * @param String nomeEstrutura
1130      */
1131     private void incrementarTotalizadorEstrutura(Long idEstrutura, String nomeEstrutura){
1132     	if(!idsEstrutura.contains(idEstrutura)){
1133     		TotalizadorRelatorios totalizador = new TotalizadorRelatorios();
1134     		totalizador.setId(idEstrutura);
1135     		totalizador.setEstrutura(nomeEstrutura);
1136     		totalizador.setTotal(1);
1137     		
1138     		idsEstrutura.add(idEstrutura);
1139     		totalizadorEstrutura.add(totalizador);
1140     	}
1141     	else {
1142     		Iterator itTotalizadores = totalizadorEstrutura.iterator();
1143     		while(itTotalizadores.hasNext()){
1144     	   		TotalizadorRelatorios totalizador = (TotalizadorRelatorios) itTotalizadores.next();
1145     	   	    
1146     	   		if(idEstrutura.equals(totalizador.getId())){
1147     	   			totalizador.incrementeTotal();
1148     	   			break;
1149     	   	    }
1150     		}
1151     	}
1152     }
1153     
1154     /**
1155      * Incrementa totalizador valor.<br>
1156      * 
1157      * @author N/C
1158      * @since N/C
1159      * @version N/C
1160      * @param Long idValor
1161      * @param String nomeValor
1162      * @param double valor
1163      */
1164     private void incrementarTotalizadorValor(Long idValor, String nomeValor, double valor){
1165     	if(!idsValores.contains(idValor)){
1166     		FonteRecursosPPA totalizador = new FonteRecursosPPA();
1167     		totalizador.setId(idValor);
1168     		totalizador.setLabel(nomeValor);
1169     		totalizador.setValor(valor);
1170     		
1171     		idsValores.add(idValor);
1172     		totalizadorValores.add(totalizador);
1173     	}
1174     	else {
1175     		Iterator itTotalizadores = totalizadorValores.iterator();
1176     		while(itTotalizadores.hasNext()){
1177     	   		FonteRecursosPPA totalizador = (FonteRecursosPPA) itTotalizadores.next();
1178     	   		if(idValor.equals(totalizador.getId())){
1179     	   			totalizador.somaValor(valor);
1180     	   			break;
1181     	   	    }
1182     		}
1183     	}
1184     }
1185 
1186     /**
1187      * Gera totalizador xml.<br>
1188      * 
1189      * @author N/C
1190      * @since N/C
1191      * @version N/C
1192      * @param XmlBuilder builder
1193      * @throws ECARException
1194      */
1195     public void geraXMLTotalizador(XmlBuilder builder) throws ECARException{
1196         try{
1197         	
1198         	Collections.sort(totalizadorEstrutura,
1199         			new Comparator(){
1200 						public int compare(Object arg0, Object arg1) {
1201 							TotalizadorRelatorios t1 = (TotalizadorRelatorios) arg0;
1202 							TotalizadorRelatorios t2 = (TotalizadorRelatorios) arg1;
1203 
1204 							return t1.getId().compareTo(t2.getId());
1205 						}
1206         			});
1207         	
1208         	int total = 0;
1209         	builder.addNode("totalizadores");        	
1210             Iterator itTotalizadores = totalizadorEstrutura.iterator();
1211             while(itTotalizadores.hasNext()){
1212             	TotalizadorRelatorios tr = (TotalizadorRelatorios) itTotalizadores.next();
1213             	String nome = tr.getEstrutura();
1214             	String valor = "" + tr.getTotal();
1215             	total += tr.getTotal();
1216             	builder.addClosedNode("totalizador",
1217             			"nome=\"" + builder.normalize(nome) + "\"" +
1218             			" valor=\"" + builder.normalize(valor) + "\"");
1219             }        	
1220         	builder.addClosedNode("total", 
1221         			"nome=\"Total:\"" +
1222         			" valor=\"" + builder.normalize(String.valueOf(total)) + "\"");
1223             builder.closeNode("totalizadores");
1224         } catch(Exception e){
1225         	this.logger.error(e);
1226             throw new ECARException("Erro na criação do relatório: Totalizadores");
1227         }            
1228     }
1229     
1230     /**
1231      * Gera totalizador xml VALORES.<br>
1232      * 
1233      * @author N/C
1234      * @since N/C
1235      * @version N/C
1236      * @param XmlBuilder builder
1237      * @throws ECARException
1238      */
1239     public void geraXMLTotalizadorValores(XmlBuilder builder) throws ECARException{
1240         try{
1241         	//int total = 0;
1242         	builder.addNode("totalizadorValores");
1243 
1244         	Iterator itTotalizadores = totalizadorValores.iterator();
1245             while(itTotalizadores.hasNext()){
1246             	FonteRecursosPPA tr = (FonteRecursosPPA) itTotalizadores.next();
1247             	String nome = tr.getLabel();
1248             	String valor = "R$ " + Util.formataMoeda(tr.getValor());
1249             	
1250             	//total += tr.getTotal();
1251             	builder.addClosedNode("totalizador",
1252             			"nome=\"" + builder.normalize(nome) + "\"" +
1253             			" valor=\"" + builder.normalize(valor) + "\"");
1254             }        	
1255 
1256             builder.addClosedNode("totalizador",
1257         			"nome=\"Total Geral dos Programas\"" +
1258         			" valor=\"" + builder.normalize("R$ " + Util.formataMoeda(totalGeralProgramas)) + "\"");
1259         	
1260         	builder.addClosedNode("totalizador",
1261         			"nome=\"Total Geral das Ações\"" +
1262         			" valor=\"" + builder.normalize("R$ " + Util.formataMoeda(totalGeralAcoes)) + "\"");
1263 
1264         	builder.closeNode("totalizadorValores");
1265         } catch(Exception e){
1266         	this.logger.error(e);
1267             throw new ECARException("Erro na criação do relatório: TotalizadorValores");
1268         }            
1269     }
1270 }