Package ecar.dao

Source Code of ecar.dao.AcompRealFisicoDao

/*
* Created on 17/02/2005
*
*/
package ecar.dao;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;

import javax.servlet.http.HttpServletRequest;

import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Transaction;

import comum.database.Dao;
import comum.util.Data;
import comum.util.Pagina;
import comum.util.Util;

import ecar.bean.IettArfBean;
import ecar.exception.ECARException;
import ecar.login.SegurancaECAR;
import ecar.pojo.AcompRealFisicoArf;
import ecar.pojo.AcompReferenciaAref;
import ecar.pojo.AcompReferenciaItemAri;
import ecar.pojo.ConfiguracaoCfg;
import ecar.pojo.ExercicioExe;
import ecar.pojo.ItemEstrtIndResulIettr;
import ecar.pojo.ItemEstruturaIett;
import ecar.pojo.SisAtributoSatb;
import ecar.pojo.SituacaoSit;
import ecar.pojo.TipoAcompanhamentoTa;
import ecar.util.Dominios;

/**
* @author evandro
*
*/
public class AcompRealFisicoDao extends Dao {
    /**
     *
     * @param request
     */
    public AcompRealFisicoDao(HttpServletRequest request) {
    super();
    this.request = request;
  }
   
    /**
     * Retorna um objeto AcompRealFisicoArf a partir do seu c�digo
     *
     * @param codArf Long
     *
     * @return AcompRealFisicoArf
     * @throws ECARException
     */
    public AcompRealFisicoArf buscar(Long codArf) throws ECARException {
        return (AcompRealFisicoArf) super.buscar(AcompRealFisicoArf.class, codArf);
    }
   
   
    /**
     * Retorna um objeto AcompRealFisicoArf a partir do IETT, IETTIR, M�s e Ano
     *
     * @param mesArf
     * @param anoArf
     * @param codIettir Long
     *
     * @return AcompRealFisicoArf
     * @throws ECARException
     */
    public AcompRealFisicoArf buscarPorIettir(Long mesArf, Long anoArf, Long codIettir) throws ECARException {
      try {
      StringBuilder query = new StringBuilder("select ARF from AcompRealFisicoArf as ARF")
                  .append(" where ARF.itemEstrtIndResulIettr.codIettir = :codIettir ")
                  .append(" and ARF.mesArf = :mesArf ")
                  .append(" and ARF.anoArf = :anoArf");
     
      Query q = this.getSession().createQuery(query.toString());
     
      q.setLong("codIettir", codIettir.longValue());
      q.setLong("mesArf", mesArf.longValue());
      q.setLong("anoArf", anoArf.longValue());
      q.setMaxResults(1);
     
      Object arf = q.uniqueResult();
     
      if(arf != null) {
        return (AcompRealFisicoArf)arf;
      } else {
        return null;
      }
      }
      catch(Exception e) {
        this.logger.error(e);
      throw new ECARException(e);
    }
    }
   
   
    /**
     * Retorna um objeto AcompRealFisicoArf a partir do IETT, M�s e Ano
     *
     * @param codIett Long
     * @param mesArf
     * @param anoArf
     * @return AcompRealFisicoArf
     * @throws ECARException
     */
    public List buscarPorIett(Long codIett, Long mesArf, Long anoArf) throws ECARException {
      try {
      StringBuilder query = new StringBuilder("select ARF from AcompRealFisicoArf as ARF")
                .append(" where ARF.itemEstruturaIett.codIett = :codIett")
                .append(" and ARF.itemEstruturaIett.indAtivoIett = :ativo")
                .append(" and ARF.mesArf = :mesArf")
                .append(" and ARF.anoArf = :anoArf");
     
      Query q = this.getSession().createQuery(query.toString());
     
      q.setLong("codIett", codIett.longValue());
      q.setLong("mesArf", mesArf.longValue());
      q.setLong("anoArf", anoArf.longValue());
      q.setString("ativo", "S");
     
      return q.list();
      }
      catch(Exception e) {
        this.logger.error(e);
      throw new ECARException(e);
    }
    }
   
    /**
     * Retorna um objeto AcompRealFisicoArf a partir do IETT, Dia, M�s e Ano
     *
     * @param codIett Long
     * @param diaArf
     * @param mesArf
     * @param anoArf
     * @return AcompRealFisicoArf
     * @throws ECARException
     */
    public List buscarPorIett(Long codIett, Long diaArf, Long mesArf, Long anoArf) throws ECARException {
      try {
      StringBuilder query = new StringBuilder("select ARF from AcompRealFisicoArf as ARF")
                .append(" where ARF.itemEstruturaIett.codIett = :codIett")
                .append(" and ARF.itemEstruturaIett.indAtivoIett = :ativo")
                .append(" and ARF.diaArf = :diaArf")
                .append(" and ARF.mesArf = :mesArf")
                .append(" and ARF.anoArf = :anoArf");
     
      Query q = this.getSession().createQuery(query.toString());
     
      q.setLong("codIett", codIett.longValue());
      q.setLong("diaArf", diaArf.longValue());
      q.setLong("mesArf", mesArf.longValue());
      q.setLong("anoArf", anoArf.longValue());
      q.setString("ativo", "S");
     
      return q.list();
      }
      catch(Exception e) {
        this.logger.error(e);
      throw new ECARException(e);
    }
    }
   
    /**
     * Devolve a quantidade realizada total em AcompRealFisico para um indResultado
     *
     * @param acompReferenciaItem
     * @param itemEstrtIndResul
     * @param radAcumulados
     * @return
     * @throws ECARException
     * @throws HibernateException
     */
   
    public double getQuantidadeRealizada(AcompReferenciaItemAri acompReferenciaItem,
              ItemEstrtIndResulIettr itemEstrtIndResul, String radAcumulados) throws ECARException, HibernateException {
        StringBuilder query = new StringBuilder("select sum(acompRealFisico.qtdRealizadaArf) from AcompRealFisicoArf as acompRealFisico");
    query.append(" where acompRealFisico.itemEstrtIndResulIettr.codIettir = :codIettir");
   
    if("P".equalsIgnoreCase(radAcumulados)){
      query.append(" and (acompRealFisico.anoArf < :anoArf")
         .append(" or (acompRealFisico.mesArf <= :mesArf")
         .append(" and acompRealFisico.anoArf = :anoArf))");
    }

    Query q = this.getSession().createQuery(query.toString());
   
    q.setLong("codIettir", itemEstrtIndResul.getCodIettir().longValue());

    if("P".equalsIgnoreCase(radAcumulados)){
      q.setLong("anoArf", Long.valueOf(acompReferenciaItem.getAcompReferenciaAref().getAnoAref()).longValue());
      q.setLong("mesArf", Long.valueOf(acompReferenciaItem.getAcompReferenciaAref().getMesAref()).longValue());
    }
    q.setMaxResults(1);
   
    Double total = (Double) q.uniqueResult();
    if(total != null)
      return total.doubleValue();
    else
      return 0;
    }
   
   
    /**
     * Devolve a quantidade realizada, para um indResultado n�o acumul�vel
     *    A partir do Aref passado pelo Ari, � selecionado o �ltimo valor inclu�do
     *     no mesmo Exerc�cio anterior ou igual ao M�s e Ano do Aref.
     *
     * @param acompReferenciaItem
     * @param itemEstrtIndResul
     * @param radAcumulados
     * @return
     * @throws ECARException
     */
   
    // M�TODO OBSOLETO E N�O FUNCIONA CORRETAMENTE - CRISTIANO 02/02/2007
//    public double getQuantidadeRealizadaNaoAcumulados(AcompReferenciaItemAri acompReferenciaItem,
//              ItemEstrtIndResulIettr itemEstrtIndResul, String radAcumulados) throws ECARException{
//        double realizado = 0;
//       
//        List meses = new ExercicioDao(request)
//          .getMesesDentroDoExercicio(acompReferenciaItem.getAcompReferenciaAref().getExercicioExe(),
//              Integer.valueOf ( acompReferenciaItem.getAcompReferenciaAref().getMesAref() ).intValue(),
//              Integer.valueOf ( acompReferenciaItem.getAcompReferenciaAref().getAnoAref() ).intValue());
//       
//        Collections.reverse(meses);
//       
//        Iterator it = meses.iterator();
//        while(it.hasNext()){
//          String mesAno = (String) it.next();
//         
//          String mes = mesAno.split("-")[0];
//          String ano = mesAno.split("-")[1];
//         
//          if(Integer.valueOf(mes).intValue() < 10)
//            mes = "0" + mes;
//
//          System.out.println("mesAno: " + mesAno);
//         
//          AcompReferenciaAref acompReferencia = new AcompReferenciaAref();
//         
//          acompReferencia.setExercicioExe(acompReferenciaItem.getAcompReferenciaAref().getExercicioExe());
//          acompReferencia.setMesAref(mes);
//          acompReferencia.setAnoAref(ano);
//         
//          acompReferencia.setTipoAcompanhamentoTa(acompReferenciaItem.getAcompReferenciaAref().getTipoAcompanhamentoTa());
//         
//          //FIXME: �rg�o � necess�rio?
//          //acompReferencia.setOrgaoOrg(acompReferenciaItem.getAcompReferenciaAref().getOrgaoOrg());
//         
//          /* Verifica se tem o Aref para o mes e ano */
//          List listaAcompRef = this.pesquisar(acompReferencia, null);
//         
//          System.out.println("listaAcompRef" + listaAcompRef.size());
//         
//          Iterator itAcompRef = listaAcompRef.iterator();
//         
//          if(itAcompRef.hasNext()){
//            AcompReferenciaAref acompRefAnt = (AcompReferenciaAref) itAcompRef.next();
//           
//            AcompReferenciaItemAri acompRefItemPes = new AcompReferenciaItemAri();
//           
//            acompRefItemPes.setAcompReferenciaAref(acompRefAnt);
//            acompRefItemPes.setItemEstruturaIett(acompReferenciaItem.getItemEstruturaIett());
//           
//            /* pesquisar, verificar se possui um ARI */
//            List listaAcompRefItem = this.pesquisar(acompRefItemPes, null);
//              //Iterator itAcompRefItem = listaAcompRefItem.iterator();
//             
//              //if(itAcompRefItem.hasNext()){
//                //AcompReferenciaItemAri acompRefItemAnt = (AcompReferenciaItemAri) itAcompRefItem.next();
//            if(listaAcompRefItem != null && !listaAcompRefItem.isEmpty()) {
//               
//                AcompRealFisicoArf acompRealFisicoPes = new AcompRealFisicoArf();
//               
//                //acompRealFisicoPes.setAcompReferenciaItemAri(acompRefItemAnt);
//                acompRealFisicoPes.setItemEstrtIndResulIettr(itemEstrtIndResul);
//                //acompRealFisicoPes.setItemEstruturaIett(acompReferenciaItem.getItemEstruturaIett());
//               
//                /* Verificar se tem o indicador com a quantidade preenchida */
//                List listaAcompRealFis = this.pesquisar(acompRealFisicoPes, null);
//                  Iterator itAcompRealFis = listaAcompRealFis.iterator();
//                 
//                  if(itAcompRealFis.hasNext()){
//                    AcompRealFisicoArf acompRealFisicoAnt = (AcompRealFisicoArf) itAcompRealFis.next();
//                   
//                    if(acompRealFisicoAnt.getQtdRealizadaArf() != null &&
//                        acompRealFisicoAnt.getQtdRealizadaArf().doubleValue() > 0){
//                      return acompRealFisicoAnt.getQtdRealizadaArf().doubleValue();
//                    }
//                  }
//              }
//          }
//        }
//       
//        return realizado;
//    }
   
