/*
* 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.controller.andamento;
import java.sql.Timestamp;
import java.util.Iterator;
import java.util.List;
import br.gov.serpro.ouvidoria.dao.Dao;
import br.gov.serpro.ouvidoria.dao.DaoException;
import br.gov.serpro.ouvidoria.dao.DaoFactory;
import br.gov.serpro.ouvidoria.model.Acionamento;
import br.gov.serpro.ouvidoria.model.Assunto;
import br.gov.serpro.ouvidoria.model.Funcionario;
import br.gov.serpro.ouvidoria.model.LocalidadeOcorrencia;
import br.gov.serpro.ouvidoria.model.Orgao;
import br.gov.serpro.ouvidoria.model.Perfil;
import br.gov.serpro.ouvidoria.model.SubOrgao;
/**
* RedirecionarMensagemCtrl
*
* Objetivo: Informar a descrição da classes
*
* @author
* @version $Revision: 1.1.2.3 $, $Date: 2011/10/18 17:55:13 $
* @version 0.1, Date: 2004/12/20
*/
public class RedirecionarMensagemCtrl {
private Dao subOrgaoDao;
private Dao assuntoDao;
private Dao localidadeOcorrenciaDao;
private Dao acionamentoDao;
private Dao consultorDao;
/**
* Default Constructor
*
*/
public RedirecionarMensagemCtrl() {
// DO NOTHING
}
/**
* Constructor recebendo um Dao
*
* @param daoFactory
*/
public RedirecionarMensagemCtrl(final DaoFactory daoFactory) {
subOrgaoDao = daoFactory.create(SubOrgao.class);
assuntoDao = daoFactory.create(Assunto.class);
localidadeOcorrenciaDao = daoFactory.create(LocalidadeOcorrencia.class);
acionamentoDao = daoFactory.create(Acionamento.class);
consultorDao = daoFactory.create(Funcionario.class);
}
/**
* Obtém uma lista de sub-órgãos para o órgão informado
* @param orgao
* @return
* @throws DaoException
*/
public List getListaSubOrgao(Orgao orgao) throws DaoException {
final Timestamp agora = new Timestamp(System.currentTimeMillis());
String query = " from SubOrgao so " + " where so.orgao.id = "
+ orgao.getId() + " and (so.dataInicioVigencia < '"
+ agora.toString() + "')"
+ " and (so.dataFimVigencia is null or so.dataFimVigencia > '"
+ agora.toString() + "')" + " order by so.descricao";
List subOrgaos = subOrgaoDao.query(query);
return subOrgaos;
}
/**
* Obtém uma lista de assuntos ligados ao sub-órgão informado
* @param subOrgao
* @return
* @throws DaoException
*/
public List getListaAssunto(Integer subOrgao) throws DaoException {
final Timestamp agora = new Timestamp(System.currentTimeMillis());
String query = " from Assunto a" + " where" + " a.instituicao.id = "
+ subOrgao
+ " and (a.dataVigencia is null or a.dataVigencia > '"
+ agora.toString() + "'" + ")" + " order by a.descricao";
List assuntos = assuntoDao.query(query);
return assuntos;
}
/**
* Obtém uma lista de localidades ligadas ao sub-órgão informado
* @param subOrgao
* @return
* @throws DaoException
*/
public List getListaLocalidadeOcorrencia(Integer subOrgao)
throws DaoException {
final Timestamp agora = new Timestamp(System.currentTimeMillis());
String query = " from LocalidadeOcorrencia lo" + " where"
+ " lo.subOrgao.id = " + subOrgao
+ " and (lo.dataVigencia is null or lo.dataVigencia > '"
+ agora.toString() + "'" + ")" + " order by lo.descricao";
List localidades = localidadeOcorrenciaDao.query(query);
return localidades;
}
public List getConsultor(Integer subOrgao, Integer assunto,
Integer localidadeOcorrencia) throws DaoException {
String query = " select f from Funcionario f, Assunto a, LocalidadeOcorrencia lo "
+ " where "
+ " consultor like '%on%' "
+ " and f.situacao = 'A' "
+ " and a in elements (f.listaAssunto) "
+ " and a.id = "
+ assunto
+ " and lo in elements (f.listaLocalidadeOcorrencia) "
+ " and lo.id = " + localidadeOcorrencia + " order by f.nome ";
List consultores = consultorDao.query(query);
return consultores;
}
/**
* Obtém um acionamento a partir do ID informado
* @param id
* @return
* @throws DaoException
*/
public Acionamento getAcionamento(Integer id) throws DaoException {
Acionamento acionamento = (Acionamento) acionamentoDao.get(new Long(id
.longValue()));
return acionamento;
}
/**
* Obtém uma localidade de Ocorrência a partir do ID informado
* @param id
* @return
* @throws DaoException
*/
public LocalidadeOcorrencia getLocalidadeOcorrencia(Integer id)
throws DaoException {
LocalidadeOcorrencia localidadeOcorrencia = (LocalidadeOcorrencia) localidadeOcorrenciaDao
.get(new Long(id.longValue()));
return localidadeOcorrencia;
}
/**
* Obtém um assunto a partir do ID informado
* @param id
* @return
* @throws DaoException
*/
public Assunto getAssunto(Integer id) throws DaoException {
Assunto assunto = (Assunto) assuntoDao.get(new Long(id.longValue()));
return assunto;
}
/**
* Obtém um sub-órgão a partir do ID informado
* @param id
* @return
* @throws DaoException
*/
public SubOrgao getSubOrgao(Integer id) throws DaoException {
SubOrgao subOrgao = (SubOrgao) subOrgaoDao
.get(new Long(id.longValue()));
return subOrgao;
}
/**
* Salva um acionamento
* @param acionamento
* @throws DaoException
*/
public void salvarAcionamento(Acionamento acionamento) throws DaoException {
acionamentoDao.save(acionamento);
}
public Funcionario obterOuvidorAssistente(Acionamento acionamento,
Orgao orgao) throws DaoException {
Funcionario funcionarioLoc = null;
Funcionario funcionarioLoc2 = null;
Iterator iter = null;
// Obtém os ouvidores assistentes
List listaOuvidorAssistente = acionamentoDao
.query("select f from Funcionario f, Acionamento a where a.id = "
+ acionamento.getId()
+ " and f.instituicao.id = "
+ orgao.getId()
+ " and a.localidadeOcorrencia.subOrgao in elements( f.listaInstituicao ) and f.perfil.id = "
+ Perfil.OUVIDOR_ASSISTENTE.getId());
iter = listaOuvidorAssistente.iterator();
if (listaOuvidorAssistente.size() == 1) {
funcionarioLoc = (Funcionario) iter.next();
return funcionarioLoc;
}
if (listaOuvidorAssistente.size() > 1) {
// há mais de um ouvidor assistente, é preciso atribuir
// responsabilidade ao menos ocupado
int qtdMensagens = 99999999;
iter = listaOuvidorAssistente.iterator();
while (iter.hasNext()) {
funcionarioLoc = (Funcionario) iter.next();
if (funcionarioLoc.getListaAcionamento().size() < qtdMensagens) {
qtdMensagens = funcionarioLoc.getListaAcionamento().size();
funcionarioLoc2 = funcionarioLoc;
}
}
return funcionarioLoc2;
}
// não há ouvidor assistente, é preciso redirecionar para o
// ouvidor geral
return null;
}
public Funcionario obterOuvidorGeral(Acionamento acionamento, Orgao orgao)
throws DaoException {
Funcionario funcionarioLoc = null;
Funcionario funcionarioLoc2 = null;
Iterator iter = null;
// Obtém os ouvidores gerais
List listaOuvidorGeral = acionamentoDao
.query("select f from Funcionario f, Acionamento a where a.id = "
+ acionamento.getId()
+ " and f.instituicao.id = "
+ orgao.getId()
+ " and a.localidadeOcorrencia.subOrgao.orgao in elements( f.listaInstituicao ) and f.perfil.id = "
+ Perfil.OUVIDOR_GERAL.getId());
iter = listaOuvidorGeral.iterator();
if (listaOuvidorGeral.size() == 1) {
funcionarioLoc = (Funcionario) iter.next();
return funcionarioLoc;
}
if (listaOuvidorGeral.size() > 1) {
// há mais de um ouvidor geral, é preciso atribuir
// responsabilidade ao menos ocupado
int qtdMensagens = 99999999;
iter = listaOuvidorGeral.iterator();
while (iter.hasNext()) {
funcionarioLoc = (Funcionario) iter.next();
if (funcionarioLoc.getListaAcionamento().size() < qtdMensagens) {
qtdMensagens = funcionarioLoc.getListaAcionamento().size();
funcionarioLoc2 = funcionarioLoc;
}
}
return funcionarioLoc2;
}
return null;
}
public Funcionario obterOuvidor(Long idOuvidor) throws DaoException {
Funcionario funcionarioOuvidor= null;
Iterator iter = null;
// Obtém os ouvidores
List listaOuvidor = acionamentoDao.query("select f from Funcionario f where f.id = "+ idOuvidor);
iter = listaOuvidor.iterator();
if (listaOuvidor.size() == 1) {
funcionarioOuvidor = (Funcionario) iter.next();
return funcionarioOuvidor;
}
return funcionarioOuvidor;
}
}