/**
* CentralIT - CITSmart
*/
package br.com.centralit.citcorpore.integracao;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import br.com.centralit.citcorpore.bean.GrupoEmpregadoDTO;
import br.com.centralit.citcorpore.bean.PastaDTO;
import br.com.centralit.citcorpore.bean.PerfilAcessoPastaDTO;
import br.com.centralit.citcorpore.bean.UsuarioDTO;
import br.com.centralit.citcorpore.negocio.GrupoEmpregadoService;
import br.com.centralit.citcorpore.negocio.PastaService;
import br.com.centralit.citcorpore.util.Enumerados;
import br.com.centralit.citcorpore.util.Enumerados.PermissaoAcessoPasta;
import br.com.citframework.dto.IDto;
import br.com.citframework.excecao.PersistenceException;
import br.com.citframework.integracao.Condition;
import br.com.citframework.integracao.CrudDaoDefaultImpl;
import br.com.citframework.integracao.Field;
import br.com.citframework.integracao.Order;
import br.com.citframework.service.ServiceLocator;
import br.com.citframework.util.Constantes;
/**
* DAO de PerfilAcessoPasta.
*
* @author valdoilo.damasceno
*
*/
public class PerfilAcessoPastaDAO extends CrudDaoDefaultImpl {
public PerfilAcessoPastaDAO() {
super(Constantes.getValue("DATABASE_ALIAS"), null);
}
@Override
public Collection<PerfilAcessoPastaDTO> find(IDto arg0) throws PersistenceException {
return null;
}
@Override
public Collection<Field> getFields() {
Collection<Field> listFields = new ArrayList<>();
listFields.add(new Field("IDPERFIL", "idPerfilAcesso", true, false, false, false));
listFields.add(new Field("IDPASTA", "idPasta", true, false, false, false));
listFields.add(new Field("DATAINICIO", "dataInicio", false, false, false, false));
listFields.add(new Field("DATAFIM", "dataFim", false, false, false, false));
listFields.add(new Field("APROVABASECONHECIMENTO", "aprovaBaseConhecimento", false, false, false, false));
listFields.add(new Field("PERMITELEITURA", "permiteLeitura", false, false, false, false));
listFields.add(new Field("PERMITELEITURAGRAVACAO", "permiteLeituraGravacao", false, false, false, false));
return listFields;
}
@Override
public String getTableName() {
return "PERFILACESSOPASTA";
}
@Override
public Collection list() throws PersistenceException {
List<Order> ordenacao = new ArrayList<>();
ordenacao.add(new Order("IDPERFIL"));
return super.list(ordenacao);
}
@Override
public Class<PerfilAcessoPastaDTO> getBean() {
return PerfilAcessoPastaDTO.class;
}
/**
* Consulta Perfil de Acesso Pasta pelo idPasta e idPerfilPasta.
*
* @param idPasta
* @param idPerfilAcesso
* @return PerfilAcessoPastaDTO
* @throws Exception
* @author valdoilo.damasceno
*/
public PerfilAcessoPastaDTO findByIdPastaAndIdPerfilAcesso(Integer idPasta, Integer idPerfilAcesso) throws Exception {
List<Order> ordenacao = new ArrayList<>();
List<Condition> condicao = new ArrayList<>();
condicao.add(new Condition("idPasta", "=", idPasta));
condicao.add(new Condition("idPerfilAcesso", "=", idPerfilAcesso));
ordenacao.add(new Order("idPerfilAcesso"));
List list = (List) this.findByCondition(condicao, ordenacao);
if (list != null && !list.isEmpty()) {
return (PerfilAcessoPastaDTO) list.get(0);
}
return null;
}
/**
* Consulta Perfil de Acesso Pasta pelo idPasta .
*
* @param idPasta
* @param idPerfilAcesso
* @return PerfilAcessoPastaDTO
* @throws Exception
* @author thays.araujo
*/
public Collection<PerfilAcessoPastaDTO> findByIdPasta(Integer idPasta) throws Exception {
List<String> ordenacao = new ArrayList<>();
StringBuilder sql = new StringBuilder();
sql.append("select distinct idPerfil from perfilacessopasta where idpasta = ").append(idPasta);
List list = execSQL(sql.toString(), null);
ordenacao.add("idPerfilAcesso");
if (list != null && !list.isEmpty()) {
List listaIdPerfilAcesso = this.engine.listConvertion(PerfilAcessoPastaDTO.class, list, ordenacao);
return listaIdPerfilAcesso;
}
return null;
}
/**
* Retorna PerfilAcessoSituacaoPasta Ativos por idPerfilAcesso.
*
* @param idPerfilAcesso
* @return
* @throws Exception
*/
public Collection findByIdPerfil(Integer idPerfilAcesso) throws Exception {
List<Condition> condicao = new ArrayList<>();
List<Order> ordenacao = new ArrayList<>();
condicao.add(new Condition("idPerfilAcesso", "=", idPerfilAcesso));
condicao.add(new Condition("dataFim", "is", null));
ordenacao.add(new Order("idPerfilAcesso"));
return super.findByCondition(condicao, ordenacao);
}
/**
* Exclui Perfis de Acesso � Pasta.
*
* @param pastaBean
* @throws Exception
* @author valdoilo.damasceno
*/
public void excluirPerfisDeAcessoPasta(PastaDTO pastaBean) throws Exception {
List<Condition> condicao = new ArrayList<>();
condicao.add(new Condition("idPasta", "=", pastaBean.getId()));
this.deleteByCondition(condicao);
}
/**
* Busca somente pastas com perfil de acesso onde usuario logado tenha acesso... Funcionalidade #340
*
* @param usuario
* @param idgrupo
* @return
* @throws Exception
*/
public List<PerfilAcessoPastaDTO> validaPasta(UsuarioDTO usuario) throws Exception {
StringBuilder sql = new StringBuilder();
List<Integer> parametros = new ArrayList<>();
List<String> fields = new ArrayList<>();
fields.add("idPasta");
fields.add("nomePasta");
if (usuario.getIdPerfilAcessoUsuario() != null) {
sql.append("SELECT pasta.idpasta AS idpasta, pasta.nome AS nomePasta FROM ").append(getTableName()).append(" perfilAcessPast ");
sql.append("JOIN pasta pasta ON pasta.idpasta = perfilAcessPast.idpasta WHERE perfilAcessPast.idperfil = ? AND pasta.datafim IS NULL ORDER BY pasta.nome");
parametros.add(usuario.getIdPerfilAcessoUsuario());
} else {
sql.append("SELECT past.idpasta AS idPasta, past.nome AS nomePasta FROM perfilacessogrupo pag JOIN perfilacessopasta pap ON pag.idperfil = pap.idperfil ");
sql.append("JOIN pasta past ON past.idpasta = pap.idpasta WHERE pag.idgrupo = ? AND past.datafim IS NULL ");
parametros.add(usuario.getIdGrupo());
}
return this.engine.listConvertion(this.getBean(), execSQL(sql.toString(), parametros.toArray()), fields);
}
/**
* Verifica se Usu�rio Pode Aprovar Base de Conhecimento da pasta Selecionada.
*
* @param usuario
* @param idPasta
* @return Boolean
* @author valdoilo.damasceno
* @throws Exception
*/
public boolean usuarioAprovaBaseConhecimentoParaPastaSelecionada(UsuarioDTO usuario, Integer idPasta) throws Exception {
List<String> retorno = new ArrayList<>();
retorno.add("aprovaBaseConhecimento");
if (getPerfilAcessoUsuarioDAO().verificarSeUsuarioPossuiPerfilAcessoEspecifico(usuario)) {
StringBuilder sql = new StringBuilder();
List<Integer> parametros = new ArrayList<>();
sql.append("SELECT perfilacessopasta.aprovabaseconhecimento FROM usuario ");
sql.append("INNER JOIN perfilacessousuario ON usuario.idusuario = perfilacessousuario.idusuario ");
sql.append("INNER JOIN perfilacesso ON perfilacesso.idperfil = perfilacessousuario.idperfil ");
sql.append("INNER JOIN perfilacessopasta ON perfilacesso.idperfil = perfilacessopasta.idperfil ");
sql.append("WHERE usuario.idusuario = ? AND perfilacessopasta.idpasta = ?");
parametros.add(usuario.getIdUsuario());
parametros.add(idPasta);
List list = execSQL(sql.toString(), parametros.toArray());
if (aprovaBaseConhecimento(retorno, list)) {
return true;
} else if (verificarSeGrupoAprovaBaseConhecimento(usuario, idPasta, retorno)) {
return true;
} else {
return verificaPastaFilhoHerdaPermissaoPastaPai(usuario, idPasta, retorno);
}
}
return verificarSeGrupoAprovaBaseConhecimento(usuario, idPasta, retorno);
}
/**
* @param usuario
* @param idPasta
* @param sql
* @param parametros
* @param retorno
* @return
* @throws PersistenceException
* @throws Exception
*/
private Boolean verificarSeGrupoAprovaBaseConhecimento(UsuarioDTO usuario, Integer idPasta, List retorno) throws PersistenceException, Exception {
if (usuario == null) {
return false;
}
StringBuilder sql = new StringBuilder();
List<Integer> parametros = new ArrayList<>();
sql.append("SELECT perfilacessopasta.aprovabaseconhecimento FROM grupo ");
sql.append("INNER JOIN perfilacessogrupo ON grupo.idgrupo = perfilacessogrupo.idgrupo ");
sql.append("INNER JOIN perfilacesso ON perfilacesso.idperfil = perfilacessogrupo.idperfil ");
sql.append("INNER JOIN perfilacessopasta ON perfilacesso.idperfil = perfilacessopasta.idperfil ");
sql.append("WHERE perfilacessopasta.idpasta = ? ");
parametros.add(idPasta);
Collection<GrupoEmpregadoDTO> listGrupoEmpregado = new ArrayList<GrupoEmpregadoDTO>();
listGrupoEmpregado = getGrupoEmpregadoService().findByIdEmpregado(usuario.getIdEmpregado());
if (listGrupoEmpregado != null && !listGrupoEmpregado.isEmpty()) {
boolean aux = true;
for (GrupoEmpregadoDTO grupoEmpregado : listGrupoEmpregado) {
if (aux) {
sql.append(" AND (grupo.idgrupo = ? ");
parametros.add(grupoEmpregado.getIdGrupo());
aux = false;
} else {
sql.append(" OR grupo.idgrupo = ? ");
parametros.add(grupoEmpregado.getIdGrupo());
}
}
sql.append(" )");
}
List list = execSQL(sql.toString(), parametros.toArray());
if (list != null && !list.isEmpty()) {
Collection<PerfilAcessoPastaDTO> listPerfilAcessoPasta = this.engine.listConvertion(this.getBean(), list, retorno);
for (PerfilAcessoPastaDTO perfilAcessoPastaDto : listPerfilAcessoPasta) {
if (perfilAcessoPastaDto.getAprovaBaseConhecimento().equalsIgnoreCase("s")) {
return true;
}
}
}
return false;
}
/**
* Verifica se Retorno aprovaBaseConhecimento � igual a "S".
*
* @param retorno
* @param list
* @throws Exception
* @author valdoilo.damasceno
*/
private boolean aprovaBaseConhecimento(List retorno, List list) throws Exception {
if (list != null && !list.isEmpty()) {
PerfilAcessoPastaDTO perfilAcessoPasta = (PerfilAcessoPastaDTO) this.engine.listConvertion(this.getBean(), list, retorno).get(0);
if (perfilAcessoPasta.getAprovaBaseConhecimento().equalsIgnoreCase("s")) {
return true;
} else {
return false;
}
}
return false;
}
/**
* Obt�m Permiss�o de Acesso.
*
* @param retorno
* @param listPerfilAcessoPastaAux
* @return SEMPERMISSAO, LEITURA ou LEITURAGRAVACAO.
* @throws Exception
*/
private PermissaoAcessoPasta possuiPermissaoLeituraGravacao(List retorno, List listPerfilAcessoPastaAux) throws Exception {
if (listPerfilAcessoPastaAux != null && !listPerfilAcessoPastaAux.isEmpty()) {
Collection<PerfilAcessoPastaDTO> listPerfilAcessoPasta = this.engine.listConvertion(this.getBean(), listPerfilAcessoPastaAux, retorno);
for (PerfilAcessoPastaDTO perfilAcessoPasta : listPerfilAcessoPasta) {
if (perfilAcessoPasta.getPermiteLeitura() != null && perfilAcessoPasta.getPermiteLeitura().equalsIgnoreCase("s")) {
return Enumerados.PermissaoAcessoPasta.LEITURA;
} else {
return Enumerados.PermissaoAcessoPasta.LEITURAGRAVACAO;
}
}
}
return null;
}
/**
* Verifica as Permiss�es de Acesso do Usu�rio a Pasta informada.
*
* @param usuario
* @param idPasta
* @return true - Possui permiss�o de Leitura/Grava��o; false - Possui permiss�a de Leitura;
* @throws PersistenceException
* @throws Exception
*/
public PermissaoAcessoPasta verificarPermissaoDeAcessoPasta(UsuarioDTO usuario, Integer idPasta) throws PersistenceException, Exception {
List<String> retorno = new ArrayList<>();
retorno.add("permiteLeitura");
retorno.add("permiteLeituraGravacao");
if (getPerfilAcessoUsuarioDAO().verificarSeUsuarioPossuiPerfilAcessoEspecifico(usuario)) {
StringBuilder sql = new StringBuilder();
List<Integer> parametros = new ArrayList<>();
sql.append("SELECT perfilacessopasta.permiteleitura, perfilacessopasta.permiteleituragravacao ");
sql.append("FROM usuario ");
sql.append("INNER JOIN perfilacessousuario ON usuario.idusuario = perfilacessousuario.idusuario ");
sql.append("INNER JOIN perfilacesso ON perfilacesso.idperfil = perfilacessousuario.idperfil ");
sql.append("INNER JOIN perfilacessopasta ON perfilacesso.idperfil = perfilacessopasta.idperfil ");
sql.append("WHERE usuario.idusuario = ? AND perfilacessopasta.idpasta = ?");
parametros.add(usuario.getIdUsuario());
parametros.add(idPasta);
List list = execSQL(sql.toString(), parametros.toArray());
PermissaoAcessoPasta permissao = possuiPermissaoLeituraGravacao(retorno, list);
if (permissao != null) {
return permissao;
} else {
return verificarSeGrupoPossuiPermissaoLeituraGravacao(usuario, idPasta, retorno);
}
}
return verificarSeGrupoPossuiPermissaoLeituraGravacao(usuario, idPasta, retorno);
}
/**
* Verifica se Grupo informado possui Permiss�o Leitura/Grava��o.
*
* @param usuario
* @param idPasta
* @param retorno
* @return true - Grupo possui permiss�o Leitura/Grava��o; false - Grupo possui permiss�o Leitura;
* @throws PersistenceException
* @throws Exception
*/
private PermissaoAcessoPasta verificarSeGrupoPossuiPermissaoLeituraGravacao(UsuarioDTO usuario, Integer idPasta, List retorno) throws PersistenceException, Exception {
if (usuario == null) {
return null;
}
Collection<GrupoEmpregadoDTO> listGrupoEmpregado = new ArrayList<GrupoEmpregadoDTO>();
listGrupoEmpregado = getGrupoEmpregadoService().findByIdEmpregado(usuario.getIdEmpregado());
if (listGrupoEmpregado != null && !listGrupoEmpregado.isEmpty()) {
StringBuilder sql = new StringBuilder();
List<Integer> parametros = new ArrayList<>();
sql.append("SELECT perfilacessopasta.permiteleitura, perfilacessopasta.permiteleituragravacao ");
sql.append("FROM grupo ");
sql.append("INNER JOIN perfilacessogrupo ON grupo.idgrupo = perfilacessogrupo.idgrupo ");
sql.append("INNER JOIN perfilacesso ON perfilacesso.idperfil = perfilacessogrupo.idperfil ");
sql.append("INNER JOIN perfilacessopasta ON perfilacesso.idperfil = perfilacessopasta.idperfil ");
sql.append("WHERE ");
boolean aux = true;
for (GrupoEmpregadoDTO grupoEmpregado : listGrupoEmpregado) {
if (aux) {
sql.append(" (grupo.idgrupo = ? ");
parametros.add(grupoEmpregado.getIdGrupo());
aux = false;
} else {
sql.append(" OR grupo.idgrupo = ? ");
parametros.add(grupoEmpregado.getIdGrupo());
}
}
sql.append(" ) and perfilacessopasta.idpasta = ? ");
parametros.add(idPasta);
List list = execSQL(sql.toString(), parametros.toArray());
return possuiPermissaoLeituraGravacao(retorno, list);
}
return null;
}
/**
* Lista PERFILACESSOPASTADTO ATIVOS.
*
* @param idPasta
* @return
* @throws Exception
* @author Vadoilo Damasceno
*/
public Collection<PerfilAcessoPastaDTO> listByIdPasta(Integer idPasta) throws Exception {
List<String> listRetorno = new ArrayList<>();
List<Integer> parametros = new ArrayList<>();
StringBuilder sql = new StringBuilder();
listRetorno.add("idPerfilAcesso");
listRetorno.add("idPasta");
listRetorno.add("aprovaBaseConhecimento");
listRetorno.add("permiteLeitura");
listRetorno.add("permiteLeituraGravacao");
sql.append("select idPerfil, idpasta, aprovabaseconhecimento, permiteleitura, permiteleituragravacao from perfilacessopasta where idpasta = ? and datafim is null");
parametros.add(idPasta);
List list = execSQL(sql.toString(), parametros.toArray());
if (list != null && !list.isEmpty()) {
List listaIdPerfilAcesso = this.engine.listConvertion(PerfilAcessoPastaDTO.class, list, listRetorno);
return listaIdPerfilAcesso;
}
return null;
}
/**
* Verifica se Pasta filho herda permiss�es da pasta pai.
*
* @param usuario
* @param idPasta
* @param retorno
* @return
* @throws Exception
* @author mario.haysaki
*/
public boolean verificaPastaFilhoHerdaPermissaoPastaPai(UsuarioDTO usuario, Integer idPasta, List retorno) throws Exception {
if (usuario == null) {
return false;
}
PastaDTO pastaDto = new PastaDTO();
if (idPasta != null) {
pastaDto = getPastaService().idpastaPaiEHerdaDaPastaPai(idPasta);
if (pastaDto != null) {
if (pastaDto.getIdPastaPai() != null && pastaDto.getHerdaPermissoes() != null && pastaDto.getHerdaPermissoes().equalsIgnoreCase("s")) {
return verificarSeGrupoAprovaBaseConhecimento(usuario, pastaDto.getIdPastaPai(), retorno);
} else {
return false;
}
} else {
return false;
}
}
return false;
}
private PerfilAcessoUsuarioDAO perfilAcessoUsuarioDao;
private PerfilAcessoUsuarioDAO getPerfilAcessoUsuarioDAO() {
if (perfilAcessoUsuarioDao == null) {
perfilAcessoUsuarioDao = new PerfilAcessoUsuarioDAO();
}
return perfilAcessoUsuarioDao;
}
private GrupoEmpregadoService grupoEmpregadoService;
private GrupoEmpregadoService getGrupoEmpregadoService() throws Exception {
if (grupoEmpregadoService == null) {
grupoEmpregadoService = (GrupoEmpregadoService) ServiceLocator.getInstance().getService(GrupoEmpregadoService.class, null);
}
return grupoEmpregadoService;
}
private PastaService pastaService;
private PastaService getPastaService() throws Exception {
if (pastaService == null) {
pastaService = (PastaService) ServiceLocator.getInstance().getService(PastaService.class, null);
}
return pastaService;
}
}