Commit 7ef43825f9b27f5fe22e6e3481ef79995caa95f0

Authored by rogerio.costa
1 parent 5de24bed
Exists in master

[2866]-Alterar a Grid de Processos (Listagem)

cit-ecm-api/src/main/java/br/com/centralit/api/dao/impl/UnidadeProcessoDaoHibernate.java
@@ -3,18 +3,24 @@ package br.com.centralit.api.dao.impl; @@ -3,18 +3,24 @@ package br.com.centralit.api.dao.impl;
3 import java.util.Collection; 3 import java.util.Collection;
4 4
5 import org.hibernate.Criteria; 5 import org.hibernate.Criteria;
  6 +import org.hibernate.criterion.DetachedCriteria;
6 import org.hibernate.criterion.Projections; 7 import org.hibernate.criterion.Projections;
7 import org.hibernate.criterion.Restrictions; 8 import org.hibernate.criterion.Restrictions;
  9 +import org.hibernate.criterion.Subqueries;
  10 +import org.hibernate.sql.JoinType;
8 import org.springframework.stereotype.Repository; 11 import org.springframework.stereotype.Repository;
9 12
10 import br.com.centralit.api.dao.UnidadeProcessoDao; 13 import br.com.centralit.api.dao.UnidadeProcessoDao;
  14 +import br.com.centralit.api.model.CredencialProcesso;
11 import br.com.centralit.api.model.Processo; 15 import br.com.centralit.api.model.Processo;
12 import br.com.centralit.api.model.SigiloPrivilegio; 16 import br.com.centralit.api.model.SigiloPrivilegio;
13 import br.com.centralit.api.model.UnidadeProcesso; 17 import br.com.centralit.api.model.UnidadeProcesso;
14 import br.com.centralit.framework.dao.arquitetura.CitGenericDAOImpl; 18 import br.com.centralit.framework.dao.arquitetura.CitGenericDAOImpl;
15 import br.com.centralit.framework.dao.arquitetura.SearchSeven; 19 import br.com.centralit.framework.dao.arquitetura.SearchSeven;
  20 +import br.com.centralit.framework.model.GrupoPrivilegio;
16 import br.com.centralit.framework.model.Usuario; 21 import br.com.centralit.framework.model.Usuario;
17 import br.com.centralit.framework.util.UtilColecao; 22 import br.com.centralit.framework.util.UtilColecao;
  23 +import br.com.centralit.framework.util.UtilObjeto;
