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> | ... | ... |