/**
* CentralIT - CITSmart
*/
package br.com.centralit.citcorpore.negocio;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import org.apache.commons.lang.StringUtils;
import br.com.centralit.citcorpore.bean.EmpregadoDTO;
import br.com.centralit.citcorpore.bean.NotificacaoDTO;
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.integracao.EmpregadoDao;
import br.com.centralit.citcorpore.integracao.NotificacaoDao;
import br.com.centralit.citcorpore.integracao.NotificacaoGrupoDao;
import br.com.centralit.citcorpore.integracao.NotificacaoUsuarioDao;
import br.com.centralit.citcorpore.integracao.PastaDAO;
import br.com.centralit.citcorpore.integracao.PerfilAcessoPastaDAO;
import br.com.centralit.citcorpore.mail.MensagemEmail;
import br.com.centralit.citcorpore.util.Enumerados;
import br.com.centralit.citcorpore.util.Enumerados.ParametroSistema;
import br.com.centralit.citcorpore.util.Enumerados.PermissaoAcessoPasta;
import br.com.centralit.citcorpore.util.ParametroUtil;
import br.com.citframework.dto.IDto;
import br.com.citframework.excecao.LogicException;
import br.com.citframework.excecao.ServiceException;
import br.com.citframework.integracao.TransactionControler;
import br.com.citframework.integracao.TransactionControlerImpl;
import br.com.citframework.service.CrudServiceImpl;
import br.com.citframework.service.ServiceLocator;
import br.com.citframework.util.UtilDatas;
/**
* ServiceEJB de Pasta.
*
* @author valdoilo.damasceno
*/
@SuppressWarnings({"rawtypes", "unchecked"})
public class PastaServiceEjb extends CrudServiceImpl implements PastaService {
private PastaDAO dao;
@Override
protected PastaDAO getDao() {
if (dao == null) {
dao = new PastaDAO();
}
return dao;
}
@Override
public PastaDTO create(PastaDTO novaPasta) throws ServiceException, LogicException {
PastaDTO pastaDto = novaPasta;
NotificacaoDTO notificacaoDto = new NotificacaoDTO();
NotificacaoDao notificacaoDao = new NotificacaoDao();
NotificacaoGrupoDao notificacaoGrupoDao = new NotificacaoGrupoDao();
NotificacaoUsuarioDao notificacaoUsuarioDao = new NotificacaoUsuarioDao();
PerfilAcessoPastaDAO perfilAcessoPastaDao = new PerfilAcessoPastaDAO();
TransactionControler tc = new TransactionControlerImpl(this.getDao().getAliasDB());
try {
this.getDao().setTransactionControler(tc);
perfilAcessoPastaDao.setTransactionControler(tc);
notificacaoDao.setTransactionControler(tc);
notificacaoGrupoDao.setTransactionControler(tc);
notificacaoUsuarioDao.setTransactionControler(tc);
tc.start();
if (pastaDto.getTitulo() != null && !StringUtils.isEmpty(pastaDto.getTitulo().trim()) && pastaDto.getTipoNotificacao() != null
&& !StringUtils.isEmpty(pastaDto.getTipoNotificacao().trim())) {
notificacaoDto.setDataInicio(UtilDatas.getDataAtual());
notificacaoDto = this.criarNotificacao(pastaDto, tc);
}
if (notificacaoDto.getIdNotificacao() != null) {
pastaDto.setIdNotificacao(notificacaoDto.getIdNotificacao());
}
pastaDto.setDataInicio(UtilDatas.getDataAtual());
pastaDto = (PastaDTO) this.getDao().create(pastaDto);
this.enviarEmailNotificacaoPasta(pastaDto, tc, "C");
this.criarPerfisDeAcessoAPasta(pastaDto, tc);
tc.commit();
tc.close();
} catch (Exception e) {
this.rollbackTransaction(tc, e);
}
return pastaDto;
}
@Override
public void update(PastaDTO pasta) throws ServiceException, LogicException {
PastaDTO pastaDto = pasta;
NotificacaoDTO notificacaoDto = new NotificacaoDTO();
PerfilAcessoPastaDAO perfilAcessoPastaDao = new PerfilAcessoPastaDAO();
TransactionControler tc = new TransactionControlerImpl(getDao().getAliasDB());
try {
tc.start();
if (pastaDto.getTitulo() != null && !StringUtils.isEmpty(pastaDto.getTitulo().trim()) && pastaDto.getTipoNotificacao() != null
&& !StringUtils.isEmpty(pastaDto.getTipoNotificacao().trim())) {
notificacaoDto.setDataInicio(UtilDatas.getDataAtual());
notificacaoDto = this.criarNotificacao(pastaDto, tc);
}
super.update(pastaDto);
perfilAcessoPastaDao.excluirPerfisDeAcessoPasta(pastaDto);
this.criarPerfisDeAcessoAPasta(pastaDto, tc);
this.enviarEmailNotificacaoPasta(pastaDto, tc, "U");
tc.commit();
tc.close();
} catch (Exception e) {
this.rollbackTransaction(tc, e);
}
}
@Override
public boolean excluirPasta(PastaDTO pastaBean) throws Exception {
if (this.getDao().isEmUso(pastaBean)) {
return false;
}
pastaBean.setDataFim(UtilDatas.getDataAtual());
this.getDao().update(pastaBean);
this.enviarEmailNotificacaoPasta(pastaBean, null, "D");
return true;
}
/**
* Cria PerfilsDeAcessoPasta
*
* @param perfisDeAcesso
* @throws Exception
* @author valdoilo.damasceno
*/
private void criarPerfisDeAcessoAPasta(PastaDTO pastaDto, TransactionControler transactionControler) throws Exception {
PerfilAcessoPastaDAO perfilAcessoPastaDao = new PerfilAcessoPastaDAO();
perfilAcessoPastaDao.setTransactionControler(transactionControler);
if (pastaDto.getHerdaPermissoes() == null || !StringUtils.containsOnly(pastaDto.getHerdaPermissoes().toUpperCase().trim(), "S")) {
if (pastaDto.getPerfisDeAcesso() != null && !pastaDto.getPerfisDeAcesso().isEmpty()) {
for (PerfilAcessoPastaDTO perfilAcessoPastaDto : pastaDto.getPerfisDeAcesso()) {
perfilAcessoPastaDto.setIdPasta(pastaDto.getId());
perfilAcessoPastaDto.setDataInicio(UtilDatas.getDataAtual());
perfilAcessoPastaDao.create(perfilAcessoPastaDto);
}
}
}
}
private void enviarEmailNotificacaoPasta(PastaDTO pastaDto, TransactionControler transactionControler, String crud) throws Exception {
EmpregadoDao empregadoDao = new EmpregadoDao();
NotificacaoDao notificacaoDao = new NotificacaoDao();
NotificacaoDTO notificacaoDTO = new NotificacaoDTO();
Collection<EmpregadoDTO> colEmpregados = new ArrayList();
if (transactionControler != null) {
empregadoDao.setTransactionControler(transactionControler);
notificacaoDao.setTransactionControler(transactionControler);
}
if (pastaDto.getIdNotificacao() != null && !pastaDto.getIdNotificacao().equals("")) {
notificacaoDTO.setIdNotificacao(pastaDto.getIdNotificacao());
notificacaoDTO = (NotificacaoDTO) notificacaoDao.restore(notificacaoDTO);
String remetente = ParametroUtil.getValorParametroCitSmartHashMap(ParametroSistema.RemetenteNotificacoesSolicitacao, null);
String ID_MODELO_EMAIL_AVISAR_CRIACAO_PASTA = ParametroUtil.getValorParametroCitSmartHashMap(ParametroSistema.ID_MODELO_EMAIL_AVISAR_CRIACAO_PASTA, "8");
String ID_MODELO_EMAIL_AVISAR_ATUALIZACAO_PASTA = ParametroUtil.getValorParametroCitSmartHashMap(ParametroSistema.ID_MODELO_EMAIL_AVISAR_ATUALIZACAO_PASTA, "9");
String ID_MODELO_EMAIL_AVISAR_EXCLUSAO_PASTA = ParametroUtil.getValorParametroCitSmartHashMap(ParametroSistema.ID_MODELO_EMAIL_AVISAR_EXCLUSAO_PASTA, "10");
String ID_MODELO_EMAIL = "";
if (ID_MODELO_EMAIL_AVISAR_CRIACAO_PASTA == null || ID_MODELO_EMAIL_AVISAR_CRIACAO_PASTA.isEmpty()) {
ID_MODELO_EMAIL_AVISAR_CRIACAO_PASTA = "8";
}
if (ID_MODELO_EMAIL_AVISAR_ATUALIZACAO_PASTA == null || ID_MODELO_EMAIL_AVISAR_ATUALIZACAO_PASTA.isEmpty()) {
ID_MODELO_EMAIL_AVISAR_ATUALIZACAO_PASTA = "9";
}
if (ID_MODELO_EMAIL_AVISAR_EXCLUSAO_PASTA == null || ID_MODELO_EMAIL_AVISAR_EXCLUSAO_PASTA.isEmpty()) {
ID_MODELO_EMAIL_AVISAR_EXCLUSAO_PASTA = "10";
}
if (crud.equals("C")) {
if (notificacaoDTO.getTipoNotificacao().equals("T") || notificacaoDTO.getTipoNotificacao().equals("C")) {
ID_MODELO_EMAIL = ID_MODELO_EMAIL_AVISAR_CRIACAO_PASTA;
}
} else if (crud.equals("U")) {
if (notificacaoDTO.getTipoNotificacao().equals("T") || notificacaoDTO.getTipoNotificacao().equals("A")) {
ID_MODELO_EMAIL = ID_MODELO_EMAIL_AVISAR_ATUALIZACAO_PASTA;
}
} else {
if (notificacaoDTO.getTipoNotificacao().equals("T") || notificacaoDTO.getTipoNotificacao().equals("E")) {
ID_MODELO_EMAIL = ID_MODELO_EMAIL_AVISAR_EXCLUSAO_PASTA;
}
}
if (!ID_MODELO_EMAIL.isEmpty()) {
colEmpregados = empregadoDao.listarEmailsNotificacoesPasta(pastaDto.getId());
if (colEmpregados != null) {
for (EmpregadoDTO empregados : colEmpregados) {
MensagemEmail mensagem = new MensagemEmail(Integer.parseInt(ID_MODELO_EMAIL.trim()), new IDto[] {pastaDto});
if (empregados.getEmail() != null) {
mensagem.envia(empregados.getEmail(), "", remetente);
}
}
}
}
}
}
@Override
public Collection<PastaDTO> consultarPastasAtivas() throws ServiceException, Exception {
return this.getDao().consultarPastasAtivas();
}
@Override
public Collection<PastaDTO> listSubPastaByPerfilAcessoUsuario(PastaDTO pastaSuperior, UsuarioDTO usuario) throws Exception {
return this.getDao().listSubPastaByPerfilAcessoUsuario(pastaSuperior, usuario);
}
public Collection<PastaDTO> listPastasESubpastas(UsuarioDTO usuario) throws Exception {
Collection<PastaDTO> listPastasESubPastas = new ArrayList<PastaDTO>();
try {
Collection<PastaDTO> listPastasSuperior = getDao().listPastaByPerfilAcessoUsuario(usuario);
if (listPastasSuperior != null) {
for (PastaDTO pastaSuperior : listPastasSuperior) {
pastaSuperior.setNivel(0);
listPastasESubPastas.add(pastaSuperior);
Collection<PastaDTO> listPastaAux = listarSubPastas(pastaSuperior, 0, usuario);
if (listPastaAux != null && listPastaAux.size() > 0) {
listPastasESubPastas.addAll(listPastaAux);
}
}
}
return listPastasESubPastas;
} catch (Exception e) {
throw new ServiceException(e);
}
}
public Collection<PastaDTO> listPastasESubpastas() throws Exception {
Collection<PastaDTO> listPastasESubPastas = new ArrayList<PastaDTO>();
try {
Collection<PastaDTO> listPastaSuperiorSemPai = getDao().listPastaSuperiorSemPai();
if (listPastaSuperiorSemPai != null) {
for (PastaDTO pastaDto : listPastaSuperiorSemPai) {
pastaDto.setNivel(0);
listPastasESubPastas.add(pastaDto);
Collection<PastaDTO> listPastaAux = listarSubPastas(pastaDto, 0);
if (listPastaAux != null && listPastaAux.size() > 0) {
listPastasESubPastas.addAll(listPastaAux);
}
}
}
return listPastasESubPastas;
} catch (Exception e) {
throw new ServiceException(e);
}
}
/**
* Lista Subpastas da pasta informada.
*
* @param pastaSuperior
* @param nivel
* @return Collection<PastaDTO>
* @throws Exception
*/
public Collection<PastaDTO> listarSubPastas(PastaDTO pastaSuperior, Integer nivel) throws Exception {
Collection<PastaDTO> listSubPastas = getDao().listSubPastas(pastaSuperior);
Collection<PastaDTO> listSubpastasFinal = new ArrayList<PastaDTO>();
if (listSubPastas != null) {
for (PastaDTO pastaDto : listSubPastas) {
pastaDto.setNivel(nivel + 1);
listSubpastasFinal.add(pastaDto);
Collection<PastaDTO> listSubSubPasta = listarSubPastas(pastaDto, pastaDto.getNivel());
if (listSubSubPasta != null && listSubSubPasta.size() > 0) {
listSubpastasFinal.addAll(listSubSubPasta);
}
}
}
return listSubpastasFinal;
}
/**
* Lista Subpastas de acordo com o PERFILACESSO do USU�RIO.
*
* @param pastaSuperior
* @param nivel
* @return Collection<PastaDTO>
* @throws Exception
*/
public Collection<PastaDTO> listarSubPastas(PastaDTO pastaSuperior, Integer nivel, UsuarioDTO usuarioDto) throws Exception {
PerfilAcessoPastaDAO perfilAcessoPastaDao = new PerfilAcessoPastaDAO();
Collection<PastaDTO> listSubPastas = getDao().listSubPastas(pastaSuperior);
Collection<PastaDTO> listSubpastasFinal = new ArrayList<PastaDTO>();
if (listSubPastas != null) {
boolean aux = false;
for (PastaDTO subPasta : listSubPastas) {
if (subPasta.getHerdaPermissoes() != null && StringUtils.contains(subPasta.getHerdaPermissoes().toUpperCase().trim(), "S")) {
PastaDTO pastaDoadora = new PastaDTO();
pastaDoadora = this.obterHerancaDePermissao(subPasta);
PermissaoAcessoPasta permissao = perfilAcessoPastaDao.verificarPermissaoDeAcessoPasta(usuarioDto, pastaDoadora.getId());
if (permissao != null && !PermissaoAcessoPasta.SEMPERMISSAO.equals(permissao)) {
aux = true;
}
} else {
PermissaoAcessoPasta permissao = perfilAcessoPastaDao.verificarPermissaoDeAcessoPasta(usuarioDto, subPasta.getId());
if (permissao != null && !PermissaoAcessoPasta.SEMPERMISSAO.equals(permissao)) {
aux = true;
} else {
aux = false;
}
}
if (aux) {
subPasta.setNivel(nivel + 1);
listSubpastasFinal.add(subPasta);
Collection<PastaDTO> listSubSubPasta = listarSubPastas(subPasta, subPasta.getNivel(), usuarioDto);
if (listSubSubPasta != null && listSubSubPasta.size() > 0) {
listSubpastasFinal.addAll(listSubSubPasta);
}
}
}
}
return listSubpastasFinal;
}
public PastaDTO obterHerancaDePermissao(PastaDTO subPasta) throws ServiceException, LogicException {
if (subPasta != null && subPasta.getIdPastaPai() != null && subPasta.getHerdaPermissoes() != null
&& StringUtils.contains(subPasta.getHerdaPermissoes().toUpperCase().trim(), "S")) {
PastaDTO pastaPai = new PastaDTO();
pastaPai.setId(subPasta.getIdPastaPai());
pastaPai = (PastaDTO) this.restore(pastaPai);
if (pastaPai.getIdPastaPai() != null && subPasta.getHerdaPermissoes() != null && StringUtils.contains(subPasta.getHerdaPermissoes().toUpperCase().trim(), "S")) {
return obterHerancaDePermissao(pastaPai);
} else {
return pastaPai;
}
} else {
return subPasta;
}
}
@Override
public List<PastaDTO> listPastaByUsuario(UsuarioDTO usuario) throws Exception {
return this.getDao().listPastaByPerfilAcessoUsuario(usuario);
}
@Override
public boolean verificaSeExistePasta(PastaDTO pastaDTO) throws Exception {
return getDao().verificaSeExistePasta(pastaDTO);
}
/**
* Verifica se usu�rio possui acesso a pasta, considerando a sua hierarquia superior de pastas. Caso o usu�rio n�o possua acesso a alguma pasta superior, o usu�rio n�o possuir�
* acesso a subpasta
* informada.
*
* @param pastaDto
* @param usuarioDto
* @return true - se possuir acesso; false - se n�o possuir acesso.
* @throws ServiceException
* @throws Exception
*/
public boolean verificaPermissaoDeAcessoPasta(PastaDTO pastaDto, UsuarioDTO usuarioDto) throws ServiceException, Exception {
if (pastaDto.getIdPastaPai() != null && !StringUtils.isBlank(pastaDto.getIdPastaPai().toString())) {
boolean aux = false;
while (pastaDto.getIdPastaPai() != null && !StringUtils.isBlank(pastaDto.getIdPastaPai().toString())) {
if (this.verificarSeUsuarioPossuiAcessoPasta(pastaDto, usuarioDto)) {
pastaDto = retornaPastaPai(pastaDto);
aux = true;
} else {
return false;
}
}
aux = this.verificarSeUsuarioPossuiAcessoPasta(pastaDto, usuarioDto);
return aux;
} else {
return this.verificarSeUsuarioPossuiAcessoPasta(pastaDto, usuarioDto);
}
}
/**
* Verifica se Usu�rio possui acesso a pasta informada.
*
* @param pastaDto
* @param usuarioDto
* @return true - caso possua; false - se n�o possuir.
* @throws Exception
* @throws ServiceException
*/
public boolean verificarSeUsuarioPossuiAcessoPasta(PastaDTO pastaDto, UsuarioDTO usuarioDto) throws Exception {
return getDao().verificarSeUsuarioPossuiAcessoPasta(pastaDto, usuarioDto);
}
public PastaDTO retornaPastaPai(PastaDTO subPasta) throws ServiceException, Exception {
PastaDTO pastaSuperior = new PastaDTO();
pastaSuperior.setId(subPasta.getIdPastaPai());
pastaSuperior = (PastaDTO) this.getDao().restore(pastaSuperior);
return pastaSuperior;
}
public NotificacaoDTO criarNotificacao(PastaDTO pastaDto, TransactionControler transactionControler) throws ServiceException, Exception {
NotificacaoDTO notificacaoDto = new NotificacaoDTO();
NotificacaoService notificacaoService = (NotificacaoService) ServiceLocator.getInstance().getService(NotificacaoService.class, null);
if (transactionControler == null) {
transactionControler = new TransactionControlerImpl(getDao().getAliasDB());
transactionControler.start();
}
if (pastaDto.getIdNotificacao() != null) {
notificacaoDto.setIdNotificacao(pastaDto.getIdNotificacao());
notificacaoDto.setListaDeUsuario(pastaDto.getListaDeUsuario());
notificacaoDto.setListaDeGrupo(pastaDto.getListaDeGrupo());
notificacaoDto.setTitulo(pastaDto.getTitulo());
notificacaoDto.setTipoNotificacao(pastaDto.getTipoNotificacao());
notificacaoDto.setOrigemNotificacao(Enumerados.OrigemNotificacao.P.name());
notificacaoService.update(notificacaoDto, transactionControler);
return notificacaoDto;
} else {
notificacaoDto.setListaDeUsuario(pastaDto.getListaDeUsuario());
notificacaoDto.setListaDeGrupo(pastaDto.getListaDeGrupo());
notificacaoDto.setTitulo(pastaDto.getTitulo());
notificacaoDto.setTipoNotificacao(pastaDto.getTipoNotificacao());
notificacaoDto.setOrigemNotificacao(Enumerados.OrigemNotificacao.P.name());
return (NotificacaoDTO) notificacaoService.create(notificacaoDto, transactionControler);
}
}
@Override
public Collection listPastaSuperiorSemPai() throws Exception {
return this.getDao().listPastaSuperiorSemPai();
}
@Override
public Collection<PastaDTO> listPastaSuperiorFAQSemPai() throws Exception {
Collection<PastaDTO> listPastaSuperior = this.listPastaSuperiorSemPai();
Collection<PastaDTO> listPastaSuperiorFAQSemPai = new ArrayList<PastaDTO>();
if (listPastaSuperior != null && !listPastaSuperior.isEmpty()) {
for (PastaDTO pastaSuperior : listPastaSuperior) {
if (verificarSePastaOuSubPastaPossuiFAQ(pastaSuperior)) {
listPastaSuperiorFAQSemPai.add(pastaSuperior);
}
}
}
return listPastaSuperiorFAQSemPai;
}
public boolean verificarSePastaOuSubPastaPossuiFAQ(PastaDTO pastaDto) throws Exception {
boolean aux = getDao().verificarSePastaPossuiFaq(pastaDto);
if (aux) {
return true;
} else {
Collection<PastaDTO> subPastas = listSubPastas(pastaDto);
if (subPastas != null && !subPastas.isEmpty()) {
for (PastaDTO subPasta : subPastas) {
aux = verificarSePastaOuSubPastaPossuiFAQ(subPasta);
if (aux) {
return true;
}
}
return false;
} else {
return false;
}
}
}
public boolean verificarSePastaOuSubPastaPossuiErroConhecido(PastaDTO pastaDto) throws Exception {
boolean aux = getDao().verificarSePastaPossuiErroConhecido(pastaDto);
if (aux) {
return true;
} else {
Collection<PastaDTO> subPastas = listSubPastas(pastaDto);
if (subPastas != null && !subPastas.isEmpty()) {
for (PastaDTO subPasta : subPastas) {
aux = verificarSePastaOuSubPastaPossuiErroConhecido(subPasta);
if (aux) {
return true;
}
}
return false;
} else {
return false;
}
}
}
@Override
public Collection<PastaDTO> listSubPastas(PastaDTO pastaSuperior) throws Exception {
return getDao().listSubPastas(pastaSuperior);
}
@Override
public Collection<PastaDTO> listSubPastasFAQ(PastaDTO pasta) throws Exception {
Collection<PastaDTO> listSubPasta = getDao().listSubPastas(pasta);
Collection<PastaDTO> listSubPastasFAQ = new ArrayList();
if (listSubPasta != null && !listSubPasta.isEmpty()) {
for (PastaDTO subPasta : listSubPasta) {
if (verificarSePastaOuSubPastaPossuiFAQ(subPasta)) {
listSubPastasFAQ.add(subPasta);
}
}
}
return listSubPastasFAQ;
}
@Override
public Collection<PastaDTO> listPastaSuperiorErroConhecidoSemPai() throws Exception {
Collection<PastaDTO> listPastaSuperior = this.listPastaSuperiorSemPai();
Collection<PastaDTO> listPastaSuperiorErroConhecidoSemPai = new ArrayList<PastaDTO>();
if (listPastaSuperior != null && !listPastaSuperior.isEmpty()) {
for (PastaDTO pastaSuperior : listPastaSuperior) {
if (verificarSePastaOuSubPastaPossuiErroConhecido(pastaSuperior)) {
listPastaSuperiorErroConhecidoSemPai.add(pastaSuperior);
}
}
}
return listPastaSuperiorErroConhecidoSemPai;
}
@Override
public Collection<PastaDTO> listSubPastasErroConhecido(PastaDTO pasta) throws Exception {
Collection<PastaDTO> listSubPasta = getDao().listSubPastas(pasta);
Collection<PastaDTO> listSubPastasErroConhecido = new ArrayList();
if (listSubPasta != null && !listSubPasta.isEmpty()) {
for (PastaDTO subPasta : listSubPasta) {
if (verificarSePastaOuSubPastaPossuiErroConhecido(subPasta)) {
listSubPastasErroConhecido.add(subPasta);
}
}
}
return listSubPastasErroConhecido;
}
@Override
public PastaDTO idpastaPaiEHerdaDaPastaPai(Integer idPastaFilho) throws Exception {
return getDao().idpastaPaiEHerdaDaPastaPai(idPastaFilho);
}
}