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<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
() {
Pendencia entidadeParaConsulta = preencherEntidadeParaConsulta
();
setPendencias
(pendenciaService.
consultarPassandoEntidade(entidadeParaConsulta,
0, pendenciaService.
obterQuantidadeDeRegistrosPassandoEntidade(entidadeParaConsulta
)));
entidadeParaConsulta.
setIndicadorFinalizado(true);
setPendenciasUltimasFinalizadasDTO
(pendenciaService.
consultarUltimasPendenciasAtendidas(entidadeParaConsulta
));
}
private Pendencia preencherEntidadeParaConsulta
() {
List<Perfil
> perfis =
new ArrayList<Perfil
>();
Pendencia entidadeParaConsulta =
new Pendencia
();
Boolean perfilAdministrador =
false;
Usuario solicitante = contextoSeguranca.
obterUsuario();
Boolean temPerfilVendedor =
false;
List<Loja
> lojasConsulta =
new ArrayList<Loja
>();
for (UsuarioPerfil usuarioPerfil : solicitante.
getPerfis()) {
if (usuarioPerfil.
getPerfil().
getCodigo().
equals(ConstantesSEC.
PERFIL_ADMINISTRADOR_1)) {
perfilAdministrador =
true;
}
if (!perfilAdministrador
) {
if (usuarioPerfil.
getPerfil().
getCodigo().
equals(ConstantesSEC.
PERFIL_VENDEDOR_5)) {
for (UsuarioLoja usuarioLoja : solicitante.
getLojas()) {
lojasConsulta.
add(usuarioLoja.
getLoja());
}
temPerfilVendedor =
true;
} else {
perfis.
add(usuarioPerfil.
getPerfil());
}
}
}
if (temPerfilVendedor
) {
entidadeParaConsulta.
setLojasConsulta(lojasConsulta
);
}
entidadeParaConsulta.
setPerfisConsulta(perfis
);
entidadeParaConsulta.
setUsuario(solicitante
);
entidadeParaConsulta.
setIndicadorFinalizado(getEntidade
().
getIndicadorFinalizado());
entidadeParaConsulta.
setLoja(getEntidade
().
getLoja());
entidadeParaConsulta.
setPerfil(getEntidade
().
getPerfil());
entidadeParaConsulta.
setData(getEntidade
().
getData());
return entidadeParaConsulta
;
}
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
();
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
();
pendencia.
setUsuarioResposta(usuarioResposta
);
setSenhaUsuario
("");
getService
().
alterar(pendencia
);
limparEntidade
();
consultarPendencias
();
LancadorMensagem.
lancarSucesso("Pendência finalizada com sucesso!");
}
});
}
public void aguardar
(final Pendencia pendencia
) {
new VerificadorLancamentoException
().
tratarIhRelancarExcecaoSemLimparEntidade(new CommandBean
() {
public void execute
() {
pendencia.
setIndicadorFinalizado(false);
getService
().
alterar(pendencia
);
consultarPendencias
();
LancadorMensagem.
lancarSucesso("Pendência ativa 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
)) {
/*
Pendencia entidadeParaConsulta = new Pendencia();
List<Perfil> perfis = new ArrayList<Perfil>();
Usuario solicitante = contextoSeguranca.obterUsuario();
if (VerificadorUtil.naoEstaNulo(solicitante)) {
for (UsuarioPerfil usuarioPerfil : solicitante.getPerfis()) {
perfis.add(usuarioPerfil.getPerfil());
}
}
entidadeParaConsulta.setPerfisConsulta(perfis);
*/
Pendencia entidadeParaConsulta = preencherEntidadeParaConsulta
();
if (entidadeParaConsulta.
getPerfisConsulta().
isEmpty()) {
Usuario solicitante = contextoSeguranca.
obterUsuario();
for (UsuarioPerfil usuarioPerfil : solicitante.
getPerfis()) {
if (usuarioPerfil.
getPerfil().
getCodigo().
equals(ConstantesSEC.
PERFIL_ADMINISTRADOR_1)) {
entidadeParaConsulta.
getPerfisConsulta().
add(usuarioPerfil.
getPerfil());
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
;
}
}