Commit 7ef43825f9b27f5fe22e6e3481ef79995caa95f0
1 parent
5de24bed
Exists in
master
[2866]-Alterar a Grid de Processos (Listagem)
Showing
4 changed files
with
134 additions
and
17 deletions
Show diff stats
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<Processo, Long> impl | @@ -153,6 +153,8 @@ public class ProcessoServiceImpl extends GenericServiceImpl<Processo, Long> 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<Processo, Long> impl | @@ -181,6 +183,23 @@ public class ProcessoServiceImpl extends GenericServiceImpl<Processo, Long> 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 | /** |