    /**
     * Calcula a quantidade realizada por exerc�cio ou total de um AcompReferenciaItemAri,
     * para um indicador de resultado (Iettr) n�o acumul�vel, considerando se � a quantidade Maior, �ltima ou N�o se aplica
     *
     * @author cristianoprecoma
     *
     * @param ari
     * @param iettr
     * @param acumulados
     * @param porExercicioOuTotal
     * @return double
     * @throws ECARException
     */
    public double getQuantidadeRealizadaNaoAcumulados(
        AcompReferenciaItemAri ari,
        ItemEstrtIndResulIettr iettr,
        String acumulados,
        String porExercicioOuTotal) throws ECARException {
    try {
         
        if("N".equals(iettr.getIndValorFinalIettr())) { //N�o se aplica
          return 0;
        }
       
          // Realizados f�sicos do indicador
          Set setRealizadosFisicos = iettr.getAcompRealFisicoArfs();
         
          if(setRealizadosFisicos != null) {
              Iterator it = setRealizadosFisicos.iterator();
             
              // In�cio das verifica��es das quantidades
             
              // Realizado TOTAL
              if("T".equals(porExercicioOuTotal)) {
               
                // Se o acumulados for at� o per�odo mudar conjunto de ARFs para verifica��o
                if("P".equals(acumulados)) {
                    // Ano + M�s do acompanhamento (OBS.: no AREF o ano e m�s s�o String e o m�s j� est� com zero para os meses inferiores a 10)
                    long anoMesAcompanhamento = Long.parseLong(ari.getAcompReferenciaAref().getAnoAref() + ari.getAcompReferenciaAref().getMesAref());
                    // Obter os ARFs AT� O PER�ODO do indicador
                    Set setRealizadosFisicosTotalAtePeriodo = new HashSet();
                    it = setRealizadosFisicos.iterator();
                    while (it.hasNext()) {
                      AcompRealFisicoArf arf = (AcompRealFisicoArf) it.next();
                      String anoMes = String.valueOf(arf.getAnoArf());
                     
                      if(arf.getMesArf() < 10) {
                        anoMes += "0";
                      }
                    anoMes += String.valueOf(arf.getMesArf());
 
                    if(Long.parseLong(anoMes) <= anoMesAcompanhamento) {
                      setRealizadosFisicosTotalAtePeriodo.add(arf);
                    }
                    }
                  it = setRealizadosFisicosTotalAtePeriodo.iterator();
                }
        // Realizado EXERC�CIO
              } else if("E".equals(porExercicioOuTotal)) {
                // obter os meses/anos do exerc�cio do acompanhamento
                List mesesAnos = null;
               
                // Se o acumulados for at� o per�odo considerar os meses/anos at� o m�s/ano do acompanhamento
                if("P".equals(acumulados)) {
                  mesesAnos = new ExercicioDao(request).getMesesDentroDoExercicio(
                      ari.getAcompReferenciaAref().getExercicioExe(),
                      Integer.valueOf(ari.getAcompReferenciaAref().getMesAref()).intValue(),
                      Integer.valueOf(ari.getAcompReferenciaAref().getAnoAref()).intValue());
                } else {
                  mesesAnos = new ExercicioDao(request).getMesesDentroDoExercicio(ari.getAcompReferenciaAref().getExercicioExe());
                }
               
                if(mesesAnos != null && !mesesAnos.isEmpty()) {
                  List anoMesExercicio = new ArrayList();
                  // alterar a lista para ano + m�s
              Iterator itMeses = mesesAnos.iterator();
              while(itMeses.hasNext()) {
                String mesAno = (String) itMeses.next();
               
                String mes = mesAno.split("-")[0];
                String ano = mesAno.split("-")[1];
               
                if(Integer.valueOf(mes).intValue() < 10) {
                  mes = "0" + mes;
                }
                anoMesExercicio.add(ano + mes);
              }
              // ordenar a lista por ano + m�s
                 Collections.sort(anoMesExercicio,
                        new Comparator() {
                        public int compare(Object o1, Object o2) {                                  
                          Integer num1 = Integer.valueOf(o1.toString());
                          Integer num2 = Integer.valueOf(o2.toString());
                         
                          return num1.compareTo(num2)
                    }
                     }
              );
                
                 long periodoInicial = Long.parseLong(anoMesExercicio.get(0).toString());
                 long periodoFinal = Long.parseLong(anoMesExercicio.get((anoMesExercicio.size() - 1)).toString());
 
                 // Considerar os ARFs que dentro do per�odo inicial/final
                    Set setRealizadosFisicosPorExercicio = new HashSet();
                    it = setRealizadosFisicos.iterator();
                    while (it.hasNext()) {
                      AcompRealFisicoArf arf = (AcompRealFisicoArf) it.next();
                      String anoMes = String.valueOf(arf.getAnoArf());
                     
                      if(arf.getMesArf() < 10) {
                        anoMes += "0";
                      }
                    anoMes += String.valueOf(arf.getMesArf());
 
                    if(Long.parseLong(anoMes) >= periodoInicial && Long.parseLong(anoMes) <= periodoFinal) {
                      setRealizadosFisicosPorExercicio.add(arf);
                    }
                    }
                  it = setRealizadosFisicosPorExercicio.iterator();
                } else {
                  throw new ECARException("N�o existe exerc�cio cadastrado para o per�odo do acompanhamento");
                }
               
              }
             
              // verifificar a quantidade no conjunto de ARFs selecionado anteriormente
        if("M".equals(iettr.getIndValorFinalIettr())) { //Maior
                double maior = 0;
                while (it.hasNext()) {
                  AcompRealFisicoArf arf = (AcompRealFisicoArf) it.next();
                    if(arf.getQtdRealizadaArf() != null && arf.getQtdRealizadaArf().doubleValue() > maior){
                      maior = arf.getQtdRealizadaArf().doubleValue();
                    }
                }
                return maior;
            } else if("U".equals(iettr.getIndValorFinalIettr())) { //Ultimo
              long maiorAnoMes = 0;
              double ultimo = 0;
             
                while (it.hasNext()) {
                  AcompRealFisicoArf arf = (AcompRealFisicoArf) it.next();
                  String anoMes = String.valueOf(arf.getAnoArf());
                 
                  if(arf.getMesArf() < 10) {
                    anoMes += "0";
                  }
                  anoMes += String.valueOf(arf.getMesArf());
 
                  if(Long.parseLong(anoMes) > maiorAnoMes) {
                    maiorAnoMes = Long.parseLong(anoMes);
                      if(arf.getQtdRealizadaArf() != null) {
                        ultimo = arf.getQtdRealizadaArf().doubleValue();
                      } else {
                        ultimo = 0;
                      }
                  }
                }
                return ultimo;
            }
              // Fim das verifica��es das quantidades
          }
         
          return 0;
    } catch(Exception e) {
      this.logger.error(e);
      throw new ECARException(e);
    }
  }   
   
    /**
   * Seta um objeto AcompRealFisico de acordo com os par�metros do request
   *
     * @param request
     * @param acompRealFisicoArf
     * @throws ECARException
   */
  public void setAcompRealFisico(HttpServletRequest request, AcompRealFisicoArf acompRealFisicoArf) throws ECARException {
       
    int countSelecionado = Pagina.getParamInt(request, "hidContSelecionado"); //numero de linhas
   
    if (countSelecionado > 0){
   
      if (acompRealFisicoArf.getItemEstrtIndResulIettr()!=null &&
          (acompRealFisicoArf.getItemEstrtIndResulIettr().getIndTipoAtualizacaoRealizado() == null) ||
          (acompRealFisicoArf.getItemEstrtIndResulIettr().getIndTipoAtualizacaoRealizado()!= null &&
           !acompRealFisicoArf.getItemEstrtIndResulIettr().getIndTipoAtualizacaoRealizado().equals("A"))) {
        // se o campo de quantidade do ARF estiver habilitado
        if(!"".equals(Pagina.getParamStr(request, "qtdRealizadaArf" + countSelecionado))) {
          acompRealFisicoArf.setQtdRealizadaArf(Double.valueOf(Util.formataNumero(Pagina.getParamStr(request, "qtdRealizadaArf" + countSelecionado))));
        } else {
          acompRealFisicoArf.setQtdRealizadaArf(null);
        }
      }
     
      if (!"".equals(Pagina.getParamStr(request, "situacaoSit" + countSelecionado))) {
        acompRealFisicoArf.setSituacaoSit( (SituacaoSit) buscar(SituacaoSit.class, Long.valueOf(Pagina.getParamStr(request, "situacaoSit" + countSelecionado))));
      } else {
        acompRealFisicoArf.setSituacaoSit(null);
      }
     
      acompRealFisicoArf.setUsuarioUltManut(((SegurancaECAR)request.getSession().getAttribute("seguranca")).getUsuario());
      acompRealFisicoArf.setDataUltManut(Data.getDataAtual());
     
    }
     
  }
   
 
  /**
   * Altera o objeto AcompRealFisicoArf passado como par�metro.
   * Realiza um buscar com os parametros passados e faz o update;
   *
         * @param acompRealFisicoArf
         * @throws ECARException - executa o rollback da transa��o
   */
  public void alterar(AcompRealFisicoArf acompRealFisicoArf) throws ECARException {
    Transaction tx = null;

    try {
        ArrayList objetos = new ArrayList();
      super.inicializarLogBean();

      tx = session.beginTransaction();

      session.update(acompRealFisicoArf);
      objetos.add(acompRealFisicoArf);
       
      //Se a situa��o representa conclus�o, apago do banco todos os ARFs posteriores do indicador em quest�o.
      if(acompRealFisicoArf.getSituacaoSit() != null && "S".equals(acompRealFisicoArf.getSituacaoSit().getIndConcluidoSit())){
        List arfsPosteriores = this.getArfsPosteriores(acompRealFisicoArf);
       
        if(arfsPosteriores != null && !arfsPosteriores.isEmpty()){
          for(Iterator it = arfsPosteriores.iterator(); it.hasNext();){
            AcompRealFisicoArf arfExc = (AcompRealFisicoArf) it.next();
            session.delete(arfExc);
          }
        }
      }
       
      tx.commit();

      if(super.logBean != null) {
        super.logBean.setCodigoTransacao(Data.getHoraAtual(false));
        super.logBean.setOperacao("ALT");
        Iterator itObj = objetos.iterator();

        while(itObj.hasNext()) {
          super.logBean.setObj(itObj.next());
          super.loggerAuditoria.info(logBean.toString());
        }
      }
    } catch (HibernateException e) {
      if (tx != null)
        try {
          tx.rollback();
        } catch (HibernateException r) {
          this.logger.error(r);
          throw new ECARException("erro.hibernateException");
        }
      this.logger.error(e);
      throw new ECARException("erro.hibernateException");
    }
  }
 
   
    /**
   * Atualiza a grade de AcompRealFisico de acordo com o numero de linhas passadas
   * em hidCont.
   * Realiza um buscar com os parametros passados e faz o update;
     * @param request
     * @deprecated desde 03/09/2008
   * @throws ECARException - executa o rollback da transa��o
   */
  public void atualizar (HttpServletRequest request) throws ECARException {
    Transaction tx = null;

    try {
        ArrayList objetos = new ArrayList();
      super.inicializarLogBean();

      tx = session.beginTransaction();
      int cont = 1;
      int numReg = Pagina.getParamInt(request, "hidCont"); //numero de linhas
      while (cont <= numReg){
        AcompRealFisicoArf acompRealFisico = new AcompRealFisicoArf();
       
        // nova verifica��o da existencia do ARF pelo COD_ARF (Mantis 5518)
        acompRealFisico = this.buscar(Long.valueOf(Pagina.getParamStr(request, "codArf" + cont)));
       
        // se o campo de quantidade do ARF estiver habilitado
        if(!"".equals(Pagina.getParamStr(request, "qtdRealizadaArf" + cont))) {
          acompRealFisico.setQtdRealizadaArf(Double.valueOf(Util.formataNumero(Pagina.getParamStr(request, "qtdRealizadaArf" + cont))));
        } else {
          //acompRealFisico.setQtdRealizadaArf(null);
        }
       
        if (!"".equals(Pagina.getParamStr(request, "situacaoSit" + cont))) {
          acompRealFisico.setSituacaoSit( (SituacaoSit) buscar(SituacaoSit.class, Long.valueOf(Pagina.getParamStr(request, "situacaoSit" + cont))));
        } else {
          //acompRealFisico.setSituacaoSit(null);
        }
       
        acompRealFisico.setUsuarioUltManut(((SegurancaECAR)request.getSession().getAttribute("seguranca")).getUsuario());
        acompRealFisico.setDataUltManut(Data.getDataAtual());

        session.update(acompRealFisico);
        objetos.add(acompRealFisico);
       
        //Se a situa��o representa conclus�o, apago do banco todos os ARFs posteriores do indicador em quest�o.
        if(acompRealFisico.getSituacaoSit() != null && "S".equals(acompRealFisico.getSituacaoSit().getIndConcluidoSit())){
          List arfsPosteriores = this.getArfsPosteriores(acompRealFisico);
         
          if(arfsPosteriores != null && !arfsPosteriores.isEmpty()){
            for(Iterator it = arfsPosteriores.iterator(); it.hasNext();){
              AcompRealFisicoArf arfExc = (AcompRealFisicoArf) it.next();
              session.delete(arfExc);
            }
          }
        }
       
          cont++;
      }
      tx.commit();

      if(super.logBean != null) {
        super.logBean.setCodigoTransacao(Data.getHoraAtual(false));
        super.logBean.setOperacao("ALT");
        Iterator itObj = objetos.iterator();

        while(itObj.hasNext()) {
          super.logBean.setObj(itObj.next());
          super.loggerAuditoria.info(logBean.toString());
        }
      }
    } catch (HibernateException e) {
      if (tx != null)
        try {
          tx.rollback();
        } catch (HibernateException r) {
          this.logger.error(r);
          throw new ECARException("erro.hibernateException");
        }
      this.logger.error(e);
      throw new ECARException("erro.hibernateException");
    }
  }

