Commit deaa9f2590782af169f779d76597df9e50f77ec3

Authored by andre.guimaraes
1 parent b9318463

Valida interessados do processo

Criada a validação dos interessados no processo, para evitar a criação
de interessados temporários. Também foram adicionadas as criticas para
ausência de interessados e para alguns dados que não podem ser nulos.

OTRS - 2018091720002004
src/main/java/br/gov/ans/integracao/sei/dao/ContatoDAO.java
1 package br.gov.ans.integracao.sei.dao; 1 package br.gov.ans.integracao.sei.dao;
2 2
  3 +import java.util.List;
  4 +
3 import javax.persistence.EntityManager; 5 import javax.persistence.EntityManager;
4 import javax.persistence.PersistenceContext; 6 import javax.persistence.PersistenceContext;
5 import javax.persistence.PersistenceContextType; 7 import javax.persistence.PersistenceContextType;
@@ -26,4 +28,12 @@ public class ContatoDAO { @@ -26,4 +28,12 @@ public class ContatoDAO {
26 28
27 return (Contato) query.getSingleResult(); 29 return (Contato) query.getSingleResult();
28 } 30 }
  31 +
  32 + public List<Contato> getContatosNaoTemporariosPelaSigla(String sigla){
  33 + Query query = em.createNamedQuery("Contato.pesquisarPorSigla",Contato.class);
  34 +
  35 + query.setParameter("sigla", sigla);
  36 +
  37 + return query.getResultList();
  38 + }
29 } 39 }
src/main/java/br/gov/ans/integracao/sei/modelo/Contato.java
@@ -17,7 +17,8 @@ import org.codehaus.jackson.map.annotate.JsonSerialize; @@ -17,7 +17,8 @@ import org.codehaus.jackson.map.annotate.JsonSerialize;
17 @Entity 17 @Entity
18 @Table(name="contato") 18 @Table(name="contato")
19 @NamedQueries({@NamedQuery(name="Contato.pesquisarPorID", query="select c from Contato c where c.id = :id"), 19 @NamedQueries({@NamedQuery(name="Contato.pesquisarPorID", query="select c from Contato c where c.id = :id"),
20 - @NamedQuery(name="Contato.pesquisarPorSigla", query="select c from Contato c where c.sigla = :sigla")}) 20 + @NamedQuery(name="Contato.pesquisarPorSigla", query="select c from Contato c where c.sigla = :sigla"),
  21 + @NamedQuery(name="Contato.pesquisarNaoTemporariosPorSigla", query="select c from Contato c where c.sigla = :sigla and tipo != 4 order by id desc")})