18 24
19 import com.googlecode.genericdao.search.Filter; 25 import com.googlecode.genericdao.search.Filter;
20 import com.googlecode.genericdao.search.ISearch; 26 import com.googlecode.genericdao.search.ISearch;
@@ -178,6 +184,7 @@ public class UnidadeProcessoDaoHibernate extends CitGenericDAOImpl implements Un @@ -178,6 +184,7 @@ public class UnidadeProcessoDaoHibernate extends CitGenericDAOImpl implements Un
178 184
179 /** 185 /**
180 * Método responsável por listar processos através da unidade do usuário 186 * Método responsável por listar processos através da unidade do usuário
  187 + *
181 * @author rogerio.cassimiro 188 * @author rogerio.cassimiro
182 * @param search 189 * @param search
183 * @param usuario 190 * @param usuario
@@ -187,24 +194,103 @@ public class UnidadeProcessoDaoHibernate extends CitGenericDAOImpl implements Un @@ -187,24 +194,103 @@ public class UnidadeProcessoDaoHibernate extends CitGenericDAOImpl implements Un
187 @Override 194 @Override
188 public <RT> SearchResult<RT> searchAndCountPorUnidade(ISearch search, Usuario usuario, Long idStatus) { 195 public <RT> SearchResult<RT> searchAndCountPorUnidade(ISearch search, Usuario usuario, Long idStatus) {
189 196
  197 + //Filtro de permissões herdadas através de grupos
  198 + DetachedCriteria detachedCriteriaPrivilegio = findSigiloUsuarioContemPermissaoAtravesDosGrupos(usuario);
  199 +
  200 + // Filtro da credencial do processo
  201 + DetachedCriteria detachedCredencialProcesso = findProcessoSigilosoPorCredencial(usuario);
  202 +
  203 + // Filtro da unidade, para processos públicos e restritos.
190 search.getFilters().add(Filter.or(Filter.not(Filter.equal("processo.status.id", idStatus)), Filter.isEmpty("processo.status.id"))); 204 search.getFilters().add(Filter.or(Filter.not(Filter.equal("processo.status.id", idStatus)), Filter.isEmpty("processo.status.id")));
191 -  
192 - Criteria criteriaPrivilegio = this.newCriteria(SigiloPrivilegio.class);  
193 - criteriaPrivilegio.setProjection(Projections.property("sigilo.id"));  
194 - criteriaPrivilegio.createAlias("privilegio", "privilegio");  
195 - criteriaPrivilegio.createAlias("privilegio.grupoPrivilegios", "grupoPrivilegio");  
196 - criteriaPrivilegio.add(Restrictions.isNull("grupoPrivilegio.dataInativo"));  
197 - criteriaPrivilegio.createCriteria("grupoPrivilegio.grupo").createAlias("grupoUsuarios", "grupoUsuario");  
198 - criteriaPrivilegio.add(Restrictions.isNull("grupoUsuario.dataInativo"));  
199 - criteriaPrivilegio.add(Restrictions.eq("grupoUsuario.usuario.id", usuario.getId()));  
200 -  
201 - search.getFilters().add(Filter.equal("processo.autor.id", usuario.getId())); 205 +
  206 + // Verifica se o usuario está lotado na unidade
  207 + if (UtilObjeto.isReferencia(usuario.getUnidade())) {
  208 +
  209 + search.getFilters().add(Filter.equal("unidade.id", usuario.getUnidade().getId()));
  210 + }
  211 +
  212 + Criteria criteriaProcessoSigiloso = this.newCriteria(Processo.class);
  213 +
  214 + criteriaProcessoSigiloso.setProjection(Projections.property("id"));
  215 +
  216 + criteriaProcessoSigiloso.add(Restrictions.or(Subqueries.propertyIn("sigilo.id", detachedCriteriaPrivilegio), Subqueries.propertyIn("id", detachedCredencialProcesso)));
  217 +
202 search.getFilters().add(Filter.isNotNull("processo.idProcessInstance")); 218 search.getFilters().add(Filter.isNotNull("processo.idProcessInstance"));
203 -// search.getFilters().add(Filter.or(  
204 -// Filter.in("processo.autor.id", usuario.getId()),  
205 -// Filter.in("unidade.id", usuario.getUnidade().getId()),  
206 -// Filter.in("processo.sigilo.id", criteriaPrivilegio.list())));  
207 -// 219 +
  220 + search.getFilters().add(Filter.or(Filter.equal("processo.autor.id", usuario.getId()), Filter.isNull("processo.sigilo"), Filter.in("processo.id", criteriaProcessoSigiloso.list())));
  221 +
208 return super.searchAndCount(search); 222 return super.searchAndCount(search);
209 } 223 }
  224 +
  225 + /**
  226 + * <p>
  227 + * <b>Iniciativa(s):</b> <a href="LINK_PORTAL">NUMERO_INICIATIVA</a>
  228 + * </p>
  229 + *
  230 + * <p>
  231 + * <b>Regra(s) de negócio:</b> <a href="LINK_PORTAL">NUMERO_REGRA_DE_NEGOCIO</a>
  232 + * </p>
  233 + *
  234 + * Método responsável por retornar os ids dos processo sigilosos que o usuário tem permissão, adicionado diretamente para o usuário e grupo que o mesmo está vinculado.
  235 + *
  236 + * @author rogerio.costa
  237 + *
  238 + * @param usuario
  239 + * @return DetachedCriteria/ Processo.id
  240 + */
  241 + private DetachedCriteria findProcessoSigilosoPorCredencial(Usuario usuario) {
  242 +
  243 + DetachedCriteria detachedCredencialProcesso = DetachedCriteria.forClass(CredencialProcesso.class);
  244 +
  245 + detachedCredencialProcesso.setProjection(Projections.property("processo.id"));
  246 +
  247 + detachedCredencialProcesso.createAlias("grupo", "grupo", JoinType.LEFT_OUTER_JOIN);
  248 +
  249 + detachedCredencialProcesso.createAlias("grupo.grupoUsuarios", "grupoUsuario", JoinType.LEFT_OUTER_JOIN);
  250 +
  251 + detachedCredencialProcesso.add(Restrictions.isNull("grupoUsuario.dataInativo"));
  252 +
  253 + detachedCredencialProcesso.add(Restrictions.or(Restrictions.eq("grupoUsuario.usuario.id", usuario.getId()), Restrictions.eq("usuario.id", usuario.getId())));
  254 +
  255 + detachedCredencialProcesso.add(Restrictions.isNull("dataInativo"));
  256 +
  257 + return detachedCredencialProcesso;
  258 + }
  259 +
  260 + /**
  261 + * <p>
  262 + * <b>Iniciativa(s):</b> <a href="LINK_PORTAL">NUMERO_INICIATIVA</a>
  263 + * </p>
  264 + *
  265 + * <p>
  266 + * <b>Regra(s) de negócio:</b> <a href="LINK_PORTAL">NUMERO_REGRA_DE_NEGOCIO</a>
  267 + * </p>
  268 + *
  269 + * Método responsável por retornar um detachedCriteria com os ids dos sigilos que o usuário tem permissão. O mesmo é consultado através dos grupos que o usuário pertence.
  270 + *
  271 + * @author rogerio.costa
  272 + *
  273 + * @param usuario
  274 + * @return DetachedCriteria/Sigilo.id
  275 + */
  276 + private DetachedCriteria findSigiloUsuarioContemPermissaoAtravesDosGrupos(Usuario usuario) {
  277 +
  278 + DetachedCriteria detachedCriteriaPrivilegio = DetachedCriteria.forClass(SigiloPrivilegio.class);
  279 +
  280 + detachedCriteriaPrivilegio.setProjection(Projections.property("sigilo.id"));
  281 +
  282 + detachedCriteriaPrivilegio.createAlias("privilegio", "privilegio");
  283 +
  284 + detachedCriteriaPrivilegio.createAlias("privilegio.grupoPrivilegios", "grupoPrivilegio");
  285 +
  286 + detachedCriteriaPrivilegio.add(Restrictions.isNull("grupoPrivilegio.dataInativo"));
  287 +
  288 + detachedCriteriaPrivilegio.createCriteria("grupoPrivilegio.grupo").createAlias("grupoUsuarios", "grupoUsuario");
  289 +
  290 + detachedCriteriaPrivilegio.add(Restrictions.isNull("grupoUsuario.dataInativo"));
  291 +
  292 + detachedCriteriaPrivilegio.add(Restrictions.eq("grupoUsuario.usuario.id", usuario.getId()));
  293 +
  294 + return detachedCriteriaPrivilegio;
  295 + }