  /**
   * Seta um objeto AcompRealFisico Filho de acordo com os par�metros do request
   *
         * @param request
         * @param acompRealFisicoArf
         * @throws ECARException
   */
  public void setAcompRealFisicoFilho(HttpServletRequest request, AcompRealFisicoArf acompRealFisicoArf) throws ECARException {
   
    int countSelecionado = Pagina.getParamInt(request, "hidContSelecionado"); //numero de linhas
    int countFilhoSelecionado = Pagina.getParamInt(request, "hidContFilhoSelecionado");
   
    if (countSelecionado > 0){
     
      // Se o campo de quantidade do ARF estiver habilitado
     
      if (acompRealFisicoArf.getItemEstrtIndResulIettr()!=null && acompRealFisicoArf.getItemEstrtIndResulIettr().getIndTipoAtualizacaoRealizado()!= null
          && (!acompRealFisicoArf.getItemEstrtIndResulIettr().getIndTipoAtualizacaoRealizado().equals("A")) ) {
        if(!"".equals(Pagina.getParamStr(request, "qtdRealizadaArf" + countSelecionado + "-" + countFilhoSelecionado))) {
          acompRealFisicoArf.setQtdRealizadaArf(Double.valueOf(Util.formataNumero(Pagina.getParamStr(request, "qtdRealizadaArf" + countSelecionado + "-" + countFilhoSelecionado))));
        } else {
          acompRealFisicoArf.setQtdRealizadaArf(null);
        }
      }
     
      // Seo campo de situa��o do ARF estiver informado.
      if (!"".equals(Pagina.getParamStr(request, "situacaoSit" + countSelecionado + "-" + countFilhoSelecionado))) {
        acompRealFisicoArf.setSituacaoSit( (SituacaoSit) buscar(SituacaoSit.class, Long.valueOf(Pagina.getParamStr(request, "situacaoSit" + countSelecionado + "-" + countFilhoSelecionado))));
      } else {
        acompRealFisicoArf.setSituacaoSit(null);
      }

      acompRealFisicoArf.setUsuarioUltManut(((SegurancaECAR)request.getSession().getAttribute("seguranca")).getUsuario());
      acompRealFisicoArf.setDataUltManut(Data.getDataAtual());
     
    }
  }
 
 
    /**
   * Atualiza a grade de AcompRealFisico de acordo com o numero de linhas passadas em hidCont.
   * Realiza um buscar com os parametros passados e faz o update;
   *
     * @param request
     * @author n/c, rogerio
   * @since 0.1, n/c
   * @version 0.2, 03/04/2007
   * @deprecated desde 03/09/2008
   * @throws ECARException
   */
  public void atualizarFilho (HttpServletRequest request) throws ECARException {
    Transaction tx = null;

    try {
        ArrayList objetos = new ArrayList();
      super.inicializarLogBean();
      tx = session.beginTransaction();
     
      int numero = Pagina.getParamInt(request, "numFilho"); // numero de filhos na tela     
      int numReg;
           
      /* --
       * Para o filho em que o usu�rio clicou em gravar, obtem os dados.
       * Por Rog�rio (03/04/2007). Mantis #7832.
       * -- */
      // obtem o nro de linhas para aquele quadro filho.
      numReg = Pagina.getParamInt(request, "hidContFilhos"+String.valueOf(numero));
     
      for( int j = 1; j <= numReg; j++ ) {
        AcompRealFisicoArf acompRealFisico = new AcompRealFisicoArf();
       
        // Nova verifica��o da existencia do ARF pelo COD_ARF (Mantis 5518)
        acompRealFisico = this.buscar(Long.valueOf(Pagina.getParamStr(request, "codArf" + j + "-" + numero)));
     
        // Se o campo de quantidade do ARF estiver habilitado
        if(!"".equals(Pagina.getParamStr(request, "qtdRealizadaArf" + j + "-" + numero))) {
          acompRealFisico.setQtdRealizadaArf(Double.valueOf(Util.formataNumero(Pagina.getParamStr(request, "qtdRealizadaArf" + j + "-" + numero))));
        } else {
          acompRealFisico.setQtdRealizadaArf(null);
        }
       
        // Seo campo de situa��o do ARF estiver informado.
        if (!"".equals(Pagina.getParamStr(request, "situacaoSit" + j + "-" + numero))) {
          acompRealFisico.setSituacaoSit( (SituacaoSit) buscar(SituacaoSit.class, Long.valueOf(Pagina.getParamStr(request, "situacaoSit" + j + "-" + numero))));
        } else {
          acompRealFisico.setSituacaoSit(null);
        }

        acompRealFisico.setUsuarioUltManut(((SegurancaECAR)request.getSession().getAttribute("seguranca")).getUsuario());
        acompRealFisico.setDataUltManut(Data.getDataAtual());

        session.update(acompRealFisico);
        objetos.add(acompRealFisico);
       
        //Se a situa��o representa conclus�o, apago do banco todos os ARFs posteriores do indicador em quest�o.
        if(acompRealFisico.getSituacaoSit() != null && "S".equals(acompRealFisico.getSituacaoSit().getIndConcluidoSit())){
          List arfsPosteriores = this.getArfsPosteriores(acompRealFisico);
         
          if(arfsPosteriores != null && !arfsPosteriores.isEmpty()){
            for(Iterator it = arfsPosteriores.iterator(); it.hasNext();){
              AcompRealFisicoArf arfExc = (AcompRealFisicoArf) it.next();
              session.delete(arfExc);
            }
          }
        }
       
      }
     
      tx.commit();

      if(super.logBean != null) {
        super.logBean.setCodigoTransacao(Data.getHoraAtual(false));
        super.logBean.setOperacao("ALT");
        Iterator itObj = objetos.iterator();

        while(itObj.hasNext()) {
          super.logBean.setObj(itObj.next());
          super.loggerAuditoria.info(logBean.toString());
        }
      }
    } catch (HibernateException e) {
      if (tx != null)
        try {
          tx.rollback();
        } catch (HibernateException r) {
          this.logger.error(r);
          throw new ECARException("erro.hibernateException");
        }
      this.logger.error(e);
      throw new ECARException("erro.hibernateException");
    }
  }

 
  /**
   * Retorna a quantidade Realizada de um indicador de resultado em um exerc�cio.
   * Utilizado para recuperar a quantidade realizada de um indicador n�o acumul�vel em um exerc�cio.
   * Vai retornar o valor realizado no �ltimo per�odo que tenha sido cadastrado para este exerc�cio.
   * @param exercicio
   * @param indResul
   * @param aref
   * @return
   * @throws ECARException
   */
  public double getQtdRealizadaExercicioNaoAcumulavel (ExercicioExe exercicio, ItemEstrtIndResulIettr indResul, AcompReferenciaAref aref) throws ECARException{
    try{
      // obter os ARIs dos AREFs do exerc�cio desejado
//      StringBuilder query = new StringBuilder("select ARI from AcompReferenciaItemAri as ARI")
//                .append(" where ARI.acompReferenciaAref.exercicioExe.codExe = :codExe")
//                .append(" and ARI.itemEstruturaIett.codIett = :codIett");
//     
//      Query q = this.getSession().createQuery(query.toString());
//      q.setLong("codExe", exercicio.getCodExe().longValue());
//      q.setLong("codIett", indResul.getItemEstruturaIett().getCodIett().longValue());
//      List listaARI = q.list();
//               
//      if(listaARI != null && !listaARI.isEmpty()) {
//        List listaMesAref = new ArrayList();
//        List listaAnoAref = new ArrayList();
//
//        Iterator it = listaARI.iterator();
//        while(it.hasNext()) {
//          AcompReferenciaItemAri ari = (AcompReferenciaItemAri)it.next();
//         
//          if(!listaMesAref.contains(Long.valueOf(ari.getAcompReferenciaAref().getMesAref()))) {
//            listaMesAref.add(Long.valueOf(ari.getAcompReferenciaAref().getMesAref()));
//          }
//          if(!listaAnoAref.contains(Long.valueOf(ari.getAcompReferenciaAref().getAnoAref()))) {
//            listaAnoAref.add(Long.valueOf(ari.getAcompReferenciaAref().getAnoAref()));
//          }
//        }
//       
//        /*
//         * Selecionar todos os ARFs...
//         */
//        query = new StringBuilder("select ARF.qtdRealizadaArf from AcompRealFisicoArf as ARF")
//                .append(" where ARF.mesArf in (:mes)")
//                .append(" and ARF.anoArf in (:ano)")
//                .append(" and ARF.itemEstrtIndResulIettr.codIettir=:iettir")
//                .append(" order by ARF.anoArf desc, ARF.mesArf desc");
//
//        q = this.getSession().createQuery(query.toString());
//        q.setParameterList("mes", listaMesAref);
//        q.setParameterList("ano", listaAnoAref);
//        q.setParameter("iettir", indResul.getCodIettir());

        List valores = this.getListaRealizadoExercicioByIettrAndExe(exercicio, exercicio, indResul, aref);
       
        /*
         * Utilizando m�todo que valida se � para retornar o maior valor, �ltimo valor, etc...
         */
        Double valor = this.getSomaValoresArfs(indResul, valores);
       
        if(valor != null)
          return valor.doubleValue();
        else
          return 0;
//      } else {
//        return 0;
//      }
    } catch(HibernateException e){
      this.logger.error(e);
      throw new ECARException(e);
    }
   
  }
 
