package gcom.gui.atendimentopublico.registroatendimento;
import gcom.atendimentopublico.registroatendimento.AtendimentoMotivoEncerramento;
import gcom.atendimentopublico.registroatendimento.RaEncerramentoComando;
import gcom.atendimentopublico.registroatendimento.SolicitacaoTipoEspecificacao;
import gcom.cadastro.sistemaparametro.SistemaParametro;
import gcom.cadastro.unidade.FiltroUnidadeOrganizacional;
import gcom.cadastro.unidade.UnidadeOrganizacional;
import gcom.fachada.Fachada;
import gcom.gui.ActionServletException;
import gcom.gui.GcomAction;
import gcom.seguranca.acesso.usuario.FiltroUsuario;
import gcom.seguranca.acesso.usuario.Usuario;
import gcom.util.ConstantesSistema;
import gcom.util.Util;
import gcom.util.filtro.ParametroSimples;
import java.util.ArrayList;
import java.util.Collection;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
/**
* Action que comanda o encerramento dos registros de atendimentos
* [UC0735] Comandar Encerramento de Registros de Atendimento
*
* @author Rafael Corr�a, Pedro Alexandre
* @since 25/01/2008, 10/06/2008
*/
public class ComandarEncerramentoRegistroAtendimentoAction extends GcomAction {
/**
*
* @param actionMapping
* @param actionForm
* @param httpServletRequest
* @param httpServletResponse
* @return
*/
public ActionForward execute(ActionMapping actionMapping,
ActionForm actionForm, HttpServletRequest httpServletRequest,
HttpServletResponse httpServletResponse) {
// Seta o mapeamento de retorno
ActionForward retorno = actionMapping.findForward("telaSucesso");
Fachada fachada = Fachada.getInstancia();
SistemaParametro sistemaParametros = fachada.pesquisarParametrosDoSistema();
ComandarEncerramentoRegistroAtendimentoActionForm form = (ComandarEncerramentoRegistroAtendimentoActionForm)actionForm;
//HttpSession sessao = httpServletRequest.getSession(false);
FiltroUnidadeOrganizacional filtroCentralAtendimento = new FiltroUnidadeOrganizacional();
filtroCentralAtendimento.adicionarParametro(new ParametroSimples(FiltroUnidadeOrganizacional.INDICADOR_CENTRAL_ATENDIMENTO, ConstantesSistema.SIM));
Collection colecaoCentralAtendimento = fachada.pesquisar(filtroCentralAtendimento, UnidadeOrganizacional.class.getName());
UnidadeOrganizacional centralAtendimento = (UnidadeOrganizacional) Util.retonarObjetoDeColecao(colecaoCentralAtendimento);
RaEncerramentoComando raEncerramentoComando = new RaEncerramentoComando();
String periodoAtendimentoInicial = form.getDataAtendimentoInicial();
if (periodoAtendimentoInicial != null && !periodoAtendimentoInicial.trim().equals("")) {
raEncerramentoComando.setDataAtendimentoInicial(Util.converteStringParaDate(periodoAtendimentoInicial));
}
String periodoAtendimentoFinal = form.getDataAtendimentoFinal();
if (periodoAtendimentoFinal != null && !periodoAtendimentoFinal.trim().equals("")) {
raEncerramentoComando.setDataAtendimentoFinal(Util.converteStringParaDate(periodoAtendimentoFinal));
}
String idMotivoEncerramento = form.getMotivoEncerramento();
if (idMotivoEncerramento != null && !idMotivoEncerramento.equals("" + ConstantesSistema.NUMERO_NAO_INFORMADO)) {
AtendimentoMotivoEncerramento atendimentoMotivoEncerramento = new AtendimentoMotivoEncerramento();
atendimentoMotivoEncerramento.setId(new Integer(idMotivoEncerramento));
raEncerramentoComando.setAtendimentoMotivoEncerramento(atendimentoMotivoEncerramento);
}
Usuario usuarioResponsavelEncerramento = null;
String idUsuario = form.getIdUsuario();
if (idUsuario != null && !idUsuario.trim().equals("")) {
FiltroUsuario filtroUsuario = new FiltroUsuario();
filtroUsuario.adicionarCaminhoParaCarregamentoEntidade("unidadeOrganizacional");
filtroUsuario.adicionarParametro(new ParametroSimples(FiltroUsuario.ID, idUsuario));
Collection<Usuario> colecaoUsuarios = fachada.pesquisar(filtroUsuario, Usuario.class.getName());
if (colecaoUsuarios == null || colecaoUsuarios.isEmpty()) {
throw new ActionServletException("atencao.pesquisa_inexistente", null, "Usu�rio");
}
usuarioResponsavelEncerramento = (Usuario) Util.retonarObjetoDeColecao(colecaoUsuarios);
raEncerramentoComando.setUsuario(usuarioResponsavelEncerramento);
}
String idUnidadeAtendimento = form.getIdUnidadeAtendimento();
if (idUnidadeAtendimento != null && !idUnidadeAtendimento.trim().equals("")) {
FiltroUnidadeOrganizacional filtroUnidadeOrganizacional = new FiltroUnidadeOrganizacional();
filtroUnidadeOrganizacional.adicionarParametro(new ParametroSimples(FiltroUnidadeOrganizacional.ID, idUnidadeAtendimento));
Collection<UnidadeOrganizacional> colecaoUnidadesAtendimento = fachada.pesquisar(filtroUnidadeOrganizacional, UnidadeOrganizacional.class.getName());
if (colecaoUnidadesAtendimento == null || colecaoUnidadesAtendimento.isEmpty()) {
throw new ActionServletException("atencao.pesquisa_inexistente", null, "Unidade de Atendimento");
}
UnidadeOrganizacional unidadeAtendimento = (UnidadeOrganizacional) Util.retonarObjetoDeColecao(colecaoUnidadesAtendimento);
raEncerramentoComando.setUnidadeOrganizacionalAtendimento(unidadeAtendimento);
}
String idUnidadeAtual = form.getIdUnidadeAtual();
if (idUnidadeAtual != null && !idUnidadeAtual.trim().equals("")) {
FiltroUnidadeOrganizacional filtroUnidadeOrganizacional = new FiltroUnidadeOrganizacional();
filtroUnidadeOrganizacional.adicionarCaminhoParaCarregamentoEntidade("unidadeSuperior");
filtroUnidadeOrganizacional.adicionarParametro(new ParametroSimples(FiltroUnidadeOrganizacional.ID, idUnidadeAtual));
Collection<UnidadeOrganizacional> colecaoUnidadesAtual = fachada.pesquisar(filtroUnidadeOrganizacional, UnidadeOrganizacional.class.getName());
if (colecaoUnidadesAtual == null || colecaoUnidadesAtual.isEmpty()) {
throw new ActionServletException("atencao.pesquisa_inexistente", null, "Unidade Atual");
}
UnidadeOrganizacional unidadeAtual = (UnidadeOrganizacional) Util.retonarObjetoDeColecao(colecaoUnidadesAtual);
raEncerramentoComando.setUnidadeOrganizacionalAtual(unidadeAtual);
}
String idUnidadeSuperior = form.getIdUnidadeSuperior();
if (idUnidadeSuperior != null && !idUnidadeSuperior.trim().equals("")) {
FiltroUnidadeOrganizacional filtroUnidadeOrganizacional = new FiltroUnidadeOrganizacional();
filtroUnidadeOrganizacional.adicionarCaminhoParaCarregamentoEntidade("unidadeSuperior");
filtroUnidadeOrganizacional.adicionarParametro(new ParametroSimples(FiltroUnidadeOrganizacional.ID, idUnidadeSuperior));
Collection<UnidadeOrganizacional> colecaoUnidadeSuperior = fachada.pesquisar(filtroUnidadeOrganizacional, UnidadeOrganizacional.class.getName());
if (colecaoUnidadeSuperior == null || colecaoUnidadeSuperior.isEmpty()) {
throw new ActionServletException("atencao.pesquisa_inexistente", null, "Unidade Superior");
}
UnidadeOrganizacional unidadeSuperior = (UnidadeOrganizacional) Util.retonarObjetoDeColecao(colecaoUnidadeSuperior);
raEncerramentoComando.setUnidadeOrganizacionalSuperior(unidadeSuperior);
//[FS0006] - Verificar exist�ncia de unidades subordinadas
filtroUnidadeOrganizacional = new FiltroUnidadeOrganizacional();
filtroUnidadeOrganizacional.limparListaParametros();
filtroUnidadeOrganizacional.adicionarParametro(new ParametroSimples(FiltroUnidadeOrganizacional.ID_UNIDADE_SUPERIOR, idUnidadeSuperior));
Collection<UnidadeOrganizacional> colecaoUnidadeSubordinadas = fachada.pesquisar(filtroUnidadeOrganizacional, UnidadeOrganizacional.class.getName());
if(colecaoUnidadeSubordinadas == null || colecaoUnidadeSubordinadas.isEmpty()){
throw new ActionServletException("atencao.nao.existe.unidades.subordinadas");
}
}
String[] idsEspecificacoes = form.getIdsSolicitacaoTipoEspecificcacoes();
Collection<SolicitacaoTipoEspecificacao> colecaoEspecificacoes = new ArrayList<SolicitacaoTipoEspecificacao>();
if (idsEspecificacoes != null) {
for (int i = 0; i < idsEspecificacoes.length; i++) {
String idEspecificacao = idsEspecificacoes[i];
if (idEspecificacao != null && !idEspecificacao.trim().equals("") && !idEspecificacao.trim().equals("" + ConstantesSistema.NUMERO_NAO_INFORMADO)) {
SolicitacaoTipoEspecificacao especificacao = new SolicitacaoTipoEspecificacao();
especificacao.setId(new Integer(idEspecificacao));
colecaoEspecificacoes.add(especificacao);
}
}
}
//[SB0009 - Verificar permiss�o do usu�rio]
this.verificarPermissaoUsuario(usuarioResponsavelEncerramento,raEncerramentoComando.getUnidadeOrganizacionalAtual(),raEncerramentoComando.getUnidadeOrganizacionalSuperior(), sistemaParametros, centralAtendimento);
//chama o met�do principal para comandar o encerramento das RA's
Integer id = fachada.comandarEncerramentoRA(raEncerramentoComando, colecaoEspecificacoes, usuarioResponsavelEncerramento);
// Monta a p�gina de sucesso de acordo com o padr�o do sistema.
montarPaginaSucesso(httpServletRequest, "Comando de Encerramento de Registros de Atendimento "
+ id.toString()
+ " comandado com sucesso.",
"Comandar outro Encerramento de Registros de Atendimento",
"exibirComandarEncerramentoRegistroAtendimentoAction.do?menu=sim");
return retorno;
}
/**
* [FS0009] - Verificar permiss�o do usu�rio
*
* @author Pedro Alexandre
* @date 30/06/2008
*
* @param usuario
* @param unidadeAtual
* @param unidadeSuperior
* @param sistemaParametros
* @param centralAtendimento
*/
private void verificarPermissaoUsuario(Usuario usuario, UnidadeOrganizacional unidadeAtual, UnidadeOrganizacional unidadeSuperior,SistemaParametro sistemaParametros, UnidadeOrganizacional centralAtendimento){
UnidadeOrganizacional presidencia = sistemaParametros.getUnidadeOrganizacionalIdPresidencia();
UnidadeOrganizacional lotacaoUsuario = usuario.getUnidadeOrganizacional();
boolean flagPresidencial = true;
boolean flagCentralAtendimento = true;
Short indicadorUnidadeSuperior = ConstantesSistema.NAO;
if(lotacaoUsuario == null || !lotacaoUsuario.getId().equals(presidencia.getId())){
flagPresidencial = false;
}
if(centralAtendimento == null || !lotacaoUsuario.getId().equals(centralAtendimento.getId())){
flagCentralAtendimento = false;
}
if(unidadeAtual == null && unidadeSuperior == null){
if(!flagPresidencial && !flagCentralAtendimento ){
throw new ActionServletException("atencao.usuario.responsavel.sem.autorizacao");
}
}else if(unidadeAtual != null){
if(!lotacaoUsuario.getId().equals(unidadeAtual.getId())){
//[SB0010 - Verificar Exist�ncia de Unidade Superior]
indicadorUnidadeSuperior = this.verificarUnidadeSuperior(unidadeAtual,lotacaoUsuario);
if(indicadorUnidadeSuperior.equals(ConstantesSistema.NAO)){
throw new ActionServletException("atencao.usuario.responsavel.sem.autorizacao.unidade.atual");
}
}
}else if(unidadeSuperior != null){
if(!lotacaoUsuario.getId().equals(unidadeSuperior.getId())){
//[SB0010 - Verificar Exist�ncia de Unidade Superior]
indicadorUnidadeSuperior = this.verificarUnidadeSuperior(unidadeSuperior,lotacaoUsuario);
if(indicadorUnidadeSuperior.equals(ConstantesSistema.NAO)){
throw new ActionServletException("atencao.usuario.responsavel.sem.autorizacao.unidade.superior");
}
}
}
}
/**
* [SB0010 - Verificar Exist�ncia de Unidade Superior]
*
* @author Pedro Alexandre
* @date 01/07/2008
*
* @param idUnidadeOrganizacional
*/
private UnidadeOrganizacional verificarExistenciaUnidadeSuperior(Integer idUnidadeOrganizacional){
Fachada fachada = Fachada.getInstancia();
FiltroUnidadeOrganizacional filtroUnidadeOrganizacional = new FiltroUnidadeOrganizacional();
filtroUnidadeOrganizacional.adicionarCaminhoParaCarregamentoEntidade("unidadeSuperior");
filtroUnidadeOrganizacional.adicionarParametro(new ParametroSimples(FiltroUnidadeOrganizacional.ID, idUnidadeOrganizacional));
Collection<UnidadeOrganizacional> colecaoUnidadesAtual = fachada.pesquisar(filtroUnidadeOrganizacional, UnidadeOrganizacional.class.getName());
UnidadeOrganizacional unidadeSuperior = (UnidadeOrganizacional) Util.retonarObjetoDeColecao(colecaoUnidadesAtual);
if(unidadeSuperior.getUnidadeSuperior() != null && unidadeSuperior.getUnidadeSuperior().getId().intValue() != 0){
return unidadeSuperior.getUnidadeSuperior();
}
return null;
}
/**
* [SB0001] - Verificar Unidade Superior
*
* @author Pedro Alexandre
* @date 01/07/2008
*
* @param unidadeReferencial
* @param lotacaoUsuario
* @return
*/
private Short verificarUnidadeSuperior(UnidadeOrganizacional unidadeReferencial, UnidadeOrganizacional lotacaoUsuario){
Short retorno = ConstantesSistema.NAO;
UnidadeOrganizacional unidadeSuperior = unidadeReferencial.getUnidadeSuperior();
if(lotacaoUsuario.getId().equals(unidadeSuperior.getId())){
retorno = ConstantesSistema.SIM;
return retorno;
}
while(true){
unidadeSuperior = this.verificarExistenciaUnidadeSuperior(unidadeSuperior.getId());
if(unidadeSuperior == null){
return retorno;
}
if(lotacaoUsuario.getId().equals(unidadeSuperior.getId())){
retorno = ConstantesSistema.SIM;
return retorno;
}
}
}
}