@Override
  public void update(final BaseEntity model) throws ServiceException, LogicException {
    final CatalogoServicoDTO catalogoServicoDto = (CatalogoServicoDTO) model;
    final CatalogoServicoDao catalogoServicodao = this.getDao();

    final ServContratoCatalogoServDao servContratoCatalogoServDao =
        new ServContratoCatalogoServDao();
    final InfoCatalogoServicoDao infoCatalogoServicoDao = new InfoCatalogoServicoDao();

    final TransactionControler tc = new TransactionControlerImpl(catalogoServicodao.getAliasDB());

    try {
      this.validaCreate(model);
      catalogoServicodao.setTransactionControler(tc);
      infoCatalogoServicoDao.setTransactionControler(tc);
      servContratoCatalogoServDao.setTransactionControler(tc);

      tc.start();

      catalogoServicodao.update(catalogoServicoDto);
      servContratoCatalogoServDao.deleteByIdServContratoCatalogo(catalogoServicoDto);
      if (catalogoServicoDto.getColServicoContrato() != null
          && !catalogoServicoDto.getColServicoContrato().isEmpty()) {
        ServContratoCatalogoServDTO item = null;
        // varre a lista de serviços
        for (int i = 0; i < catalogoServicoDto.getColServicoContrato().size(); i++) {
          item = catalogoServicoDto.getColServicoContrato().get(i);
          item.setIdCatalogoServico(catalogoServicoDto.getIdCatalogoServico());
          // grava cada item da lista
          servContratoCatalogoServDao.create(item);
        }
      }

      infoCatalogoServicoDao.deleteByIdInfoCatalogo(catalogoServicoDto);
      if (catalogoServicoDto.getColInfoCatalogoServico() != null
          && !catalogoServicoDto.getColInfoCatalogoServico().isEmpty()) {

        InfoCatalogoServicoDTO item = null;
        // varre a lista de serviços
        for (int i = 0; i < catalogoServicoDto.getColInfoCatalogoServico().size(); i++) {
          item = catalogoServicoDto.getColInfoCatalogoServico().get(i);
          item.setIdCatalogoServico(catalogoServicoDto.getIdCatalogoServico());
          // grava cada item da lista
          infoCatalogoServicoDao.create(item);
        }
      }

      tc.commit();

    } catch (final Exception e) {
      e.printStackTrace();
      this.rollbackTransaction(tc, e);
    } finally {
      try {
        tc.close();
      } catch (final Exception e) {
        e.printStackTrace();
      }
    }
  }
  /*
   * (non-Javadoc)
   *
   * @see br.com.citframework.service.CrudServicePojoImpl#create(br.com.citframework.dto.IDto)
   */
  @Override
  public IDto create(IDto model) throws ServiceException, LogicException {

    AvaliacaoFornecedorDao avaliacaoForncedorDao = new AvaliacaoFornecedorDao();

    AvaliacaoReferenciaFornecedorDao avaliacaoReferenciaFornecedorDao =
        new AvaliacaoReferenciaFornecedorDao();

    CriterioAvaliacaoFornecedorDao criterioAvaliacaoFornecedorDao =
        new CriterioAvaliacaoFornecedorDao();

    AvaliacaoFornecedorDTO avaliacaoFornecedorDto = (AvaliacaoFornecedorDTO) model;

    TransactionControler transactionControler = new TransactionControlerImpl(getDao().getAliasDB());

    try {

      avaliacaoForncedorDao.setTransactionControler(transactionControler);

      avaliacaoReferenciaFornecedorDao.setTransactionControler(transactionControler);

      criterioAvaliacaoFornecedorDao.setTransactionControler(transactionControler);

      transactionControler.start();

      avaliacaoFornecedorDto =
          (AvaliacaoFornecedorDTO) avaliacaoForncedorDao.create(avaliacaoFornecedorDto);

      if (avaliacaoFornecedorDto.getListAvaliacaoReferenciaFornecedor() != null) {
        for (AvaliacaoReferenciaFornecedorDTO avaliacaoReferenciaFornecedorDto :
            avaliacaoFornecedorDto.getListAvaliacaoReferenciaFornecedor()) {
          if (avaliacaoFornecedorDto.getIdAvaliacaoFornecedor() != null
              && avaliacaoFornecedorDto.getIdAvaliacaoFornecedor() != 0) {

            if (avaliacaoReferenciaFornecedorDto.getDecisao().equalsIgnoreCase("Sim")) {
              avaliacaoReferenciaFornecedorDto.setDecisao("S");
            } else {
              avaliacaoReferenciaFornecedorDto.setDecisao("N");
            }

            avaliacaoReferenciaFornecedorDto.setIdAvaliacaoFornecedor(
                avaliacaoFornecedorDto.getIdAvaliacaoFornecedor());
            avaliacaoReferenciaFornecedorDao.create(avaliacaoReferenciaFornecedorDto);
          }
        }
      }

      if (avaliacaoFornecedorDto.getListCriterioAvaliacaoFornecedor() != null) {
        for (CriterioAvaliacaoFornecedorDTO criterioAvaliacaoFornecedorDto :
            avaliacaoFornecedorDto.getListCriterioAvaliacaoFornecedor()) {
          if (avaliacaoFornecedorDto.getIdAvaliacaoFornecedor() != null
              && avaliacaoFornecedorDto.getIdAvaliacaoFornecedor() != 0) {
            if (criterioAvaliacaoFornecedorDto.getValor().equalsIgnoreCase("Sim")) {
              criterioAvaliacaoFornecedorDto.setValorInteger(1);
            } else {
              if (criterioAvaliacaoFornecedorDto.getValor().equalsIgnoreCase("Não")) {
                criterioAvaliacaoFornecedorDto.setValorInteger(0);
              } else {
                criterioAvaliacaoFornecedorDto.setValorInteger(2);
              }
            }
            criterioAvaliacaoFornecedorDto.setIdAvaliacaoFornecedor(
                avaliacaoFornecedorDto.getIdAvaliacaoFornecedor());
            criterioAvaliacaoFornecedorDao.create(criterioAvaliacaoFornecedorDto);
          }
        }
      }

      transactionControler.commit();
      transactionControler.close();
    } catch (Exception e) {
      e.printStackTrace();
      this.rollbackTransaction(transactionControler, e);
    }

    return avaliacaoFornecedorDto;
  }
  /**
   * Este metodo trata do motor do sistema dinamico de gravacao de dados de visoes (montadas
   * dinamicamente)
   */
  @Override
  public void save(
      final UsuarioDTO usuarioDto,
      final DinamicViewsDTO dinamicViewDto,
      final Map map,
      final HttpServletRequest request)
      throws Exception {
    final VisaoRelacionadaDao visaoRelacionadaDao = new VisaoRelacionadaDao();
    final GrupoVisaoDao grupoVisaoDao = new GrupoVisaoDao();
    final GrupoVisaoCamposNegocioDao grupoVisaoCamposNegocioDao = new GrupoVisaoCamposNegocioDao();
    final CamposObjetoNegocioDao camposObjetoNegocioDao = new CamposObjetoNegocioDao();
    final VinculoVisaoDao vinculoVisaoDao = new VinculoVisaoDao();
    final ScriptsVisaoDao scriptsVisaoDao = new ScriptsVisaoDao();
    final MatrizVisaoDao matrizVisaoDao = new MatrizVisaoDao();
    final VisaoDao visaoDao = this.getDao();
    final TransactionControler tc = this.getDao().getTransactionControler();

    visaoRelacionadaDao.setTransactionControler(tc);
    grupoVisaoDao.setTransactionControler(tc);
    grupoVisaoCamposNegocioDao.setTransactionControler(tc);
    camposObjetoNegocioDao.setTransactionControler(tc);
    vinculoVisaoDao.setTransactionControler(tc);
    scriptsVisaoDao.setTransactionControler(tc);
    matrizVisaoDao.setTransactionControler(tc);

    final Integer idVisao = dinamicViewDto.getDinamicViewsIdVisao();
    final Collection colScripts = scriptsVisaoDao.findByIdVisao(idVisao);
    final HashMap mapScritps = new HashMap<>();
    if (colScripts != null) {
      for (final Iterator it = colScripts.iterator(); it.hasNext(); ) {
        final ScriptsVisaoDTO scriptsVisaoDTO = (ScriptsVisaoDTO) it.next();
        mapScritps.put(
            scriptsVisaoDTO.getTypeExecute() + "#" + scriptsVisaoDTO.getScryptType().trim(),
            scriptsVisaoDTO.getScript());
      }
    }

    final Collection colCamposPKPrincipal = new ArrayList<>();
    final Collection colCamposTodosPrincipal = new ArrayList<>();
    Collection colCamposTodosVinc = null;
    CamposObjetoNegocioDTO camposObjetoNegocioChaveMatriz = new CamposObjetoNegocioDTO();

    this.setInfoSave(idVisao, colCamposPKPrincipal, colCamposTodosPrincipal);

    final Collection colVisoesRelacionadas = visaoRelacionadaDao.findByIdVisaoPaiAtivos(idVisao);

    try {
      tc.start();

      if (this.isPKExists(colCamposPKPrincipal, map)) {
        String strScript =
            (String)
                mapScritps.get(
                    ScriptsVisaoDTO.SCRIPT_EXECUTE_SERVER
                        + "#"
                        + ScriptsVisaoDTO.SCRIPT_ONUPDATE.getName());
        if (strScript != null && !strScript.trim().equalsIgnoreCase("")) {
          final ScriptRhinoJSExecute scriptExecute = new ScriptRhinoJSExecute();
          final RuntimeScript runtimeScript = new RuntimeScript();
          final Context cx = Context.enter();
          final Scriptable scope = cx.initStandardObjects();
          scope.put("mapFields", scope, map);
          final String action = "UPDATE";
          scope.put("ACTION", scope, action);
          scope.put("userLogged", scope, usuarioDto);
          scope.put("transactionControler", scope, tc);
          scope.put("dinamicViewDto", scope, dinamicViewDto);
          scope.put("RuntimeScript", scope, runtimeScript);
          scope.put("language", scope, WebUtil.getLanguage(request));
          scriptExecute.processScript(
              cx,
              scope,
              strScript,
              VisaoServiceEjb.class.getName() + "_" + ScriptsVisaoDTO.SCRIPT_ONUPDATE.getName());
        }
        if (!dinamicViewDto.isAbortFuncaoPrincipal()) {
          this.updateFromMap(map, colCamposTodosPrincipal, usuarioDto, visaoDao, request);
          strScript =
              (String)
                  mapScritps.get(
                      ScriptsVisaoDTO.SCRIPT_EXECUTE_SERVER
                          + "#"
                          + ScriptsVisaoDTO.SCRIPT_AFTERUPDATE.getName());
          if (strScript != null && !strScript.trim().equalsIgnoreCase("")) {
            final ScriptRhinoJSExecute scriptExecute = new ScriptRhinoJSExecute();
            final RuntimeScript runtimeScript = new RuntimeScript();
            final Context cx = Context.enter();
            final Scriptable scope = cx.initStandardObjects();
            scope.put("mapFields", scope, map);
            final String action = "UPDATE";
            scope.put("ACTION", scope, action);
            scope.put("userLogged", scope, usuarioDto);
            scope.put("transactionControler", scope, tc);
            scope.put("dinamicViewDto", scope, dinamicViewDto);
            scope.put("RuntimeScript", scope, runtimeScript);
            scope.put("language", scope, WebUtil.getLanguage(request));
            scriptExecute.processScript(
                cx,
                scope,
                strScript,
                VisaoServiceEjb.class.getName()
                    + "_"
                    + ScriptsVisaoDTO.SCRIPT_AFTERUPDATE.getName());
          }
        }
      } else {
        String strScript =
            (String)
                mapScritps.get(
                    ScriptsVisaoDTO.SCRIPT_EXECUTE_SERVER
                        + "#"
                        + ScriptsVisaoDTO.SCRIPT_ONCREATE.getName());
        if (strScript != null && !strScript.trim().equalsIgnoreCase("")) {
          final ScriptRhinoJSExecute scriptExecute = new ScriptRhinoJSExecute();
          final RuntimeScript runtimeScript = new RuntimeScript();
          final Context cx = Context.enter();
          final Scriptable scope = cx.initStandardObjects();
          scope.put("mapFields", scope, map);
          final String action = "CREATE";
          scope.put("ACTION", scope, action);
          scope.put("userLogged", scope, usuarioDto);
          scope.put("transactionControler", scope, tc);
          scope.put("dinamicViewDto", scope, dinamicViewDto);
          scope.put("RuntimeScript", scope, runtimeScript);
          scope.put("language", scope, WebUtil.getLanguage(request));
          scriptExecute.processScript(
              cx,
              scope,
              strScript,
              VisaoServiceEjb.class.getName() + "_" + ScriptsVisaoDTO.SCRIPT_ONCREATE.getName());
        }
        if (!dinamicViewDto.isAbortFuncaoPrincipal()) {
          this.createFromMap(map, colCamposTodosPrincipal, usuarioDto, visaoDao, request);
          strScript =
              (String)
                  mapScritps.get(
                      ScriptsVisaoDTO.SCRIPT_EXECUTE_SERVER
                          + "#"
                          + ScriptsVisaoDTO.SCRIPT_AFTERCREATE.getName());
          if (strScript != null && !strScript.trim().equalsIgnoreCase("")) {
            final ScriptRhinoJSExecute scriptExecute = new ScriptRhinoJSExecute();
            final RuntimeScript runtimeScript = new RuntimeScript();
            final Context cx = Context.enter();
            final Scriptable scope = cx.initStandardObjects();
            scope.put("mapFields", scope, map);
            final String action = "CREATE";
            scope.put("ACTION", scope, action);
            scope.put("userLogged", scope, usuarioDto);
            scope.put("transactionControler", scope, tc);
            scope.put("dinamicViewDto", scope, dinamicViewDto);
            scope.put("RuntimeScript", scope, runtimeScript);
            scope.put("language", scope, WebUtil.getLanguage(request));
            scriptExecute.processScript(
                cx,
                scope,
                strScript,
                VisaoServiceEjb.class.getName()
                    + "_"
                    + ScriptsVisaoDTO.SCRIPT_AFTERCREATE.getName());
          }
        }
      }
      if (colVisoesRelacionadas != null) {
        for (final Iterator it = colVisoesRelacionadas.iterator(); it.hasNext(); ) {
          final VisaoRelacionadaDTO visaoRelacionadaDto = (VisaoRelacionadaDTO) it.next();
          final Collection colVinculos =
              vinculoVisaoDao.findByIdVisaoRelacionada(visaoRelacionadaDto.getIdVisaoRelacionada());

          final Object objFromHash =
              map.get(
                  VisaoRelacionadaDTO.PREFIXO_SISTEMA_TABELA_VINCULADA
                      + visaoRelacionadaDto.getIdVisaoFilha());
          VisaoDTO visaoDtoAux = new VisaoDTO();
          visaoDtoAux.setIdVisao(visaoRelacionadaDto.getIdVisaoFilha());
          visaoDtoAux = (VisaoDTO) visaoDao.restore(visaoDtoAux);
          MatrizVisaoDTO matrizVisaoDTO = new MatrizVisaoDTO();
          boolean ehMatriz = false;
          if (visaoDtoAux != null) {
            if (visaoDtoAux.getTipoVisao().equalsIgnoreCase(VisaoDTO.MATRIZ)) {
              ehMatriz = true;
              matrizVisaoDTO.setIdVisao(visaoDtoAux.getIdVisao());
              final Collection colMatriz = matrizVisaoDao.findByIdVisao(visaoDtoAux.getIdVisao());
              if (colMatriz != null && colMatriz.size() > 0) {
                matrizVisaoDTO = (MatrizVisaoDTO) colMatriz.iterator().next();
                camposObjetoNegocioChaveMatriz.setIdCamposObjetoNegocio(
                    matrizVisaoDTO.getIdCamposObjetoNegocio1());
                camposObjetoNegocioChaveMatriz.setIdObjetoNegocio(
                    matrizVisaoDTO.getIdObjetoNegocio());
                camposObjetoNegocioChaveMatriz =
                    (CamposObjetoNegocioDTO)
                        camposObjetoNegocioDao.restore(camposObjetoNegocioChaveMatriz);
              }
            }
          }

          if (HashMap.class.isInstance(objFromHash)) {
            final HashMap mapVinc = (HashMap) objFromHash;
            if (mapVinc != null) { // Se existir dados recebidos.
              final Collection colCamposPKVinc = new ArrayList<>();
              colCamposTodosVinc = new ArrayList<>();
              this.setInfoSave(
                  visaoRelacionadaDto.getIdVisaoFilha(), colCamposPKVinc, colCamposTodosVinc);
              // Grava os dados de informacoes vinculadas.
              if (this.isPKExists(colCamposPKVinc, mapVinc)) {
                this.updateFromMap(mapVinc, colCamposTodosVinc, usuarioDto, visaoDao, request);
              } else {
                this.createFromMap(mapVinc, colCamposTodosVinc, usuarioDto, visaoDao, request);
              }
            }
          } else if (Collection.class.isInstance(objFromHash)) {
            final Collection colVinc = (Collection) objFromHash;
            if (colVinc != null) {
              for (final Iterator it2 = colVinc.iterator(); it2.hasNext(); ) {
                Map mapVinc = (Map) it2.next();
                if (mapVinc != null) { // Se existir dados recebidos.
                  final Collection colCamposPKVinc = new ArrayList<>();
                  colCamposTodosVinc = new ArrayList<>();
                  this.setInfoSave(
                      visaoRelacionadaDto.getIdVisaoFilha(),
                      colCamposPKVinc,
                      colCamposTodosVinc); // *****
                  String tipoVinc = "";
                  if (colVinculos != null && colVinculos.size() > 0) {
                    final VinculoVisaoDTO vinculoVisaoDTO =
                        (VinculoVisaoDTO) ((List) colVinculos).get(0);
                    tipoVinc = vinculoVisaoDTO.getTipoVinculo();
                  }
                  if (ehMatriz) {
                    if (camposObjetoNegocioChaveMatriz != null) {
                      mapVinc.put(camposObjetoNegocioChaveMatriz.getNomeDB(), mapVinc.get("FLD_0"));
                    }
                    CamposObjetoNegocioDTO camposObjetoNegocioDTO = null;
                    if (colCamposPKVinc != null && colCamposPKVinc.size() > 0) {
                      for (final Iterator itVinc = colCamposPKVinc.iterator(); itVinc.hasNext(); ) {
                        camposObjetoNegocioDTO = (CamposObjetoNegocioDTO) itVinc.next();
                        if (!camposObjetoNegocioDTO
                            .getNomeDB()
                            .trim()
                            .equalsIgnoreCase(camposObjetoNegocioChaveMatriz.getNomeDB().trim())) {
                          mapVinc.put(
                              camposObjetoNegocioDTO.getNomeDB(),
                              map.get(camposObjetoNegocioDTO.getNomeDB()));
                        }
                      }
                    }
                    if (tipoVinc == null || tipoVinc.equalsIgnoreCase("")) {
                      tipoVinc = VinculoVisaoDTO.VINCULO_1_TO_N;
                    }
                  }
                  if (tipoVinc.equalsIgnoreCase(VinculoVisaoDTO.VINCULO_N_TO_N)) {
                    // Grava os dados de informacoes vinculadas.
                    if (this.isPKExists(colCamposPKVinc, mapVinc)) {
                      this.updateFromMap(
                          mapVinc, colCamposTodosVinc, usuarioDto, visaoDao, request);
                    } else {
                      this.createFromMap(
                          mapVinc, colCamposTodosVinc, usuarioDto, visaoDao, request);
                    }
                    this.processCreateVinc(
                        visaoRelacionadaDto, colVinculos, map, mapVinc, usuarioDto, request);
                  }
                  if (tipoVinc.equalsIgnoreCase(VinculoVisaoDTO.VINCULO_1_TO_N)) {
                    mapVinc = this.createUniqueMap(map, mapVinc); // ******
                    // Grava os dados de informacoes vinculadas.
                    if (this.isPKExists(colCamposPKVinc, mapVinc)) {
                      this.updateFromMap(
                          mapVinc, colCamposTodosVinc, usuarioDto, visaoDao, request);
                    } else {
                      this.createFromMap(
                          mapVinc, colCamposTodosVinc, usuarioDto, visaoDao, request);
                    }
                  }
                }
              }
            }
          }
        }
      }

      if (dinamicViewDto.getIdFluxo() != null || dinamicViewDto.getIdTarefa() != null) {
        new ExecucaoSolicitacaoServiceEjb()
            .executa(
                usuarioDto,
                tc,
                dinamicViewDto.getIdFluxo(),
                dinamicViewDto.getIdTarefa(),
                dinamicViewDto.getAcaoFluxo(),
                map,
                colCamposTodosPrincipal,
                colCamposTodosVinc);
      }

      tc.commit();
      tc.close();
    } catch (final Exception e) {
      this.rollbackTransaction(tc, e);
    }
  }