  /**
   * Retorna a um valor de uma lista de valores, dependendo do indicador.<br>
   * Se o indicador � acumul�vel, retorna a soma dos valores da lista.<br>
   * Se o indicador n�o � acumul�vel, e seu valor final est� informado como "Maior",
   * retorna o maior valor da lista de valores. <br>
   * Se o indicador n�o � acumul�vel, e seu valor final est� informado como "�ltimo",
   * retorna o PRIMEIRO* valor da lista de valores. <br>
   * <br>
   * *PRIMEIRO: os valores devem estar ordenados do Arf mais recente para o Arf menos recente
   * (do �ltimo informado para o primeiro).
   *
   * @author aleixo
   * @since 0.1 15/03/2007
   * @version 0.3 16/03/2007, 0.2 16/03/2007
         * @param itemEstrtIndResul
         * @param valores
   * @return Double
   */
  public Double getSomaValoresArfs(ItemEstrtIndResulIettr itemEstrtIndResul, List<Double> valores){
        Double retorno = new Double(0);
        double total = 0;
        double maior = 0;
       
        String indAcumulavel = itemEstrtIndResul.getIndAcumulavelIettr();
        String indValorFinal = itemEstrtIndResul.getIndValorFinalIettr();
       
        for(Double valor : valores){
          if("S".equals(indAcumulavel) && valor != null){
            total += valor.doubleValue();
          }
          else {
            if("M".equals(indValorFinal)){ //Maior
                if(valor != null && valor.doubleValue() > maior){
                  maior = valor.doubleValue();
                     total = maior;
                }
            }
            else if("U".equals(indValorFinal) && valor != null){ //Ultimo
              /*
               * A lista de valores j� est� vindo ordenada pelo �ltimo ARF, ent�o, �
               * s� atribuir o primeiro valor como retorno.
               */
                total = valor.doubleValue();
                break;
            }
          }
        }
        retorno = Double.valueOf(total);
       
        return retorno;
    }
 
  /**
   * Retorna a Quantidadade Realizada de um Indicador de Resultado
   * em um Exercicio.
   * 
         * @param acompReferenciaItem
         * @param indResul
         * @param radAcumulados
         * @return double - quant
   * @throws HibernateException
   */
  public double getQtdRealizadaExercicio (AcompReferenciaItemAri acompReferenciaItem,
            ItemEstrtIndResulIettr indResul, String radAcumulados) throws HibernateException{
    double total = 0;

    /*
     *
    // obter os ARIs dos AREFs do exerc�cio desejado
    StringBuilder query = new StringBuilder("select ARI from AcompReferenciaItemAri as ARI")
                .append(" where ARI.acompReferenciaAref.exercicioExe.codExe = :codExe")
                .append(" and ARI.itemEstruturaIett.codIett = :codIett");
   
    Query q = this.getSession().createQuery(query.toString());
    q.setLong("codExe", acompReferenciaItem.getAcompReferenciaAref().getExercicioExe().getCodExe().longValue());
    q.setLong("codIett", indResul.getItemEstruturaIett().getCodIett().longValue());
    List listaARI = q.list();
             
    if(listaARI != null && !listaARI.isEmpty()) {
      List listaMesAref = new ArrayList();
      List listaAnoAref = new ArrayList();

      Iterator it = listaARI.iterator();
      while(it.hasNext()) {
        AcompReferenciaItemAri ari = (AcompReferenciaItemAri)it.next();
       
        if(!listaMesAref.contains(Long.valueOf(ari.getAcompReferenciaAref().getMesAref()))) {
          listaMesAref.add(Long.valueOf(ari.getAcompReferenciaAref().getMesAref()));
        }
        if(!listaAnoAref.contains(Long.valueOf(ari.getAcompReferenciaAref().getAnoAref()))) {
          listaAnoAref.add(Long.valueOf(ari.getAcompReferenciaAref().getAnoAref()));
        }
      }
      query = new StringBuilder("select sum(ARF.qtdRealizadaArf) from AcompRealFisicoArf as ARF")
              .append(" where ARF.itemEstrtIndResulIettr.codIettir = :iettir");

      if("P".equalsIgnoreCase(radAcumulados)){
        query.append(" and (ARF.mesArf <= :mes and ARF.anoArf = :ano)");
      } else {
        query.append(" and ARF.mesArf in (:mes)")
             .append(" and ARF.anoArf in (:ano)");
      }

      q = this.getSession().createQuery(query.toString());
      if(!"P".equalsIgnoreCase(radAcumulados)){
        q.setParameterList("mes", listaMesAref);
        q.setParameterList("ano", listaAnoAref);
      } else {
        q.setLong("mes", Long.parseLong(acompReferenciaItem.getAcompReferenciaAref().getMesAref()));
        q.setLong("ano", Long.parseLong(acompReferenciaItem.getAcompReferenciaAref().getAnoAref()));
      }
      q.setLong("iettir", indResul.getCodIettir().longValue());
      q.setMaxResults(1);

      Double valor = (Double) q.uniqueResult();
      if(valor != null) {
        total = valor.doubleValue();
      }
    }*/
   
    if("P".equalsIgnoreCase(radAcumulados)){ //Considera o AREF
      total = this.getQtdRealizadaExercicio(acompReferenciaItem.getAcompReferenciaAref().getExercicioExe(), indResul, acompReferenciaItem.getAcompReferenciaAref());
    } else { //Total do exerc�cio
      total = this.getQtdRealizadaExercicio(acompReferenciaItem.getAcompReferenciaAref().getExercicioExe(), indResul, null);
    }
     
    return total;
  }
 
  /**
   * Retorna a quantidade Realizada de um indicador de resultado em um exerc�cio
   * @param exercicio
   * @param indResul
   * @return
   * @throws ECARException
   */
  /*
   *
   * Comentado por Aleixo
   *
   * M�todo reescrito abaixo em : getRealizadoExercicioByIettrAndExe().
   *
  public double getQtdRealizadaExercicio (ExercicioExe exercicio, ItemEstrtIndResulIettr indResul) throws ECARException{
    try{
      double total = 0;

      // obter os ARIs dos AREFs do exerc�cio desejado
      StringBuilder query = new StringBuilder("select ARI from AcompReferenciaItemAri as ARI")
                  .append(" where ARI.acompReferenciaAref.exercicioExe.codExe = :codExe")
                  .append(" and ARI.itemEstruturaIett.codIett = :codIett");
     
      Query q = this.getSession().createQuery(query.toString());
      q.setLong("codExe", exercicio.getCodExe().longValue());
      q.setLong("codIett", indResul.getItemEstruturaIett().getCodIett().longValue());
      List listaARI = q.list();
               
      if(listaARI != null && !listaARI.isEmpty()) {
        List listaMesAref = new ArrayList();
        List listaAnoAref = new ArrayList();

        Iterator it = listaARI.iterator();
        while(it.hasNext()) {
          AcompReferenciaItemAri ari = (AcompReferenciaItemAri)it.next();
         
          if(!listaMesAref.contains(Long.valueOf(ari.getAcompReferenciaAref().getMesAref()))) {
            listaMesAref.add(Long.valueOf(ari.getAcompReferenciaAref().getMesAref()));
          }
          if(!listaAnoAref.contains(Long.valueOf(ari.getAcompReferenciaAref().getAnoAref()))) {
            listaAnoAref.add(Long.valueOf(ari.getAcompReferenciaAref().getAnoAref()));
          }
        }
        query = new StringBuilder("select sum(ARF.qtdRealizadaArf) from AcompRealFisicoArf as ARF")
              .append(" where ARF.mesArf in (:mes)")
              .append(" and ARF.anoArf in (:ano)")
              .append(" and ARF.itemEstrtIndResulIettr.codIettir = :iettir");

        q = this.getSession().createQuery(query.toString());
       
        q.setParameterList("mes", listaMesAref);
        q.setParameterList("ano", listaAnoAref);
        q.setLong("iettir", indResul.getCodIettir().longValue());
        q.setMaxResults(1);

        Double valor = (Double)q.uniqueResult();
        if(valor != null) {
          total = valor.doubleValue();
        }
      }
       
      return total;
    } catch(HibernateException e){
      this.logger.error(e);
      throw new ECARException(e);
    }
   
  }*/

  /**
   * Retorna a soma do realizado de um indicador (ARF), de um exerc�cio, considerando o acompanhamento (AREF).
   *
   * @author aleixo
   * @version 0.1 - 18/04/2007
         * @param exercicio
         * @param indResul
         * @param aref
   * @return double
   */
  public double getQtdRealizadaExercicio (ExercicioExe exercicio, ItemEstrtIndResulIettr indResul, AcompReferenciaAref aref){
   
    /*
     * Passo o mesmo exerc�cio, pois quero o realizado de um exerc�cio. Ent�o o exer�cio inicial � o mesmo que o final.
     */
    return this.getRealizadoExercicioByIettrAndExe(exercicio, exercicio, indResul, aref);
  }
 
