View Javadoc

1   /*
2    * Criado em 10/02/2005
3    */
4   package ecar.dao;
5   
6   import java.math.BigDecimal;
7   import java.util.ArrayList;
8   import java.util.Arrays;
9   import java.util.Calendar;
10  import java.util.Collection;
11  import java.util.Collections;
12  import java.util.Comparator;
13  import java.util.Date;
14  import java.util.Enumeration;
15  import java.util.GregorianCalendar;
16  import java.util.HashMap;
17  import java.util.HashSet;
18  import java.util.Iterator;
19  import java.util.List;
20  import java.util.Map;
21  import java.util.Set;
22  
23  import javax.servlet.http.HttpServletRequest;
24  
25  import org.apache.log4j.Logger;
26  import org.hibernate.HibernateException;
27  import org.hibernate.Query;
28  import org.hibernate.Transaction;
29  
30  import comum.database.Dao;
31  import comum.util.Data;
32  import comum.util.Mensagem;
33  import comum.util.Pagina;
34  import comum.util.Util;
35  
36  import ecar.bean.AtributoEstruturaListagemItens;
37  import ecar.bean.OrdenacaoTpfaEstrutura;
38  import ecar.email.AgendadorEmail;
39  import ecar.exception.ECARException;
40  import ecar.permissao.ValidaPermissao;
41  import ecar.pojo.AcompRealFisicoArf;
42  import ecar.pojo.AcompRefItemLimitesArli;
43  import ecar.pojo.AcompRefItemLimitesArliPK;
44  import ecar.pojo.AcompRefLimitesArl;
45  import ecar.pojo.AcompRefLimitesArlPK;
46  import ecar.pojo.AcompReferenciaAref;
47  import ecar.pojo.AcompReferenciaItemAri;
48  import ecar.pojo.AcompRelatorioArel;
49  import ecar.pojo.AreaAre;
50  import ecar.pojo.ConfigMailCfgm;
51  import ecar.pojo.ConfiguracaoCfg;
52  import ecar.pojo.Cor;
53  import ecar.pojo.EmpresaEmp;
54  import ecar.pojo.EstruturaEtt;
55  import ecar.pojo.ItemEstUsutpfuacIettutfa;
56  import ecar.pojo.ItemEstrtIndResulIettr;
57  import ecar.pojo.ItemEstrutFisicoIettf;
58  import ecar.pojo.ItemEstruturaIett;
59  import ecar.pojo.ItemEstruturaIettMin;
60  import ecar.pojo.ItemEstruturaSisAtributoIettSatb;
61  import ecar.pojo.ObjetoEstrutura;
62  import ecar.pojo.OrgaoOrg;
63  import ecar.pojo.PeriodicidadePrdc;
64  import ecar.pojo.SisAtributoSatb;
65  import ecar.pojo.SisGrupoAtributoSga;
66  import ecar.pojo.SituacaoSit;
67  import ecar.pojo.StatusRelatorioSrl;
68  import ecar.pojo.SubAreaSare;
69  import ecar.pojo.TfuncacompConfigmailTfacfgm;
70  import ecar.pojo.TfuncacompConfigmailTfacfgmPK;
71  import ecar.pojo.TipoAcompFuncAcompTafc;
72  import ecar.pojo.TipoAcompanhamentoTa;
73  import ecar.pojo.TipoFuncAcompTpfa;
74  import ecar.pojo.UnidadeOrcamentariaUO;
75  import ecar.pojo.UsuarioAtributoUsua;
76  import ecar.pojo.UsuarioUsu;
77  import ecar.servlet.grafico.bean.PosicaoBean;
78  import ecar.taglib.util.Input;
79  import ecar.util.Dominios;
80  
81  /**
82   * @author felipev, aleixo
83   */
84  public class AcompReferenciaItemDao extends Dao {
85  
86    ValidaPermissao validaPermissao = new ValidaPermissao();
87    public static int STATUS_EM_EDICAO = 1;
88    public static int STATUS_LIBERADO = 2;
89  
90    public static String RELATORIO_ORGAO = "ECAR-001A";
91    public static String RELATORIO_ORGAO_ESPECIFICO = "ECAR-001B";
92    public static String RELATORIO_SITUACAO = "ECAR-002A";
93    public static String RELATORIO_SITUACAO_ESPECIFICO = "ECAR-002B";
94    public static String RELATORIO_ESTRUTURA = "ECAR-001C";
95  
96    public AcompReferenciaItemDao(HttpServletRequest request) {
97      super();
98      this.request = request;
99    }
100 
101   /**
102    * Grava uma lista de acompanhamento Referência e todos os seus itens. Se o
103    * item possui funções de acompanhamento, cria um registro de AcompRelatorio
104    * para cada uma delas Se o item possui indicadores de resultado, cria um
105    * registro de AcompRealFisico para cada um deles
106    * @throws ECARException
107    */
108   @SuppressWarnings("unchecked")
109   public void salvarOuAlterarAcompReferenciaItens(List listAcompReferenciaAref, HttpServletRequest request, List listNiveis) throws ECARException {
110     Transaction tx = null;
111 
112     try {
113       super.inicializarLogBean();
114 
115       tx = session.beginTransaction();
116 
117       AcompRealFisicoDao arfDao = new AcompRealFisicoDao(request);
118       ConfiguracaoDao configuracaoDao = new ConfiguracaoDao(request);
119       TipoAcompanhamentoDao tipoAcompanhamentoDao = new TipoAcompanhamentoDao(request);
120       AcompReferenciaDao acompReferenciaDao = new AcompReferenciaDao(request);
121 
122       ArrayList objetos = new ArrayList();
123       AcompReferenciaAref acompanhamento = (AcompReferenciaAref) listAcompReferenciaAref.get(0);
124 
125       ItemEstUsutpfuacDao itemEstUsutpfuacDao = new ItemEstUsutpfuacDao(request);
126       AcompRelatorioDao acompRelatorioDao = new AcompRelatorioDao(request);
127 
128       UsuarioUsu usuario = (UsuarioUsu) new UsuarioDao(request).buscar(UsuarioUsu.class, Long.valueOf(Pagina.getParamStr(request, "codUsuario")));
129 
130       // // Obter configuração de grupo de meta física
131       ConfiguracaoCfg cfg = configuracaoDao.getConfiguracao();
132       ArrayList<SisAtributoSatb> listAtribMetasFisicasCfg = new ArrayList<SisAtributoSatb>();
133 
134       TipoAcompanhamentoTa ta = (TipoAcompanhamentoTa) tipoAcompanhamentoDao.buscar(TipoAcompanhamentoTa.class, acompanhamento.getTipoAcompanhamentoTa().getCodTa());
135       if (cfg.getSisGrupoAtributoSgaByCodSgaGrAtrMetasFisicas() != null) {
136         ArrayList listSatb = new ArrayList(ta.getSisAtributoSatbs());
137 
138         if (listSatb != null) {
139           for (Iterator itSatbs = listSatb.iterator(); itSatbs.hasNext();) {
140             SisAtributoSatb sisAtributoSatb = (SisAtributoSatb) itSatbs.next();
141             if (sisAtributoSatb.getSisGrupoAtributoSga().equals(cfg.getSisGrupoAtributoSgaByCodSgaGrAtrMetasFisicas())) {
142               listAtribMetasFisicasCfg.add(sisAtributoSatb);
143             }
144           }
145         }
146       }
147       // //
148 
149       /*
150        * itensSelecionados em Tela serão os checkboxes marcados em
151        * selecaoItem.jsp
152        */
153       List<ItemEstruturaIett> itensSelecionadosEmTela = new ArrayList<ItemEstruturaIett>();
154 
155       String[] itemSelecao = request.getParameterValues("iett");
156       if (itemSelecao != null) {
157         for (int i = 0; i < itemSelecao.length; i++) {
158           ItemEstruturaIett item = (ItemEstruturaIett) buscar(ItemEstruturaIett.class, Long.valueOf(itemSelecao[i]));
159           itensSelecionadosEmTela.add(item);
160         }
161       }
162 
163       List listaCompletaItens = adicionaDescendentesQuantidadePrevista(itensSelecionadosEmTela, acompanhamento);
164 
165       for (Iterator itAref = listAcompReferenciaAref.iterator(); itAref.hasNext();) {
166         acompanhamento = (AcompReferenciaAref) itAref.next();
167 
168         /*
169          * Cria uma variável acompAuxiliar para receber o objeto acompanhamento
170          * com os dados que estavam ne session do servidor e foram setados a
171          * partir de dados do Formulário. Faz buscar do acompanhamento que esta
172          * sendo alterado e seta as valores que estavam em acompAuxiliar para
173          * acompanhamento
174          */
175         if (acompanhamento.getCodAref() != null && acompanhamento.getCodAref().longValue() > 0) {
176           AcompReferenciaAref acompAuxiliar = acompanhamento;
177           acompanhamento = (AcompReferenciaAref) this.buscar(AcompReferenciaAref.class, acompAuxiliar.getCodAref());
178           acompanhamento.setDataInicioAref(acompAuxiliar.getDataInicioAref());
179           acompanhamento.setDataLimiteAcompFisicoAref(acompAuxiliar.getDataLimiteAcompFisicoAref());
180           acompanhamento.setNomeAref(acompAuxiliar.getNomeAref());
181           acompanhamento.setAcompRefLimitesArls(acompAuxiliar.getAcompRefLimitesArls());
182           session.update(acompanhamento);
183         }
184         else {
185           session.save(acompanhamento);
186         }
187 
188         objetos.add(acompanhamento);
189 
190         /*
191          * lista com os itens monitorados pelo acompanhamento (no caso de
192          * inclusão de acompanhamento essa será um lista vazia
193          */
194         List itensMonitoradosBancoDeDados = getListaItensAcompanhamento(acompanhamento);
195 
196         Collection objetosParaSalvar = Util.diferenca(listaCompletaItens, itensMonitoradosBancoDeDados);
197         Collection objetosParaAlterar = Util.intersecao(listaCompletaItens, itensMonitoradosBancoDeDados);
198         Collection objetosParaExcluir = Util.diferenca(itensMonitoradosBancoDeDados, listaCompletaItens);
199 
200         /*
201          * Itera e salva ( ou altera ) os limites do acompanhamento
202          */
203 
204         for (Iterator itLimites = acompanhamento.getAcompRefLimitesArls().iterator(); itLimites.hasNext();) {
205           AcompRefLimitesArl acompLimites = (AcompRefLimitesArl) itLimites.next();
206 
207           if (acompLimites.getComp_id() != null) {
208             session.update(acompLimites);
209           }
210           else {
211             AcompRefLimitesArlPK pk = new AcompRefLimitesArlPK();
212             pk.setCodAref(acompLimites.getAcompReferenciaAref().getCodAref());
213             pk.setCodTpfa(acompLimites.getTipoFuncAcompTpfa().getCodTpfa());
214             acompLimites.setComp_id(pk);
215             session.save(acompLimites);
216           }
217           objetos.add(acompLimites);
218         }
219 
220         /* cria os novos acompanhamento de item */
221 
222         for (Iterator itObjetosIncluidos = objetosParaSalvar.iterator(); itObjetosIncluidos.hasNext();) {
223           ItemEstruturaIett iett = (ItemEstruturaIett) itObjetosIncluidos.next();
224           AcompReferenciaItemAri acompReferenciaItem = criaNovoAcompReferenciaItemAri(acompanhamento, iett, request, itensSelecionadosEmTela, usuario);
225 
226           session.save(acompReferenciaItem);
227           objetos.add(acompReferenciaItem);
228 
229           for (Iterator itAcompReferenciaItemLimites = acompReferenciaItem.getAcompRefItemLimitesArlis().iterator(); itAcompReferenciaItemLimites.hasNext();) {
230             AcompRefItemLimitesArli limite = (AcompRefItemLimitesArli) itAcompReferenciaItemLimites.next();
231             setPKAcompReferenciaItemLimite(limite);
232             session.save(limite);
233             objetos.add(limite);
234           }
235 
236           /* salva os realizados fisicos conforme regra */
237 
238           if (iett.getItemEstrtIndResulIettrs() != null && !iett.getItemEstrtIndResulIettrs().isEmpty()) {
239 
240             boolean gravaARF = false;
241 
242             if (listNiveis != null && listNiveis.size() > 0) {
243               if (iett.getItemEstruturaNivelIettns() != null && iett.getItemEstruturaNivelIettns().size() > 0) {
244                 Iterator itNiveis = iett.getItemEstruturaNivelIettns().iterator();
245                 while (itNiveis.hasNext() && !gravaARF) {
246                   SisAtributoSatb nivel = (SisAtributoSatb) itNiveis.next();
247 
248                   if (listNiveis.contains(nivel)) {
249                     gravaARF = true;
250                   }
251 
252                 }
253               }
254             }
255             else {
256               gravaARF = true;
257             }
258 
259             if (gravaARF) {
260 
261               for (Iterator itIettir = iett.getItemEstrtIndResulIettrs().iterator(); itIettir.hasNext();) {
262                 ItemEstrtIndResulIettr iettir = (ItemEstrtIndResulIettr) itIettir.next();
263 
264                 // // verificacao de grupo de meta física
265                 if (!listAtribMetasFisicasCfg.isEmpty()) {
266                   if (iettir.getSisAtributoSatb() == null || !listAtribMetasFisicasCfg.contains(iettir.getSisAtributoSatb())) {
267                     // não gravar ARF para o indicador, se o indicador não tiver
268                     // a meta física configurada no tipo de acomp.
269                     continue;
270                   }
271                 }
272                 // //
273 
274                 // verificar a existência do ARF
275                 AcompRealFisicoArf arf = arfDao.buscarPorIettir(Long.valueOf(acompReferenciaItem.getAcompReferenciaAref().getMesAref()), Long.valueOf(acompReferenciaItem.getAcompReferenciaAref().getAnoAref()), iettir.getCodIettir());
276 
277                 if (arf == null) {
278                   long mes = Long.valueOf(acompReferenciaItem.getAcompReferenciaAref().getMesAref()).longValue();
279                   long ano = Long.valueOf(acompReferenciaItem.getAcompReferenciaAref().getAnoAref()).longValue();
280                   AcompRealFisicoArf arfAnterior = arfDao.getArfAnterior(iettir, mes, ano);
281 
282                   if (arfAnterior != null) {
283                     if (arfAnterior.getSituacaoSit() != null && "S".equals(arfAnterior.getSituacaoSit().getIndConcluidoSit())) {
284                       // Se o ARF anterior representa conclusão, não gero ARF
285                       // deste indicador para o acompanhamento.
286                       continue;
287                     }
288                   }
289 
290                   arf = new AcompRealFisicoArf();
291 
292                   arf.setItemEstrtIndResulIettr(iettir);
293                   arf.setDataInclusaoArf(Data.getDataAtual());
294                   arf.setItemEstruturaIett(iett);
295                   arf.setMesArf(Long.valueOf(acompReferenciaItem.getAcompReferenciaAref().getMesAref()));
296                   arf.setAnoArf(Long.valueOf(acompReferenciaItem.getAcompReferenciaAref().getAnoAref()));
297 
298                   session.save(arf);
299                   objetos.add(arf);
300                 }
301               }
302             }
303           }
304 
305           /* salva os relatórios (se existirem) */
306           if (acompReferenciaItem.getAcompRelatorioArels() != null) {
307             for (Iterator itAcompRel = acompReferenciaItem.getAcompRelatorioArels().iterator(); itAcompRel.hasNext();) {
308               AcompRelatorioArel acompRel = (AcompRelatorioArel) itAcompRel.next();
309               session.save(acompRel);
310               objetos.add(acompRel);
311             }
312           }
313         }
314 
315         for (Iterator itObjetosDeletados = objetosParaExcluir.iterator(); itObjetosDeletados.hasNext();) {
316           ItemEstruturaIett itemRemoverMonitoramento = (ItemEstruturaIett) itObjetosDeletados.next();
317           AcompReferenciaItemAri acompReferenciaItemAExcluir = this.getAcompReferenciaItemByItemEstruturaIett(acompanhamento, itemRemoverMonitoramento);
318           List filhos = new ArrayList();
319           /* excluir os realizados físico e Relatorios do acompanhamento */
320           filhos.addAll(acompReferenciaItemAExcluir.getAcompRelatorioArels());
321 
322           // verificar o ARF correspondente ao ARI que podem ser excluído
323           StringBuilder query = new StringBuilder("select ARI from AcompReferenciaItemAri as ARI").append(" where ARI.itemEstruturaIett.codIett = :codIett").append(" and ARI.acompReferenciaAref.mesAref = :mes").append(" and ARI.acompReferenciaAref.anoAref = :ano").append(" and ARI.codAri<> :codAri").append(" and ARI.itemEstruturaIett.indAtivoIett = 'S'");
324 
325           Query q = this.getSession().createQuery(query.toString());
326 
327           q.setLong("codIett", acompReferenciaItemAExcluir.getItemEstruturaIett().getCodIett().longValue());
328           q.setString("mes", acompReferenciaItemAExcluir.getAcompReferenciaAref().getMesAref());
329           q.setString("ano", acompReferenciaItemAExcluir.getAcompReferenciaAref().getAnoAref());
330           q.setLong("codAri", acompReferenciaItemAExcluir.getCodAri().longValue());
331 
332           List listaARI = q.list();
333 
334           if (listaARI == null || listaARI.isEmpty()) {
335             // o ARF correspondente pode ser removido pois não está em uso
336             List listArf = arfDao.buscarPorIett(acompReferenciaItemAExcluir.getItemEstruturaIett().getCodIett(), Long.valueOf(acompReferenciaItemAExcluir.getAcompReferenciaAref().getMesAref()), Long.valueOf(acompReferenciaItemAExcluir.getAcompReferenciaAref().getAnoAref()));
337 
338             if (listArf != null && !listArf.isEmpty()) {
339 
340               for (Iterator itListArf = listArf.iterator(); itListArf.hasNext();) {
341                 filhos.add(itListArf.next());
342 
343               }
344 
345             }
346           }
347 
348           for (Iterator itExcluirFilhos = filhos.iterator(); itExcluirFilhos.hasNext();) {
349             session.delete(itExcluirFilhos.next());
350           }
351 
352           for (Iterator itExcluirFilhos = filhos.iterator(); itExcluirFilhos.hasNext();) {
353             objetos.add(itExcluirFilhos.next());
354 
355           }
356 
357           session.delete(acompReferenciaItemAExcluir);
358           objetos.add(acompReferenciaItemAExcluir);
359 
360         }
361 
362         Set setNovosArlis = new HashSet();
363         Set setNovosArels = new HashSet();
364         for (Iterator itObjetosAlterados = objetosParaAlterar.iterator(); itObjetosAlterados.hasNext();) {
365           ItemEstruturaIett itemAlterarMonitoramento = (ItemEstruturaIett) itObjetosAlterados.next();
366 
367           AcompReferenciaItemAri acompReferenciaItemAlterar = this.getAcompReferenciaItemByItemEstruturaIett(acompanhamento, itemAlterarMonitoramento);
368           acompReferenciaItemAlterar.setDataUltManutAri(Data.getDataAtual());
369           acompReferenciaItemAlterar.setDataInicioAri(acompanhamento.getDataInicioAref());
370           acompReferenciaItemAlterar.setDataLimiteAcompFisicoAri(acompanhamento.getDataLimiteAcompFisicoAref());
371           acompReferenciaItemAlterar.setCodUsuUltManutAri(Long.valueOf(Pagina.getParamStr(request, "codUsuario")));
372 
373           session.update(acompReferenciaItemAlterar);
374           objetos.add(acompReferenciaItemAlterar);
375 
376           for (Iterator it = acompReferenciaItemAlterar.getAcompRefItemLimitesArlis().iterator(); it.hasNext();) {
377             AcompRefItemLimitesArli acompRefItemLimites = (AcompRefItemLimitesArli) it.next();
378 
379             AcompRefLimitesArl limiteAcomp = acompReferenciaDao.getAcompRefLimitesByFuncaoAcomp(acompanhamento, acompRefItemLimites.getTipoFuncAcompTpfa());
380             acompRefItemLimites.setDataLimiteArli(limiteAcomp.getDataLimiteArl());
381             session.update(acompRefItemLimites);
382             objetos.add(acompRefItemLimites);
383           }
384 
385           // Mantis: 10715 (Criar AREL (parecer) para novas funções de
386           // acompanhamento)
387 
388           // Testar confirmação do usuário se confirma criação de parecer para
389           // novas funções de acompanhamento
390           if ("S".equals(Pagina.getParamStr(request, "existeAriFaltandoParecerConfirma"))) {
391             // Só gerar AREL(parecer) para itens que foram selecionados na tela
392             if (itensSelecionadosEmTela.contains(itemAlterarMonitoramento)) {
393               Set arelsGravados = acompReferenciaItemAlterar.getAcompRelatorioArels();
394 
395               // obtem as funções de acompanhamento do item que emitem posição
396               Iterator it = itemEstUsutpfuacDao.getFuacEmitePosicaoOrderByFuncAcomp(itemAlterarMonitoramento).iterator();
397               while (it.hasNext()) {
398                 TipoFuncAcompTpfa funcAcomp = ((ItemEstUsutpfuacIettutfa) it.next()).getTipoFuncAcompTpfa();
399 
400                 // Só gerar AREL(parecer) para as funções cadastradas no tipo de
401                 // acompanhamento
402                 Iterator itTafc = ta.getTipoAcompFuncAcompTafcs().iterator();
403                 while (itTafc.hasNext()) {
404                   TipoAcompFuncAcompTafc tafc = (TipoAcompFuncAcompTafc) itTafc.next();
405                   // verifica a função e se ela não está como "ignorar"
406                   if (tafc.getTipoFuncAcompTpfa().equals(funcAcomp) && (tafc.getIndObrigatorio().equals("S") || tafc.getIndOpcional().equals("S"))) {
407                     boolean existeArelParaFuncao = false;
408                     Iterator itArelsGravados = arelsGravados.iterator();
409                     while (itArelsGravados.hasNext() && !existeArelParaFuncao) {
410                       AcompRelatorioArel arel = (AcompRelatorioArel) itArelsGravados.next();
411                       if (arel.getTipoFuncAcompTpfa().equals(funcAcomp)) {
412                         existeArelParaFuncao = true;
413                       }
414                     }
415 
416                     AcompRefLimitesArl arlAcomp = acompReferenciaDao.getAcompRefLimitesByFuncaoAcomp(acompanhamento, funcAcomp);
417 
418                     if (arlAcomp != null) {
419                       AcompRefItemLimitesArli arliAri = acompReferenciaDao.getAcompRefItemLimitesArliByAriAndTpfa(acompReferenciaItemAlterar.getCodAri(), funcAcomp.getCodTpfa());
420                       if (arliAri == null) {
421                         AcompRefItemLimitesArli acompRefItemLimite = new AcompRefItemLimitesArli();
422                         acompRefItemLimite.setDataLimiteArli(arlAcomp.getDataLimiteArl());
423                         acompRefItemLimite.setAcompReferenciaItemAri(acompReferenciaItemAlterar);
424                         acompRefItemLimite.setTipoFuncAcompTpfa(funcAcomp);
425                         acompRefItemLimite.atribuirPKPai();
426                         if (!setNovosArlis.contains(acompRefItemLimite)) {
427                           setNovosArlis.add(acompRefItemLimite);
428                         }
429                       }
430                     }
431 
432                     if (!existeArelParaFuncao) {
433                       AcompRelatorioArel arelAux = acompRelatorioDao.criaNovoAcompRelatorio(acompReferenciaItemAlterar, usuario, funcAcomp);
434                       if (!setNovosArels.contains(arelAux)) {
435                         setNovosArels.add(arelAux);
436                       }
437                     }
438                   }
439                 }
440               }
441             }
442           }
443         }
444         Iterator it = setNovosArlis.iterator();
445         while (it.hasNext()) {
446           session.save(it.next());
447         }
448         it = setNovosArels.iterator();
449         while (it.hasNext()) {
450           session.save(it.next());
451         }
452         // Fim Mantis: 10715
453       }
454 
455       tx.commit();
456 
457       if (super.logBean != null) {
458         super.logBean.setCodigoTransacao(Data.getHoraAtual(false));
459         super.logBean.setOperacao("INC_ALT_EXC");
460 
461         for (Iterator itObj = objetos.iterator(); itObj.hasNext();) {
462           super.logBean.setObj(itObj.next());
463           super.loggerAuditoria.info(logBean.toString());
464         }
465       }
466     } catch (HibernateException e) {
467       e.printStackTrace();
468       this.logger.error(e);
469       if (tx != null)
470         try {
471           tx.rollback();
472         } catch (HibernateException r) {
473           this.logger.error(r);
474           throw new ECARException("erro.hibernateException");
475         }
476       this.logger.error(e);
477       throw new ECARException("erro.hibernateException");
478     }
479 
480   }
481 
482   /**
483    * Recebe uma lista de itens e completa essa lista adicionando descendentes
484    * destes itens que possuam quantidades previstas
485    * @param itensSelecionadosEmTela
486    */
487   private List adicionaDescendentesQuantidadePrevista(List itensSelecionadosEmTela, AcompReferenciaAref aref) throws ECARException {
488     ItemEstruturaDao itemEstruturaDao = new ItemEstruturaDao(request);
489     TipoAcompanhamentoTa tipoAcompanhamento = (TipoAcompanhamentoTa) buscar(TipoAcompanhamentoTa.class, aref.getTipoAcompanhamentoTa().getCodTa());
490 
491     String indMonitoramento = "";
492 
493     if ("S".equals(tipoAcompanhamento.getIndMonitoramentoTa()) && "N".equals(tipoAcompanhamento.getIndNaoMonitoramentoTa())) {
494       indMonitoramento = "S";
495     }
496     else if ("N".equals(tipoAcompanhamento.getIndMonitoramentoTa()) && "S".equals(tipoAcompanhamento.getIndNaoMonitoramentoTa())) {
497       indMonitoramento = "N";
498     }
499 
500     List listNivelPlanejamentoTipoAcomp = new ArrayList(tipoAcompanhamento.getSisAtributoSatbs());
501 
502     List retorno = new ArrayList();
503     retorno.addAll(itensSelecionadosEmTela);
504 
505     for (Iterator it = itensSelecionadosEmTela.iterator(); it.hasNext();) {
506       ItemEstruturaIett itemTela = (ItemEstruturaIett) it.next();
507       List descendentes = itemEstruturaDao.getDescendentes(itemTela, true);
508 
509       for (Iterator itDescendentes = descendentes.iterator(); itDescendentes.hasNext();) {
510         ItemEstruturaIett itemDescendente = (ItemEstruturaIett) itDescendentes.next();
511         if (itemDescendente.getItemEstrtIndResulIettrs() != null && itemDescendente.getItemEstrtIndResulIettrs().size() > 0 && !retorno.contains(itemDescendente) && (itemDescendente.getSituacaoSit() == null || (!"S".equals(itemDescendente.getSituacaoSit().getIndConcluidoSit()) && !"S".equals(itemDescendente.getSituacaoSit().getIndSemAcompanhamentoSit())))) {
512 
513           // verificação monitoramento
514           if (!"".equals(indMonitoramento)) {
515             if (!indMonitoramento.equals(itemDescendente.getIndMonitoramentoIett())) {
516               // ignora o item
517               continue;
518             }
519           }
520 
521           // verificação dos níveis de planejamento
522           boolean nivelOk = false;
523 
524           if (listNivelPlanejamentoTipoAcomp != null && listNivelPlanejamentoTipoAcomp.size() > 0) {
525             if (itemDescendente.getItemEstruturaNivelIettns() != null && itemDescendente.getItemEstruturaNivelIettns().size() > 0) {
526               Iterator itNiveis = itemDescendente.getItemEstruturaNivelIettns().iterator();
527               while (itNiveis.hasNext() && !nivelOk) {
528                 SisAtributoSatb nivel = (SisAtributoSatb) itNiveis.next();
529 
530                 if (listNivelPlanejamentoTipoAcomp.contains(nivel)) {
531                   nivelOk = true;
532                 }
533 
534               }
535             }
536           }
537           else {
538             nivelOk = true;
539           }
540 
541           if (!nivelOk) {
542             // ignora o item
543             continue;
544           }
545 
546           retorno.add(itemDescendente);
547         }
548       }
549 
550     }
551     return retorno;
552   }
553 
554   /**
555    * @param limite
556    */
557   private void setPKAcompReferenciaItemLimite(AcompRefItemLimitesArli limite) {
558     AcompRefItemLimitesArliPK pk = new AcompRefItemLimitesArliPK();
559     pk.setCodAri(limite.getAcompReferenciaItemAri().getCodAri());
560     pk.setCodTpfa(limite.getTipoFuncAcompTpfa().getCodTpfa());
561     limite.setComp_id(pk);
562   }
563 
564   /**
565    * Cria um novo objeto AcompReferenciaItemAri baseado em um Item e um
566    * Acompanhamento
567    * @param acompanhamento
568    * @param iett
569    * @param listaItensSelecionadosTela
570    */
571   private AcompReferenciaItemAri criaNovoAcompReferenciaItemAri(AcompReferenciaAref acompanhamento, ItemEstruturaIett iett, HttpServletRequest request, List listaItensSelecionadosTela, UsuarioUsu usuario) throws ECARException {
572     TipoAcompanhamentoDao tipoAcompanhamentoDao = new TipoAcompanhamentoDao(null);
573     AcompRelatorioDao acompRelatorioDao = new AcompRelatorioDao(request);
574 
575     TipoAcompanhamentoTa taTemp = (TipoAcompanhamentoTa) tipoAcompanhamentoDao.buscar(TipoAcompanhamentoTa.class, acompanhamento.getTipoAcompanhamentoTa().getCodTa());
576     AcompReferenciaItemAri acompReferenciaItem = new AcompReferenciaItemAri();
577 
578     acompReferenciaItem.setItemEstruturaIett(iett);
579     acompReferenciaItem.setAcompReferenciaAref(acompanhamento);
580 
581     acompReferenciaItem.setIndItemMonitoradosAri(acompanhamento.getTipoAcompanhamentoTa().getIndMonitoramentoTa());
582 
583     acompReferenciaItem.setDataLimiteAcompFisicoAri(acompanhamento.getDataLimiteAcompFisicoAref());
584     acompReferenciaItem.setCodUsuincAri(usuario.getCodUsu());
585     acompReferenciaItem.setDataInclusaoAri(Data.getDataAtual());
586     acompReferenciaItem.setDataInicioAri(acompanhamento.getDataInicioAref());
587 
588     /* salvar item como EM EDICAO */
589     acompReferenciaItem.setStatusRelatorioSrl((StatusRelatorioSrl) this.buscar(StatusRelatorioSrl.class, Long.valueOf(STATUS_EM_EDICAO)));
590 
591     /* grava as funções de acompanhamento */
592 
593     acompReferenciaItem.setAcompRefItemLimitesArlis(new HashSet());
594     acompReferenciaItem.setAcompRelatorioArels(new HashSet());
595 
596     Iterator it = new ItemEstUsutpfuacDao(request).getFuacEmitePosicaoOrderByFuncAcomp(iett).iterator();
597     while (it.hasNext()) {
598       TipoFuncAcompTpfa funcAcomp = ((ItemEstUsutpfuacIettutfa) it.next()).getTipoFuncAcompTpfa();
599 
600       AcompRefLimitesArl acompRefLimite = getAcompRefLimitesByAcompReferenciaTipoFuncAcomp(funcAcomp, acompanhamento);
601       if (acompRefLimite != null) {
602         AcompRefItemLimitesArli acompRefItemLimite = new AcompRefItemLimitesArli();
603         acompRefItemLimite.setAcompReferenciaItemAri(acompReferenciaItem);
604         acompRefItemLimite.setTipoFuncAcompTpfa(funcAcomp);
605         acompRefItemLimite.setDataLimiteArli(acompRefLimite.getDataLimiteArl());
606         // adiciona na lista de ARLI
607         acompReferenciaItem.getAcompRefItemLimitesArlis().add(acompRefItemLimite);
608       }
609 
610       // Só gerar AREL para itens que foram selecionados na tela
611       if (listaItensSelecionadosTela.contains(iett)) {
612         /*
613          * Só gerar AcompRelatorioArel para as funções cadastradas no tipo de
614          * acompanhamento
615          */
616         Iterator itTafc = taTemp.getTipoAcompFuncAcompTafcs().iterator();
617         while (itTafc.hasNext()) {
618           TipoAcompFuncAcompTafc tafc = (TipoAcompFuncAcompTafc) itTafc.next();
619           // verifica a função e se ela não está como "ignorar"
620           if (tafc.getTipoFuncAcompTpfa().equals(funcAcomp) && (tafc.getIndObrigatorio().equals("S") || tafc.getIndOpcional().equals("S"))) {
621 
622             /* para cada função de acompanhamento gerar um AcompRelatorioArel */
623             AcompRelatorioArel relatorio = acompRelatorioDao.criaNovoAcompRelatorio(acompReferenciaItem, usuario, funcAcomp);
624             if (relatorio != null) {
625               acompReferenciaItem.getAcompRelatorioArels().add(relatorio);
626             }
627           }
628         }
629 
630       }
631     }
632 
633     return acompReferenciaItem;
634 
635   }
636 
637   /**
638    * Devolve uma lista de ItemEstruturaIett correspondentes aos itens de um
639    * acompanhamento
640    * @param acompanhamento
641    * @return
642    */
643   public List getListaItensAcompanhamento(AcompReferenciaAref acompanhamento) throws ECARException {
644 
645     try {
646       StringBuilder query = new StringBuilder("select ari.itemEstruturaIett from AcompReferenciaItemAri ari").append(" where ari.acompReferenciaAref.codAref = ?").append(" and ari.itemEstruturaIett.indAtivoIett = 'S'");
647 
648       Query q = session.createQuery(query.toString());
649 
650       q.setLong(0, acompanhamento.getCodAref().longValue());
651 
652       return q.list();
653     } catch (HibernateException e) {
654       this.logger.error(e);
655       throw new ECARException(e);
656     }
657   }
658 
659   /**
660    * Altera um registro de Acompanhamento de Referência e suas datas Limite
661    * Altera as datas limite do acompanhamento de todos os descendentes do item
662    * @param request
663    * @throws ECARException
664    */
665   public void alterar(HttpServletRequest request) throws ECARException {
666     inicializarLogBean();
667     Transaction tx = null;
668 
669     try {
670 
671       tx = session.beginTransaction();
672 
673       List objetosParaAlterar = new ArrayList();
674 
675       AcompReferenciaItemAri acompReferenciaItem = (AcompReferenciaItemAri) this.buscar(AcompReferenciaItemAri.class, Long.valueOf(Pagina.getParamStr(request, "codAri")));
676 
677       String novoCodSrl = Pagina.getParamStr(request, "codSrl");
678 
679       if ("liberarRecuperar".equals(Pagina.getParamStr(request, "botaoClicado")) && novoCodSrl.equals(String.valueOf(acompReferenciaItem.getStatusRelatorioSrl().getCodSrl().intValue()))) {
680 
681         if (String.valueOf(STATUS_LIBERADO).equals(novoCodSrl)) {
682           throw new ECARException("acompanhamento.dadosBasicos.liberar.jaEfetuado");
683         }
684         else {
685           throw new ECARException("acompanhamento.dadosBasicos.recuperar.jaEfetuado");
686         }
687       }
688 
689       /* se está em edição, altera campos */
690       if (acompReferenciaItem.getStatusRelatorioSrl() == null || (acompReferenciaItem.getStatusRelatorioSrl() != null && acompReferenciaItem.getStatusRelatorioSrl().getCodSrl().intValue() == STATUS_EM_EDICAO)) {
691 
692         acompReferenciaItem.setDataLimiteAcompFisicoAri(Pagina.getParamDataBanco(request, "dataLimiteAcompFisico"));
693         acompReferenciaItem.setCodUsuUltManutAri(Long.valueOf(Pagina.getParamStr(request, "codUsuario")));
694         acompReferenciaItem.setDataUltManutAri(Data.getDataAtual());
695         acompReferenciaItem.setDataInicioAri(Pagina.getParamDataBanco(request, "dataInicioAri"));
696         acompReferenciaItem.setStatusRelatorioSrl((StatusRelatorioSrl) this.buscar(StatusRelatorioSrl.class, Long.valueOf(Pagina.getParamStr(request, "codSrl"))));
697 
698         objetosParaAlterar.add(acompReferenciaItem);
699 
700         Iterator it = acompReferenciaItem.getAcompRefItemLimitesArlis().iterator();
701         while (it.hasNext()) {
702           AcompRefItemLimitesArli limite = (AcompRefItemLimitesArli) it.next();
703           limite.setDataLimiteArli(Pagina.getParamDataBanco(request, "dataLimite" + limite.getTipoFuncAcompTpfa().getCodTpfa()));
704           objetosParaAlterar.add(limite);
705         }
706 
707       }
708       else {
709         /* senão só atualiza status */
710         acompReferenciaItem.setCodUsuUltManutAri(Long.valueOf(Pagina.getParamStr(request, "codUsuario")));
711         acompReferenciaItem.setDataUltManutAri(Data.getDataAtual());
712         acompReferenciaItem.setStatusRelatorioSrl((StatusRelatorioSrl) this.buscar(StatusRelatorioSrl.class, Long.valueOf(Pagina.getParamStr(request, "codSrl"))));
713         objetosParaAlterar.add(acompReferenciaItem);
714       }
715 
716       /*
717        * busca os descendentes do item a altera os acompanhamentos feitos para
718        * estes filhos
719        */
720       List descendentes = new ItemEstruturaDao(request).getDescendentes(acompReferenciaItem.getItemEstruturaIett(), true);
721 
722       for (Iterator it = descendentes.iterator(); it.hasNext();) {
723         ItemEstruturaIett item = (ItemEstruturaIett) it.next();
724         AcompReferenciaItemAri acompanhamentoFilho = this.getAcompReferenciaItemByItemEstruturaIett(acompReferenciaItem.getAcompReferenciaAref(), item);
725 
726         if (acompanhamentoFilho != null) {
727           acompanhamentoFilho.setDataLimiteAcompFisicoAri(Pagina.getParamDataBanco(request, "dataLimiteAcompFisico"));
728           acompanhamentoFilho.setCodUsuUltManutAri(Long.valueOf(Pagina.getParamStr(request, "codUsuario")));
729           acompanhamentoFilho.setDataUltManutAri(Data.getDataAtual());
730           acompanhamentoFilho.setDataInicioAri(Pagina.getParamDataBanco(request, "dataInicioAri"));
731           Iterator itDatasFilho = acompanhamentoFilho.getAcompRefItemLimitesArlis().iterator();
732           while (itDatasFilho.hasNext()) {
733             AcompRefItemLimitesArli limite = (AcompRefItemLimitesArli) itDatasFilho.next();
734             if (!"".equals(Pagina.getParamStr(request, "dataLimite" + limite.getTipoFuncAcompTpfa().getCodTpfa()))) {
735               limite.setDataLimiteArli(Pagina.getParamDataBanco(request, "dataLimite" + limite.getTipoFuncAcompTpfa().getCodTpfa()));
736               objetosParaAlterar.add(limite);
737             }
738           }
739           objetosParaAlterar.add(acompanhamentoFilho);
740         }
741       }
742 
743       Iterator itAlt = objetosParaAlterar.iterator();
744       while (itAlt.hasNext()) {
745         session.update(itAlt.next());
746       }
747 
748       tx.commit();
749 
750       if (logBean != null) {
751         Iterator it = objetosParaAlterar.iterator();
752         logBean.setCodigoTransacao(Data.getHoraAtual(false));
753         logBean.setOperacao("ALT");
754         while (it.hasNext()) {
755           logBean.setObj(it.next());
756           loggerAuditoria.info(logBean.toString());
757         }
758       }
759     } catch (HibernateException e) {
760       if (tx != null)
761         try {
762           tx.rollback();
763         } catch (HibernateException r) {
764           this.logger.error(r);
765           throw new ECARException("erro.hibernateException");
766         }
767       this.logger.error(e);
768       throw new ECARException("erro.hibernateException");
769     }
770 
771   }
772 
773   /**
774    * Libera uma lista de AcompReferenciaItemAris, enviando e-mail aos
775    * responsáveis (se configurado no sistema). Retorna true se conseguiu efetuar
776    * a liberação em todos os itens; false caso contrário.
777    * @author aleixo
778    * @since 25/06/2007
779    * @param acompRefItens
780    * @param usuarioLogado
781    * @param enviarEmail
782    * @param configMailCfgm
783    * @return boolean
784    * @throws ECARException
785    */
786   public boolean liberarAcompanhamentos(Set acompRefItens, UsuarioUsu usuarioLogado, boolean enviarEmail, ConfigMailCfgm configMailCfgm) throws ECARException {
787     boolean retorno = false;
788     if (acompRefItens != null && !acompRefItens.isEmpty()) {
789       StatusRelatorioSrl statusLiberado = (StatusRelatorioSrl) this.buscar(StatusRelatorioSrl.class, Long.valueOf(STATUS_LIBERADO));
790       TfuncacompConfigmailTfacfgmDAO tfuncacompConfigmailTfacfgmDAO = new TfuncacompConfigmailTfacfgmDAO();
791       UsuarioDao usuDao = new UsuarioDao();
792       EmpresaDao empDAO = new EmpresaDao(request);
793       List listArisAlterados = new ArrayList();
794 
795       Transaction tx = null;
796 
797       try {
798 
799         tx = session.beginTransaction();
800 
801         for (Iterator it = acompRefItens.iterator(); it.hasNext();) {
802           AcompReferenciaItemAri ari = (AcompReferenciaItemAri) it.next();
803           if (ari.getStatusRelatorioSrl() == null || (ari.getStatusRelatorioSrl() != null && ari.getStatusRelatorioSrl().getCodSrl().intValue() == STATUS_EM_EDICAO)) {
804             ari.setDataUltManutAri(Data.getDataAtual());
805             ari.setCodUsuUltManutAri(usuarioLogado.getCodUsu());
806             ari.setStatusRelatorioSrl(statusLiberado);
807 
808             listArisAlterados.add(ari);
809 
810             session.update(ari);
811           }
812         }
813 
814         tx.commit();
815 
816         if (enviarEmail) {
817 
818           for (Iterator itList = listArisAlterados.iterator(); itList.hasNext();) {
819             AcompReferenciaItemAri ari = (AcompReferenciaItemAri) itList.next();
820 
821             List listUtfas = new ArrayList(ari.getItemEstruturaIett().getItemEstUsutpfuacIettutfas());
822             for (Iterator itUtfa = listUtfas.iterator(); itUtfa.hasNext();) {
823 
824               ItemEstUsutpfuacIettutfa itemEstUsutpfacIetutfa = (ItemEstUsutpfuacIettutfa) itUtfa.next();
825 
826               TfuncacompConfigmailTfacfgmPK tfcfgmPK = new TfuncacompConfigmailTfacfgmPK();
827               tfcfgmPK.setConfigMailCfgm(configMailCfgm);
828               tfcfgmPK.setTipoFuncAcompTpfa(itemEstUsutpfacIetutfa.getTipoFuncAcompTpfa());
829 
830               TfuncacompConfigmailTfacfgm tfcfm = (TfuncacompConfigmailTfacfgm) tfuncacompConfigmailTfacfgmDAO.buscar(TfuncacompConfigmailTfacfgm.class, tfcfgmPK);
831 
832               if ("S".equals(tfcfm.getEnviaMailTfacfgm())) {
833 
834                 // UsuarioUsu usu = (UsuarioUsu) usuDao.buscar(UsuarioUsu.class,
835                 // itemEstUsutpfacIetutfa.getComp_id().getCodUsu());
836 
837                 List usuarios = new ArrayList();
838                 if (itemEstUsutpfacIetutfa.getUsuarioUsu() != null) {
839                   usuarios.add((UsuarioUsu) usuDao.buscar(UsuarioUsu.class, itemEstUsutpfacIetutfa.getUsuarioUsu().getCodUsu()));
840                 }
841                 else if (itemEstUsutpfacIetutfa.getSisAtributoSatb() != null) {
842                   usuarios.addAll(usuDao.getUsuariosBySisAtributoSatb(itemEstUsutpfacIetutfa.getSisAtributoSatb()));
843                 }
844 
845                 Iterator itUsu = usuarios.iterator();
846 
847                 while (itUsu.hasNext()) {
848 
849                   UsuarioUsu usu = (UsuarioUsu) itUsu.next();
850 
851                   // controle para não enviar e-mail para o usuário logado
852                   if (usu.equals(usuarioLogado)) {
853                     continue;
854                   }
855 
856                   Long codIett = Long.valueOf(0);
857                   String textoMail = "";
858                   String assunto = "";
859                   String remetente = "";
860 
861                   if (configMailCfgm.getTextosSiteMail() != null) {
862                     textoMail = configMailCfgm.getTextosSiteMail().getTextoTxts();
863                     assunto = configMailCfgm.getTextosSiteMail().getDescricaoUsoTxts();
864                     remetente = configMailCfgm.getTextosSiteMail().getEmailResponsavelTxts();
865                   }
866 
867                   // se nao tem remetente configurado no textoSite, pega da
868                   // empresa.
869                   if ("".equals(remetente) || remetente == null) {
870                     List listEmpresa = new ArrayList();
871                     EmpresaEmp emp = null;
872 
873                     listEmpresa = empDAO.listar(EmpresaEmp.class, null);
874 
875                     for (Iterator itEmp = listEmpresa.iterator(); itEmp.hasNext();) {
876                       emp = (EmpresaEmp) itEmp.next();
877                     }
878 
879                     remetente = emp.getEmailContatoEmp();
880                   }
881 
882                   if (ari.getItemEstruturaIett() != null)
883                     codIett = ari.getItemEstruturaIett().getCodIett();
884 
885                   AgendadorEmail ae = new AgendadorEmail();
886 
887                   String descricaoEvento = null;
888                   String html = null;
889 
890                   descricaoEvento = "Liberação/Recuperação de Acompanhamento";
891                   String labelQuemAlterou = AgendadorEmail.LABEL_WHO_CHANGE_LIBERACAO;
892                   html = ae.montaEmail(textoMail, usu.getNomeUsu(), usuarioLogado.getNomeUsuSent(), codIett, descricaoEvento, null, null, labelQuemAlterou, ari.getAcompReferenciaAref().getTipoAcompanhamentoTa().getDescricaoTa()).toString();
893                   ae.enviarEmail(assunto, remetente, html, usu.getEmail1UsuSent(), "", "", usu);
894                 }
895               }
896             }
897           }
898         }
899 
900         retorno = true;
901       } catch (HibernateException e) {
902         if (tx != null)
903           try {
904             tx.rollback();
905           } catch (HibernateException r) {
906             this.logger.error(r);
907             throw new ECARException("erro.hibernateException");
908           }
909         this.logger.error(e);
910         throw new ECARException("erro.hibernateException");
911       }
912     }
913     return retorno;
914   }
915 
916   /**
917    * Verifica se existe algum acompanhamento em edição em um período.
918    * @author aleixo
919    * @param aref - Período
920    * @return
921    * @throws ECARException
922    */
923   public boolean verificarAcompanhamentoEmEdicao(AcompReferenciaAref aref) throws ECARException {
924     if (aref.getAcompReferenciaItemAris() != null && !aref.getAcompReferenciaItemAris().isEmpty()) {
925       for (Iterator it = aref.getAcompReferenciaItemAris().iterator(); it.hasNext();) {
926         AcompReferenciaItemAri ari = (AcompReferenciaItemAri) it.next();
927         // Se existir algum ari em edição, retorna true (o acompanhamento está
928         // em edição (pode ser liberado).
929         if (ari.getStatusRelatorioSrl() == null || (ari.getStatusRelatorioSrl() != null && ari.getStatusRelatorioSrl().getCodSrl().intValue() == STATUS_EM_EDICAO)) {
930           return true;
931         }
932       }
933 
934     }
935     return false;
936   }
937 
938   /**
939    * Verifica a existência do AcompanhamentoReferencia de um determinado item.
940    * Se existir, retorna o objeto AcompReferenciaItemAri. Senão, retorna null
941    * @param acompanhamento
942    * @param item
943    * @return
944    * @throws ECARException
945    */
946   public AcompReferenciaItemAri getAcompReferenciaItemByItemEstruturaIett(AcompReferenciaAref acompanhamento, ItemEstruturaIett item) throws ECARException {
947     try {
948       if (acompanhamento.getCodAref() != null) {
949         StringBuilder query = new StringBuilder("select ari from AcompReferenciaItemAri ari").append(" where ari.itemEstruturaIett.codIett = :codIett").append(" and ari.acompReferenciaAref.codAref = :codAref").append(" and ari.itemEstruturaIett.indAtivoIett = 'S'");
950 
951         Query q = this.getSession().createQuery(query.toString());
952         q.setLong("codIett", item.getCodIett().longValue());
953         q.setLong("codAref", acompanhamento.getCodAref().longValue());
954         List retorno = q.list();
955 
956         if (retorno == null || retorno.isEmpty()) {
957           return null;
958         }
959         else {
960           return (AcompReferenciaItemAri) retorno.get(0);
961         }
962       }
963       else {
964         return null;
965       }
966     } catch (HibernateException e) {
967       this.logger.error(e);
968       throw new ECARException(e);
969     }
970   }
971 
972   /**
973    * Retorna um registro de AcompRefLimitesArl a partir de uma função de
974    * Acompanhamento e um Acompanhamento
975    * @param funcAcomp
976    * @param acompanhamento
977    * @return
978    * @throws ECARException
979    */
980   public AcompRefLimitesArl getAcompRefLimitesByAcompReferenciaTipoFuncAcomp(TipoFuncAcompTpfa funcAcomp, AcompReferenciaAref acompanhamento) throws ECARException {
981     AcompRefLimitesArlPK pk = new AcompRefLimitesArlPK();
982     pk.setCodAref(acompanhamento.getCodAref());
983     pk.setCodTpfa(funcAcomp.getCodTpfa());
984     try {
985       AcompRefLimitesArl acomp = (AcompRefLimitesArl) this.buscar(AcompRefLimitesArl.class, pk);
986       return acomp;
987     } catch (ECARException e) {
988       // não é necessário lançar exceção aqui
989       return null;
990     }
991 
992   }
993 
994   /**
995    * Retorna um registro de AcompRefItemLimitesArli a partir de uma função de
996    * Acompanhamento e um Acompanhamento
997    * @param funcAcomp
998    * @param acompanhamento
999    * @return
1000    * @throws ECARException
1001    */
1002   public AcompRefItemLimitesArli getAcompRefItemLimitesByAcompReferenciaItemTipoFuncAcomp(TipoFuncAcompTpfa funcAcomp, AcompReferenciaItemAri acompanhamento) throws ECARException {
1003     AcompRefItemLimitesArliPK pk = new AcompRefItemLimitesArliPK();
1004     pk.setCodAri(acompanhamento.getCodAri());
1005     pk.setCodTpfa(funcAcomp.getCodTpfa());
1006     try {
1007       AcompRefItemLimitesArli acomp = (AcompRefItemLimitesArli) this.buscar(AcompRefItemLimitesArli.class, pk);
1008       return acomp;
1009     } catch (ECARException e) {
1010       this.logger.error(e);
1011       return null;
1012     }
1013 
1014   }
1015 
1016   /**
1017    * Retorna as funções de acompanhamento vinculadas a um Item de Acompanhamento
1018    * de Referência ordenadas hierarquicamento
1019    * @param acompReferenciaItem
1020    * @return
1021    * @throws ECARException
1022    */
1023   public List getTipoFuncAcompByAcompRefrenciaItem(AcompReferenciaItemAri acompReferenciaItem) throws ECARException {
1024     List retorno = new ArrayList();
1025     Iterator it = acompReferenciaItem.getAcompRefItemLimitesArlis().iterator();
1026     List funcoesEmitemPosicao = new TipoFuncAcompDao(request).getTipoFuncAcompEmitePosicao();
1027     List funcoesItem = new ArrayList();
1028     while (it.hasNext()) {
1029       TipoFuncAcompTpfa tipoFuncaoAcomp = ((AcompRefItemLimitesArli) it.next()).getTipoFuncAcompTpfa();
1030       funcoesItem.add(tipoFuncaoAcomp);
1031     }
1032 
1033     for (Iterator itFuncoesEmitemPosicao = funcoesEmitemPosicao.iterator(); itFuncoesEmitemPosicao.hasNext();) {
1034       TipoFuncAcompTpfa funcaoEmitePosicao = (TipoFuncAcompTpfa) itFuncoesEmitemPosicao.next();
1035       if (funcoesItem.contains(funcaoEmitePosicao))
1036         retorno.add(funcaoEmitePosicao);
1037     }
1038 
1039     return (List) new TipoFuncAcompDao(null).ordenarTpfaBySequencia(retorno, acompReferenciaItem.getItemEstruturaIett().getEstruturaEtt());
1040   }
1041 
1042   /**
1043    * Retorna objetos AcompRefLimitesArl vinculados a um AcompReferenciaItemAri
1044    * @param acompReferenciaItem
1045    * @return
1046    * @throws ECARException
1047    */
1048   public List getAcompRefItemLimitesArliByAcompRefrenciaItem(AcompReferenciaItemAri acompReferenciaItem) throws ECARException {
1049     List retorno = new ArrayList();
1050 
1051     TipoFuncAcompDao tipoFuncAcompDao = new TipoFuncAcompDao(request);
1052     List funcoesEmitemPosicao = tipoFuncAcompDao.ordenarTpfaBySequencia(tipoFuncAcompDao.getTipoFuncAcompEmitePosicao(), acompReferenciaItem.getItemEstruturaIett().getEstruturaEtt());
1053     List funcoesItem = new ArrayList();
1054     List limites = new ArrayList();
1055 
1056     for (Iterator it = acompReferenciaItem.getAcompRefItemLimitesArlis().iterator(); it.hasNext();) {
1057       AcompRefItemLimitesArli limite = (AcompRefItemLimitesArli) it.next();
1058       TipoFuncAcompTpfa tipoFuncaoAcomp = limite.getTipoFuncAcompTpfa();
1059       funcoesItem.add(tipoFuncaoAcomp);
1060       limites.add(limite);
1061     }
1062     for (Iterator itFuncoesEmitemPosicao = funcoesEmitemPosicao.iterator(); itFuncoesEmitemPosicao.hasNext();) {
1063       TipoFuncAcompTpfa funcaoEmitePosicao = (TipoFuncAcompTpfa) itFuncoesEmitemPosicao.next();
1064       if (funcoesItem.contains(funcaoEmitePosicao)) {
1065         retorno.add(limites.get(funcoesItem.indexOf(funcaoEmitePosicao)));
1066       }
1067     }
1068     return retorno;
1069   }
1070 
1071   /**
1072    * Retorna a mensagem a ser exibida quando o usuário clica em Liberar
1073    * Acompanhamento, avisando quais posições ainda não foram gravadas
1074    * @param acompReferenciaItem
1075    * @return
1076    * @throws ECARException
1077    */
1078   public String getMensagemAlertLiberarAcompanhamento(AcompReferenciaItemAri acompReferenciaItem) throws ECARException {
1079     String msg = "";
1080 
1081     for (Iterator it = getAcompRefItemLimitesArliByAcompRefrenciaItem(acompReferenciaItem).iterator(); it.hasNext();) {
1082       AcompRefItemLimitesArli limite = (AcompRefItemLimitesArli) it.next();
1083       boolean encontrou = false;
1084 
1085       for (Iterator itAcompRelatorio = acompReferenciaItem.getAcompRelatorioArels().iterator(); itAcompRelatorio.hasNext();) {
1086         AcompRelatorioArel acompRelatorio = (AcompRelatorioArel) itAcompRelatorio.next();
1087         if (acompRelatorio.getTipoFuncAcompTpfa().equals(limite.getTipoFuncAcompTpfa())) {
1088           if ("N".equals(acompRelatorio.getIndLiberadoArel())) {
1089             if (!"".equals(msg))
1090               msg += ", ";
1091             msg += limite.getTipoFuncAcompTpfa().getLabelPosicaoTpfa();
1092             encontrou = true;
1093           }
1094           else {
1095             if ("S".equals(acompRelatorio.getIndLiberadoArel()))
1096               encontrou = true;
1097           }
1098         }
1099       }
1100       if (!encontrou) {
1101         if (!"".equals(""))
1102           msg += ", ";
1103         msg += limite.getTipoFuncAcompTpfa().getLabelPosicaoTpfa();
1104       }
1105 
1106     }
1107     if (!"".equals(msg))
1108       msg += " não foi liberado. Concluir este acompanhamento? ";
1109     return msg;
1110   }
1111 
1112   /**
1113    * Verifica se um item deve ser acompanhado no mês atual, utilizando a data
1114    * inicial do item e sua periodicidade
1115    * @param item
1116    * @return
1117    */
1118   public boolean verificaAcompanhamentoItemMes(ItemEstruturaIett item, AcompReferenciaAref acompanhamento) {
1119 
1120     Date dataAtual = new Date();
1121     /* numero de meses de um ano: 0..11 + 1 = 12 meses */
1122     int numMeses = Data.getGregorianCalendar(dataAtual).getMaximum(Calendar.MONTH) + 1;
1123     /* numero do mes atual 0..11 */
1124 
1125     int mesRef = Integer.parseInt(acompanhamento.getMesAref());
1126 
1127     if (item.getPeriodicidadePrdc() == null || item.getDataInicioIett() == null) {
1128       return false;
1129     }
1130 
1131     /* periodicidade do item em meses */
1132     int periodicidade = item.getPeriodicidadePrdc().getNumMesesPrdc().intValue();
1133     /* numero do mes da data de inicio do item 0.11 */
1134     int mesInicioItem = Data.getGregorianCalendar(item.getDataInicioIett()).get(Calendar.MONTH) + 1;
1135 
1136     /*
1137      * verifica se o mes atual está entre os meses de periodicidade para o item
1138      * Faz um loop em quando periodos existirem testando se o mesAtual é igual a
1139      * um mes obtido ex Data = 02/02/2005 periodicidade = 3 -> 02, 05, 08, 11 ex
1140      * Data = 01/10/2005 periodicidade = 2 -> 12, 02, 04, 06, 08, 10 quantidade
1141      * de periodos: 12 / 1 = 12 periodos 12 / 5 = 2 + 1 periodos (1 6 11) soma
1142      * um por causa do resto
1143      */
1144 
1145     boolean ehMesPeriodicidade = false;
1146     int qtdPeriodos = numMeses / periodicidade + (numMeses % periodicidade == 0 ? 0 : 1);
1147     int mesInicioIett = mesInicioItem;
1148     for (int p = 0; p < qtdPeriodos && !ehMesPeriodicidade; p++, mesInicioIett = (mesInicioIett + periodicidade) % numMeses) {
1149       if (mesRef == mesInicioIett)
1150         ehMesPeriodicidade = true;
1151 
1152     }
1153     return ehMesPeriodicidade;
1154   }
1155 
1156   /**
1157    * Verifica a existência de um AcompReferenciaItem para o mesmo Item, Mês e
1158    * Ano, tanto para alteração, quanto para inclusão. Funcionamento: 1 -
1159    * Seleciona todos os AcompReferencia que possuem mesmo Mês e Ano, se não
1160    * encontrar, o método já retorna FALSE, indicando que não existe um
1161    * AcompReferenciaItem para o mesmo Item, Mês e Ano. 2 - Caso encontre,
1162    * realiza um buscar verificando se estou utilizando um AcompReferenciaItem,
1163    * caso não encontre retorna NULL satisfazendo a futura utilidade do objeto. 3
1164    * - Após isso, realiza um iterator nos AcompReferencia encontrados (item 1).
1165    * 4 - Durante o iterator faz um select verificando a existencia de todos os
1166    * AcompReferenciaItem para o AcompReferencia da lista e o Item passado como
1167    * parâmetro. 5 - Caso o select (item 4) retorne mais de um
1168    * AcompReferenciaItem quer dizer que existe outro AcompReferenciaItem para o
1169    * mesmo Item, Mês e Ano, e o método retorna TRUE. 6 - Caso o select (item 4)
1170    * retorne um AcompReferenciaItem, compara com o AcompReferenciaItem que caso
1171    * esteja utilizando (item 2), se for diferente, o método também retornará
1172    * TRUE, indicando que existe outro AcompReferenciaItem para o mesmo Item, Mês
1173    * e Ano.
1174    * @param item
1175    * @param acompReferencia
1176    * @return boolean
1177    * @throws HibernateException
1178    * @throws ECARException
1179    */
1180   public boolean verificaItemMesAno(ItemEstruturaIett item, AcompReferenciaAref acompReferencia) throws HibernateException, ECARException {
1181     StringBuilder select = new StringBuilder("select acompRef from AcompReferenciaAref as acompRef").append(" where acompRef.anoAref = :ano").append(" and acompRef.mesAref = :mes");
1182 
1183     Query q = this.getSession().createQuery(select.toString());
1184 
1185     q.setString("ano", acompReferencia.getAnoAref());
1186     q.setString("mes", acompReferencia.getMesAref());
1187 
1188     List listaAcompRef = q.list();
1189 
1190     if (listaAcompRef.size() <= 0) {
1191       // Não existe nenhum AcompReferencia para o mês e ano
1192       return false;
1193     }
1194     else {
1195       AcompReferenciaItemAri acompRefItem = new AcompReferenciaItemAri();
1196 
1197       // Buscar o acompRefItem que estou utilizando
1198       if (acompReferencia.getCodAref() != null) {
1199         acompRefItem = this.getAcompReferenciaItemByItemEstruturaIett(acompReferencia, item);
1200       }
1201       else {
1202         acompRefItem = null;
1203       }
1204 
1205       for (Iterator it = listaAcompRef.iterator(); it.hasNext();) {
1206         AcompReferenciaAref acompReferenciaLista = (AcompReferenciaAref) it.next();
1207         select = new StringBuilder("select acompRefItem from AcompReferenciaItemAri as acompRefItem ").append(" join acompRefItem.acompReferenciaAref as acompRef").append(" join acompRefItem.itemEstruturaIett as item").append(" where item.codIett = :codIett").append(" and item.indAtivoIett = 'S'").append(" and acompRef.codAref = :codAref");
1208 
1209         q = this.getSession().createQuery(select.toString());
1210 
1211         q.setLong("codIett", item.getCodIett().longValue());
1212         q.setLong("codAref", acompReferenciaLista.getCodAref().longValue());
1213 
1214         List listaAcompRefItem = q.list();
1215 
1216         if (listaAcompRefItem.size() > 0) {
1217           if (listaAcompRefItem.size() == 1) {
1218             // Existe, mas com possibilidade de ser a que eu estou utilizando
1219             if (!listaAcompRefItem.contains(acompRefItem)) {
1220               return true;
1221             }
1222           }
1223           else {
1224             // Existe AcompReferenciaItem para o item, mês e ano
1225             return true;
1226           }
1227         }
1228       }
1229     }
1230 
1231     return false;
1232   }
1233 
1234   /**
1235    * Verifica se os relatórios ou realizado físico do acompanhamento de um item
1236    * foi alterado
1237    * @param acompanhamento
1238    * @param item
1239    * @return
1240    * @throws ECARException
1241    */
1242   public boolean isAcompanhamentoAlterado(AcompReferenciaAref acompanhamento, ItemEstruturaIett item) throws ECARException {
1243     try {
1244       AcompReferenciaItemAri acompReferenciaItem = getAcompReferenciaItemByItemEstruturaIett(acompanhamento, item);
1245 
1246       if (acompReferenciaItem != null) {
1247         StringBuilder query = new StringBuilder("select ARF from AcompRealFisicoArf as ARF").append(" where ARF.qtdRealizadaArf is not null ").append(" and ARF.itemEstruturaIett.codIett = :codIett").append(" and ARF.itemEstruturaIett.indAtivoIett = 'S'").append(" and ARF.mesArf = :mes").append(" and ARF.anoArf = :ano");
1248 
1249         Query q = this.getSession().createQuery(query.toString());
1250 
1251         q.setLong("codIett", acompReferenciaItem.getItemEstruturaIett().getCodIett().longValue());
1252         q.setLong("mes", Long.valueOf(acompReferenciaItem.getAcompReferenciaAref().getMesAref()).longValue());
1253         q.setLong("ano", Long.valueOf(acompReferenciaItem.getAcompReferenciaAref().getAnoAref()).longValue());
1254 
1255         List listArf = q.list();
1256 
1257         if (listArf != null && listArf.size() > 0) {
1258           return true;
1259         }
1260         else {
1261           if (this.session.createFilter(acompReferenciaItem.getAcompRelatorioArels(), "where this.dataUltManutArel is not null").list().size() > 0) {
1262             return true;
1263           }
1264         }
1265       }
1266 
1267       return false;
1268 
1269     } catch (HibernateException e) {
1270       this.logger.error(e);
1271       throw new ECARException(e);
1272     }
1273   }
1274 
1275   /**
1276    * Retorna lista de AcompRealFisicoArf onde qtdRealizada não foram informadas
1277    * @param acompReferenciaItem
1278    * @return
1279    * @throws ECARException
1280    * @throws HibernateException
1281    */
1282   public List getAcompRealFisicoArfsComQtdNaoInformada(AcompReferenciaItemAri acompReferenciaItem) throws ECARException, HibernateException {
1283     try {
1284       StringBuilder query = new StringBuilder("select ARF from AcompRealFisicoArf as ARF").append(" where ARF.qtdRealizadaArf is null and ARF.situacaoSit is null").append(" and ARF.itemEstruturaIett.codIett = :codIett").append(" and ARF.itemEstruturaIett.indAtivoIett = 'S'").append(" and ARF.mesArf = :mes").append(" and ARF.anoArf = :ano");
1285 
1286       Query q = this.getSession().createQuery(query.toString());
1287 
1288       q.setLong("codIett", acompReferenciaItem.getItemEstruturaIett().getCodIett().longValue());
1289       q.setLong("mes", Long.valueOf(acompReferenciaItem.getAcompReferenciaAref().getMesAref()).longValue());
1290       q.setLong("ano", Long.valueOf(acompReferenciaItem.getAcompReferenciaAref().getAnoAref()).longValue());
1291 
1292       return q.list();
1293     } catch (Exception e) {
1294       throw new ECARException(e);
1295     }
1296   }
1297 
1298   /**
1299    * Retorna lista de Indicadores De Resultado que não estejam gravados em
1300    * AcompRealFisico que façam parte do Item do ARI.
1301    * @param acompReferenciaItem
1302    * @return
1303    * @throws Exception
1304    */
1305   public List getNovosIndicadores(AcompReferenciaItemAri acompReferenciaItem) throws Exception {
1306     AcompRealFisicoArf acompRealFisico = new AcompRealFisicoArf();
1307 
1308     List retorno = new ArrayList();
1309     List lista = new ArrayList();
1310     List listaIndAcompRealFisico = new ArrayList();
1311     List listaIndicadores = new ArrayList();
1312 
1313     AcompRealFisicoDao arfDao = new AcompRealFisicoDao(null);
1314     // List listArf = arfDao.buscarPorIett(
1315     // acompReferenciaItem.getItemEstruturaIett().getCodIett(),
1316     // Long.valueOf(acompReferenciaItem.getAcompReferenciaAref().getMesAref()),
1317     // Long.valueOf(acompReferenciaItem.getAcompReferenciaAref().getAnoAref()));
1318     List listArf = arfDao.getIndResulByAcompRefItemBySituacao(acompReferenciaItem, Dominios.TODOS, false);
1319 
1320     lista.addAll(listArf);
1321 
1322     for (Iterator it = lista.iterator(); it.hasNext();) {
1323       acompRealFisico = (AcompRealFisicoArf) it.next();
1324 
1325       int mesAref = Integer.valueOf(acompReferenciaItem.getAcompReferenciaAref().getMesAref()).intValue();
1326       int anoAref = Integer.valueOf(acompReferenciaItem.getAcompReferenciaAref().getAnoAref()).intValue();
1327       int mesArf = Integer.valueOf(acompRealFisico.getMesArf().toString()).intValue();
1328       int anoArf = Integer.valueOf(acompRealFisico.getAnoArf().toString()).intValue();
1329 
1330       if (anoArf == anoAref && mesArf == mesAref) {
1331         listaIndAcompRealFisico.add(acompRealFisico.getItemEstrtIndResulIettr());
1332       }
1333       else {
1334         if (acompRealFisico.getSituacaoSit() != null && "S".equals(acompRealFisico.getSituacaoSit().getIndConcluidoSit())) {
1335           listaIndAcompRealFisico.add(acompRealFisico.getItemEstrtIndResulIettr());
1336         }
1337       }
1338     }
1339 
1340     StringBuilder select = new StringBuilder("select indResul from ItemEstrtIndResulIettr as indResul").append(" where indResul.itemEstruturaIett.codIett = :codIett").append(" and indResul.itemEstruturaIett.indAtivoIett = 'S'");
1341 
1342     Query q = this.getSession().createQuery(select.toString());
1343 
1344     q.setLong("codIett", acompReferenciaItem.getItemEstruturaIett().getCodIett().longValue());
1345 
1346     listaIndicadores = q.list();
1347 
1348     /* Retira da primeira lista todos os da segunda lista, sobrando os novos */
1349     retorno.addAll(Util.diferenca(listaIndicadores, listaIndAcompRealFisico));
1350 
1351     return retorno;
1352   }
1353 
1354   /**
1355    * Metodo que retorna valor booleano para a Edição do
1356    * AcompanhamentoRealFisico. Para que seja editável: - deve possuir função com
1357    * InformaAndamento = "S"; - a data limite para acompanhamento não pode ser
1358    * atingida; - o ARI deve estar liberado.
1359    * @param usuario
1360    * @param acompReferenciaItem
1361    * @return
1362    * @throws ECARException
1363    */
1364   public void verificaEditarAcompRealFisico(UsuarioUsu usuario, AcompReferenciaItemAri acompReferenciaItem) throws ECARException {
1365     /* O USUÁRIO DEVE POSSUIR FUNÇÃO COM INFORMA ANDAMENTO = "S" */
1366     if (!new ItemEstUsutpfuacDao(request).getFuncaoAcompInfAndamento(usuario, acompReferenciaItem.getItemEstruturaIett()))
1367       throw new ECARException(new Mensagem(null).getMensagem("acompanhamento.realizadoFisico.naoEditar.usuarioSemPermissao"));
1368 
1369     // Estava com erro o tratamento da data limite (BUG 2133)
1370     Calendar dataAtual = Calendar.getInstance();
1371 
1372     dataAtual.clear(Calendar.HOUR);
1373     dataAtual.clear(Calendar.HOUR_OF_DAY);
1374     dataAtual.clear(Calendar.MINUTE);
1375     dataAtual.clear(Calendar.SECOND);
1376     dataAtual.clear(Calendar.MILLISECOND);
1377     dataAtual.clear(Calendar.AM_PM);
1378 
1379     Calendar dataLimite = Calendar.getInstance();
1380     dataLimite.setTime(acompReferenciaItem.getDataLimiteAcompFisicoAri());
1381 
1382     dataLimite.clear(Calendar.HOUR);
1383     dataLimite.clear(Calendar.HOUR_OF_DAY);
1384     dataLimite.clear(Calendar.MINUTE);
1385     dataLimite.clear(Calendar.SECOND);
1386     dataLimite.clear(Calendar.MILLISECOND);
1387     dataLimite.clear(Calendar.AM_PM);
1388 
1389     /* PODE SER EDITADO ATÉ A DATA LIMITE */
1390     if (dataAtual.compareTo(dataLimite) > 0)
1391       throw new ECARException(new Mensagem(null).getMensagem("acompanhamento.realizadoFisico.naoEditar.dataLimite"));
1392 
1393     /* O ARI DEVE ESTAR EM EDIÇÃO */
1394     if (acompReferenciaItem.getStatusRelatorioSrl().getCodSrl().intValue() == STATUS_LIBERADO)
1395       throw new ECARException(new Mensagem(null).getMensagem("acompanhamento.realizadoFisico.naoEditar.liberado"));
1396 
1397     /* SE DATA DE INICIO FOR NULA - (BUG 1935) */
1398     if (acompReferenciaItem.getItemEstruturaIett().getDataInicioIett() == null) {
1399       throw new ECARException(new Mensagem(null).getMensagem("acompanhamento.realizadoFisico.naoEditar.dataInicioNaoInformada"));
1400     }
1401 
1402     Calendar dataInicioIett = Calendar.getInstance();
1403     dataInicioIett.setTime(acompReferenciaItem.getItemEstruturaIett().getDataInicioIett());
1404 
1405     Calendar dataInicioAcomp = Calendar.getInstance();
1406     dataInicioAcomp.setTime(acompReferenciaItem.getDataInicioAri());
1407 
1408     dataInicioAcomp.clear(Calendar.HOUR);
1409     dataInicioAcomp.clear(Calendar.HOUR_OF_DAY);
1410     dataInicioAcomp.clear(Calendar.MINUTE);
1411     dataInicioAcomp.clear(Calendar.SECOND);
1412     dataInicioAcomp.clear(Calendar.MILLISECOND);
1413     dataInicioAcomp.clear(Calendar.AM_PM);
1414 
1415     // (BUG 1051): Mês/Ano da data de início do acompanhamento deve ser
1416     // posterior ou igual ao Mês/Ano da data informada no cadastro de programas
1417     // e ações.
1418     String mesAcomp = "";
1419     String mesIett = "";
1420 
1421     if (dataInicioAcomp.get(Calendar.MONTH) < 10) {
1422       mesAcomp = "0" + String.valueOf(dataInicioAcomp.get(Calendar.MONTH));
1423     }
1424     else {
1425       mesAcomp = String.valueOf(dataInicioAcomp.get(Calendar.MONTH));
1426     }
1427 
1428     if (dataInicioIett.get(Calendar.MONTH) < 10) {
1429       mesIett = "0" + String.valueOf(dataInicioIett.get(Calendar.MONTH));
1430     }
1431     else {
1432       mesIett = String.valueOf(dataInicioIett.get(Calendar.MONTH));
1433     }
1434 
1435     String inicioAcomp = String.valueOf(dataInicioAcomp.get(Calendar.YEAR)) + mesAcomp;
1436     String inicioIett = String.valueOf(dataInicioIett.get(Calendar.YEAR)) + mesIett;
1437 
1438     if (Integer.parseInt(inicioIett) > Integer.parseInt(inicioAcomp)) {
1439       throw new ECARException(new Mensagem(null).getMensagem("acompanhamento.realizadoFisico.naoEditar.dataInicioIettEAcomp"));
1440     }
1441 
1442     // String inicioAcomp = String.valueOf(dataInicioAcomp.get(Calendar.YEAR)) +
1443     // String.valueOf(dataInicioAcomp.get(Calendar.MONTH));
1444     // String inicioIett = String.valueOf(dataInicioIett.get(Calendar.YEAR)) +
1445     // String.valueOf(dataInicioIett.get(Calendar.MONTH));
1446     //
1447     // if(Integer.parseInt(inicioIett) > Integer.parseInt(inicioAcomp)) {
1448     // throw new ECARException(new
1449     // Mensagem(null).getMensagem("acompanhamento.realizadoFisico.naoEditar.dataInicioIettEAcomp"));
1450     // }
1451 
1452     // (BUG 1051): Data atual deve ser posterior ou igual a data de início do
1453     // acompanhamento
1454     if (dataAtual.before(dataInicioAcomp)) {
1455       throw new ECARException(new Mensagem(null).getMensagem("acompanhamento.realizadoFisico.naoEditar.dataAtualAnteriorDataInicioAcompanhamento"));
1456     }
1457   }
1458 
1459   public boolean podeAcessarAri(UsuarioUsu usuario, AcompReferenciaItemAri acompReferenciaItem) throws ECARException {
1460     Set usuariosPermitidos = acompReferenciaItem.getItemEstruturaIett().getItemEstUsutpfuacIettutfas();
1461     for (Iterator it = usuariosPermitidos.iterator(); it.hasNext();) {
1462       ItemEstUsutpfuacIettutfa fuac = (ItemEstUsutpfuacIettutfa) it.next();
1463       if (fuac.getUsuarioUsu() != null) {
1464         if (fuac.getUsuarioUsu().equals(usuario)) {
1465           return true;
1466         }
1467       }
1468       else if (fuac.getSisAtributoSatb() != null) {
1469         UsuarioDao usuDao = new UsuarioDao();
1470         Iterator itUsu = usuDao.getUsuariosBySisAtributoSatb(fuac.getSisAtributoSatb()).iterator();
1471         while (itUsu.hasNext()) {
1472           UsuarioUsu usu = (UsuarioUsu) itUsu.next();
1473           if (usu.equals(usuario)) {
1474             return true;
1475           }
1476         }
1477       }
1478     }
1479     return false;
1480   }
1481 
1482   /**
1483    * Variação do metodo getAcompRelatorioArelOrderByFuncaoAcomp para receber a
1484    * lista de funções de acompanhamento ordenadas hieraquicamente. Para ser
1485    * usada caso esse metodo tenha que ser chamado várias vezes para que não se
1486    * repita a busca pela hierarquia A List ordenacaoTpfaEstrutura é obtida pelo
1487    * método tipoFuncAcompDao.getFuncaoAcompOrderByEstruturas().
1488    * @param AcompReferenciaItemAri acompRefItem
1489    * @param List ordenacaoTpfaEstrutura
1490    * @return
1491    * @throws ECARException
1492    */
1493   public List getAcompRelatorioArelOrderByFuncaoAcomp(AcompReferenciaItemAri acompRefItem, List ordenacaoTpfaEstrutura) throws ECARException {
1494 
1495     List lResultado = new ArrayList();
1496     // funAcomp = (List) new
1497     // TipoFuncAcompDao(null).ordenarTpfaBySequencia(funAcomp,
1498     // acompRefItem.getItemEstruturaIett().getEstruturaEtt());
1499     TipoFuncAcompTpfa funcao;
1500     AcompRelatorioArel acompRelatorio;
1501 
1502     if (acompRefItem != null && acompRefItem.getAcompRelatorioArels() != null) {
1503 
1504       for (Iterator itOrd = ordenacaoTpfaEstrutura.iterator(); itOrd.hasNext();) {
1505 
1506         OrdenacaoTpfaEstrutura ord = (OrdenacaoTpfaEstrutura) itOrd.next();
1507 
1508         if (acompRefItem.getItemEstruturaIett().getEstruturaEtt().equals(ord.getEstrutura())) {
1509           if (ord.getTipoFuncAcomp() != null && !ord.getTipoFuncAcomp().isEmpty()) {
1510 
1511             for (Iterator itFunc = ord.getTipoFuncAcomp().iterator(); itFunc.hasNext();) {
1512               funcao = (TipoFuncAcompTpfa) itFunc.next();
1513 
1514               for (Iterator itAcomp = acompRefItem.getAcompRelatorioArels().iterator(); itAcomp.hasNext();) {
1515                 acompRelatorio = (AcompRelatorioArel) itAcomp.next();
1516                 if (acompRelatorio.getTipoFuncAcompTpfa().getCodTpfa() == funcao.getCodTpfa()) {
1517                   lResultado.add(acompRelatorio);
1518                   break;
1519                 }
1520               }
1521             }
1522           }
1523         }
1524       }
1525     }
1526     return lResultado;
1527 
1528   }
1529 
1530   /**
1531    * Variação do metodo getAcompRelatorioArelOrderByFuncaoAcomp para vários
1532    * Arels para receber a lista de funções de acompanhamento ordenadas
1533    * hieraquicamente. Para ser usada caso esse metodo tenha que ser chamado
1534    * várias vezes para que não se repita a busca pela hierarquia A List
1535    * ordenacaoTpfaEstrutura é obtida pelo método
1536    * tipoFuncAcompDao.getFuncaoAcompOrderByEstruturas().
1537    * @param arels
1538    * @param ordenacaoTpfaEstrutura
1539    * @return List
1540    * @throws ECARException
1541    */
1542   public List getAcompRelatorioArelOrderByFuncaoAcomp(List arels, List ordenacaoTpfaEstrutura) throws ECARException {
1543 
1544     List lResultado = new ArrayList();
1545 
1546     if (arels != null && !arels.isEmpty()) {
1547 
1548       for (Iterator itOrd = ordenacaoTpfaEstrutura.iterator(); itOrd.hasNext();) {
1549         OrdenacaoTpfaEstrutura ord = (OrdenacaoTpfaEstrutura) itOrd.next();
1550         if (ord.getTipoFuncAcomp() != null && !ord.getTipoFuncAcomp().isEmpty()) {
1551           /* loop nas funcoes em ordem de filho para pai */
1552 
1553           for (Iterator itFunc = ord.getTipoFuncAcomp().iterator(); itFunc.hasNext();) {
1554             TipoFuncAcompTpfa funcao = (TipoFuncAcompTpfa) itFunc.next();
1555 
1556             for (Iterator itAcomp = arels.iterator(); itAcomp.hasNext();) {
1557               AcompRelatorioArel arel = (AcompRelatorioArel) itAcomp.next();
1558               if (arel.getTipoFuncAcompTpfa().getCodTpfa() == funcao.getCodTpfa() && arel.getAcompReferenciaItemAri().getItemEstruturaIett().getEstruturaEtt().equals(ord.getEstrutura())) {
1559                 lResultado.add(arel);
1560               }
1561             }
1562           }
1563         }
1564       }
1565     }
1566     return lResultado;
1567 
1568   }
1569 
1570   /**
1571    * Devolve a lista de AcompRelatorioArel ordenadas de acordo com a hierarquia
1572    * de funcoes de acompanhamento de filho para pai, ou seja, do mais fraco para
1573    * o mais forte na hierarquia
1574    * @param AcompReferenciaItemAri acompRefItem
1575    * @return
1576    */
1577   public List getAcompRelatorioArelOrderByFuncaoAcomp(AcompReferenciaItemAri acompRefItem) throws ECARException {
1578 
1579     TipoFuncAcompDao tipoFuncAcompDao = new TipoFuncAcompDao(request);
1580 
1581     List lResultado = new ArrayList();
1582     List lFuncAcomp = tipoFuncAcompDao.ordenarTpfaBySequencia(tipoFuncAcompDao.getTipoFuncAcompEmitePosicao(), acompRefItem.getItemEstruturaIett().getEstruturaEtt());
1583 
1584     TipoFuncAcompTpfa funcao;
1585     AcompRelatorioArel acompRelatorio;
1586 
1587     if (acompRefItem != null && acompRefItem.getAcompRelatorioArels() != null) {
1588       /* loop nas funcoes em ordem de filho para pai */
1589       for (Iterator itFunc = lFuncAcomp.iterator(); itFunc.hasNext();) {
1590         funcao = (TipoFuncAcompTpfa) itFunc.next();
1591 
1592         for (Iterator itAcomp = acompRefItem.getAcompRelatorioArels().iterator(); itAcomp.hasNext();) {
1593           acompRelatorio = (AcompRelatorioArel) itAcomp.next();
1594           if (acompRelatorio.getTipoFuncAcompTpfa().getCodTpfa() == funcao.getCodTpfa()) {
1595             lResultado.add(acompRelatorio);
1596             break;
1597           }
1598         }
1599       }
1600     }
1601     return lResultado;
1602   }
1603 
1604   /**
1605    * Retorna todos os AcompReferenciaItem que possuam o mesmo Item do ARI
1606    * passado por parâmetro, ordenado por ano e mes.
1607    * @param acompRefItem
1608    * @return
1609    * @throws HibernateException
1610    */
1611   public List getReferenciaByItem(AcompReferenciaItemAri acompRefItem) throws HibernateException {
1612     String comparacao = "";
1613 
1614     if (acompRefItem.getAcompReferenciaAref().getOrgaoOrg() == null)
1615       comparacao = "is null";
1616     else
1617       comparacao = "= " + acompRefItem.getAcompReferenciaAref().getOrgaoOrg().getCodOrg();
1618 
1619     StringBuilder select = new StringBuilder();
1620 
1621     select.append("select ari from AcompReferenciaItemAri as ari ");
1622     select.append(" where ari.acompReferenciaAref.tipoAcompanhamentoTa.codTa = :codTa");
1623     select.append(" and ari.itemEstruturaIett.codIett = :codIett");
1624     select.append(" and ari.itemEstruturaIett.indAtivoIett = 'S'");
1625     select.append(" and ari.acompReferenciaAref.orgaoOrg " + comparacao);
1626     select.append(" order by ari.acompReferenciaAref.anoAref desc, ari.acompReferenciaAref.mesAref desc");
1627 
1628     Query q = this.session.createQuery(select.toString());
1629 
1630     q.setLong("codTa", acompRefItem.getAcompReferenciaAref().getTipoAcompanhamentoTa().getCodTa().longValue());
1631     q.setLong("codIett", acompRefItem.getItemEstruturaIett().getCodIett().longValue());
1632 
1633     return q.list();
1634   }
1635 
1636   /**
1637    * Retorna lista de itens que tenham um Acompanhamento
1638    * (AcompReferenciaItemAri) em algum dos Períodos de Referência
1639    * (AcompReferenciaAref) passados como parâmetro
1640    * @param periodosConsiderados Lista de AcompReferenciaAref
1641    * @return List de AcompReferenciaItemAri. lista vazia se não foi informado
1642    *         nenhum periodo
1643    * @throws ECARException
1644    */
1645   public List getItensAcompanhamentoInPeriodos(Collection periodosConsiderados, Collection niveisPlanejamento) throws ECARException {
1646 
1647     try {
1648 
1649       if (periodosConsiderados.size() > 0) {
1650 
1651         StringBuilder query = new StringBuilder("select distinct item from ItemEstruturaIett item ").append("join item.acompReferenciaItemAris aris join aris.acompReferenciaAref aref ").append("join item.itemEstruturaNivelIettns niveis ").append("where aref.codAref in (:listaAcompanhamentos)").append(" and item.indAtivoIett = 'S'");
1652 
1653         if (niveisPlanejamento.size() > 0)
1654           query.append(" and niveis.codSatb in (:listaNiveis)");
1655 
1656         Query queryItens = this.getSession().createQuery(query.toString());
1657 
1658         List listaCodigosAref = new ArrayList();
1659 
1660         for (Iterator it = periodosConsiderados.iterator(); it.hasNext();) {
1661           AcompReferenciaAref aReferencia = (AcompReferenciaAref) it.next();
1662           listaCodigosAref.add(aReferencia.getCodAref());
1663         }
1664 
1665         queryItens.setParameterList("listaAcompanhamentos", listaCodigosAref);
1666 
1667         if (niveisPlanejamento.size() > 0) {
1668           List listaCodigosNiveis = new ArrayList();
1669 
1670           for (Iterator itNiveis = niveisPlanejamento.iterator(); itNiveis.hasNext();) {
1671             SisAtributoSatb nivel = (SisAtributoSatb) itNiveis.next();
1672             listaCodigosNiveis.add(nivel.getCodSatb());
1673           }
1674           queryItens.setParameterList("listaNiveis", listaCodigosNiveis);
1675         }
1676 
1677         List listaItens = queryItens.list();
1678 
1679         List arvoreItens = new ItemEstruturaDao(request).getArvoreItens(listaItens, null);
1680 
1681         return arvoreItens;
1682 
1683       }
1684       else {
1685         // Se não foi informado nenhum periodo, retorna uma lista vazia
1686         return new ArrayList();
1687 
1688       }
1689 
1690     } catch (HibernateException e) {
1691       this.logger.error(e);
1692       throw new ECARException(e);
1693     }
1694 
1695   }
1696 
1697   /**
1698    * Retorna lista de itens que tenham um Acompanhamento
1699    * (AcompReferenciaItemAri) em algum dos Períodos de Referência
1700    * (AcompReferenciaAref) passados como parâmetro
1701    * @param periodosConsiderados Collection de AcompReferenciaAref
1702    * @param niveisPlanejamento Collection
1703    * @param orgaoResponsavel OrgaoOrg
1704    * @param usuarioUsu UsuarioUsu
1705    * @param gruposUsuario Set
1706    * @param codTipoAcompanhamento Long (se for nulo ignora o tipo de
1707    *          acompanhamento)
1708    * @param codIettPai Long (se for diferente de nulo, obtêm os filhos desse
1709    *          item)
1710    * @return List de AcompReferenciaItemAri. lista vazia se não foi informado
1711    *         nenhum periodo
1712    * @throws ECARException
1713    */
1714   public Object[] getItensAcompanhamentoInPeriodosByOrgaoResp(Collection periodosConsiderados, Collection niveisPlanejamento, OrgaoOrg orgaoResponsavel, UsuarioUsu usuarioUsu, Set gruposUsuario, Long codTipoAcompanhamento, Long codIettPai, Boolean itensSemInformacaoNivelPlanejamento, Long codCor, String indLiberados) throws ECARException {
1715     return getItensAcompanhamentoInPeriodosByOrgaoRespPaginado(periodosConsiderados, niveisPlanejamento, orgaoResponsavel, usuarioUsu, gruposUsuario, codTipoAcompanhamento, codIettPai, itensSemInformacaoNivelPlanejamento, codCor, indLiberados, -2, 1);
1716   }
1717 
1718   public Object[] getItensAcompanhamentoFiltroItens(Long codTipoAcompanhamento, Collection listPeriodosConsiderados, Collection listCores, Collection listTipoFuncoesAcompanhamento, UsuarioUsu usuario, Set gruposUsuario, Collection niveisPlanejamento, Boolean itensSemInformacaoNivelPlanejamento, OrgaoOrg orgaoResponsavel, HttpServletRequest request
1719 
1720   ) throws ECARException {
1721 
1722     try {
1723 
1724       // AcompRelatorioArel arel = null;
1725       // arel.getCor().getCodCor()
1726 
1727       ItemEstruturaDao itemDao = new ItemEstruturaDao(null);
1728       TipoAcompanhamentoDao tipoAcompanhamentoDao = new TipoAcompanhamentoDao(null);
1729 
1730       EstAtribTipoAcompEataDao estAtribTipoAcompEataDao = new EstAtribTipoAcompEataDao(request);
1731 
1732       List listEstruturas = estAtribTipoAcompEataDao.getEstruturaEhFiltro((TipoAcompanhamentoTa) this.buscar(TipoAcompanhamentoTa.class, codTipoAcompanhamento));
1733 
1734       if (listPeriodosConsiderados.size() > 0) {
1735         StringBuilder query = new StringBuilder("select arel.acompReferenciaItemAri from AcompRelatorioArel arel ");
1736 
1737         if (niveisPlanejamento != null && niveisPlanejamento.size() > 0) {
1738           query.append(" left join arel.acompReferenciaItemAri.itemEstruturaIett.itemEstruturaNivelIettns niveis ");
1739         }
1740 
1741         StringBuilder where = new StringBuilder("where arel.acompReferenciaItemAri.acompReferenciaAref.codAref in (:listaReferencias) ");
1742 
1743         if (itensSemInformacaoNivelPlanejamento.booleanValue()) {
1744           if (niveisPlanejamento != null && niveisPlanejamento.size() > 0) {
1745             where.append(" and (niveis.codSatb in (:listaNiveis) or niveis is null)");
1746           }
1747           else {
1748             where.append(" and niveis is null");
1749           }
1750         }
1751         else {
1752           if (niveisPlanejamento != null && niveisPlanejamento.size() > 0) {
1753             where.append(" and (niveis.codSatb in (:listaNiveis)  or niveis is null) ");
1754           }
1755         }
1756 
1757         if (orgaoResponsavel != null && orgaoResponsavel.getCodOrg() != null) {
1758           where.append(" and (arel.acompReferenciaItemAri.itemEstruturaIett.orgaoOrgByCodOrgaoResponsavel1Iett.codOrg = :orgaoResp)");
1759         }
1760 
1761         where.append("and (arel.acompReferenciaItemAri.itemEstruturaIett.indAtivoIett = 'S') ");
1762 
1763         if (codTipoAcompanhamento != null) {
1764           where.append("and (arel.acompReferenciaItemAri.acompReferenciaAref.tipoAcompanhamentoTa.codTa = :codTa) ");
1765         }
1766 
1767         if (listCores != null && listCores.size() > 0) {
1768           where.append("and arel.cor.codCor in (:cores) ");
1769         }
1770 
1771         if (listTipoFuncoesAcompanhamento != null && listTipoFuncoesAcompanhamento.size() > 0) {
1772           where.append("and arel.tipoFuncAcompTpfa.codTpfa in (:listTpFuncAcomp) ");
1773         }
1774 
1775         Query queryItens = this.getSession().createQuery(query.toString() + where.toString());
1776 
1777         if (niveisPlanejamento != null && niveisPlanejamento.size() > 0) {
1778           List<Long> listaCodigosNiveis = new ArrayList<Long>();
1779           for (Iterator itNiveis = niveisPlanejamento.iterator(); itNiveis.hasNext();) {
1780             SisAtributoSatb nivel = (SisAtributoSatb) itNiveis.next();
1781             listaCodigosNiveis.add(nivel.getCodSatb());
1782           }
1783           queryItens.setParameterList("listaNiveis", listaCodigosNiveis);
1784         }
1785 
1786         if (orgaoResponsavel != null && orgaoResponsavel.getCodOrg() != null) {
1787           queryItens.setLong("orgaoResp", orgaoResponsavel.getCodOrg().longValue());
1788         }
1789 
1790         if (codTipoAcompanhamento != null) {
1791           // listar ARIs conforme o tipo de acompanhamento passado como
1792           // parâmetro
1793           queryItens.setLong("codTa", codTipoAcompanhamento.longValue());
1794         }
1795 
1796         List<Long> listCodCores = new ArrayList<Long>();
1797         for (Iterator iter = listCores.iterator(); iter.hasNext();) {
1798           Cor cor = (Cor) iter.next();
1799           listCodCores.add(cor.getCodCor());
1800         }
1801 
1802         if (listCodCores != null && listCodCores.size() > 0) {
1803           // listar ARIs conforme as cores passadas como parâmetro
1804           queryItens.setParameterList("cores", listCodCores);
1805         }
1806 
1807         List<Long> listaCodigosAref = new ArrayList<Long>();
1808         for (Iterator iter = listPeriodosConsiderados.iterator(); iter.hasNext();) {
1809           AcompReferenciaAref aReferencia = (AcompReferenciaAref) iter.next();
1810           listaCodigosAref.add(aReferencia.getCodAref());
1811         }
1812 
1813         queryItens.setParameterList("listaReferencias", listaCodigosAref);
1814 
1815         List<Long> listCodTipoFuncoesAcompanhamento = new ArrayList<Long>();
1816         for (Iterator iter = listTipoFuncoesAcompanhamento.iterator(); iter.hasNext();) {
1817           TipoFuncAcompTpfa tipoFuncaoAcompanhamento = (TipoFuncAcompTpfa) iter.next();
1818           listCodTipoFuncoesAcompanhamento.add(tipoFuncaoAcompanhamento.getCodTpfa());
1819         }
1820 
1821         if (listTipoFuncoesAcompanhamento != null && listTipoFuncoesAcompanhamento.size() > 0) {
1822           queryItens.setParameterList("listTpFuncAcomp", listCodTipoFuncoesAcompanhamento);
1823         }
1824 
1825         List<ItemEstruturaIett> listaItens = new ArrayList<ItemEstruturaIett>();
1826         List listaAris = queryItens.list();
1827         Iterator itListaAris = listaAris.iterator();
1828 
1829         if (usuario == null) { // utilizado para o grafico.jsp - teste de
1830                                // performance
1831           while (itListaAris.hasNext()) {
1832             AcompReferenciaItemAri ari = (AcompReferenciaItemAri) itListaAris.next();
1833             listaItens.add(ari.getItemEstruturaIett());
1834           }
1835         }
1836         else {
1837           while (itListaAris.hasNext()) {
1838             AcompReferenciaItemAri ari = (AcompReferenciaItemAri) itListaAris.next();
1839             if (validaPermissao.permissaoLeituraAcompanhamento(ari, usuario, gruposUsuario)) {
1840               listaItens.add(ari.getItemEstruturaIett());
1841             }
1842           }
1843         }
1844 
1845         List<ItemEstruturaIett> itensGeralComArvore = itemDao.getArvoreItens(listaItens, null);
1846         List<ItemEstruturaIett> arvoreItens = new ArrayList<ItemEstruturaIett>(itensGeralComArvore);
1847 
1848         TipoAcompanhamentoTa tipoAcomp = null;
1849 
1850         if (codTipoAcompanhamento != null) {
1851           tipoAcomp = (TipoAcompanhamentoTa) tipoAcompanhamentoDao.buscar(TipoAcompanhamentoTa.class, codTipoAcompanhamento);
1852         }
1853 
1854         return new Object[] { aplicarFiltros(itemDao.getItensOrdenados(arvoreItens, tipoAcomp), listEstruturas, tipoAcomp, request), itensGeralComArvore };
1855 
1856       }
1857 
1858       else {
1859         return new Object[] { new ArrayList(), new ArrayList() };
1860       }
1861 
1862     } catch (HibernateException e) {
1863       this.logger.error(e);
1864       throw new ECARException(e);
1865     }
1866   }
1867 
1868   /**
1869    * Aplica os filtros selecionados na tela na lista de resultado
1870    * @param itensEstrutura Collection
1871    * @param estruturas Collection
1872    * @param tipoAcompanhamentoTa TipoAcompanhamentoTa
1873    * @param request HttpServletRequest
1874    * @return Collection contendo a lista de itens filtradas
1875    * @throws ECARException
1876    */
1877   private Collection aplicarFiltros(Collection itensEstrutura, Collection estruturas, TipoAcompanhamentoTa tipoAcompanhamentoTa, HttpServletRequest request) throws ECARException {
1878     Collection retorno = new ArrayList();
1879 
1880     Iterator itEstrutura = estruturas.iterator();
1881     List itensRemovidos = new ArrayList();
1882     EstruturaDao estruturaDao = new EstruturaDao(request);
1883     while (itEstrutura.hasNext()) {
1884       EstruturaEtt ett = (EstruturaEtt) itEstrutura.next();
1885       String codEtt = ett.getCodEtt().toString();
1886 
1887       List atributosLivres = estruturaDao.getAtributosLivresEstruturaDadosGeraisEhFiltro(ett, tipoAcompanhamentoTa);
1888 
1889       Iterator itItensEstrutura = itensEstrutura.iterator();
1890 
1891       while (itItensEstrutura.hasNext()) {
1892         AtributoEstruturaListagemItens atributoEstruturaListagemItens = (AtributoEstruturaListagemItens) itItensEstrutura.next();
1893         ItemEstruturaIett iett = atributoEstruturaListagemItens.getItem();
1894 
1895         if (iett.getItemEstruturaIett() != null) {
1896           if (itensRemovidos.contains(iett.getItemEstruturaIett().getCodIett())) {
1897             itensRemovidos.add(iett.getCodIett());
1898             itItensEstrutura.remove();
1899             continue;
1900           }
1901         }
1902 
1903         if (iett.getEstruturaEtt().equals(ett)) {
1904 
1905           if (!"".equals(Pagina.getParamStr(request, codEtt + "_codIettPai"))) {
1906             if (iett.getItemEstruturaIett() != null && !iett.getItemEstruturaIett().getCodIett().equals(Long.valueOf(Pagina.getParamStr(request, codEtt + "_codIettPai")))) {
1907               itensRemovidos.add(iett.getCodIett());
1908               itItensEstrutura.remove();
1909               continue;
1910             }
1911           }
1912 
1913           if (!"".equals(Pagina.getParamStr(request, codEtt + "_codIett"))) {
1914 
1915             if (iett.getCodIett() == null || !iett.getCodIett().equals(Long.valueOf(Pagina.getParamStr(request, codEtt + "_codIett")))) {
1916               itensRemovidos.add(iett.getCodIett());
1917               itItensEstrutura.remove();
1918               continue;
1919             }
1920           }
1921           // Faz o filtro para cada campo do tipo String fixo da tabela de
1922           // itemEstruturaIett
1923           if (filtrarItemString(request, "siglaIett", iett, itensRemovidos, itItensEstrutura)) {
1924             continue;
1925           }
1926           if (filtrarItemString(request, "nomeIett", iett, itensRemovidos, itItensEstrutura)) {
1927             continue;
1928           }
1929           if (filtrarItemString(request, "descricaoIett", iett, itensRemovidos, itItensEstrutura)) {
1930             continue;
1931           }
1932           if (filtrarItemString(request, "origemIett", iett, itensRemovidos, itItensEstrutura)) {
1933             continue;
1934           }
1935           if (filtrarItemString(request, "indAtivoIett", iett, itensRemovidos, itItensEstrutura)) {
1936             continue;
1937           }
1938           if (filtrarItemString(request, "indMonitoramentoIett", iett, itensRemovidos, itItensEstrutura)) {
1939             continue;
1940           }
1941           if (filtrarItemString(request, "indBloqPlanejamentoIett", iett, itensRemovidos, itItensEstrutura)) {
1942             continue;
1943           }
1944           if (filtrarItemString(request, "objetivoGeralIett", iett, itensRemovidos, itItensEstrutura)) {
1945             continue;
1946           }
1947           if (filtrarItemString(request, "beneficiosIett", iett, itensRemovidos, itItensEstrutura)) {
1948             continue;
1949           }
1950 
1951           // Faz o filtro para cada campo do tipo Date fixo da tabela de
1952           // itemEstruturaIett
1953           // para cada data chama o filtrarItemData para o intervalo inicio/fim.
1954           if (filtrarItemData(request, "dataInicioIett", iett, itensRemovidos, itItensEstrutura, "Inicio")) {
1955             continue;
1956           }
1957           if (filtrarItemData(request, "dataInicioIett", iett, itensRemovidos, itItensEstrutura, "Fim")) {
1958             continue;
1959           }
1960 
1961           if (filtrarItemData(request, "dataTerminoIett", iett, itensRemovidos, itItensEstrutura, "Inicio")) {
1962             continue;
1963           }
1964           if (filtrarItemData(request, "dataTerminoIett", iett, itensRemovidos, itItensEstrutura, "Fim")) {
1965             continue;
1966           }
1967 
1968           if (!"".equals(Pagina.getParamStr(request, codEtt + "_areaAre"))) {
1969             if (iett.getAreaAre() == null || !iett.getAreaAre().getCodAre().equals(Long.valueOf(Pagina.getParamStr(request, codEtt + "_areaAre")))) {
1970               itensRemovidos.add(iett.getCodIett());
1971               itItensEstrutura.remove();
1972               continue;
1973             }
1974           }
1975 
1976           if (!"".equals(Pagina.getParamStr(request, codEtt + "_subAreaSare"))) {
1977             if (iett.getSubAreaSare() == null || !iett.getSubAreaSare().getCodSare().equals(Long.valueOf(Pagina.getParamStr(request, codEtt + "_subAreaSare")))) {
1978               itensRemovidos.add(iett.getCodIett());
1979               itItensEstrutura.remove();
1980               continue;
1981             }
1982           }
1983 
1984           if (!"".equals(Pagina.getParamStr(request, codEtt + "_unidadeOrcamentariaUO"))) {
1985             if (iett.getUnidadeOrcamentariaUO() == null || !iett.getUnidadeOrcamentariaUO().getCodUo().equals(Long.valueOf(Pagina.getParamStr(request, codEtt + "_unidadeOrcamentariaUO")))) {
1986               itensRemovidos.add(iett.getCodIett());
1987               itItensEstrutura.remove();
1988               continue;
1989             }
1990           }
1991 
1992           if (!"".equals(Pagina.getParamStr(request, codEtt + "_orgaoOrgByCodOrgaoResponsavel1Iett"))) {
1993             if (iett.getOrgaoOrgByCodOrgaoResponsavel1Iett() == null || !iett.getOrgaoOrgByCodOrgaoResponsavel1Iett().getCodOrg().equals(Long.valueOf(Pagina.getParamStr(request, codEtt + "_orgaoOrgByCodOrgaoResponsavel1Iett")))) {
1994               itensRemovidos.add(iett.getCodIett());
1995               itItensEstrutura.remove();
1996               continue;
1997             }
1998           }
1999 
2000           if (!"".equals(Pagina.getParamStr(request, codEtt + "_orgaoOrgByCodOrgaoResponsavel2Iett"))) {
2001             if (iett.getOrgaoOrgByCodOrgaoResponsavel2Iett() == null || !iett.getOrgaoOrgByCodOrgaoResponsavel2Iett().getCodOrg().equals(Long.valueOf(Pagina.getParamStr(request, codEtt + "_orgaoOrgByCodOrgaoResponsavel2Iett")))) {
2002               itensRemovidos.add(iett.getCodIett());
2003               itItensEstrutura.remove();
2004               continue;
2005             }
2006           }
2007 
2008           if (filtrarItemString(request, "descricaoR1", iett, itensRemovidos, itItensEstrutura)) {
2009             continue;
2010           }
2011           if (filtrarItemString(request, "descricaoR2", iett, itensRemovidos, itItensEstrutura)) {
2012             continue;
2013           }
2014           if (filtrarItemString(request, "descricaoR3", iett, itensRemovidos, itItensEstrutura)) {
2015             continue;
2016           }
2017           if (filtrarItemString(request, "descricaoR4", iett, itensRemovidos, itItensEstrutura)) {
2018             continue;
2019           }
2020           if (filtrarItemString(request, "descricaoR5", iett, itensRemovidos, itItensEstrutura)) {
2021             continue;
2022           }
2023 
2024           if (!"".equals(Pagina.getParamStr(request, codEtt + "_periodicidadePrdc"))) {
2025             if (iett.getPeriodicidadePrdc() == null || !iett.getPeriodicidadePrdc().getCodPrdc().equals(Long.valueOf(Pagina.getParamStr(request, codEtt + "_periodicidadePrdc")))) {
2026               itensRemovidos.add(iett.getCodIett());
2027               itItensEstrutura.remove();
2028               continue;
2029             }
2030           }
2031 
2032           if (filtrarItemString(request, "indCriticaIett", iett, itensRemovidos, itItensEstrutura)) {
2033             continue;
2034           }
2035           if (filtrarItemValor(request, "valPrevistoFuturoIett", iett, itensRemovidos, itItensEstrutura, "Inicio")) {
2036             continue;
2037           }
2038           if (filtrarItemValor(request, "valPrevistoFuturoIett", iett, itensRemovidos, itItensEstrutura, "Fim")) {
2039             continue;
2040           }
2041           if (filtrarItemData(request, "dataR1", iett, itensRemovidos, itItensEstrutura, "Inicio")) {
2042             continue;
2043           }
2044           if (filtrarItemData(request, "dataR1", iett, itensRemovidos, itItensEstrutura, "Fim")) {
2045             continue;
2046           }
2047           if (filtrarItemData(request, "dataR2", iett, itensRemovidos, itItensEstrutura, "Inicio")) {
2048             continue;
2049           }
2050           if (filtrarItemData(request, "dataR2", iett, itensRemovidos, itItensEstrutura, "Fim")) {
2051             continue;
2052           }
2053           if (filtrarItemData(request, "dataR3", iett, itensRemovidos, itItensEstrutura, "Inicio")) {
2054             continue;
2055           }
2056           if (filtrarItemData(request, "dataR3", iett, itensRemovidos, itItensEstrutura, "Fim")) {
2057             continue;
2058           }
2059           if (filtrarItemData(request, "dataR4", iett, itensRemovidos, itItensEstrutura, "Inicio")) {
2060             continue;
2061           }
2062           if (filtrarItemData(request, "dataR4", iett, itensRemovidos, itItensEstrutura, "Fim")) {
2063             continue;
2064           }
2065           if (filtrarItemData(request, "dataR5", iett, itensRemovidos, itItensEstrutura, "Inicio")) {
2066             continue;
2067           }
2068           if (filtrarItemData(request, "dataR5", iett, itensRemovidos, itItensEstrutura, "Fim")) {
2069             continue;
2070           }
2071 
2072           // Filtro para situação do item
2073           if (!"".equals(Pagina.getParamStr(request, codEtt + "_situacaoSit"))) {
2074             if (iett.getSituacaoSit() == null || !iett.getSituacaoSit().getCodSit().equals(Long.valueOf(Pagina.getParamStr(request, codEtt + "_situacaoSit")))) {
2075               itensRemovidos.add(iett.getCodIett());
2076               itItensEstrutura.remove();
2077               continue;
2078             }
2079           }
2080           // Filtro para nível de planejamento
2081           ConfiguracaoDao configuracaoDao = new ConfiguracaoDao(request);
2082           String campoNivelPlanejamento = codEtt + "_a" + configuracaoDao.getConfiguracao().getSisGrupoAtributoSgaByCodSgaGrAtrNvPlan().getCodSga().toString();
2083           if (!"".equals(Pagina.getParamStr(request, campoNivelPlanejamento))) {
2084             if (!iett.getItemEstruturaNivelIettns().contains(this.buscar(SisAtributoSatb.class, Long.valueOf(Pagina.getParamStr(request, campoNivelPlanejamento))))) {
2085               itensRemovidos.add(iett.getCodIett());
2086               itItensEstrutura.remove();
2087               continue;
2088             }
2089           }
2090 
2091           // Chama o método responsável por efetuar os filtros dos atributos
2092           // livres
2093           if (filtrarAtributosLivres(request, iett, itensRemovidos, itItensEstrutura, atributosLivres)) {
2094             continue;
2095           }
2096         }
2097       }
2098 
2099     }
2100     return itensEstrutura;
2101   }
2102 
2103   /**
2104    * Retorna lista de itens que tenham um Acompanhamento
2105    * (AcompReferenciaItemAri) em algum dos Períodos de Referência
2106    * (AcompReferenciaAref) passados como parâmetro
2107    * @param periodosConsiderados Collection de AcompReferenciaAref
2108    * @param niveisPlanejamento Collection
2109    * @param orgaoResponsavel OrgaoOrg
2110    * @param usuarioUsu UsuarioUsu
2111    * @param gruposUsuario Set
2112    * @param codTipoAcompanhamento Long (se for nulo ignora o tipo de
2113    *          acompanhamento)
2114    * @param codIettPai Long (se for diferente de nulo, obtêm os filhos desse
2115    *          item)
2116    * @return List de AcompReferenciaItemAri. lista vazia se não foi informado
2117    *         nenhum periodo
2118    * @throws ECARException
2119    */
2120   public Object[] getItensAcompanhamentoInPeriodosByOrgaoRespPaginado(Collection periodosConsiderados, Collection niveisPlanejamento, OrgaoOrg orgaoResponsavel, UsuarioUsu usuarioUsu, Set gruposUsuario, Long codTipoAcompanhamento, Long codIettPai, Boolean itensSemInformacaoNivelPlanejamento, Long codCor, String indLiberados, int menorNivel, int nuPaginaSelecionada) throws ECARException {
2121     try {
2122       ItemEstruturaDao itemDao = new ItemEstruturaDao(null);
2123       TipoAcompanhamentoDao tipoAcompanhamentoDao = new TipoAcompanhamentoDao(null);
2124 
2125       if (periodosConsiderados.size() > 0) {
2126         StringBuilder query = new StringBuilder("select arel.acompReferenciaItemAri from AcompRelatorioArel arel ");
2127 
2128         if (niveisPlanejamento != null && niveisPlanejamento.size() > 0) {
2129           query.append(" left join arel.acompReferenciaItemAri.itemEstruturaIett.itemEstruturaNivelIettns niveis");
2130         }
2131 
2132         StringBuilder where = new StringBuilder(" where arel.acompReferenciaItemAri.acompReferenciaAref.codAref in (:listaAcompanhamentos)");
2133         where.append(" and (arel.acompReferenciaItemAri.itemEstruturaIett.indAtivoIett = 'S')");
2134 
2135         if (codTipoAcompanhamento != null) {
2136           where.append(" and (arel.acompReferenciaItemAri.acompReferenciaAref.tipoAcompanhamentoTa.codTa = :codTa)");
2137         }
2138 
2139         if (orgaoResponsavel != null && orgaoResponsavel.getCodOrg() != null) {
2140           where.append(" and (arel.acompReferenciaItemAri.itemEstruturaIett.orgaoOrgByCodOrgaoResponsavel1Iett.codOrg = :orgaoResp)");
2141         }
2142 
2143         int retornarAteNivel = -1;
2144         List<ItemEstruturaIettMin> iettFilhos = new ArrayList<ItemEstruturaIettMin>();
2145         if (codIettPai != null) {
2146           ItemEstruturaIettMin iettPai = (ItemEstruturaIettMin) itemDao.buscar(ItemEstruturaIettMin.class, codIettPai);
2147           if (iettPai != null) {
2148             retornarAteNivel = iettPai.getNivelIett().intValue() + 1;
2149             iettFilhos.addAll(itemDao.getDescendentesMin(iettPai, false));
2150           }
2151         }
2152 
2153         if (itensSemInformacaoNivelPlanejamento.booleanValue()) {
2154           if (niveisPlanejamento != null && niveisPlanejamento.size() > 0) {
2155             where.append(" and (niveis.codSatb in (:listaNiveis) or niveis is null)");
2156           }
2157           else {
2158             where.append(" and niveis is null");
2159           }
2160         }
2161         else {
2162           if (niveisPlanejamento != null && niveisPlanejamento.size() > 0) {
2163             where.append(" and (niveis.codSatb in (:listaNiveis)  or niveis is null) ");
2164           }
2165         }
2166 
2167         if (codCor != null) {
2168           where.append(" and arel.cor.codCor = :codCor");
2169         }
2170 
2171         // Teste ref. mantis 10848
2172         if (indLiberados != null && "S".equals(indLiberados)) {
2173           where.append(" and arel.acompReferenciaItemAri.statusRelatorioSrl.codSrl = :codLiberado");
2174         }
2175 
2176         Query queryItens = this.getSession().createQuery(query.toString() + where.toString());
2177 
2178         List<Long> listaCodigosAref = new ArrayList<Long>();
2179 
2180         for (Iterator iter = periodosConsiderados.iterator(); iter.hasNext();) {
2181           AcompReferenciaAref aReferencia = (AcompReferenciaAref) iter.next();
2182           listaCodigosAref.add(aReferencia.getCodAref());
2183         }
2184 
2185         queryItens.setParameterList("listaAcompanhamentos", listaCodigosAref);
2186 
2187         if (orgaoResponsavel != null && orgaoResponsavel.getCodOrg() != null) {
2188           queryItens.setLong("orgaoResp", orgaoResponsavel.getCodOrg().longValue());
2189         }
2190 
2191         if (niveisPlanejamento != null && niveisPlanejamento.size() > 0) {
2192           List<Long> listaCodigosNiveis = new ArrayList<Long>();
2193           for (Iterator itNiveis = niveisPlanejamento.iterator(); itNiveis.hasNext();) {
2194             SisAtributoSatb nivel = (SisAtributoSatb) itNiveis.next();
2195             listaCodigosNiveis.add(nivel.getCodSatb());
2196           }
2197           queryItens.setParameterList("listaNiveis", listaCodigosNiveis);
2198         }
2199 
2200         if (codTipoAcompanhamento != null) {
2201           // listar ARIs conforme o tipo de acompanhamento passado como
2202           // parâmetro
2203           queryItens.setLong("codTa", codTipoAcompanhamento.longValue());
2204         }
2205 
2206         if (codCor != null) {
2207           queryItens.setLong("codCor", codCor.longValue());
2208         }
2209 
2210         // Teste ref. mantis 10848
2211         if (indLiberados != null && "S".equals(indLiberados)) {
2212           queryItens.setLong("codLiberado", Long.valueOf(this.STATUS_LIBERADO).longValue());
2213         }
2214 
2215         List<ItemEstruturaIett> listaItens = new ArrayList<ItemEstruturaIett>();
2216         List listaAris = queryItens.list();
2217         Iterator itListaAris = listaAris.iterator();
2218 
2219         if (usuarioUsu == null) { // utilizado para o grafico.jsp - teste de
2220                                   // performance
2221           while (itListaAris.hasNext()) {
2222             AcompReferenciaItemAri ari = (AcompReferenciaItemAri) itListaAris.next();
2223             listaItens.add(ari.getItemEstruturaIett());
2224           }
2225         }
2226         else {
2227           while (itListaAris.hasNext()) {
2228             AcompReferenciaItemAri ari = (AcompReferenciaItemAri) itListaAris.next();
2229             if (validaPermissao.permissaoLeituraAcompanhamento(ari, usuarioUsu, gruposUsuario)) {
2230               listaItens.add(ari.getItemEstruturaIett());
2231             }
2232           }
2233         }
2234 
2235         List<ItemEstruturaIett> itensGeralComArvore = itemDao.getArvoreItens(listaItens, null);
2236         List<ItemEstruturaIett> arvoreItens = new ArrayList<ItemEstruturaIett>(itensGeralComArvore);
2237 
2238         if (retornarAteNivel != -1) {
2239           for (Iterator itArvore = arvoreItens.iterator(); itArvore.hasNext();) {
2240             ItemEstruturaIett iett = (ItemEstruturaIett) itArvore.next();
2241             ItemEstruturaIettMin iettMin = new ItemEstruturaIettMin();
2242             iettMin.setCodIett(iett.getCodIett());
2243             if (iett.getNivelIett().intValue() > retornarAteNivel) {
2244               itArvore.remove();
2245             }
2246             else if (!iettFilhos.contains(iettMin)) {
2247               itArvore.remove();
2248             }
2249 
2250           }
2251         }
2252         TipoAcompanhamentoTa tipoAcomp = null;
2253         if (codTipoAcompanhamento != null) {
2254           tipoAcomp = (TipoAcompanhamentoTa) tipoAcompanhamentoDao.buscar(TipoAcompanhamentoTa.class, codTipoAcompanhamento);
2255         }
2256 
2257         // se é para paginar
2258         if (menorNivel != -2) {
2259           // indices inicial e final para a consulta dos itensEstruturaIett
2260           ConfiguracaoDao configuracaoDao = new ConfiguracaoDao(request);
2261           int nuItensPaginacao = configuracaoDao.getConfiguracao().getNuItensExibidosPaginacao();
2262           List itensOrdenados = itemDao.getItensOrdenados(arvoreItens, tipoAcomp);
2263           if (itensOrdenados.size() <= nuItensPaginacao * nuPaginaSelecionada) {
2264             nuPaginaSelecionada = 1;
2265           }
2266           int indiceInicial = (nuPaginaSelecionada - 1) * nuItensPaginacao + 1;
2267           int indiceFinal = (nuPaginaSelecionada - 1) * nuItensPaginacao + nuItensPaginacao;
2268           int contador = 1; // variavel que guarda qual o indice no iterador
2269 
2270           List itensOrdenadosPaginados = new ArrayList();
2271           List itensOrdenadosTotalPorNivel = new ArrayList();
2272           Iterator itensOrdenadosIt = itensOrdenados.iterator();
2273           while (itensOrdenadosIt.hasNext()) {
2274             AtributoEstruturaListagemItens atEstListagem = (AtributoEstruturaListagemItens) itensOrdenadosIt.next();
2275             if (indiceInicial <= contador && contador <= indiceFinal) {
2276               itensOrdenadosPaginados.add(atEstListagem);
2277             }
2278             if (menorNivel == -1 || atEstListagem.getItem().getNivelIett().intValue() <= menorNivel) {
2279               itensOrdenadosTotalPorNivel.add(atEstListagem);
2280               contador++;
2281             }
2282           }
2283           return new Object[] { itensOrdenadosPaginados, itensGeralComArvore, itensOrdenadosTotalPorNivel };
2284         }
2285         else {
2286           return new Object[] { itemDao.getItensOrdenados(arvoreItens, tipoAcomp), itensGeralComArvore };
2287         }
2288 
2289       }
2290       else {
2291         return new Object[] { new ArrayList(), new ArrayList() };
2292       }
2293 
2294     } catch (HibernateException e) {
2295       this.logger.error(e);
2296       throw new ECARException(e);
2297     }
2298   }
2299 
2300   /**
2301    * Recebe uma coleção de AcomReferenciaAref e um item e retorna um map tendo
2302    * como chaves os Aref da coleção e como dado o AcompReferenciaItemAri
2303    * correspondente ao item no respectivo periodo.
2304    * @param periodosConsiderados
2305    * @param item
2306    * @return
2307    * @throws ECARException
2308    */
2309   public Map criarMapPeriodoAri(Collection periodosConsiderados, ItemEstruturaIett item) throws ECARException {
2310 
2311     try {
2312       StringBuilder query = new StringBuilder("");
2313 
2314       if (periodosConsiderados != null) {
2315         query = new StringBuilder("select ari from AcompReferenciaItemAri ari ").append("where ari.itemEstruturaIett = ? and ari.acompReferenciaAref.codAref in (:listaAcompanhamentos)");
2316       }
2317       else {
2318         query = new StringBuilder("select ari from AcompReferenciaItemAri ari ").append("where ari.itemEstruturaIett = ?");
2319       }
2320 
2321       Query queryAri = this.getSession().createQuery(query.toString());
2322 
2323       queryAri.setLong(0, item.getCodIett().longValue());
2324 
2325       if (periodosConsiderados != null) {
2326         List listaCodigosAref = new ArrayList();
2327 
2328         for (Iterator it = periodosConsiderados.iterator(); it.hasNext();) {
2329           AcompReferenciaAref aReferencia = (AcompReferenciaAref) it.next();
2330           listaCodigosAref.add(aReferencia.getCodAref());
2331         }
2332 
2333         queryAri.setParameterList("listaAcompanhamentos", listaCodigosAref);
2334       }
2335 
2336       List listaAris = queryAri.list();
2337 
2338       Map map = new HashMap();
2339 
2340       for (Iterator itAris = listaAris.iterator(); itAris.hasNext();) {
2341         AcompReferenciaItemAri ari = (AcompReferenciaItemAri) itAris.next();
2342         map.put(ari.getAcompReferenciaAref(), ari);
2343       }
2344 
2345       return map;
2346 
2347     } catch (HibernateException e) {
2348       this.logger.error(e);
2349       throw new ECARException(e);
2350     }
2351 
2352   }
2353 
2354   /**
2355    * Cria a matriz utilizada para a cálculo da projeção. Aprensenta como chave o
2356    * numero sequencial do mês (1 - primeiro mês do período, 2 - segundo mês) e
2357    * como valor a quantidade realizada para o indicador no respectivo mês.
2358    * @param indicador
2359    * @param anoInicioProjecao
2360    * @param anoFimProjecao
2361    * @param mesInicioProjecao
2362    * @param mesFimProjecao
2363    * @return
2364    * @throws ECARException
2365    */
2366   public Map criaMapCalculoProjecao(ItemEstrtIndResulIettr indicador, int anoInicioProjecao, int anoFimProjecao, int mesInicioProjecao, int mesFimProjecao) throws ECARException {
2367 
2368     // Contrução da "Matriz"
2369     List meses = new ArrayList();
2370     while ((anoInicioProjecao != anoFimProjecao) || (mesInicioProjecao != mesFimProjecao && anoInicioProjecao == anoFimProjecao)) {
2371       meses.add(mesInicioProjecao + "-" + anoInicioProjecao);
2372       mesInicioProjecao++;
2373       if (mesInicioProjecao == 13) {
2374         mesInicioProjecao = 1;
2375         anoInicioProjecao++;
2376       }
2377     }
2378     meses.add(mesInicioProjecao + "-" + anoInicioProjecao);
2379 
2380     Map qtdeRealizada = new HashMap();
2381     double valorAnterior = 0;
2382     int i = 1;
2383     Iterator it = meses.iterator();
2384     while (it.hasNext()) {
2385       String strMesAno = (String) it.next();
2386       String strMes = strMesAno.split("-")[0];
2387       if (strMes.length() == 1)
2388         strMes = "0" + strMes;
2389       String strAno = strMesAno.split("-")[1];
2390       Double valor = new AcompRealFisicoDao(request).getQtdRealizadaMesAno(indicador, Long.valueOf(strMes), Long.valueOf(strAno));
2391       if (valor != null && valor.doubleValue() != 0) {
2392         if ("S".equals(indicador.getIndAcumulavelIettr())) {
2393           valorAnterior = valorAnterior + valor.doubleValue();
2394           qtdeRealizada.put(Integer.valueOf(i), new Double(valorAnterior));
2395           i++;
2396         }
2397         else {
2398           valorAnterior = valor.doubleValue();
2399           qtdeRealizada.put(Integer.valueOf(i), new Double(valorAnterior));
2400           i++;
2401         }
2402       }
2403       else {
2404         qtdeRealizada.put(Integer.valueOf(i), new Double(valorAnterior));
2405         i++;
2406       }
2407     }
2408 
2409     return qtdeRealizada;
2410 
2411   }
2412 
2413   /**
2414    * Retorna um array com: mês e ano de início da projeção (data de início do
2415    * projeto ou primeira data de registro de informação de quantidade realizada
2416    * para o indicador de resultado - a menor das duas datas) e mês e ano limites
2417    * da matriz (último mês ano com registro de valor realizado informado para o
2418    * indicador). Estes meses serão os limites da matriz para cálculo de
2419    * projeções.
2420    * @param indicador
2421    * @param comQtde
2422    * @param soPrevisao
2423    * @return
2424    * @throws ECARException
2425    */
2426   public int[] getMesAnoInicioFimMatrizProjecao(ItemEstrtIndResulIettr indicador, boolean comQtde, boolean soPrevisao) throws ECARException {
2427     try {
2428 
2429       Collection acompanhamentosReferencia = this.getSession().createFilter(indicador.getAcompRealFisicoArfs(), " WHERE this.qtdRealizadaArf >= 0 OR this.qtdRealizadaArf IS NULL ORDER BY this.anoArf asc, this.mesArf asc").list();
2430 
2431       Object[] acompanhamentos = acompanhamentosReferencia.toArray();
2432 
2433       int mesInicioProjecao;
2434       int anoInicioProjecao;
2435 
2436       Date dataInicioProjeto = indicador.getItemEstruturaIett().getDataInicioIett();
2437 
2438       // int mesQuantidadeInformada =
2439       // Integer.valueOf(((AcompRealFisicoArf)acompanhamentos[0]).getMesArf().toString()).intValue();
2440       // int anoQuantidadeInformada =
2441       // Integer.valueOf(((AcompRealFisicoArf)acompanhamentos[0]).getAnoArf().toString()).intValue();
2442 
2443       int mesQuantidadeInformada = 0;
2444       int anoQuantidadeInformada = 0;
2445 
2446       if (!soPrevisao) {
2447         mesQuantidadeInformada = Integer.valueOf(((AcompRealFisicoArf) acompanhamentos[0]).getMesArf().toString()).intValue();
2448         anoQuantidadeInformada = Integer.valueOf(((AcompRealFisicoArf) acompanhamentos[0]).getAnoArf().toString()).intValue();
2449       }
2450 
2451       if (dataInicioProjeto != null) {
2452 
2453         int mesInicioProjeto = Data.getCalendar(dataInicioProjeto).get(Calendar.MONTH) + 1;
2454         int anoInicioProjeto = Data.getCalendar(dataInicioProjeto).get(Calendar.YEAR);
2455 
2456         /* Definir qual o mês e ano inicial devem ser considerados */
2457         if (anoInicioProjeto - anoQuantidadeInformada > 0) {
2458           mesInicioProjecao = mesQuantidadeInformada;
2459           anoInicioProjecao = anoQuantidadeInformada;
2460         }
2461         else {
2462           if (anoInicioProjeto - anoQuantidadeInformada > 0) {
2463             mesInicioProjecao = mesInicioProjeto;
2464             anoInicioProjecao = anoInicioProjeto;
2465           }
2466           else {
2467             if (mesInicioProjeto - mesQuantidadeInformada >= 0) {
2468               mesInicioProjecao = mesQuantidadeInformada;
2469               anoInicioProjecao = anoQuantidadeInformada;
2470             }
2471             else {
2472               mesInicioProjecao = mesInicioProjeto;
2473               anoInicioProjecao = anoInicioProjeto;
2474             }
2475           }
2476         }
2477 
2478       }
2479       else {
2480         mesInicioProjecao = mesQuantidadeInformada;
2481         anoInicioProjecao = anoQuantidadeInformada;
2482       }
2483 
2484       // Descobrir mês e ano que devem ser representados pelo ultimo elemento da
2485       // matriz
2486       // int mesFimMatriz =
2487       // Integer.valueOf(((AcompRealFisicoArf)acompanhamentos[acompanhamentos.length
2488       // - 1]).getMesArf().toString()).intValue();
2489       // int anoFimMatriz =
2490       // Integer.valueOf(((AcompRealFisicoArf)acompanhamentos[acompanhamentos.length
2491       // - 1]).getAnoArf().toString()).intValue();
2492       int mesFimMatriz = 0;
2493       int anoFimMatriz = 0;
2494       if (!soPrevisao) {
2495         mesFimMatriz = Integer.valueOf(((AcompRealFisicoArf) acompanhamentos[acompanhamentos.length - 1]).getMesArf().toString()).intValue();
2496         anoFimMatriz = Integer.valueOf(((AcompRealFisicoArf) acompanhamentos[acompanhamentos.length - 1]).getAnoArf().toString()).intValue();
2497       }
2498 
2499       int[] resultado = new int[4];
2500       resultado[0] = mesInicioProjecao;
2501       resultado[1] = anoInicioProjecao;
2502       resultado[2] = mesFimMatriz;
2503       resultado[3] = anoFimMatriz;
2504 
2505       return resultado;
2506 
2507     } catch (HibernateException e) {
2508       throw new ECARException(e);
2509     }
2510   }
2511 
2512   /**
2513    * Retorna o mês e o ano final da projeção: último exercício com quantidade
2514    * informada ou para a data de término do projeto correspondente ao indicador.
2515    * A menor das duas datas.
2516    * @param indicador
2517    * @return
2518    * @throws ECARException
2519    */
2520   public int[] getMesAnoFimProjecao(ItemEstrtIndResulIettr indicador) throws ECARException {
2521     try {
2522       Collection fisicoPrevisto = this.getSession().createFilter(indicador.getItemEstrutFisicoIettfs(), " where this.qtdPrevistaIettf > 0 order by this.exercicioExe.dataFinalExe desc").list();
2523 
2524       Object[] previstos = fisicoPrevisto.toArray();
2525 
2526       int mesFimProjecao;
2527       int anoFimProjecao;
2528 
2529       Date dataFimProjeto = indicador.getItemEstruturaIett().getDataTerminoIett();
2530       Date dataFimExercicio = ((ItemEstrutFisicoIettf) previstos[0]).getExercicioExe().getDataFinalExe();
2531 
2532       int mesQuantidadeInformadaTermino = Data.getCalendar(dataFimExercicio).get(Calendar.MONTH) + 1;
2533       int anoQuantidadeInformadaTermino = Data.getCalendar(dataFimExercicio).get(Calendar.YEAR);
2534 
2535       if (dataFimProjeto != null) {
2536         int mesFimProjeto = Data.getCalendar(dataFimProjeto).get(Calendar.MONTH) + 1;
2537         int anoFimProjeto = Data.getCalendar(dataFimProjeto).get(Calendar.YEAR);
2538         /* Definir qual o mês e ano final devem ser considerados na projeção */
2539         if (anoFimProjeto - anoQuantidadeInformadaTermino > 0) {
2540           mesFimProjecao = mesQuantidadeInformadaTermino;
2541           anoFimProjecao = anoQuantidadeInformadaTermino;
2542         }
2543         else {
2544           if (anoFimProjeto - anoQuantidadeInformadaTermino > 0) {
2545             mesFimProjecao = mesFimProjeto;
2546             anoFimProjecao = anoFimProjeto;
2547           }
2548           else {
2549             if (mesFimProjeto - mesQuantidadeInformadaTermino >= 0) {
2550               mesFimProjecao = mesQuantidadeInformadaTermino;
2551               anoFimProjecao = anoQuantidadeInformadaTermino;
2552             }
2553             else {
2554               mesFimProjecao = mesFimProjeto;
2555               anoFimProjecao = anoFimProjeto;
2556             }
2557           }
2558         }
2559 
2560       }
2561       else {
2562         mesFimProjecao = mesQuantidadeInformadaTermino;
2563         anoFimProjecao = anoQuantidadeInformadaTermino;
2564       }
2565 
2566       int[] resultado = new int[2];
2567       resultado[0] = mesFimProjecao;
2568       resultado[1] = anoFimProjecao;
2569 
2570       return resultado;
2571 
2572     } catch (HibernateException e) {
2573       throw new ECARException(e);
2574     }
2575   }
2576 
2577   /**
2578    * Faz a Projeção de um Indicador. Devolve o valor projetada para a data de
2579    * fim do projeto ou último mes do maior exercício com quantidade prevista ( a
2580    * menor das duas datas)
2581    * @param indicador
2582    * @param ari
2583    * @return
2584    * @throws ECARException
2585    */
2586   public double calculoProjecao(ItemEstrtIndResulIettr indicador, AcompReferenciaItemAri ari) throws ECARException {
2587 
2588     try {
2589       AcompRealFisicoDao arfDao = new AcompRealFisicoDao(null);
2590       List sMeses = new ArrayList();
2591       List sRealizado = new ArrayList();
2592 
2593       int[] meses = getMesAnoInicioFimMatrizProjecao(indicador, true, false);
2594       int mesInicioProjecao = meses[0];
2595       int anoInicioProjecao = meses[1];
2596       int mesFimRealizado = Integer.valueOf(ari.getAcompReferenciaAref().getMesAref()).intValue();
2597       int anoFimRealizado = Integer.valueOf(ari.getAcompReferenciaAref().getAnoAref()).intValue();
2598 
2599       int[] mesAnoFimProjecao = getMesAnoFimProjecao(indicador);
2600       int mesFimProjecao = mesAnoFimProjecao[0];
2601       int anoFimProjecao = mesAnoFimProjecao[1];
2602 
2603       int auxMes = mesInicioProjecao;
2604       int auxAno = anoInicioProjecao;
2605 
2606       int quantidadeMeses = 1;
2607       double qtdeAnterior = 0;
2608       while (auxAno < anoFimRealizado || (auxAno == anoFimRealizado && auxMes <= mesFimRealizado)) {
2609         String strMesInicio = Integer.valueOf(auxMes).toString();
2610         if (strMesInicio.length() == 1)
2611           strMesInicio = "0" + strMesInicio;
2612         String strAnoInicio = Integer.valueOf(auxAno).toString();
2613 
2614         Double qtde = arfDao.getQtdRealizadaMesAno(indicador, Long.valueOf(strMesInicio), Long.valueOf(strAnoInicio));
2615         double qtdeSerie = 0;
2616         if (qtde != null) {
2617           qtdeSerie = qtdeAnterior + qtde.doubleValue();
2618           qtdeAnterior = qtdeSerie;
2619         }
2620         else
2621           qtdeSerie = qtdeAnterior;
2622 
2623         sRealizado.add(new Double(qtdeSerie));
2624         sMeses.add(Integer.valueOf(quantidadeMeses));
2625 
2626         auxMes++;
2627         if (auxMes == 13) {
2628           auxMes = 1;
2629           auxAno++;
2630         }
2631         quantidadeMeses++;
2632       }
2633 
2634       int xProjetado = 0;
2635 
2636       if (anoFimProjecao <= anoFimRealizado) {
2637         xProjetado = quantidadeMeses + (mesFimProjecao - mesFimRealizado);
2638       }
2639       else {
2640         while (anoFimProjecao > anoFimRealizado) {
2641           mesFimRealizado++;
2642           if (mesFimRealizado == 13) {
2643             anoFimRealizado++;
2644             mesFimRealizado = 1;
2645           }
2646           xProjetado++;
2647         }
2648         xProjetado += quantidadeMeses + mesFimProjecao;
2649       }
2650 
2651       return calcularPrevistoMes(sMeses, sRealizado, xProjetado);
2652 
2653     } catch (Exception e) {
2654       this.logger.error(e);
2655       return 0;
2656     }
2657 
2658   }
2659 
2660   /**
2661    * Faz a previsão do realizado de um mês para um indicador de resultado
2662    * @param meses Lista com todos os meses que se conhece o realizado
2663    * @param realizado Lista do realizado em cada mês
2664    * @param mesPrevisao Mês que deseja prevar
2665    * @return
2666    */
2667   public double calcularPrevistoMes(Collection meses, Collection realizado, int mesPrevisao) {
2668     double mediaRealizado = Util.calculaMediaValores(realizado);
2669     double mediaMeses = Util.calculaMediaValoresInteger(meses);
2670     double A = calcularConstanteCalculoPrevisao(meses, realizado, mediaRealizado, mediaMeses);
2671     double B = calcularIncrementoMedioEixoY(meses.toArray(), realizado.toArray(), mediaRealizado, mediaMeses);
2672     return A + (B * mesPrevisao);
2673 
2674   }
2675 
2676   private double calcularConstanteCalculoPrevisao(Collection meses, Collection realizado, double mediaRealizado, double mediaMeses) {
2677     double B = calcularIncrementoMedioEixoY(meses.toArray(), realizado.toArray(), mediaRealizado, mediaMeses);
2678     return mediaRealizado - (B * mediaMeses);
2679   }
2680 
2681   private double calcularIncrementoMedioEixoY(Object[] meses, Object[] realizado, double mediaRealizado, double mediaMeses) {
2682     Arrays.sort(meses);
2683     Arrays.sort(realizado);
2684     double soma1 = 0;
2685     double soma2 = 0;
2686     int i = 0;
2687     int qtdeMeses = meses.length;
2688     while (i < qtdeMeses) {
2689       soma1 = soma1 + (((Integer) meses[i]).intValue() - mediaMeses) * (((Double) realizado[i]).doubleValue() - mediaRealizado);
2690       soma2 = soma2 + Math.pow((((Integer) meses[i]).intValue() - mediaMeses), 2);
2691       i++;
2692     }
2693     if (soma2 == 0)
2694       return 0;
2695     return soma1 / soma2;
2696   }
2697 
2698   /**
2699    * A partir de um AcompReferenciaItem incluído na lista verifica a existência
2700    * de Acompanhamentos de Itens filhos do Ari passado, que são incluídos
2701    * juntamente na lista. Há ainda a possibilidade dos filhos serem filtrados
2702    * pelo orgaoResponsavel.
2703    * @param acompRefItem
2704    * @param orgaoResponsavel
2705    * @return
2706    * @throws ECARException
2707    */
2708   public List getAcompReferenciaItemFilhosByAri(AcompReferenciaItemAri acompRefItem, OrgaoOrg orgaoResponsavel) throws ECARException {
2709     List lista = new ArrayList();
2710 
2711     lista.add(acompRefItem);
2712 
2713     try {
2714       ItemEstruturaDao itemDao = new ItemEstruturaDao(request);
2715 
2716       List descendentes = itemDao.getDescendentes(acompRefItem.getItemEstruturaIett(), true);
2717 
2718       if (descendentes != null && descendentes.size() > 0) {
2719         List codIettDescendentes = new ArrayList();
2720 
2721         for (Iterator itDescendentes = descendentes.iterator(); itDescendentes.hasNext();) {
2722           ItemEstruturaIett iett = (ItemEstruturaIett) itDescendentes.next();
2723           codIettDescendentes.add(iett.getCodIett());
2724         }
2725 
2726         StringBuilder query = new StringBuilder("select ari from AcompReferenciaItemAri ari").append(" where ari.acompReferenciaAref = ? and ari.itemEstruturaIett.codIett in (:listaItens)").append(" and ari.itemEstruturaIett.indAtivoIett = 'S'");
2727 
2728         if (orgaoResponsavel.getCodOrg() != null) {
2729           query.append(" and ( ari.itemEstruturaIett.orgaoOrgByCodOrgaoResponsavel1Iett.codOrg = :orgaoResp ").append("or ( ari.itemEstruturaIett.orgaoOrgByCodOrgaoResponsavel1Iett.codOrg is null ").append("and ari.itemEstruturaIett.itemEstruturaIett.orgaoOrgByCodOrgaoResponsavel1Iett.codOrg = :orgaoResp ) )");
2730         }
2731 
2732         Query queryAri = this.getSession().createQuery(query.toString());
2733         queryAri.setParameterList("listaItens", codIettDescendentes);
2734         queryAri.setLong(0, acompRefItem.getAcompReferenciaAref().getCodAref().longValue());
2735 
2736         if (orgaoResponsavel.getCodOrg() != null) {
2737           queryAri.setLong("orgaoResp", orgaoResponsavel.getCodOrg().longValue());
2738         }
2739 
2740         lista.addAll(queryAri.list());
2741 
2742         List listaTemp = new ArrayList();
2743         List listaAri = new ArrayList();
2744         for (Iterator it = lista.iterator(); it.hasNext();) {
2745           AcompReferenciaItemAri ari = (AcompReferenciaItemAri) it.next();
2746 
2747           if (!listaTemp.contains(ari.getItemEstruturaIett().getCodIett())) {
2748             listaTemp.add(ari.getItemEstruturaIett().getCodIett());
2749             listaAri.add(ari);
2750           }
2751         }
2752 
2753         lista.clear();
2754         lista.addAll(listaAri);
2755 
2756         Collections.sort(lista, new Comparator() {
2757           ItemEstruturaDao iettDaoSort = new ItemEstruturaDao(null);
2758 
2759           public int compare(Object o1, Object o2) {
2760             AcompReferenciaItemAri ari1 = (AcompReferenciaItemAri) o1;
2761             AcompReferenciaItemAri ari2 = (AcompReferenciaItemAri) o2;
2762 
2763             ItemEstruturaIett item1 = ari1.getItemEstruturaIett();
2764             ItemEstruturaIett item2 = ari2.getItemEstruturaIett();
2765             if (iettDaoSort.getAscendenteMaximo(item1).equals(iettDaoSort.getAscendenteMaximo(item2))) {
2766               if (item1.getNivelIett().intValue() == item2.getNivelIett().intValue()) {
2767                 return item1.getNomeIett().compareToIgnoreCase(item2.getNomeIett());
2768               }
2769               else {
2770                 return item1.getNivelIett().intValue() - item2.getNivelIett().intValue();
2771               }
2772             }
2773             else {
2774               if (item1.getNivelIett().intValue() == item2.getNivelIett().intValue()) {
2775                 return item1.getNomeIett().compareToIgnoreCase(item2.getNomeIett());
2776               }
2777               else {
2778                 return iettDaoSort.getAscendenteMaximo(item1).getNomeIett().compareToIgnoreCase(iettDaoSort.getAscendenteMaximo(item2).getNomeIett());
2779               }
2780             }
2781           }
2782         });
2783       }
2784     } catch (HibernateException e) {
2785       this.logger.error(e);
2786       throw new ECARException();
2787     }
2788 
2789     return lista;
2790   }
2791 
2792   /**
2793    * A partir de um AcompReferenciaItem incluído na lista verifica a existência
2794    * de Acompanhamentos de Itens filhos do Ari passado com pontos críticos
2795    * ativos, que são incluídos juntamente na lista. Há ainda a possibilidade dos
2796    * filhos serem filtrados pelo orgaoResponsavel.
2797    * @param acompRefItem
2798    * @return
2799    * @throws ECARException
2800    */
2801   public List getAcompReferenciaItemFilhosByAriPorPtoCritico(AcompReferenciaItemAri acompRefItem) throws ECARException {
2802     List lista = new ArrayList();
2803 
2804     lista.add(acompRefItem);
2805 
2806     try {
2807       ItemEstruturaDao itemDao = new ItemEstruturaDao(request);
2808 
2809       List descendentes = itemDao.getDescendentes(acompRefItem.getItemEstruturaIett(), true);
2810 
2811       if (descendentes != null && descendentes.size() > 0) {
2812         List codIettDescendentes = new ArrayList();
2813 
2814         for (Iterator itDescendentes = descendentes.iterator(); itDescendentes.hasNext();) {
2815           ItemEstruturaIett iett = (ItemEstruturaIett) itDescendentes.next();
2816           codIettDescendentes.add(iett.getCodIett());
2817         }
2818 
2819         StringBuilder query = new StringBuilder("select ari from AcompReferenciaItemAri ari").append(" where ari.acompReferenciaAref = ? and ari.itemEstruturaIett.codIett in (:listaItens)").append(" and ari.itemEstruturaIett.indAtivoIett = 'S'");
2820 
2821         /*
2822          * if(orgaoResponsavel.getCodOrg() != null){query.append(
2823          * " and ( ari.itemEstruturaIett.orgaoOrgByCodOrgaoResponsavel1Iett.codOrg = :orgaoResp "
2824          * ).append(
2825          * "or ( ari.itemEstruturaIett.orgaoOrgByCodOrgaoResponsavel1Iett.codOrg is null "
2826          * ).append(
2827          * "and ari.itemEstruturaIett.itemEstruturaIett.orgaoOrgByCodOrgaoResponsavel1Iett.codOrg = :orgaoResp ) )"
2828          * ); }
2829          */
2830 
2831         Query queryAri = this.getSession().createQuery(query.toString());
2832         queryAri.setLong(0, acompRefItem.getAcompReferenciaAref().getCodAref().longValue());
2833         queryAri.setParameterList("listaItens", codIettDescendentes);
2834 
2835         /*
2836          * if(orgaoResponsavel.getCodOrg() != null){
2837          * queryAri.setLong("orgaoResp",
2838          * orgaoResponsavel.getCodOrg().longValue()); }
2839          */
2840 
2841         lista.addAll(queryAri.list());
2842 
2843         List listaTemp = new ArrayList();
2844         List listaAri = new ArrayList();
2845         for (Iterator it = lista.iterator(); it.hasNext();) {
2846           AcompReferenciaItemAri ari = (AcompReferenciaItemAri) it.next();
2847 
2848           if (!listaTemp.contains(ari.getItemEstruturaIett().getCodIett())) {
2849             // Verifica se possui algum ponto critico
2850             // Caso não exista ele devolve a lista vazia pra instrução que
2851             // acionou o método
2852             if (ari.getItemEstruturaIett().getPontoCriticoPtcs().size() > 0) {
2853               listaTemp.add(ari.getItemEstruturaIett().getCodIett());
2854               listaAri.add(ari);
2855             }
2856 
2857           }
2858         }
2859 
2860         lista.clear();
2861         lista.addAll(listaAri);
2862 
2863         Collections.sort(lista, new Comparator() {
2864           ItemEstruturaDao iettDaoSort = new ItemEstruturaDao(null);
2865 
2866           public int compare(Object o1, Object o2) {
2867             AcompReferenciaItemAri ari1 = (AcompReferenciaItemAri) o1;
2868             AcompReferenciaItemAri ari2 = (AcompReferenciaItemAri) o2;
2869 
2870             ItemEstruturaIett item1 = ari1.getItemEstruturaIett();
2871             ItemEstruturaIett item2 = ari2.getItemEstruturaIett();
2872             if (iettDaoSort.getAscendenteMaximo(item1).equals(iettDaoSort.getAscendenteMaximo(item2))) {
2873               if (item1.getNivelIett().intValue() == item2.getNivelIett().intValue()) {
2874                 return item1.getNomeIett().compareToIgnoreCase(item2.getNomeIett());
2875               }
2876               else {
2877                 return item1.getNivelIett().intValue() - item2.getNivelIett().intValue();
2878               }
2879             }
2880             else {
2881               if (item1.getNivelIett().intValue() == item2.getNivelIett().intValue()) {
2882                 return item1.getNomeIett().compareToIgnoreCase(item2.getNomeIett());
2883               }
2884               else {
2885                 return iettDaoSort.getAscendenteMaximo(item1).getNomeIett().compareToIgnoreCase(iettDaoSort.getAscendenteMaximo(item2).getNomeIett());
2886               }
2887             }
2888           }
2889         });
2890       }
2891     } catch (HibernateException e) {
2892       this.logger.error(e);
2893       throw new ECARException();
2894     }
2895 
2896     return lista;
2897   }
2898 
2899   /**
2900    * Retorna uma lista de Aris a partir de Itens ou seus descendentes.
2901    * @param strCodIetts
2902    * @param aref
2903    * @param orgaoResponsavel
2904    * @return
2905    * @throws ECARException
2906    */
2907   public List getAcompReferenciaItemFilhosByIett(final String strCodIetts, final AcompReferenciaAref aref, final OrgaoOrg orgaoResponsavel) throws ECARException {
2908 
2909     final ItemEstruturaDao itemDao = new ItemEstruturaDao(null);
2910     List<AcompReferenciaItemAri> lista = new ArrayList<AcompReferenciaItemAri>();
2911 
2912     if (!strCodIetts.equals("")) {
2913       String[] codIett = strCodIetts.split(";");
2914       Set<Long> codIetts = new HashSet<Long>();
2915       for (int i = 0; i < codIett.length; i++) {
2916         if (!"".equals(codIett[i])) {
2917           ItemEstruturaIettMin item = (ItemEstruturaIettMin) itemDao.buscar(ItemEstruturaIettMin.class, Long.valueOf(codIett[i]));
2918           codIetts.add(item.getCodIett());
2919           List<ItemEstruturaIettMin> descendentes = itemDao.getDescendentesMin(item, false);
2920 
2921           for (ItemEstruturaIettMin element : descendentes) {
2922             codIetts.add(element.getCodIett());
2923           }
2924         }
2925       }
2926 
2927       if (!codIetts.isEmpty()) {
2928         StringBuilder sql = new StringBuilder();
2929         sql.append("select ari from AcompReferenciaItemAri ari").append(" where ari.acompReferenciaAref.codAref = :codAref").append(" and ari.itemEstruturaIett.indAtivoIett = 'S' ");
2930 
2931         if (codIetts.size() == 1) {
2932           sql.append(" and ari.itemEstruturaIett.codIett = :codIett ");
2933         }
2934         else {
2935           sql.append(" and ari.itemEstruturaIett.codIett in (:codIett) ");
2936         }
2937 
2938         if (orgaoResponsavel != null && orgaoResponsavel.getCodOrg() != null) {
2939           sql.append(" and ( ari.itemEstruturaIett.orgaoOrgByCodOrgaoResponsavel1Iett.codOrg = :orgaoResp ").append("or ( ari.itemEstruturaIett.orgaoOrgByCodOrgaoResponsavel1Iett.codOrg is null ").append("and ari.itemEstruturaIett.itemEstruturaIett.orgaoOrgByCodOrgaoResponsavel1Iett.codOrg = :orgaoResp ) )");
2940         }
2941 
2942         Query queryAri = this.getSession().createQuery(sql.toString());
2943 
2944         queryAri.setLong("codAref", aref.getCodAref().longValue());
2945 
2946         if (codIetts.size() == 1) {
2947           List<Long> listCodIetts = new ArrayList<Long>(codIetts);
2948           queryAri.setLong("codIett", ((Long) listCodIetts.get(0)).longValue());
2949         }
2950         else {
2951           queryAri.setParameterList("codIett", codIetts);
2952         }
2953 
2954         if (orgaoResponsavel != null && orgaoResponsavel.getCodOrg() != null) {
2955           queryAri.setLong("orgaoResp", orgaoResponsavel.getCodOrg().longValue());
2956         }
2957         lista.addAll((ArrayList<AcompReferenciaItemAri>) queryAri.list());
2958       }
2959     }
2960     return lista;
2961   }
2962 
2963   /**
2964    * Retorna uma lista de Aris a partir de Itens ou seus descendentes desde que
2965    * existam pontos críticos nos itens.
2966    * @param strCodIetts
2967    * @param aref
2968    * @param orgaoResponsavel
2969    * @return
2970    * @throws ECARException
2971    */
2972   public List getAcompReferenciaItemFilhosByIettPorPtosCriticos(final String strCodIetts, final AcompReferenciaAref aref, final OrgaoOrg orgaoResponsavel) throws ECARException {
2973 
2974     final ItemEstruturaDao itemDao = new ItemEstruturaDao(null);
2975     List<AcompReferenciaItemAri> lista = new ArrayList<AcompReferenciaItemAri>();
2976 
2977     if (!strCodIetts.equals("")) {
2978       String[] codIett = strCodIetts.split(";");
2979       Set<Long> codIetts = new HashSet<Long>();
2980       for (int i = 0; i < codIett.length; i++) {
2981         if (!"".equals(codIett[i])) {
2982           ItemEstruturaIettMin item = (ItemEstruturaIettMin) itemDao.buscar(ItemEstruturaIettMin.class, Long.valueOf(codIett[i]));
2983           codIetts.add(item.getCodIett());
2984           List<ItemEstruturaIettMin> descendentes = itemDao.getDescendentesMin(item, false);
2985 
2986           for (ItemEstruturaIettMin element : descendentes) {
2987             codIetts.add(element.getCodIett());
2988           }
2989         }
2990       }
2991 
2992       if (!codIetts.isEmpty()) {
2993         StringBuilder sql = new StringBuilder();
2994         sql.append("select ari from AcompReferenciaItemAri ari").append(" where ari.acompReferenciaAref.codAref = :codAref").append(" and ari.itemEstruturaIett.indAtivoIett = 'S' ");
2995 
2996         if (codIetts.size() == 1) {
2997           sql.append(" and ari.itemEstruturaIett.codIett = :codIett ");
2998         }
2999         else {
3000           sql.append(" and ari.itemEstruturaIett.codIett in (:codIett) ");
3001         }
3002 
3003         if (orgaoResponsavel != null && orgaoResponsavel.getCodOrg() != null) {
3004           sql.append(" and ( ari.itemEstruturaIett.orgaoOrgByCodOrgaoResponsavel1Iett.codOrg = :orgaoResp ").append("or ( ari.itemEstruturaIett.orgaoOrgByCodOrgaoResponsavel1Iett.codOrg is null ").append("and ari.itemEstruturaIett.itemEstruturaIett.orgaoOrgByCodOrgaoResponsavel1Iett.codOrg = :orgaoResp ) )");
3005         }
3006 
3007         Query queryAri = this.getSession().createQuery(sql.toString());
3008 
3009         queryAri.setLong("codAref", aref.getCodAref().longValue());
3010 
3011         if (codIetts.size() == 1) {
3012           List<Long> listCodIetts = new ArrayList<Long>(codIetts);
3013           queryAri.setLong("codIett", ((Long) listCodIetts.get(0)).longValue());
3014         }
3015         else {
3016           queryAri.setParameterList("codIett", codIetts);
3017         }
3018 
3019         if (orgaoResponsavel != null && orgaoResponsavel.getCodOrg() != null) {
3020           queryAri.setLong("orgaoResp", orgaoResponsavel.getCodOrg().longValue());
3021         }
3022         lista.addAll((ArrayList<AcompReferenciaItemAri>) queryAri.list());
3023       }
3024     }
3025 
3026     // Retorna apenas os itens que possuem pontos críticos
3027     List<AcompReferenciaItemAri> listaRetorno = new ArrayList<AcompReferenciaItemAri>();
3028     for (AcompReferenciaItemAri obj : lista) {
3029 
3030       if (obj.getItemEstruturaIett().getPontoCriticoPtcs().size() > 0) {
3031         listaRetorno.add(obj);
3032       }
3033     }
3034 
3035     return listaRetorno;
3036   }
3037 
3038   /**
3039    * Retornar o ARI de um IETT
3040    * @param aris Collection
3041    * @param iett ItemEstruturaIett
3042    * @return AcompReferenciaItemAri ou null
3043    * @throws ECARException
3044    */
3045   public AcompReferenciaItemAri getAriByIett(Collection aris, ItemEstruturaIett iett) throws ECARException {
3046 
3047     try {
3048       for (Iterator it = aris.iterator(); it.hasNext();) {
3049         AcompReferenciaItemAri ari = (AcompReferenciaItemAri) it.next();
3050         if (ari.getItemEstruturaIett().equals(iett)) {
3051           return ari;
3052         }
3053       }
3054       return null;
3055     } catch (Exception e) {
3056       this.logger.error(e);
3057       throw new ECARException(e);
3058     }
3059   }
3060 
3061   /**
3062    * Gerar dados para o gráfico evolução das posições
3063    * @throws ECARException
3064    */
3065   public List getDadosEvolucaoPosicao(HttpServletRequest request) throws ECARException {
3066     try {
3067       AcompReferenciaItemDao acompReferenciaItemDao = new AcompReferenciaItemDao(null);
3068       TipoFuncAcompDao tipoFuncAcompDao = new TipoFuncAcompDao(null);
3069       ItemEstruturaDao itemEstruturaDao = new ItemEstruturaDao(null);
3070       OrgaoDao orgaoDao = new OrgaoDao(null);
3071       OrgaoOrg orgao = null;
3072 
3073       List tpfaOrdenadosEstrutura = tipoFuncAcompDao.getFuncaoAcompOrderByEstruturas();
3074 
3075       if (!"".equals(Pagina.getParamStr(request, "codOrgao"))) {
3076         orgao = (OrgaoOrg) orgaoDao.buscar(OrgaoOrg.class, Long.valueOf(Pagina.getParamStr(request, "codOrgao")));
3077       }
3078 
3079       Collection periodosConsiderados = (Collection) request.getSession().getAttribute("periodosConsiderados" + Pagina.getParamStr(request, "codOrgao"));
3080 
3081       StatusRelatorioSrl statusLiberado = (StatusRelatorioSrl) itemEstruturaDao.buscar(StatusRelatorioSrl.class, Long.valueOf(AcompReferenciaItemDao.STATUS_LIBERADO));
3082 
3083       List niveis = (List) request.getAttribute("listNiveis");
3084 
3085       UsuarioUsu usuario = null;
3086       Set gruposAcessoUsuario = null;
3087       if (((ecar.login.SegurancaECAR) request.getSession().getAttribute("seguranca")) != null) {
3088         usuario = ((ecar.login.SegurancaECAR) request.getSession().getAttribute("seguranca")).getUsuario();
3089         gruposAcessoUsuario = ((ecar.login.SegurancaECAR) request.getSession().getAttribute("seguranca")).getGruposAcesso();
3090       }
3091       Boolean itensSemInformacaoNivelPlanejamento = new Boolean(false);
3092       if ("S".equals(Pagina.getParamStr(request, "semInformacaoNivelPlanejamento"))) {
3093         itensSemInformacaoNivelPlanejamento = new Boolean(true);
3094       }
3095       List itensAcompanhamentos = (List) acompReferenciaItemDao.getItensAcompanhamentoInPeriodosByOrgaoResp(periodosConsiderados, niveis, orgao, usuario, gruposAcessoUsuario, null, null, itensSemInformacaoNivelPlanejamento, null, null)[0];
3096 
3097       // FIXME: variável não utilizada no código
3098       // Comentado por Claudismar
3099       // List listFunAcomp = tipoFuncAcompDao.getTipoFuncAcompEmitePosicao();
3100 
3101       List listAvaliacoes = new ArrayList();
3102 
3103       for (Iterator itPeriodos = periodosConsiderados.iterator(); itPeriodos.hasNext();) {
3104         AcompReferenciaAref acompReferencia = (AcompReferenciaAref) itPeriodos.next();
3105 
3106         Iterator itItens = itensAcompanhamentos.iterator();
3107 
3108         PosicaoBean posicaoBean = new PosicaoBean();
3109         posicaoBean.setARef(acompReferencia);
3110         List coresPosicoes = new ArrayList();
3111 
3112         while (itItens.hasNext()) {
3113 
3114           /*
3115            * Este método só é usado para geração do gráfico, então não precisa
3116            * da ordenação dos itens. No método que ordena os itens, é tratado se
3117            * tipoAcompanhamento == null, o método retorna a própria lista de
3118            * itens. Quando existe um tipoAcompanhamento, o método retorna uma
3119            * lista de AtributoEstruturaListagemItens.
3120            */
3121           AtributoEstruturaListagemItens aeIett = (AtributoEstruturaListagemItens) itItens.next();
3122           // ItemEstruturaIett item = (ItemEstruturaIett) itItens.next();
3123           ItemEstruturaIett item = aeIett.getItem();
3124 
3125           Map map = acompReferenciaItemDao.criarMapPeriodoAri(periodosConsiderados, item);
3126 
3127           if (!map.containsKey(acompReferencia)) {
3128             // Não foi solicitado acompanhamento
3129             coresPosicoes.add("N/A");
3130           }
3131           else {
3132             AcompReferenciaItemAri ari = (AcompReferenciaItemAri) map.get(acompReferencia);
3133 
3134             // entra se o ARI tá liberado ou se não exige liberar acompanhamento
3135             if (ari.getStatusRelatorioSrl().equals(statusLiberado) || acompReferencia.getTipoAcompanhamentoTa().getIndLiberarAcompTa().equals(Pagina.NAO)) {
3136               List relatorios = acompReferenciaItemDao.getAcompRelatorioArelOrderByFuncaoAcomp(ari, tpfaOrdenadosEstrutura);
3137 
3138               for (Iterator itRelatorios = relatorios.iterator(); itRelatorios.hasNext();) {
3139                 AcompRelatorioArel relatorio = (AcompRelatorioArel) itRelatorios.next();
3140 
3141                 if (relatorio.getTipoFuncAcompTpfa().getCodTpfa().toString().equals(Pagina.getParamStr(request, "tipoFuncAcompTpfa"))) {
3142                   if (relatorio.getCor() != null && "S".equals(relatorio.getIndLiberadoArel())) {
3143                     coresPosicoes.add(relatorio.getCor().getCodCor().toString());
3144                   }
3145                   else {
3146                     TipoAcompFuncAcompTafc tafc = new TipoAcompFuncAcompTafc();
3147                     TipoAcompFuncAcompDao tafcDao = new TipoAcompFuncAcompDao(request);
3148                     tafc = tafcDao.buscar(acompReferencia.getTipoAcompanhamentoTa().getCodTa(), relatorio.getTipoFuncAcompTpfa().getCodTpfa());
3149                     // Verifica se é obrigatório
3150                     if (tafc.getIndRegistroPosicaoTafc() != null && tafc.getIndRegistroPosicaoTafc().equals("O")) {
3151                       coresPosicoes.add("BRANCO");
3152                     }
3153                   }
3154                 }
3155               }
3156             }
3157             // Se Exige Liberar Acompanhamento
3158             else {
3159               List relatorios = acompReferenciaItemDao.getAcompRelatorioArelOrderByFuncaoAcomp(ari, tpfaOrdenadosEstrutura);
3160 
3161               if (ari.getAcompRelatorioArels() != null && ari.getAcompRelatorioArels().size() > 0) {
3162                 for (Iterator itRelatorios = relatorios.iterator(); itRelatorios.hasNext();) {
3163                   AcompRelatorioArel relatorio = (AcompRelatorioArel) itRelatorios.next();
3164 
3165                   if (relatorio.getTipoFuncAcompTpfa().getCodTpfa().toString().equals(Pagina.getParamStr(request, "tipoFuncAcompTpfa"))) {
3166                     TipoAcompFuncAcompTafc tafc = new TipoAcompFuncAcompTafc();
3167                     TipoAcompFuncAcompDao tafcDao = new TipoAcompFuncAcompDao(request);
3168                     tafc = tafcDao.buscar(acompReferencia.getTipoAcompanhamentoTa().getCodTa(), relatorio.getTipoFuncAcompTpfa().getCodTpfa());
3169                     // Conta como não liberados apenas os pareceres obrigatórios
3170                     // e não informados
3171                     if (tafc.getIndRegistroPosicaoTafc() != null && tafc.getIndRegistroPosicaoTafc().equals("O") && (relatorio.getIndLiberadoArel() == null || relatorio.getIndLiberadoArel().equals(Pagina.NAO))) {
3172                       // Não foi liberado acompanhamento
3173                       coresPosicoes.add("N/L");
3174                     }
3175                   }
3176                 }
3177               }
3178               else {
3179                 // Não foi solicitado acompanhamento
3180                 coresPosicoes.add("N/A");
3181               }
3182             }
3183           }
3184 
3185         }
3186 
3187         posicaoBean.setCor(coresPosicoes);
3188         listAvaliacoes.add(posicaoBean);
3189       }
3190 
3191       return listAvaliacoes;
3192 
3193     } catch (Exception e) {
3194       this.logger.error(e);
3195       throw new ECARException(e);
3196     }
3197 
3198   }
3199 
3200   /**
3201    * Gerar dados para o gráfico evolução das posições
3202    * @throws ECARException
3203    */
3204   public List getDadosEvolucaoPosicaoGrafico(HttpServletRequest request) throws ECARException {
3205     try {
3206       AcompReferenciaItemDao acompReferenciaItemDao = new AcompReferenciaItemDao(null);
3207       TipoFuncAcompDao tipoFuncAcompDao = new TipoFuncAcompDao(null);
3208       ItemEstruturaDao itemEstruturaDao = new ItemEstruturaDao(null);
3209       OrgaoDao orgaoDao = new OrgaoDao(null);
3210       OrgaoOrg orgao = null;
3211       String tipoFuncAcompTpfa = Pagina.getParamStr(request, "tipoFuncAcompTpfa");
3212 
3213       List tpfaOrdenadosEstrutura = tipoFuncAcompDao.getFuncaoAcompOrderByEstruturas();
3214 
3215       if (!"".equals(Pagina.getParamStr(request, "codOrgao"))) {
3216         orgao = (OrgaoOrg) orgaoDao.buscar(OrgaoOrg.class, Long.valueOf(Pagina.getParamStr(request, "codOrgao")));
3217       }
3218 
3219       Collection periodosConsiderados = (Collection) request.getSession().getAttribute("periodosConsiderados" + Pagina.getParamStr(request, "codOrgao"));
3220 
3221       StatusRelatorioSrl statusLiberado = (StatusRelatorioSrl) itemEstruturaDao.buscar(StatusRelatorioSrl.class, Long.valueOf(AcompReferenciaItemDao.STATUS_LIBERADO));
3222 
3223       List niveis = (List) request.getAttribute("listNiveis");
3224 
3225       UsuarioUsu usuario = null;
3226       Set gruposAcessoUsuario = null;
3227       if (((ecar.login.SegurancaECAR) request.getSession().getAttribute("seguranca")) != null) {
3228         usuario = ((ecar.login.SegurancaECAR) request.getSession().getAttribute("seguranca")).getUsuario();
3229         gruposAcessoUsuario = ((ecar.login.SegurancaECAR) request.getSession().getAttribute("seguranca")).getGruposAcesso();
3230       }
3231       Boolean itensSemInformacaoNivelPlanejamento = new Boolean(false);
3232       if ("S".equals(Pagina.getParamStr(request, "semInformacaoNivelPlanejamento"))) {
3233         itensSemInformacaoNivelPlanejamento = new Boolean(true);
3234       }
3235       List itensAcompanhamentos = (List) acompReferenciaItemDao.getItensAcompanhamentoInPeriodosByOrgaoResp(periodosConsiderados, niveis, orgao, usuario, gruposAcessoUsuario, null, null, itensSemInformacaoNivelPlanejamento, null, null)[0];
3236 
3237       // FIXME: variável não utilizada no código
3238       // Comentado por Claudismar
3239       // List listFunAcomp = tipoFuncAcompDao.getTipoFuncAcompEmitePosicao();
3240 
3241       List listAvaliacoes = new ArrayList();
3242 
3243       for (Iterator itPeriodos = periodosConsiderados.iterator(); itPeriodos.hasNext();) {
3244         AcompReferenciaAref acompReferencia = (AcompReferenciaAref) itPeriodos.next();
3245 
3246         Iterator itItens = itensAcompanhamentos.iterator();
3247 
3248         PosicaoBean posicaoBean = new PosicaoBean();
3249         posicaoBean.setARef(acompReferencia);
3250         List coresPosicoes = new ArrayList();
3251 
3252         while (itItens.hasNext()) {
3253 
3254           /*
3255            * Este método só é usado para geração do gráfico, então não precisa
3256            * da ordenação dos itens. No método que ordena os itens, é tratado se
3257            * tipoAcompanhamento == null, o método retorna a própria lista de
3258            * itens. Quando existe um tipoAcompanhamento, o método retorna uma
3259            * lista de AtributoEstruturaListagemItens.
3260            */
3261           AtributoEstruturaListagemItens aeIett = (AtributoEstruturaListagemItens) itItens.next();
3262           // ItemEstruturaIett item = (ItemEstruturaIett) itItens.next();
3263           ItemEstruturaIett item = aeIett.getItem();
3264 
3265           Map map = acompReferenciaItemDao.criarMapPeriodoAri(periodosConsiderados, item);
3266 
3267           if (!map.containsKey(acompReferencia)) {
3268             // Não foi solicitado acompanhamento
3269             // coresPosicoes.add(Cor.NAO_ACOMPANHADO);
3270           }
3271           else {
3272             AcompReferenciaItemAri ari = (AcompReferenciaItemAri) map.get(acompReferencia);
3273 
3274             // entra se o ARI tá liberado ou se não exige liberar acompanhamento
3275             if (ari.getStatusRelatorioSrl().equals(statusLiberado) || acompReferencia.getTipoAcompanhamentoTa().getIndLiberarAcompTa().equals(Pagina.NAO)) {
3276               List relatorios = acompReferenciaItemDao.getAcompRelatorioArelOrderByFuncaoAcomp(ari, tpfaOrdenadosEstrutura);
3277 
3278               for (Iterator itRelatorios = relatorios.iterator(); itRelatorios.hasNext();) {
3279                 AcompRelatorioArel relatorio = (AcompRelatorioArel) itRelatorios.next();
3280 
3281                 if (relatorio.getTipoFuncAcompTpfa().getCodTpfa().toString().equals(tipoFuncAcompTpfa)) {
3282                   if (relatorio.getCor() != null && "S".equals(relatorio.getIndLiberadoArel())) {
3283                     coresPosicoes.add(relatorio.getCor().getCodCor().toString());
3284                   }
3285                   else {
3286                     TipoAcompFuncAcompTafc tafc = new TipoAcompFuncAcompTafc();
3287                     TipoAcompFuncAcompDao tafcDao = new TipoAcompFuncAcompDao(request);
3288                     tafc = tafcDao.buscar(acompReferencia.getTipoAcompanhamentoTa().getCodTa(), relatorio.getTipoFuncAcompTpfa().getCodTpfa());
3289                     // Verifica se é obrigatório
3290                     if (tafc.getIndRegistroPosicaoTafc() != null && tafc.getIndRegistroPosicaoTafc().equals("O")) {
3291                       coresPosicoes.add(Cor.BRANCO);
3292                     }
3293                   }
3294                 }
3295               }
3296             }
3297             // Se Exige Liberar Acompanhamento
3298             else {
3299               List relatorios = acompReferenciaItemDao.getAcompRelatorioArelOrderByFuncaoAcomp(ari, tpfaOrdenadosEstrutura);
3300 
3301               if (ari.getAcompRelatorioArels() != null && ari.getAcompRelatorioArels().size() > 0) {
3302                 for (Iterator itRelatorios = relatorios.iterator(); itRelatorios.hasNext();) {
3303                   AcompRelatorioArel relatorio = (AcompRelatorioArel) itRelatorios.next();
3304 
3305                   if (relatorio.getTipoFuncAcompTpfa().getCodTpfa().toString().equals(tipoFuncAcompTpfa)) {
3306                     TipoAcompFuncAcompTafc tafc = new TipoAcompFuncAcompTafc();
3307                     TipoAcompFuncAcompDao tafcDao = new TipoAcompFuncAcompDao(request);
3308                     tafc = tafcDao.buscar(acompReferencia.getTipoAcompanhamentoTa().getCodTa(), relatorio.getTipoFuncAcompTpfa().getCodTpfa());
3309                     // Conta como não liberados apenas os pareceres obrigatórios
3310                     // e não informados
3311                     if (tafc.getIndRegistroPosicaoTafc() != null && tafc.getIndRegistroPosicaoTafc().equals("O") && (relatorio.getIndLiberadoArel() == null || relatorio.getIndLiberadoArel().equals(Pagina.NAO))) {
3312                       // Não foi liberado acompanhamento
3313                       coresPosicoes.add(Cor.NAO_LIBERADO);
3314                     }
3315                   }
3316                 }
3317               }
3318               else {
3319                 // Não foi solicitado acompanhamento
3320                 coresPosicoes.add(Cor.NAO_ACOMPANHADO);
3321               }
3322             }// fim else exije liberar
3323           } // fim else solicitado acompanhamento
3324 
3325         }// fim while
3326 
3327         posicaoBean.setCor(coresPosicoes);
3328         listAvaliacoes.add(posicaoBean);
3329       }
3330 
3331       return listAvaliacoes;
3332 
3333     } catch (Exception e) {
3334       this.logger.error(e);
3335       throw new ECARException(e);
3336     }
3337 
3338   }
3339 
3340   public List getUltimosAcompanhamentosItem(AcompReferenciaItemAri ari, TipoFuncAcompTpfa tpfa, Integer qtdeUltimosAcompanhamentos) throws HibernateException, ECARException {
3341     try {
3342       StringBuilder str = new StringBuilder();
3343 
3344       str.append("select arel from AcompRelatorioArel arel");
3345       str.append(" join arel.acompReferenciaItemAri as ari");
3346       str.append(" join ari.acompReferenciaAref as aref");
3347       str.append(" where ari.itemEstruturaIett.codIett = :codItem");
3348       str.append("   and ari.itemEstruturaIett.indAtivoIett = 'S'");
3349       str.append("   and arel.tipoFuncAcompTpfa.codTpfa = :codTpfa");
3350       str.append("   and arel.situacaoSit is not null");
3351       str.append("   and aref.tipoAcompanhamentoTa.codTa = :codTa");
3352       if (qtdeUltimosAcompanhamentos != null) {
3353         str.append("   and (aref.anoAref <> :ano");
3354         str.append("        or (aref.anoAref = :ano and aref.mesAref <> :mes))");
3355       }
3356       str.append(" order by aref.anoAref desc, aref.mesAref desc");
3357 
3358       Query query = this.getSession().createQuery(str.toString());
3359       query.setLong("codItem", ari.getItemEstruturaIett().getCodIett().longValue());
3360       query.setLong("codTpfa", tpfa.getCodTpfa().longValue());
3361       query.setLong("codTa", ari.getAcompReferenciaAref().getTipoAcompanhamentoTa().getCodTa().longValue());
3362 
3363       if (qtdeUltimosAcompanhamentos != null) {
3364         query.setString("ano", ari.getAcompReferenciaAref().getAnoAref());
3365         query.setString("mes", ari.getAcompReferenciaAref().getMesAref());
3366         query.setMaxResults(qtdeUltimosAcompanhamentos.intValue());
3367       }
3368 
3369       return query.list();
3370 
3371     } catch (HibernateException e) {
3372       throw new ECARException(e);
3373     }
3374   }
3375 
3376   /**
3377    * Retorna uma lista de AcompReferenciaItemAri, sendo que:<br>
3378    * Se opcaoModelo for "ECAR-001B": Retorna Aris de um órgão específico;<br>
3379    * Se opcaoModelo for "ECAR-002B": Retorna Aris de uma situação (Cor)
3380    * específica.
3381    * @param opcaoModelo
3382    * @param chave
3383    * @return List
3384    * @throws ECARException
3385    */
3386   public List getAcompRelatorioAcompanhamentoByAris(List codArisSelecionados, AcompReferenciaAref mesReferencia, String opcaoModelo, String chave, String codTpfa) throws ECARException {
3387     try {
3388       StringBuilder sql = new StringBuilder("select arel from AcompRelatorioArel arel");
3389 
3390       sql.append(" where ");
3391       sql.append(" arel.acompReferenciaItemAri.itemEstruturaIett.indAtivoIett = 'S'");
3392 
3393       if ("ECAR-001B".equalsIgnoreCase(opcaoModelo) && !"".equals(chave)) {
3394         sql.append(" and arel.acompReferenciaItemAri.itemEstruturaIett.orgaoOrgByCodOrgaoResponsavel1Iett.codOrg = :chave ");
3395       }
3396       else if ("ECAR-002B".equalsIgnoreCase(opcaoModelo) && !"".equals(chave)) {
3397         sql.append(" and arel.cor.codCor = :chave ");
3398       }
3399 
3400       if (codArisSelecionados != null && codArisSelecionados.size() > 1) {
3401         sql.append(" and arel.acompReferenciaItemAri.codAri in (:listaAris) ");
3402       }
3403       else if (codArisSelecionados != null && !codArisSelecionados.isEmpty()) {
3404         sql.append(" and arel.acompReferenciaItemAri.codAri = :listaAris ");
3405       }
3406 
3407       if (!"".equals(codTpfa)) {
3408         sql.append(" and arel.tipoFuncAcompTpfa.codTpfa = :codTpfa");
3409       }
3410 
3411       sql.append(" and arel.acompReferenciaItemAri.acompReferenciaAref.codAref = :codAref").append(" order by arel.acompReferenciaItemAri.itemEstruturaIett.nomeIett");
3412 
3413       Query q = this.session.createQuery(sql.toString());
3414 
3415       q.setLong("codAref", mesReferencia.getCodAref().longValue());
3416 
3417       if (!"".equals(chave)) {
3418         q.setLong("chave", Long.valueOf(chave).longValue());
3419       }
3420 
3421       if (codArisSelecionados != null && codArisSelecionados.size() > 1) {
3422         q.setParameterList("listaAris", codArisSelecionados);
3423       }
3424       else if (codArisSelecionados != null && !codArisSelecionados.isEmpty()) {
3425         q.setLong("listaAris", ((Long) codArisSelecionados.get(0)).longValue());
3426       }
3427 
3428       if (!"".equals(codTpfa)) {
3429         q.setLong("codTpfa", Long.valueOf(codTpfa).longValue());
3430       }
3431 
3432       List retorno = q.list();
3433 
3434       if (retorno != null && !retorno.isEmpty()) {
3435         // Alterado ref. Mantis 7557: ordem hierárquica do parecer, ou seja, a
3436         // ordem inversa de apresentação dos campos na tela de "dados gerais":
3437         // smiles à frente e seta a seguir.
3438         List arelsTpfaOrdenados = this.getAcompRelatorioArelOrderByFuncaoAcomp(retorno, new TipoFuncAcompDao(null).getFuncaoAcompOrderByEstruturasHierarquicamente());
3439         ordenarListaRelatorioAcompanhamento(arelsTpfaOrdenados, opcaoModelo);
3440         retorno.clear();
3441         retorno.addAll(arelsTpfaOrdenados);
3442       }
3443 
3444       return retorno;
3445 
3446     } catch (HibernateException e) {
3447       e.printStackTrace();
3448       this.logger.error(e);
3449       throw new ECARException(e);
3450     }
3451   }
3452 
3453   /**
3454    * Médodo que ordena os itens para o relatório de acompanhamento. Este método
3455    * só é utilizado por getAcompRelatorioAcompanhamentoByAris().<br>
3456    * <br>
3457    * Se opcaoModelo == RELATORIO_ORGAO, primeiro ordeno por situação e depois
3458    * por órgão para ficar ordenado por "Órgão e Situação".<br>
3459    * Se opcaoModelo == RELATORIO_ORGAO_ESPECIFICO os itens serão de 1 órgão
3460    * específico, portanto só ordeno por situação.<br>
3461    * Se opcaoModelo == RELATORIO_SITUACAO_ESPECIFICO os itens são só de 1
3462    * situação, só ordeno por órgão.<br>
3463    * Se opcaoModelo == RELATORIO_SITUACAO, primeiro ordeno por órgão e depois
3464    * por situação para ficar ordenado por "Situação e Orgão".<br>
3465    * Se opcaoModelo == RELATORIO_ESTRUTURA, ordeno os itens conforme estiver
3466    * configurado para ordenar. <br>
3467    * Obs.: É sempre a última ordenação que predomina.
3468    * @param lista
3469    * @param opcaoModelo
3470    * @throws ECARException
3471    */
3472   private void ordenarListaRelatorioAcompanhamento(List lista, String opcaoModelo) throws ECARException {
3473 
3474     // Se opcaoModelo == RELATORIO_ORGAO, primeiro ordeno por situação e depois
3475     // por órgão para ficar ordenado por "Órgão e Situação".
3476     if (RELATORIO_ORGAO.equals(opcaoModelo)) {
3477 
3478       /*
3479        * TEste ref. mantis 0007679: O Relatório para o Conselho Revisor, versão
3480        * PPA, quando a emissão solicitada é por órgão, deve classificar por
3481        * órgão e também por "sigla" do item (em ordem crescente).
3482        */
3483       boolean ppa = false;
3484       if (lista != null && !lista.isEmpty()) {
3485         AcompRelatorioArel arel = (AcompRelatorioArel) lista.get(0);
3486         ppa = arel.getAcompReferenciaItemAri().getAcompReferenciaAref().getTipoAcompanhamentoTa().getDescricaoTa().contains("PPA");
3487       }
3488 
3489       if (!ppa) {
3490         ordenarArelsPorIettsConfigurados(lista);
3491       }
3492       else {
3493         Collections.sort(lista, new Comparator() {
3494           public int compare(Object arg1, Object arg2) {
3495 
3496             AcompRelatorioArel arel1 = (AcompRelatorioArel) arg1;
3497             AcompRelatorioArel arel2 = (AcompRelatorioArel) arg2;
3498 
3499             ItemEstruturaIett iett1 = arel1.getAcompReferenciaItemAri().getItemEstruturaIett();
3500             ItemEstruturaIett iett2 = arel2.getAcompReferenciaItemAri().getItemEstruturaIett();
3501 
3502             return iett1.getSiglaIett().compareTo(iett2.getSiglaIett());
3503           }
3504 
3505         });
3506       }
3507 
3508       Collections.sort(lista, new Comparator() {
3509         public int compare(Object arg1, Object arg2) {
3510 
3511           AcompRelatorioArel arel1 = (AcompRelatorioArel) arg1;
3512           AcompRelatorioArel arel2 = (AcompRelatorioArel) arg2;
3513 
3514           OrgaoOrg org1 = arel1.getAcompReferenciaItemAri().getItemEstruturaIett().getOrgaoOrgByCodOrgaoResponsavel1Iett();
3515           OrgaoOrg org2 = arel2.getAcompReferenciaItemAri().getItemEstruturaIett().getOrgaoOrgByCodOrgaoResponsavel1Iett();
3516 
3517           if (org1 == null && org2 == null)
3518             return 0;
3519           if (org1 != null && org2 == null)
3520             return 1;
3521           if (org1 == null && org2 != null)
3522             return -1;
3523 
3524           return org1.getSiglaOrg().compareTo(org2.getSiglaOrg());
3525         }
3526 
3527       });
3528     }
3529     // Se opcaoModelo == RELATORIO_ORGAO_ESPECIFICO os itens serão de 1 órgão
3530     // específico, portanto só ordeno por situação.
3531     else if (RELATORIO_ORGAO_ESPECIFICO.equals(opcaoModelo)) {
3532       Collections.sort(lista, new Comparator() {
3533         public int compare(Object arg1, Object arg2) {
3534 
3535           AcompRelatorioArel arel1 = (AcompRelatorioArel) arg1;
3536           AcompRelatorioArel arel2 = (AcompRelatorioArel) arg2;
3537 
3538           Cor cor1 = arel1.getCor();
3539           Cor cor2 = arel2.getCor();
3540 
3541           if (cor1 == null && cor2 == null)
3542             return 0;
3543           if (cor1 != null && cor2 == null)
3544             return 1;
3545           if (cor1 == null && cor2 != null)
3546             return -1;
3547 
3548           return cor1.getOrdemCor().compareTo(cor2.getOrdemCor());
3549         }
3550 
3551       });
3552 
3553       ordenarArelsPorIettsConfigurados(lista);
3554 
3555     }
3556     // opcaoModelo == RELATORIO_SITUACAO_ESPECIFICO os itens são só de 1
3557     // situação, só ordeno por órgão.
3558     else if (RELATORIO_SITUACAO_ESPECIFICO.equals(opcaoModelo)) {
3559 
3560       ordenarArelsPorIettsConfigurados(lista);
3561 
3562       Collections.sort(lista, new Comparator() {
3563         public int compare(Object arg1, Object arg2) {
3564 
3565           AcompRelatorioArel arel1 = (AcompRelatorioArel) arg1;
3566           AcompRelatorioArel arel2 = (AcompRelatorioArel) arg2;
3567 
3568           OrgaoOrg org1 = arel1.getAcompReferenciaItemAri().getItemEstruturaIett().getOrgaoOrgByCodOrgaoResponsavel1Iett();
3569           OrgaoOrg org2 = arel2.getAcompReferenciaItemAri().getItemEstruturaIett().getOrgaoOrgByCodOrgaoResponsavel1Iett();
3570 
3571           if (org1 == null && org2 == null)
3572             return 0;
3573           if (org1 != null && org2 == null)
3574             return 1;
3575           if (org1 == null && org2 != null)
3576             return -1;
3577 
3578           return org1.getSiglaOrg().compareTo(org2.getSiglaOrg());
3579         }
3580 
3581       });
3582     }
3583     // Se opcaoModelo == RELATORIO_SITUACAO, primeiro ordeno por órgão e depois
3584     // por situação para ficar ordenado por "Situação e Orgão".
3585     else if (RELATORIO_SITUACAO.equals(opcaoModelo)) {
3586       // Situação e órgão
3587 
3588       ordenarArelsPorIettsConfigurados(lista);
3589 
3590       Collections.sort(lista, new Comparator() {
3591         public int compare(Object arg1, Object arg2) {
3592 
3593           AcompRelatorioArel arel1 = (AcompRelatorioArel) arg1;
3594           AcompRelatorioArel arel2 = (AcompRelatorioArel) arg2;
3595 
3596           OrgaoOrg org1 = arel1.getAcompReferenciaItemAri().getItemEstruturaIett().getOrgaoOrgByCodOrgaoResponsavel1Iett();
3597           OrgaoOrg org2 = arel2.getAcompReferenciaItemAri().getItemEstruturaIett().getOrgaoOrgByCodOrgaoResponsavel1Iett();
3598 
3599           if (org1 == null && org2 == null)
3600             return 0;
3601           if (org1 != null && org2 == null)
3602             return 1;
3603           if (org1 == null && org2 != null)
3604             return -1;
3605 
3606           return org1.getSiglaOrg().compareTo(org2.getSiglaOrg());
3607         }
3608 
3609       });
3610 
3611       Collections.sort(lista, new Comparator() {
3612         public int compare(Object arg1, Object arg2) {
3613 
3614           AcompRelatorioArel arel1 = (AcompRelatorioArel) arg1;
3615           AcompRelatorioArel arel2 = (AcompRelatorioArel) arg2;
3616 
3617           Cor cor1 = arel1.getCor();
3618           Cor cor2 = arel2.getCor();
3619 
3620           if (cor1 == null && cor2 == null)
3621             return 0;
3622           if (cor1 != null && cor2 == null)
3623             return 1;
3624           if (cor1 == null && cor2 != null)
3625             return -1;
3626 
3627           return cor1.getOrdemCor().compareTo(cor2.getOrdemCor());
3628         }
3629 
3630       });
3631     }
3632     // Se opcaoModelo == RELATORIO_ESTRUTURA, ordeno os itens conforme estiver
3633     // configurado para ordenar.
3634     else if (RELATORIO_ESTRUTURA.equals(opcaoModelo)) {
3635       ordenarArelsPorIettsConfigurados(lista);
3636     }
3637   }
3638 
3639   private void ordenarArelsPorIettsConfigurados(List lista) throws ECARException {
3640     List ietts = new ArrayList();
3641     TipoAcompanhamentoTa tipoAcomp = null;
3642 
3643     for (Iterator itAcomps = lista.iterator(); itAcomps.hasNext();) {
3644       AcompRelatorioArel arel = (AcompRelatorioArel) itAcomps.next();
3645 
3646       if (tipoAcomp == null) {
3647         tipoAcomp = arel.getAcompReferenciaItemAri().getAcompReferenciaAref().getTipoAcompanhamentoTa();
3648       }
3649       if (!ietts.contains(arel.getAcompReferenciaItemAri().getItemEstruturaIett())) {
3650         ietts.add(arel.getAcompReferenciaItemAri().getItemEstruturaIett());
3651       }
3652     }
3653 
3654     List aeList = new ItemEstruturaDao(null).getItensOrdenados(ietts, tipoAcomp);
3655     List arels = new ArrayList();
3656 
3657     for (Iterator itAe = aeList.iterator(); itAe.hasNext();) {
3658       AtributoEstruturaListagemItens ae = (AtributoEstruturaListagemItens) itAe.next();
3659 
3660       for (Iterator itArels = lista.iterator(); itArels.hasNext();) {
3661         AcompRelatorioArel arel = (AcompRelatorioArel) itArels.next();
3662 
3663         if (!arels.contains(arel) && arel.getAcompReferenciaItemAri().getItemEstruturaIett().equals(ae.getItem())) {
3664           arels.add(arel);
3665         }
3666       }
3667     }
3668 
3669     lista.clear();
3670     lista.addAll(arels);
3671   }
3672 
3673   /**
3674    * Lista os itens ARI de acordo com a data limite informada. <br>
3675    * @author rogerio
3676    * @since 0.1, 23/02/2007
3677    * @version 0.1, 23/02/2007
3678    * @param dataLimiteStr
3679    * @return List
3680    * @throws ECARException
3681    */
3682   public List listarAcompReferenciaItemPorDataLimiteFisico(String dataLimiteStr) throws ECARException {
3683     List list = null;
3684 
3685     try {
3686       Query query = session.createQuery("from AcompReferenciaItemAri " + "where dataLimiteAcompFisicoAri = :data " + "order by codAri asc ");
3687 
3688       Date data = Data.parseDate(dataLimiteStr);
3689       query.setDate("data", data);
3690 
3691       list = query.list();
3692     } catch (HibernateException e) {
3693       this.logger.error(e);
3694       throw new ECARException("erro.hibernateException");
3695     }
3696 
3697     return list;
3698   }
3699 
3700   /**
3701    * Lista os itens ARLI de acordo com a data limite informada. <br>
3702    * @author rogerio
3703    * @since 0.1, 26/02/2007
3704    * @version 0.1, 26/02/2007
3705    * @param dataLimiteStr
3706    * @return List
3707    * @throws ECARException
3708    */
3709   public List listarAcompReferenciaItemLimitesPorVenctoParecer(String dataLimiteStr) throws ECARException {
3710     List list = null;
3711 
3712     try {
3713       Query query = session.createQuery("from AcompRefItemLimitesArli " + "where dataLimiteArli = :data " + "order by dataLimiteArli asc ");
3714 
3715       Date data = Data.parseDate(dataLimiteStr);
3716       query.setDate("data", data);
3717 
3718       list = query.list();
3719     } catch (HibernateException e) {
3720       this.logger.error(e);
3721       throw new ECARException("erro.hibernateException");
3722     }
3723 
3724     return (list == null ? new ArrayList() : list);
3725   }
3726 
3727   /**
3728    * Método que traz 2 listas:<br>
3729    * [0] = Lista de Aris dos códigos passados como parâmetros.<br>
3730    * [1] = Lista de Itens dos Aris dos códigos passados como parâmetros.<br>
3731    * @author aleixo
3732    * @since 04/06/2007
3733    * @param codAris
3734    * @return List
3735    * @throws ECARException
3736    */
3737   public List[] listarArisAndIetts(List codAris) throws ECARException {
3738     List listAris = new ArrayList();
3739     List listIetts = new ArrayList();
3740 
3741     try {
3742 
3743       StringBuilder selectAri = new StringBuilder();
3744       StringBuilder selectIett = new StringBuilder();
3745       StringBuilder where = new StringBuilder();
3746 
3747       selectAri.append("select ari from AcompReferenciaItemAri ari where ");
3748       selectIett.append("select ari.itemEstruturaIett from AcompReferenciaItemAri ari where ");
3749 
3750       int tamanho = codAris.size() - 1;
3751       int cont = 0;
3752       for (Iterator it = codAris.iterator(); it.hasNext();) {
3753         Object cod = (Object) it.next();
3754 
3755         where.append(" ari.codAri = " + cod.toString());
3756 
3757         if (cont < tamanho) {
3758           where.append(" or ");
3759         }
3760 
3761         cont++;
3762       }
3763 
3764       selectAri.append(where.toString());
3765       selectIett.append(where.toString()).append(" and ari.itemEstruturaIett.indAtivoIett = 'S' ");
3766 
3767       Query query = this.session.createQuery(selectAri.toString());
3768       listAris = query.list();
3769 
3770       query = this.session.createQuery(selectIett.toString());
3771       listIetts = query.list();
3772 
3773     } catch (HibernateException e) {
3774       this.logger.error(e);
3775       throw new ECARException("erro.hibernateException");
3776     }
3777 
3778     return new List[] { (listAris != null ? listAris : new ArrayList()), (listIetts != null ? listIetts : new ArrayList()) };
3779   }
3780 
3781   public List getAcompItemReferenciasOrderByReferecias(AcompReferenciaItemAri referenciaItem, Collection periodosConsiderados) throws ECARException {
3782     try {
3783       StringBuilder query = new StringBuilder("");
3784       int numPeriodos = 1;
3785 
3786       if (periodosConsiderados != null) {
3787         query = new StringBuilder("SELECT ari FROM AcompReferenciaItemAri ari ").append(" JOIN ari.acompReferenciaAref as aref").append(" JOIN ari.acompRelatorioArels as arels").append(" JOIN arels.tipoFuncAcompTpfa as tpfa")
3788         // .append(" JOIN arels.situacaoSit       as sit  ")
3789         .append(" where ari.itemEstruturaIett = ? and aref.codAref in (:listaAcompanhamentos) ").append(" order by ari.acompReferenciaAref.anoAref asc, ari.acompReferenciaAref.mesAref asc");
3790       }
3791       else {
3792         query = new StringBuilder("select ari from AcompReferenciaItemAri ari ").append("where ari.itemEstruturaIett = ?");
3793       }
3794 
3795       Query queryAri = this.getSession().createQuery(query.toString());
3796       queryAri.setLong(0, referenciaItem.getItemEstruturaIett().getCodIett().longValue());
3797 
3798       List listaCodigosAref = new ArrayList();
3799       if (periodosConsiderados != null) {
3800         // List listaCodigosAref = new ArrayList();
3801         numPeriodos = periodosConsiderados.size();
3802 
3803         for (Iterator it = periodosConsiderados.iterator(); it.hasNext();) {
3804           AcompReferenciaAref aReferencia = (AcompReferenciaAref) it.next();
3805           listaCodigosAref.add(aReferencia.getCodAref());
3806         }
3807 
3808         queryAri.setParameterList("listaAcompanhamentos", listaCodigosAref);
3809       }
3810 
3811       return queryAri.list();
3812     } catch (HibernateException e) {
3813       this.logger.error(e);
3814       throw new ECARException(e);
3815     }
3816 
3817   }
3818 
3819   public Map agrupaRelatorioTpfa_e_Aref(List listaAris, Collection periodosConsiderados) {
3820     /*
3821      * Map com a chave pela funcao de acompanhamento para organizacao das linhas
3822      * por tipo de funcao de acompanhamento
3823      */
3824     Map mapTpfaReferenciaRelatorio = new HashMap<TipoFuncAcompTpfa, Map>();
3825     int numPeriodos = periodosConsiderados.size();
3826 
3827     /*
3828      * Map para organizao das colunas de referencia
3829      */
3830     Map mapReferenciaRelatorio = null;
3831 
3832     for (Iterator itAris = listaAris.iterator(); itAris.hasNext();) {
3833       AcompReferenciaItemAri ari = (AcompReferenciaItemAri) itAris.next();
3834       Set arels = ari.getAcompRelatorioArels();
3835 
3836       for (Iterator itArels = arels.iterator(); itArels.hasNext();) {
3837         AcompRelatorioArel arel = (AcompRelatorioArel) itArels.next();
3838 
3839         /*
3840          * if (!mapTpfaReferenciaRelatorio
3841          * .containsKey(arel.getTipoFuncAcompTpfa().getLabelPosicaoTpfa() ) ){
3842          * mapTpfaReferenciaRelatorio
3843          * .put(arel.getTipoFuncAcompTpfa().getLabelPosicaoTpfa(), new HashMap<
3844          * Long ,AcompRelatorioArel>(numPeriodos) ); }
3845          */
3846         if (!mapTpfaReferenciaRelatorio.containsKey(arel.getTipoFuncAcompTpfa())) {
3847           mapTpfaReferenciaRelatorio.put(arel.getTipoFuncAcompTpfa(), new HashMap<Long, AcompRelatorioArel>(numPeriodos));
3848         }
3849         else {
3850           Map mapTpfaRef = (Map) mapTpfaReferenciaRelatorio.get(arel.getTipoFuncAcompTpfa());
3851 
3852           if (!mapTpfaRef.containsKey(arel.getAcompReferenciaItemAri().getAcompReferenciaAref())) {
3853             mapTpfaRef.put(arel.getAcompReferenciaItemAri().getAcompReferenciaAref(), arel);
3854           }
3855         }
3856       }
3857     }
3858     return mapTpfaReferenciaRelatorio;
3859 
3860   }
3861 
3862   /**
3863    * Returna um boolean que indica se o usuário é administrador de um
3864    * acompanhamento que ainda não foi liberado
3865    * @param itemEstrutura ItemEstruturaIett
3866    * @param gruposUsuario Grupos os quais o usuário pertence
3867    * @param acompAri AcompReferenciaItemAri
3868    * @param tipoAcompanhamento TipoAcompanhamentoTa tipo de acompanhament
3869    *          escolhido
3870    * @return boolean
3871    * @throws ECARException
3872    */
3873   private boolean usuarioAdministraAcompanhamentoNaoLiberado(ItemEstruturaIett itemEstrutura, Set gruposUsuario, AcompReferenciaItemAri acompAri, TipoAcompanhamentoTa tipoAcompanhamento) throws ECARException {
3874 
3875     boolean usuarioAdministraAcompanhamentoNaoLiberado = false;
3876     Boolean administradorAcompanhamento = new Boolean(false);
3877 
3878     String exigeLiberarAcompanhamento = tipoAcompanhamento.getIndLiberarAcompTa();
3879 
3880     // verifica se o usuario é administrador do tipo de acompanhamento
3881     administradorAcompanhamento = new Boolean(validaPermissao.permissaoAcessoReferencia(acompAri.getAcompReferenciaAref().getTipoAcompanhamentoTa(), gruposUsuario));
3882 
3883     // administradorAcompanhamento = new Boolean
3884     // (validaPermissao.permissaoAcessoReferencia(tipoAcompanhamento,
3885     // gruposUsuario ));
3886 
3887     if (administradorAcompanhamento && exigeLiberarAcompanhamento.equals("S")) {
3888 
3889       StatusRelatorioSrl statusLiberado = (StatusRelatorioSrl) buscar(StatusRelatorioSrl.class, Long.valueOf(STATUS_LIBERADO));
3890 
3891       if (!acompAri.getStatusRelatorioSrl().equals(statusLiberado)) {
3892 
3893         usuarioAdministraAcompanhamentoNaoLiberado = true;
3894       }
3895     }
3896 
3897     return usuarioAdministraAcompanhamentoNaoLiberado;
3898   }
3899 
3900   /**
3901    * Retorna um booleano que indica se o usuário logado pode emitir parecer do
3902    * ítem de um acompanhamento para determinada referência escolhida e se o
3903    * parecer ainda não foi liberado
3904    * @param itemEstrutura ItemEstruturaIett
3905    * @param tpfaOrdenadosPorEstrutura Lista de tipos de função de acompanhamento
3906    *          ordenadas
3907    * @param usuario Usuário logado no sistema
3908    * @param acompAri AcomReferenciaItemAri
3909    * @return boolean
3910    * @throws ECARException
3911    */
3912   private boolean usuarioLogadoEmiteParecerNaoLiberado(ItemEstruturaIett itemEstrutura, List tpfaOrdenadosPorEstrutura, UsuarioUsu usuario, AcompReferenciaItemAri acompAri) throws ECARException {
3913 
3914     boolean usuarioLogadoEmiteParecerNaoLiberado = false;
3915     boolean usuarioLogadoEmiteParecer = false;
3916 
3917     // Dao do objeto principal(ItemEstUsutpfuac) onde veremos a permissão do
3918     // usuário/grupo
3919     ItemEstUsutpfuacDao itemEstUsuDao = new ItemEstUsutpfuacDao(request);
3920     // Iterator itPeriodosAcao = periodosConsiderados.iterator();
3921     // Map mapAcao = criarMapPeriodoAri(periodosConsiderados, itemEstrutura);
3922 
3923     // if(itPeriodosAcao.hasNext()) {
3924     // Pega só o período selecionado (Aref), que é o primeiro
3925     // AcompReferenciaAref acompReferencia = (AcompReferenciaAref)
3926     // itPeriodosAcao.next();
3927     // if(!mapAcao.isEmpty() && mapAcao.containsKey(acompReferencia)) {
3928     // AcompReferenciaItemAri ariAcao = (AcompReferenciaItemAri)
3929     // mapAcao.get(acompReferencia);
3930 
3931     // Pega os Arels do Ari selecionado
3932     List relatorios = getAcompRelatorioArelOrderByFuncaoAcomp(acompAri, tpfaOrdenadosPorEstrutura);
3933     Iterator itRelatorios = relatorios.iterator();
3934 
3935     while (itRelatorios.hasNext()) {
3936       AcompRelatorioArel relatorio = (AcompRelatorioArel) itRelatorios.next();
3937 
3938       ItemEstUsutpfuacIettutfa itemEstUsu = null;
3939 
3940       if (relatorio.getTipoFuncAcompTpfa() != null) {
3941 
3942         try {
3943           itemEstUsu = itemEstUsuDao.buscar(itemEstrutura.getCodIett(), relatorio.getTipoFuncAcompTpfa().getCodTpfa());
3944         } catch (ECARException e) {
3945           Logger.getLogger(this.getClass()).error(e);
3946           // e.printStackTrace();
3947         }
3948         // Verifica se a permissão é de grupo ou usuário
3949         if (itemEstUsu != null && itemEstUsu.getUsuarioUsu() != null) {
3950           usuarioLogadoEmiteParecer = itemEstUsu.getUsuarioUsu().getCodUsu().equals(usuario.getCodUsu());
3951 
3952           if (usuarioLogadoEmiteParecer && !"S".equals(relatorio.getIndLiberadoArel())) {
3953             usuarioLogadoEmiteParecerNaoLiberado = true;
3954             break;
3955           }
3956         }
3957         else if (itemEstUsu != null && itemEstUsu.getSisAtributoSatb() != null) {
3958           if (itemEstUsu.getSisAtributoSatb().getUsuarioAtributoUsuas() != null) {
3959             Iterator itUsuarios = itemEstUsu.getSisAtributoSatb().getUsuarioAtributoUsuas().iterator();
3960             while (itUsuarios.hasNext()) {
3961               UsuarioAtributoUsua usuarioAtributoUsua = (UsuarioAtributoUsua) itUsuarios.next();
3962               if (usuarioAtributoUsua.getUsuarioUsu().getCodUsu().equals(usuario.getCodUsu())) {
3963 
3964                 if (!"S".equals(relatorio.getIndLiberadoArel())) {
3965                   usuarioLogadoEmiteParecerNaoLiberado = true;
3966                   break;
3967                 }
3968 
3969               }
3970             }
3971           }
3972         }
3973       }
3974       // else
3975       // continue;
3976     }// fecha while relatórios
3977     // }
3978     // }
3979 
3980     return usuarioLogadoEmiteParecerNaoLiberado;
3981   }
3982 
3983   /**
3984    * Retorna um booleano que indica se o usuário logado pode emitir parecer do
3985    * ítem de um acompanhamento para determinada referência escolhida
3986    * @param itemEstrutura ItemEstruturaIett
3987    * @param tpfaOrdenadosPorEstrutura Lista de tipos de função de acompanhamento
3988    *          ordenadas
3989    * @param usuario Usuário logado no sistema
3990    * @param acompAri AcomReferenciaItemAri
3991    * @return boolean
3992    * @throws ECARException
3993    */
3994   private boolean usuarioLogadoEmiteParecer(ItemEstruturaIett itemEstrutura, List tpfaOrdenadosPorEstrutura, UsuarioUsu usuario, AcompReferenciaItemAri acompAri) throws ECARException {
3995 
3996     // Dao do objeto principal(ItemEstUsutpfuac) onde veremos a permissão do
3997     // usuário/grupo
3998     ItemEstUsutpfuacDao itemEstUsuDao = new ItemEstUsutpfuacDao(request);
3999     // Iterator itPeriodosAcao = periodosConsiderados.iterator();
4000     // Map mapAcao = criarMapPeriodoAri(periodosConsiderados, itemEstrutura);
4001 
4002     boolean usuarioLogadoEmiteParecer = false;
4003 
4004     // if(itPeriodosAcao.hasNext()) {
4005     // Pega só o período selecionado (Aref), que é o primeiro
4006     // AcompReferenciaAref acompReferencia = (AcompReferenciaAref)
4007     // itPeriodosAcao.next();
4008     // if(!mapAcao.isEmpty() && mapAcao.containsKey(acompReferencia)) {
4009     // AcompReferenciaItemAri ariAcao = (AcompReferenciaItemAri)
4010     // mapAcao.get(acompReferencia);
4011 
4012     // Pega os Arels do Ari selecionado
4013     List relatorios = getAcompRelatorioArelOrderByFuncaoAcomp(acompAri, tpfaOrdenadosPorEstrutura);
4014     Iterator itRelatorios = relatorios.iterator();
4015 
4016     while (itRelatorios.hasNext()) {
4017       AcompRelatorioArel relatorio = (AcompRelatorioArel) itRelatorios.next();
4018 
4019       ItemEstUsutpfuacIettutfa itemEstUsu;
4020 
4021       if (relatorio.getTipoFuncAcompTpfa() != null) {
4022         itemEstUsu = itemEstUsuDao.buscar(itemEstrutura.getCodIett(), relatorio.getTipoFuncAcompTpfa().getCodTpfa());
4023 
4024         // Verifica se a permissão é de grupo ou usuário
4025         if (itemEstUsu.getUsuarioUsu() != null) {
4026           usuarioLogadoEmiteParecer = itemEstUsu.getUsuarioUsu().getCodUsu().equals(usuario.getCodUsu());
4027         }
4028         else if (itemEstUsu.getSisAtributoSatb() != null) {
4029           if (itemEstUsu.getSisAtributoSatb().getUsuarioAtributoUsuas() != null) {
4030             Iterator itUsuarios = itemEstUsu.getSisAtributoSatb().getUsuarioAtributoUsuas().iterator();
4031             while (itUsuarios.hasNext()) {
4032               UsuarioAtributoUsua usuarioAtributoUsua = (UsuarioAtributoUsua) itUsuarios.next();
4033               if (usuarioAtributoUsua.getUsuarioUsu().getCodUsu().equals(usuario.getCodUsu())) {
4034                 usuarioLogadoEmiteParecer = true;
4035                 break;
4036               }
4037             }
4038           }
4039         }
4040         if (usuarioLogadoEmiteParecer == true)
4041           break;
4042       }
4043       else
4044         continue;
4045     }// fecha while relatórios
4046     // }
4047     // }
4048 
4049     return usuarioLogadoEmiteParecer;
4050   }
4051 
4052   /**
4053    * Retira dos ítens retornados na consulta aqueles cujos acompanhamentos não
4054    * podem ser editados pelo usuário logado
4055    * @param itensEstrutura Collection
4056    * @param tipoAcompanhamento TipoAcompanhamentoTa Tipo acompanhamento padrão
4057    * @param gruposUsuario Set
4058    * @param arefSelecionada AcompReferenciaAref Referência selecionada
4059    * @param periodosConsiderados Collection
4060    * @param tpfaOrdenadosPorEstrutura List Lista de tipos de função de
4061    *          acompanhamento ordenados por estrutura
4062    * @param usuario UsuarioUsu usuário logado
4063    * @return Coleção de ítens de estrutura
4064    * @throws ECARException
4065    */
4066   private Collection aplicarMinhaVisao(Collection itensEstrutura, TipoAcompanhamentoTa tipoAcompanhamento, Set gruposUsuario, AcompReferenciaAref arefSelecionada, List tpfaOrdenadosPorEstrutura, UsuarioUsu usuario) throws ECARException {
4067     try {
4068       Iterator itItensEstrutura = itensEstrutura.iterator();
4069       ItemEstruturaIett itemEstrutura;
4070       AtributoEstruturaListagemItens atributoEstruturaListagemItens;
4071 
4072       // verifica se o usuário pode "Gerar Período de Acompanhamento"
4073       boolean permissaoAdministradorAcompanhamento = new EstruturaAcessoDao(null).temPermissoesAcessoAcomp(tipoAcompanhamento, gruposUsuario);
4074 
4075       AcompReferenciaItemDao ariDao = new AcompReferenciaItemDao(request);
4076       boolean usuarioLogadoEmiteParecer = false;
4077 
4078       while (itItensEstrutura.hasNext()) {
4079 
4080         atributoEstruturaListagemItens = (AtributoEstruturaListagemItens) itItensEstrutura.next();
4081         itemEstrutura = atributoEstruturaListagemItens.getItem();
4082 
4083         // se o ítem não é um setor
4084         if (itemEstrutura.getNivelIett().intValue() > 1) {
4085 
4086           AcompReferenciaItemAri acompAri = ariDao.getAcompReferenciaItemByItemEstruturaIett(arefSelecionada, itemEstrutura);
4087 
4088           usuarioLogadoEmiteParecer = usuarioLogadoEmiteParecer(itemEstrutura, tpfaOrdenadosPorEstrutura, usuario, acompAri);
4089 
4090           boolean algumFilhoTemPermissaoEditar = false;
4091 
4092           if ((acompAri == null || (!usuarioLogadoEmiteParecer && !permissaoAdministradorAcompanhamento))) {
4093 
4094             Set itensFilhos = itemEstrutura.getItemEstruturaIetts();
4095 
4096             // se o ítem possui filhos, remove o ítem apenas se os filhos também
4097             // não podem ser editados
4098             if (itensFilhos != null && itensFilhos.size() > 0) {
4099 
4100               Iterator itItensFilhos = itensFilhos.iterator();
4101               ItemEstruturaIett itemFilho;
4102               boolean usuarioEmiteParecerFilho = false;
4103               AcompReferenciaItemAri acompAriFilho;
4104 
4105               while (itItensFilhos.hasNext()) {
4106 
4107                 itemFilho = (ItemEstruturaIett) itItensFilhos.next();
4108 
4109                 acompAriFilho = ariDao.getAcompReferenciaItemByItemEstruturaIett(arefSelecionada, itemFilho);
4110 
4111                 usuarioEmiteParecerFilho = usuarioLogadoEmiteParecer(itemFilho, tpfaOrdenadosPorEstrutura, usuario, acompAriFilho);
4112 
4113                 if ((acompAriFilho != null && (usuarioEmiteParecerFilho || permissaoAdministradorAcompanhamento))) {
4114 
4115                   algumFilhoTemPermissaoEditar = true;
4116                 }
4117               }
4118 
4119             }
4120 
4121             if (!algumFilhoTemPermissaoEditar)
4122               itItensEstrutura.remove();
4123           }
4124         }
4125       }
4126     } catch (Exception e) {
4127       System.out.println(e.getMessage());
4128     }
4129     return itensEstrutura;
4130   }
4131 
4132   /**
4133    * Remove os ítens de estrutura que o usuário logado não possua pendências
4134    * @param itensEstrutura
4135    * @param tipoAcompanhamento
4136    * @param gruposUsuario
4137    * @param arefSelecionada
4138    * @param tpfaOrdenadosPorEstrutura
4139    * @param usuario
4140    * @return Collection Coleção de Itens de estrutura
4141    * @throws ECARException
4142    */
4143   private Collection aplicarMinhasPendencias(Collection itensEstrutura, TipoAcompanhamentoTa tipoAcompanhamento, Set gruposUsuario, Collection periodosConsiderados, List tpfaOrdenadosPorEstrutura, UsuarioUsu usuario) throws ECARException {
4144 
4145     Iterator itItensEstrutura = itensEstrutura.iterator();
4146     ItemEstruturaIett itemEstrutura;
4147     AtributoEstruturaListagemItens atributoEstruturaListagemItens;
4148     AcompReferenciaItemAri acompAri;
4149     AcompReferenciaItemDao ariDao = new AcompReferenciaItemDao(request);
4150 
4151     while (itItensEstrutura.hasNext()) {
4152 
4153       boolean usuarioLogadoEmiteParecerNaoLiberado = false;
4154       boolean usuarioAdministraAcompanhamentoNaoLiberado = false;
4155       boolean acompanhamentoLiberado = false;
4156 
4157       boolean algumFilhoTemPendencias = false;
4158       boolean itemPossuiPendencias = false;
4159 
4160       atributoEstruturaListagemItens = (AtributoEstruturaListagemItens) itItensEstrutura.next();
4161       itemEstrutura = atributoEstruturaListagemItens.getItem();
4162 
4163       // se o ítem não é um setor
4164       // if (itemEstrutura.getNivelIett().intValue()>1){
4165 
4166       Iterator itPeriodos = periodosConsiderados.iterator();
4167 
4168       while (itPeriodos.hasNext()) {
4169 
4170         AcompReferenciaAref arefCorrente = (AcompReferenciaAref) itPeriodos.next();
4171 
4172         acompAri = ariDao.getAcompReferenciaItemByItemEstruturaIett(arefCorrente, itemEstrutura);
4173 
4174         if (acompAri != null) {
4175 
4176           usuarioLogadoEmiteParecerNaoLiberado = usuarioLogadoEmiteParecerNaoLiberado(itemEstrutura, tpfaOrdenadosPorEstrutura, usuario, acompAri);
4177 
4178           usuarioAdministraAcompanhamentoNaoLiberado = usuarioAdministraAcompanhamentoNaoLiberado(itemEstrutura, gruposUsuario, acompAri, tipoAcompanhamento);
4179 
4180           StatusRelatorioSrl statusLiberado = (StatusRelatorioSrl) buscar(StatusRelatorioSrl.class, Long.valueOf(STATUS_LIBERADO));
4181 
4182           if (acompAri.getStatusRelatorioSrl().equals(statusLiberado)) {
4183 
4184             acompanhamentoLiberado = true;
4185             // break;
4186           }
4187 
4188           if ((usuarioLogadoEmiteParecerNaoLiberado || usuarioAdministraAcompanhamentoNaoLiberado) && !acompanhamentoLiberado) {
4189             itemPossuiPendencias = true;
4190             break;
4191           }
4192 
4193         }
4194 
4195         // Se não existe acompanhamento, ou o acompanhamento foi liberado, ou o
4196         // usuário nem é administrador do
4197         // acompanhamento não liberado nem pode emitir parecer para o
4198         // acompanhamento, remove o ítem da lista se
4199         // este não tiver algum ítem filho com pendências
4200         if (acompAri == null || acompanhamentoLiberado || (!usuarioAdministraAcompanhamentoNaoLiberado && !usuarioLogadoEmiteParecerNaoLiberado)) {
4201 
4202           Set itensFilhosImediatos = itemEstrutura.getItemEstruturaIetts();
4203 
4204           // se o ítem possui filhos, remove o ítem apenas se os filhos também
4205           // não possuem algum
4206           // parecer não liberado ou se o não acompanhamento exija liberação ou
4207           // exija mas ja tenha
4208           // sido liberado
4209           if (itensFilhosImediatos != null && itensFilhosImediatos.size() > 0) {
4210 
4211             algumFilhoTemPendencias = verificarFilhos(itensFilhosImediatos, tipoAcompanhamento, gruposUsuario, arefCorrente, tpfaOrdenadosPorEstrutura, usuario, ariDao);
4212 
4213             if (algumFilhoTemPendencias)
4214               break;
4215           }
4216 
4217         }
4218 
4219       }// fim do while periodos
4220 
4221       if (!itemPossuiPendencias && !algumFilhoTemPendencias)
4222         itItensEstrutura.remove();
4223     }// fim do while itens
4224 
4225     return itensEstrutura;
4226   }
4227 
4228   private boolean verificarFilhos(Set itensFilhos, TipoAcompanhamentoTa tipoAcompanhamento, Set gruposUsuario, AcompReferenciaAref arefCorrente, List tpfaOrdenadosPorEstrutura, UsuarioUsu usuario, AcompReferenciaItemDao ariDao) throws ECARException {
4229 
4230     Iterator itItensFilhos = itensFilhos.iterator();
4231     ItemEstruturaIett itemFilho;
4232     AcompReferenciaItemAri acompAriFilho;
4233 
4234     boolean retorno = false;
4235 
4236     while (itItensFilhos.hasNext()) {
4237 
4238       boolean usuarioLogadoEmiteParecerNaoLiberadoFilho = false;
4239       boolean usuarioAdministraAcompanhamentoNaoLiberadoFilho = false;
4240       boolean acompanhamentoLiberado = false;
4241 
4242       itemFilho = (ItemEstruturaIett) itItensFilhos.next();
4243 
4244       acompAriFilho = ariDao.getAcompReferenciaItemByItemEstruturaIett(arefCorrente, itemFilho);
4245 
4246       if (acompAriFilho != null) {
4247 
4248         usuarioLogadoEmiteParecerNaoLiberadoFilho = usuarioLogadoEmiteParecerNaoLiberado(itemFilho, tpfaOrdenadosPorEstrutura, usuario, acompAriFilho);
4249 
4250         usuarioAdministraAcompanhamentoNaoLiberadoFilho = usuarioAdministraAcompanhamentoNaoLiberado(itemFilho, gruposUsuario, acompAriFilho, tipoAcompanhamento);
4251 
4252         StatusRelatorioSrl statusLiberado = (StatusRelatorioSrl) buscar(StatusRelatorioSrl.class, Long.valueOf(STATUS_LIBERADO));
4253 
4254         if (acompAriFilho.getStatusRelatorioSrl().equals(statusLiberado)) {
4255 
4256           acompanhamentoLiberado = true;
4257         }
4258       }
4259 
4260       if (acompAriFilho != null && !acompanhamentoLiberado) {
4261         if (usuarioAdministraAcompanhamentoNaoLiberadoFilho || usuarioLogadoEmiteParecerNaoLiberadoFilho) {
4262 
4263           return true;
4264         }
4265       }
4266       else {
4267 
4268         // usa recursividade para verificar os filhos até o último nível
4269         if (itemFilho.getItemEstruturaIetts() != null && itemFilho.getItemEstruturaIetts().size() > 0) {
4270           retorno = verificarFilhos(itemFilho.getItemEstruturaIetts(), tipoAcompanhamento, gruposUsuario, arefCorrente, tpfaOrdenadosPorEstrutura, usuario, ariDao);
4271 
4272           if (retorno == true)
4273             break;
4274         }
4275       }
4276     }
4277 
4278     return retorno;
4279   }
4280 
4281   /**
4282    * Retorna lista de itens de acompanhamentos que o usuário logado tenha algum
4283    * parecer ainda não liberado e/ou todos os itens de acompanhamentos em que o
4284    * usuário é administrador e que o acompanhamento exija liberar o
4285    * acompanhamento (definido em tipo de acompanhamento), e o acompanhamento
4286    * ainda não tenha sido liberado
4287    * @param periodosConsiderados Collection de AcompReferenciaAref
4288    * @param niveisPlanejamento Collection
4289    * @param orgaoResponsavel OrgaoOrg
4290    * @param usuarioUsu UsuarioUsu
4291    * @param gruposUsuario Set
4292    * @param tipoAcompanhamento TipoAcompanhamentoTA (se for nulo ignora o tipo
4293    *          de acompanhamento)
4294    * @param codIettPai Long (se for diferente de nulo, obtêm os filhos desse
4295    *          item)
4296    * @param arefSelecionada AcompReferenciaAref
4297    * @param tpfaOrdenadosPorEstrutura lista de tipos de função de acompanhamento
4298    *          ordenados por estrutura
4299    * @param itensSemInformacaoNivelPlanejamento Boolean
4300    * @param codCor Long código da cor selecionada (ignora se não foi selecionada
4301    *          cor)
4302    * @param indLiberados Long
4303    * @param menorNivel int o menor nível dos itens de estrutura
4304    * @param nuPaginaSelecionada int
4305    * @return
4306    * @throws ECARException
4307    */
4308   public Object[] getItensAcompanhamentoComPendencias(Collection periodosConsiderados, Collection niveisPlanejamento, OrgaoOrg orgaoResponsavel, UsuarioUsu usuarioUsu, Set gruposUsuario, TipoAcompanhamentoTa tipoAcompanhamento, Long codIettPai, AcompReferenciaAref arefSelecionada, List tpfaOrdenadosPorEstrutura, Boolean itensSemInformacaoNivelPlanejamento, Long codCor, String indLiberados, int menorNivel, int nuPaginaSelecionada) throws ECARException {
4309 
4310     try {
4311 
4312       Object[] itensAcompanhamentoMinhasPendencias = getItensAcompanhamentoInPeriodosByOrgaoRespPaginado(periodosConsiderados, niveisPlanejamento, orgaoResponsavel, usuarioUsu, gruposUsuario, tipoAcompanhamento.getCodTa().longValue(), codIettPai, itensSemInformacaoNivelPlanejamento, codCor, indLiberados, menorNivel, nuPaginaSelecionada);
4313 
4314       itensAcompanhamentoMinhasPendencias[0] = aplicarMinhasPendencias((Collection) itensAcompanhamentoMinhasPendencias[0], tipoAcompanhamento, gruposUsuario, periodosConsiderados, tpfaOrdenadosPorEstrutura, usuarioUsu);
4315 
4316       return itensAcompanhamentoMinhasPendencias;
4317 
4318     } catch (HibernateException e) {
4319       this.logger.error(e);
4320       throw new ECARException(e);
4321     }
4322   }
4323 
4324   /**
4325    * Retorna lista de itens de acompanhamentos que o usuário logado tenha
4326    * permissão para editar algo
4327    * @param periodosConsiderados Collection de AcompReferenciaAref
4328    * @param niveisPlanejamento Collection
4329    * @param orgaoResponsavel OrgaoOrg
4330    * @param usuarioUsu UsuarioUsu
4331    * @param gruposUsuario Set
4332    * @param tipoAcompanhamento TipoAcompanhamentoTA (se for nulo ignora o tipo
4333    *          de acompanhamento)
4334    * @param codIettPai Long (se for diferente de nulo, obtêm os filhos desse
4335    *          item)
4336    * @param arefSelecionada AcompReferenciaAref
4337    * @param tpfaOrdenadosPorEstrutura lista de tipos de função de acompanhamento
4338    *          ordenados por estrutura
4339    * @param itensSemInformacaoNivelPlanejamento Boolean
4340    * @param codCor Long código da cor selecionada (ignora se não foi selecionada
4341    *          cor)
4342    * @param indLiberados Long
4343    * @param menorNivel int o menor nível dos itens de estrutura
4344    * @param nuPaginaSelecionada int
4345    * @return
4346    * @throws ECARException
4347    */
4348   public Object[] getItensAcompanhamentoComPermissaoAlteracao(Collection periodosConsiderados, Collection niveisPlanejamento, OrgaoOrg orgaoResponsavel, UsuarioUsu usuarioUsu, Set gruposUsuario, TipoAcompanhamentoTa tipoAcompanhamento, Long codIettPai, AcompReferenciaAref arefSelecionada, List tpfaOrdenadosPorEstrutura, Boolean itensSemInformacaoNivelPlanejamento, Long codCor, String indLiberados, int menorNivel, int nuPaginaSelecionada) throws ECARException {
4349 
4350     try {
4351 
4352       Object[] itensAcompanhamentoMinhaVisao = getItensAcompanhamentoInPeriodosByOrgaoRespPaginado(periodosConsiderados, niveisPlanejamento, orgaoResponsavel, usuarioUsu, gruposUsuario, tipoAcompanhamento.getCodTa().longValue(), codIettPai, itensSemInformacaoNivelPlanejamento, codCor, indLiberados, menorNivel, nuPaginaSelecionada);
4353 
4354       itensAcompanhamentoMinhaVisao[0] = aplicarMinhaVisao((Collection) itensAcompanhamentoMinhaVisao[0], tipoAcompanhamento, gruposUsuario, arefSelecionada, tpfaOrdenadosPorEstrutura, usuarioUsu);
4355 
4356       return itensAcompanhamentoMinhaVisao;
4357 
4358     } catch (HibernateException e) {
4359       this.logger.error(e);
4360       throw new ECARException(e);
4361     } catch (Exception e) {
4362       this.logger.error(e);
4363       throw new ECARException(e);
4364     }
4365   }
4366 
4367   /**
4368    * Filtra o item de acordo com o campo passado como parâmetro
4369    * @param request HttpServletRequest
4370    * @param campo String
4371    * @param iett ItemEstruturaIett
4372    * @param itensRemovidos List
4373    * @param itItensEstrutura Iterator
4374    * @return true se o item foi excluído, false se não foi
4375    * @throws ECARException
4376    */
4377   private boolean filtrarItemString(HttpServletRequest request, String campo, ItemEstruturaIett iett, List itensRemovidos, Iterator itItensEstrutura) {
4378     boolean retorno = false;
4379     String valorCampo = Pagina.getParamStr(request, iett.getEstruturaEtt().getCodEtt() + "_" + campo);
4380     try {
4381 
4382       if (!"".equals(valorCampo)) {
4383 
4384         String valorCampoIett = (String) iett.getClass().getMethod("get" + Util.primeiraLetraToUpperCase(campo), null).invoke(iett, null);
4385 
4386         if (valorCampoIett == null || !valorCampoIett.toUpperCase().contains((valorCampo.toUpperCase()))) {
4387           itensRemovidos.add(iett.getCodIett());
4388           itItensEstrutura.remove();
4389           retorno = true;
4390         }
4391       }
4392     } catch (Exception e) {
4393       // TODO: handle exception
4394     }
4395 
4396     return retorno;
4397   }
4398 
4399   /**
4400    * Filtra o item de acordo com o campo passado como parâmetro
4401    * @param request HttpServletRequest
4402    * @param campo String
4403    * @param iett ItemEstruturaIett
4404    * @param itensRemovidos List
4405    * @param itItensEstrutura Iterator
4406    * @return true se o item foi excluído, false se não foi
4407    * @throws ECARException
4408    */
4409   private boolean filtrarItemData(HttpServletRequest request, String campo, ItemEstruturaIett iett, List itensRemovidos, Iterator itItensEstrutura, String inicioFim) {
4410     boolean retorno = false;
4411     String valorCampo = Pagina.getParamStr(request, iett.getEstruturaEtt().getCodEtt() + "_" + campo + "_" + inicioFim);
4412     try {
4413 
4414       if (!"".equals(valorCampo)) {
4415         // Modifica as ordens de dia e mês na data, para ficar no formato
4416         // MM/DD/YYYY
4417         valorCampo = valorCampo.substring(3, valorCampo.lastIndexOf("/") + 1) + valorCampo.substring(0, valorCampo.indexOf("/") + 1) + valorCampo.substring(valorCampo.lastIndexOf("/") + 1);
4418 
4419         Date valorCampoData = new Date(valorCampo);
4420 
4421         Date valorCampoDataIett = (Date) iett.getClass().getMethod("get" + Util.primeiraLetraToUpperCase(campo), null).invoke(iett, null);
4422 
4423         if (inicioFim.equals("Inicio")) {
4424           // Remove da lista se a data estiver estiver fora do intervalo
4425           // especificado no filtro
4426           if (valorCampoDataIett == null || valorCampoDataIett.compareTo(valorCampoData) < 0) {
4427             itensRemovidos.add(iett.getCodIett());
4428             itItensEstrutura.remove();
4429             retorno = true;
4430           }
4431         }
4432         else if (inicioFim.equals("Fim")) {
4433           // Remove da lista se a data estiver estiver fora do intervalo
4434           // especificado no filtro
4435           if (valorCampoDataIett == null || valorCampoDataIett.compareTo(valorCampoData) > 0) {
4436             itensRemovidos.add(iett.getCodIett());
4437             itItensEstrutura.remove();
4438             retorno = true;
4439           }
4440         }
4441 
4442       }
4443     } catch (Exception e) {
4444       // TODO: handle exception
4445     }
4446 
4447     return retorno;
4448   }
4449 
4450   /**
4451    * Filtra o item de acordo com o campo passado como parâmetro
4452    * @param request HttpServletRequest
4453    * @param campo String
4454    * @param iett ItemEstruturaIett
4455    * @param itensRemovidos List
4456    * @param itItensEstrutura Iterator
4457    * @return true se o item foi excluído, false se não foi
4458    * @throws ECARException
4459    */
4460   private boolean filtrarItemValor(HttpServletRequest request, String campo, ItemEstruturaIett iett, List itensRemovidos, Iterator itItensEstrutura, String inicioFim) {
4461     boolean retorno = false;
4462     String valorCampo = Pagina.getParamStr(request, iett.getEstruturaEtt().getCodEtt() + "_" + campo + "_" + inicioFim);
4463     try {
4464 
4465       if (!"".equals(valorCampo)) {
4466 
4467         BigDecimal valorCampoBigDecimal = new BigDecimal(valorCampo);
4468 
4469         BigDecimal valorCampoBigDecimalIett = (BigDecimal) iett.getClass().getMethod("get" + Util.primeiraLetraToUpperCase(campo), null).invoke(iett, null);
4470 
4471         if (inicioFim.equals("Inicio")) {
4472           if (valorCampoBigDecimalIett == null ||
4473           // Remove da lista se a data estiver estiver fora do intervalo
4474           // especificado no filtro
4475           valorCampoBigDecimalIett.doubleValue() < valorCampoBigDecimal.doubleValue()) {
4476             itensRemovidos.add(iett.getCodIett());
4477             itItensEstrutura.remove();
4478             retorno = true;
4479           }
4480         }
4481         else if (inicioFim.equals("Fim")) {
4482           if (valorCampoBigDecimalIett == null ||
4483           // Remove da lista se a data estiver estiver fora do intervalo
4484           // especificado no filtro
4485           valorCampoBigDecimalIett.doubleValue() > valorCampoBigDecimal.doubleValue()) {
4486             itensRemovidos.add(iett.getCodIett());
4487             itItensEstrutura.remove();
4488             retorno = true;
4489           }
4490         }
4491 
4492       }
4493     } catch (Exception e) {
4494       // TODO: handle exception
4495     }
4496 
4497     return retorno;
4498   }
4499 
4500   /**
4501    * Filtra o item de acordo com os atributos livres passados como parâmetro
4502    * @param request HttpServletRequest
4503    * @param iett ItemEstruturaIett
4504    * @param itensRemovidos List
4505    * @param itItensEstrutura Iterator
4506    * @param atributosLivres List
4507    * @return true se o item foi excluído, false se não foi
4508    * @throws ECARException
4509    */
4510   private boolean filtrarAtributosLivres(HttpServletRequest request, ItemEstruturaIett iett, List itensRemovidos, Iterator itItensEstrutura, List atributosLivres) {
4511     boolean retorno = false;
4512     try {
4513       ItemEstruturaDao itemEstruturaDao = new ItemEstruturaDao(request);
4514       String codEtt = iett.getEstruturaEtt().getCodEtt().toString();
4515       boolean filtrarAtributoLivre = true;
4516       Iterator itAtributos = atributosLivres.iterator();
4517       // Filtrar pelos atributos livres definidos como filtros
4518       while (itAtributos.hasNext() && filtrarAtributoLivre) {
4519         ObjetoEstrutura objetoEstrutura = (ObjetoEstrutura) itAtributos.next();
4520         SisGrupoAtributoSga grupoAtributo = objetoEstrutura.iGetGrupoAtributosLivres();
4521 
4522         String nomeCampo = codEtt + "_a" + grupoAtributo.getCodSga();
4523         String tipoCampo = grupoAtributo.getSisTipoExibicGrupoSteg().getCodSteg().toString();
4524 
4525         // Se for CheckBox ou RadioButton ou ListBox, não procura em
4526         // InformacaoIettSatb
4527         if (tipoCampo.equals(SisTipoExibicGrupoDao.CHECKBOX) || tipoCampo.equals(SisTipoExibicGrupoDao.LISTBOX)) {
4528           String[] atributos = request.getParameterValues(nomeCampo);
4529           int numAtributos = 0;
4530           if (atributos != null) {
4531             numAtributos = atributos.length;
4532           }
4533           for (int i = 0; i < numAtributos && filtrarAtributoLivre; i++) {
4534             if (!itemEstruturaDao.getSisAtributosIett(iett, grupoAtributo.getCodSga()).contains((SisAtributoSatb) this.buscar(SisAtributoSatb.class, Long.valueOf(atributos[i])))) {
4535               itensRemovidos.add(iett.getCodIett());
4536               itItensEstrutura.remove();
4537               filtrarAtributoLivre = false;
4538               retorno = true;
4539               break;
4540             }
4541           }
4542         }
4543         // Se for Radio Button...
4544         else if (tipoCampo.equals(SisTipoExibicGrupoDao.RADIO_BUTTON) || tipoCampo.equals(SisTipoExibicGrupoDao.COMBOBOX)) {
4545 
4546           if (!"".equals(Pagina.getParamStr(request, nomeCampo))) {
4547 
4548             if (!itemEstruturaDao.getSisAtributosIett(iett, grupoAtributo.getCodSga()).contains((SisAtributoSatb) this.buscar(SisAtributoSatb.class, Long.valueOf(Pagina.getParamStr(request, nomeCampo))))) {
4549               itensRemovidos.add(iett.getCodIett());
4550               itItensEstrutura.remove();
4551               filtrarAtributoLivre = false;
4552               retorno = true;
4553               break;
4554             }
4555           }
4556         }
4557         // Se for TEXT Field ou TEXT AREA
4558         else if (tipoCampo.equals(SisTipoExibicGrupoDao.TEXT) || tipoCampo.equals(SisTipoExibicGrupoDao.TEXTAREA)) {
4559 
4560           if (!"".equals(Pagina.getParamStr(request, nomeCampo))) {
4561             List atributosTextTextArea = itemEstruturaDao.getItemEstruturaSisAtributoIettSatbsIett(iett, grupoAtributo.getCodSga());
4562             if (atributosTextTextArea.size() == 0) {
4563               itensRemovidos.add(iett.getCodIett());
4564               itItensEstrutura.remove();
4565               filtrarAtributoLivre = false;
4566               retorno = true;
4567               break;
4568             }
4569 
4570             Iterator itAtributosTextTextArea = atributosTextTextArea.iterator();
4571 
4572             while (itAtributosTextTextArea.hasNext() && filtrarAtributoLivre) {
4573               ItemEstruturaSisAtributoIettSatb itemEstruturaSisAtributoIettSatb = (ItemEstruturaSisAtributoIettSatb) itAtributosTextTextArea.next();
4574               if (!itemEstruturaSisAtributoIettSatb.getInformacaoIettSatb().toUpperCase().trim().contains(Pagina.getParamStr(request, nomeCampo).toUpperCase().trim())) {
4575                 itensRemovidos.add(iett.getCodIett());
4576                 itItensEstrutura.remove();
4577                 filtrarAtributoLivre = false;
4578                 retorno = true;
4579                 break;
4580               }
4581 
4582             }
4583           }
4584           // Se for MULTITEXTO
4585         }
4586         else if (tipoCampo.equals(SisTipoExibicGrupoDao.MULTITEXTO)) {
4587           Enumeration lAtrib = request.getParameterNames();
4588           while (lAtrib.hasMoreElements() && filtrarAtributoLivre) {
4589             nomeCampo = (String) lAtrib.nextElement();
4590             if (nomeCampo.startsWith(codEtt + "_a" + grupoAtributo.getCodSga().toString())) {
4591               if (!"".equals(Pagina.getParamStr(request, nomeCampo))) {
4592                 String codSisAtrib = nomeCampo.substring(nomeCampo.lastIndexOf("_") + 1);
4593                 SisAtributoSatb sisAtributoSatb = (SisAtributoSatb) this.buscar(SisAtributoSatb.class, Long.valueOf(codSisAtrib));
4594                 List atributosMultiText = itemEstruturaDao.getItemEstruturaSisAtributoIettSatbsIett(iett, grupoAtributo.getCodSga());
4595                 if (atributosMultiText.size() == 0 || !itemEstruturaDao.getSisAtributosIett(iett, grupoAtributo.getCodSga()).contains(sisAtributoSatb)) {
4596                   itensRemovidos.add(iett.getCodIett());
4597                   itItensEstrutura.remove();
4598                   filtrarAtributoLivre = false;
4599                   retorno = true;
4600                   break;
4601                 }
4602                 Iterator itAtributosMultiTexto = atributosMultiText.iterator();
4603 
4604                 while (itAtributosMultiTexto.hasNext() && filtrarAtributoLivre) {
4605                   ItemEstruturaSisAtributoIettSatb itemEstruturaSisAtributoIettSatb = (ItemEstruturaSisAtributoIettSatb) itAtributosMultiTexto.next();
4606                   if (itemEstruturaSisAtributoIettSatb.getSisAtributoSatb().getCodSatb().toString().equals(codSisAtrib)) {
4607                     if (!itemEstruturaSisAtributoIettSatb.getInformacaoIettSatb().toUpperCase().trim().contains(Pagina.getParamStr(request, nomeCampo).toUpperCase().trim())) {
4608                       itensRemovidos.add(iett.getCodIett());
4609                       itItensEstrutura.remove();
4610                       filtrarAtributoLivre = false;
4611                       retorno = true;
4612                       break;
4613                     }
4614                   }
4615                 }
4616               }
4617             }
4618           }
4619           // Se for VALIDACAO
4620         }
4621         else if (tipoCampo.equals(SisTipoExibicGrupoDao.VALIDACAO)) {
4622           nomeCampo = codEtt + "_a" + grupoAtributo.getCodSga() + "_Inicio";
4623           String filtroParametro = Pagina.getParamStr(request, nomeCampo);
4624           if (!"".equals(Pagina.getParamStr(request, nomeCampo))) {
4625 
4626             List atributosValidacao = itemEstruturaDao.getItemEstruturaSisAtributoIettSatbsIett(iett, grupoAtributo.getCodSga());
4627 
4628             if (atributosValidacao.size() == 0) {
4629               itensRemovidos.add(iett.getCodIett());
4630               itItensEstrutura.remove();
4631               filtrarAtributoLivre = false;
4632               retorno = true;
4633               break;
4634             }
4635 
4636             Iterator itAtributosValidacao = atributosValidacao.iterator();
4637 
4638             while (itAtributosValidacao.hasNext() && filtrarAtributoLivre) {
4639               ItemEstruturaSisAtributoIettSatb itemEstruturaSisAtributoIettSatb = (ItemEstruturaSisAtributoIettSatb) itAtributosValidacao.next();
4640 
4641               if (itemEstruturaSisAtributoIettSatb.getSisAtributoSatb().getAtribInfCompSatb().equals("dataScript")) {
4642 
4643                 // Modifica as ordens de dia e mês na data, para ficar no
4644                 // formato MM/DD/YYYY
4645                 filtroParametro = filtroParametro.substring(3, filtroParametro.lastIndexOf("/") + 1) + filtroParametro.substring(0, filtroParametro.indexOf("/") + 1) + filtroParametro.substring(filtroParametro.lastIndexOf("/") + 1);
4646 
4647                 Date dataFiltro = new Date(filtroParametro);
4648 
4649                 String valorAtribLivre = itemEstruturaSisAtributoIettSatb.getInformacaoIettSatb();
4650 
4651                 // Modifica as ordens de dia e mês na data, para ficar no
4652                 // formato MM/DD/YYYY
4653                 valorAtribLivre = valorAtribLivre.substring(3, valorAtribLivre.lastIndexOf("/") + 1) + valorAtribLivre.substring(0, valorAtribLivre.indexOf("/") + 1) + valorAtribLivre.substring(valorAtribLivre.lastIndexOf("/") + 1);
4654 
4655                 Date dataAtribLivre = new Date(valorAtribLivre);
4656                 // Remove da lista se a data estiver estiver fora do intervalo
4657                 // especificado no filtro
4658                 if (dataAtribLivre.compareTo(dataFiltro) < 0) {
4659                   itensRemovidos.add(iett.getCodIett());
4660                   itItensEstrutura.remove();
4661                   filtrarAtributoLivre = false;
4662                   retorno = true;
4663                   break;
4664                 }
4665 
4666               }
4667               else if (itemEstruturaSisAtributoIettSatb.getSisAtributoSatb().getAtribInfCompSatb().equals("numeroInteiroScript") || itemEstruturaSisAtributoIettSatb.getSisAtributoSatb().getAtribInfCompSatb().equals("numeroRealScript") || itemEstruturaSisAtributoIettSatb.getSisAtributoSatb().getAtribInfCompSatb().equals("valorMonetarioScript")) {
4668 
4669                 BigDecimal valorFiltro = new BigDecimal(filtroParametro);
4670 
4671                 BigDecimal valorAtribLivre = new BigDecimal(itemEstruturaSisAtributoIettSatb.getInformacaoIettSatb());
4672 
4673                 // Remove da lista se a data estiver estiver fora do intervalo
4674                 // especificado no filtro
4675                 if (valorAtribLivre.doubleValue() < valorFiltro.doubleValue()) {
4676                   itensRemovidos.add(iett.getCodIett());
4677                   itItensEstrutura.remove();
4678                   filtrarAtributoLivre = false;
4679                   retorno = true;
4680                   break;
4681                 }
4682               }
4683             }
4684           }
4685 
4686           nomeCampo = codEtt + "_a" + grupoAtributo.getCodSga() + "_Fim";
4687           filtroParametro = Pagina.getParamStr(request, nomeCampo);
4688           if (!"".equals(Pagina.getParamStr(request, nomeCampo))) {
4689 
4690             List atributosValidacao = itemEstruturaDao.getItemEstruturaSisAtributoIettSatbsIett(iett, grupoAtributo.getCodSga());
4691 
4692             if (atributosValidacao.size() == 0) {
4693               itensRemovidos.add(iett.getCodIett());
4694               itItensEstrutura.remove();
4695               filtrarAtributoLivre = false;
4696               retorno = true;
4697               break;
4698             }
4699 
4700             Iterator itAtributosValidacao = atributosValidacao.iterator();
4701 
4702             while (itAtributosValidacao.hasNext() && filtrarAtributoLivre) {
4703               ItemEstruturaSisAtributoIettSatb itemEstruturaSisAtributoIettSatb = (ItemEstruturaSisAtributoIettSatb) itAtributosValidacao.next();
4704 
4705               if (itemEstruturaSisAtributoIettSatb.getSisAtributoSatb().getAtribInfCompSatb().equals("dataScript")) {
4706 
4707                 // Modifica as ordens de dia e mês na data, para ficar no
4708                 // formato MM/DD/YYYY
4709                 filtroParametro = filtroParametro.substring(3, filtroParametro.lastIndexOf("/") + 1) + filtroParametro.substring(0, filtroParametro.indexOf("/") + 1) + filtroParametro.substring(filtroParametro.lastIndexOf("/") + 1);
4710 
4711                 Date dataFiltro = new Date(filtroParametro);
4712 
4713                 String valorAtribLivre = itemEstruturaSisAtributoIettSatb.getInformacaoIettSatb();
4714 
4715                 // Modifica as ordens de dia e mês na data, para ficar no
4716                 // formato MM/DD/YYYY
4717                 valorAtribLivre = valorAtribLivre.substring(3, valorAtribLivre.lastIndexOf("/") + 1) + valorAtribLivre.substring(0, valorAtribLivre.indexOf("/") + 1) + valorAtribLivre.substring(valorAtribLivre.lastIndexOf("/") + 1);
4718 
4719                 Date dataAtribLivre = new Date(valorAtribLivre);
4720                 // Remove da lista se a data estiver estiver fora do intervalo
4721                 // especificado no filtro
4722                 if (dataAtribLivre.compareTo(dataFiltro) > 0) {
4723                   itensRemovidos.add(iett.getCodIett());
4724                   itItensEstrutura.remove();
4725                   filtrarAtributoLivre = false;
4726                   retorno = true;
4727                   break;
4728                 }
4729 
4730               }
4731               else if (itemEstruturaSisAtributoIettSatb.getSisAtributoSatb().getAtribInfCompSatb().equals("numeroInteiroScript") || itemEstruturaSisAtributoIettSatb.getSisAtributoSatb().getAtribInfCompSatb().equals("numeroRealScript") || itemEstruturaSisAtributoIettSatb.getSisAtributoSatb().getAtribInfCompSatb().equals("valorMonetarioScript")) {
4732 
4733                 BigDecimal valorFiltro = new BigDecimal(filtroParametro);
4734 
4735                 BigDecimal valorAtribLivre = new BigDecimal(itemEstruturaSisAtributoIettSatb.getInformacaoIettSatb());
4736 
4737                 // Remove da lista se a data estiver estiver fora do intervalo
4738                 // especificado no filtro
4739                 if (valorAtribLivre.doubleValue() > valorFiltro.doubleValue()) {
4740                   itensRemovidos.add(iett.getCodIett());
4741                   itItensEstrutura.remove();
4742                   filtrarAtributoLivre = false;
4743                   retorno = true;
4744                   break;
4745                 }
4746               }
4747 
4748             }
4749           }
4750 
4751           nomeCampo = codEtt + "_a" + grupoAtributo.getCodSga();
4752           filtroParametro = Pagina.getParamStr(request, nomeCampo);
4753           if (!"".equals(Pagina.getParamStr(request, nomeCampo))) {
4754 
4755             List atributosValidacao = itemEstruturaDao.getItemEstruturaSisAtributoIettSatbsIett(iett, grupoAtributo.getCodSga());
4756 
4757             if (atributosValidacao.size() == 0) {
4758               itensRemovidos.add(iett.getCodIett());
4759               itItensEstrutura.remove();
4760               filtrarAtributoLivre = false;
4761               retorno = true;
4762               break;
4763             }
4764 
4765             Iterator itAtributosValidacao = atributosValidacao.iterator();
4766 
4767             while (itAtributosValidacao.hasNext() && filtrarAtributoLivre) {
4768               ItemEstruturaSisAtributoIettSatb itemEstruturaSisAtributoIettSatb = (ItemEstruturaSisAtributoIettSatb) itAtributosValidacao.next();
4769 
4770               if (!itemEstruturaSisAtributoIettSatb.getInformacaoIettSatb().toUpperCase().contains(filtroParametro.toUpperCase())) {
4771                 itensRemovidos.add(iett.getCodIett());
4772                 itItensEstrutura.remove();
4773                 filtrarAtributoLivre = false;
4774                 retorno = true;
4775                 break;
4776               }
4777             }
4778           }
4779         }
4780       }
4781 
4782     } catch (Exception e) {
4783       // TODO: handle exception
4784     }
4785 
4786     return retorno;
4787   }
4788 
4789 }