21 public class Contato{ 22 public class Contato{
22 23
23 @Id 24 @Id
src/main/java/br/gov/ans/integracao/sei/rest/ProcessoResource.java
@@ -63,6 +63,7 @@ import br.gov.ans.integracao.sei.modelo.ProcessoResumido; @@ -63,6 +63,7 @@ import br.gov.ans.integracao.sei.modelo.ProcessoResumido;
63 import br.gov.ans.integracao.sei.modelo.ResultadoConsultaProcesso; 63 import br.gov.ans.integracao.sei.modelo.ResultadoConsultaProcesso;
64 import br.gov.ans.integracao.sei.modelo.SobrestamentoProcesso; 64 import br.gov.ans.integracao.sei.modelo.SobrestamentoProcesso;
65 import br.gov.ans.integracao.sei.utils.Constantes; 65 import br.gov.ans.integracao.sei.utils.Constantes;
  66 +import br.gov.ans.integracao.sei.utils.ProcessoHelper;
66 import br.gov.ans.integracao.sipar.dao.DocumentoSipar; 67 import br.gov.ans.integracao.sipar.dao.DocumentoSipar;
67 import br.gov.ans.utils.MessageUtils; 68 import br.gov.ans.utils.MessageUtils;
68 69
@@ -92,6 +93,9 @@ public class ProcessoResource { @@ -92,6 +93,9 @@ public class ProcessoResource {
92 private MessageUtils messages; 93 private MessageUtils messages;
93 94
94 @Inject 95 @Inject
  96 + private ProcessoHelper processoHelper;
  97 +
  98 + @Inject
95 private Logger logger; 99 private Logger logger;
96 100
97 @Context 101 @Context
@@ -555,11 +559,13 @@ public class ProcessoResource { @@ -555,11 +559,13 @@ public class ProcessoResource {
555 @Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML}) 559 @Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
556 @Consumes({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML}) 560 @Consumes({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
557 public Response abrirProcesso(@PathParam("unidade") String unidade, @QueryParam("auto-formatacao") String autoFormatar, NovoProcesso processo) throws RemoteException, Exception{ 561 public Response abrirProcesso(@PathParam("unidade") String unidade, @QueryParam("auto-formatacao") String autoFormatar, NovoProcesso processo) throws RemoteException, Exception{
  562 + processoHelper.validarNovoProcesso(processo);
  563 +
558 if(StringUtils.isNotBlank(processo.getDadosProcesso().getNumeroProtocolo()) && isAutoFormatar(autoFormatar)){ 564 if(StringUtils.isNotBlank(processo.getDadosProcesso().getNumeroProtocolo()) && isAutoFormatar(autoFormatar)){
559 String numeroFormatado = formatarNumeroProcesso(processo.getDadosProcesso().getNumeroProtocolo()); 565 String numeroFormatado = formatarNumeroProcesso(processo.getDadosProcesso().getNumeroProtocolo());
560 processo.getDadosProcesso().setNumeroProtocolo(numeroFormatado); 566 processo.getDadosProcesso().setNumeroProtocolo(numeroFormatado);
561 } 567 }
562 - 568 +
563 RetornoGeracaoProcedimento retorno = seiNativeService.gerarProcedimento(Constantes.SEI_BROKER, Operacao.ABRIR_PROCESSO, unidadeResource.consultarCodigo(unidade), processo.getDadosProcesso(), processo.getDocumentos(), 569 RetornoGeracaoProcedimento retorno = seiNativeService.gerarProcedimento(Constantes.SEI_BROKER, Operacao.ABRIR_PROCESSO, unidadeResource.consultarCodigo(unidade), processo.getDadosProcesso(), processo.getDocumentos(),
564 processo.getProcessosRelacionados(), unidadeResource.buscarCodigoUnidades(processo.getUnidadesDestino()), getSOuN(processo.isManterAbertoOrigem()), 570 processo.getProcessosRelacionados(), unidadeResource.buscarCodigoUnidades(processo.getUnidadesDestino()), getSOuN(processo.isManterAbertoOrigem()),
565 getSOuN(processo.isEnviarEmailNotificacao()), formatarData(processo.getDataRetornoProgramado()), (processo.getQtdDiasAteRetorno() != null ? processo.getQtdDiasAteRetorno().toString() : null), getSOuN(processo.isSomenteDiasUteis()), 571 getSOuN(processo.isEnviarEmailNotificacao()), formatarData(processo.getDataRetornoProgramado()), (processo.getQtdDiasAteRetorno() != null ? processo.getQtdDiasAteRetorno().toString() : null), getSOuN(processo.isSomenteDiasUteis()),
src/main/java/br/gov/ans/integracao/sei/utils/ContatoHelper.java
@@ -6,6 +6,7 @@ import static br.gov.ans.integracao.sei.utils.Constantes.SIM; @@ -6,6 +6,7 @@ import static br.gov.ans.integracao.sei.utils.Constantes.SIM;
6 import static br.gov.ans.integracao.sei.utils.Util.getSOuN; 6 import static br.gov.ans.integracao.sei.utils.Util.getSOuN;
7 7
8 import java.rmi.RemoteException; 8 import java.rmi.RemoteException;
  9 +import java.util.List;
9 10
10 import javax.inject.Inject; 11 import javax.inject.Inject;
11 12
@@ -122,11 +123,23 @@ public class ContatoHelper { @@ -122,11 +123,23 @@ public class ContatoHelper {
122 } 123 }
123 } 124 }
124 } 125 }
125 - 126 +
  127 + public br.gov.ans.integracao.sei.modelo.Contato getContatoNaoTemporarioMaisAntigo(String sigla){
  128 + List<br.gov.ans.integracao.sei.modelo.Contato> contatosNaoTemporariosPelaSigla = contatoDAO.getContatosNaoTemporariosPelaSigla(sigla);
  129 +
  130 + return contatosNaoTemporariosPelaSigla.get(0);
  131 + }
  132 +
126 public void preencherIdContato(Contato contato, String sigla){ 133 public void preencherIdContato(Contato contato, String sigla){
127 contato.setIdContato(getIdContato(sigla)+""); 134 contato.setIdContato(getIdContato(sigla)+"");
128 } 135 }
129 136
  137 + public Boolean isContatoCadastradoComoNaoTemporario(String sigla){
  138 + List<br.gov.ans.integracao.sei.modelo.Contato> contatosNaoTemporariosPelaSigla = contatoDAO.getContatosNaoTemporariosPelaSigla(sigla);
  139 +
  140 + return !contatosNaoTemporariosPelaSigla.isEmpty();
  141 + }
  142 +
130 private Integer getIdContato(String sigla){ 143 private Integer getIdContato(String sigla){
131 return contatoDAO.getContatoPelaSigla(sigla).getId(); 144 return contatoDAO.getContatoPelaSigla(sigla).getId();
132 } 145 }
src/main/java/br/gov/ans/integracao/sei/utils/InteressadoHelper.java 0 → 100644
@@ -0,0 +1,45 @@ @@ -0,0 +1,45 @@
  1 +package br.gov.ans.integracao.sei.utils;
  2 +
  3 +import javax.inject.Inject;
  4 +
  5 +import br.gov.ans.integracao.sei.client.Interessado;
  6 +import br.gov.ans.integracao.sei.modelo.Contato;
  7 +
  8 +public class InteressadoHelper {
  9 + @Inject
  10 + private ContatoHelper contatoHelper;
  11 +
  12 + public void tratarInteressados(Interessado[] interessados){
  13 + for(int i=0; i < interessados.length; i++){
  14 + interessados[i] = tratarInteressado(interessados[i]);
  15 + }
  16 + }
  17 +
  18 + public Interessado tratarInteressado(Interessado interessado){
  19 + if(isInteressadoCadastradoComoNaoTemporario(interessado.getSigla())){
  20 + return getRegistroInteressadoNaoTemporarioMaisAntigo(interessado.getSigla());
  21 + }
  22 +
  23 + return interessado;
  24 + }
  25 +
  26 + private boolean isInteressadoCadastradoComoNaoTemporario(String sigla){
  27 + return contatoHelper.isContatoCadastradoComoNaoTemporario(sigla);
  28 + }
  29 +
  30 + public Interessado getRegistroInteressadoNaoTemporarioMaisAntigo(String sigla){
  31 + Contato contatoNaoTemporarioMaisAntigo = contatoHelper.getContatoNaoTemporarioMaisAntigo(sigla);
  32 +
  33 + return convertContatoParaInteressado(contatoNaoTemporarioMaisAntigo);
  34 + }
  35 +
  36 + private Interessado convertContatoParaInteressado(Contato contato){
  37 + Interessado interessado = new Interessado();
  38 +
  39 + interessado.setNome(contato.getNome());
  40 + interessado.setSigla(contato.getSigla());
  41 +
  42 + return interessado;
  43 + }
  44 +
  45 +}
src/main/java/br/gov/ans/integracao/sei/utils/ProcessoHelper.java 0 → 100644
@@ -0,0 +1,38 @@ @@ -0,0 +1,38 @@
  1 +package br.gov.ans.integracao.sei.utils;
  2 +
  3 +import javax.inject.Inject;
  4 +
  5 +import org.apache.commons.lang3.ArrayUtils;
  6 +
  7 +import br.gov.ans.integracao.sei.exceptions.BusinessException;
  8 +import br.gov.ans.integracao.sei.modelo.NovoProcesso;
  9 +import br.gov.ans.utils.MessageUtils;
  10 +
  11 +public class ProcessoHelper {
  12 +
  13 + @Inject
  14 + private MessageUtils messages;
  15 +
  16 + @Inject
  17 + private InteressadoHelper interessadoHelper;
  18 +
  19 + public void validarNovoProcesso(NovoProcesso novoProcesso) throws BusinessException{
  20 + if(novoProcesso == null){
  21 + throw new BusinessException(messages.getMessage("erro.novo.processo.vazio"));
  22 + }
  23 +
  24 + if(novoProcesso.getDadosProcesso() == null){
  25 + throw new BusinessException(messages.getMessage("erro.dados.processo.nao.informados"));
  26 + }
  27 +
  28 + if(isSemInteressados(novoProcesso)){
  29 + throw new BusinessException(messages.getMessage("erro.interessado.nao.informado"));
  30 + }else{
  31 + interessadoHelper.tratarInteressados(novoProcesso.getDadosProcesso().getInteressados());
  32 + }
  33 + }
  34 +
  35 + public boolean isSemInteressados(NovoProcesso processo){
  36 + return ArrayUtils.isEmpty(processo.getDadosProcesso().getInteressados());
  37 + }
  38 +}
src/main/resources/messages.properties
@@ -17,6 +17,7 @@ erro.cidade.nao.encontrada.ibge = Não há cidades para o código do IBGE informado @@ -17,6 +17,7 @@ erro.cidade.nao.encontrada.ibge = Não há cidades para o código do IBGE informado
17 erro.codigo.ibge.invalido = Código do IBGE inválido, não foram encontradas cidades relacionadas ao código {0}. 17 erro.codigo.ibge.invalido = Código do IBGE inválido, não foram encontradas cidades relacionadas ao código {0}.
18 erro.conectar.sei = Ocorreu um erro ao se conectar ao SEI, contate a equipe responsável. 18 erro.conectar.sei = Ocorreu um erro ao se conectar ao SEI, contate a equipe responsável.
19 erro.contato.nao.encontrado = Nenhum contato foi encontrado para o identificador {0}. 19 erro.contato.nao.encontrado = Nenhum contato foi encontrado para o identificador {0}.
  20 +erro.dados.processo.nao.informados = Dados do processo não informados.
20 erro.desanexar.processo = Ocorreu um erro ao desanexar o processo. 21 erro.desanexar.processo = Ocorreu um erro ao desanexar o processo.
21 erro.desbloquear.processo = Ocorreu um erro ao desbloquear o processo. 22 erro.desbloquear.processo = Ocorreu um erro ao desbloquear o processo.
22 erro.desrelacionar.processo = Ocorreu um erro ao remover o relacionamento. 23 erro.desrelacionar.processo = Ocorreu um erro ao remover o relacionamento.
@@ -26,6 +27,7 @@ erro.documento.sem.processo = É necessário informar um número de processo para i @@ -26,6 +27,7 @@ erro.documento.sem.processo = É necessário informar um número de processo para i
26 erro.estado.nao.encontrado = Não foi encontrado um estado para a sigla {0}. 27 erro.estado.nao.encontrado = Não foi encontrado um estado para a sigla {0}.
27 erro.inesperado = Ocorreu um erro inesperado no SEI-Broker, contacte a equipe responsável. 28 erro.inesperado = Ocorreu um erro inesperado no SEI-Broker, contacte a equipe responsável.
28 erro.informe.processo = É necessário informar o número do processo. 29 erro.informe.processo = É necessário informar o número do processo.
  30 +erro.interessado.nao.informado = É necessário informar algum interessado.
29 erro.campos.obrigatorios.sobrestamento.processo = É necessário informar o número do processo e o motivo do sobrestamento. 31 erro.campos.obrigatorios.sobrestamento.processo = É necessário informar o número do processo e o motivo do sobrestamento.
30 erro.marcar.processo = Ocorreu um erro ao adicionar o marcador ao processo. 32 erro.marcar.processo = Ocorreu um erro ao adicionar o marcador ao processo.
31 erro.motivo.cancelamento.obrigatorio = É obrigatório informar o motivo do cancelamento. 33 erro.motivo.cancelamento.obrigatorio = É obrigatório informar o motivo do cancelamento.
@@ -34,6 +36,7 @@ erro.nao.unidades.processo.aberto = Não há unidades onde o processo esteja abert @@ -34,6 +36,7 @@ erro.nao.unidades.processo.aberto = Não há unidades onde o processo esteja abert
34 erro.nenhum.contato.encontrado = Nenhum contato encontrado. 36 erro.nenhum.contato.encontrado = Nenhum contato encontrado.
35 erro.nenhum.documento.encontrado.interessado = Nenhum documento foi encontrado para o interessado {0}. 37 erro.nenhum.documento.encontrado.interessado = Nenhum documento foi encontrado para o interessado {0}.
36 erro.nenhum.processo.encontrado.filtros = Nenhum processo encontrado para os filtros informados. 38 erro.nenhum.processo.encontrado.filtros = Nenhum processo encontrado para os filtros informados.
  39 +erro.novo.processo.vazio = Processo vazio.
37 erro.numero.sipar = Número de processo não corresponde ao padrão do SIPAR. 40 erro.numero.sipar = Número de processo não corresponde ao padrão do SIPAR.
38 erro.persistir.confirmacao.inclusao.documento = Ocorreu um erro ao persistir a confirmação de inclusão do documento, número gerado {0}. 41 erro.persistir.confirmacao.inclusao.documento = Ocorreu um erro ao persistir a confirmação de inclusão do documento, número gerado {0}.
39 erro.processar.conteudo.json = Erro ao processar o conteudo JSON, verifique a formação do JSON e se o envio foi realizado em Base64. 42 erro.processar.conteudo.json = Erro ao processar o conteudo JSON, verifique a formação do JSON e se o envio foi realizado em Base64.
src/test/java/br/gov/ans/integracao/sei/testes/FunctionalTest.java
@@ -8,7 +8,7 @@ public class FunctionalTest { @@ -8,7 +8,7 @@ public class FunctionalTest {
8 8
9 protected final String USUARIO = "desenv_integracao_sei"; 9 protected final String USUARIO = "desenv_integracao_sei";
10 protected final String SENHA = "integra_sei_2016"; 10 protected final String SENHA = "integra_sei_2016";
11 - protected static final Boolean DESENVOLVIMENTO = true; 11 + protected static final Boolean DESENVOLVIMENTO = false;
12 12
13 protected static final String BASIC = "Basic ZGVzZW52X2ludGVncmFjYW9fc2VpOmludGVncmFfc2VpXzIwMTY="; 13 protected static final String BASIC = "Basic ZGVzZW52X2ludGVncmFjYW9fc2VpOmludGVncmFfc2VpXzIwMTY=";
14 14
@@ -34,7 +34,7 @@ public class FunctionalTest { @@ -34,7 +34,7 @@ public class FunctionalTest {
34 if(DESENVOLVIMENTO){ 34 if(DESENVOLVIMENTO){
35 baseHost = "http://localhost"; 35 baseHost = "http://localhost";
36 }else{ 36 }else{
37 - baseHost = "http://ansdsjboss01.ans.gov.br"; 37 + baseHost = "http://ansdsjboss01a.ans.gov.br";
38 } 38 }
39 } 39 }
40 RestAssured.baseURI = baseHost; 40 RestAssured.baseURI = baseHost;