  /**
   * Retorna a soma do realizado de um indicador (ARF), entre um exerc�cio incial e final.
   *
   * @author aleixo, cristiano
   * @version 0.1 - 17/04/2007
         * @param exercicioExeInicial
         * @param exercicioExeFinal
         * @param iettr
         * @param aref
   * @return double
   */
  public double getRealizadoExercicioByIettrAndExe (ExercicioExe exercicioExeInicial, ExercicioExe exercicioExeFinal, ItemEstrtIndResulIettr iettr, AcompReferenciaAref aref){

    StringBuilder select = new StringBuilder();
   
    select.append("select sum(ARF.qtdRealizadaArf) from AcompRealFisicoArf as ARF");
    select.append(" where ARF.itemEstrtIndResulIettr.codIettir = :iettir");
    select.append(" and (ARF.anoArf > :anoInicial or (ARF.anoArf = :anoInicial and ARF.mesArf >= :mesInicial))");
    select.append(" and (ARF.anoArf < :anoFinal or (ARF.anoArf = :anoFinal and ARF.mesArf <= :mesFinal))");
   
    long anoInicial = Data.getAno(exercicioExeInicial.getDataInicialExe());
    long anoFinal = Data.getAno(exercicioExeFinal.getDataFinalExe());
    long mesInicial = Data.getMes(exercicioExeInicial.getDataInicialExe()) + 1;
    long mesFinal = Data.getMes(exercicioExeFinal.getDataFinalExe()) + 1;

    /*
     * Se aref != null:
     *   Se exercicio = exercicio do aref, somar at� mes/ano do aref.
     *   Se exercicio > exercicio do aref, n�o somar.
     *   Se exercicio < exercicio do aref, continua como est�.
     */
    if(aref != null){
      if(exercicioExeInicial.equals(aref.getExercicioExe())){
        //Mesmo exerc�cio
        mesInicial = Data.getMes(aref.getExercicioExe().getDataInicialExe()) + 1;
        anoInicial = Data.getAno(aref.getExercicioExe().getDataInicialExe());
        mesFinal = Long.parseLong(aref.getMesAref());
        anoFinal = Long.parseLong(aref.getAnoAref());
      }
      else if(exercicioExeInicial.getDataInicialExe().after(aref.getExercicioExe().getDataFinalExe())){
        //exercicio come�a depois do exerc�cio do aref
        return 0; //FIXME: Verificar se o retorno � zero ou vazio.
      }
    }
   
   
    Query q = this.session.createQuery(select.toString());
   
    q.setLong("iettir", iettr.getCodIettir().longValue());
    q.setLong("anoInicial", anoInicial);
    q.setLong("mesInicial", mesInicial);
    q.setLong("anoFinal", anoFinal);
    q.setLong("mesFinal", mesFinal);
   
    q.setMaxResults(1);
   
    Double retorno = (Double) q.uniqueResult();
   
    if(retorno != null)
      return retorno.doubleValue();

    return 0;
  }
 
  /**
   * Retorna uma lista de realizado de um indicador (ARF) entre um exerc�cio inicial e final.
   *
   * @author aleixo
   * @version 0.1 - 17/04/2007
         * @param exercicioExeInicial
         * @param exercicioExeFinal
         * @param iettr
         * @param aref
         * @return List
   */
  public List getListaRealizadoExercicioByIettrAndExe (ExercicioExe exercicioExeInicial, ExercicioExe exercicioExeFinal, ItemEstrtIndResulIettr iettr, AcompReferenciaAref aref){

    StringBuilder select = new StringBuilder();
   
    select.append("select ARF.qtdRealizadaArf from AcompRealFisicoArf as ARF");
    select.append(" where ARF.itemEstrtIndResulIettr.codIettir = :iettir");
    select.append(" and (ARF.anoArf > :anoInicial or (ARF.anoArf = :anoInicial and ARF.mesArf >= :mesInicial))");
    select.append(" and (ARF.anoArf < :anoFinal or (ARF.anoArf = :anoFinal and ARF.mesArf <= :mesFinal))");
    select.append(" order by ARF.anoArf desc, ARF.mesArf desc");
   
    long anoInicial = Data.getAno(exercicioExeInicial.getDataInicialExe());
    long anoFinal = Data.getAno(exercicioExeFinal.getDataFinalExe());
    long mesInicial = Data.getMes(exercicioExeInicial.getDataInicialExe()) + 1;
    long mesFinal = Data.getMes(exercicioExeFinal.getDataFinalExe()) + 1;

   
    /*
     * Se aref != null:
     *   Se exercicio = exercicio do aref, somar at� mes/ano do aref.
     *   Se exercicio > exercicio do aref, n�o somar.
     *   Se exercicio < exercicio do aref, continua como est�.
     */
    if(aref != null){
      if(exercicioExeInicial.equals(aref.getExercicioExe())){
        //Mesmo exerc�cio
        mesInicial = Data.getMes(aref.getExercicioExe().getDataInicialExe()) + 1;
        anoInicial = Data.getAno(aref.getExercicioExe().getDataInicialExe());
        mesFinal = Long.parseLong(aref.getMesAref());
        anoFinal = Long.parseLong(aref.getAnoAref());
      }
      else if(exercicioExeInicial.getDataInicialExe().after(aref.getExercicioExe().getDataFinalExe())){
        //exercicio come�a depois do exerc�cio do aref
        return new ArrayList();
      }
    }   
   
    Query q = this.session.createQuery(select.toString());
   
    q.setLong("iettir", iettr.getCodIettir().longValue());
    q.setLong("anoInicial", anoInicial);
    q.setLong("mesInicial", mesInicial);
    q.setLong("anoFinal", anoFinal);
    q.setLong("mesFinal", mesFinal);
   
    return q.list();
  }

  /**
   * Retorna a quantidade realizada de um indicador de resultado em um exerc�cio at� um determinado m�s/ano
   * @param exercicio
   * @param indResul
   * @param mes
   * @param ano
   * @return
   * @throws ECARException
   */
  /*
   * Comentado por Claudismar: M�todo n�o utilizado mais. (19/04/2007)
   * 
  public double getQtdRealizadaExercicio (ExercicioExe exercicio, ItemEstrtIndResulIettr indResul, int mes, int ano) throws ECARException{
    try{
      double total = 0;
      List meses = new ExercicioDao(request).getMesesDentroDoExercicio(exercicio, mes, ano);
     
      StringBuilder query = new StringBuilder("select sum(ARF.qtdRealizadaArf) from AcompRealFisicoArf as ARF")
              .append(" where ARF.itemEstrtIndResulIettr.codIettir = :iettir")
              .append(" and ARF.mesArf = :mes")
              .append(" and ARF.anoArf = :ano");
       
      Query q = this.getSession().createQuery(query.toString());
      q.setLong("iettir", indResul.getCodIettir().longValue());
             
      Iterator itMeses = meses.iterator();
      while(itMeses.hasNext()){
        String chave = itMeses.next().toString();
        String strMes = chave.split("-")[0];
        if(strMes.length() == 1) {
          strMes = "0" + strMes;
        }
        String strAno = chave.split("-")[1];
        q.setLong("mes", Long.parseLong(strMes));
        q.setLong("ano", Long.parseLong(strAno));
        q.setMaxResults(1);

        Double resultado = (Double)q.uniqueResult();
        if(resultado != null) {
          total += resultado.doubleValue();
        }
      }
     
      /*
       * FIXME: VERIFICAR ISSO!
      StringBuilder query = new StringBuilder("select sum(ARF.qtdRealizadaArf) from AcompRealFisicoArf as ARF")
      .append(" where ARF.itemEstrtIndResulIettr.codIettir = :iettir")
      .append(" and (ARF.anoArf < :ano or (ARF.anoArf = :ano and ARF.mesArf <= :mes))");

      Query q = this.getSession().createQuery(query.toString());
      q.setLong("iettir", indResul.getCodIettir().longValue());
     
      q.setLong("mes", mes);
      q.setLong("ano", ano);
     
      q.setMaxResults(1);
      total = ((Double)q.uniqueResult()).doubleValue();
      */
    /*  return total;
    } catch(HibernateException e) {
      this.logger.error(e);
      throw new ECARException(e);
    }
   
  }
  */
 
  /**
   * Retorna a quantidade realizada de um indicador de resultado em um exerc�cio at� um determinado m�s/ano
   * @param indResul
   * @param mes
   * @param ano
   * @return
   * @throws ECARException
   */
  public Double getQtdRealizadaMesAno (ItemEstrtIndResulIettr indResul, Long mes, Long ano) throws ECARException{
    try{
      StringBuilder baseQuery = new StringBuilder("select sum(arf.qtdRealizadaArf) from AcompRealFisicoArf as arf")
              .append(" where arf.itemEstrtIndResulIettr.codIettir = ?")
              .append(" and arf.anoArf=? and arf.mesArf=?");
     
      Query q = session.createQuery(baseQuery.toString());
      q.setLong(0, indResul.getCodIettir().longValue());
      q.setLong(1, ano.longValue());
      q.setLong(2, mes.longValue());
      q.setMaxResults(1);

      Double valor = ((Double) q.uniqueResult());
     
      if(valor != null)
        return valor;
      else
        return null;
     
    } catch(HibernateException e){
      this.logger.error(e);
      throw new ECARException(e);
    }
   
  }
 
  /**
   * Retorna um Map com a quantidade realizada de um indicador de resultado em cada m�s dentro de um exerc�cio
   * As chaves do Map s�o no formatdo "mes-ano" ex: 01/2005 12/2004
   * @param exercicio
   * @param indResul
   * @return
   * @throws ECARException
   */
  public Map getQtdRealizadaExercicioPorMes (ExercicioExe exercicio, ItemEstrtIndResulIettr indResul) throws ECARException{
    try{
     
      //FIXME: Rever este caso
     
      Map mapaMeses = new HashMap();
     
      List meses = new ExercicioDao(request).getMesesDentroDoExercicio(exercicio);

      Iterator itMeses = meses.iterator();
      while(itMeses.hasNext()){
        String chave = itMeses.next().toString();
        String mes = chave.split("-")[0];
        if(mes.length() == 1)
          mes = "0" + mes;       
        String ano = chave.split("-")[1];
       
        mapaMeses.put(chave, this.getQtdRealizadaMesAno(indResul, Long.valueOf(mes), Long.valueOf(ano)));
       
      }
       
      return mapaMeses;
    } catch(HibernateException e){
      this.logger.error(e);
      throw new ECARException(e);
    }
   
  }
   
        /**
         *
         * @param acompReferenciaItem
         * @param itemMonitorado
         * @param indicador
         * @return
         * @throws ECARException
         */
        public AcompRealFisicoArf criaNovoAcompRealFisico(AcompReferenciaItemAri acompReferenciaItem,
      ItemEstruturaIett itemMonitorado, ItemEstrtIndResulIettr indicador) throws ECARException {
   
    // verificar a exist�ncia do ARF
        AcompRealFisicoArf acompRealFisico = this.buscarPorIettir(
            Long.valueOf(acompReferenciaItem.getAcompReferenciaAref().getMesAref()),
            Long.valueOf(acompReferenciaItem.getAcompReferenciaAref().getAnoAref()),
            indicador.getCodIettir());
       
        if(acompRealFisico == null) {
          acompRealFisico = new AcompRealFisicoArf();

          acompRealFisico.setItemEstrtIndResulIettr(indicador);
            acompRealFisico.setDataInclusaoArf(Data.getDataAtual());
            acompRealFisico.setItemEstruturaIett(itemMonitorado);
            acompRealFisico.setMesArf(Long.valueOf(acompReferenciaItem.getAcompReferenciaAref().getMesAref()));
            acompRealFisico.setAnoArf(Long.valueOf(acompReferenciaItem.getAcompReferenciaAref().getAnoAref()));
        }
       
        return acompRealFisico;
   
  }
 