210 } 296 }
cit-ecm-api/src/main/java/br/com/centralit/api/model/Processo.java
@@ -112,6 +112,7 @@ public class Processo extends PersistentObjectUnidade { @@ -112,6 +112,7 @@ public class Processo extends PersistentObjectUnidade {
112 112
113 /** Atributo nup. */ 113 /** Atributo nup. */
114 @JsonView({ Views.ProcessoEdit.class}) 114 @JsonView({ Views.ProcessoEdit.class})
  115 + @ManyToOne(fetch = FetchType.LAZY)
115 private Dominio tipoProtocolo; 116 private Dominio tipoProtocolo;
116 117
117 /** Atributo observacaoGeral. */ 118 /** Atributo observacaoGeral. */
cit-ecm-api/src/main/java/br/com/centralit/api/service/impl/ProcessoServiceImpl.java
@@ -153,6 +153,8 @@ public class ProcessoServiceImpl extends GenericServiceImpl&lt;Processo, Long&gt; impl @@ -153,6 +153,8 @@ public class ProcessoServiceImpl extends GenericServiceImpl&lt;Processo, Long&gt; impl
153 public Processo save(Processo entity) { 153 public Processo save(Processo entity) {
154 154
155 this.validarEntidade(entity, this.validator); 155 this.validarEntidade(entity, this.validator);
  156 +
  157 + this.validarUnidade();
156 158
157 this.montarEntidade(entity); 159 this.montarEntidade(entity);
158 entity.setSigiloOriginal(entity.getSigilo()); 160 entity.setSigiloOriginal(entity.getSigilo());
@@ -181,6 +183,23 @@ public class ProcessoServiceImpl extends GenericServiceImpl&lt;Processo, Long&gt; impl @@ -181,6 +183,23 @@ public class ProcessoServiceImpl extends GenericServiceImpl&lt;Processo, Long&gt; impl
181 } 183 }
182 184
183 /** 185 /**
  186 + * <p><b>Iniciativa(s):</b> <a href="LINK_PORTAL">NUMERO_INICIATIVA</a></p>
  187 + *
  188 + * <p><b>Regra(s) de negócio:</b> <a href="LINK_PORTAL">NUMERO_REGRA_DE_NEGOCIO</a></p>
  189 + *
  190 + * Método responsável por validar a unidade vigente
  191 + *
  192 + * @author rogerio.costa
  193 + *
  194 + */
  195 + private void validarUnidade() {
  196 +
  197 + if (!UtilObjeto.isReferencia(this.getUsuario().getUnidade())) {
  198 + throw new BusinessException("ECM.VALIDACAO.ERRO_UNIDADE_ECM_VIGENTE_USUARIO", CodigoErro.REGRA_NEGOCIO.getValue());
  199 + }
  200 + }
  201 +
  202 + /**
184 * 203 *
185 * <p> 204 * <p>
186 * <b>Iniciativa(s):</b> <a href="LINK_PORTAL">NUMERO_INICIATIVA</a> 205 * <b>Iniciativa(s):</b> <a href="LINK_PORTAL">NUMERO_INICIATIVA</a>
cit-ecm-web/src/main/java/br/com/centralit/listener/StartupListenerEcm.java
@@ -405,7 +405,6 @@ public class StartupListenerEcm extends UtilStartup implements ApplicationListen @@ -405,7 +405,6 @@ public class StartupListenerEcm extends UtilStartup implements ApplicationListen
405 internacionalizacaoList.add(new Internacionalizacao("ECM.LABEL.NOME_NOVO_SUPORTE ", "Nome do suporte", dominio, modulo)); 405 internacionalizacaoList.add(new Internacionalizacao("ECM.LABEL.NOME_NOVO_SUPORTE ", "Nome do suporte", dominio, modulo));
406 internacionalizacaoList.add(new Internacionalizacao("ECM.LABEL.NOVO_TIPO_SUPORTE ", "Novo tipo suporte de documento", dominio, modulo)); 406 internacionalizacaoList.add(new Internacionalizacao("ECM.LABEL.NOVO_TIPO_SUPORTE ", "Novo tipo suporte de documento", dominio, modulo));
407 internacionalizacaoList.add(new Internacionalizacao("ECM.LABEL.TIPO_SUPORTE_DOCUMENTO ", "Tipo suporte de documento", dominio, modulo)); 407 internacionalizacaoList.add(new Internacionalizacao("ECM.LABEL.TIPO_SUPORTE_DOCUMENTO ", "Tipo suporte de documento", dominio, modulo));
408 -  
409 internacionalizacaoList.add(new Internacionalizacao("ECM.LABEL.TARJAS_ASSINATURA", "Tarjas de assinatura", dominio, modulo)); 408 internacionalizacaoList.add(new Internacionalizacao("ECM.LABEL.TARJAS_ASSINATURA", "Tarjas de assinatura", dominio, modulo));
410 internacionalizacaoList.add(new Internacionalizacao("ECM.LABEL.LOGO_TARJA_ASSINATURA", "Logotipo da tarja de assinatura", dominio, modulo)); 409 internacionalizacaoList.add(new Internacionalizacao("ECM.LABEL.LOGO_TARJA_ASSINATURA", "Logotipo da tarja de assinatura", dominio, modulo));
411 internacionalizacaoList.add(new Internacionalizacao("ECM.LABEL.DADOS_TARJA_ASSINATURA", "Dados da tarja de assinatura", dominio, modulo)); 410 internacionalizacaoList.add(new Internacionalizacao("ECM.LABEL.DADOS_TARJA_ASSINATURA", "Dados da tarja de assinatura", dominio, modulo));
@@ -413,6 +412,18 @@ public class StartupListenerEcm extends UtilStartup implements ApplicationListen @@ -413,6 +412,18 @@ public class StartupListenerEcm extends UtilStartup implements ApplicationListen
413 internacionalizacaoList.add(new Internacionalizacao("ECM.LABEL.CONTEUDO_HTML", "Conteúdo HTML", dominio, modulo)); 412 internacionalizacaoList.add(new Internacionalizacao("ECM.LABEL.CONTEUDO_HTML", "Conteúdo HTML", dominio, modulo));
414 internacionalizacaoList.add(new Internacionalizacao("ECM.LABEL.REMOVER_IMAGEM", "Remover imagem", dominio, modulo)); 413 internacionalizacaoList.add(new Internacionalizacao("ECM.LABEL.REMOVER_IMAGEM", "Remover imagem", dominio, modulo));
415 internacionalizacaoList.add(new Internacionalizacao("ECM.LABEL.CAMPOS_DINAMICOS", "Campos Dinâmicos", dominio, modulo)); 414 internacionalizacaoList.add(new Internacionalizacao("ECM.LABEL.CAMPOS_DINAMICOS", "Campos Dinâmicos", dominio, modulo));
  415 + internacionalizacaoList.add(new Internacionalizacao("ECM.LABEL.SOBRESTAR_SEM", "Sobrestar", dominio, modulo));
  416 + internacionalizacaoList.add(new Internacionalizacao("ECM.LABEL.SOBRESTADA", "Sobrestada", dominio, modulo));
  417 + internacionalizacaoList.add(new Internacionalizacao("ECM.LABEL.SITUACAO_INSTANCIA_TAREFA", "Situação instância tarefa", dominio, modulo));
  418 + internacionalizacaoList.add(new Internacionalizacao("ECM.LABEL.NIVEL_DE_ACESSO", "Nível de acesso", dominio, modulo));
  419 + internacionalizacaoList.add(new Internacionalizacao("ECM.LABEL.ASSUNTO_COMPLEMENTAR", "Assunto complementar", dominio, modulo));
  420 + internacionalizacaoList.add(new Internacionalizacao("ECM.LABEL.ASSINATURAS_DOCUMENTO", "Assinaturas do Documento", dominio, modulo));
  421 + internacionalizacaoList.add(new Internacionalizacao("ECM.LABEL.ASSINANTE", "Assinante", dominio, modulo));
  422 + internacionalizacaoList.add(new Internacionalizacao("ECM.LABEL.CARGO_FUNCAO", "Cargo/Função", dominio, modulo));
  423 + internacionalizacaoList.add(new Internacionalizacao("ECM.LABEL.OU", "ou", dominio, modulo));
  424 + internacionalizacaoList.add(new Internacionalizacao("ECM.LABEL.CERTIFICADO_DIGITAL", "Certificado Digital", dominio, modulo));
  425 + internacionalizacaoList.add(new Internacionalizacao("ECM.LABEL.ASSINATURA_DOCUMENTO", "Assinatura de Documento", dominio, modulo));
  426 + internacionalizacaoList.add(new Internacionalizacao("ECM.LABEL.ASSINAR", "Assinar", dominio, modulo));
416 } 427 }
417 428
418 /** 429 /**