Commit e6a6d14cc9b533c2b75890203b1ea3dbcf47fef6
1 parent
5686a9b8
Exists in
master
#3216 - Classificar a Informação de Documentos e Processos
Showing
4 changed files
with
102 additions
and
39 deletions
Show diff stats
cit-ecm-api/src/main/java/br/com/centralit/api/model/DocumentoGed.java
... | ... | @@ -66,7 +66,7 @@ import com.fasterxml.jackson.databind.annotation.JsonSerialize; |
66 | 66 | * |
67 | 67 | */ |
68 | 68 | @Entity |
69 | -@JsonIgnoreProperties({ "$checked" }) | |
69 | +@JsonIgnoreProperties({ "$checked", "nivelAcessoList" }) | |
70 | 70 | public class DocumentoGed extends PersistentObjectUnidade implements Cloneable { |
71 | 71 | |
72 | 72 | /** Atributo serialVersionUID. */ | ... | ... |
cit-ecm-api/src/main/java/br/com/centralit/api/service/impl/DocumentoGedServiceImpl.java
... | ... | @@ -26,9 +26,11 @@ import br.com.centralit.api.model.DocumentoGed; |
26 | 26 | import br.com.centralit.api.model.InteressadoDocumento; |
27 | 27 | import br.com.centralit.api.model.Processo; |
28 | 28 | import br.com.centralit.api.service.AnexoGedService; |
29 | +import br.com.centralit.api.service.CredencialProcessoService; | |
29 | 30 | import br.com.centralit.api.service.DocumentoGedService; |
30 | 31 | import br.com.centralit.api.service.DominioService; |
31 | 32 | import br.com.centralit.api.service.NivelAcessoTipoDocumentoService; |
33 | +import br.com.centralit.api.service.NotificacaoService; | |
32 | 34 | import br.com.centralit.api.service.PlanoClassificacaoService; |
33 | 35 | import br.com.centralit.api.service.ProcessoService; |
34 | 36 | import br.com.centralit.api.service.SigiloService; |
... | ... | @@ -38,6 +40,9 @@ import br.com.centralit.api.service.UnidadeProcessoService; |
38 | 40 | import br.com.centralit.framework.exception.BusinessException; |
39 | 41 | import br.com.centralit.framework.exception.CodigoErro; |
40 | 42 | import br.com.centralit.framework.model.Dominio; |
43 | +import br.com.centralit.framework.model.Grupo; | |
44 | +import br.com.centralit.framework.model.Notificacao; | |
45 | +import br.com.centralit.framework.model.NotificacaoGrupo; | |
41 | 46 | import br.com.centralit.framework.service.arquitetura.GedFileService; |
42 | 47 | import br.com.centralit.framework.service.arquitetura.GenericServiceImpl; |
43 | 48 | import br.com.centralit.framework.util.UtilColecao; |
... | ... | @@ -124,6 +129,14 @@ public class DocumentoGedServiceImpl extends GenericServiceImpl<DocumentoGed, Lo |
124 | 129 | @Autowired |
125 | 130 | private UnidadeProcessoService unidadeProcessoService; |
126 | 131 | |
132 | + /** Atributo notificacaoService. */ | |
133 | + @Autowired | |
134 | + private NotificacaoService notificacaoService; | |
135 | + | |
136 | + /** Atributo credencialProcessoService. */ | |
137 | + @Autowired | |
138 | + private CredencialProcessoService credencialProcessoService; | |
139 | + | |
127 | 140 | /** Atributo solrService. */ |
128 | 141 | @Autowired |
129 | 142 | private SolrService solrService; |
... | ... | @@ -276,6 +289,7 @@ public class DocumentoGedServiceImpl extends GenericServiceImpl<DocumentoGed, Lo |
276 | 289 | entity.setSigilo(this.sigiloService.getReference(entity.getSigilo().getId())); |
277 | 290 | entity.setStatus(this.dominioService.findByChaveAndCodigo("statusDocumentoGed", 0L)); |
278 | 291 | this.atribuirPrazoPadraoDocumento(entity); |
292 | + this.enviarNotificacaoDocumentoSigiloso(entity); | |
279 | 293 | } else { |
280 | 294 | |
281 | 295 | entity.setSigilo(null); |
... | ... | @@ -293,7 +307,7 @@ public class DocumentoGedServiceImpl extends GenericServiceImpl<DocumentoGed, Lo |
293 | 307 | * <b>Regra(s) de negócio:</b> <a href="LINK_PORTAL">NUMERO_REGRA_DE_NEGOCIO</a> |
294 | 308 | * </p> |
295 | 309 | * |
296 | - * Método responsável por | |
310 | + * Método responsável por validar o nivel de acesso do documento | |
297 | 311 | * |
298 | 312 | * @author andre.silva |
299 | 313 | * |
... | ... | @@ -302,28 +316,31 @@ public class DocumentoGedServiceImpl extends GenericServiceImpl<DocumentoGed, Lo |
302 | 316 | */ |
303 | 317 | private void validarNivelAcessoDocumento(DocumentoGed entity) { |
304 | 318 | |
305 | - if (entity.getProcesso().getNivelAcesso().getNivelAcesso().getCodigo() == 0L && entity.getNivelAcesso().getNivelAcesso().getCodigo() == 2L) { | |
306 | - throw new BusinessException(DocumentoGedServiceImpl.VALIDAR_NIVEL_ACESSO, CodigoErro.REGRA_NEGOCIO.getValue()); | |
307 | - } else if (entity.getProcesso().getNivelAcesso().getNivelAcesso().getCodigo() == 1L) { | |
308 | - if (entity.getNivelAcesso().getNivelAcesso().getCodigo() != 1L && !UtilObjeto.isReferencia(entity.getSigilo())) { | |
309 | - throw new BusinessException(DocumentoGedServiceImpl.VALIDAR_NIVEL_ACESSO, CodigoErro.REGRA_NEGOCIO.getValue()); | |
310 | - } | |
311 | - } else if (entity.getProcesso().getNivelAcesso().getNivelAcesso().getCodigo() == 2L) { | |
312 | - if (entity.getNivelAcesso().getNivelAcesso().getCodigo() == 0L) { | |
313 | - throw new BusinessException(DocumentoGedServiceImpl.VALIDAR_NIVEL_ACESSO, CodigoErro.REGRA_NEGOCIO.getValue()); | |
314 | - } | |
315 | - } | |
319 | + if (entity.getProcesso().getNivelAcesso().getNivelAcesso().getCodigo() != 2L) { | |
316 | 320 | |
317 | - if (UtilObjeto.isReferencia(entity.getProcesso().getSigilo())) { | |
318 | - if (entity.getProcesso().getSigilo().getTipoSigilo().getCodigo() == 1L) { | |
319 | - if (entity.getSigilo().getTipoSigilo().getCodigo() == 0L) { | |
321 | + if (entity.getProcesso().getNivelAcesso().getNivelAcesso().getCodigo() == 0L && entity.getNivelAcesso().getNivelAcesso().getCodigo() == 2L) { | |
322 | + throw new BusinessException(DocumentoGedServiceImpl.VALIDAR_NIVEL_ACESSO, CodigoErro.REGRA_NEGOCIO.getValue()); | |
323 | + } else if (entity.getProcesso().getNivelAcesso().getNivelAcesso().getCodigo() == 1L) { | |
324 | + if (entity.getNivelAcesso().getNivelAcesso().getCodigo() != 1L && !UtilObjeto.isReferencia(entity.getSigilo())) { | |
320 | 325 | throw new BusinessException(DocumentoGedServiceImpl.VALIDAR_NIVEL_ACESSO, CodigoErro.REGRA_NEGOCIO.getValue()); |
321 | 326 | } |
322 | - } else if (entity.getProcesso().getSigilo().getTipoSigilo().getCodigo() == 2L) { | |
323 | - if (!UtilObjeto.isReferencia(entity.getSigilo()) || entity.getSigilo().getTipoSigilo().getCodigo() != 2L) { | |
327 | + } else if (entity.getProcesso().getNivelAcesso().getNivelAcesso().getCodigo() == 2L) { | |
328 | + if (entity.getNivelAcesso().getNivelAcesso().getCodigo() == 0L) { | |
324 | 329 | throw new BusinessException(DocumentoGedServiceImpl.VALIDAR_NIVEL_ACESSO, CodigoErro.REGRA_NEGOCIO.getValue()); |
325 | 330 | } |
326 | 331 | } |
332 | + | |
333 | + if (UtilObjeto.isReferencia(entity.getProcesso().getSigilo())) { | |
334 | + if (entity.getProcesso().getSigilo().getTipoSigilo().getCodigo() == 1L) { | |
335 | + if (entity.getSigilo().getTipoSigilo().getCodigo() == 0L) { | |
336 | + throw new BusinessException(DocumentoGedServiceImpl.VALIDAR_NIVEL_ACESSO, CodigoErro.REGRA_NEGOCIO.getValue()); | |
337 | + } | |
338 | + } else if (entity.getProcesso().getSigilo().getTipoSigilo().getCodigo() == 2L) { | |
339 | + if (!UtilObjeto.isReferencia(entity.getSigilo()) || entity.getSigilo().getTipoSigilo().getCodigo() != 2L) { | |
340 | + throw new BusinessException(DocumentoGedServiceImpl.VALIDAR_NIVEL_ACESSO, CodigoErro.REGRA_NEGOCIO.getValue()); | |
341 | + } | |
342 | + } | |
343 | + } | |
327 | 344 | } |
328 | 345 | |
329 | 346 | } |
... | ... | @@ -816,6 +833,8 @@ public class DocumentoGedServiceImpl extends GenericServiceImpl<DocumentoGed, Lo |
816 | 833 | if (!UtilColecao.isVazio(listaDocumentos)) { |
817 | 834 | for (DocumentoGed documento : listaDocumentos) { |
818 | 835 | DocumentoGed entity = (DocumentoGed) this.documentoGedDao.getReference(documento.getId()); |
836 | + documento.setProcesso(entity.getProcesso()); | |
837 | + this.validarNivelAcessoDocumento(documento); | |
819 | 838 | entity.setSigiloOriginal(documento.getSigilo()); |
820 | 839 | entity.setNivelAcessoOriginal(documento.getNivelAcesso()); |
821 | 840 | entity.setSigilo(documento.getSigilo()); |
... | ... | @@ -1008,6 +1027,51 @@ public class DocumentoGedServiceImpl extends GenericServiceImpl<DocumentoGed, Lo |
1008 | 1027 | * <b>Regra(s) de negócio:</b> <a href="LINK_PORTAL">NUMERO_REGRA_DE_NEGOCIO</a> |
1009 | 1028 | * </p> |
1010 | 1029 | * |
1030 | + * Método responsável por enviar notificação para os responsável sobre a criação do documento sigiloso | |
1031 | + * | |
1032 | + * @author rogerio.costa | |
1033 | + * | |
1034 | + * @param DocumentoGed | |
1035 | + */ | |
1036 | + private void enviarNotificacaoDocumentoSigiloso(DocumentoGed documentoGed) { | |
1037 | + | |
1038 | + StringBuilder sb = new StringBuilder(); | |
1039 | + | |
1040 | + sb.append("O documento ").append(documentoGed.getNumero()).append(" foi criado como ").append(documentoGed.getSigilo().getTipoSigilo().getDescricao()); | |
1041 | + | |
1042 | + Dominio tipoNotificacao = this.dominioService.findByChaveAndCodigo("tipoNotificacao", 4L); | |
1043 | + | |
1044 | + Dominio tipoPrioridade = this.dominioService.findByChaveAndCodigo("tipoPrioridade", 2L); | |
1045 | + | |
1046 | + Notificacao notificacao = new Notificacao("Documento sigiloso", sb.toString(), tipoNotificacao, tipoPrioridade, null, null, null); | |
1047 | + | |
1048 | + Collection<Grupo> grupos = this.credencialProcessoService.findGrupoPorSigilo(documentoGed.getSigilo()); | |
1049 | + | |
1050 | + if (!UtilColecao.isVazio(grupos)) { | |
1051 | + | |
1052 | + notificacao.setNotificacaoGrupos(new LinkedList<NotificacaoGrupo>()); | |
1053 | + | |
1054 | + for (Grupo grupo : grupos) { | |
1055 | + | |
1056 | + NotificacaoGrupo notificacaoGrupo = new NotificacaoGrupo(grupo, notificacao); | |
1057 | + | |
1058 | + notificacao.getNotificacaoGrupos().add(notificacaoGrupo); | |
1059 | + } | |
1060 | + | |
1061 | + } | |
1062 | + | |
1063 | + this.notificacaoService.save(notificacao); | |
1064 | + } | |
1065 | + | |
1066 | + /** | |
1067 | + * <p> | |
1068 | + * <b>Iniciativa(s):</b> <a href="LINK_PORTAL">NUMERO_INICIATIVA</a> | |
1069 | + * </p> | |
1070 | + * | |
1071 | + * <p> | |
1072 | + * <b>Regra(s) de negócio:</b> <a href="LINK_PORTAL">NUMERO_REGRA_DE_NEGOCIO</a> | |
1073 | + * </p> | |
1074 | + * | |
1011 | 1075 | * Método responsável por obter através do id do PlanoClassificacao |
1012 | 1076 | * |
1013 | 1077 | * @author rogerio.costa | ... | ... |
cit-ecm-web/src/main/webapp/assets/js/angular/custom/controller/ClassificarDocumentoProcessoController.js
... | ... | @@ -34,7 +34,6 @@ citApp.controller('ClassificarDocumentoProcessoController', ['$scope', 'Processo |
34 | 34 | delete item.unidadeNome; |
35 | 35 | delete item.documentoVersao; |
36 | 36 | delete item.originalElement; |
37 | - delete item.nivelAcessoList; | |
38 | 37 | |
39 | 38 | if(item.nivelAcesso != undefined && item.nivelAcesso.sigilos != null){ |
40 | 39 | angular.forEach(item.nivelAcesso.sigilos, function (item) { |
... | ... | @@ -121,12 +120,12 @@ citApp.controller('ClassificarDocumentoProcessoController', ['$scope', 'Processo |
121 | 120 | }); |
122 | 121 | }; |
123 | 122 | |
124 | - $scope.limparSigilo = function(documento){ | |
123 | + $scope.limparSigilo = function(object){ | |
125 | 124 | |
126 | 125 | $timeout(function(){ |
127 | - if(documento.nivelAcesso.nivelAcesso.codigo != 0){ | |
126 | + if(object.nivelAcesso && object.nivelAcesso.nivelAcesso.codigo != 0){ | |
128 | 127 | |
129 | - documento.sigilo = null; | |
128 | + object.sigilo = null; | |
130 | 129 | |
131 | 130 | } |
132 | 131 | }); |
... | ... | @@ -134,8 +133,12 @@ citApp.controller('ClassificarDocumentoProcessoController', ['$scope', 'Processo |
134 | 133 | |
135 | 134 | $scope.findPorIdTipoProcesso = function(idTipoProcesso){ |
136 | 135 | |
136 | + $scope.nivelAcessoList = []; | |
137 | + | |
137 | 138 | NivelAcessoTipoProcessoRepository.findPorIdTipoProcesso(idTipoProcesso).then(function(result) { |
138 | - $scope.nivelAcessoList = result; | |
139 | + | |
140 | + $scope.nivelAcessoList = result; | |
141 | + | |
139 | 142 | }); |
140 | 143 | }; |
141 | 144 | ... | ... |
cit-ecm-web/src/main/webapp/html/classificarProcessoDocumento/classificarProcessoDocumento.html
... | ... | @@ -60,24 +60,20 @@ |
60 | 60 | <div class="col-md-4"> |
61 | 61 | <label-select ng-id="processoValidacao.nivelAcesso" ng-label="ECM.LABEL.NIVEL_ACESSO" ng-disabled="aprovado" ng-model="processoValidacao.nivelAcesso" |
62 | 62 | form="classificarDocumentoclassificarDocumentoProcessoForm" ng-obrigatorio="true" |
63 | - ng-custom-options="nivelAcessoTipoProcesso.originalElement as nivelAcessoTipoProcesso.nivelAcesso.descricao for nivelAcessoTipoProcesso" track-by="track by nivelAcessoTipoProcesso.id" | |
64 | - ng-list="nivelAcessoList" /> | |
63 | + ng-custom-options="nivelAcessoTipoProcesso.originalElement as nivelAcessoTipoProcesso.nivelAcesso.descricao for nivelAcessoTipoProcesso" | |
64 | + ng-list="nivelAcessoList" ng-custom-change="limparSigilo(processoValidacao)" track-by="track by nivelAcessoTipoProcesso.id"/> | |
65 | 65 | </div> |
66 | 66 | |
67 | 67 | <div class="col-md-4" ng-show="processoValidacao.nivelAcesso.nivelAcesso.codigo == 0"> |
68 | 68 | <div class="form-group"> |
69 | - <label class="control-label block" | |
70 | - ng-class="{'has-error': classificarDocumentoProcessoForm['processoValidacao.sigilo.id'].$error.required && (!classificarDocumentoProcessoForm['processoValidacao.sigilo.id'].$pristine || classificarDocumentoProcessoForm.$submitted)}"> | |
71 | - <translate>ECM.LABEL.SIGILO</translate> <span class="red">*</span> <i | |
72 | - ng-show="classificarDocumentoProcessoForm['processoValidacao.sigilo.id'].$error.required && (!classificarDocumentoProcessoForm['processoValidacao.sigilo.id'].$pristine || classificarDocumentoProcessoForm.$submitted)" | |
73 | - class='fa fa-warning red' tooltip="{{$translate.instant('LABEL.SIGILO') + ' ' +$translate.instant('LABEL.CAMPO_OBRIGATORIO')}}" tooltip-placement='top'></i> | |
74 | - </label> | |
75 | - | |
76 | - <label-select ng-id="processoValidacao.sigilo" ng-model="processoValidacao.sigilo" form="classificarDocumentoProcessoForm" | |
77 | - ng-custom-options="sigilo.originalElement as sigilo.tipoSigilo.descricao for sigilo" track-by="track by sigilo.id" ng-list="sigilos" ng-disabled="aprovado" /> | |
69 | + | |
70 | + <label-select ng-id="processoValidacao.sigilo" ng-model="processoValidacao.sigilo" form="classificarDocumentoProcessoForm" ng-LABEL="ECM.LABEL.SIGILO" | |
71 | + ng-custom-options="sigiloTipoProcesso.sigilo as sigiloTipoProcesso.sigilo.tipoSigilo.descricao for sigiloTipoProcesso" | |
72 | + ng-list="processoValidacao.nivelAcesso.sigilos" ng-disabled="aprovado" ng-obrigatorio='processoValidacao.nivelAcesso.nivelAcesso.codigo == 0'/> | |
73 | + | |
78 | 74 | </div> |
79 | 75 | </div> |
80 | - | |
76 | + | |
81 | 77 | <div class="col-md-4"> |
82 | 78 | <label-input-checkbox ng-model="validado" ng-label="ECM.LABEL.VALIDADO"></label-input-checkbox> |
83 | 79 | </div> |
... | ... | @@ -102,7 +98,7 @@ |
102 | 98 | <tr> |
103 | 99 | <th style="width: 15%;" class="text-center"><translate>ECM.LABEL.NUM_DOCUMENTO</translate></th> |
104 | 100 | <th style="width: 20%;" class="text-center"><translate>ECM.LABEL.TIPODOCUMENTO</translate></th> |
105 | - <th class="text-center"><translate>ECM.LABEL.NIVEL_PROPOSTO</translate></th> | |
101 | + <th style="width: 46%" class="text-center"><translate>ECM.LABEL.NIVEL_PROPOSTO</translate></th> | |
106 | 102 | <th class="text-center"><translate>ECM.LABEL.NIVEL_REVISADO</translate></th> |
107 | 103 | |
108 | 104 | </tr> |
... | ... | @@ -114,13 +110,13 @@ |
114 | 110 | <td> |
115 | 111 | <div class="row"> |
116 | 112 | <div class="col-md-6"> |
117 | - <label-select ng-id="documentoValidacao.nivelAcesso" ng-model="documentoValidacao.nivelAcesso" form="classificarDocumentoProcessoForm" | |
113 | + <label-select ng-id="documentoValidacao.nivelAcesso" ng-model="documentoValidacao.nivelAcesso" form="classificarDocumentoProcessoForm" ng-obrigatorio="true" | |
118 | 114 | ng-custom-options="nivelAcessoTipoDocumento as nivelAcessoTipoDocumento.nivelAcesso.descricao for nivelAcessoTipoDocumento" |
119 | 115 | track-by="track by nivelAcessoTipoDocumento.id" ng-list="documentoValidacao.nivelAcessoList" ng-custom-change="limparSigilo(documentoValidacao)"/> |
120 | 116 | </div> |
121 | 117 | <div class="col-md-6" ng-show='documentoValidacao.nivelAcesso.nivelAcesso.codigo == 0'> |
122 | - <label-select ng-id="documentoValidacao.sigilo" ng-model="documentoValidacao.sigilo" form="classificarDocumentoProcessoForm" | |
123 | - ng-custom-options="sigiloTipoDocumento.sigilo as sigiloTipoDocumento.tipoSigiloDescricao for sigiloTipoDocumento" track-by="track by sigiloTipoDocumento.sigilo.id" ng-list="documentoValidacao.nivelAcesso.sigilos" /> | |
118 | + <label-select ng-id="documentoValidacao.sigilo" ng-model="documentoValidacao.sigilo" form="classificarDocumentoProcessoForm" ng-obrigatorio="documentoValidacao.nivelAcesso.nivelAcesso.codigo == 0" | |
119 | + ng-custom-options="sigiloTipoDocumento.sigilo as sigiloTipoDocumento.sigilo.tipoSigilo.descricao for sigiloTipoDocumento" ng-list="documentoValidacao.nivelAcesso.sigilos"/> | |
124 | 120 | |
125 | 121 | </div> |
126 | 122 | </div> | ... | ... |