Commit 38f86c5235721dfea29dd808699d434772fb5dde

Authored by ROGERIO CASSIMIRO DE SOUZA
1 parent 97c937ff
Exists in master

redmine #4463 busca processo por unidade usuario

Showing 18 changed files with 213 additions and 726 deletions   Show diff stats
cit-ecm-api/src/main/java/br/com/centralit/api/dao/ProcessoDao.java
@@ -155,5 +155,5 @@ public interface ProcessoDao extends CitGenericDAO { @@ -155,5 +155,5 @@ public interface ProcessoDao extends CitGenericDAO {
155 * @return <RT> SearchResult<RT> 155 * @return <RT> SearchResult<RT>
156 */ 156 */
157 <RT> SearchResult<RT> searchAndCountPorSigilo(ISearch search); 157 <RT> SearchResult<RT> searchAndCountPorSigilo(ISearch search);
158 - 158 +
159 } 159 }
cit-ecm-api/src/main/java/br/com/centralit/api/dao/UnidadeProcessoDao.java
@@ -2,6 +2,9 @@ package br.com.centralit.api.dao; @@ -2,6 +2,9 @@ package br.com.centralit.api.dao;
2 2
3 import java.util.Collection; 3 import java.util.Collection;
4 4
  5 +import com.googlecode.genericdao.search.ISearch;
  6 +import com.googlecode.genericdao.search.SearchResult;
  7 +
5 import br.com.centralit.api.model.Processo; 8 import br.com.centralit.api.model.Processo;
6 import br.com.centralit.api.model.UnidadeProcesso; 9 import br.com.centralit.api.model.UnidadeProcesso;
7 import br.com.centralit.framework.dao.arquitetura.CitGenericDAO; 10 import br.com.centralit.framework.dao.arquitetura.CitGenericDAO;
@@ -114,5 +117,13 @@ public interface UnidadeProcessoDao extends CitGenericDAO { @@ -114,5 +117,13 @@ public interface UnidadeProcessoDao extends CitGenericDAO {
114 * @return UnidadeProcesso 117 * @return UnidadeProcesso
115 */ 118 */
116 UnidadeProcesso obterPorUnidadeEProcesso(Long idProcesso, Long idUnidade); 119 UnidadeProcesso obterPorUnidadeEProcesso(Long idProcesso, Long idUnidade);
117 - 120 +
  121 + /**
  122 + * Método responsável por listar processos através da unidade do usuário
  123 + * @author rogerio.cassimiro
  124 + * @param search
  125 + * @return <RT> SearchResult<RT>
  126 + */
  127 + <RT> SearchResult<RT> searchAndCountPorUnidade(ISearch search);
  128 +
118 } 129 }
cit-ecm-api/src/main/java/br/com/centralit/api/dao/impl/ProcessoDaoHibernate.java
@@ -211,5 +211,5 @@ public class ProcessoDaoHibernate extends CitGenericDAOImpl implements ProcessoD @@ -211,5 +211,5 @@ public class ProcessoDaoHibernate extends CitGenericDAOImpl implements ProcessoD
211 211
212 return super.searchAndCount(search); 212 return super.searchAndCount(search);
213 } 213 }
214 - 214 +
215 } 215 }
cit-ecm-api/src/main/java/br/com/centralit/api/dao/impl/UnidadeProcessoDaoHibernate.java
@@ -2,13 +2,19 @@ package br.com.centralit.api.dao.impl; @@ -2,13 +2,19 @@ package br.com.centralit.api.dao.impl;
2 2
3 import java.util.Collection; 3 import java.util.Collection;
4 4
  5 +import org.springframework.security.core.context.SecurityContextHolder;
5 import org.springframework.stereotype.Repository; 6 import org.springframework.stereotype.Repository;
6 7
  8 +import com.googlecode.genericdao.search.Filter;
  9 +import com.googlecode.genericdao.search.ISearch;
  10 +import com.googlecode.genericdao.search.SearchResult;
  11 +
7 import br.com.centralit.api.dao.UnidadeProcessoDao; 12 import br.com.centralit.api.dao.UnidadeProcessoDao;
8 import br.com.centralit.api.model.Processo; 13 import br.com.centralit.api.model.Processo;
9 import br.com.centralit.api.model.UnidadeProcesso; 14 import br.com.centralit.api.model.UnidadeProcesso;
10 import br.com.centralit.framework.dao.arquitetura.CitGenericDAOImpl; 15 import br.com.centralit.framework.dao.arquitetura.CitGenericDAOImpl;
11 import br.com.centralit.framework.dao.arquitetura.SearchSeven; 16 import br.com.centralit.framework.dao.arquitetura.SearchSeven;
  17 +import br.com.centralit.framework.model.Usuario;
12 import br.com.centralit.framework.util.UtilColecao; 18 import br.com.centralit.framework.util.UtilColecao;
13 19
14 /** 20 /**
@@ -167,4 +173,17 @@ public class UnidadeProcessoDaoHibernate extends CitGenericDAOImpl implements Un @@ -167,4 +173,17 @@ public class UnidadeProcessoDaoHibernate extends CitGenericDAOImpl implements Un
167 173
168 } 174 }
169 175
  176 + /**
  177 + * Método responsável por listar processos através da unidade do usuário
  178 + * @author rogerio.cassimiro
  179 + * @param search
  180 + * @return <RT> SearchResult<RT>
  181 + */
  182 + @Override
  183 + public <RT> SearchResult<RT> searchAndCountPorUnidade(ISearch search) {
  184 + Usuario usuario = ( (Usuario) SecurityContextHolder.getContext().getAuthentication().getPrincipal() );
  185 + search.getFilters().add(Filter.in("unidade.id", usuario.getUnidade().getId()));
  186 + search.getFilters().add(Filter.or(Filter.equal("concluido", Boolean.FALSE), Filter.isEmpty("concluido")));
  187 + return super.searchAndCount(search);
  188 + }
