View Javadoc

1   /*
2    * Created on 29/09/2006
3    *
4    */
5   package ecar.servlet.relatorio;
6   
7   import java.util.ArrayList;
8   import java.util.Collections;
9   import java.util.Comparator;
10  import java.util.Date;
11  import java.util.HashSet;
12  import java.util.Iterator;
13  import java.util.List;
14  import java.util.Set;
15  
16  import javax.servlet.http.HttpServletRequest;
17  
18  import org.hibernate.HibernateException;
19  
20  import comum.util.Data;
21  import comum.util.Mensagem;
22  import comum.util.Pagina;
23  import comum.util.Util;
24  import comum.util.XmlBuilder;
25  
26  import ecar.bean.IettArfBean;
27  import ecar.dao.AcompRealFisicoDao;
28  import ecar.dao.AcompReferenciaDao;
29  import ecar.dao.AcompReferenciaItemDao;
30  import ecar.dao.ConfigRelatorioCfgrelDAO;
31  import ecar.dao.ConfiguracaoDao;
32  import ecar.dao.CorDao;
33  import ecar.dao.EmpresaDao;
34  import ecar.dao.EstruturaAtributoDao;
35  import ecar.dao.EstruturaDao;
36  import ecar.dao.EstruturaFuncaoDao;
37  import ecar.dao.ExercicioDao;
38  import ecar.dao.ItemEstrtIndResulDao;
39  import ecar.dao.ItemEstruturaContaOrcamentoDao;
40  import ecar.dao.ItemEstruturaDao;
41  import ecar.dao.ItemEstruturaPrevisaoDao;
42  import ecar.dao.ItemEstruturaRealizadoDao;
43  import ecar.dao.ModeloRelatorioMrelDAO;
44  import ecar.exception.ECARException;
45  import ecar.login.SegurancaECAR;
46  import ecar.permissao.ValidaPermissao;
47  import ecar.pojo.AcompRealFisicoArf;
48  import ecar.pojo.AcompReferenciaAref;
49  import ecar.pojo.AcompReferenciaItemAri;
50  import ecar.pojo.AcompRelatorioArel;
51  import ecar.pojo.ConfigRelatorioCfgrel;
52  import ecar.pojo.ConfiguracaoCfg;
53  import ecar.pojo.EfItemEstContaEfiec;
54  import ecar.pojo.EfItemEstPrevisaoEfiep;
55  import ecar.pojo.EmpresaEmp;
56  import ecar.pojo.EstruturaEtt;
57  import ecar.pojo.ExercicioExe;
58  import ecar.pojo.ItemEstUsutpfuacIettutfa;
59  import ecar.pojo.ItemEstrutAcaoIetta;
60  import ecar.pojo.ItemEstruturaIett;
61  import ecar.pojo.ModeloRelatorioMrel;
62  import ecar.pojo.ObjetoEstrutura;
63  import ecar.pojo.TipoAcompanhamentoTa;
64  import ecar.pojo.UsuarioUsu;
65  import ecar.util.Dominios;
66  
67  /**
68   * po
69   * Servlet do Relatório de Acompanhamento. <br>
70   * Relatório antigamente feito em Access, foi convertido para Java (FOP).<br>
71   * 
72   * @author aleixo
73   * @since Outubro/2006.
74   * @see Mantis: 6052
75   */
76  
77  public class RelatorioAcompanhamento extends AbstractServletReportXmlXsl {
78  
79      /**
80  	 * 
81  	 */
82  	private static final long serialVersionUID = 2395457474744685932L;
83  	
84  	private static final String MODELO_ESTRUTURA = "ECAR-001C";
85  	
86  	private HttpServletRequest request;
87  	private ConfiguracaoDao configDao;
88  	private ConfiguracaoCfg config;
89  	private AcompReferenciaDao acompReferenciaDao;
90  	private AcompReferenciaItemDao acompReferenciaItemDao;
91  	private AcompRealFisicoDao acompRealFisicoDao;
92  	private CorDao corDao;
93  	private ConfigRelatorioCfgrel configRel;
94  	private ConfigRelatorioCfgrelDAO configRelDao;
95  	private String pathEcar;
96  	private String modelo;
97  	private String pathRaiz;
98  	private EstruturaDao estruturaDao;
99  	private EstruturaAtributoDao estAtribDao;
100 	private EstruturaFuncaoDao estFuncDao;
101 	private ItemEstruturaDao itemEstruturaDao;
102 	private ItemEstruturaPrevisaoDao itemEstPrevDao;
103 	private ItemEstruturaRealizadoDao itemEstRealizadoDao;
104 	private ItemEstruturaContaOrcamentoDao itemEstContaOrcDao;
105 	private ItemEstrtIndResulDao itemEstrtIndResulDao;
106 	
107 	private String tipoAcomp;
108 	private String exigeLiberarAcompanhamento;
109 	
110 	/**
111 	 * Gera XML.<br>
112 	 * 
113 	 * @author aleixo
114      * @since N/C
115      * @version N/C
116 	 * @param HttpServletRequest request
117 	 * @return StringBuffer
118 	 * @throws ECARException
119 	 */
120 	public StringBuffer getXml(HttpServletRequest request) throws ECARException{
121 		XmlBuilder builder = new XmlBuilder();
122 		
123 		acompReferenciaDao = new AcompReferenciaDao(request);
124 		acompReferenciaItemDao = new AcompReferenciaItemDao(request);
125 		acompRealFisicoDao = new AcompRealFisicoDao(request);
126 		configDao = new ConfiguracaoDao(request);
127 		corDao = new CorDao(request);
128 		configRelDao = new ConfigRelatorioCfgrelDAO(request);
129 		estruturaDao = new EstruturaDao(request);
130 		estAtribDao = new EstruturaAtributoDao(request);
131 		estFuncDao = new EstruturaFuncaoDao(request);
132 		itemEstruturaDao = new ItemEstruturaDao(request);
133 		itemEstPrevDao = new ItemEstruturaPrevisaoDao(request);
134 		itemEstRealizadoDao = new ItemEstruturaRealizadoDao(request);
135 		itemEstContaOrcDao = new ItemEstruturaContaOrcamentoDao(request);
136 		itemEstrtIndResulDao = new ItemEstrtIndResulDao(request);
137 		
138 		this.request = request;
139 		config = configDao.getConfiguracao();
140 		pathEcar = request.getContextPath();
141 		configRel = configRelDao.getConfigRelatorioCfgrel();
142 		pathRaiz = config.getRaizUpload();
143 		
144 		EmpresaDao empresaDao = new EmpresaDao(request);
145 		List confg = empresaDao.listar(EmpresaEmp.class, null);
146 		EmpresaEmp empresa = new EmpresaEmp();
147 		if(confg != null && confg.size() > 0){
148 			empresa = (EmpresaEmp) confg.iterator().next();
149 		}
150 		
151 		String opcaoModelo = Pagina.getParamStr(request, "opcaoModelo");
152 		ModeloRelatorioMrel mrel = new ModeloRelatorioMrelDAO(request).getModeloRelatorioByCodAlfa(opcaoModelo);
153 		
154 		AcompReferenciaAref mesReferencia = (AcompReferenciaAref) acompReferenciaDao.buscar(AcompReferenciaAref.class, Long.valueOf(Pagina.getParamStr(request, "mesReferencia")));
155 		this.tipoAcomp = mesReferencia.getTipoAcompanhamentoTa().getDescricaoTa();
156 		this.exigeLiberarAcompanhamento = mesReferencia.getTipoAcompanhamentoTa().getIndLiberarAcompTa();
157 		
158 		/*Definindo o título*/
159 		String titulo = "";
160 		if(!"".equals(Pagina.getParamStr(request, "tituloCustomizado")))
161 			titulo = Pagina.getParamStr(request, "tituloCustomizado");
162 		else {
163 			if(configRel != null && !"".equals(configRel.getTituloCfgrel()))
164 				titulo = configRel.getTituloCfgrel();
165 			else
166 				titulo = config.getTituloSistema();
167 				
168 		}
169 
170 		/*Definindo o rodapé*/
171 		String rodape = geraDataRodape();
172 		if(!"".equals(Pagina.getParamStr(request, "rodapeCustomizado")))
173 			rodape += " - "  + Pagina.getParamStr(request, "rodapeCustomizado");
174 		else {
175 			if(configRel != null && configRel.getNotaRodapeCfgrel() != null && !"".equals(configRel.getNotaRodapeCfgrel()))
176 				rodape += " - " + configRel.getNotaRodapeCfgrel();
177 		}
178 		
179 		String arisSelecionados = Pagina.getParamStr(request, "arisSelecionados");
180 		
181 		/*
182 		 * Se arisSelecionados == "", é por que o relatório foi pedido da tela de Opçoes,
183 		 * ou seja, se opcaoModelo == ECAR-001B, são escolhidos todos os itens de um órgão específico;
184 		 * se opcaoModelo == ECAR-002B, são escolhidos todos os itens que possuem uma situação específica.
185 		 * 
186 		 * Obs.: opcaoModelo só vai ter esses valores se arisSelecionados == "". Caso arisSelecionados != "",
187 		 * é por que os itens foram filtrados e as opções escolhidas virão da tela de Formato.
188 		 */
189 		
190 		List codArisSelecionados = new ArrayList();
191 		
192 		if(!"".equals(arisSelecionados)){
193 			String[] codAris = arisSelecionados.split(";");
194 			for(int i = 0; i < codAris.length; i++){
195 				if(!"".equals(codAris[i]) && !";".equals(codAris[i])){
196 					codArisSelecionados.add(Long.valueOf(codAris[i]));
197 				}
198 			}
199 		}
200 		
201 		List arels = acompReferenciaItemDao.getAcompRelatorioAcompanhamentoByAris(codArisSelecionados, mesReferencia, opcaoModelo, Pagina.getParamStr(request, "chaveEscolhida"), Pagina.getParamStr(request, "tipoFuncAcompTpfa"));
202 	
203 		Util.liberarImagem();
204 		
205 		/* Início do relatório */
206 		
207 		builder.addNode("relatorio", 
208 				" titulo=\"" + builder.normalize(titulo) + "\"" +
209 				" mesReferencia=\"" + builder.normalize(mesReferencia.getNomeAref()) + "\"" +
210 				" codModelo=\"" + builder.normalize(mrel.getCodAlfaMrel() + " - " + mrel.getClassifMrel()) + "\"" +
211 				" rodape=\"" + builder.normalize(rodape) + "\"" +
212 				" caminhoImagemCab=\"" + builder.normalize(pathRaiz + empresa.getLogotipoRelatorioEmp()) + "\"" + 
213 				"");
214 		
215 		modelo = mrel.getCodAlfaMrel();
216 		
217 		geraXmlPrincipal(builder, arels);
218 		
219 		builder.closeNode("relatorio");
220         return builder.toStringBuffer();
221     }
222 
223     /**
224      * Gera XML Principal.<br>
225      * 
226      * @author aleixo
227      * @since N/C
228      * @version N/C
229      * @param XmlBuilder builder
230      * @param List arels
231      * @throws ECARException
232      */
233 	private void geraXmlPrincipal(XmlBuilder builder, List arels) throws ECARException{
234 		builder.addNode("principal");
235 		
236 		if(arels != null && !arels.isEmpty()){
237 			Iterator it = arels.iterator();
238 			boolean primeiroItem = true;
239 			String siglaOrgaoImpresso = "";
240 			
241 			long codIett = -1;
242 			int indice = 0;
243 			Set ascendentes = new HashSet();
244 			
245 	    	SegurancaECAR seguranca = (SegurancaECAR) request.getSession().getAttribute("seguranca");
246 	    	ValidaPermissao validaPermissao = new ValidaPermissao();
247 	    	
248 			while(it.hasNext()){
249 				AcompRelatorioArel arel = (AcompRelatorioArel) it.next();
250 				
251 		    	List listaPermissaoTpfa = validaPermissao.permissaoVisualizarPareceres(arel.getAcompReferenciaItemAri().getAcompReferenciaAref().getTipoAcompanhamentoTa(),seguranca.getGruposAcesso());
252 				if(listaPermissaoTpfa.contains(arel.getTipoFuncAcompTpfa())){
253 							
254 					// Teste ref. Mantis 10848
255 					if("S".equals(this.exigeLiberarAcompanhamento) && !"S".equals(arel.getIndLiberadoArel())){
256 						continue;
257 					}
258 	
259 					String siglaOrg = "";
260 					
261 					if(arel.getAcompReferenciaItemAri().getItemEstruturaIett().getOrgaoOrgByCodOrgaoResponsavel1Iett() != null){
262 						siglaOrg = arel.getAcompReferenciaItemAri().getItemEstruturaIett().getOrgaoOrgByCodOrgaoResponsavel1Iett().getSiglaOrg();
263 					}
264 					else {
265 						siglaOrg = "Órgão não informado";
266 					}
267 	
268 					String siglaOrgItem = "";
269 					if(MODELO_ESTRUTURA.equals(modelo)){
270 						if(arel.getAcompReferenciaItemAri().getItemEstruturaIett().getOrgaoOrgByCodOrgaoResponsavel1Iett() != null){
271 							siglaOrgItem = arel.getAcompReferenciaItemAri().getItemEstruturaIett().getOrgaoOrgByCodOrgaoResponsavel1Iett().getSiglaOrg();
272 						}
273 						else {
274 							siglaOrgItem = "Órgão não informado";
275 						}
276 					}
277 					
278 					if(!siglaOrgaoImpresso.equals(siglaOrg)){
279 						siglaOrgaoImpresso = siglaOrg;
280 						if(!primeiroItem){
281 							builder.closeNode("itens");
282 						}
283 						
284 						String exibirOrgao = "S";
285 						String quebrarPaginaItens = "S";
286 						if(MODELO_ESTRUTURA.equals(modelo)){
287 							exibirOrgao = "N";
288 							quebrarPaginaItens = "N";
289 						}
290 						builder.addNode("itens", "orgao=\"" + builder.normalize(siglaOrgaoImpresso) + "\" exibirOrgao=\"" + builder.normalize(exibirOrgao) + "\" quebrarPaginaItens=\"" + builder.normalize(quebrarPaginaItens) + "\"");
291 					}
292 					
293 					
294 					if(codIett != arel.getAcompReferenciaItemAri().getItemEstruturaIett().getCodIett().longValue()){
295 						boolean geraHierarquia = primeiroItem || (ascendentes != null && !ascendentes.containsAll(itemEstruturaDao.getAscendentes(arel.getAcompReferenciaItemAri().getItemEstruturaIett())));
296 						codIett = arel.getAcompReferenciaItemAri().getItemEstruturaIett().getCodIett().longValue();
297 						//ascendentes.addAll(geraXmlItens(builder, arel, estAtribDao.getDescricaoItemByAtributo(arel.getAcompReferenciaItemAri().getItemEstruturaIett(), arel.getAcompReferenciaItemAri().getAcompReferenciaAref().getTipoAcompanhamentoTa()), false, geraHierarquia, siglaOrgItem, primeiroItem));
298 						
299 						String exibirEncaminhamentos = "S";
300 						if((indice + 1) < arels.size() || (indice == arels.size() - 1)){
301 							int proximo = indice + 1;
302 							
303 							try{
304 								AcompRelatorioArel proximoArel = (AcompRelatorioArel) arels.get(proximo);
305 								if(codIett == proximoArel.getAcompReferenciaItemAri().getItemEstruturaIett().getCodIett().longValue())
306 									exibirEncaminhamentos = "N";
307 							}
308 							catch (IndexOutOfBoundsException e) {
309 								//Não tem mais itens na lista, exibe o complemento.
310 								exibirEncaminhamentos = "S";
311 							}
312 						}
313 						
314 						ascendentes.addAll(geraXmlItens(builder, arel, estAtribDao.getDescricaoItemByAtributo(arel.getAcompReferenciaItemAri().getItemEstruturaIett(), arel.getAcompReferenciaItemAri().getAcompReferenciaAref().getTipoAcompanhamentoTa()), true, geraHierarquia, siglaOrgItem, primeiroItem, exibirEncaminhamentos));
315 					}
316 					else {
317 						boolean exibirComplemento = false;
318 						String exibirEncaminhamentos = "S";
319 						if((indice + 1) < arels.size() || (indice == arels.size() - 1)){
320 							int proximo = indice + 1;
321 							
322 							try{
323 								AcompRelatorioArel proximoArel = (AcompRelatorioArel) arels.get(proximo);
324 								exibirComplemento = !arel.getAcompReferenciaItemAri().equals(proximoArel.getAcompReferenciaItemAri());
325 							}
326 							catch (IndexOutOfBoundsException e) {
327 								//Não tem mais itens na lista, exibe o complemento.
328 								exibirComplemento = true;
329 								exibirEncaminhamentos = "S";
330 							}
331 						}
332 						
333 						geraXmlItens(builder, arel, "", exibirComplemento, false, siglaOrgItem, primeiroItem, exibirEncaminhamentos);
334 					}
335 					indice++;
336 					primeiroItem = false;
337 				}//fim do if que verifica a permissão das carinhas	
338 			}
339 			builder.closeNode("itens");
340 		}
341 		else {
342 			builder.addClosedNode("semItens");			
343 		}
344 
345 		builder.closeNode("principal");
346 	}
347 	
348 	/**
349 	 * Gera itens xml.<br>
350 	 * 
351 	 * @author aleixo
352      * @since N/C
353      * @version N/C
354      * @param XmlBuilder builder
355      * @param AcompRelatorioArel arel
356      * @param String nomeItem
357      * @param boolean exibirComplemento
358      * @param boolean gerarHierarquia
359      * @param String orgao
360      * @param boolean primeiroItem
361      * @param String exibirEncaminhamentos
362 	 * @return list
363 	 * @throws ECARException
364 	 */
365 	private List geraXmlItens(XmlBuilder builder, AcompRelatorioArel arel, 
366 			String nomeItem, boolean exibirComplemento, boolean gerarHierarquia, String orgao, 
367 			boolean primeiroItem, String exibirEncaminhamentos) throws ECARException{
368 
369 		if(!MODELO_ESTRUTURA.equals(modelo)){
370 			orgao = "";
371 		}
372 		
373 		
374 		String labelDR1 = "";
375 		String valorDR1 = "";
376 		String labelDR4 = "";
377 		String valorDR4 = "";
378 		String labelOrigemIett = "";
379 		String valorOrigemIett = "";
380 		String labelRespTecnicoIett = "";
381 		String valorRespTecnicoIett = "";
382 		
383 		String labelEncaminhamentos = "";
384 		String ehPPA = (tipoAcomp.contains("PPA")) ? "S" : "N";
385 
386 		//FIXME: Verificar a inclusão de um campo no tipoAcompanhamento para realizar este teste.
387 		if(!tipoAcomp.contains("PPA")){
388 			labelEncaminhamentos = "Encaminhamentos";
389 		}
390 
391 		if(!"".equals(nomeItem)){
392 			ItemEstruturaIett item = arel.getAcompReferenciaItemAri().getItemEstruturaIett();
393 			EstruturaEtt estrutura = item.getEstruturaEtt();
394 			//labelData = estAtribDao.getLabelAtributoEstrutura("dataInicioIett", estrutura);
395 			//dataInicio = Data.parseDate(item.getDataInicioIett());
396 			
397 			//FIXME: Verificar a inclusão de um campo no tipoAcompanhamento para realizar este teste.
398 			if(!tipoAcomp.contains("PPA")){
399 				/*Dados Qualitativos*/
400 				labelDR1 = estAtribDao.getLabelAtributoEstrutura("descricaoR1", estrutura);
401 				
402 				valorDR1 = "";
403 				if(!pathEcar.contains("prve")) {
404 					valorDR1 = item.getDescricaoR1();	
405 				}
406 								
407 				/*Meta*/
408 				//labelBeneficiosIett = estAtribDao.getLabelAtributoEstrutura("beneficiosIett", estrutura);
409 				//valorBeneficiosIett = item.getBeneficiosIett();
410 				
411 				/*Previsão de Conclusão*/
412 				labelDR4 = estAtribDao.getLabelAtributoEstrutura("descricaoR4", estrutura);
413 				valorDR4 = item.getDescricaoR4();
414 	
415 				/*Investimentos*/
416 				labelOrigemIett = estAtribDao.getLabelAtributoEstrutura("origemIett", estrutura);
417 				valorOrigemIett = item.getOrigemIett();
418 			}
419 			
420 			/*Responsável Técnico*/
421 			Iterator itTpfas = item.getItemEstUsutpfuacIettutfas().iterator();
422 			while(itTpfas.hasNext()){
423 				ItemEstUsutpfuacIettutfa utfa = (ItemEstUsutpfuacIettutfa) itTpfas.next();
424 				if((!tipoAcomp.contains("PPA") && utfa.getTipoFuncAcompTpfa().getCodTpfa().longValue() == 2) //Não é PPA e é o Responsável Técnico
425 				|| (tipoAcomp.contains("PPA") && utfa.getTipoFuncAcompTpfa().getCodTpfa().longValue() == 3)) //É PPA e é o GPS
426 				{
427 					String nomeUsu = "";
428 					String emailUsu = "";
429 					String telefone = "";
430 					if (utfa.getUsuarioUsu() != null){
431 						UsuarioUsu respTecnico = utfa.getUsuarioUsu();
432 						nomeUsu = respTecnico.getNomeUsu();
433 						emailUsu = respTecnico.getEmail1Usu();
434 						telefone = "";
435 						if(respTecnico.getComercDddUsu() != null && !"".equals(respTecnico.getComercDddUsu())){
436 							telefone += "(" + respTecnico.getComercDddUsu() + ") ";
437 						}
438 						
439 						if(respTecnico.getComercTelefoneUsu() != null && !"".equals(respTecnico.getComercTelefoneUsu())){
440 							telefone += respTecnico.getComercTelefoneUsu();
441 							telefone = " - " + telefone;
442 						}
443 						
444 					} else if (utfa.getSisAtributoSatb() != null){
445 						nomeUsu = utfa.getSisAtributoSatb().getDescricaoSatb();
446 					}
447 					
448 					labelRespTecnicoIett = utfa.getTipoFuncAcompTpfa().getLabelTpfa().toUpperCase() + ": ";
449 					valorRespTecnicoIett = nomeUsu + " (" + emailUsu + telefone.trim() + ")";
450 					break;
451 				}
452 			}
453 		}
454 
455 		//FIXME: mantis 10304: Temporariamente não exibir Encaminhamentos...
456 		labelEncaminhamentos = "";
457 		//labelRespTecnicoIett = "";
458 		//valorRespTecnicoIett = "";
459 
460 		
461 		builder.addNode("item", 
462 				"nomeItem=\"" + builder.normalize(Util.normalizaCaracterMarcador(nomeItem)) + "\"" +
463 				" orgaoItem=\"" + builder.normalize(Util.normalizaCaracterMarcador(orgao)) + "\"" +
464 				" labelDR1=\"" + builder.normalize(Util.normalizaCaracterMarcador(labelDR1)) + "\"" + 
465 				" valorDR1=\"" + builder.normalize(Util.normalizaCaracterMarcador(valorDR1)) + "\"" +
466 				" labelDR4=\"" + builder.normalize(Util.normalizaCaracterMarcador(labelDR4)) + "\"" + 
467 				" valorDR4=\"" + builder.normalize(Util.normalizaCaracterMarcador(valorDR4)) + "\"" +
468 				" labelOrigemIett=\"" + builder.normalize(Util.normalizaCaracterMarcador(labelOrigemIett)) + "\"" + 
469 				" valorOrigemIett=\"" + builder.normalize(Util.normalizaCaracterMarcador(valorOrigemIett)) + "\"" +
470 				" labelRespTecnicoIett=\"" + builder.normalize(Util.normalizaCaracterMarcador(labelRespTecnicoIett)) + "\"" + 
471 				" valorRespTecnicoIett=\"" + builder.normalize(Util.normalizaCaracterMarcador(valorRespTecnicoIett)) + "\"" +
472 				" exibirEncaminhamentos=\"" + builder.normalize(Util.normalizaCaracterMarcador(exibirEncaminhamentos)) + "\"" +
473 				" labelEncaminhamentos=\"" + builder.normalize(Util.normalizaCaracterMarcador(labelEncaminhamentos)) + "\"" +
474 				" ehPPA=\"" + builder.normalize(ehPPA) + "\"" +  
475 				"");
476 		List retorno = new ArrayList();
477 		
478 		if(MODELO_ESTRUTURA.equals(modelo) && gerarHierarquia){
479 			boolean quebrarPagina = true;
480 			
481 			if(primeiroItem)
482 				quebrarPagina = false;
483 			
484 			retorno = geraXmlHierarquia(builder, arel.getAcompReferenciaItemAri().getItemEstruturaIett(), quebrarPagina);
485 		}
486 
487 		String labelParecer = arel.getTipoFuncAcompTpfa().getLabelPosicaoTpfa();
488 		String caminhoImagem = pathEcar + "/images/relAcomp/" + corDao.getImagemRelatorio(arel.getCor(), arel.getTipoFuncAcompTpfa());
489 		String descricao = Util.normalizaCaracterMarcador(Util.stripHTML(arel.getDescricaoArel()));
490 		String observacoes = Util.normalizaCaracterMarcador(arel.getComplementoArel());
491 		String dataUltParecer = "";
492 		String situacaoParecer = "";
493 		
494 		if(arel.getDataUltManutArel() != null)
495 			dataUltParecer = " (" + Data.parseDate(arel.getDataUltManutArel()) + ")";
496 		else
497 			dataUltParecer = " (" + Data.parseDate(arel.getDataInclusaoArel()) + ")";
498 		
499 		if(!(descricao != null && !"".equals(descricao))){
500 			descricao = "Sem Itens de Parecer Cadastrados.";
501 		}
502 		
503 		if(arel.getSituacaoSit() != null){
504 			situacaoParecer = arel.getSituacaoSit().getDescricaoSit();
505 		}
506 		
507 		String ocultarObservacoesParecer = new ConfiguracaoDao(request).getConfiguracao().getIndOcultarObservacoesParecer();
508 		String labelSituacaoParecer = new ConfiguracaoDao(request).getConfiguracao().getLabelSituacaoParecer();
509 		
510 		if (ocultarObservacoesParecer == null || ocultarObservacoesParecer.equals("N")){
511 		
512 			builder.addClosedNode("parecer", 
513 					" caminhoImagem=\"" + builder.normalize(caminhoImagem) + "\"" +
514 					" labelParecer=\"" + builder.normalize(labelParecer) + "\"" +
515 					" descricao=\"" + builder.normalize(descricao) + "\"" +
516 					" observacoes=\"" + builder.normalize(observacoes) + "\"" +
517 					" dataUltParecer=\"" + builder.normalize(dataUltParecer) + "\"" +
518 					" labelSituacaoParecer=\"" + builder.normalize(labelSituacaoParecer) + "\"" +
519 					" situacaoParecer=\"" + builder.normalize(situacaoParecer) + "\"" + 
520 					"");
521 		}
522 		else{
523 			
524 			builder.addClosedNode("parecer", 
525 					" caminhoImagem=\"" + builder.normalize(caminhoImagem) + "\"" +
526 					" labelParecer=\"" + builder.normalize(labelParecer) + "\"" +
527 					" descricao=\"" + builder.normalize(descricao) + "\"" +					
528 					" dataUltParecer=\"" + builder.normalize(dataUltParecer) + "\"" +
529 					" labelSituacaoParecer=\"" + builder.normalize(labelSituacaoParecer) + "\"" +
530 					" situacaoParecer=\"" + builder.normalize(situacaoParecer) + "\"" + 
531 					"");
532 		}
533 
534 		if(exibirComplemento){
535 
536 			String arisSelecionados = Pagina.getParamStr(request, "arisSelecionados");
537 			List codArisSelecionados = new ArrayList();
538 			
539 			if(!"".equals(arisSelecionados)){
540 				String[] codAris = arisSelecionados.split(";");
541 				for(int i = 0; i < codAris.length; i++){
542 					if(!"".equals(codAris[i]) && !";".equals(codAris[i])){
543 						codArisSelecionados.add(Long.valueOf(codAris[i]));
544 					}
545 				}
546 			}				
547 			
548 			if("S".equals(Pagina.getParamStr(request, "indResultado")) && !"".equals(nomeItem)){
549 				geraXMLIndicadores(builder, arel.getAcompReferenciaItemAri(), false);
550 			}
551 
552 			if("S".equals(Pagina.getParamStr(request, "evolucaoFinanceira")))
553 				geraXmlEvolucaoFinanceira(builder, arel.getAcompReferenciaItemAri());
554 			
555 			geraXMLEtapas(builder, arel);
556 			
557 			if(!"".equals(nomeItem)){
558 				geraXMLOcorrencias(builder, arel.getAcompReferenciaItemAri());
559 			}
560 
561 			if("S".equals(Pagina.getParamStr(request, "indResultado"))){
562 				geraXmlItensFilhos(builder, arel, codArisSelecionados);
563 			}
564 		
565 		}
566 		
567 		builder.closeNode("item");
568 		return retorno;
569 	}
570 	
571 	/**
572 	 * Gera Xml Itens Filhos
573 	 * 
574 	 * @author aleixo
575 	 * @version 0.1 - 02/05/2007
576 	 * @param XmlBuilder builder
577 	 * @param AcompRelatorioArel arel
578 	 * @param List codArisSelecionados
579 	 * @throws ECARException
580 	 */
581 	private void geraXmlItensFilhos(XmlBuilder builder, AcompRelatorioArel arel, List codArisSelecionados) throws ECARException{
582 		builder.addNode("itensFilhos");
583 		//List descendentes = new ItemEstruturaDao(request).getDescendentes(arel.getAcompReferenciaItemAri().getItemEstruturaIett(), true);
584 		ItemEstruturaIett itemPai = arel.getAcompReferenciaItemAri().getItemEstruturaIett();
585 		TipoAcompanhamentoTa tipoAcompanhamento = arel.getAcompReferenciaItemAri().getAcompReferenciaAref().getTipoAcompanhamentoTa();
586 		Long mes = Long.valueOf(arel.getAcompReferenciaItemAri().getAcompReferenciaAref().getMesAref());
587 		Long ano = Long.valueOf(arel.getAcompReferenciaItemAri().getAcompReferenciaAref().getAnoAref());
588 		List descendentes = acompRealFisicoDao.getArfsByIettAndTipoAcomp(itemPai, tipoAcompanhamento, config, null, mes, ano);
589 		
590 		//Agrupar descendentes por estrutura
591 		
592 		Collections.sort(descendentes, new Comparator(){
593 			public int compare(Object arg0, Object arg1) {
594 				IettArfBean ia1 = (IettArfBean) arg0;
595 				IettArfBean ia2 = (IettArfBean) arg1;
596 				
597 				ItemEstruturaIett i1 = ia1.getItem();
598 				ItemEstruturaIett i2 = ia2.getItem();
599 				
600 				String ord1 = i1.getEstruturaEtt().getNomeEtt() + " " + i1.getNomeIett();
601 				String ord2 = i2.getEstruturaEtt().getNomeEtt() + " " + i2.getNomeIett();
602 				
603 				//return i1.getEstruturaEtt().getNomeEtt().compareTo(i2.getEstruturaEtt().getNomeEtt());
604 				return ord1.compareTo(ord2);
605 			}
606 		});
607 
608 		Iterator itDes = descendentes.iterator();
609 		long codEtt = -1;
610         while(itDes.hasNext()){
611             //ItemEstruturaIett item = (ItemEstruturaIett) itDes.next();
612         	IettArfBean iaBean = (IettArfBean) itDes.next();
613         	ItemEstruturaIett item = iaBean.getItem();
614         	
615         	if(item.equals(itemPai)){
616         		continue;
617         	}
618             
619             AcompReferenciaItemAri acompanhamentoFilho = acompReferenciaItemDao.getAcompReferenciaItemByItemEstruturaIett(arel.getAcompReferenciaItemAri().getAcompReferenciaAref(), item);
620             if(acompanhamentoFilho != null && !codArisSelecionados.contains(acompanhamentoFilho.getCodAri().toString())) {
621             	
622             	//FIXME: ver com Beier regra de ARF anteriores!!!
623 	            List listARF = acompRealFisicoDao.buscarPorIett(
624 	            		acompanhamentoFilho.getItemEstruturaIett().getCodIett(),
625 	            		Long.valueOf(acompanhamentoFilho.getAcompReferenciaAref().getMesAref()),
626 	            		Long.valueOf(acompanhamentoFilho.getAcompReferenciaAref().getAnoAref()));
627 	            if(listARF != null && !listARF.isEmpty()){
628 	            	String nomeEstrutura = "";
629 	            	
630 	            	if(codEtt != item.getEstruturaEtt().getCodEtt().longValue()){
631 	            		codEtt = item.getEstruturaEtt().getCodEtt().longValue();
632 	            		nomeEstrutura = item.getEstruturaEtt().getNomeEtt();
633 	            	}
634 	            	
635 	            	geraXMLIndicadoresFilhos(builder, acompanhamentoFilho, nomeEstrutura);		            	
636 	            }
637             }
638         }
639 		builder.closeNode("itensFilhos");
640 	}
641 	
642 	/**
643 	 * Gera Hierarquia Xml.<br>
644 	 * 
645 	 * @author aleixo
646      * @since N/C
647      * @version N/C
648 	 * @param XmlBuilder builder
649 	 * @param ItemEstruturaIett item
650 	 * @param boolean quebrarPagina
651 	 * @return List
652 	 * @throws ECARException
653 	 */
654 	private List geraXmlHierarquia(XmlBuilder builder, ItemEstruturaIett item, boolean quebrarPagina) throws ECARException{
655 		List ascendentes =  itemEstruturaDao.getAscendentes(item);
656 		
657 		if(ascendentes != null && !ascendentes.isEmpty()){
658 			if(quebrarPagina)
659 				builder.addNode("hierarquia", "quebrarPagina=\"S\"");
660 			else
661 				builder.addNode("hierarquia", "quebrarPagina=\"N\"");
662 			
663 			Iterator it = ascendentes.iterator();
664 			while(it.hasNext()){
665 				ItemEstruturaIett iettAsc = (ItemEstruturaIett) it.next();
666 				//System.out.println(iettAsc.getEstruturaEtt().getNomeEtt() + " - " + iettAsc.getNomeIett());
667 				String nomeItem = "";
668 				if(iettAsc.getSiglaIett() != null)
669 					nomeItem += "- ";
670 				nomeItem += iettAsc.getNomeIett();
671 				
672 				String siglaItem = iettAsc.getSiglaIett();
673 				
674 				builder.addClosedNode("itemHierarquia", "nomeItem=\"" + builder.normalize(nomeItem) + "\" nivel=\"" + builder.normalize(iettAsc.getNivelIett().toString()) + "\" sigla=\"" + builder.normalize(siglaItem) + "\"");
675 			}
676 			builder.closeNode("hierarquia");
677 		}
678 		return ascendentes;
679 	}
680 
681 
682 	/**
683 	 * Gera data rodape.<br>
684 	 * 
685 	 * @author aleixo
686      * @since N/C
687      * @version N/C
688 	 * @return String
689 	 */
690 	private String geraDataRodape(){
691 		Date dataAtual = Data.getDataAtual();
692 		String dia = String.valueOf(Data.getDia(dataAtual));
693 		String mes = Data.getNomeMesExtenso(Data.getMes(dataAtual) + 1).toLowerCase();
694 		String ano = String.valueOf(Data.getAno(dataAtual));
695 		String hora = Data.getHorario(dataAtual);
696 				
697 		return Data.getDiaSemanaNomeExtenso(dataAtual) + ", " + dia + " de " + mes + " de " + ano + ", às " + hora; 
698 	}
699 	
700 	/**
701 	 * Pega o nome do aquivo xsl.<br>
702 	 * 
703 	 * @author aleixo
704      * @since N/C
705      * @version N/C
706 	 * @return String
707 	 */
708     public String getXslFileName() {
709         return "relatorioAcompanhamento.xsl";
710     }
711     
712     /**
713      * Retorna a mensagem de erro para a página.<br>
714      * 
715      * @author aleixo
716      * @since N/C
717      * @version N/C
718      * @param HttpServletRequest request
719      * @param String mensagem
720      * @return String
721      */
722     public String getErrorPage(HttpServletRequest request, String mensagem){        
723         String errorPage = "relAcompanhamento\\listaRelAcomp.jsp?msgOperacao=" + mensagem; 
724         return errorPage;
725     }
726     
727     /**
728      * Gera Evolução financeira xml.<br>
729      * 
730      * @author aleixo
731      * @since 0.1 - N/C
732      * @version 2.0 - 10/04/2007
733      * @param XmlBuilder builder
734      * @param AcompReferenciaItemAri itemAri
735      * @throws ECARException
736      */
737     private void geraXmlEvolucaoFinanceira(XmlBuilder builder, AcompReferenciaItemAri itemAri) throws ECARException{
738     	try{
739     		List listaExercicios = itemEstPrevDao.getListaExerciciosItemEstruturaPrevisao(itemAri.getItemEstruturaIett());
740     		
741     		
742     		
743 	    	//List lista = itemEstPrevDao.getListaItemEstruturaPrevisao(itemAri.getItemEstruturaIett(), itemAri.getAcompReferenciaAref().getExercicioExe());
744     		List lista = itemEstPrevDao.getListaItemEstruturaPrevisao(itemAri.getItemEstruturaIett(), null);
745 	    	Iterator it = lista.iterator();
746 
747 	    	EfItemEstPrevisaoEfiep itemEstPrev = new EfItemEstPrevisaoEfiep();
748 	    	
749 	    	/* FIXME: Revisar esse trecho para, quando todos os valores forem zero, não apresentar 
750 	    	 * o quadro de evolução financeira.
751 	    	 * 
752 	    	 * Neste caso, exibir uma mensagem "Nenhum valor foi informado."
753 	    	 * 
754 	    	 *  Daqui até... */
755 	    	boolean possuiValores = false;
756 	    	while(it.hasNext()){
757 	    		itemEstPrev = (EfItemEstPrevisaoEfiep) it.next();
758     			
759     			/* ler EfItemEstContaEfiec */
760     			EfItemEstContaEfiec itemEstConta = 
761     					itemEstContaOrcDao.getItemEstruturaConta(
762     						itemAri.getItemEstruturaIett(),
763     						itemEstPrev.getExercicioExe(),
764     						itemEstPrev.getFonteRecursoFonr(),
765     						itemEstPrev.getRecursoRec());
766     			
767     			/* verificar valores em Efier */
768     			Double[] valores = itemEstRealizadoDao.getSomaItemEstruturaRealizado(
769     					itemEstConta,
770     					itemEstPrev.getExercicioExe());
771 
772     			if(itemEstPrev.getValorAprovadoEfiep() != null && itemEstPrev.getValorAprovadoEfiep().doubleValue() > 0){
773     				possuiValores = true;
774     			}
775     			if(itemEstPrev.getValorRevisadoEfiep() != null && itemEstPrev.getValorRevisadoEfiep().doubleValue() > 0){
776     				possuiValores = true;
777     			}
778     			
779     			for(int i = 0; i < 6; i++){
780     				if(valores[i] != null && valores[i].doubleValue() > 0){
781     					possuiValores = true;
782     				}
783     			}
784 	    	}
785 	    	/* ... aqui! */
786 	    	
787 	    	
788 	    	//if (it.hasNext()){
789 	    	if (possuiValores){
790 
791 	    		int colunas = 0;
792 	    		int numeroColunasExibidas = 0; 
793 
794 	    		String descFinanceiro[] = new String[3];
795 	    		boolean mostrarDescFinanceiro[] = new boolean[3];
796 	    		descFinanceiro[0] = config.getRecursoDescValor1Cfg();
797 	    		descFinanceiro[1] = config.getRecursoDescValor2Cfg();
798 	    		descFinanceiro[2] = config.getRecursoDescValor3Cfg();
799 
800 	    		boolean mostrarValores[] = new boolean[6];
801 
802 	    		String descricoes[] = new String[6];
803 	    		descricoes[0] = config.getFinanceiroDescValor1Cfg();
804 	    		descricoes[1] = config.getFinanceiroDescValor2Cfg();
805 	    		descricoes[2] = config.getFinanceiroDescValor3Cfg();
806 	    		descricoes[3] = config.getFinanceiroDescValor4Cfg();
807 	    		descricoes[4] = config.getFinanceiroDescValor5Cfg();
808 	    		descricoes[5] = config.getFinanceiroDescValor6Cfg();
809 	    		
810 				for(int i = 0; i < 6; i++){
811 	    			mostrarValores[i] = itemEstRealizadoDao.getVerificarMostrarValorByPosicaoCfg(i);
812 	    			if(mostrarValores[i]){
813 	    				colunas++;
814 	    			}
815 	    		}	    
816 				
817 	    		builder.addNode("evolucaoFinanceira", "nenhumValor='N' colunasRealizadas=\"" + builder.normalize(String.valueOf(colunas)) + "\"");
818 	    		
819 	    		
820 	    		builder.addNode("colunas");
821 	    		
822 				builder.addClosedNode("coluna", "nome=\"Categoria Econômica\"");
823 				builder.addClosedNode("coluna", "nome=\"Fonte\"");
824 				//builder.addClosedNode("coluna", "nome=\"Aprovado\"");
825 				//builder.addClosedNode("coluna", "nome=\"Revisado\"");
826 	    		//int numeroColunasExibidas = 2; //Aprovado - Revisado 
827 
828 	    		for(int i = 0; i < 3; i++){
829 	    			mostrarDescFinanceiro[i] = itemEstRealizadoDao.getVerificarMostrarRecursoByPosicaoCfg(i);
830 	    			if(mostrarDescFinanceiro[i]){
831 	    				builder.addClosedNode("coluna", "nome=\"" + builder.normalize(descFinanceiro[i]) + "\"");
832 	    				numeroColunasExibidas++;
833 	    			}
834 	    		}
835 				
836 				for(int i = 0; i < 6; i++){
837 	    			mostrarValores[i] = itemEstRealizadoDao.getVerificarMostrarValorByPosicaoCfg(i);
838 	    			if(mostrarValores[i]){
839 	    				builder.addClosedNode("coluna", "nome=\"" + builder.normalize(descricoes[i]) + "\"");
840 	    				numeroColunasExibidas++;
841 	    			}
842 	    		}	    		
843 
844 				builder.closeNode("colunas");
845 
846 				/*
847 				 * 22.50cm / numeroColunasExibidas = tamanho de cada coluna dinâmica
848 				 * Quanto mais colunas, menos espaço no relatório.
849 				 */
850 				double t = 22.50;
851 				String tam = String.valueOf(t/numeroColunasExibidas) + "cm";
852 				
853 				builder.addNode("colunasHeader");
854 				for(int x = 1; x <= numeroColunasExibidas; x++){
855 					builder.addClosedNode("colunaHeader", "tamanho=\"" + builder.normalize(tam) + "\"");
856 				}
857 				builder.closeNode("colunasHeader");
858 	    		
859 				double totFonAprovado = 0, totFonRevisado = 0;
860 				double totGerAprovado = 0, totGerRevisado = 0;
861 				double[] totFonValor = new double[6];
862 				double[] totGerValor = new double[6];
863 				
864 				/*Inicializar os valores...*/
865 				for(int i = 0; i < 6; i++){
866 					totFonValor[i] = 0;
867 					totGerValor[i] = 0;
868 				}
869 				
870 				
871 				Iterator itExe = listaExercicios.iterator();
872 				while(itExe.hasNext()){
873 					ExercicioExe exercicio = (ExercicioExe) itExe.next();
874 					String exercicioDesc = exercicio.getDescricaoExe();
875 					String exercicioDescTotal = exercicioDesc;
876 					double totExeAprovado = 0, totExeRevisado = 0; 
877 					double[] totExeValor = new double[6];
878 					
879 					/*Inicializar os valores...*/
880 					for(int i = 0; i < 6; i++){
881 						totExeValor[i] = 0;
882 					}
883 					
884 					
885 					lista = itemEstPrevDao.getListaItemEstruturaPrevisao(itemAri.getItemEstruturaIett(), exercicio);
886 					it = lista.iterator();
887 					long codFonte = -1;
888 		    		while(it.hasNext()){
889 		    			itemEstPrev = (EfItemEstPrevisaoEfiep) it.next();
890 		    			
891 		    			/* ler EfItemEstContaEfiec */
892 		    			EfItemEstContaEfiec itemEstConta = 
893 		    					itemEstContaOrcDao.getItemEstruturaConta(
894 		    						itemAri.getItemEstruturaIett(),
895 		    						exercicio,
896 		    						itemEstPrev.getFonteRecursoFonr(),
897 		    						itemEstPrev.getRecursoRec());
898 		    			
899 		    			/* verificar valores em Efier */
900 		    			Double[] valores = itemEstRealizadoDao.getSomaItemEstruturaRealizado(
901 		    					itemEstConta,
902 		    					exercicio);
903 		    			
904 		    			/* Ao trocar a fonte e ao iniciar imprimir linha de fonte */
905 		    			if(codFonte != itemEstPrev.getFonteRecursoFonr().getCodFonr().longValue()){
906 		    				/* se não é a primeira passada da fonte */
907 		    				if(codFonte != -1){
908 	
909 		    					builder.closeNode("fonte");
910 	
911 		    					/* zerar os valores do total da fonte */
912 		    					totFonAprovado = 0;
913 		    					totFonRevisado = 0;
914 	
915 		    					for(int i = 0; i < 6; i++){
916 		    						totFonValor[i] = 0;
917 		    					}
918 		    				}
919 		    				
920 		    				codFonte = itemEstPrev.getFonteRecursoFonr().getCodFonr().longValue();
921 		    				//IMPRIMIR FONTE
922 		    				builder.addNode("fonte", "nome=\"" + builder.normalize(itemEstPrev.getFonteRecursoFonr().getNomeFonr()) + "\" exercicio=\"" + builder.normalize(exercicioDesc) + "\"");
923 		    				exercicioDesc = "";
924 		    			}
925 		    			
926 		    			/* somar nos valores do total da fonte */
927 		    			if(itemEstPrev.getValorAprovadoEfiep() != null){
928 		    				totFonAprovado = totFonAprovado + itemEstPrev.getValorAprovadoEfiep().doubleValue();
929 		    				totExeAprovado = totExeAprovado + itemEstPrev.getValorAprovadoEfiep().doubleValue();
930 		    			}
931 		    			if(itemEstPrev.getValorRevisadoEfiep() != null){
932 		    				totFonRevisado = totFonRevisado + itemEstPrev.getValorRevisadoEfiep().doubleValue();
933 		    				totExeRevisado = totExeRevisado + itemEstPrev.getValorRevisadoEfiep().doubleValue();
934 		    			}
935 	
936 		    			for(int i = 0; i < 6; i++){
937 							if(mostrarValores[i]){
938 								totFonValor[i] = totFonValor[i] + valores[i].doubleValue();
939 								totExeValor[i] = totExeValor[i] + valores[i].doubleValue();
940 							}
941 		    			}
942 		    			
943 		    			//IMPRIMIR RECURSO
944 						builder.addNode("recurso", "nome=\"" + builder.normalize(itemEstPrev.getRecursoRec().getNomeRec()) + "\"");
945 						//builder.addClosedNode("rec", "valor=\"" + builder.normalize(Util.formataNumeroSemDecimal(itemEstPrev.getValorAprovadoEfiep().doubleValue()))+ "\"");
946 						//builder.addClosedNode("rec", "valor=\"" + builder.normalize(Util.formataNumeroSemDecimal(itemEstPrev.getValorRevisadoEfiep().doubleValue()))+ "\"");
947 						
948 		    			for(int i = 0; i < 3; i++){
949 							if(mostrarDescFinanceiro[i]){
950 								if(i == 0)
951 									builder.addClosedNode("rec", "valor=\"" + builder.normalize(Pagina.trocaNullNumeroSemDecimal(itemEstPrev.getValorAprovadoEfiep())) + "\"");
952 								if(i == 1)
953 									builder.addClosedNode("rec", "valor=\"" + builder.normalize(Pagina.trocaNullNumeroSemDecimal(itemEstPrev.getValorRevisadoEfiep())) + "\"");
954 							}
955 						}
956 						
957 						for(int i = 0; i < 6; i++){
958 							if(mostrarValores[i])
959 		    					builder.addClosedNode("rec", "valor=\"" + builder.normalize(Util.formataNumeroSemDecimal(valores[i].doubleValue()))+ "\"");
960 						}
961 						builder.closeNode("recurso");
962 		    		}
963 		    		
964 					//builder.closeNode("fonte");
965 
966 					/* somar nos valores do total geral */
967 					totGerAprovado = totGerAprovado + totExeAprovado;
968 					totGerRevisado = totGerRevisado + totExeRevisado;
969 					
970 					for(int i = 0; i < 6; i++){
971 						if(mostrarValores[i])
972 							totGerValor[i] = totGerValor[i] + totExeValor[i];
973 					}
974 		    		
975 		    		
976 		    		//IMPRIMIR TOTAL
977 					builder.addNode("totalEvolucaoFinanceiraExercicio", "exercicio=\"" + builder.normalize(exercicioDescTotal) + "\"");
978 					//builder.addClosedNode("total", "valor=\"" + builder.normalize(Util.formataNumeroSemDecimal(totGerAprovado))+ "\"");
979 					//builder.addClosedNode("total", "valor=\"" + builder.normalize(Util.formataNumeroSemDecimal(totGerRevisado))+ "\"");
980 					
981 	    			for(int i = 0; i < 3; i++){
982 						if(mostrarDescFinanceiro[i]){
983 							if(i == 0)
984 								builder.addClosedNode("total", "valor=\"" + builder.normalize(Util.formataNumeroSemDecimal(totExeAprovado))+ "\"");
985 							if(i == 1)
986 								builder.addClosedNode("total", "valor=\"" + builder.normalize(Util.formataNumeroSemDecimal(totExeRevisado))+ "\"");
987 						}
988 					}
989 					
990 					for(int i = 0; i < 6; i++){
991 						if(mostrarValores[i])
992 	    					builder.addClosedNode("total", "valor=\"" + builder.normalize(Util.formataNumeroSemDecimal(totExeValor[i]))+ "\"");
993 					}
994 					builder.closeNode("totalEvolucaoFinanceiraExercicio");
995 
996 					builder.closeNode("fonte");
997 				}
998 				
999 	    		//IMPRIMIR TOTAL
1000 				builder.addNode("totalEvolucaoFinanceira");
1001 				//builder.addClosedNode("total", "valor=\"" + builder.normalize(Util.formataNumeroSemDecimal(totGerAprovado))+ "\"");
1002 				//builder.addClosedNode("total", "valor=\"" + builder.normalize(Util.formataNumeroSemDecimal(totGerRevisado))+ "\"");
1003 				
1004     			for(int i = 0; i < 3; i++){
1005 					if(mostrarDescFinanceiro[i]){
1006 						if(i == 0)
1007 							builder.addClosedNode("total", "valor=\"" + builder.normalize(Util.formataNumeroSemDecimal(totGerAprovado))+ "\"");
1008 						if(i == 1)
1009 							builder.addClosedNode("total", "valor=\"" + builder.normalize(Util.formataNumeroSemDecimal(totGerRevisado))+ "\"");
1010 					}
1011 				}
1012 				
1013 				for(int i = 0; i < 6; i++){
1014 					if(mostrarValores[i])
1015     					builder.addClosedNode("total", "valor=\"" + builder.normalize(Util.formataNumeroSemDecimal(totGerValor[i]))+ "\"");
1016 				}
1017 				builder.closeNode("totalEvolucaoFinanceira");
1018 				
1019 				builder.closeNode("evolucaoFinanceira");
1020 	    	}
1021 	    	else {
1022 	    		builder.addClosedNode("evolucaoFinanceira", "nenhumValor='S' colunasRealizadas='0'");
1023 	    	}
1024     	} catch (HibernateException e){
1025     		this.logger.error(e);
1026     		throw new ECARException("Erro na criação do relatório: Evolução Financeira - " + e.getMessage());
1027     	}
1028     }
1029 
1030     /**
1031      * Gera indicadores xml.<br>
1032      * 
1033      * @author aleixo
1034      * @since N/C
1035      * @version N/C
1036      * @param XmlBuilder builder
1037      * @param AcompReferenciaItemAri itemAri
1038      * @throws ECARException
1039      */
1040     private void geraXMLIndicadores(XmlBuilder builder, AcompReferenciaItemAri itemAri, boolean filho) throws ECARException{
1041     	try {
1042     		if(itemAri != null) {
1043 
1044     			String mostrarProjecao = ("S".equals(Pagina.getParamStr(request, "indProjecao"))) ? "S" : "N";
1045     			String itemFilho = filho ? "S" : "N";
1046     			
1047     			//List<ExercicioExe> exercicios = new ExercicioDao(null).getExerciciosProjecao(itemAri.getItemEstruturaIett().getCodIett());
1048     			//Ref. mantis 7770: exibir os últimos quatro anos...
1049     			//Pegando exercicios do mais novo para mais antigo para pegar os ultimos anos primeiro...
1050     			//List<ExercicioExe> todosExercicios = new ExercicioDao(null).listar(ExercicioExe.class, new String[] {"dataInicialExe","desc"});
1051     			
1052     			//Mantis #11071: Ajustes no Relatório do PPA (metas físicas de exercícios)
1053     			List<ExercicioExe> todosExercicios = new ExercicioDao(null).getExeByPerExe(itemAri.getAcompReferenciaAref().getExercicioExe());
1054     			List<ExercicioExe> exercicios = new ArrayList<ExercicioExe>();
1055 
1056     			if(todosExercicios == null || todosExercicios.isEmpty()) {
1057     				throw new Exception("Não existe exercícios cadastrado");
1058     			}
1059     			//Obtendo ultimos 4 anos...
1060     			int qtdeAnos = 4;
1061     			if(todosExercicios.size() < qtdeAnos) {
1062     				qtdeAnos = todosExercicios.size(); 
1063     			}
1064     			exercicios.addAll(todosExercicios.subList(0, qtdeAnos));
1065     			
1066     			//Re-ordenando do mais antigo para o o mais novo... 
1067     			Collections.reverse(exercicios);
1068     			
1069 				List indResultados = acompRealFisicoDao.getIndResulByAcompRefItemBySituacao(itemAri, Dominios.TODOS, true);
1070 				if(indResultados != null && indResultados.size() > 0){
1071 
1072 					builder.addNode("indicadores", 
1073 							"labelFuncao=\"" + builder.normalize(estFuncDao.getLabelIndicadoresResultado(itemAri.getItemEstruturaIett().getEstruturaEtt())) + 
1074 							"\" mostrarProjecao=\"" + builder.normalize(mostrarProjecao) + 
1075 							"\" filho=\"" + builder.normalize(itemFilho) + "\"");
1076 					
1077 					int numeroExercicios = 0;
1078 					for(ExercicioExe exercicio : exercicios){
1079 						builder.addClosedNode("columnExercicio", "ano=\"" + builder.normalize(exercicio.getDescricaoExe()) + "\"");
1080 						builder.addClosedNode("indExercicio", "exercicio=\"" + builder.normalize(exercicio.getDescricaoExe()) + "\"");
1081 						numeroExercicios++;
1082 					}
1083 					
1084 					Iterator itIndResult = indResultados.iterator();
1085 					String grupoIndicador = "Indicador";
1086 					String exibirGrupoIndicador = "N";
1087 					while(itIndResult.hasNext()){
1088 						AcompRealFisicoArf indicador = (AcompRealFisicoArf) itIndResult.next();
1089 						String tipoQtde = indicador.getItemEstrtIndResulIettr().getIndTipoQtde();
1090 						String situacao = "";
1091 						
1092 						exibirGrupoIndicador = "N";
1093 						if(config.getSisGrupoAtributoSgaByCodSgaGrAtrMetasFisicas() != null){
1094 							if(indicador.getItemEstrtIndResulIettr().getSisAtributoSatb() != null && !grupoIndicador.equals(indicador.getItemEstrtIndResulIettr().getSisAtributoSatb().getDescricaoSatb())){
1095 								grupoIndicador = indicador.getItemEstrtIndResulIettr().getSisAtributoSatb().getDescricaoSatb();
1096 								exibirGrupoIndicador = "S";
1097 							}
1098 							else if(indicador.getItemEstrtIndResulIettr().getSisAtributoSatb() == null && !"".equals(grupoIndicador)) {
1099 								exibirGrupoIndicador = "S";
1100 							}
1101 						}
1102 						
1103 						
1104 						if(indicador.getSituacaoSit()!=null) {
1105 							situacao = indicador.getSituacaoSit().getDescricaoSit();
1106 						}
1107 
1108 						double totalRealizado = 0;
1109 						double totalPrevisto = 0;
1110 						
1111 						builder.addNode("indicador", 
1112 //	                         	"nome=\"" + builder.normalize(indicador.getItemEstrtIndResulIettr().getNomeIettir()) + "\"" +
1113 								"nome=\"" + builder.normalize(indicador.getItemEstrtIndResulIettr().getNomeIettir() + " (" + indicador.getItemEstrtIndResulIettr().getUnidMedidaIettr()) + ")" + "\"" + 
1114 	                         	" situacao=\"" + builder.normalize(situacao) + "\"" +
1115 //	                         	" realizadoNoMes=\"" + builder.normalize(Pagina.trocaNullMoeda(indicador.getQtdRealizadaArf()) + " " + indicador.getItemEstrtIndResulIettr().getUnidMedidaIettr()) + "\"" +
1116 	                         	" realizadoNoMes=\"" + builder.normalize(Pagina.trocaNullNumeroSemDecimal(indicador.getQtdRealizadaArf())) + "\"" +
1117 	                         	" numeroExercicios=\"" + builder.normalize(String.valueOf(numeroExercicios)) + "\"" +
1118 	                         	" mostrarProjecao=\"" + builder.normalize(mostrarProjecao) + "\"" +
1119 	                         	" grupoIndicador=\"" + builder.normalize(grupoIndicador) + "\"" +
1120 	                         	" exibirGrupoIndicador=\"" + builder.normalize(exibirGrupoIndicador) + "\"" +
1121 	                         	" numeroExe=\"" + builder.normalize(String.valueOf(numeroExercicios)) + "\""
1122 	                         	);
1123 						
1124 						if(indicador.getItemEstrtIndResulIettr().getSisAtributoSatb() == null && !"".equals(grupoIndicador)) {
1125 							grupoIndicador = "";
1126 						}
1127 						
1128 						List valoresR = new ArrayList();
1129 						List valoresP = new ArrayList();
1130 
1131 						for(ExercicioExe exercicio : exercicios){
1132 							double realizadoNoExercicio = 0;
1133 							
1134 							//Comentado por aleixo 18/04/2007
1135 //							if(exercicio.equals(itemAri.getAcompReferenciaAref().getExercicioExe())){
1136 //								// Se o exercício em questão é mesmo exercicio do periodo de referência e o indicador for acumulável
1137 //								// soma todas as quantidades até o mes/ano do periodo
1138 //								if("S".equals(indicador.getItemEstrtIndResulIettr().getIndAcumulavelIettr())){
1139 //									AcompReferenciaAref aref = itemAri.getAcompReferenciaAref();
1140 //									int mesRef = Integer.valueOf(aref.getMesAref()).intValue();
1141 //									int anoRef = Integer.valueOf(aref.getAnoAref()).intValue();
1142 //									realizadoNoExercicio = acompRealFisicoDao.getQtdRealizadaExercicio(exercicio, indicador.getItemEstrtIndResulIettr(), mesRef, anoRef);																					
1143 //								} else {
1144 //									//se não for acumulável o realizado no exercicio é o realizado no periodo
1145 //									/*
1146 //									if (indicador.getQtdRealizadaArf() != null)
1147 //										realizadoNoExercicio = indicador.getQtdRealizadaArf().doubleValue();
1148 //									*/
1149 //									realizadoNoExercicio = acompRealFisicoDao.getQtdRealizadaExercicioNaoAcumulavel(exercicio, indicador.getItemEstrtIndResulIettr(), itemAri.getAcompReferenciaAref());
1150 //								}
1151 //							} else {
1152 //								if("S".equals(indicador.getItemEstrtIndResulIettr().getIndAcumulavelIettr())){
1153 //									realizadoNoExercicio = acompRealFisicoDao.getQtdRealizadaExercicio(exercicio, indicador.getItemEstrtIndResulIettr(), itemAri.getAcompReferenciaAref());										
1154 //								} else {
1155 //									realizadoNoExercicio = acompRealFisicoDao.getQtdRealizadaExercicioNaoAcumulavel(exercicio, indicador.getItemEstrtIndResulIettr(), itemAri.getAcompReferenciaAref());																						
1156 //								}
1157 //							} 
1158 
1159 							if("S".equals(indicador.getItemEstrtIndResulIettr().getIndAcumulavelIettr())){
1160 								realizadoNoExercicio = acompRealFisicoDao.getQtdRealizadaExercicio(exercicio, indicador.getItemEstrtIndResulIettr(), itemAri.getAcompReferenciaAref());										
1161 							} else {
1162 								realizadoNoExercicio = acompRealFisicoDao.getQtdRealizadaExercicioNaoAcumulavel(exercicio, indicador.getItemEstrtIndResulIettr(), itemAri.getAcompReferenciaAref());																						
1163 							}
1164 
1165 							double previstoNoExercicio = new ItemEstrtIndResulDao(null).getQtdPrevistoExercicio(indicador.getItemEstrtIndResulIettr(), exercicio);
1166 							if("S".equals(indicador.getItemEstrtIndResulIettr().getIndAcumulavelIettr())){
1167 								totalRealizado += realizadoNoExercicio;
1168 								totalPrevisto += previstoNoExercicio;
1169 							}else{
1170 								totalRealizado = realizadoNoExercicio;
1171 								totalPrevisto = previstoNoExercicio;											
1172 							}
1173 							
1174 							valoresR.add(realizadoNoExercicio);
1175 							valoresP.add(previstoNoExercicio);
1176 
1177 							String strPrevistoExe = "";
1178 							String strRealizadoExe = "";
1179 							if ("Q".equalsIgnoreCase(tipoQtde)){ //Quantidade --> sem casas decimais
1180 								strPrevistoExe = Pagina.trocaNullNumeroSemDecimal(previstoNoExercicio);
1181 								strRealizadoExe = Pagina.trocaNullNumeroSemDecimal(realizadoNoExercicio);
1182 							}
1183 							else {
1184 								strPrevistoExe = Pagina.trocaNullMoeda(previstoNoExercicio);
1185 								strRealizadoExe = Pagina.trocaNullMoeda(realizadoNoExercicio);
1186 							}
1187 							
1188 							builder.addClosedNode("valorExercicio", 
1189 								"exercicio=\"" + builder.normalize(exercicio.getDescricaoExe()) + "\"" + 
1190 //								" valorPrevisto=\"" + builder.normalize(Pagina.trocaNullNumeroSemDecimal(previstoNoExercicio)) + "\"" +
1191 //								" valorRealizado=\"" + builder.normalize(Pagina.trocaNullNumeroSemDecimal(realizadoNoExercicio)) + "\"");								
1192 								" valorPrevisto=\"" + builder.normalize(strPrevistoExe) + "\"" +
1193 								" valorRealizado=\"" + builder.normalize(strRealizadoExe) + "\"");								
1194 						}
1195 						
1196 						Collections.reverse(valoresR);
1197 						Collections.reverse(valoresP);
1198 						
1199 						totalPrevisto = acompRealFisicoDao.getSomaValoresArfs(indicador.getItemEstrtIndResulIettr(), valoresP).doubleValue();
1200 						totalRealizado = acompRealFisicoDao.getSomaValoresArfs(indicador.getItemEstrtIndResulIettr(), valoresR).doubleValue();
1201 						
1202 						double realizadoPrevisto = 0;
1203 						if(totalPrevisto > 0) {
1204 							realizadoPrevisto = ((totalRealizado/totalPrevisto) * 100);
1205 						}
1206 						
1207 						String strTotalPrevisto = "";
1208 						String strTotalRealizado = "";
1209 						if ("Q".equalsIgnoreCase(tipoQtde)){ //Quantidade --> sem casas decimais
1210 							strTotalPrevisto = Pagina.trocaNullNumeroSemDecimal(totalPrevisto);
1211 							strTotalRealizado = Pagina.trocaNullNumeroSemDecimal(totalRealizado);
1212 						}
1213 						else {
1214 							strTotalPrevisto = Pagina.trocaNullMoeda(totalPrevisto);
1215 							strTotalRealizado = Pagina.trocaNullMoeda(totalRealizado);
1216 						}
1217 						
1218 						builder.addClosedNode("valorTotal", 
1219 	                         	" percentualRealizadoPrevisto=\"" + builder.normalize(Pagina.trocaNullNumeroDecimalSemMilhar(new Double((realizadoPrevisto)))) + "\"" +
1220 //	                         	" totalPrevisto=\"" + builder.normalize(Pagina.trocaNullNumeroSemDecimal(Double.valueOf(totalPrevisto))) + "\"" +
1221 //	                         	" totalRealizado=\"" + builder.normalize(Pagina.trocaNullNumeroSemDecimal(Double.valueOf(totalRealizado))) + "\""
1222 	                         	" totalPrevisto=\"" + builder.normalize(strTotalPrevisto) + "\"" +
1223 	                         	" totalRealizado=\"" + builder.normalize(strTotalRealizado) + "\""
1224 	                         	);
1225 						
1226 
1227 						String strProjecao = "";
1228 						String imagemProjecao = "";
1229 						String strPorcentual = "-";
1230 
1231 						if("S".equals(indicador.getItemEstrtIndResulIettr().getIndProjecaoIettr()) && totalRealizado > 0){
1232 							double resultado = acompReferenciaItemDao.calculoProjecao(indicador.getItemEstrtIndResulIettr(), itemAri);
1233 							ExercicioExe exercicioPrevisto = itemEstrtIndResulDao.getMaiorExercicioIndicador(indicador.getItemEstrtIndResulIettr());
1234 							double qtdePrevista = itemEstrtIndResulDao.getQtdPrevistoExercicio(indicador.getItemEstrtIndResulIettr(), exercicioPrevisto);
1235 							
1236 							Mensagem msg = new Mensagem(this.request.getSession().getServletContext());
1237 
1238 							if(resultado == qtdePrevista){
1239 								strProjecao = msg.getMensagem("acompRelatorio.indicadorResultado.projecao.seraAtingida");
1240 								imagemProjecao = pathEcar + "/images/relAcomp/previsto_emtempo.gif";
1241 							}
1242 							if(resultado > qtdePrevista){
1243 								strProjecao = msg.getMensagem("acompRelatorio.indicadorResultado.projecao.seraAtingidaAntes");
1244 								imagemProjecao = pathEcar + "/images/relAcomp/previsto_antestempo.gif";
1245 							}
1246 							if(resultado < qtdePrevista){
1247 								strProjecao = msg.getMensagem("acompRelatorio.indicadorResultado.projecao.naoSeraAtingida");																									
1248 								imagemProjecao = pathEcar + "/images/relAcomp/previsto_depoistempo.gif";
1249 							}
1250 							
1251 							Double porcentagem = new Double((resultado/qtdePrevista) * 100);
1252 							
1253 							strPorcentual = Pagina.trocaNullNumeroDecimalSemMilhar(porcentagem);
1254 						} else {
1255 							if(totalRealizado == 0){
1256 								strProjecao = "Não é possível realizar projeção sem informação de quantidades realizadas.";										
1257 								imagemProjecao = pathEcar + "/images/relAcomp/previsto_semquantidades.gif";
1258 							} else {
1259 								strProjecao = "N/A";
1260 								imagemProjecao = pathEcar + "/images/relAcomp/previsto_naopermite.gif";
1261 							}
1262 						}
1263 						
1264 						builder.addClosedNode("valorProjecao",
1265 	                         	" projecao=\"" + builder.normalize(strProjecao) + "\"" +
1266 	                         	" imagemProjecao=\"" + builder.normalize(imagemProjecao) + "\"" + 
1267 	                         	" mostrarProjecao=\"" + builder.normalize(mostrarProjecao) + "\"" +
1268 	                         	" percentual=\"" + builder.normalize(strPorcentual) + "\"" +
1269 	                         	" situacao=\"" + builder.normalize(situacao) + "\""
1270 								);
1271 						
1272 						
1273 						builder.closeNode("indicador");
1274 
1275 					}
1276 					
1277 					geraXMLLegendaIndicadores(builder, new Mensagem(this.request.getSession().getServletContext()));
1278 					
1279 					builder.closeNode("indicadores");
1280 				}
1281 			}
1282 
1283     	} catch(Exception e){
1284     		this.logger.error(e);
1285     		throw new ECARException("Erro na criação do relatório: Indicadores - " + e.getMessage());               
1286     	}
1287     }
1288 
1289     public void geraXMLLegendaIndicadores(XmlBuilder builder, Mensagem msg){
1290     	builder.addNode("legendaIndicadores");
1291     	
1292     	builder.addClosedNode("legenda", 
1293     			"imagem=\"" + builder.normalize(pathEcar + "/images/relAcomp/previsto_antestempo.gif") + "\"" + 
1294     			" descricao=\"" + builder.normalize(msg.getMensagem("acompRelatorio.indicadorResultado.projecao.seraAtingidaAntes")) + "\"" + 
1295     			"");
1296     	builder.addClosedNode("legenda", 
1297     			"imagem=\"" + builder.normalize(pathEcar + "/images/relAcomp/previsto_emtempo.gif") + "\"" + 
1298     			" descricao=\"" + builder.normalize(msg.getMensagem("acompRelatorio.indicadorResultado.projecao.seraAtingida")) + "\"" + 
1299     			"");
1300     	builder.addClosedNode("legenda", 
1301     			"imagem=\"" + builder.normalize(pathEcar + "/images/relAcomp/previsto_depoistempo.gif") + "\"" + 
1302     			" descricao=\"" + builder.normalize(msg.getMensagem("acompRelatorio.indicadorResultado.projecao.naoSeraAtingida")) + "\"" + 
1303     			"");
1304     	builder.addClosedNode("legenda", 
1305     			"imagem=\"" + builder.normalize(pathEcar + "/images/relAcomp/previsto_semquantidades.gif") + "\"" + 
1306     			" descricao=\"" + builder.normalize("Não é possível realizar projeção sem informação de quantidades realizadas.") + "\"" + 
1307     			"");
1308     	builder.addClosedNode("legenda", 
1309     			"imagem=\"" + builder.normalize(pathEcar + "/images/relAcomp/previsto_naopermite.gif") + "\"" + 
1310     			" descricao=\"" + builder.normalize("Não permite projeção") + "\"" + 
1311     			"");
1312     	builder.closeNode("legendaIndicadores");
1313     }
1314     
1315     /**
1316      * Gera indicadores xml filhos!.<br>
1317      * 
1318      * @author aleixo
1319      * @since N/C
1320      * @version N/C
1321      * @param XmlBuilder builder
1322      * @param AcompReferenciaItemAri itemAri
1323      * @param String nomeEstrutura
1324      * @throws ECARException
1325      */
1326     private void geraXMLIndicadoresFilhos(XmlBuilder builder, AcompReferenciaItemAri itemAri, String nomeEstrutura) throws ECARException{
1327     	try {
1328     		String nomeItem = itemAri.getItemEstruturaIett().getNomeIett();
1329 			String siglaOrg = "";
1330 			
1331 			if(itemAri.getItemEstruturaIett().getOrgaoOrgByCodOrgaoResponsavel1Iett() != null){
1332 				siglaOrg = itemAri.getItemEstruturaIett().getOrgaoOrgByCodOrgaoResponsavel1Iett().getSiglaOrg();
1333 			}
1334 			else {
1335 				siglaOrg = "Órgão não informado";
1336 			}
1337 
1338     		builder.addNode("itemFilho", 
1339     				"nomeItem=\"" + builder.normalize(nomeItem) + "\"" +
1340     				" orgaoItem=\"" + builder.normalize(siglaOrg) + "\"" +
1341     				" estruturaItem=\"" + builder.normalize(nomeEstrutura) + "\"" + 
1342     				"");
1343     		geraXMLIndicadores(builder, itemAri, true);
1344 			builder.closeNode("itemFilho");
1345 
1346     	} catch(Exception e){
1347     		this.logger.error(e);
1348     		throw new ECARException("Erro na criação do relatório: IndicadoresFilhos - " + e.getMessage());               
1349     	}
1350     }
1351     
1352     
1353     /**
1354      * Gera ocorrencias xml.<br>
1355      * 
1356      * @author aleixo
1357      * @since N/C
1358      * @version N/C
1359      * @param XmlBuilder builder
1360      * @param AcompReferenciaItemAri itemAri
1361      * @throws ECARException
1362      */
1363     
1364     private void geraXMLOcorrencias(XmlBuilder builder, AcompReferenciaItemAri itemAri) throws ECARException{
1365     	try {
1366     		//Ocorrências = getItemEstruturaIett().getItemEstrutAcaoIettas() 
1367     		List<ItemEstrutAcaoIetta> ocorrencias = new ArrayList(itemAri.getItemEstruturaIett().getItemEstrutAcaoIettas());
1368     		if(ocorrencias != null && !ocorrencias.isEmpty()){
1369     			//Ordenando pela Data
1370     			Collections.sort(ocorrencias, new Comparator(){
1371 
1372 					public int compare(Object arg0, Object arg1) {
1373 						ItemEstrutAcaoIetta i1 = (ItemEstrutAcaoIetta) arg0;
1374 						ItemEstrutAcaoIetta i2 = (ItemEstrutAcaoIetta) arg1;
1375 						
1376 						if(i1.getDataIetta() == null && i2.getDataIetta() == null)
1377 							return 0;
1378 						if(i1.getDataIetta() != null && i2.getDataIetta() == null)
1379 							return -1;
1380 						if(i1.getDataIetta() == null && i2.getDataIetta() != null)
1381 							return 1;
1382 						
1383 						return i1.getDataIetta().compareTo(i2.getDataIetta());
1384 					}
1385     				
1386     			});
1387     			
1388     			Collections.reverse(ocorrencias);//inverto a lista para ordenar do mais recente para o mais antigo
1389     			
1390     			builder.addNode("ocorrencias", "labelFuncao=\"" + builder.normalize(estFuncDao.getLabelOcorrencias(itemAri.getItemEstruturaIett().getEstruturaEtt())) + "\"");
1391     			for(ItemEstrutAcaoIetta ocorrencia : ocorrencias){
1392     				// ignorar registro inativo
1393     				if(Dominios.NAO.equals(ocorrencia.getIndAtivoIetta())) {
1394     					continue;
1395     				}
1396     				String data = Data.parseDate(ocorrencia.getDataIetta());
1397     				String descricao = ocorrencia.getDescricaoIetta();
1398     				builder.addClosedNode("ocorrencia",
1399     						"data=\"" + builder.normalize(data) + "\"" + 
1400     						" descricao=\"" + builder.normalize(descricao) + "\""
1401     					);
1402     			}
1403     			builder.closeNode("ocorrencias");
1404     		}
1405 
1406     	} catch(Exception e){
1407     		this.logger.error(e);
1408     		throw new ECARException("Erro na criação do relatório: Ocorrencias - " + e.getMessage());               
1409     	}
1410     }
1411     
1412     /**
1413      * Gera etapas xml.<br>
1414      * 
1415      * @author aleixo
1416      * @version 0.2 - 26/03/2007
1417      * @since 0.1 - 15/03/2007
1418      * @param XmlBuilder builder
1419      * @param AcompRelatorioArel arel
1420      * @throws ECARException
1421      */
1422     private void geraXMLEtapas(XmlBuilder builder, AcompRelatorioArel arel) throws ECARException{
1423 
1424     	ItemEstruturaIett item = arel.getAcompReferenciaItemAri().getItemEstruturaIett();
1425     	
1426     	List ettEtapas = estruturaDao.getEstruturasEtapas(item.getEstruturaEtt());
1427 
1428     	String labelFuncao = "";
1429     	if(ettEtapas != null && ettEtapas.size() > 1){
1430     		labelFuncao = "Etapas:";
1431     	}
1432     	
1433     	builder.addNode("etapas", 
1434     			"labelFuncao=\"" + builder.normalize(labelFuncao) + "\"");
1435     	if(ettEtapas != null && !ettEtapas.isEmpty()){
1436     		Iterator itEttEtapas = ettEtapas.iterator();
1437     		while(itEttEtapas.hasNext()){
1438     			EstruturaEtt ettEtapa = (EstruturaEtt) itEttEtapas.next();
1439 
1440     			List etapas = new ArrayList();
1441     			List colunas = estruturaDao.getAtributosAcessoEstrutura(ettEtapa);
1442     			
1443 				if(colunas != null && colunas.size() > 0) {
1444 					//etapas = itemEstruturaDao.getItensFilho(item, ettEtapa, ((ObjetoEstrutura)colunas.get(0)).iGetNomeOrdenarLista());
1445 					etapas = itemEstruturaDao.getItensFilho(item, ettEtapa, colunas);
1446 				}
1447 				else {
1448 					etapas = itemEstruturaDao.getItensFilho(item, ettEtapa, "");
1449 				}
1450     			
1451 				if(etapas != null && !etapas.isEmpty()){
1452 				
1453 					/*
1454 					 * Testando se existem valores para etapa
1455 					 */
1456 					boolean apresentarEtapa = false;
1457 					for(Iterator it = etapas.iterator(); it.hasNext();){
1458     					ItemEstruturaIett etapa = (ItemEstruturaIett) it.next();
1459     					if(etapa.getEstruturaEtt().equals(ettEtapa)){
1460     						apresentarEtapa = true;
1461     					}
1462 					}
1463 					
1464 					if(!apresentarEtapa){
1465 						continue;
1466 					}
1467 					
1468 	    			builder.addNode("etapa", "nomeEtapa=\"" + builder.normalize(ettEtapa.getNomeEtt()) + "\"");
1469 
1470 	    			geraXMLColunasEtapa(builder, colunas);
1471 	    			if(colunas != null && !colunas.isEmpty()){
1472 	    				Iterator itEtapa = etapas.iterator();
1473 	    	    		String corFundo = "#EEE9E9";
1474 	    				while(itEtapa.hasNext()){
1475 	    					ItemEstruturaIett etapa = (ItemEstruturaIett) itEtapa.next();
1476 	    					if(etapa.getEstruturaEtt().equals(ettEtapa)){
1477 	    						geraXMLValoresEtapa(builder, etapa, colunas, corFundo);
1478 
1479 	    						if(!"".equals(corFundo)){
1480 		    						corFundo = "";
1481 		    					}
1482 		    					else {
1483 		    						corFundo = "#EEE9E9";
1484 		    					}
1485 	    					}
1486 	    				}
1487 	    			}
1488 	    			builder.closeNode("etapa");
1489 				}
1490     		}
1491     	}
1492     	
1493         builder.closeNode("etapas");
1494     }
1495     
1496     /**
1497      * Gera colunas da etapa.<br>
1498      * 
1499      * @author aleixo
1500      * @version 0.2 - 26/03/2007, 0.1 - 23/03/2007
1501      * @param XmlBuilder builder
1502      * @param List colunas
1503      * @throws ECARException
1504      */
1505     public void geraXMLColunasEtapa(XmlBuilder builder, List colunas) throws ECARException{
1506     	if(colunas != null && !colunas.isEmpty()){
1507     		Iterator itColunas = colunas.iterator();
1508 			while (itColunas.hasNext()){
1509 				ObjetoEstrutura coluna = (ObjetoEstrutura) itColunas.next();
1510 				//double larguraReal = ((315 * coluna.iGetLargura().intValue()) / (100));
1511 				double larguraReal = ((250 * coluna.iGetLargura().intValue()) / (100));
1512 				String largura = String.valueOf(larguraReal) + "mm";
1513 				String label = coluna.iGetLabel();
1514 				
1515 				builder.addClosedNode("etapasColunaHeader", "largura=\"" + builder.normalize(largura) + "\"");
1516 				builder.addClosedNode("etapasColuna", "label=\"" + builder.normalize(label) + "\"");
1517 			}
1518     	}
1519     }
1520     
1521     /**
1522      * Gera Valores da coluna de etapas.<br>
1523      * 
1524      * @author aleixo
1525      * @version 0,1 23/03/2007
1526      * @param builder
1527      * @param etapa
1528      * @param colunas
1529      * @throws ECARException
1530      */
1531     public void geraXMLValoresEtapa(XmlBuilder builder, ItemEstruturaIett etapa, List colunas, String corFundo) throws ECARException{
1532     	if(colunas != null && !colunas.isEmpty()){
1533     		builder.addNode("itemEtapa", "corFundo=\"" + builder.normalize(corFundo) + "\"");
1534     		Iterator itColunas = colunas.iterator();
1535 			while (itColunas.hasNext()){
1536 				ObjetoEstrutura coluna = (ObjetoEstrutura) itColunas.next();
1537 				builder.addClosedNode("etapasValor", "valor=\"" + builder.normalize(coluna.iGetValor(etapa)) + "\"");
1538 			}
1539 			builder.closeNode("itemEtapa");
1540     	}
1541     }
1542     
1543     /**
1544      * Verifica numa lista de itens de etapas (ItemEstruturaIett), se existe algum item de etapa
1545      * que pertença à etapa (EstruturaEtt) passada pelo parâmetro.<br>
1546      * 
1547      * @author aleixo
1548      * @version 0,1 23/03/2007
1549      * @param EstruturaEtt ettEtapa - Etapa em questão
1550      * @param List etapas - Lista com itens de uma etapa
1551      * @return boolean
1552      */
1553     private boolean verificaEtapa(EstruturaEtt ettEtapa, List etapas){
1554 		if(etapas != null && !etapas.isEmpty()){
1555 	    	Iterator itEtapa = etapas.iterator();
1556 			while(itEtapa.hasNext()){
1557 				ItemEstruturaIett etapa = (ItemEstruturaIett) itEtapa.next();
1558 				if(etapa.getEstruturaEtt().equals(ettEtapa)){
1559 					return true;
1560 				}
1561 			}
1562 		}
1563 		return false;
1564     }
1565 }