/*
* Sistema de Ouvidoria: um canal através do qual os usuários
* podem encaminhar suas reclamações, elogios e sugestões.
*
* Copyright (C) 2011 SERPRO
*
* Este programa é software livre; você pode redistribuí-lo e/ou
* modificá-lo sob os termos da Licença Pública Geral GNU, conforme
* publicada pela Free Software Foundation; tanto a versão 2 da
* Licença como (a seu critério) qualquer versão mais nova.
*
* Este programa é distribuído na expectativa de ser útil, mas SEM
* QUALQUER GARANTIA; sem mesmo a garantia implícita de
* COMERCIALIZAÇÃO ou de ADEQUAÇÃO A QUALQUER PROPÓSITO EM
* PARTICULAR. Consulte a Licença Pública Geral GNU para obter mais
* detalhes.
*
* Você deve ter recebido uma cópia da Licença Pública Geral GNU,
* sob o título "LICENCA.txt", junto com esse programa. Se não,
* acesse o Portal do Software Público Brasileiro no endereço
* http://www.softwarepublico.gov.br/ ou escreva para a Fundação do
* Software Livre (FSF) Inc., 51 Franklin St, Fifth Floor, Boston,
* MA 02111-1301, USA.
*
* Contatos através do seguinte endereço internet:
* http://www.serpro.gov.br/sistemaouvidoria/
*/
package br.gov.serpro.ouvidoria.struts.action.andamento;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
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;
import org.apache.struts.action.ActionMessage;
import org.apache.struts.action.ActionMessages;
import org.apache.struts.action.DynaActionForm;
import org.hibernate.Query;
import org.hibernate.Session;
import br.gov.serpro.ouvidoria.controller.AcionamentoCtrl;
import br.gov.serpro.ouvidoria.controller.gerencial.administracao.FuncionarioCtrl;
import br.gov.serpro.ouvidoria.dao.DaoException;
import br.gov.serpro.ouvidoria.dao.hibernate.HibernateDao;
import br.gov.serpro.ouvidoria.model.Acionamento;
import br.gov.serpro.ouvidoria.model.ConsultaAndamento;
import br.gov.serpro.ouvidoria.model.Funcionario;
import br.gov.serpro.ouvidoria.model.Orgao;
import br.gov.serpro.ouvidoria.struts.ActionSupport;
import br.gov.serpro.ouvidoria.util.Constants;
import br.gov.serpro.ouvidoria.util.HibernateSessionFactory;
import br.gov.serpro.ouvidoria.util.Utilitario;
/**
* Objetivo: Ouvidor Geral e Ouvidor Assistente solicita consultar o andamento de uma
* mensagem. Para isso ele informa um ou mais dos itens abaixo:
* <ul>
* <li>O tipo da mensagem</li>
* <li>Tipo do assunto</li>
* <li>O número do protocolo</li>
* <li>Palavras chaves para busca</li>
* <li>Período de cadastramento</li>
* </ul>
*
* @author SERPRO
* @version $Revision: 1.1.2.4 $, $Date: 2011/11/11 21:09:55 $
* @version 0.1, 2004/12/15
*/
public class ConsultarAndamentoSolucaoAction extends ActionSupport {
private List filtrarPalavraChave(List lstAcionamento,String palavraChave)
{
Iterator iterator = lstAcionamento.iterator();
ArrayList list = new ArrayList();
while (iterator.hasNext())
{
ConsultaAndamento consultaAndamento = (ConsultaAndamento)iterator.next();
if (((consultaAndamento.getTitulo()!=null) && (consultaAndamento.getTitulo().trim()!= "")) ||
((consultaAndamento.getDescricao()!=null) && (consultaAndamento.getDescricao().trim()!= "")))
{
String tituloDec = new String(Utilitario.decrypt(Constants.DES_KEY, consultaAndamento.getTitulo()));
String textoDec = new String(Utilitario.decrypt(Constants.DES_KEY, consultaAndamento.getDescricao()));
String titulo = new String(tituloDec==null?"":tituloDec);
String texto = new String(textoDec==null?"":textoDec);
String chave = titulo + texto;
if (chave.toLowerCase().indexOf(palavraChave.toLowerCase())==-1)
list.add(consultaAndamento);
}
else
list.add(consultaAndamento);
}
lstAcionamento.removeAll(list);
return lstAcionamento;
}
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception {
ActionMessages errors = new ActionMessages();
try {
//obter do Form os dados para pesquisa
DynaActionForm _form = (DynaActionForm) form;
String periodoI = _form.getString("txt_periodo_i");
String periodoF = _form.getString("txt_periodo_f");
String assuntoId = _form.getString("sel_assunto");
String tipoMensagemId = _form.getString("sel_tipo_mensagem");
String estadoAcionamento = _form.getString("sel_situacao_mensagem");
String sProtocolo = _form.getString("txt_protocolo");
String palavraChave = Utilitario.trataPlic(_form.getString("txt_palavra_chave"));
// Recupera o Funcionário logado
Long funcionarioId = (Long) request.getSession().getAttribute(Constants.PA_FUNCIONARIO);
FuncionarioCtrl funcionarioCtrl = new FuncionarioCtrl(getDaoFactory());
Funcionario func = (Funcionario) funcionarioCtrl.get(funcionarioId);
// Recupera o órgão do funcionário
Orgao orgao = getOrgao(request);
//obter os assuntos sob a responsabilidade do funcionário
Collection assuntosFuncionario = null;
if ( func.getNivelAtuacao() == Funcionario.NA_SUB_ORGAO ) {
assuntosFuncionario = func.getListaAssuntosComAtuacao("Ambos");
} else if ( func.getNivelAtuacao() == Funcionario.NA_ORGAO ) {
assuntosFuncionario = orgao.getListaTodosAssuntos();
}
/**
* ESTE MÉTODO AINDA NÃO ESTÁ FUNCIONANDO 100%. INVESTIGAR PROBLEMA:
* Caused by: line 1:41: expecting EQ, found '.'
* */
//montar consulta HQL
StringBuffer hql = new StringBuffer();
hql.append("Select new br.gov.serpro.ouvidoria.model.ConsultaAndamento(a.id,");
hql.append(" a.dataPrevistaResolucaoExterna, a.estadoAcionamento.descricao,");
hql.append(" ass.descricao, a.numeroProtocolo,");
hql.append(" a.dataPrevistaResolucaoInterna, a.funcionario.nome, a.estadoAcionamento.id ");
// Caso o filtro tenha sido preenchido
if (!palavraChave.trim().equals("")) {
hql.append(", a.respostaAcionamento.titulo, a.respostaAcionamento.texto ) ");
} else {
hql.append(" )");
}
hql.append(" from Acionamento as a ");
hql.append(" inner join a.funcionario as f ");
hql.append(" inner join a.mensagem as m ");
hql.append(" inner join m.assunto as ass ");
hql.append(" inner join a.estadoAcionamento as ea ");
if (!palavraChave.trim().equals(""))
hql.append(" left outer join a.respostaAcionamento as resp ");
hql.append(" where ass in (:assuntos) ");
//assunto
if ( assuntoId != null && !"".equals(assuntoId) && !"0".equals(assuntoId) ) {
hql.append(" and ass.id = :assId ");
}
//tipo de mensagem
if ( tipoMensagemId != null && !"".equals(tipoMensagemId) && !"0".equals(tipoMensagemId) ) {
hql.append(" and m.tipoMensagem.id = :tipoMsgId ");
}
//período (data inicial e data final)
if ( periodoI != null && !"".equals(periodoI) ) {
hql.append(" and a.dataAcionamento >= :dataIni ");
}
if ( periodoF != null && !"".equals(periodoF) ) {
hql.append(" and a.dataAcionamento <= :dataFim ");
}
//protocolo
if ( sProtocolo != null && !"".equals(sProtocolo) && !"0".equals(sProtocolo) ) {
hql.append(" and a.numeroProtocolo = :numProtoc ");
}
//estado da mensagem
if ( !estadoAcionamento.equalsIgnoreCase("0") ) {
hql.append(" and a.estadoAcionamento.id = :estadoId ");
}
// obter o objeto DAO
HibernateDao acionamentoDao = (HibernateDao) getDaoFactory().create( Acionamento.class );
// montar a query Hibernate
Session session = HibernateSessionFactory.getFactory().getSession();
Query query = session.createQuery( hql.toString() );
SimpleDateFormat dateFormatter = new SimpleDateFormat( "dd/MM/yyyy HH:mm:ss" );
//configurar os parâmetros da query
query.setParameterList( "assuntos", assuntosFuncionario );
if ( assuntoId != null && !"".equals(assuntoId) && !"0".equals(assuntoId) ) {
//assunto
query.setInteger( "assId", Integer.parseInt( assuntoId ) );
}
if ( tipoMensagemId != null && !"".equals(tipoMensagemId) && !"0".equals(tipoMensagemId) ) {
//tipo de mensagem
query.setInteger( "tipoMsgId", Integer.parseInt( tipoMensagemId ) );
}
if ( periodoI != null && !"".equals(periodoI) ) {
//data inicial
periodoI = periodoI +" 00:00:00";
Date dataInit = dateFormatter.parse( periodoI );
query.setTimestamp( "dataIni", dataInit );
}
if ( periodoF != null && !"".equals(periodoF) ) {
//na data fim acrescentar a última hora do dia
Date dataFim = dateFormatter.parse( periodoF+" 23:59:59");
query.setTimestamp( "dataFim", dataFim);
}
if ( sProtocolo != null && !"".equals(sProtocolo) && !"0".equals(sProtocolo) ) {
//protocolo
query.setInteger( "numProtoc", Integer.parseInt( sProtocolo ) );
}
if ( !estadoAcionamento.equalsIgnoreCase("0") ) {
//estado da mensagem
query.setInteger( "estadoId", Integer.parseInt( estadoAcionamento ) );
}
// obter os acionamentos para atualizar seus estados
List results = acionamentoDao.query( query );
if (!palavraChave.trim().equals(""))
results = filtrarPalavraChave(results, palavraChave);
// atualizar os estados dos acionamentos
AcionamentoCtrl acionCtrl = new AcionamentoCtrl( getDaoFactory() );
boolean result = acionCtrl.atualizaEstadoAcionamentos(results);
//verificar se houve erros na atualização de estado
if (result == false) {
errors.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage(
"error.acionamento.atualizaestado"));
}
//Remontar a query Hibernate
session = HibernateSessionFactory.getFactory().getSession();
query = session.createQuery( hql.toString() );
dateFormatter = new SimpleDateFormat( "dd/MM/yyyy HH:mm:ss" );
//configurar os parâmetros da query
query.setParameterList( "assuntos", assuntosFuncionario );
if ( assuntoId != null && !"".equals(assuntoId) && !"0".equals(assuntoId) ) {
//assunto
query.setInteger( "assId", Integer.parseInt( assuntoId ) );
}
if ( tipoMensagemId != null && !"".equals(tipoMensagemId) && !"0".equals(tipoMensagemId) ) {
//tipo de mensagem
query.setInteger( "tipoMsgId", Integer.parseInt( tipoMensagemId ) );
}
if ( periodoI != null && !"".equals(periodoI) ) {
//data inicial
periodoI = periodoI +" 00:00:00";
Date dataInit = dateFormatter.parse( periodoI );
query.setTimestamp( "dataIni", dataInit );
}
if ( periodoF != null && !"".equals(periodoF) ) {
//na data fim acrescentar a última hora do dia
Date dataFim = dateFormatter.parse( periodoF+" 23:59:59");
query.setTimestamp( "dataFim", dataFim);
}
if ( sProtocolo != null && !"".equals(sProtocolo) && !"0".equals(sProtocolo) ) {
//protocolo
query.setInteger( "numProtoc", Integer.parseInt( sProtocolo ) );
}
if ( !estadoAcionamento.equalsIgnoreCase("0") ) {
//estado da mensagem
query.setInteger( "estadoId", Integer.parseInt( estadoAcionamento ) );
}
// obter o objeto DAO
acionamentoDao = (HibernateDao) getDaoFactory().create( Acionamento.class );
// obter os acionamentos da consulta após a atualização dos estados do acionamento
results = acionamentoDao.query( query );
if (!palavraChave.trim().equals(""))
results = filtrarPalavraChave(results, palavraChave);
request.setAttribute("CAS_RESULTS", results);
} catch (DaoException e) {
if (Constants.DEBUG) {
e.printStackTrace();
}
errors.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage("error.solucao.excecao"));
}
geraHistorico(request);
if (errors.isEmpty()) {
return mapping.findForward("success");
}
saveErrors(request, errors);
return mapping.findForward("failure");
}
}