Commit e6a6d14cc9b533c2b75890203b1ea3dbcf47fef6

Authored by rogerio.costa
1 parent 5686a9b8
Exists in master

#3216 - Classificar a Informação de Documentos e Processos

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&lt;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&lt;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&lt;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(&#39;ClassificarDocumentoProcessoController&#39;, [&#39;$scope&#39;, &#39;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(&#39;ClassificarDocumentoProcessoController&#39;, [&#39;$scope&#39;, &#39;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(&#39;ClassificarDocumentoProcessoController&#39;, [&#39;$scope&#39;, &#39;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>
... ...