/*
* 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.model;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.Iterator;
import java.util.List;
import java.util.TreeSet;
import br.gov.serpro.ouvidoria.util.Constants;
import br.gov.serpro.ouvidoria.util.Utilitario;
/**
* Funcionario Esta classe representa os funcionários que são usuários do
* sistema.
*
* @author SERPRO
* @version $Revision: 1.1.2.3 $, $Date: 2011/10/20 17:07:44 $
* @version 0.1, Date: 2004/11/19
*/
public class Funcionario extends PersistentObject {
private static final long serialVersionUID = 1L;
public static final String ATIVO = "A";
public static final String INATIVO = "I";
public static final String SUSPENSO = "S";
public static final int NA_ORGAO = 0;
public static final int NA_SUB_ORGAO = 1;
/* Requerido */
private Long id;
/* Requerido */
private String login;
/* Requerido */
private String nome;
/* Requerido */
private String senha;
/* Requerido */
private Integer qtdTentativasLogin;
/* Requerido */
private Timestamp dataBloqueioLogin;
/* Requerido */
private String situacao;
private String motivoNivelAtuacao;
private Instituicao instituicao;
/* Requerido */
private Perfil perfil;
private String email;
private Collection listaLocalidadeOcorrencia = new TreeSet();
private Collection listaFuncionalidade = new TreeSet();
private Collection listaInstituicao = new TreeSet();
private Collection listaTipoMensagem = new TreeSet();
private Collection listaAssunto = new TreeSet();
private Collection listaAcionamento = new TreeSet();
private String consultor;
/**
* @return Returns the consultor.
*/
public String getConsultor() {
return consultor;
}
/**
* @param consultor
* The consultor to set.
*/
public void setConsultor(String consultor) {
this.consultor = consultor;
}
/*
* (non-Javadoc)
*
* @see br.gov.serpro.ouvidoria.model.Identifiable#getId()
*/
public Long getId() {
return id;
}
/**
* @param id
* O id a ser atribuído.
*/
public void setId(Long id) {
this.id = id;
}
/**
* @return Retorna o login.
*/
public String getLogin() {
return login;
}
/**
* @param login
* login a ser atribuído.
*/
public void setLogin(String login) {
if (login == null || login.length() == 0) {
throw new NullPointerException();
}
this.login = login;
}
/**
* @return Retorna o nome.
*/
public String getNome() {
return nome;
}
/**
* @param nome
* nome a ser atribuído.
*/
public void setNome(String nome) {
if (nome == null || nome.length() == 0) {
throw new NullPointerException();
}
this.nome = nome;
}
/**
* @return Retorna a senha.
*/
public String getSenha() {
String dec = null;
if (this.senha != null)
try {
dec = new String(Utilitario.decrypt(Constants.DES_KEY,
this.senha));
if (dec.trim().length() == 0) {
dec = this.senha;
}
} catch (RuntimeException e) {
if (Constants.DEBUG) {
System.out.println(e);
}
dec = this.senha;
}
return dec;
}
/**
* @param senha
* senha a ser atribuída.
*/
public void setSenha(final String senha) {
if (senha == null || senha.length() == 0) {
throw new NullPointerException();
}
String enc = null;
if (senha != null)
try {
enc = Utilitario.encrypt(Constants.DES_KEY, senha);
} catch (RuntimeException e) {
if (Constants.DEBUG) {
System.out.println(e);
}
enc = senha;
}
this.senha = enc;
}
/**
* @return Retorna situação.
*/
public String getSituacao() {
return situacao;
}
/**
* @param situacao
* situação a ser atribuída.
*/
public void setSituacao(String situacao) {
if (situacao == null || situacao.length() == 0) {
throw new NullPointerException();
}
if ((situacao != null) && (situacao.length() > 0)
&& (situacao.compareTo(Funcionario.ATIVO) != 0)
&& (situacao.compareTo(Funcionario.INATIVO) != 0)
&& (situacao.compareTo(Funcionario.SUSPENSO) != 0)) {
throw new IllegalArgumentException();
}
this.situacao = situacao;
}
/**
* @return Retorna instituicao.
*/
public Instituicao getInstituicao() {
return instituicao;
}
/**
* @param instituicao
* instituicao a ser atribuida.
*/
public void setInstituicao(Instituicao instituicao) {
this.instituicao = instituicao;
}
/**
* @return Retorna perfil.
*/
public Perfil getPerfil() {
return perfil;
}
/**
* @param perfil
* perfil a ser atribuido.
*/
public void setPerfil(Perfil perfil) {
if (perfil == null) {
throw new NullPointerException();
}
this.perfil = perfil;
}
/**
* @return Retorna localidadeOcorrencia.
*/
public Collection getListaLocalidadeOcorrencia() {
return listaLocalidadeOcorrencia;
}
/**
*
* @param listaLocalidadeOcorrencia
*/
public void setListaLocalidadeOcorrencia(
Collection listaLocalidadeOcorrencia) {
this.listaLocalidadeOcorrencia = listaLocalidadeOcorrencia;
}
/**
* @return Retorna lista de tipos de mensagem sob responsabilidade do
* funcionário.
*/
public Collection getListaTipoMensagem() {
return listaTipoMensagem;
}
/**
* @param listaTipoMensagem
* lista de tipos de mensagem a ser atribuída.
*/
public void setListaTipoMensagem(Collection listaTipoMensagem) {
this.listaTipoMensagem = listaTipoMensagem;
}
/**
* Este método é responsável por adicionar um tipo de mensagem na lista de
* tipos de mensagem sob responsabilidade do funcionário
*
* @param tipoMensagem
* tipoMensagem a ser incluído
*/
public void adicionarTipoMensagem(TipoMensagem tipoMensagem) {
this.listaTipoMensagem.add(tipoMensagem);
}
/**
* Este método é responsável por remover um tipo de mensagem da lista de
* tipos de mensagem sob responsabilidade do funcionário
*
* @param tipoMensagem
* tipoMensagem a ser removido
*/
public void removerTipoMensagem(TipoMensagem tipoMensagem) {
this.listaTipoMensagem.remove(tipoMensagem);
}
/**
* @return Retorna lista de assuntos sob responsabilidade do funcionário.
*/
public Collection getListaAssunto() {
return listaAssunto;
}
/**
* @param listaAssunto
* lista de assuntos a ser atribuída.
*/
public void setListaAssunto(Collection listaAssunto) {
this.listaAssunto = listaAssunto;
}
/**
* Este método é responsável por adicionar um assunto na lista de assuntos
* sob responsabilidade do funcionário
*
* @param assunto
* assunto a ser incluído
*/
public void adicionarAssunto(Assunto assunto) {
this.listaAssunto.add(assunto);
}
/**
* Este método é responsável por remover um assunto da lista de assuntos sob
* responsabilidade do funcionário
*
* @param assunto
* assunto a ser removido
*/
public void removerAssunto(Assunto assunto) {
this.listaAssunto.remove(assunto);
}
/**
* @return Retorna lista de instituições as quais o funcionário está
* alocado.
*/
public Collection getListaInstituicao() {
return listaInstituicao;
}
/**
* @return Retorna lista de instituições dentro da vigência.
*
*/
public Collection getListaSubOrgaosAtivos() {
Collection lista = new ArrayList();
if (this.listaInstituicao == null || this.listaInstituicao.isEmpty()) {
return null;
}
final Timestamp agora = new Timestamp(System.currentTimeMillis());
for (Iterator iter = this.listaInstituicao.iterator(); iter.hasNext();) {
Instituicao inst = (Instituicao) iter.next();
if (inst instanceof SubOrgao
&& (((SubOrgao) inst).getDataFimVigencia() == null || ((SubOrgao) inst)
.getDataFimVigencia().after(agora))) {
lista.add(inst);
}
}
return lista;
}
/**
* @return Retorna lista de instituições independente da vigência.
*
*/
public Collection getListaTodosSubOrgaos() {
Collection lista = new ArrayList();
if (this.listaInstituicao == null || this.listaInstituicao.isEmpty()) {
return null;
}
for (Iterator iter = this.listaInstituicao.iterator(); iter.hasNext();) {
Instituicao inst = (Instituicao) iter.next();
if (inst instanceof SubOrgao) {
lista.add(inst);
}
}
return lista;
}
/**
* @param listaInstituicao
* lista de instituições a ser atribuída.
*/
public void setListaInstituicao(Collection listaInstituicao) {
this.listaInstituicao = listaInstituicao;
}
/**
* Este método é responsável por adicionar uma instituição na lista de
* instituições as quais o funcionário está alocado.
*
* @param instituicao
* instituicao a ser incluída
*/
public void adicionarInstituicao(Instituicao instituicao) {
this.listaInstituicao.add(instituicao);
}
/**
* Este método é responsável por remover uma instituição da lista de
* instituições as quais o funcionário está alocado
*
* @param instituicao
* instituicao a ser removida
*/
public void removerInstituicao(Instituicao instituicao) {
this.listaInstituicao.remove(instituicao);
}
/**
* @return Retorna listaAcionamento.
*/
public Collection getListaAcionamento() {
return this.listaAcionamento;
}
/**
* @param listaAcionamento
* listaAcionamento a ser atribuido.
*/
public void setListaAcionamento(Collection listaAcionamento) {
this.listaAcionamento = listaAcionamento;
}
/**
* Este método é responsável por adicionar um acionamento na lista de
* acionamentos sob responsabilidade do funcionário.
*
* @param acionamento
* acionamento a ser incluído
*/
public void adicionarAcionamento(Acionamento acionamento) {
this.listaAcionamento.add(acionamento);
}
/**
* Este método é responsável por remover um acionamento da lista de
* acionamentos sob responsabilidade do funcionário.
*
* @param acionamento
* acionamento a ser removido
*/
public void removerAcionamento(Acionamento acionamento) {
this.listaAcionamento.remove(acionamento);
}
/**
* @return Lista de acionamentos pendentes sob responsabilidade do
* funcionário.
*/
public List consultarMensagensPendentesPorResponsabilidade() {
List listaMensagensPendentesFuncionario = new ArrayList();
Iterator i = this.listaAcionamento.iterator();
Acionamento acionamento;
while (i.hasNext()) {
acionamento = (Acionamento) i.next();
if (!acionamento.getEstadoAcionamento().equals(
EstadoAcionamento.RESPONDIDO)
&& !acionamento.getEstadoAcionamento().equals(
EstadoAcionamento.ENVIADO)) {
listaMensagensPendentesFuncionario.add(acionamento);
}
}
return listaMensagensPendentesFuncionario;
}
/**
* Este método testa se o funcionário tem responsabilidade sobre um assunto
*
* @param assunto
* Assunto o qual se deseja testar a responsabilidade do
* funcionário
* @return True se o funcionário tem responsabilidade, falso caso contrário
*/
public boolean checarResponsabilidadeAssunto(Assunto assunto) {
if (this.listaAssunto.contains(assunto)) {
return true;
}
return false;
}
/**
* Este método testa se um funcionário está alocado a um sub órgão
*
* @param subOrgao
* SubOrgao que se deseja testar se o funcionario esta alocado
* @return True se o funcionario esta alocado ao suborgao, false caso
* contrario
*/
public boolean checarAlocacaoSubOrgao(SubOrgao subOrgao) {
if (this.listaInstituicao.contains(subOrgao)) {
return true;
}
return false;
}
/**
* Este método testa se um funcionário esté responsável por uma localidade
*
* @param localidadeOcorrencia
* localidade que se deseja testar se o funcionário tem
* responsabilidade sobre ela.
* @return true se o funcionário é responsável pela localidade, false caso
* contrário
*/
public boolean checarResponsabilidadeLocalidade(
LocalidadeOcorrencia localidadeOcorrencia) {
if (this.listaLocalidadeOcorrencia.contains(localidadeOcorrencia)) {
return true;
}
return false;
}
/**
* @return Número de mensagens pendentes sob responsabilidade do funcionário
*/
public int obterQtdMensagensSobResponsabilidade() {
return consultarMensagensPendentesPorResponsabilidade().size();
}
/**
* @return Retorna listaFuncionalidade.
*/
public Collection getListaFuncionalidade() {
return this.listaFuncionalidade;
}
/**
* @param listaFuncionalidade
* listaFuncionalidade a ser atribuido.
*/
public void setListaFuncionalidade(Collection listaFuncionalidade) {
this.listaFuncionalidade = listaFuncionalidade;
}
/**
* Recupera todos os assuntos nos quais o funcionario atua, seja através de
* algum órgão ou sub-órgão
*
* @param situacao
* "Ativo" - retorna os assuntos ativos "Inativo" - retorna os
* assuntos inativos "Ambos" - retorna os assuntos ativos e
* inativos
*
* @return Retorna listaAssunto.
*/
public List getListaAssuntosComAtuacao(String situacao) {
List listaAssunto = new ArrayList();
Collection listaAssuntoInstituicao = new ArrayList();
Assunto assunto;
Instituicao inst;
Iterator iterInst;
Iterator iterAssunto;
if (this.listaInstituicao != null) {
iterInst = this.listaInstituicao.iterator();
while (iterInst.hasNext()) {
inst = (Instituicao) iterInst.next();
if (inst instanceof Orgao) {
listaAssuntoInstituicao = ((Orgao) inst)
.getListaTodosAssuntos(situacao);
}
if (inst instanceof SubOrgao) {
listaAssuntoInstituicao = ((SubOrgao) inst)
.getListaTodosAssuntos(situacao);
}
if (listaAssuntoInstituicao != null) {
iterAssunto = listaAssuntoInstituicao.iterator();
while (iterAssunto.hasNext()) {
assunto = (Assunto) iterAssunto.next();
if (!listaAssunto.contains(assunto))
listaAssunto.add(assunto);
}
}
}
class AssuntoComparator implements Comparator {
public final int compare(Object a, Object b) {
return (((Assunto) a).getDescricao())
.compareTo((((Assunto) b).getDescricao()));
} // end compare
} // end class AssuntoComparator
Collections.sort(listaAssunto, new AssuntoComparator());
if (!listaAssunto.isEmpty())
return listaAssunto;
}
return listaAssunto;
}
/**
* @return Retorna motivoNivelAtuacao.
*/
public String getMotivoNivelAtuacao() {
return this.motivoNivelAtuacao;
}
/**
* @param motivoNivelAtuacao
* motivoNivelAtuacao a ser atribuido.
*/
public void setMotivoNivelAtuacao(String motivoNivelAtuacao) {
this.motivoNivelAtuacao = motivoNivelAtuacao;
}
/**
* Retorna o nível de atuação do funcionario
*
* @return 0 para órgão, 1 para Sub-órgão
*/
public int getNivelAtuacao() {
int nivel = NA_SUB_ORGAO;
if (this.listaInstituicao == null || this.listaInstituicao.isEmpty()) {
nivel = NA_ORGAO;
} else if (this.listaInstituicao.size() == 1) {
if (this.getListaInstituicao().iterator().next() instanceof Orgao) {
nivel = NA_ORGAO;
}
}
return nivel;
}
/**
* @return Retorna dataBloqueioLogin.
*/
public Timestamp getDataBloqueioLogin() {
return this.dataBloqueioLogin;
}
/**
* @param dataBloqueioLogin
* dataBloqueioLogin a ser atribuido.
*/
public void setdataBloqueioLogin(Timestamp dataBloqueioLogin) {
this.dataBloqueioLogin = dataBloqueioLogin;
}
/**
* @return Retorna qtdTentativasLogin.
*/
public Integer getQtdTentativasLogin() {
return this.qtdTentativasLogin;
}
/**
* @param qtdTentativasLogin
* qtdTentativasLogin a ser atribuido.
*/
public void setQtdTentativasLogin(Integer qtdTentativasLogin) {
this.qtdTentativasLogin = qtdTentativasLogin;
}
/**
* Este método incrementa o Número de tentativas erradas para login.
*/
public void incrementarQtdTentativasLogin() {
if (this.qtdTentativasLogin == null) {
this.setQtdTentativasLogin(new Integer(1));
} else {
this.setQtdTentativasLogin(new Integer(this.qtdTentativasLogin
.intValue() + 1));
}
}
/**
* Este método zera o Número de tentativas erradas para login.
*/
public void zerarQtdTentativasLogin() {
this.qtdTentativasLogin = new Integer(0);
this.dataBloqueioLogin = null;
}
/**
* Este método verifica se um login está bloqueado e se já pode ser
* desbloqueado.
*
* @return <code>true</code> se o funcionário estiver bloqueado,
* <code>false</code> caso contrário.
*/
public boolean checarLoginBloqueado() {
// Se a data é nula, não está bloqueado
if (this.dataBloqueioLogin == null) {
return false;
}
// Se a data é menor que a dataAtual, não está bloqueado e
// desbloqueia o protocolo
Timestamp dataAtual = new Timestamp(System.currentTimeMillis());
if (this.dataBloqueioLogin.before(dataAtual)) {
desbloquearLogin();
return false;
// Login está bloqueado se a data é >= dataAtual
}
return true;
}
/**
* Este método é responsável por desbloquear um login.
*/
public void desbloquearLogin() {
// limpa a data de desbloqueio
this.dataBloqueioLogin = null;
// Zera Número de tentativas erradas
zerarQtdTentativasLogin();
}
/**
* Este método atribui o tempo limite de bloqueio.
*
* @param tempoBloqueio
* Tempo de bloqueio (em minutos)
*/
public void bloquearLogin(Integer tempoBloqueio) {
this.dataBloqueioLogin = new Timestamp(System.currentTimeMillis()
+ Utilitario.converterMinutoMilisegundos(tempoBloqueio
.intValue()));
}
/**
* @param email
* the email to set
*/
public void setEmail(String email) {
this.email = email;
}
/**
* @return the email
*/
public String getEmail() {
return email;
}
}