package br.com.ec.controller.managedbean;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.inject.Inject;
import javax.inject.Named;
import org.springframework.context.annotation.Scope;
import br.com.ec.core.consulta.ParametrosConsulta;
import br.com.ec.core.generic.GenericService;
import br.com.ec.core.util.DataUtils;
import br.com.ec.core.util.VerificadorUtil;
import br.com.ec.domain.dto.PendenciaDTO;
import br.com.ec.domain.model.Loja;
import br.com.ec.domain.model.Pendencia;
import br.com.ec.domain.model.Perfil;
import br.com.ec.domain.model.Usuario;
import br.com.ec.domain.model.UsuarioLoja;
import br.com.ec.domain.model.UsuarioPerfil;
import br.com.ec.domain.service.loja.LojaService;
import br.com.ec.domain.service.pendencia.PendenciaService;
import br.com.ec.domain.service.seguranca.ContextoSeguranca;
import br.com.ec.domain.service.usuario.UsuarioService;
import br.com.ec.domain.shared.ConstantesSEC;
import br.com.ec.web.exception.VerificadorLancamentoException;
import br.com.ec.web.exception.VerificadorLancamentoException.CommandBean;
import br.com.ec.web.generic.AbstractBean;
import br.com.ec.web.message.LancadorMensagem;
@Named
@Scope
("view")
public class PendenciaBean
extends AbstractBean
<Pendencia
> implements Serializable {
private static final long serialVersionUID = 1L
;
private List<Pendencia
> pendencias
;
private List<Pendencia
> pendenciasSolicitadas
;
private List<PendenciaDTO
> pendenciasNaoLidasDTO
;
private List<PendenciaDTO
> pendenciasUltimasFinalizadasDTO
;
private Integer quantidadePendencias
;
private Integer quantidadePendenciasRespondidas
;
private PendenciaService pendenciaService
;
private LojaService lojaService
;
private Pendencia pendenciaSelecionado
;
private Loja lojaSelecionada
;
private String senhaUsuario
;
private UsuarioService usuarioService
;
private ContextoSeguranca contextoSeguranca
;
@Inject
public PendenciaBean
(PendenciaService pendenciaService, LojaService lojaService, UsuarioService usuarioService, ContextoSeguranca contextoSeguranca
) {
this.
pendenciaService = pendenciaService
;
this.
lojaService = lojaService
;
this.
usuarioService = usuarioService
;
this.
contextoSeguranca = contextoSeguranca
;
}
@
Override
public void preCarregamento
() {
limparEntidade
();
}
@
Override
public void limparEntidade
() {
entidade =
new Pendencia
();
entidade.
setLoja(getLojaSelecionada
());
entidade.
setIndicadorFinalizado(false);
parametrosConsulta =
new ParametrosConsulta
<Pendencia
>();
parametrosConsulta.
setEntidade(entidade
);
}
@
Override
public GenericService
<Pendencia
> getService
() {
return pendenciaService
;
}
@
Override
public Pendencia getEntidade
() {
return entidade
;
}
@
Override
public Pendencia getId
() {
return getEntidade
();
}
public List<Pendencia
> getPendencias
() {
if (VerificadorUtil.
estaNulo(pendencias
)) {
consultarPendencias
();
}
return pendencias
;
}
public void setPendencias
(List<Pendencia
> pendencias
) {
this.
pendencias = pendencias
;
}
public void consultarPendencias
() {
Usuario solicitante = contextoSeguranca.
obterUsuario();
Pendencia entidadeParaConsulta = preencherEntidadeParaConsulta
(solicitante
);
setPendencias
(pendenciaService.
consultarPassandoEntidade(entidadeParaConsulta,
0, pendenciaService.
obterQuantidadeDeRegistrosPassandoEntidade(entidadeParaConsulta
)));
entidadeParaConsulta.
setPerfisConsulta(null);
entidadeParaConsulta.
setUsuario(solicitante
);
setPendenciasSolicitadas
(pendenciaService.
consultarPassandoEntidade(entidadeParaConsulta,
0, pendenciaService.
obterQuantidadeDeRegistrosPassandoEntidade(entidadeParaConsulta
)));
setPendenciasNaoLidasDTO
(pendenciaService.
consultarPendenciasNaoLidas(entidadeParaConsulta
));
entidadeParaConsulta.
setIndicadorFinalizado(true);
setPendenciasUltimasFinalizadasDTO
(pendenciaService.
consultarUltimasPendenciasAtendidas(entidadeParaConsulta
));
}
private Pendencia preencherEntidadeParaConsulta
(Usuario solicitante
) {
Pendencia entidadeParaConsulta =
new Pendencia
();
List<Perfil
> perfisConsulta =
new ArrayList<Perfil
>();
List<Loja
> lojasConsulta =
new ArrayList<Loja
>();
for (UsuarioPerfil usuarioPerfil : solicitante.
getPerfis()) {
if (usuarioPerfil.
getPerfil().
getCodigo().
equals(ConstantesSEC.
PERFIL_ADMINISTRADOR_1)) {
entidadeParaConsulta.
setPerfilAdministradorConsulta(true);
break;
} else if (!usuarioPerfil.
getPerfil().
getCodigo().
equals(ConstantesSEC.
PERFIL_LOJA_9)){
perfisConsulta.
add(usuarioPerfil.
getPerfil());
}
if (usuarioPerfil.
getPerfil().
getCodigo().
equals(ConstantesSEC.
PERFIL_VENDEDOR_5) ||
usuarioPerfil.
getPerfil().
getCodigo().
equals(ConstantesSEC.
PERFIL_LOJA_9)) {
for (UsuarioLoja usuarioLoja : solicitante.
getLojas()) {
lojasConsulta.
add(usuarioLoja.
getLoja());
}
if (usuarioPerfil.
getPerfil().
getCodigo().
equals(ConstantesSEC.
PERFIL_LOJA_9)) {
perfisConsulta.
add(new Perfil
(ConstantesSEC.
PERFIL_VENDEDOR_5));
}
}
}
entidadeParaConsulta.
setDescricao(getEntidade
().
getDescricao());
entidadeParaConsulta.
setData(getEntidade
().
getData());
entidadeParaConsulta.
setIndicadorFinalizado(getEntidade
().
getIndicadorFinalizado());
entidadeParaConsulta.
setLoja(getEntidade
().
getLoja());
entidadeParaConsulta.
setPerfil(getEntidade
().
getPerfil());
entidadeParaConsulta.
setPerfisConsulta(perfisConsulta
);
entidadeParaConsulta.
setLojasConsulta(lojasConsulta
);
return entidadeParaConsulta
;
}
public List<Pendencia
> getPendenciasSolicitadas
() {
return pendenciasSolicitadas
;
}
public void setPendenciasSolicitadas
(List<Pendencia
> pendenciasSolicitadas
) {
this.
pendenciasSolicitadas = pendenciasSolicitadas
;
}
public List<PendenciaDTO
> getPendenciasNaoLidasDTO
() {
return pendenciasNaoLidasDTO
;
}
public void setPendenciasNaoLidasDTO
(List<PendenciaDTO
> pendenciasNaoLidasDTO
) {
this.
pendenciasNaoLidasDTO = pendenciasNaoLidasDTO
;
}
public List<PendenciaDTO
> getPendenciasUltimasFinalizadasDTO
() {
return pendenciasUltimasFinalizadasDTO
;
}
public void setPendenciasUltimasFinalizadasDTO
(List<PendenciaDTO
> pendenciasUltimasFinalizadasDTO
) {
this.
pendenciasUltimasFinalizadasDTO = pendenciasUltimasFinalizadasDTO
;
}
public Pendencia getPendenciaSelecionado
() {
return pendenciaSelecionado
;
}
public void setPendenciaSelecionado
(Pendencia pendenciaSelecionado
) {
this.
pendenciaSelecionado = pendenciaSelecionado
;
}
public Loja getLojaSelecionada
() {
if (VerificadorUtil.
estaNulo(lojaSelecionada
)) {
if (VerificadorUtil.
naoEstaNulo(getParametro
("sequencialLoja"))) {
Loja loja =
new Loja
();
loja.
setSequencial(new Long(getParametro
("sequencialLoja").
toString()));
lojaSelecionada = lojaService.
consultarPorId(loja
);
}
}
return lojaSelecionada
;
}
public void setLojaSelecionada
(Loja lojaSelecionada
) {
this.
lojaSelecionada = lojaSelecionada
;
}
public Integer quantidadePendenciasNaoFinalizadas
(Loja loja
) {
return pendenciaService.
quantidadePendenciasNaoFinalizadas(loja
);
}
public String getSenhaUsuario
() {
return senhaUsuario
;
}
public void setSenhaUsuario
(String senhaUsuario
) {
this.
senhaUsuario = senhaUsuario
;
}
@
Override
public void cadastrar
() {
new VerificadorLancamentoException
().
tratarIhRelancarExcecaoSemLimparEntidade(new CommandBean
() {
public void execute
() {
if (VerificadorUtil.
naoEstaNulo(getLojaSelecionada
())) {
getEntidade
().
setLoja(getLojaSelecionada
());
}
Usuario usuario = verificarSenhaUsuario
();
usuarioService.
naoPermitirPerfilLoja(usuario
);
getEntidade
().
setUsuario(usuario
);
setSenhaUsuario
("");
}
});
super.
cadastrar();
consultarPendencias
();
}
private Usuario verificarSenhaUsuario
() {
return usuarioService.
consultarUsuarioPorSenha(getSenhaUsuario
());
}
@
Override
public void alterar
() {
super.
alterar();
consultarPendencias
();
}
public void finalizar
(final Pendencia pendencia
) {
new VerificadorLancamentoException
().
tratarIhRelancarExcecaoSemLimparEntidade(new CommandBean
() {
public void execute
() {
pendencia.
setDataFinalizado(DataUtils.
getDataAtual());
Usuario usuarioResposta = verificarSenhaUsuario
();
usuarioService.
naoPermitirPerfilLoja(usuarioResposta
);
pendencia.
setUsuarioResposta(usuarioResposta
);
setSenhaUsuario
("");
getService
().
alterar(pendencia
);
limparEntidade
();
consultarPendencias
();
LancadorMensagem.
lancarSucesso("Pendência finalizada com sucesso!");
}
});
}
public void reativar
(final Long sequenciaPendencia
) {
new VerificadorLancamentoException
().
tratarIhRelancarExcecaoSemLimparEntidade(new CommandBean
() {
public void execute
() {
Pendencia pendencia =
new Pendencia
();
pendencia.
setSequencial(sequenciaPendencia
);
pendencia = getService
().
consultarPorId(pendencia
);
pendencia.
setDescricao("REATIVADA: " + pendencia.
getDescricao());
pendencia.
setIndicadorFinalizado(false);
pendencia.
setDataFinalizado(null);
pendencia.
setUsuarioResposta(null);
pendencia.
setResposta(null);
getService
().
alterar(pendencia
);
consultarPendencias
();
LancadorMensagem.
lancarSucesso("Pendência solicitada novamente!");
}
});
}
public void excluir
(final Pendencia pendencia
) {
new VerificadorLancamentoException
().
tratarIhRelancarExcecaoSemLimparEntidade(new CommandBean
() {
public void execute
() {
getService
().
excluir(pendencia
);
consultarPendencias
();
LancadorMensagem.
lancarSucesso("Pendência excluída com sucesso!");
}
});
}
public void lerPendencia
(final Long sequencialPendencia
) {
new VerificadorLancamentoException
().
tratarIhRelancarExcecaoSemLimparEntidade(new CommandBean
() {
public void execute
() {
pendenciaService.
lerRepostaPendencia(sequencialPendencia
);
consultarPendencias
();
LancadorMensagem.
lancarSucesso("Resposta de pendência lida com sucesso!");
}
});
}
public Integer getQuantidadePendencias
() {
if (VerificadorUtil.
estaNulo(quantidadePendencias
)) {
Usuario solicitante = contextoSeguranca.
obterUsuario();
Pendencia entidadeParaConsulta = preencherEntidadeParaConsulta
(solicitante
);
if (entidadeParaConsulta.
getPerfisConsulta().
isEmpty()) {
for (UsuarioPerfil usuarioPerfil : solicitante.
getPerfis()) {
if (usuarioPerfil.
getPerfil().
getCodigo().
equals(ConstantesSEC.
PERFIL_ADMINISTRADOR_1)) {
entidadeParaConsulta.
getPerfisConsulta().
add(usuarioPerfil.
getPerfil());
entidadeParaConsulta.
setPerfilAdministradorConsulta(true);
break;
}
}
}
entidadeParaConsulta.
setUsuario(null);
entidadeParaConsulta.
setIndicadorFinalizado(false);
setQuantidadePendencias
(pendenciaService.
obterQuantidadeDeRegistrosPassandoEntidade(entidadeParaConsulta
));
}
return quantidadePendencias
;
}
public void setQuantidadePendencias
(Integer quantidadePendencias
) {
this.
quantidadePendencias = quantidadePendencias
;
}
public Integer getQuantidadePendenciasRespondidas
() {
if (VerificadorUtil.
estaNulo(quantidadePendenciasRespondidas
)) {
Usuario solicitante = contextoSeguranca.
obterUsuario();
Date dataFinalizacao = DataUtils.
acrescentarDias(DataUtils.
getDataAtual(), -
7);
setQuantidadePendenciasRespondidas
(pendenciaService.
obterQuantidadePendenciasRespondidasNaoLidas(solicitante, dataFinalizacao
));
}
return quantidadePendenciasRespondidas
;
}
public void setQuantidadePendenciasRespondidas
(Integer quantidadePendenciasRespondidas
) {
this.
quantidadePendenciasRespondidas = quantidadePendenciasRespondidas
;
}
}