  /**
     * Devolve uma lista de todos os AcompRealFisico de um item referente
     * � um AcompanhamentoReferenciaItem e � situa��o.
     *
     * Situa��o:
     *   -> N�o Conclu�dos (Alterar para DEFAULT, atualmente � o Todos):
     *     - Mostrar ARFs com situa��o que N�O represente conclus�o
     *     - Mostrar ARFs com situa��o que represente conclus�o e M�s/Ano ARF maior igual M�s/Ano do acompanhamento (AREF)
     *   -> Todos:
     *     - Mostrar todos os ARFs, considerando:
     *     - ARFs com situa��o que representa conclus�o e M�s/Ano ARF menor que o M�s/Ano do acompanhamento (AREF)
     *     - Demais ARFs
     *   -> Conclu�dos:
     *     - Mostrar ARFs com situa��o que representa conclus�o e M�s/Ano do ARF menor e igual ao M�s/Ano do acompanhamento (AREF)
     *
     * AcompRealFisico � formada pela chave contendo IndResultado, AcompReferenciaItem e Item
     * 
     * @param acompRefItem
     * @param indSituacao (Dominios.TODOS, Dominios.CONLUIDOS, Dominios.NAO_CONCLUIDOS)
     * @param noMes (se true, s� considera o mes do acompRefItem)
     * @return lista (AcompRealFisico)
         * @throws Exception
         * @throws HibernateException
     */
    public List getIndResulByAcompRefItemBySituacao (AcompReferenciaItemAri acompRefItem, String indSituacao, boolean noMes) throws Exception{
      List lista = new ArrayList();
     
      StringBuilder query = new StringBuilder();
     
      query.append("select acompRF from AcompRealFisicoArf as acompRF");
      query.append(" where acompRF.itemEstruturaIett.codIett = :codIett");
      query.append(" and acompRF.itemEstruturaIett.indAtivoIett = 'S'");
      //Mantis-POA: caso 0010021
    //Adicionado para n�o listar no acompanhamento os indicadores exclu�dos no cadastro
      query.append(" and acompRF.itemEstrtIndResulIettr.indAtivoIettr = 'S'");

     
      if(Dominios.CONCLUIDOS.equals(indSituacao)){
       
        /* Conclu�dos:
         * Mostrar ARF's com situa��o que representa conclus�o.
         */
       
        query.append(" and (acompRF.situacaoSit.indConcluidoSit = :indConcluido) ");
      }

      /*
       *  Selecionar sempre itens com m�s/ano do ARF menor e igual ao m�s/ano do AREF (Acompanhamento)
       */
    query.append(" and (acompRF.anoArf < :ano or (acompRF.anoArf = :ano and ");
    if(noMes)
      query.append(" acompRF.mesArf = :mes))");
    else
      query.append(" acompRF.mesArf <= :mes))");
     
      query.append(" order by acompRF.itemEstrtIndResulIettr.nomeIettir asc, acompRF.anoArf desc, acompRF.mesArf desc ");

      Query q = this.session.createQuery(query.toString());
     
      q.setLong("codIett", acompRefItem.getItemEstruturaIett().getCodIett().longValue());
     
      if(Dominios.CONCLUIDOS.equals(indSituacao)){
        q.setString("indConcluido", "S");
      }
     
    q.setLong("ano", Long.valueOf(acompRefItem.getAcompReferenciaAref().getAnoAref()).longValue());
    q.setLong("mes", Long.valueOf(acompRefItem.getAcompReferenciaAref().getMesAref()).longValue());
     
      lista = q.list();
     
      if(lista == null){
        return new ArrayList();
      }
     
    /*Tirando os repetidos... */
    /*
     * Como os ARF's v�m ordenados do �ltimo informado menor ou igual ao mes/ano do AREF,
     * s� deixo o primeiro ARF de cada indicador.
     */
    String codIettr = "";
    for(Iterator it = lista.iterator(); it.hasNext();){
      AcompRealFisicoArf arf = (AcompRealFisicoArf) it.next();
     
      if(codIettr.equals(arf.getItemEstrtIndResulIettr().getCodIettir().toString())){
        it.remove();
      }
      else{
        codIettr = arf.getItemEstrtIndResulIettr().getCodIettir().toString();
      }
    }
   
      //Remover os ARFs quando for N�o Conclu�do (Devido ao problema do "situacao_sit is null" n�o funcionar no Hibernate3 )
      if(Dominios.NAO_CONCLUIDOS.equalsIgnoreCase(indSituacao)){
          /*
        Aplicar nova regra, conforme mantis 7795:
      1) N�o Conclu�dos (Alterar para DEFAULT, atualmente � o Todos) :
     
        Apresentar indicadores que n�o representem conclus�o at� mes/ano do AREF.
     
             *** Apresentar todos os dados habilitados para altera��o no m�s/ano ***
           */
         for(Iterator it = lista.iterator(); it.hasNext();){
           AcompRealFisicoArf arf = (AcompRealFisicoArf)it.next();

           //Se representa conclus�o
           if(arf.getSituacaoSit() != null && "S".equals(arf.getSituacaoSit().getIndConcluidoSit())){
          int mesArf = arf.getMesArf().intValue();
          int anoArf = arf.getAnoArf().intValue();
          int mesAref = Integer.valueOf(acompRefItem.getAcompReferenciaAref().getMesAref()).intValue();
          int anoAref = Integer.valueOf(acompRefItem.getAcompReferenciaAref().getAnoAref()).intValue();
           
          //Se n�o � o mesmo mes/ano do acompanhamento
          if(!(mesAref == mesArf && anoAref == anoArf)){
            //Remove da lista
            it.remove();
          }
           }
          
         }
        
        
      }

     
      ConfiguracaoCfg configuracao = new ConfiguracaoDao(request).getConfiguracao();
     
     
      if(configuracao.getSisGrupoAtributoSgaByCodSgaGrAtrMetasFisicas() != null){
        //Obter os sisAtributos de grupos de metas f�sicas configurados
      Set sisAtributosSatbs = acompRefItem.getAcompReferenciaAref().getTipoAcompanhamentoTa().getSisAtributoSatbs();
      List listAtributosConfig = new ArrayList();
      if(sisAtributosSatbs != null){
        Iterator itSatbs = sisAtributosSatbs.iterator();
        while(itSatbs.hasNext()) {
          SisAtributoSatb sisAtributoSatb = (SisAtributoSatb) itSatbs.next();
          if(sisAtributoSatb.getSisGrupoAtributoSga().equals(configuracao.getSisGrupoAtributoSgaByCodSgaGrAtrMetasFisicas())){
            listAtributosConfig.add(sisAtributoSatb);
          }
        }
      }
     
      //Se n�o h� "tipos de indicadores" configurados, limpa a lista de retorno
      if (sisAtributosSatbs.isEmpty()){
        lista.clear();
        return lista;
      }
     
      //remover os indicadores que n�o perten�am � cole��o de atributos identificadas acima 
      if(!listAtributosConfig.isEmpty()){
       
        Iterator it = lista.iterator();
           while(it.hasNext()) {
             AcompRealFisicoArf arf = (AcompRealFisicoArf)it.next();
             
             if(arf.getItemEstrtIndResulIettr().getSisAtributoSatb() != null && !listAtributosConfig.contains(arf.getItemEstrtIndResulIettr().getSisAtributoSatb())) {
               it.remove();
             }
           }
      }

      //Ordenando pelo atributo da configura��o
      //Para trazer agrupado na tela.
      Collections.sort(lista, new Comparator(){
        public int compare(Object arg0, Object arg1) {
         
          AcompRealFisicoArf arf1 = (AcompRealFisicoArf) arg0;
          AcompRealFisicoArf arf2 = (AcompRealFisicoArf) arg1;
         
          if(arf1.getItemEstrtIndResulIettr().getSisAtributoSatb() == null && arf2.getItemEstrtIndResulIettr().getSisAtributoSatb() == null){
            return 0;
          }
          else if(arf1.getItemEstrtIndResulIettr().getSisAtributoSatb() != null && arf2.getItemEstrtIndResulIettr().getSisAtributoSatb() == null){
            return 1;
          }
          else if(arf1.getItemEstrtIndResulIettr().getSisAtributoSatb() == null && arf2.getItemEstrtIndResulIettr().getSisAtributoSatb() != null){
            return -1;
          }
         
          return arf1.getItemEstrtIndResulIettr().getSisAtributoSatb().getDescricaoSatb().compareTo(arf2.getItemEstrtIndResulIettr().getSisAtributoSatb().getDescricaoSatb());
        }
      });
     
      }
     
      return lista;
    }

    /**
     * Verifica se � para habilitar ou n�o a edi��o de ARFs na elabora��o de acompanhamento.
     *
     * @author aleixo
     * @since 07/06/2007
     * @param arf
     * @param mesReferencia
     * @param indSituacao
     * @return
     */
    public boolean habilitarEdicaoArf(AcompRealFisicoArf arf, AcompReferenciaAref mesReferencia, String indSituacao){
      /*
    Aplicar nova regra, conforme mantis 7795:
    */
      if(Dominios.NAO_CONCLUIDOS.equals(indSituacao)){
        /*
      1) N�o Conclu�dos ):
        - Apresentar todos os dados habilitados para altera��o no m�s/ano ***
         */
      int mesArf = arf.getMesArf().intValue();
      int anoArf = arf.getAnoArf().intValue();
      int mesAref = Integer.valueOf(mesReferencia.getMesAref()).intValue();
      int anoAref = Integer.valueOf(mesReferencia.getAnoAref()).intValue();
     
      return (mesArf == mesAref && anoArf == anoAref);
      }
      else if (Dominios.CONCLUIDOS.equals(indSituacao)){
        /*
      1) Conclu�dos ):
        - Apresentar o dado habilitado para altera��o no m�s/ano ***
         */
      int mesArf = arf.getMesArf().intValue();
      int anoArf = arf.getAnoArf().intValue();
      int mesAref = Integer.valueOf(mesReferencia.getMesAref()).intValue();
      int anoAref = Integer.valueOf(mesReferencia.getAnoAref()).intValue();
     
      return (mesArf == mesAref && anoArf == anoAref);
      }
      else{
        /*
      2) Todos:
      - ARFs com situa��o que representa conclus�o e M�s/Ano ARF menor que o M�s/Ano do acompanhamento (AREF)
      *** Apresentar todos os dados desabilitados para altera��o ***
      - Demais ARFs
      *** Apresentar todos os dados habilitados para altera��o ***
         */
      int mesArf = arf.getMesArf().intValue();
      int anoArf = arf.getAnoArf().intValue();
      int mesAref = Integer.valueOf(mesReferencia.getMesAref()).intValue();
      int anoAref = Integer.valueOf(mesReferencia.getAnoAref()).intValue();
     
        if(arf.getSituacaoSit() != null && "S".equals(arf.getSituacaoSit().getIndConcluidoSit())
          && (anoArf < anoAref || (anoArf == anoAref && mesArf < mesAref))){
        return false;
        }
        else {
          return true;
        }
      }
    }
   