170 } 189 }
cit-ecm-api/src/main/java/br/com/centralit/api/framework/json/ViewsEcm.java
@@ -106,5 +106,4 @@ public class ViewsEcm extends Views { @@ -106,5 +106,4 @@ public class ViewsEcm extends Views {
106 106
107 public static class TipoSuporteDocumentoEdit extends TipoSuporteDocumentoListView{}; 107 public static class TipoSuporteDocumentoEdit extends TipoSuporteDocumentoListView{};
108 108
109 -  
110 } 109 }
cit-ecm-api/src/main/java/br/com/centralit/api/model/Processo.java
@@ -69,13 +69,17 @@ import com.fasterxml.jackson.databind.annotation.JsonSerialize; @@ -69,13 +69,17 @@ import com.fasterxml.jackson.databind.annotation.JsonSerialize;
69 @JsonIgnoreProperties({ "sugestao", "assuntoPlanoClassificacao" }) 69 @JsonIgnoreProperties({ "sugestao", "assuntoPlanoClassificacao" })
70 public class Processo extends PersistentObjectUnidade { 70 public class Processo extends PersistentObjectUnidade {
71 71
  72 + public static final String GRID_PROCESSO_NA_UNIDADE = "GRID_PROCESSO_NA_UNIDADE";
  73 +
  74 + public static final String GRID_CLASSIFICACAO_PROCESSO_DOCUMENTO = "GRID_CLASSIFICACAO_PROCESSO_DOCUMENTO";
  75 +
72 /** Atributo serialVersionUID. */ 76 /** Atributo serialVersionUID. */
73 private static final long serialVersionUID = -6167513900417461697L; 77 private static final long serialVersionUID = -6167513900417461697L;
74 78
75 /** Atributo id. */ 79 /** Atributo id. */
76 @Id 80 @Id
77 @GeneratedValue(strategy = GenerationType.AUTO) 81 @GeneratedValue(strategy = GenerationType.AUTO)
78 - @JsonView({ Views.GenericView.class }) 82 + @JsonView({ Views.GenericView.class, Views.UnidadeProcessoListView.class })
79 private Long id; 83 private Long id;
80 84
81 /** Atributo assuntoComplementar. */ 85 /** Atributo assuntoComplementar. */
@@ -86,6 +90,7 @@ public class Processo extends PersistentObjectUnidade { @@ -86,6 +90,7 @@ public class Processo extends PersistentObjectUnidade {
86 @Temporal(TemporalType.TIMESTAMP) 90 @Temporal(TemporalType.TIMESTAMP)
87 @JsonSerialize(using = JsonCalendarSimpleDateSerializer.class) 91 @JsonSerialize(using = JsonCalendarSimpleDateSerializer.class)
88 @JsonDeserialize(using = JsonCalendarSimpleDateDeserializer.class) 92 @JsonDeserialize(using = JsonCalendarSimpleDateDeserializer.class)
  93 + @JsonView({Views.UnidadeProcessoListView.class})
89 private Calendar dataReferencia; 94 private Calendar dataReferencia;
90 95
91 /** Atributo dataConclusao. */ 96 /** Atributo dataConclusao. */
@@ -95,7 +100,7 @@ public class Processo extends PersistentObjectUnidade { @@ -95,7 +100,7 @@ public class Processo extends PersistentObjectUnidade {
95 private Calendar dataConclusao; 100 private Calendar dataConclusao;
96 101
97 /** Atributo nup. */ 102 /** Atributo nup. */
98 - @JsonView({ Views.ProcessoList.class, Views.ProcessoRelacionadoList.class, Views.AnexarProcesso.class, Views.ProcessoAutoCompleteView.class }) 103 + @JsonView({ Views.ProcessoList.class, Views.ProcessoRelacionadoList.class, Views.AnexarProcesso.class, Views.ProcessoAutoCompleteView.class, Views.UnidadeProcessoListView.class })
99 private String nup; 104 private String nup;
100 105
101 /** Atributo nome. */ 106 /** Atributo nome. */
@@ -106,7 +111,7 @@ public class Processo extends PersistentObjectUnidade { @@ -106,7 +111,7 @@ public class Processo extends PersistentObjectUnidade {
106 private Long idTask; 111 private Long idTask;
107 112
108 /** Atributo nup. */ 113 /** Atributo nup. */
109 - @JsonView({ Views.ProcessoEdit.class }) 114 + @JsonView({ Views.ProcessoEdit.class})
110 private Dominio tipoProtocolo; 115 private Dominio tipoProtocolo;
111 116
112 /** Atributo observacaoGeral. */ 117 /** Atributo observacaoGeral. */
@@ -115,7 +120,7 @@ public class Processo extends PersistentObjectUnidade { @@ -115,7 +120,7 @@ public class Processo extends PersistentObjectUnidade {
115 120
116 /** Atributo status. */ 121 /** Atributo status. */
117 @ManyToOne(fetch = FetchType.LAZY) 122 @ManyToOne(fetch = FetchType.LAZY)
118 - @JsonView({ Views.ProcessoEdit.class }) 123 + @JsonView({ Views.ProcessoEdit.class, Views.UnidadeProcessoListView.class })
119 private Dominio status; 124 private Dominio status;
120 125
121 /** Atributo tramitarDocumento. */ 126 /** Atributo tramitarDocumento. */
@@ -124,7 +129,7 @@ public class Processo extends PersistentObjectUnidade { @@ -124,7 +129,7 @@ public class Processo extends PersistentObjectUnidade {
124 private TramitarDocumento tramitarDocumento; 129 private TramitarDocumento tramitarDocumento;
125 130
126 /** Atributo tipoProcesso. */ 131 /** Atributo tipoProcesso. */
127 - @JsonView({ Views.ProcessoList.class, Views.ProcessoRelacionadoList.class, Views.AnexarProcesso.class }) 132 + @JsonView({ Views.ProcessoList.class, Views.ProcessoRelacionadoList.class, Views.AnexarProcesso.class, Views.UnidadeProcessoListView.class })
128 @ManyToOne(fetch = FetchType.LAZY) 133 @ManyToOne(fetch = FetchType.LAZY)
129 private TipoProcesso tipoProcesso; 134 private TipoProcesso tipoProcesso;
130 135
@@ -137,7 +142,7 @@ public class Processo extends PersistentObjectUnidade { @@ -137,7 +142,7 @@ public class Processo extends PersistentObjectUnidade {
137 private String tipoAssunto; 142 private String tipoAssunto;
138 143
139 /** Atributo idProcessInstance. */ 144 /** Atributo idProcessInstance. */
140 - @JsonView({ Views.ProcessoList.class }) 145 + @JsonView({ Views.ProcessoList.class, Views.UnidadeProcessoListView.class })
141 private Long idProcessInstance; 146 private Long idProcessInstance;
142 147
143 /** Atributo nivelAcesso. */ 148 /** Atributo nivelAcesso. */
@@ -166,7 +171,7 @@ public class Processo extends PersistentObjectUnidade { @@ -166,7 +171,7 @@ public class Processo extends PersistentObjectUnidade {
166 171
167 /** Atributo sigilo. */ 172 /** Atributo sigilo. */
168 @ManyToOne(fetch = FetchType.LAZY) 173 @ManyToOne(fetch = FetchType.LAZY)
169 - @JsonView({ Views.ProcessoList.class }) 174 + @JsonView({ Views.ProcessoList.class, Views.UnidadeProcessoListView.class })
170 private Sigilo sigilo; 175 private Sigilo sigilo;
171 176
172 @ManyToOne(fetch = FetchType.LAZY) 177 @ManyToOne(fetch = FetchType.LAZY)
cit-ecm-api/src/main/java/br/com/centralit/api/model/Sigilo.java
@@ -65,7 +65,7 @@ public class Sigilo extends PersistentObjectAudit { @@ -65,7 +65,7 @@ public class Sigilo extends PersistentObjectAudit {
65 65
66 /** Atributo tipoSigilo. */ 66 /** Atributo tipoSigilo. */
67 @ManyToOne(fetch = FetchType.LAZY) 67 @ManyToOne(fetch = FetchType.LAZY)
68 - @JsonView({ Views.GenericView.class }) 68 + @JsonView({ Views.GenericView.class, Views.UnidadeProcessoListView.class })
69 private Dominio tipoSigilo; 69 private Dominio tipoSigilo;
70 70
71 /** Atributo sigiloPrivilegios. */ 71 /** Atributo sigiloPrivilegios. */
cit-ecm-api/src/main/java/br/com/centralit/api/model/TipoProcesso.java
@@ -63,7 +63,7 @@ public class TipoProcesso extends PersistentObjectUnidade { @@ -63,7 +63,7 @@ public class TipoProcesso extends PersistentObjectUnidade {
63 private Long id; 63 private Long id;
64 64
65 /** Atributo descricao. */ 65 /** Atributo descricao. */
66 - @JsonView({ ViewsEcm.TipoProcessoList.class }) 66 + @JsonView({ ViewsEcm.TipoProcessoList.class, Views.UnidadeProcessoListView.class })
67 private String descricao; 67 private String descricao;
68 68
69 /** Atributo nome. */ 69 /** Atributo nome. */
cit-ecm-api/src/main/java/br/com/centralit/api/model/UnidadeProcesso.java
@@ -72,17 +72,17 @@ public class UnidadeProcesso extends PersistentObjectAudit { @@ -72,17 +72,17 @@ public class UnidadeProcesso extends PersistentObjectAudit {
72 72
73 /** Atributo processo. */ 73 /** Atributo processo. */
74 @ManyToOne(fetch = FetchType.LAZY) 74 @ManyToOne(fetch = FetchType.LAZY)
75 - @JsonView({ Views.EnviarProcessoView.class }) 75 + @JsonView({ Views.EnviarProcessoView.class, Views.UnidadeProcessoListView.class })
76 private Processo processo; 76 private Processo processo;
77 77
78 /** Atributo grupo. */ 78 /** Atributo grupo. */
79 @ManyToOne(fetch = FetchType.LAZY) 79 @ManyToOne(fetch = FetchType.LAZY)
80 - @JsonView({ Views.EnviarProcessoView.class }) 80 + @JsonView({ Views.EnviarProcessoView.class})
81 private Unidade unidade; 81 private Unidade unidade;
82 82
83 /** Atributo usuarioResponsavel. */ 83 /** Atributo usuarioResponsavel. */
84 @ManyToOne(fetch = FetchType.LAZY) 84 @ManyToOne(fetch = FetchType.LAZY)
85 - @JsonView({ Views.EnviarProcessoView.class }) 85 + @JsonView({ Views.EnviarProcessoView.class, Views.UnidadeProcessoListView.class })
86 private Usuario usuarioResponsavel; 86 private Usuario usuarioResponsavel;
87 87
88 /** 88 /**
cit-ecm-api/src/main/java/br/com/centralit/api/service/UnidadeProcessoService.java
@@ -7,6 +7,9 @@ import br.com.centralit.api.model.UnidadeProcesso; @@ -7,6 +7,9 @@ import br.com.centralit.api.model.UnidadeProcesso;
7 import br.com.centralit.api.viewHelper.EnviarProcessoVH; 7 import br.com.centralit.api.viewHelper.EnviarProcessoVH;
8 import br.com.centralit.framework.service.arquitetura.GenericService; 8 import br.com.centralit.framework.service.arquitetura.GenericService;
9 9
  10 +import com.googlecode.genericdao.search.ISearch;
  11 +import com.googlecode.genericdao.search.SearchResult;
  12 +
10 /** 13 /**
11 * <p> 14 * <p>
12 * <img src="http://centralit.com.br/images/logo_central.png"> 15 * <img src="http://centralit.com.br/images/logo_central.png">
@@ -169,4 +172,12 @@ public interface UnidadeProcessoService extends GenericService&lt;UnidadeProcesso, @@ -169,4 +172,12 @@ public interface UnidadeProcessoService extends GenericService&lt;UnidadeProcesso,
169 */ 172 */
170 void saveUnidadeProcesso(Processo processo); 173 void saveUnidadeProcesso(Processo processo);
171 174
  175 + /**
  176 + * Método responsável por listar processos através da unidade do usuário
  177 + * @author rogerio.cassimiro
  178 + * @param search
  179 + * @return <RT> SearchResult<RT>
  180 + */
  181 + <RT> SearchResult<RT> searchAndCountPorUnidade(ISearch search);
  182 +
172 } 183 }
cit-ecm-api/src/main/java/br/com/centralit/api/service/impl/ProcessoServiceImpl.java
@@ -19,9 +19,6 @@ import org.springframework.beans.factory.annotation.Qualifier; @@ -19,9 +19,6 @@ import org.springframework.beans.factory.annotation.Qualifier;
19 import org.springframework.stereotype.Service; 19 import org.springframework.stereotype.Service;
20 import org.springframework.validation.Validator; 20 import org.springframework.validation.Validator;
21 21
22 -import com.googlecode.genericdao.search.ISearch;  
23 -import com.googlecode.genericdao.search.SearchResult;  
24 -  
25 import br.com.centralit.api.dao.ProcessoDao; 22 import br.com.centralit.api.dao.ProcessoDao;
26 import br.com.centralit.api.model.DocumentoGed; 23 import br.com.centralit.api.model.DocumentoGed;
27 import br.com.centralit.api.model.EstruturaOrganizacionalECM; 24 import br.com.centralit.api.model.EstruturaOrganizacionalECM;
@@ -56,6 +53,9 @@ import br.com.centralit.framework.util.UtilColecao; @@ -56,6 +53,9 @@ import br.com.centralit.framework.util.UtilColecao;
56 import br.com.centralit.framework.util.UtilDate; 53 import br.com.centralit.framework.util.UtilDate;
57 import br.com.centralit.framework.util.UtilObjeto; 54 import br.com.centralit.framework.util.UtilObjeto;
58 55
  56 +import com.googlecode.genericdao.search.ISearch;
  57 +import com.googlecode.genericdao.search.SearchResult;
  58 +
59 /** 59 /**
60 * <p> 60 * <p>
61 * <img src="http://centralit.com.br/images/logo_central.png"> 61 * <img src="http://centralit.com.br/images/logo_central.png">
@@ -168,7 +168,7 @@ public class ProcessoServiceImpl extends GenericServiceImpl&lt;Processo, Long&gt; impl @@ -168,7 +168,7 @@ public class ProcessoServiceImpl extends GenericServiceImpl&lt;Processo, Long&gt; impl
168 168
169 try { 169 try {
170 170
171 - this.solrService.addProcesso(processo); 171 +// this.solrService.addProcesso(processo);
172 } catch (final Exception e) { 172 } catch (final Exception e) {
173 173
174 e.printStackTrace(); 174 e.printStackTrace();
@@ -232,7 +232,7 @@ public class ProcessoServiceImpl extends GenericServiceImpl&lt;Processo, Long&gt; impl @@ -232,7 +232,7 @@ public class ProcessoServiceImpl extends GenericServiceImpl&lt;Processo, Long&gt; impl
232 this.montarEntidade(processo); 232 this.montarEntidade(processo);
233 233
234 try { 234 try {
235 - this.solrService.addProcesso(processo); 235 +// this.solrService.addProcesso(processo);
236 } catch (Exception e) { 236 } catch (Exception e) {
237 e.printStackTrace(); 237 e.printStackTrace();
238 } 238 }
@@ -1067,5 +1067,5 @@ public class ProcessoServiceImpl extends GenericServiceImpl&lt;Processo, Long&gt; impl @@ -1067,5 +1067,5 @@ public class ProcessoServiceImpl extends GenericServiceImpl&lt;Processo, Long&gt; impl
1067 1067
1068 return this.processoDao.getProcessoByProtocolo(nup); 1068 return this.processoDao.getProcessoByProtocolo(nup);
1069 } 1069 }
1070 - 1070 +
1071 } 1071 }
cit-ecm-api/src/main/java/br/com/centralit/api/service/impl/UnidadeProcessoServiceImpl.java
@@ -26,6 +26,9 @@ import br.com.centralit.framework.service.arquitetura.GenericServiceImpl; @@ -26,6 +26,9 @@ import br.com.centralit.framework.service.arquitetura.GenericServiceImpl;
26 import br.com.centralit.framework.util.UtilColecao; 26 import br.com.centralit.framework.util.UtilColecao;
27 import br.com.centralit.framework.util.UtilObjeto; 27 import br.com.centralit.framework.util.UtilObjeto;
28 28
  29 +import com.googlecode.genericdao.search.ISearch;
  30 +import com.googlecode.genericdao.search.SearchResult;
  31 +
29 /** 32 /**
30 * <p> 33 * <p>
31 * <img src="http://centralit.com.br/images/logo_central.png"> 34 * <img src="http://centralit.com.br/images/logo_central.png">
@@ -319,5 +322,16 @@ public class UnidadeProcessoServiceImpl extends GenericServiceImpl&lt;UnidadeProces @@ -319,5 +322,16 @@ public class UnidadeProcessoServiceImpl extends GenericServiceImpl&lt;UnidadeProces
319 322
320 return this.unidadeProcessoDao.obterPorUnidadeEProcesso(idProcesso, idUnidade); 323 return this.unidadeProcessoDao.obterPorUnidadeEProcesso(idProcesso, idUnidade);
321 } 324 }
322 -  
323 -} 325 +
  326 + /**
  327 + * Método responsável por listar processos através da unidade do usuário
  328 + * @author rogerio.cassimiro
  329 + * @param search
  330 + * @return <RT> SearchResult<RT>
  331 + */
  332 + @Override
  333 + public <RT> SearchResult<RT> searchAndCountPorUnidade(ISearch search) {
  334 + return this.unidadeProcessoDao.searchAndCountPorUnidade(search);
  335 + }
  336 +
  337 +}
324 \ No newline at end of file 338 \ No newline at end of file
cit-ecm-web/src/main/java/br/com/centralit/controller/ProcessoController.java
1 package br.com.centralit.controller; 1 package br.com.centralit.controller;
2 2
3 import org.springframework.beans.factory.annotation.Autowired; 3 import org.springframework.beans.factory.annotation.Autowired;
4 -import org.springframework.security.core.context.SecurityContextHolder;  
5 import org.springframework.stereotype.Controller; 4 import org.springframework.stereotype.Controller;
6 import org.springframework.web.bind.annotation.RequestBody; 5 import org.springframework.web.bind.annotation.RequestBody;
7 import org.springframework.web.bind.annotation.RequestMapping; 6 import org.springframework.web.bind.annotation.RequestMapping;
@@ -18,7 +17,6 @@ import br.com.centralit.framework.json.ResponseBodyWrapper; @@ -18,7 +17,6 @@ import br.com.centralit.framework.json.ResponseBodyWrapper;
18 import br.com.centralit.framework.json.Views; 17 import br.com.centralit.framework.json.Views;
19 import br.com.centralit.framework.json.Views.GenericView; 18 import br.com.centralit.framework.json.Views.GenericView;
20 import br.com.centralit.framework.model.SearchParams; 19 import br.com.centralit.framework.model.SearchParams;
21 -import br.com.centralit.framework.model.Usuario;  
22 import br.com.centralit.framework.util.UtilString; 20 import br.com.centralit.framework.util.UtilString;
23 import br.com.centralit.framework.view.GridVH; 21 import br.com.centralit.framework.view.GridVH;
24 import br.com.centralit.framework.view.ResultResponseVH; 22 import br.com.centralit.framework.view.ResultResponseVH;
@@ -26,6 +24,7 @@ import br.com.centralit.framework.view.ResultResponseVH; @@ -26,6 +24,7 @@ import br.com.centralit.framework.view.ResultResponseVH;
26 import com.googlecode.genericdao.search.Search; 24 import com.googlecode.genericdao.search.Search;
27 import com.googlecode.genericdao.search.SearchResult; 25 import com.googlecode.genericdao.search.SearchResult;
28 26
  27 +@SuppressWarnings("unchecked")
29 @Controller 28 @Controller
30 @RequestMapping("/rest/processo") 29 @RequestMapping("/rest/processo")
31 public class ProcessoController extends GenericController<Processo> { 30 public class ProcessoController extends GenericController<Processo> {
@@ -160,14 +159,17 @@ public class ProcessoController extends GenericController&lt;Processo&gt; { @@ -160,14 +159,17 @@ public class ProcessoController extends GenericController&lt;Processo&gt; {
160 search.setResultMode(Search.RESULT_MAP); 159 search.setResultMode(Search.RESULT_MAP);
161 160
162 SearchResult searchResult = null; 161 SearchResult searchResult = null;
163 -  
164 - if (!UtilString.isNullOrEmpty(searchParams.getNome()) && searchParams.getNome().equals("GRID_CLASSIFICACAO_PROCESSO_DOCUMENTO")) {  
165 -  
166 - searchResult = this.processoService.searchAndCountPorSigilo(search);  
167 -  
168 - } else {  
169 -  
170 - searchResult = genericService.searchAndCount(search); 162 +
  163 + String nomeGrid = UtilString.isNullOrEmpty(searchParams.getNome()) ? "" : searchParams.getNome();
  164 +
  165 + switch (nomeGrid) {
  166 + case Processo.GRID_CLASSIFICACAO_PROCESSO_DOCUMENTO:
  167 + searchResult = this.processoService.searchAndCountPorSigilo(search);
  168 + break;
  169 +
  170 + default:
  171 + searchResult = genericService.searchAndCount(search);
  172 + break;
171 } 173 }
172 174
173 // DETERMINA QUAIS OS CAMPOS VAI CONSULTAR 175 // DETERMINA QUAIS OS CAMPOS VAI CONSULTAR
cit-ecm-web/src/main/java/br/com/centralit/controller/UnidadeProcessoController.java
@@ -10,12 +10,20 @@ import org.springframework.web.bind.annotation.RequestMethod; @@ -10,12 +10,20 @@ import org.springframework.web.bind.annotation.RequestMethod;
10 import org.springframework.web.bind.annotation.RequestParam; 10 import org.springframework.web.bind.annotation.RequestParam;
11 import org.springframework.web.bind.annotation.ResponseBody; 11 import org.springframework.web.bind.annotation.ResponseBody;
12 12
  13 +import com.googlecode.genericdao.search.Search;
  14 +import com.googlecode.genericdao.search.SearchResult;
  15 +
  16 +import br.com.centralit.api.model.Processo;
13 import br.com.centralit.api.model.UnidadeProcesso; 17 import br.com.centralit.api.model.UnidadeProcesso;
14 import br.com.centralit.api.service.UnidadeProcessoService; 18 import br.com.centralit.api.service.UnidadeProcessoService;
15 import br.com.centralit.api.viewHelper.EnviarProcessoVH; 19 import br.com.centralit.api.viewHelper.EnviarProcessoVH;
16 import br.com.centralit.framework.controller.GenericController; 20 import br.com.centralit.framework.controller.GenericController;
  21 +import br.com.centralit.framework.dao.arquitetura.SearchSeven;
17 import br.com.centralit.framework.json.ResponseBodyWrapper; 22 import br.com.centralit.framework.json.ResponseBodyWrapper;
18 import br.com.centralit.framework.json.Views; 23 import br.com.centralit.framework.json.Views;
  24 +import br.com.centralit.framework.model.SearchParams;
  25 +import br.com.centralit.framework.util.UtilString;
  26 +import br.com.centralit.framework.view.GridVH;
19 import br.com.centralit.framework.view.ResultResponseVH; 27 import br.com.centralit.framework.view.ResultResponseVH;
20 28
21 /** 29 /**
@@ -50,6 +58,7 @@ import br.com.centralit.framework.view.ResultResponseVH; @@ -50,6 +58,7 @@ import br.com.centralit.framework.view.ResultResponseVH;
50 * @author rogerio.costa 58 * @author rogerio.costa
51 * 59 *
52 */ 60 */
  61 +@SuppressWarnings({"unchecked", "rawtypes"})
53 @Controller 62 @Controller
54 @RequestMapping("/rest/unidadeProcesso") 63 @RequestMapping("/rest/unidadeProcesso")
55 public class UnidadeProcessoController extends GenericController<UnidadeProcesso> { 64 public class UnidadeProcessoController extends GenericController<UnidadeProcesso> {
@@ -118,6 +127,42 @@ public class UnidadeProcessoController extends GenericController&lt;UnidadeProcesso @@ -118,6 +127,42 @@ public class UnidadeProcessoController extends GenericController&lt;UnidadeProcesso
118 return responseBody; 127 return responseBody;
119 } 128 }
120 129
  130 + @RequestMapping(value = "/getPage", method = RequestMethod.POST)
  131 + @ResponseBody
  132 + public ResponseBodyWrapper findGrid(@RequestBody SearchParams searchParams) {
  133 +
  134 + SearchSeven search;
  135 +
  136 + search = new SearchSeven(searchParams);
  137 +
  138 + search.setResultMode(Search.RESULT_MAP);
  139 +
  140 + SearchResult searchResult = null;
  141 +
  142 + String nomeGrid = UtilString.isNullOrEmpty(searchParams.getNome()) ? "" : searchParams.getNome();
  143 +
  144 + switch (nomeGrid) {
  145 + case Processo.GRID_PROCESSO_NA_UNIDADE:
  146 + searchResult = this.unidadeProcessoService.searchAndCountPorUnidade(search);
  147 + break;
  148 + default:
  149 + searchResult = genericService.searchAndCount(search);
  150 + break;
  151 + }
  152 +
  153 + // DETERMINA QUAIS OS CAMPOS VAI CONSULTAR
  154 + GridVH gridVH = new GridVH();
  155 + gridVH.setObjects(searchResult.getResult());
  156 + gridVH.addTotalItensTotalPages(searchParams, Long.valueOf(searchResult.getTotalCount()));
  157 +
  158 + ResultResponseVH resultResponseVH = new ResultResponseVH(gridVH);
  159 +
  160 + ResponseBodyWrapper responseBody = new ResponseBodyWrapper(resultResponseVH, Views.UnidadeProcessoListView.class);
  161 +
  162 + return responseBody;
  163 + }
  164 +
  165 +
121 @Override 166 @Override
122 public Class<Views.EnviarProcessoView> getEditView() { 167 public Class<Views.EnviarProcessoView> getEditView() {
123 168
cit-ecm-web/src/main/java/br/com/centralit/listener/StartupListenerEcm.java
@@ -402,7 +402,7 @@ public class StartupListenerEcm extends UtilStartup implements ApplicationListen @@ -402,7 +402,7 @@ public class StartupListenerEcm extends UtilStartup implements ApplicationListen
402 internacionalizacaoList.add(new Internacionalizacao("ECM.LABEL.NOME_NOVO_SUPORTE ", "Nome do suporte", dominio, modulo)); 402 internacionalizacaoList.add(new Internacionalizacao("ECM.LABEL.NOME_NOVO_SUPORTE ", "Nome do suporte", dominio, modulo));
403 internacionalizacaoList.add(new Internacionalizacao("ECM.LABEL.NOVO_TIPO_SUPORTE ", "Novo tipo suporte de documento", dominio, modulo)); 403 internacionalizacaoList.add(new Internacionalizacao("ECM.LABEL.NOVO_TIPO_SUPORTE ", "Novo tipo suporte de documento", dominio, modulo));
404 internacionalizacaoList.add(new Internacionalizacao("ECM.LABEL.TIPO_SUPORTE_DOCUMENTO ", "Tipo suporte de documento", dominio, modulo)); 404 internacionalizacaoList.add(new Internacionalizacao("ECM.LABEL.TIPO_SUPORTE_DOCUMENTO ", "Tipo suporte de documento", dominio, modulo));
405 - 405 + internacionalizacaoList.add(new Internacionalizacao("ECM.LABEL.DIGITE_PROTOCOLO", "Digite o potocolo", dominio, modulo));
406 406
407 } 407 }
408 408
cit-ecm-web/src/main/webapp/assets/js/angular/custom/controller/GerenciarProcessoListUnidadeController.js
1 'use strict'; 1 'use strict';
2 2
3 -citApp.controller('GerenciarProcessoListUnidadeController', ['$scope', 'workflowFilterCriteriaService', 'appService', 'environmentService', 'FormBuilderRepository', 'FlowRepository', 'BusinessProcessRepository', 'RuntimeManagerRepository', 'DomainRepository', '$compile', '$translate', '$modal', '$injector', '$parse', '$rootScope', '$timeout', 'BusinessProcessCategoryRepository','ProcessoRepository',  
4 - function GerenciarProcessoListUnidadeController($scope, workflowFilterCriteriaService, appService, environmentService, FormBuilderRepository, FlowRepository, BusinessProcessRepository, RuntimeManagerRepository, DomainRepository, $compile, $translate, $modal, $injector, $parse, $rootScope, $timeout, BusinessProcessCategoryRepository, ProcessoRepository) {  
5 - $scope.compile = $compile; 3 +citApp.controller('GerenciarProcessoListUnidadeController', ['$scope', 'workflowFilterCriteriaService', 'appService', 'environmentService', 'FormBuilderRepository', 'FlowRepository', 'BusinessProcessRepository', 'RuntimeManagerRepository', 'DomainRepository', '$compile', '$translate', '$modal', '$injector', '$parse', '$rootScope', '$timeout', 'BusinessProcessCategoryRepository', 'GerenciarProcessoRepository', 'UnidadeProcessoRepository', 'DominioRepository', '$filter',
  4 + function GerenciarProcessoListUnidadeController($scope, workflowFilterCriteriaService, appService, environmentService, FormBuilderRepository, FlowRepository, BusinessProcessRepository, RuntimeManagerRepository, DomainRepository, $compile, $translate, $modal, $injector, $parse, $rootScope, $timeout, BusinessProcessCategoryRepository, GerenciarProcessoRepository, UnidadeProcessoRepository, DominioRepository, $filter) {
  5 +
6 $scope.$showAdvancedFilters = false; 6 $scope.$showAdvancedFilters = false;
7 - $scope.workflowFilterCriteriaService = workflowFilterCriteriaService;  
8 7
9 -  
10 - $scope.signalEventInput = new SignalEventInput("", "", "", "", "", 0);  
11 - $scope.totalPagesFluxo = 10;  
12 - $scope.totalItensFluxo = 0;  
13 -  
14 - $scope.totalPages = 10;  
15 - $scope.totalItens = 0;  
16 - $scope.limit = 10;  
17 - $scope.processos = [];  
18 - $scope.businessProcess = null;  
19 - $scope.indexProcessoNegocio = null;  
20 -  
21 - $scope.idPainelItem = 0;  
22 -  
23 - $scope.tabAtual = 0;  
24 -  
25 - $scope.tabs = [ {active: true}  
26 - ,{active: false}  
27 - ];  
28 -  
29 - // default criteria that will be sent to the server to request data from WorkItem 8 + $scope.headers = [ {
  9 + title : $translate.instant('ECM.LABEL.PROTOCOLO'),
  10 + value : 'processo.nup'
  11 + }, {
  12 + title : $translate.instant('ECM.LABEL.TIPOPROCESSO'),
  13 + value : 'processo.tipoProcesso.descricao'
  14 + }, {
  15 + title : $translate.instant('ECM.LABEL.ATRIBUIDOA'),
  16 + value : 'usuarioResponsavel.username'
  17 + }, {
  18 + title : $translate.instant('LABEL.SITUACAO'),
  19 + value : 'processo.status.descricao'
  20 + }, {
  21 + title : $translate.instant('ECM.LABEL.NIVEL_SIGILO'),
  22 + value : 'processo.sigilo.tipoSigilo.descricao'
  23 + }, {
  24 + title : $translate.instant('LABEL.DATA_DE_CRIACAO'),
  25 + value : 'processo.dataCriacao',
  26 + filter : 'dateBR'
  27 + }, {
  28 + title : $translate.instant('LABEL.DATA_RECEBIMENTO'),
  29 + value : 'processo.dataReferencia',
  30 + filter : 'dateBR'
  31 + }];
  32 +
30 $scope.filterCriteria = { 33 $scope.filterCriteria = {
31 - start : 1,  
32 - sort : 'workItem.id',  
33 - limit : 10,  
34 - deadline : 1,  
35 - processDeadline : 1,  
36 - timeManagementStatus : "",  
37 - fields : [ 'workItem.id'],  
38 - filters : [{type: 'numeric', field: 'workItem.id'}  
39 - , {type: 'string', field: 'workItem.flowElement.name'}  
40 - , {type: 'numeric', field: 'workItem.processInstance.id'}  
41 - , {type: 'string', field: 'workItem.processInstance.businessProcess.description'}  
42 - , {type: 'string', field: 'workItem.processInstance.flowStatus.name'}]  
43 - };  
44 -  
45 - $scope.fetchBusinessProcess = function() {  
46 - $scope.setLoading(true);  
47 - $scope.categorias = [];  
48 - BusinessProcessCategoryRepository.findParents().then(function(result) {  
49 - for(var i = 0; i < result.length; i++) {  
50 - result[i].originalElement.sinalPositivo = result[i].originalElement.hasChildren || result[i].originalElement.hasProcesses;  
51 - $scope.categorias.push(result[i].originalElement);  
52 - }  
53 - $scope.setLoading(false);  
54 - }, function() {  
55 - $scope.setLoading(false);  
56 - });  
57 - };  
58 -  
59 - $scope.filterProcessos = { 34 + nome : 'GRID_PROCESSO_NA_UNIDADE',
60 start : 1, 35 start : 1,
61 dir : 'asc', 36 dir : 'asc',
62 - sort : 'name',  
63 - limit : 999999,  
64 - fields: ['id', 'category.name', 'description', 'flow.description'],  
65 - filters : [{type: 'numeric', field: 'category.id'}, {type: 'string', field: 'category.name'}, {type: 'string', field: 'description'}, {type: 'string', field: 'flow.description'}]  
66 - };  
67 -  
68 - // Will be called when filtering the grid, will reset the page number to one  
69 - $scope.filterResult = function() {  
70 -  
71 - //Timeout adicionado para que os filtros de pesquisa funcionem  
72 - $timeout(function(){  
73 - $scope.filterCriteria.start = 1;  
74 - $scope.fetchResult().then(function() {  
75 - // The request fires correctly but sometimes the ui doesn't update,  
76 - // that's a fix  
77 - $scope.filterCriteria.start = 1;  
78 - });  
79 -  
80 - });  
81 - };  
82 -  
83 - // call back function that we passed to our custom directive sortBy, will be  
84 - // called when clicking on any field to sort  
85 - $scope.onSort = function(sortedBy, sortDir) {  
86 - $scope.filterCriteria.dir = sortDir;  
87 - $scope.filterCriteria.sort = sortedBy;  
88 - $scope.filterCriteria.start = 1;  
89 - $scope.fetchResult().then(function() {  
90 - // The request fires correctly but sometimes the ui doesn't update,  
91 - // that's a fix  
92 - $scope.filterCriteria.start = 1;  
93 - });  
94 - };  
95 -  
96 - // RECUPERA LISTA DE TAREFAS E SETA RESULTADO NA GRID  
97 - $scope.fetchResult = function(page) {  
98 - $scope.setLoading(true);  
99 -  
100 - return BusinessProcessRepository.tasksByParam($scope.filterCriteria).then(function(result) {  
101 - var dataAtual = new Date();  
102 -  
103 - $scope.assignments = result.originalElement.objects;  
104 - angular.forEach($scope.assignments, function (assignment) {  
105 - assignment.classePrazoProcesso = new Date(assignment.processInstance.estimatedEndTimestamp) >= dataAtual ? 'green' : 'red';  
106 - assignment.classePrazoTarefa = new Date(assignment.estimatedEndTimestamp) >= dataAtual ? 'green' : 'red';  
107 -  
108 - ProcessoRepository.getProcessoByIdProcessInstance(assignment.processInstance.id).then(function(result) {  
109 - if( result){  
110 - assignment.processo = result.originalElement;  
111 - }  
112 - });  
113 -  
114 - });  
115 -  
116 - $scope.totalPages = result.originalElement.totalPages;  
117 - $scope.totalItens = result.originalElement.totalItens;  
118 - $scope.setLoading(false);  
119 - }, function() {  
120 - $scope.totalPages = 0;  
121 - $scope.totalItens = 0;  
122 - $scope.setLoading(false);  
123 - });  
124 - };  
125 -  
126 - $scope.filterSigad = function(){  
127 -  
128 - if($scope.processoSigad && $scope.processoSigad != ''){  
129 - ProcessoRepository.getProcessoByProtocolo($scope.processoSigad).then(function(result) {  
130 - if(result){  
131 - $scope.filterCriteria.filters[2].value = result.originalElement.idProcessInstance;  
132 - $timeout(function(){  
133 - $scope.filterResult();  
134 - });  
135 - }else{  
136 - $scope.filterCriteria.filters[2].value = null;  
137 - $scope.filterResult();  
138 - }  
139 - });  
140 - }else{  
141 - $scope.filterCriteria.filters[2].value = null;  
142 - $scope.filterResult();  
143 - } 37 + sort : 'processo.nup',
  38 + limit : 10,
  39 + fields: ['id', 'processo.nup', 'processo.tipoProcesso.descricao', 'usuarioResponsavel.username', 'processo.status.descricao', 'processo.sigilo.tipoSigilo.descricao', 'processo.dataCriacao', 'processo.idProcessInstance', 'processo.dataReferencia'],
  40 + filters : [
  41 + { type : 'string', field : 'processo.nup'},
  42 + { type : 'string', field : 'processo.tipoProcesso.descricao'},
  43 + { type : 'string', field : 'usuarioResponsavel.username'},
  44 + { type : 'string', field : 'processo.status.descricao', listaDominio : []},
  45 + { type : 'string', field : 'processo.sigilo.tipoSigilo.descricao'},
  46 + { type: 'date-range', field: 'processo.dataCriacao'},
  47 + { type: 'date-range', field: 'processo.dataReferencia'}
  48 + ]
144 }; 49 };
145 50
146 - $scope.filterSigadProtocolo = function(){  
147 -  
148 - if($scope.sigadProtocolo && $scope.sigadProtocolo != ''){  
149 -  
150 - ProcessoRepository.getProcessoByProtocolo($scope.sigadProtocolo).then(function(result) {  
151 - if(result){  
152 - $scope.filterCriteria.filters[2].value = result.originalElement.idProcessInstance;  
153 - $timeout(function(){  
154 - $scope.filterResult();  
155 - });  
156 - }else{  
157 - $scope.filterCriteria.filters[2].value = null;  
158 - $scope.filterResult();  
159 - }  
160 -  
161 - });  
162 -  
163 - }else{  
164 - $scope.filterCriteria.filters[2].value = null;  
165 - $scope.filterResult();  
166 - }  
167 - };  
168 -  
169 - $scope.recuperarPermissoes = function(assignment){  
170 - assignment.workItem = {};  
171 - BusinessProcessRepository.getPermissions({id: assignment.id}).then(function(result) {  
172 - assignment.workItem = result.originalElement;  
173 - if (!assignment.workItem.execute && !assignment.workItem.delegate && !assignment.workItem.suspend && !assignment.workItem.restart && !assignment.workItem.visualize) {  
174 - $scope.fetchResult();  
175 - } 51 + function carregarDominiosStatusProcesso() {
  52 + DominioRepository.findAllDominio('statusProcesso').then(function(result) {
  53 + $scope.filterCriteria.filters[3].listaDominio = $filter('orderBy')(result, 'originalElement.descricao', true);
176 }); 54 });
177 }; 55 };
178 -  
179 - $scope.init = function(filter) {  
180 - if (filter.businessProcessName) {  
181 - $scope.filterCriteria.businessProcessName = "";  
182 - var i = 0;  
183 - for (var i = 0; i < filter.businessProcessName.length; i++) {  
184 - if (i > 0) {  
185 - $scope.filterCriteria.businessProcessName += ",";  
186 - }  
187 - $scope.filterCriteria.businessProcessName += filter.businessProcessName[i];  
188 - }  
189 - }  
190 - $scope.filterCriteria.taskName = filter.taskName;  
191 - $scope.filterCriteria.username = filter.username;  
192 - $scope.filterCriteria.groups = filter.groups;  
193 - };  
194 56
195 - $scope.executarTarefa = function(assignment){  
196 - $scope.task = assignment.workItem;  
197 -  
198 - var pagina = '/cit-esi-web/assets/js/angular/custom/directive/html/userTask.html';  
199 - if ($scope.task.flowElement.userInterface && $scope.task.flowElement.userInterface.executeCustomPage) {  
200 - pagina = $scope.task.flowElement.userInterface.URLCustomPage;  
201 - $scope.abrirPaginaTarefa(pagina);  
202 - }else if ($scope.task.flowElement.userInterface && $scope.task.flowElement.userInterface.resource && $scope.task.flowElement.userInterface.resourceName) {  
203 - FormBuilderRepository.getByName($scope.task.flowElement.userInterface.resourceName).then(function(result) {  
204 - pagina = '/cit-esi-web/forms/'+result.originalElement.path+'/'+result.originalElement.resource.name+"_task.html";  
205 - $scope.abrirPaginaTarefa(pagina);  
206 - });  
207 - }else{  
208 - $scope.abrirPaginaTarefa(pagina);  
209 - }  
210 - };  
211 -  
212 - $scope.abrirPaginaTarefa = function(pagina){  
213 - if (appService.existsWorkspace(pagina)) {  
214 - $scope.showAlert('warning', $translate.instant('ESI.MSG.JA_EXISTE_TELA_TAREFA'));  
215 - return ;  
216 - }  
217 -  
218 - $scope.processInstance = $scope.task.processInstance;  
219 - $scope.processInstance.collapsed = true;  
220 - $scope.processInstance.collapsedError = true;  
221 -  
222 - $rootScope.task = $scope.task;  
223 - $rootScope.processInstance = $scope.processInstance;  
224 - $rootScope.controllerScope = $scope;  
225 -  
226 - var nome = $scope.task.flowElement.description;  
227 - if (!nome || nome == '')  
228 - nome = $scope.task.flowElement.name;  
229 -  
230 - $scope.addNewWorkspace($translate.instant('ESI.PERMISSAO.EXECUTAR')+" "+$translate.instant('ESI.TAREFA').toLowerCase()+" '"+nome+"'", pagina, true, 'mod-orange', $scope.task);  
231 - };  
232 -  
233 - $scope.delegarTarefa = function(assignment){  
234 - var pagina = '/cit-esi-web/assets/js/angular/custom/directive/html/userTaskDelegation.html';  
235 -  
236 - if (appService.existsWorkspace(pagina)) {  
237 - $scope.showAlert('warning', $translate.instant('ESI.MSG.JA_EXISTE_TELA_DELEGACAO'));  
238 - return ;  
239 - }  
240 -  
241 - $scope.task = assignment.workItem;  
242 -  
243 - $scope.processInstance = $scope.task.processInstance;  
244 - $scope.processInstance.collapsed = true;  
245 - $scope.processInstance.collapsedError = true;  
246 -  
247 - $rootScope.task = $scope.task;  
248 - $rootScope.processInstance = $scope.processInstance;  
249 - $rootScope.controllerScope = $scope;  
250 -  
251 - var nome = $scope.task.flowElement.description;  
252 - if (!nome || nome == '')  
253 - nome = $scope.task.flowElement.name;  
254 -  
255 - $scope.addNewWorkspace($translate.instant('ESI.PERMISSAO.DELEGAR')+" "+$translate.instant('ESI.TAREFA').toLowerCase()+" '"+nome+"'", pagina, true, 'mod-orange', $scope.task);  
256 - };  
257 -  
258 - $scope.capturarTarefa = function(assignment){  
259 - $scope.$openModalConfirm({  
260 - message: $translate.instant('ESI.MSG.CONFIRMA_CAPTURA'),  
261 - callback: function () {  
262 - $scope.$modalConfirmInstance.dismiss('cancel');  
263 -  
264 - $scope.setLoading(true,$translate.instant('ESI.CAPTURANDO_TAREFA')+" "+assignment.workItem.flowElement.description);  
265 -  
266 - var param = new RuntimeEnvironmentInput("",[]);  
267 - param.workItemId = assignment.workItem.id;  
268 -  
269 - RuntimeManagerRepository.captureTask(param).then(function(result) {  
270 - $scope.setLoading(false);  
271 - $scope.fetchResult();  
272 - $scope.showAlert("success","ESI.MSG.TAREFA_CAPTURADA","");  
273 - });  
274 - }  
275 - });  
276 -  
277 - };  
278 -  
279 - $scope.suspenderProcesso = function(assignment){  
280 - $scope.$openModalConfirm({  
281 - message: $translate.instant('ESI.MSG.CONFIRMA_SUSPENSAO'),  
282 - callback: function () {  
283 - $scope.$modalConfirmInstance.dismiss('cancel');  
284 -  
285 - $scope.setLoading(true);  
286 - RuntimeManagerRepository.suspendProcessInstance(assignment.workItem.processInstance.id).then(function(result) {  
287 - $scope.setLoading(false);  
288 - $scope.fetchResult();  
289 - $scope.showAlert("success","ESI.MSG.PROCESSO_SUSPENSO","");  
290 - });  
291 - }  
292 - });  
293 - };  
294 -  
295 - $scope.reativarProcesso = function(assignment){  
296 - $scope.$openModalConfirm({  
297 - message: $translate.instant('ESI.MSG.CONFIRMA_REATIVACAO'),  
298 - callback: function () {  
299 - $scope.$modalConfirmInstance.dismiss('cancel');  
300 -  
301 - $scope.setLoading(true);  
302 - RuntimeManagerRepository.restartProcessInstance(assignment.workItem.processInstance.id).then(function(result) {  
303 - $scope.setLoading(false);  
304 - $scope.fetchResult();  
305 - $scope.showAlert("success","ESI.MSG.PROCESSO_REATIVADO","");  
306 - });  
307 - }  
308 - });  
309 - };  
310 -  
311 - $scope.visualizarFluxo = function(assignment){  
312 - var pagina = '/cit-esi-web/assets/js/angular/custom/directive/html/visualizacaoEsi.html';  
313 -  
314 - if (appService.existsWorkspace(pagina)) {  
315 - $scope.showAlert('warning', $translate.instant('ESI.MSG.JA_EXISTE_TELA_VISUALIZACAO'));  
316 - return ;  
317 - }  
318 -  
319 - $scope.tarefa = assignment.workItem;  
320 - $scope.instancia = $scope.tarefa.processInstance;  
321 - $rootScope.tarefa = $scope.tarefa;  
322 - $rootScope.instancia = $scope.instancia;  
323 - $rootScope.controllerScope = $scope;  
324 - $scope.addNewWorkspace(assignment.workItem.processInstance.businessProcess.description, pagina, true, 'mod-orange', $scope.tarefa);  
325 - };  
326 -  
327 - $scope.consultarHistorico = function(assignment){  
328 - var pagina = '/cit-esi-web/assets/js/angular/custom/directive/html/consultaLog.html';  
329 -  
330 - if (appService.existsWorkspace(pagina)) {  
331 - $scope.showAlert('warning', $translate.instant('ESI.MSG.JA_EXISTE_TELA_HISTORICO'));  
332 - return ;  
333 - }  
334 -  
335 - $scope.processInstance = assignment.workItem.processInstance;  
336 - $rootScope.processInstance = $scope.processInstance;  
337 - $rootScope.controllerScope = $scope;  
338 -  
339 - $scope.processInstance.collapsed = true;  
340 - $scope.processInstance.collapsedError = true;  
341 - $scope.processInstance.instances = [];  
342 -  
343 - $scope.addNewWorkspace(assignment.workItem.processInstance.businessProcess.description, pagina, true, 'mod-orange', $scope.processInstance);  
344 - };  
345 -  
346 - $scope.retrieveAditionalHtml = function(assignment) {  
347 - assignment.$show = !assignment.$show;  
348 - if (!assignment.$show)  
349 - return;  
350 -  
351 - if (!assignment.workItem) {  
352 - BusinessProcessRepository.getPermissions({id: assignment.id}).then(function(result) {  
353 - assignment.workItem = result.originalElement;  
354 - $scope.showAditionalHtml(assignment.workItem);  
355 - });  
356 - }else{  
357 - $scope.showAditionalHtml(assignment.workItem);  
358 - }  
359 - };  
360 -  
361 - $scope.showAditionalHtml = function(workItem) {  
362 - var id = "divHtmlAdicional_" + $scope.idPainelItem + "_" + workItem.id;  
363 -  
364 - var el = document.getElementById(id);  
365 - if (!el || el.innerHTML != '')  
366 - return;  
367 -  
368 - var element = angular.element("#"+id);  
369 - environmentService.retrieveAditionalHtml($scope, workItem, element, $injector);  
370 - el.focus();  
371 - };  
372 -  
373 - $scope.signalEvent = function() {  
374 - $scope.setLoading(true);  
375 - RuntimeManagerRepository.signalEvent($scope.signalEventInput).then(function(result) {  
376 - $scope.setLoading(false);  
377 - });  
378 - };  
379 -  
380 - $scope.getAplicacaoFluxo = function(processoNegocio) {  
381 - return DomainRepository.getEnumDescription(processoNegocio['flow.flowApplication'], $scope.aplicacaoFluxo);  
382 - };  
383 -  
384 - $scope.getTimeManagementStatus = function(processInstance) {  
385 - if (processInstance && processInstance.timeManagementStatus) {  
386 - processInstance.backgroundColorTimeStatus = processInstance.timeManagementStatus === 'SUSPENDED' ? "red" : processInstance.timeManagementStatus === 'NOT_STARTED' ? "yellow-dark" : "green";  
387 - processInstance.textColorTimeStatus = processInstance.timeManagementStatus === 'NOT_STARTED' ? "black" : "white";  
388 - return DomainRepository.getEnumDescription(processInstance.timeManagementStatus, $scope.timeManagementStatus);  
389 - }else{  
390 - return "";  
391 - } 57 + var filterCriteriaDefault = angular.copy($scope.filterCriteria);
  58 +
  59 + $scope.atualizarGrid = function() {
  60 + $scope.filterCriteria = angular.copy(filterCriteriaDefault);
  61 + carregarDominiosStatusProcesso();
  62 + $scope.filterResult();
392 }; 63 };
393 64
394 -/* $scope.mostrarFilhos = function(categoriaSelecionada){  
395 -  
396 - // Valida se a estrutura possui filho  
397 - if(categoriaSelecionada.sinalPositivo) {  
398 - categoriaSelecionada.sinalPositivo = !categoriaSelecionada.sinalPositivo;  
399 -  
400 - $scope.setLoadingPesquisa(true);  
401 -  
402 - categoriaSelecionada.subCategories = [];  
403 -  
404 - var categoria = categoriaSelecionada.originalElement ? categoriaSelecionada.originalElement : categoriaSelecionada;  
405 -  
406 - $scope.scrollToCadastro('#categoria_'+categoria.id);  
407 -  
408 - $scope.recuperaProcessos(categoria);  
409 -  
410 - // busca os filhos da estrutura selecionada  
411 - BusinessProcessCategoryRepository.findChildrens(categoria.id).then(function(result) {  
412 - // Percorre as estruturas filhas setando a propriedade do sinal positivo/negativo e adiciona o filho na lista de filhos da estrutura selecionada  
413 - angular.forEach(result, function(categoriaFilha){  
414 - categoriaFilha.originalElement.sinalPositivo = categoriaFilha.originalElement.hasChildren || categoriaFilha.originalElement.hasProcesses;  
415 - categoriaSelecionada.subCategories.push(categoriaFilha.originalElement);  
416 - categoriaFilha.originalElement.subCategories = [];  
417 - //$scope.recuperaProcessos(categoriaFilha);  
418 - });  
419 - $scope.setLoadingPesquisa(false);  
420 - });  
421 -  
422 - } else {  
423 -  
424 - categoriaSelecionada.sinalPositivo = !categoriaSelecionada.sinalPositivo;  
425 -  
426 - categoriaSelecionada.subCategories = [];  
427 -  
428 - categoriaSelecionada.processos = [];  
429 - }  
430 -  
431 - };*/ 65 + carregarDominiosStatusProcesso();
432 66
433 - $scope.recuperaProcessos = function(categoria) {  
434 - $scope.setLoadingPesquisa(true);  
435 - categoria.processos = [];  
436 - $scope.filterProcessos.filters[0].value = categoria.id;  
437 - BusinessProcessRepository.getProcessesForStart($scope.usuarioLogado.username, $scope.filterProcessos).then(function(result) {  
438 - categoria.processos = result.originalElement.objects;  
439 - });  
440 - };  
441 -  
442 - $scope.fetchResult();  
443 -}]);  
444 -  
445 - 67 +}]);
446 \ No newline at end of file 68 \ No newline at end of file
cit-ecm-web/src/main/webapp/html/gerenciarProcesso/gerenciarProcessoListUnidade.html
1 <meta charset="UTF-8"> 1 <meta charset="UTF-8">
2 -<div id="idGerenciamentoTarefas" class="page-content" ng-controller="GerenciarProcessoListUnidadeController" ng-init="init(workflowFilterCriteriaService.getSIGADFilterCriteria())"> 2 +<div id="idGerenciamentoTarefas" class="page-content" ng-controller="GerenciarProcessoListUnidadeController">
3 <div class="bar-buttons-action fixed"> 3 <div class="bar-buttons-action fixed">
4 <div class="row"> 4 <div class="row">
5 <div class="col-sm-9 text-left"> 5 <div class="col-sm-9 text-left">
6 - <button class="btn btn-clear" title="{{$translate.instant('LABEL.ATUALIZAR')}}" alt="{{$translate.instant('LABEL.ATUALIZAR')}}" ng-click="tabAtual == 0 ? fetchResult() : fetchBusinessProcess()"> 6 + <button class="btn btn-clear" title="{{$translate.instant('LABEL.ATUALIZAR')}}" alt="{{$translate.instant('LABEL.ATUALIZAR')}}" ng-click="atualizarGrid();">
7 <i class="fa fa-refresh purple"></i> 7 <i class="fa fa-refresh purple"></i>
8 <translate>LABEL.ATUALIZAR</translate> 8 <translate>LABEL.ATUALIZAR</translate>
9 </button> 9 </button>
10 </div> 10 </div>
11 -  
12 <div class="col-sm-3 text-right"> 11 <div class="col-sm-3 text-right">
13 <favorito /> 12 <favorito />
14 -  
15 <help-button workspace="workspace" /> 13 <help-button workspace="workspace" />
16 </div> 14 </div>
17 - <!-- .col -->  
18 </div> 15 </div>
19 - <!-- .row -->  
20 </div> 16 </div>
21 - <!-- .bar-buttons-action -->  
22 17
23 <breadcrumb ng-workspace="workspace"></breadcrumb> 18 <breadcrumb ng-workspace="workspace"></breadcrumb>
24 - <div class="row">  
25 - <div class="col-sm-12">  
26 - <div class="table-container">  
27 - <div class="table-header clearfix">  
28 - <div class="table-header-right">  
29 - <button class="btn btn-primary btn-inline btn-white table-header-item" ng-click="$showAdvancedFilters = !$showAdvancedFilters">  
30 - <i class="fa fa-filter"></i>  
31 - <translate>LABEL.FILTROS_AVANCADOS</translate>  
32 - </button>  
33 - </div>  
34 - <!-- .table-header-right -->  
35 -  
36 - <div class="table-header-left">  
37 - <div class="form-group">  
38 - <div class="input-group">  
39 - <input type="text" class="form-control" placeholder="Digite o Protocolo" on-enter-blur ng-blur="filterSigadProtocolo()" ng-model="sigadProtocolo" /> <span  
40 - class="input-group-addon"> <i class="fa fa-search fa-lg"></i>  
41 - </span>  
42 - </div>  
43 - </div>  
44 - <!-- .form-group -->  
45 - </div>  
46 - <!-- .table-header-left -->  
47 - </div>  
48 - <!-- .table-header -->  
49 -  
50 - <table class="table table-striped table-bordered table-hover">  
51 - <thead>  
52 - <tr>  
53 - <th colspan="2" style="align: center; width: 30%;"><small><translate>ECM.LABEL.PROTOCOLO</translate></small></th>  
54 - <th colspan="2" style="width: 25%;"><small><translate>ESI.TAREFA</translate></small></th>  
55 - <th style="width: 25%;"><small><translate>LABEL.PROCESSO_NEGOCIO</translate></small></th>  
56 - <th class="text-center" style="width: 3%;"><small><translate>LABEL.ACOES</translate></small></th>  
57 - <th style="align: center; width: 17%;"><small><translate>PORTAL.LABEL.SITUACAO_INSTANCIA</translate></small></th>  
58 - </tr>  
59 - </thead>  
60 - <tfoot ng-show="totalItens > 0">  
61 - <tr>  
62 - <td colspan="9">  
63 - <div class="row">  
64 - <div class='col-sm-4 table-showing'>  
65 - <translate>LABEL.MOSTRANDO</translate>  
66 - {{filterCriteria.start}}  
67 - <translate>LABEL.ATE</translate>  
68 - {{filterCriteria.limit > totalItens ? totalItens : filterCriteria.limit}}  
69 - <translate>LABEL.DE</translate>  
70 - ({{totalItens}})  
71 - <translate>ESI.TAREFAS</translate>  
72 - .  
73 - </div>  
74 - <div class="col-sm-8 text-right">  
75 - <pagination rotate="true" total-items="totalItens" num-pages="totalPages" ng-model="filterCriteria.start" items-per-page="filterCriteria.limit" class="pagination-sm" boundary-links="true"  
76 - ng-change="fetchResult()"></pagination>  
77 - </div>  
78 - <!-- .col -->  
79 - </div> <!-- .row -->  
80 - </td>  
81 - </tr>  
82 - </tfoot>  
83 - <tbody>  
84 - <tr ng-show="$showAdvancedFilters">  
85 -  
86 - <td >  
87 - <div class="row">  
88 - <div class="col-sm-12">  
89 - <input class="form-control" ng-blur="filterSigad()" ng-model="processoSigad" type="text" />  
90 - </div>  
91 - <!-- .col -->  
92 - </div>  
93 - <!-- .row -->  
94 - </td>  
95 - <td>&nbsp;</td>  
96 - <td >  
97 - <div class="row">  
98 - <div class="col-sm-12">  
99 - <input class="form-control" ng-change="filterResult()" ng-model="filterCriteria.filters[0].value" type="text" integer />  
100 - </div>  
101 - <!-- .col -->  
102 - </div> <!-- .row -->  
103 - </td>  
104 -  
105 - <td>  
106 - <div class="row">  
107 - <div class="col-sm-12">  
108 - <input class="form-control" ng-change="filterResult()" ng-model="filterCriteria.filters[1].value" type="text" />  
109 - </div>  
110 - <!-- .col -->  
111 - </div> <!-- .row -->  
112 - </td>  
113 -  
114 -<!-- <td style="width: 5%;">  
115 - <div class="row">  
116 - <div class="col-sm-12">  
117 - <input class="form-control" ng-change="filterResult()" ng-model="filterCriteria.filters[2].value" type="text" integer />  
118 - </div>  
119 - .col  
120 - </div> .row  
121 - </td> -->  
122 -  
123 - <td>  
124 - <div class="row">  
125 - <div class="col-sm-12">  
126 - <input class="form-control" ng-change="filterResult()" ng-model="filterCriteria.filters[3].value" type="text" />  
127 - </div>  
128 - <!-- .col -->  
129 - </div> <!-- .row -->  
130 - </td>  
131 - <td>&nbsp;</td>  
132 -  
133 - <td>  
134 - <div class="row">  
135 - <div class="col-sm-12">  
136 - <input class="form-control" ng-change="filterResult()" ng-model="filterCriteria.filters[4].value" type="text" />  
137 - </div>  
138 - <!-- .col -->  
139 - </div> <!-- .row -->  
140 - </td>  
141 - </tr>  
142 -  
143 - <tr ng-repeat-start="assignment in assignments">  
144 - <td class="text-center" ><span class="small green">{{assignment.processo.nup}} <a href="javascript:;" class="blue" ng-click="retrieveAditionalHtml(assignment)">  
145 - <i class="fa fa-lg" ng-class="{'fa-caret-right': !assignment.$show, 'fa-caret-down': assignment.$show}"></i></a></span>  
146 - </td>  
147 - <td><span class="small green">{{assignment.processo.tipoProcesso.nome}}</span></td>  
148 - <td class="text-center"><span class="small green">{{assignment.id}}</span></td>  
149 - <td><span class="small green">{{assignment.flowElement.name}}</span></td>  
150 - <!-- <td class="text-center" ><span class="small green">{{assignment.processInstance.id}}</span></td> -->  
151 - <td><span class="small green">{{assignment.processInstance.businessProcess.description}}</span></td>  
152 - <td>  
153 - <div class="btn-group dropdown" role="group" dropdown>  
154 - <button title="{{$translate.instant('LABEL.ACOES')}}" alt="{{$translate.instant('LABEL.ACOES')}}" class="btn btn-clear" dropdown-toggle ng-click="recuperarPermissoes(assignment)">  
155 - <i class="fa fa-cog blue bigger-170"></i> <span class="fa fa-caret-down icon-on-right"></span>  
156 - </button>  
157 - <ul class="dropdown-menu-center dropdown-menu dropdown-caret" role="menu">  
158 - <li ng-show="!assignment.workItem || !assignment.workItem.id"><span class="small red">&nbsp;&nbsp;&nbsp;&nbsp;<b><translate>MSG.AGUARDE</translate></b></span></li>  
159 - <li ng-show="assignment.workItem.execute"><a href="javascript:;" ng-click="executarTarefa(assignment)"><i class="fa fa-play-circle-o green"></i> <translate>LABEL.EXECUTAR</translate></a>  
160 - </li>  
161 - <li ng-show="assignment.workItem.execute"><a href="javascript:;" ng-click="capturarTarefa(assignment)"><i class="fa fa-thumb-tack orange"></i> <translate>PORTAL.LABEL.CAPTURAR</translate></a>  
162 - </li>  
163 - <li ng-show="assignment.workItem.delegate"><a href="javascript:;" ng-click="delegarTarefa(assignment)"><i class="fa fa-users blue"></i> <translate>ESI.PERMISSAO.DELEGAR</translate></a>  
164 - </li>  
165 - <li ng-show="assignment.workItem.suspend"><a href="javascript:;" ng-click="suspenderProcesso(assignment)"><i class="fa fa-pause red"></i> <translate>ESI.PERMISSAO.SUSPENDER</translate></a>  
166 - </li>  
167 - <li ng-show="assignment.workItem.restart"><a href="javascript:;" ng-click="reativarProcesso(assignment)"><i class="fa fa-play green"></i> <translate>PORTAL.LABEL.PERMISSAO.REATIVAR</translate></a>  
168 - </li>  
169 - <li ng-show="assignment.workItem.visualize"><a href="javascript:;" ng-click="visualizarFluxo(assignment)"><i class="fa fa-search blue"></i> <translate>PORTAL.LABEL.VISUALIZAR_FLUXO</translate></a>  
170 - </li>  
171 - <li ng-show="assignment.workItem.visualize"><a href="javascript:;" ng-click="consultarHistorico(assignment)"><i class="fa fa-history yellow-dark"></i> <translate>ESI.LOG.CONSULTA_LOG</translate></a>  
172 - </li>  
173 - </ul>  
174 - </div>  
175 - </td>  
176 - <td><span ng-if="assignment.processInstance.flowStatus && assignment.processInstance.status != 'SUSPENDED'" class="badge black"  
177 - style="background-color: {{assignment.processInstance.flowStatus.backgroundColor"> <font color="{{assignment.processInstance.flowStatus.textColor}}"><b><translate>{{assignment.processInstance.flowStatus.name}}</translate></b></font>  
178 - </span> <span ng-if="assignment.processInstance.status == 'SUSPENDED'" class="badge black" style="background-color: red !important"> <font color="white"><b><translate>ESI.ENUMERADO.SITUACAO_INSTANCIA_SUSPENSA</translate></b></font>  
179 - </span></td>  
180 - </tr>  
181 -  
182 - <tr ng-show="assignment.$show" ng-repeat-end>  
183 - <td>&nbsp;</td>  
184 -  
185 - <td colspan="8">  
186 -  
187 - <div class="media media-card">  
188 -  
189 - <fieldset>  
190 - <legend style="font-size: 16px !important">  
191 - <b><translate>ESI.INFORMACOES_ADICIONAIS</translate></b>  
192 - </legend>  
193 -  
194 - <div class="row">  
195 - <div class="col-md-12">  
196 -  
197 - <label>  
198 - <div class="small bolder">  
199 - <translate>ECM.LABEL.ASSUNTO</translate>  
200 - </div> <span class="small green">{{assignment.processo.assunto.assunto}}</span>  
201 - </label>  
202 - </div>  
203 - </div>  
204 -  
205 - <div class="row">  
206 - <div class="col-md-12">  
207 - <label>  
208 - <div class="small bolder">  
209 - <translate>ECM.LABEL.ASSUNTOCOMPLEMENTAR</translate>  
210 - </div> <span class="small green">{{assignment.processo.assuntoComplementar}}</span>  
211 - </label>  
212 - </div>  
213 - </div>  
214 -  
215 - <div class="row">  
216 - <div class="col-md-12">  
217 - <label>  
218 - <div class="small bolder">  
219 - <translate>ECM.LABEL.NIVELACESSO</translate>  
220 - </div> <span class="label label-success" ng-show="assignment.processo.nivelAcesso.nivelAcesso.nome =='PUBLICO'">{{assignment.processo.nivelAcesso.nivelAcesso.descricao}}</span> <span  
221 - class="label label-warning" ng-show="assignment.processo.nivelAcesso.nivelAcesso.nome =='RESTRITO'">{{assignment.processo.nivelAcesso.nivelAcesso.descricao}}</span> <span  
222 - class="label label-danger" ng-show="assignment.processo.nivelAcesso.nivelAcesso.nome =='SIGILOSO'">{{assignment.processo.sigilo.descricao}}</span>  
223 -  
224 - </label>  
225 - </div>  
226 - </div>  
227 -  
228 - <div class="row" ng-show='assignment.processo.hipoteseLegal.nome'>  
229 - <div class="col-md-12">  
230 - <label>  
231 - <div class="small bolder">  
232 - <translate>ECM.LABEL.HIPOTESELEGAL</translate>  
233 - </div> <span class="small green">{{assignment.processo.hipoteseLegal.nome}}</span>  
234 - </label>  
235 - </div>  
236 - </div>  
237 -  
238 - <div class="row">  
239 -  
240 -  
241 - <div class='col-md-3'>  
242 - <label>  
243 - <div class="small bolder">  
244 - <translate>ECM.LABEL.DATACRIACAO</translate>  
245 - </div> <span class="small green">{{assignment.processo.dataCriacao | date: 'dd/MM/yyyy HH:mm:ss' }}</span>  
246 - </label>  
247 - </div>  
248 -  
249 - <div class='col-md-3'>  
250 - <label>  
251 - <div class="small bolder">  
252 - <translate>ECM.LABEL.DATAEDICAO</translate>  
253 - </div> <span class="small green">{{assignment.processo.dataEdicao | date: 'dd/MM/yyyy HH:mm:ss' }}</span>  
254 - </label>  
255 - </div>  
256 - </div>  
257 -  
258 -  
259 - </fieldset>  
260 -  
261 - </div> <!-- .media -->  
262 - </td>  
263 - </tr>  
264 - <tr ng-show="totalItens <= 0">  
265 - <td colspan="9"><strong><translate>MSG.NENHUM_REGISTRO_ENCONTRADO</translate></strong></td>  
266 - </tr>  
267 - </tbody>  
268 - </table>  
269 -  
270 - </div>  
271 - </div>  
272 - </div>  
273 - </tabset>  
274 -</div>  
275 -<!-- .table-container -->  
276 -</div>  
277 -<!-- .page-content -->  
278 \ No newline at end of file 19 \ No newline at end of file
  20 +
  21 + <list-view ng-lista="processos" ng-repository="UnidadeProcessoRepository" ng-headers="headers" ng-filter-criteria="filterCriteria"
  22 + ng-exibir-coluna-selecao="false" transclude="tarefasPorProcesso.html">
  23 + <div ng-include src="'/cit-ecm-web/html/gerenciarProcesso/tarefasPorProcesso.html'"></div>
  24 +
  25 + </list-view>
  26 +</div>
279 \ No newline at end of file 27 \ No newline at end of file
cit-ecm-web/src/main/webapp/html/gerenciarProcesso/tarefasPorProcesso.html 0 → 100644
@@ -0,0 +1,11 @@ @@ -0,0 +1,11 @@
  1 +
  2 +<table class="table table-bordered table-striped" style="width: 90%; margin-left: 5%; margin-right: 1%; margin-bottom: 1%; margin-top: 1%">
  3 + <tr>
  4 + <td>Tarefa</td>
  5 + <td>BPE</td>
  6 + </tr>
  7 + <tr>
  8 + <td>vaiii</td>
  9 + <td>curinthia</td>
  10 + </tr>
  11 +</table>