    /**
     *
     * @param request
     * @throws ECARException
     */
    public void incAcompRealFisicoArf(HttpServletRequest request) throws ECARException {
    Transaction tx = null;

    try {
      super.inicializarLogBean();
      tx = session.beginTransaction();
     
      long codAri;
     
      //Ajuste para setar o codAri com o valor correto
      //Estava pegando o ari do pai ao inserir uma m�trica nova no filho
      if (Pagina.getParamStr(request, "codAriFilho") == "")
         codAri = Long.valueOf(Pagina.getParamStr(request, "codAri"));
       else
        codAri = Long.valueOf(Pagina.getParamStr(request, "codAriFilho"));  
     
      AcompReferenciaItemAri acompRefItem = (AcompReferenciaItemAri) buscar(AcompReferenciaItemAri.class, codAri);
      ItemEstrtIndResulIettr indResul = (ItemEstrtIndResulIettr) buscar(ItemEstrtIndResulIettr.class, Long.valueOf(Pagina.getParamStr(request, "codNovoIndicador")));
     
      AcompRealFisicoArf acompRealFisico = this.criaNovoAcompRealFisico(acompRefItem, acompRefItem.getItemEstruturaIett(), indResul);

      session.save(acompRealFisico);
     
      tx.commit();

      if(super.logBean != null) {
        super.logBean.setCodigoTransacao(Data.getHoraAtual(false));
        super.logBean.setObj(acompRealFisico);
        super.logBean.setOperacao("INC");
        super.loggerAuditoria.info(logBean.toString());
      }
    } catch (HibernateException e) {
      if (tx != null)
        try {
          tx.rollback();
        } catch (HibernateException r) {
          this.logger.error(r);
          throw new ECARException("erro.hibernateException");
        }
      this.logger.error(e);
      throw new ECARException("erro.hibernateException");
    }

    }

    /**
   * Retorna a quantidade de registros de indicadores de resultado em um per�odo
   * @param iettr
   * @param iett
   * @param mes
   * @param ano
   * @return int
   * @throws ECARException
   */
  public int getQtdRegistrosRealizadoPeriodo (ItemEstrtIndResulIettr iettr, ItemEstruturaIett iett, Long mes, Long ano) throws ECARException{
    try{
      int resultado = 0;
     
      StringBuilder baseQuery = new StringBuilder("select arf.qtdRealizadaArf from AcompRealFisicoArf as arf")
                  .append(" where arf.itemEstrtIndResulIettr.codIettir = ?")
                  .append(" and arf.itemEstruturaIett.codIett = ?")
                  .append(" and arf.itemEstruturaIett.indAtivoIett = 'S'")
                  .append(" and arf.qtdRealizadaArf > 0 ")
                  .append(" and (arf.anoArf < ?")
                  .append("     or (arf.anoArf = ?")
                  .append("      and arf.mesArf <= ?)")
                  .append("    )");
     
      Query q = session.createQuery(baseQuery.toString());
      q.setLong(0, iettr.getCodIettir().longValue());
      q.setLong(1, iett.getCodIett().longValue());
      q.setLong(2, ano.longValue());
      q.setLong(3, ano.longValue());
      q.setLong(4, mes.longValue());

            List retorno = q.list();
            if(!retorno.isEmpty()) {
              resultado = retorno.size();
            }

            return resultado;
     
    } catch(HibernateException e){
      this.logger.error(e);
      throw new ECARException(e);
    }
   
  }
   
   
    /**
     * Verificar se � permitido excluir um ARF, verificando se n�o est� em uso por algum ARI, desconsiderando o ARI fornecido.
     *
     * @param arf
     * @param ari AcompReferenciaItemAri
     *
     * @return boolean (True = Exclus�o permitida - False = N�o permitida)
     * @throws ECARException
     */
    public boolean verificarPermissaoExclusao(AcompRealFisicoArf arf, AcompReferenciaItemAri ari) throws ECARException {
      try {
      StringBuilder query = new StringBuilder("select ARI from AcompReferenciaItemAri as ARI")
                .append(" where ARI.itemEstruturaIett.codIett = :codIett")
                .append(" and ARI.itemEstruturaIett.indAtivoIett = 'S'")
                .append(" and ARI.acompReferenciaAref.mesAref = :mesAref")
                .append(" and ARI.acompReferenciaAref.anoAref = :anoAref")
                .append(" and ARI.codAri <> :codAri");
     
      Query q = this.getSession().createQuery(query.toString());
     
      q.setLong("codIett", arf.getItemEstruturaIett().getCodIett().longValue());
      q.setString("mesAref", arf.getMesArf().toString());
      q.setString("anoAref", arf.getAnoArf().toString());
      q.setLong("codAri", ari.getCodAri().longValue());
     
      List listaARI = q.list();
     
      if(listaARI != null) {
        if(listaARI.size() > 0) {
          // ARF utilizado para mais de um ARI
          return false;
        }
        else {
          return true;
        }
      }
      return true;
      }
      catch(Exception e) {
        this.logger.error(e);
      throw new ECARException(e);
      }
    }
 
 
  /**
   * Obtem o mes/ano mais recente que foi registrado acompanhamento para um item 
         * @param iett
   * @return AcompRealFisicoArf
   * @throws ECARException
   */
  public AcompRealFisicoArf getArfMaisRecenteItem(ItemEstruturaIett iett) throws ECARException{
    try{
      StringBuilder query = new StringBuilder("select ARF from AcompRealFisicoArf as ARF")
                  .append(" where ARF.itemEstruturaIett.codIett = ?")
                  .append(" and ARF.itemEstruturaIett.indAtivoIett = 'S'")
                  .append(" order by ARF.anoArf desc, ARF.mesArf desc");

      Query q = this.getSession().createQuery(query.toString());
      q.setLong(0, iett.getCodIett().longValue());
      q.setMaxResults(1);
     
      return (AcompRealFisicoArf) q.uniqueResult();
    } catch(HibernateException e){
      this.logger.error(e);
      throw new ECARException(e);
    }
  }
 
 
  /**
   * Obtem o mes/ano mais antigo que foi registrado acompanhamento para um item 
         * @param iett
   * @return AcompRealFisicoArf
   * @throws ECARException
   */
  public AcompRealFisicoArf getArfMaisAntigoItem(ItemEstruturaIett iett) throws ECARException{
    try{
      StringBuilder query = new StringBuilder("select ARF from AcompRealFisicoArf as ARF")
                .append(" where ARF.itemEstruturaIett.codIett = ?")
                .append(" and ARF.itemEstruturaIett.indAtivoIett = 'S'")
                .append(" order by ARF.anoArf, ARF.mesArf");

      Query q = this.getSession().createQuery(query.toString());
      q.setLong(0, iett.getCodIett().longValue());
      q.setMaxResults(1);
     
      return (AcompRealFisicoArf) q.uniqueResult();
    } catch(HibernateException e){
      this.logger.error(e);
      throw new ECARException(e);
    }
  }
 
  /**
   * Busca uma lista de Realizado F�sico a partir de um item pai com filtros definidos em um Tipo de Acompanhamento.<br>
   * Retorna uma lista de bean que contem o item e uma lista de arfs do item (inclusive o item pai).
   *
   * @author aleixo
   * @since 0.2 - 07/05/2007; 0.1 - 04/05/2007
         * @param item
         * @param tipoAcomp
         * @param filtroNiveis
         * @param mesArf
         * @param anoArf
         * @param configuracao
   * @return List - Lista de Realizado F�sico (ARF's).
   * @throws ECARException
   */
  public List getArfsByIettAndTipoAcomp(ItemEstruturaIett item, TipoAcompanhamentoTa tipoAcomp, ConfiguracaoCfg configuracao, List filtroNiveis, Long mesArf, Long anoArf) throws ECARException{
   
    List retorno = new ArrayList();
    if(item != null && tipoAcomp != null){
      ItemEstruturaDao itemEstruturaDao = new ItemEstruturaDao(this.request);
      /*
        - Inclui Monitorado
        - Inclui N�o Monitorado
       */
      String indMonitoramento = "";
       
        if("S".equals(tipoAcomp.getIndMonitoramentoTa()) && "N".equals(tipoAcomp.getIndNaoMonitoramentoTa())) {
          indMonitoramento = "S";
        }
        else if("N".equals(tipoAcomp.getIndMonitoramentoTa()) && "S".equals(tipoAcomp.getIndNaoMonitoramentoTa())) {
          indMonitoramento = "N";
        }     
     
       
        List niveis = new ArrayList();
        List grupoMetaFisica = new ArrayList();
       
        if(tipoAcomp.getSisAtributoSatbs() != null && !tipoAcomp.getSisAtributoSatbs().isEmpty()){
          Iterator itSatb = tipoAcomp.getSisAtributoSatbs().iterator();
          while(itSatb.hasNext()){
            SisAtributoSatb satb = (SisAtributoSatb) itSatb.next();
            /*
            - N�vel do Planejamento
            */
            if(configuracao.getSisGrupoAtributoSgaByCodSgaGrAtrNvPlan() != null && configuracao.getSisGrupoAtributoSgaByCodSgaGrAtrNvPlan().equals(satb.getSisGrupoAtributoSga())){
              niveis.add(satb.getCodSatb());
            }
           
            /*
          - Grupo de Meta F�sica
            */
            if(configuracao.getSisGrupoAtributoSgaByCodSgaGrAtrMetasFisicas() != null && configuracao.getSisGrupoAtributoSgaByCodSgaGrAtrMetasFisicas().equals(satb.getSisGrupoAtributoSga())){
              grupoMetaFisica.add(satb.getCodSatb());
            }
          }
         
         
        }
       
        //List itensFilhos = itemEstruturaDao.getDescendentes(item, true);
        List itens = new ArrayList();
        itens.add(item);
       
        if(filtroNiveis != null && !filtroNiveis.isEmpty())
          itens.addAll(itemEstruturaDao.getDescendentesPorNivelPlanejamento(item, filtroNiveis));
        else
          itens.addAll(itemEstruturaDao.getDescendentes(item, true));
       
        if(itens != null && !itens.isEmpty()){
         
          Iterator it = itens.iterator();
          while(it.hasNext()){
           
            ItemEstruturaIett iett = (ItemEstruturaIett) it.next();
         
            StringBuilder select = new StringBuilder();
            select.append("select arf from AcompRealFisicoArf arf");
            select.append(" where arf.itemEstruturaIett.codIett = :codIett");
            select.append(" and arf.itemEstruturaIett.indAtivoIett = 'S'");
           
            if(mesArf != null){
              select.append(" and arf.mesArf = :mesArf");
            }
            if(anoArf != null){
              select.append(" and arf.anoArf = :anoArf");
            }
            if(!"".equals(indMonitoramento)){
              select.append(" and arf.itemEstruturaIett.indMonitoramentoIett = :indMonitoramento");
            }
            if(!niveis.isEmpty()){
              select.append(" and arf.itemEstruturaIett.itemEstruturaNivelIettns.codSatb in (:niveis)");
            }
            if(!grupoMetaFisica.isEmpty()){
              select.append(" and arf.itemEstrtIndResulIettr.sisAtributoSatb.codSatb in (:grupoMetaFisica)");
            }

            Query q = this.session.createQuery(select.toString());
           
            q.setLong("codIett", iett.getCodIett().longValue());
           
            if(mesArf != null){
              q.setLong("mesArf", mesArf.longValue());
            }
            if(anoArf != null){
              q.setLong("anoArf", anoArf.longValue());
            }
            if(!"".equals(indMonitoramento)){
              q.setString("indMonitoramento", indMonitoramento);
            }
            if(!niveis.isEmpty()){
              q.setParameterList("niveis", niveis);
            }
           
            if(!grupoMetaFisica.isEmpty()){
              q.setParameterList("grupoMetaFisica", grupoMetaFisica);
            }
            
            List arfs = q.list();
            if((item.equals(iett)) || (arfs != null && !arfs.isEmpty())){
              IettArfBean iaBean = new IettArfBean();
              iaBean.setItem(iett);
              iaBean.setArfs(arfs);
             
              retorno.add(iaBean);
            }
          }
        }
    }
    return retorno;
  }
 

  /**
   * Retorna uma lista de realizados f�sicos posteriores ao realizado f�sico passado como par�metro.<br>
   * Caso n�o exista, retorna uma lista vazia.
   *
   * @author aleixo
   * @since 23/07/2007
   * @param arf
   * @return List
   * @throws ECARException
   */
  public List getArfsPosteriores(AcompRealFisicoArf arf) throws ECARException{
    List retorno = new ArrayList();
    try{
      StringBuilder s = new StringBuilder();
     
      s.append("select arf from AcompRealFisicoArf arf");
      s.append(" where arf.itemEstruturaIett.codIett = :item");
      s.append(" and arf.itemEstruturaIett.indAtivoIett = 'S'");
      s.append("   and arf.itemEstrtIndResulIettr.codIettir = :indicador");
      s.append("   and (arf.anoArf > :ano or (arf.anoArf = :ano and arf.mesArf > :mes))");
     
      Query q = this.session.createQuery(s.toString());
     
      q.setLong("item", arf.getItemEstruturaIett().getCodIett().longValue());
      q.setLong("indicador", arf.getItemEstrtIndResulIettr().getCodIettir().longValue());
      q.setLong("ano", arf.getAnoArf().longValue());
      q.setLong("mes", arf.getMesArf().longValue());
     
      List arfs = q.list();
     
      retorno = (arfs != null && !arfs.isEmpty()) ? arfs : new ArrayList();
    }
    catch (HibernateException e) {
      this.logger.error(e);
      throw new ECARException(e);
    }
   
    return retorno;
  }
 
  /**
   * Retorna o Realizado F�sico do indicador informado, anterior ao m�s/ano informado.
   *
   * @author aleixo
   * @since 23/07/2007
   * @param indicador
   * @param mes
   * @param ano
   * @return
   * @throws ECARException
   */
  public AcompRealFisicoArf getArfAnterior(ItemEstrtIndResulIettr indicador, long mes, long ano) throws ECARException{
    try{
      StringBuilder s = new StringBuilder();
     
      s.append("select arf from AcompRealFisicoArf arf");
      s.append(" where arf.itemEstruturaIett.codIett = :item");
      s.append(" and arf.itemEstruturaIett.indAtivoIett = 'S'");
      s.append("   and arf.itemEstrtIndResulIettr.codIettir = :indicador");
      s.append("   and (arf.anoArf < :ano or (arf.anoArf = :ano and arf.mesArf < :mes))");
      s.append(" order by arf.anoArf desc, arf.mesArf desc");
     
      Query q = this.session.createQuery(s.toString());
     
      q.setLong("item", indicador.getItemEstruturaIett().getCodIett().longValue());
      q.setLong("indicador", indicador.getCodIettir().longValue());
      q.setLong("ano", ano);
      q.setLong("mes", mes);
     
      q.setMaxResults(1);
     
      Object o = q.uniqueResult();
     
      return (o != null) ? (AcompRealFisicoArf) o : null;
    }
    catch (HibernateException e) {
      this.logger.error(e);
      throw new ECARException(e);
    }
  }
 
  /**
   *  Retorna a soma do realizado de um indicador (ARF) de um exerc�cio at� o m�s de refer�ncia passado como par�metro.
   * 
   * @param indicador
   * @param exercicio
   * @param anoRef
   * @param mesRef
   * @return A soma dos valores realizados para um indicador
   * @throws ECARException
   */
  public double getQtdIndicadorGrupoRealizadaExercicio(ItemEstrtIndResulIettr indicador, ExercicioExe exercicio, long anoRef, long mesRef) throws ECARException{
    try{
      StringBuilder s = new StringBuilder();
     
      s.append("select sum(ARF.qtdRealizadaArf) from AcompRealFisicoArf as ARF");     
      s.append("  where ARF.itemEstruturaIett.codIett = :item");
      s.append("    and ARF.itemEstruturaIett.indAtivoIett = 'S'");
      s.append("    and ARF.itemEstrtIndResulIettr.codIettir = :indicador");
      s.append("    and ARF.anoArf = :anoArf");
     
      //Limita a consulta at� o m�s de refer�ncia informado.
      if(Long.valueOf(exercicio.getDescricaoExe()).equals(anoRef)){
        s.append("    and ARF.mesArf <= :mesFinal");
      }
     
      Query q = this.session.createQuery(s.toString());
     
      q.setString("anoArf",exercicio.getDescricaoExe());
      q.setLong("item", indicador.getItemEstruturaIett().getCodIett().longValue());
      q.setLong("indicador", indicador.getCodIettir().longValue());
     
      if(Long.valueOf(exercicio.getDescricaoExe()).equals(anoRef)){
        q.setLong("mesFinal", mesRef);
      }
     
      q.setMaxResults(1);
     
      Double retorno = (Double) q.uniqueResult();
     
      if(retorno != null)
        return retorno.doubleValue();

      return 0;
    }
    catch (HibernateException e) {
      this.logger.error(e);
      throw new ECARException(e);
    }
  }
 
  /**
   * Retorna a quantidade Realizada de um indicador de resultado em um exerc�cio (at� o m�s de refer�ncia passado).
   * Utilizado para recuperar a quantidade realizada de um indicador n�o acumul�vel em um exerc�cio, podendo ser o "�ltimo Valor" ou o "Maior Valor",
   * de acordo com o que foi setado na configura��o da Meta/Indicador.
   *
   * @param indicador
   * @param exercicio
   * @param anoRef
   * @param mesRef
   * @return A quantidade realizada do indicador
   * @throws ECARException
   */
  public double getQtdIndicadorGrupoRealizadaExercicioNaoAcumulavel (ItemEstrtIndResulIettr indicador, ExercicioExe exercicio, long anoRef, long mesRef) throws ECARException{
    try{
     
      StringBuilder s = new StringBuilder();
     
      s.append("select ARF.qtdRealizadaArf from AcompRealFisicoArf as ARF");
      s.append("  where ARF.itemEstruturaIett.codIett = :item");
      s.append("    and ARF.itemEstruturaIett.indAtivoIett = 'S'");
      s.append("    and ARF.itemEstrtIndResulIettr.codIettir = :indicador");
      s.append("    and ARF.anoArf = :anoArf");
     
      //Limita a consulta at� o m�s de refer�ncia informado. 
      if(Long.valueOf(exercicio.getDescricaoExe()).equals(anoRef)){
        s.append("    and ARF.mesArf <= :mesFinal");
      }
     
      s.append(" order by ARF.anoArf desc, ARF.mesArf desc");
     
      Query q = this.session.createQuery(s.toString());
     
      q.setLong("item", indicador.getItemEstruturaIett().getCodIett().longValue());
      q.setLong("indicador", indicador.getCodIettir().longValue());
      q.setString("anoArf",exercicio.getDescricaoExe());
      if(Long.valueOf(exercicio.getDescricaoExe()).equals(anoRef)){
        q.setLong("mesFinal", mesRef);
      }
     
      List listaIndicadores = q.list();
     
      /*
       * Utilizando m�todo que valida se � para retornar o maior valor, �ltimo valor, etc...
       */
      Double valor = this.getSomaValoresArfs(indicador, listaIndicadores);
       
      if(valor != null)
        return valor.doubleValue();
      else
        return 0;
    } catch(HibernateException e){
      this.logger.error(e);
      throw new ECARException(e);
    }
   
  }
 
  /**
   * Retorna se tem algum valor realizado informado para o exercicio
   */
  public double getQtdeRealizadoExercicioByIettAndExe (ExercicioExe exercicio, ItemEstruturaIett iett, AcompReferenciaAref aref, String grupoIndicador){

    StringBuilder select = new StringBuilder();
   
    select.append("select sum(ARF.qtdRealizadaArf) from AcompRealFisicoArf as ARF ");
    select.append(" where ARF.itemEstrtIndResulIettr.itemEstruturaIett.codIett = :iett ");
    select.append(" and ARF.itemEstrtIndResulIettr.indAtivoIettr = 'S' ");
    if(!grupoIndicador.equals(""))
      select.append(" and ARF.itemEstrtIndResulIettr.sisAtributoSatb.descricaoSatb = :grupoIndicador ");
    select.append(" and (ARF.anoArf > :anoInicial or (ARF.anoArf = :anoInicial and ARF.mesArf >= :mesInicial)) ");
    select.append(" and (ARF.anoArf < :anoFinal or (ARF.anoArf = :anoFinal and ARF.mesArf <= :mesFinal)) ");
   
    long anoInicial = Data.getAno(exercicio.getDataInicialExe());
    long anoFinal = Data.getAno(exercicio.getDataFinalExe());
    long mesInicial = Data.getMes(exercicio.getDataInicialExe()) + 1;
    long mesFinal = Data.getMes(exercicio.getDataFinalExe()) + 1;

    /*
     * Se aref != null:
     *   Se exercicio = exercicio do aref, somar at� mes/ano do aref.
     *   Se exercicio > exercicio do aref, n�o somar.
     *   Se exercicio < exercicio do aref, continua como est�.
     */
    if(aref != null){
      if(exercicio.equals(aref.getExercicioExe())){
        //Mesmo exerc�cio
        mesInicial = Data.getMes(aref.getExercicioExe().getDataInicialExe()) + 1;
        anoInicial = Data.getAno(aref.getExercicioExe().getDataInicialExe());
        mesFinal = Long.parseLong(aref.getMesAref());
        anoFinal = Long.parseLong(aref.getAnoAref());
      }
      else if(exercicio.getDataInicialExe().after(aref.getExercicioExe().getDataFinalExe())){
        //exercicio come�a depois do exerc�cio do aref
        return 0; //FIXME: Verificar se o retorno � zero ou vazio.
      }
    }
   
   
    Query q = this.session.createQuery(select.toString());
   
    q.setLong("iett", iett.getCodIett().longValue());
    if(!grupoIndicador.equals(""))
      q.setString("grupoIndicador", grupoIndicador);
    q.setLong("anoInicial", anoInicial);
    q.setLong("mesInicial", mesInicial);
    q.setLong("anoFinal", anoFinal);
    q.setLong("mesFinal", mesFinal);
   
    q.setMaxResults(1);
   
    Double retorno = (Double) q.uniqueResult();
   
    if(retorno != null)
      return retorno.doubleValue();

    return 0;
  }
 
  /**
   * Retorna uma lista de realizado de um indicador (ARF) entre um exerc�cio inicial e final.
   *
   * @author aleixo
   * @version 0.1 - 15/06/2010
         * @param exercicioExeInicial
         * @param exercicioExeFinal
         * @param iettr
         * @param aref
         * @return List
   */
  public List ObtemListaRealizadoExercicioByIettrAndExe (ExercicioExe exercicio, ItemEstrtIndResulIettr indResul, AcompReferenciaAref aref) throws ECARException{
    try{
      List valores = this.getListaRealizadoExercicioByIettrAndExe(exercicio, exercicio, indResul, aref);
      return valores;
    } catch(HibernateException e){
      this.logger.error(e);
      throw new ECARException(e);
    }
   
  }
 
 
}
TOP

Related Classes of ecar.dao.AcompRealFisicoDao

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.