Commit af6057c2e9cb9fe4aaa43ca332ddc4b1bb0038bd

Authored by geovane.filho
1 parent ce466b41
Exists in master

Redmine #4483 Criando bloqueio de atividades quando estiver ocorrendo o fechamen…

…to do mês para o próprio fechamento do mês de referência e entrada
citgrp-patrimonio-web/src/main/java/br/com/centralit/controller/EntradaController.java
... ... @@ -19,49 +19,58 @@ import br.com.centralit.api.model.BemPatrimonial;
19 19 import br.com.centralit.api.model.Entrada;
20 20 import br.com.centralit.api.model.EntradaPatrimonio;
21 21 import br.com.centralit.api.model.EntradaPatrimonioItem;
  22 +import br.com.centralit.api.model.MyMensagemRetorno;
  23 +import br.com.centralit.api.model.MyRetornoStatus;
22 24 import br.com.centralit.api.service.EntradaService;
  25 +import br.com.centralit.api.service.OrganizacaoService;
23 26 import br.com.centralit.framework.controller.GenericController;
24 27 import br.com.centralit.framework.json.ResponseBodyWrapper;
25 28 import br.com.centralit.framework.json.Views;
  29 +import br.com.centralit.framework.model.Organizacao;
26 30 import br.com.centralit.framework.view.ResultResponseVH;
27 31  
28 32 /**
29 33 * <p>
30 34 * <img src="http://centralit.com.br/images/logo_central.png">
31 35 * </p>
32   - *
  36 + *
33 37 * <p>
34 38 * <b>Company: </b> Central IT - Governança Corporativa -
35 39 * </p>
36   - *
  40 + *
37 41 * <p>
38 42 * <b>Title: </b>
39 43 * </p>
40   - *
  44 + *
41 45 * <p>
42 46 * <b>Description: </b>
43 47 * </p>
44   - *
  48 + *
45 49 * @since 03/01/2015 - 11:19:18
46   - *
  50 + *
47 51 * @version 1.0.0
48   - *
  52 + *
49 53 * @author wilker.machado
50   - *
  54 + *
51 55 */
52 56 @Controller
53 57 @RequestMapping("/rest/entrada")
54 58 public class EntradaController extends GenericController<EntradaPatrimonio> {
55 59  
  60 + @Autowired
56 61 private EntradaService entradaService;
57 62  
  63 + @Autowired
  64 + private OrganizacaoService organizacaoService;
  65 +
58 66 public EntradaController() {
  67 +
59 68 super();
60 69 }
61 70  
62 71 /**
63 72 * Responsável pela criação de novas instâncias desta classe.
64   - *
  73 + *
65 74 * @param entradaService
66 75 */
67 76 @Autowired
... ... @@ -72,7 +81,6 @@ public class EntradaController extends GenericController&lt;EntradaPatrimonio&gt; {
72 81 this.entradaService = entradaService;
73 82 }
74 83  
75   -
76 84 @RequestMapping(value = "/verificarMovimentacaoBensEntrada", method = RequestMethod.POST)
77 85 @ResponseBody
78 86 public ResponseBodyWrapper verificarMovimentacaoBensEntrada(@RequestBody EntradaPatrimonio entrada) {
... ... @@ -102,57 +110,91 @@ public class EntradaController extends GenericController&lt;EntradaPatrimonio&gt; {
102 110  
103 111 /**
104 112 * Método responsável por realizar o upload dos anexos que estão ligadas a bem patrimonial Caracteristicas
105   - *
  113 + *
106 114 * @author wilker.machado
107   - *
  115 + *
108 116 * @param name
109 117 * @param file
110 118 * @param idAnexo
111 119 */
112 120 @RequestMapping(value = "/uploadAnexoCaracteristica", method = RequestMethod.POST)
113   - public @ResponseBody void uploadAnexoCaracteristica(@RequestParam(value = "filename", required = false) String name, @RequestParam("file") MultipartFile file, @RequestParam(value = "idEntradaItem", required = false) Long idEntradaItem) {
  121 + public @ResponseBody
  122 + void uploadAnexoCaracteristica(@RequestParam(value = "filename", required = false) String name, @RequestParam("file") MultipartFile file, @RequestParam(value = "idEntradaItem", required = false) Long idEntradaItem) {
114 123  
115 124 this.entradaService.uploadAnexoCaracteristica(file, idEntradaItem);
116 125  
117 126 }
118   -
  127 +
119 128 @RequestMapping(method = RequestMethod.POST, value = "")
120 129 @ResponseBody
121   - public ResponseBodyWrapper save(@RequestBody EntradaPatrimonio entity) throws Exception{
122   - boolean uniqueConstraintViolate = true;
123   -
124   - EntradaPatrimonio entrada = new EntradaPatrimonio();
125   -
126   - //TODO Solução temporária para evitar que sejam criados registros com o código duplicado. Alterar solução quando for implementado o cache compartilhado
127   - for(int i = 5; i > 0 && uniqueConstraintViolate; i--){
128   - try{
129   - entrada = this.entradaService.save(SerializationUtils.clone(entity));
130   - uniqueConstraintViolate = false;
131   - }catch(Throwable e){
132   - if(e.getCause() instanceof ConstraintViolationException){
133   - ConstraintViolationException ex = (ConstraintViolationException) e.getCause();
134   - if(ex.getSQLException().getMessage().contains("codigo_unico")){
135   - uniqueConstraintViolate = true;
136   - }else{
  130 + public ResponseBodyWrapper save(@RequestBody EntradaPatrimonio entity) throws Exception {
  131 +
  132 + Organizacao organizacao = this.organizacaoService.find(this.getUsuario().getOrganizacao().getId());
  133 +
  134 + if (!organizacao.getEmFechamento()) {
  135 +
  136 + boolean uniqueConstraintViolate = true;
  137 +
  138 + EntradaPatrimonio entrada = new EntradaPatrimonio();
  139 +
  140 + // TODO Solução temporária para evitar que sejam criados registros com o código duplicado. Alterar solução quando for implementado o cache compartilhado
  141 + for (int i = 5; i > 0 && uniqueConstraintViolate; i--) {
  142 + try {
  143 + entrada = this.entradaService.save(SerializationUtils.clone(entity));
  144 + uniqueConstraintViolate = false;
  145 + } catch (Throwable e) {
  146 + if (e.getCause() instanceof ConstraintViolationException) {
  147 + ConstraintViolationException ex = (ConstraintViolationException) e.getCause();
  148 + if (ex.getSQLException().getMessage().contains("codigo_unico")) {
  149 + uniqueConstraintViolate = true;
  150 + } else {
  151 + throw e;
  152 + }
  153 + } else {
137 154 throw e;
138 155 }
139   - }else{
140   - throw e;
141 156 }
142 157 }
  158 +
  159 + ResponseBodyWrapper responseBody = new ResponseBodyWrapper(entrada, getEditView());
  160 +
  161 + return responseBody;
  162 + } else {
  163 + MyRetornoStatus retorno = new MyRetornoStatus();
  164 + retorno.data = entity;
  165 + retorno.mensagens.add(new MyMensagemRetorno(MyMensagemRetorno.TipoMensagemRetorno.warning, "MSG.ORGANIZACAO_EM_FECHAMENTO_MES"));
  166 +
  167 + ResponseBodyWrapper responseBody = new ResponseBodyWrapper(retorno, getEditView());
  168 +
  169 + return responseBody;
143 170 }
144   -
145   - ResponseBodyWrapper responseBody = new ResponseBodyWrapper(entrada, getEditView());
146   -
147   - return responseBody;
148 171 }
149 172  
  173 + @RequestMapping(method = RequestMethod.POST, value = "/update")
  174 + @ResponseBody
  175 + public ResponseBodyWrapper update(@RequestBody EntradaPatrimonio objeto) {
  176 + Organizacao organizacao = this.organizacaoService.find(this.getUsuario().getOrganizacao().getId());
  177 +
  178 + if (!organizacao.getEmFechamento()) {
  179 + ResponseBodyWrapper responseBody = new ResponseBodyWrapper(this.entradaService.merge(objeto), getEditView());
  180 +
  181 + return responseBody;
  182 + } else {
  183 + MyRetornoStatus retorno = new MyRetornoStatus();
  184 + retorno.data = objeto;
  185 + retorno.mensagens.add(new MyMensagemRetorno(MyMensagemRetorno.TipoMensagemRetorno.warning, "MSG.ORGANIZACAO_EM_FECHAMENTO_MES"));
  186 +
  187 + ResponseBodyWrapper responseBody = new ResponseBodyWrapper(retorno, getEditView());
  188 +
  189 + return responseBody;
  190 + }
  191 + }
150 192  
151 193 /**
152 194 * Método responsável por listar <code>Entrada</code> por codigo e <code>Organizacao</code>
153   - *
  195 + *
154 196 * @author geovane.filho
155   - *
  197 + *
156 198 * @param value
157 199 * @param idOrganizacao
158 200 * @return <code>ResponseBodyWrapper</code>
... ... @@ -167,11 +209,23 @@ public class EntradaController extends GenericController&lt;EntradaPatrimonio&gt; {
167 209  
168 210 return responseBody;
169 211 }
170   -
  212 +
171 213 @RequestMapping(method = RequestMethod.POST, value = "/concluir")
172 214 @ResponseBody
173 215 public ResponseBodyWrapper concluir(@RequestBody EntradaPatrimonio entrada) {
174   - return new ResponseBodyWrapper(entradaService.concluir(entrada), getEditView());
  216 + Organizacao organizacao = this.organizacaoService.find(this.getUsuario().getOrganizacao().getId());
  217 +
  218 + if (!organizacao.getEmFechamento()) {
  219 + return new ResponseBodyWrapper(entradaService.concluir(entrada), getEditView());
  220 + } else {
  221 + MyRetornoStatus retorno = new MyRetornoStatus();
  222 + retorno.data = entrada;
  223 + retorno.mensagens.add(new MyMensagemRetorno(MyMensagemRetorno.TipoMensagemRetorno.warning, "MSG.ORGANIZACAO_EM_FECHAMENTO_MES"));
  224 +
  225 + ResponseBodyWrapper responseBody = new ResponseBodyWrapper(retorno, getEditView());
  226 +
  227 + return responseBody;
  228 + }
175 229 }
176 230  
177 231 @RequestMapping(value = "/{id}", method = RequestMethod.GET)
... ... @@ -180,11 +234,11 @@ public class EntradaController extends GenericController&lt;EntradaPatrimonio&gt; {
180 234  
181 235 List<BemPatrimonial> listaBemPatrimopnial = null;
182 236 EntradaPatrimonio entrada = this.entradaService.find(id);
183   - if(entrada.getEntradasIten() != null){
  237 + if (entrada.getEntradasIten() != null) {
184 238 for (EntradaPatrimonioItem entradaItem : entrada.getEntradasIten()) {
185 239 listaBemPatrimopnial = new ArrayList<BemPatrimonial>();
186 240 for (BemPatrimonial bemPatrimonial : entradaItem.getBensPatrimoniais()) {
187   - if(bemPatrimonial.getDataInativo() == null){
  241 + if (bemPatrimonial.getDataInativo() == null) {
188 242 listaBemPatrimopnial.add(bemPatrimonial);
189 243 }
190 244 }
... ... @@ -198,24 +252,26 @@ public class EntradaController extends GenericController&lt;EntradaPatrimonio&gt; {
198 252  
199 253 return responseBody;
200 254 }
201   -
  255 +
202 256 @RequestMapping(value = "/existemBemSemDataContabil", method = RequestMethod.GET, produces = "application/json")
203 257 @ResponseBody
204 258 public boolean existemBemSemDataContabil(@RequestParam(value = "idEntrada") Long idEntrada) {
  259 +
205 260 return this.entradaService.existeBemSemDataContabil(idEntrada);
206   - }
207   -
  261 + }
  262 +
208 263 @RequestMapping(method = RequestMethod.GET, value = "/validaExistenciaBemMaterialEntrada", produces = "application/json")
209 264 @ResponseBody
210 265 public boolean validaExistenciaBemMaterialEntrada(@RequestParam(value = "idEntrada", required = false) Long idEntrada) {
  266 +
211 267 return entradaService.verificaExistenciaBensPatrimoniaisEntrada(idEntrada);
212 268 }
213   -
  269 +
214 270 @RequestMapping(method = RequestMethod.GET, value = "/verificaExistenciaBemPatrimonialTemporarioEntrada", produces = "application/json")
215 271 @ResponseBody
216 272 public boolean verificaExistenciaBemPatrimonialTemporario(@RequestParam(value = "idEntrada", required = false) Long idEntrada) {
  273 +
217 274 return entradaService.verificaExistenciaBensPatrimoniaisTemporariosEntrada(idEntrada);
218 275 }
219   -
220   -
  276 +
221 277 }
... ...
citgrp-patrimonio-web/src/main/java/br/com/centralit/controller/OrganizacaoPatrimonioController.java
... ... @@ -107,56 +107,61 @@ public class OrganizacaoPatrimonioController {
107 107 Long tipoDepreciacaoCodigo = requisicaoFechamento.get("tipoDepreciacao");
108 108  
109 109 if (!organizacao.getEmFechamento()) {
110   - this.organizacaoService.iniciarFechamentoDeMes(organizacao.getId());
111   -
112   - MyRetornoStatus retornoFechamentoBens = new MyRetornoStatus();
113   -
114   - MyRetornoStatus retornoBensNaEstruturaAlmoxarifado = new MyRetornoStatus();
  110 + try {
  111 + this.organizacaoService.iniciarFechamentoDeMes(organizacao.getId());
115 112  
116   - retornoBensNaEstruturaAlmoxarifado.status = this.bemPatrimonialService.validarBensNaEstruturaAlmoxarifado(organizacao.getId());
117   - retornoBensNaEstruturaAlmoxarifado.mensagens.add(new MyMensagemRetorno(MyMensagemRetorno.TipoMensagemRetorno.error, "MSG.BENS_NA_ESTRUTURA_ALMOXARIFADO"));
118   -
119   - if(!retornoBensNaEstruturaAlmoxarifado.status) {
120   - ResponseBodyWrapper responseBody = new ResponseBodyWrapper(retornoBensNaEstruturaAlmoxarifado, Views.EstruturaOrganizacionalEditView.class);
121   - return responseBody;
122   - }
123   -
124   - retornoFechamentoBens.status = this.bemPatrimonialService.fecharValoresBens(organizacao.getId(), user.getId());
125   -
126   - MyRetornoStatus retornoFechamentoContas = new MyRetornoStatus();
127   - retornoFechamentoContas.status = this.contaContabilSaldoService.fechaSaldoContasContabeisTipoPermanente(organizacao);
128   -
129   - if (retornoFechamentoBens.status && retornoFechamentoContas.status) {
130   - MyRetornoStatus retornoDepreciacao = new MyRetornoStatus();
131   -
132   - Dominio tipoDepreciacao = this.dominioService.findByChaveAndCodigo(Dominio.TIPO_DEPRECIACAO, tipoDepreciacaoCodigo);
  113 + MyRetornoStatus retornoFechamentoBens = new MyRetornoStatus();
133 114  
134   - Depreciacao depreciacao = this.depreciacaoService.geraDepreciacao(organizacao, tipoDepreciacao, user.getId());
  115 + MyRetornoStatus retornoBensNaEstruturaAlmoxarifado = new MyRetornoStatus();
  116 +
  117 + retornoBensNaEstruturaAlmoxarifado.status = this.bemPatrimonialService.validarBensNaEstruturaAlmoxarifado(organizacao.getId());
  118 + retornoBensNaEstruturaAlmoxarifado.mensagens.add(new MyMensagemRetorno(MyMensagemRetorno.TipoMensagemRetorno.error, "MSG.BENS_NA_ESTRUTURA_ALMOXARIFADO"));
135 119  
136   - if (depreciacao != null) {
137   - retornoDepreciacao = new MyRetornoStatus(depreciacao);
138   - } else {
139   - if (tipoDepreciacao == null) {
140   - MyMensagemRetorno mensagem = new MyMensagemRetorno(MyMensagemRetorno.TipoMensagemRetorno.error, "MSG.FECHAR_MES_REFERENCIA_SEM_DEPRECIACAO");
141   - retornoDepreciacao.mensagens.add(mensagem);
142   - }
  120 + if(!retornoBensNaEstruturaAlmoxarifado.status) {
  121 + ResponseBodyWrapper responseBody = new ResponseBodyWrapper(retornoBensNaEstruturaAlmoxarifado, Views.EstruturaOrganizacionalEditView.class);
  122 + return responseBody;
143 123 }
144   -
145   - if (retornoDepreciacao.status) { // Se a depreciação foi realizada com sucesso eu atualizo o mês de referencia
146   - retornoFechamentoContas.mensagens.add(new MyMensagemRetorno(MyMensagemRetorno.TipoMensagemRetorno.success, "MSG.SUCESSO_DEPRECIACAO"));
147   - organizacao.getDataReferenciaVigente().add(Calendar.MONTH, 1);
148   - this.organizacaoService.merge(organizacao);
149   - retornoFechamentoContas.mensagens.add(new MyMensagemRetorno(MyMensagemRetorno.TipoMensagemRetorno.success, "MSG.SUCESSO_MES_REFERENCIA"));
150   - } else {
151   - retornoFechamentoContas.status = retornoDepreciacao.status;
152   - retornoFechamentoContas.mensagens.addAll(retornoDepreciacao.mensagens);
  124 +
  125 + retornoFechamentoBens.status = this.bemPatrimonialService.fecharValoresBens(organizacao.getId(), user.getId());
  126 +
  127 + MyRetornoStatus retornoFechamentoContas = new MyRetornoStatus();
  128 + retornoFechamentoContas.status = this.contaContabilSaldoService.fechaSaldoContasContabeisTipoPermanente(organizacao);
  129 +
  130 + if (retornoFechamentoBens.status && retornoFechamentoContas.status) {
  131 + MyRetornoStatus retornoDepreciacao = new MyRetornoStatus();
  132 +
  133 + Dominio tipoDepreciacao = this.dominioService.findByChaveAndCodigo(Dominio.TIPO_DEPRECIACAO, tipoDepreciacaoCodigo);
  134 +
  135 + Depreciacao depreciacao = this.depreciacaoService.geraDepreciacao(organizacao, tipoDepreciacao, user.getId());
  136 +
  137 + if (depreciacao != null) {
  138 + retornoDepreciacao = new MyRetornoStatus(depreciacao);
  139 + } else {
  140 + if (tipoDepreciacao == null) {
  141 + MyMensagemRetorno mensagem = new MyMensagemRetorno(MyMensagemRetorno.TipoMensagemRetorno.error, "MSG.FECHAR_MES_REFERENCIA_SEM_DEPRECIACAO");
  142 + retornoDepreciacao.mensagens.add(mensagem);
  143 + }
  144 + }
  145 +
  146 + if (retornoDepreciacao.status) { // Se a depreciação foi realizada com sucesso eu atualizo o mês de referencia
  147 + retornoFechamentoContas.mensagens.add(new MyMensagemRetorno(MyMensagemRetorno.TipoMensagemRetorno.success, "MSG.SUCESSO_DEPRECIACAO"));
  148 + organizacao.getDataReferenciaVigente().add(Calendar.MONTH, 1);
  149 + this.organizacaoService.merge(organizacao);
  150 + retornoFechamentoContas.mensagens.add(new MyMensagemRetorno(MyMensagemRetorno.TipoMensagemRetorno.success, "MSG.SUCESSO_MES_REFERENCIA"));
  151 + } else {
  152 + retornoFechamentoContas.status = retornoDepreciacao.status;
  153 + retornoFechamentoContas.mensagens.addAll(retornoDepreciacao.mensagens);
  154 + }
153 155 }
  156 +
  157 + ResponseBodyWrapper responseBody = new ResponseBodyWrapper(retornoFechamentoContas, Views.EstruturaOrganizacionalEditView.class);
  158 + this.organizacaoService.terminarFechamentoDeMes(organizacao.getId());
  159 +
  160 + return responseBody;
  161 + } catch (Exception ex) {
  162 + this.organizacaoService.terminarFechamentoDeMes(organizacao.getId());
  163 + throw ex;
154 164 }
155   -
156   - ResponseBodyWrapper responseBody = new ResponseBodyWrapper(retornoFechamentoContas, Views.EstruturaOrganizacionalEditView.class);
157   - this.organizacaoService.terminarFechamentoDeMes(organizacao.getId());
158   -
159   - return responseBody;
160 165 } else {
161 166 MyRetornoStatus retornoFechamentoContas = new MyRetornoStatus();
162 167 retornoFechamentoContas.mensagens.add(new MyMensagemRetorno(MyMensagemRetorno.TipoMensagemRetorno.warning, "MSG.ORGANIZACAO_EM_FECHAMENTO_MES"));
... ...
citgrp-patrimonio-web/src/main/webapp/assets/js/angular/custom/controller/EntradaController.js
... ... @@ -31,11 +31,11 @@ citApp.factory(&#39;PatrimonioService&#39;, [&#39;BemPatrimonialRepository&#39;, &#39;$rootScope&#39;, f
31 31 citApp.controller('EntradaController', ['$scope', '$timeout', 'FileUploader', 'EntradaRepository', 'DominioRepository', 'EntradaItemRepository',
32 32 'EstruturaOrganizacionalRepository', 'FornecedorRepository', 'ParceiroRepository', 'BemPatrimonialTemporarioRepository',
33 33 'MaterialRepository', 'BemPatrimonialRepository', '$filter', '$translate', '$modal', '$rootScope',
34   - 'ConfiguracaoParametroSistemaRepository', '$q', 'EstruturaOrganizacionalPatrimonioRepository', 'TransferenciaItemRepository', 'ContaContabilRepository',
  34 + 'ConfiguracaoParametroSistemaRepository', '$q', 'EstruturaOrganizacionalPatrimonioRepository', 'TransferenciaItemRepository', 'ContaContabilRepository', 'OrganizacaoRepository',
35 35 function EntradaController($scope, $timeout, FileUploader, EntradaRepository, DominioRepository, EntradaItemRepository,
36 36 EstruturaOrganizacionalRepository, FornecedorRepository, ParceiroRepository, BemPatrimonialTemporarioRepository,
37 37 MaterialRepository, BemPatrimonialRepository, $filter, $translate, $modal, $rootScope, ConfiguracaoParametroSistemaRepository, $q,
38   - EstruturaOrganizacionalPatrimonioRepository, TransferenciaItemRepository, ContaContabilRepository) {
  38 + EstruturaOrganizacionalPatrimonioRepository, TransferenciaItemRepository, ContaContabilRepository, OrganizacaoRepository) {
39 39  
40 40 var CODIGO_DOMINIO_TIPO_RECEBIMENTO_COMPRA_ORCAMENTARIA = 1;
41 41  
... ... @@ -275,77 +275,84 @@ citApp.controller(&#39;EntradaController&#39;, [&#39;$scope&#39;, &#39;$timeout&#39;, &#39;FileUploader&#39;, &#39;E
275 275 valorUnitario: $scope.entradaItem.valorUnitario
276 276 };
277 277  
278   - EntradaItemRepository.save(entradaItemTemp).then(function(resultEntradaItem) {
279   -
280   - var entradaItem = resultEntradaItem.originalElement;
281   - if ($scope.bemPatrimonial.dataInicialGarantia){
282   -
283   - entradaItem.dataInicialGarantia = $scope.bemPatrimonial.dataInicialGarantia;
284   - }
285   -
286   - if ($scope.bemPatrimonial.dataFinalGarantia) {
287   -
288   - entradaItem.dataFinalGarantia = $scope.bemPatrimonial.dataFinalGarantia;
289   - }
290   -
291   - if (idOld) {
292   - $scope.itensDeEntrada.forEach(function(entrada) {
293   - if (entrada.$checked) {
294   - entrada.material = entradaItem.material;
295   - entrada.quantidade = entradaItem.quantidade;
296   - entrada.valor = entradaItem.valor;
297   - }
298   - });
299   - $scope.editaInfoEntrada = false;
300   - } else {
301   - $scope.checkEntradaItem(entradaItem);
302   - $scope.itensDeEntrada.push(entradaItem);
303   - }
304   -
305   - $scope.entradaItem.material = '';
306   - $scope.entradaItem.quantidade = '';
307   - $scope.entradaItem.valor = '';
308   - $scope.valorUnitario = '';
309   - $scope.calcularValorTotal();
310   - $scope.showAtributosEmMassa = false;
311   - $scope.checkAllItem = false;
312   -
313   - var situacaoFisica = null;
314   - if ($scope.bemPatrimonial.dominioSituacaoFisica) {
315   - situacaoFisica = {codigo: $scope.bemPatrimonial.dominioSituacaoFisica.codigo};
316   - }
317   -
318   - var statusBem = null;
319   - if ($scope.bemPatrimonial.dominioStatus) {
320   - statusBem = {codigo: $scope.bemPatrimonial.dominioStatus.codigo};
321   - }
322   -
323   - var bemReferencia = {
324   - entradaItem: {
325   - id: entradaItem.id
326   - },
327   - material: {id : $scope.entradaItem.material.id},
328   - numeroPatrimonial: numeroPatrimonialInicial,
329   - dominioSituacaoFisica: situacaoFisica,
330   - dominioStatus: statusBem,
331   - dataInicialGarantia: $scope.bemPatrimonial.dataInicialGarantia,
332   - dataFinalGarantia: $scope.bemPatrimonial.dataFinalGarantia,
333   - vidaUtilOriginal: $scope.bemPatrimonial.vidaUtilOriginal,
334   - percentualNaoDepreciavel: $scope.bemPatrimonial.percentualNaoDepreciavel
335   - };
336   - $scope.$modalInstance.dismiss('cancel');
337   -
338   - if (quantidade >= 500){
339   - $scope.setLoading(true, $translate.instant('PATRIMONIO.MSG.SALVANDO_MATERIAIS_ENTRADA_PATRIMONIO_GRANDE_QTD'));
340   - }
341   -
342   - BemPatrimonialTemporarioRepository.geraBensTemp(bemReferencia).then(function(result) {
343   -
344   - formEntradaItem.$submitted = false;
345   - $scope.setLoading(false);
346   - });
347   -
348   -
  278 + OrganizacaoRepository.get($scope.usuarioLogado.organizacao.id).then(function (result) {
  279 + $scope.organizacao = result.originalElement;
  280 +
  281 + if (!$scope.organizacao.emFechamento) {
  282 + EntradaItemRepository.save(entradaItemTemp).then(function(resultEntradaItem) {
  283 +
  284 + var entradaItem = resultEntradaItem.originalElement;
  285 + if ($scope.bemPatrimonial.dataInicialGarantia){
  286 +
  287 + entradaItem.dataInicialGarantia = $scope.bemPatrimonial.dataInicialGarantia;
  288 + }
  289 +
  290 + if ($scope.bemPatrimonial.dataFinalGarantia) {
  291 +
  292 + entradaItem.dataFinalGarantia = $scope.bemPatrimonial.dataFinalGarantia;
  293 + }
  294 +
  295 + if (idOld) {
  296 + $scope.itensDeEntrada.forEach(function(entrada) {
  297 + if (entrada.$checked) {
  298 + entrada.material = entradaItem.material;
  299 + entrada.quantidade = entradaItem.quantidade;
  300 + entrada.valor = entradaItem.valor;
  301 + }
  302 + });
  303 + $scope.editaInfoEntrada = false;
  304 + } else {
  305 + $scope.checkEntradaItem(entradaItem);
  306 + $scope.itensDeEntrada.push(entradaItem);
  307 + }
  308 +
  309 + $scope.entradaItem.material = '';
  310 + $scope.entradaItem.quantidade = '';
  311 + $scope.entradaItem.valor = '';
  312 + $scope.valorUnitario = '';
  313 + $scope.calcularValorTotal();
  314 + $scope.showAtributosEmMassa = false;
  315 + $scope.checkAllItem = false;
  316 +
  317 + var situacaoFisica = null;
  318 + if ($scope.bemPatrimonial.dominioSituacaoFisica) {
  319 + situacaoFisica = {codigo: $scope.bemPatrimonial.dominioSituacaoFisica.codigo};
  320 + }
  321 +
  322 + var statusBem = null;
  323 + if ($scope.bemPatrimonial.dominioStatus) {
  324 + statusBem = {codigo: $scope.bemPatrimonial.dominioStatus.codigo};
  325 + }
  326 +
  327 + var bemReferencia = {
  328 + entradaItem: {
  329 + id: entradaItem.id
  330 + },
  331 + material: {id : $scope.entradaItem.material.id},
  332 + numeroPatrimonial: numeroPatrimonialInicial,
  333 + dominioSituacaoFisica: situacaoFisica,
  334 + dominioStatus: statusBem,
  335 + dataInicialGarantia: $scope.bemPatrimonial.dataInicialGarantia,
  336 + dataFinalGarantia: $scope.bemPatrimonial.dataFinalGarantia,
  337 + vidaUtilOriginal: $scope.bemPatrimonial.vidaUtilOriginal,
  338 + percentualNaoDepreciavel: $scope.bemPatrimonial.percentualNaoDepreciavel
  339 + };
  340 + $scope.$modalInstance.dismiss('cancel');
  341 +
  342 + if (quantidade >= 500){
  343 + $scope.setLoading(true, $translate.instant('PATRIMONIO.MSG.SALVANDO_MATERIAIS_ENTRADA_PATRIMONIO_GRANDE_QTD'));
  344 + }
  345 +
  346 + BemPatrimonialTemporarioRepository.geraBensTemp(bemReferencia).then(function(result) {
  347 +
  348 + formEntradaItem.$submitted = false;
  349 + $scope.setLoading(false);
  350 + });
  351 + });
  352 + } else {
  353 + $scope.setLoading(false);
  354 + $scope.showAlert('warning', $translate.instant('MSG.ORGANIZACAO_EM_FECHAMENTO_MES'));
  355 + }
349 356 });
350 357 }else{
351 358 $scope.setLoading(false);
... ... @@ -671,7 +678,7 @@ citApp.controller(&#39;EntradaController&#39;, [&#39;$scope&#39;, &#39;$timeout&#39;, &#39;FileUploader&#39;, &#39;E
671 678 item.checked ? $scope.qtdeChecked++ : null;
672 679 });
673 680 }
674   - }
  681 + };
675 682  
676 683 // prepara a exclusao da entrada abrindo o modal de confirmacao
677 684 $scope.remove = function(workspace) {
... ... @@ -1154,25 +1161,31 @@ citApp.controller(&#39;EntradaController&#39;, [&#39;$scope&#39;, &#39;$timeout&#39;, &#39;FileUploader&#39;, &#39;E
1154 1161 });
1155 1162  
1156 1163 EntradaRepository.save($scope.entrada).then(function(result) {
  1164 + if (result.originalElement.status != undefined && !result.originalElement.status && result.originalElement.mensagens) {
  1165 + $scope.setLoading(false);
  1166 + angular.forEach(result.originalElement.mensagens, function (mensagem) {
  1167 + $scope.showAlert(mensagem.tipoMensagem, $translate.instant(mensagem.mensagem));
  1168 + });
  1169 + } else {
  1170 + $scope.entrada = result.originalElement;
  1171 +
  1172 + if ($scope.entrada.fornecedor) {
  1173 + $scope.entrada.fornecedor['pessoa.nome'] = $scope.entrada.fornecedor.pessoa.nome;
  1174 + }
1157 1175  
1158   - $scope.entrada = result.originalElement;
1159   -
1160   - if ($scope.entrada.fornecedor) {
1161   - $scope.entrada.fornecedor['pessoa.nome'] = $scope.entrada.fornecedor.pessoa.nome;
1162   - }
1163   -
1164   - $scope.setLoading(false);
  1176 + $scope.setLoading(false);
1165 1177  
1166   - // depois de salvar a baixa ja tendo uma referencia do id da baixa, esse metodo ira salvar os documentos se existir
1167   - salvarListaDocumentos(entradaTemp);
  1178 + // depois de salvar a baixa ja tendo uma referencia do id da baixa, esse metodo ira salvar os documentos se existir
  1179 + salvarListaDocumentos(entradaTemp);
1168 1180  
1169   - EntradaItemRepository.findAllByEntrada($scope.entrada.id).then(function(result) {
1170   - $scope.itensDeEntrada = [];
1171   - for (var i = 0; i < result.length; i++) {
1172   - $scope.itensDeEntrada.push(result[i].originalElement);
1173   - }
1174   - $scope.calcularValorTotal();
1175   - });
  1181 + EntradaItemRepository.findAllByEntrada($scope.entrada.id).then(function(result) {
  1182 + $scope.itensDeEntrada = [];
  1183 + for (var i = 0; i < result.length; i++) {
  1184 + $scope.itensDeEntrada.push(result[i].originalElement);
  1185 + }
  1186 + $scope.calcularValorTotal();
  1187 + });
  1188 + }
1176 1189 });
1177 1190 });
1178 1191  
... ... @@ -1333,46 +1346,53 @@ citApp.controller(&#39;EntradaController&#39;, [&#39;$scope&#39;, &#39;$timeout&#39;, &#39;FileUploader&#39;, &#39;E
1333 1346  
1334 1347 EntradaRepository.save($scope.entrada).then(function(result) {
1335 1348  
1336   - $scope.entrada = result.originalElement;
1337   -
1338   - if ($scope.entrada.fornecedor) {
1339   - $scope.entrada.fornecedor['pessoa.nome'] = $scope.entrada.fornecedor.pessoa.nome;
1340   - }
1341   -
1342   - $scope.setLoading(false);
1343   -
1344   - // depois de salvar a baixa ja tendo uma referencia do id da baixa, esse metodo ira salvar os documentos se existir
1345   - salvarListaDocumentos(entradaTemp);
1346   -
1347   - EntradaItemRepository.findAllByEntrada($scope.entrada.id).then(function(result) {
1348   - $scope.itensDeEntrada = [];
1349   - for (var i = 0; i < result.length; i++) {
1350   - $scope.itensDeEntrada.push(result[i].originalElement);
1351   - }
1352   - $scope.calcularValorTotal();
1353   -
1354   -
1355   - var dataContabilAntiga = angular.copy($scope.entrada.dataContabil);
1356   -
1357   - $scope.setLoadingSalva(true);
1358   -
1359   - if (dataContabilAntiga && !dataContabil) {
1360   - TransferenciaItemRepository.buscarTransferenciaComBensPatrimonaisDaEntrada($scope.entrada.id).then(function(result) {
1361   - if (result.length > 0) {
1362   - var transferencias = "";
1363   - for (var i = 0; i < result.length; i++) {
1364   - transferencias += result[i] + "; ";
1365   - }
1366   - $scope.setLoading(false);
1367   - $scope.showAlert('warning', $translate.instant('PATRIMONIO.VALIDACAO.ENTRADA_DESCONTABILIZACAO_COM_TRANSFERENCIA') + transferencias);
1368   - } else {
1369   - concluir(dataContabil);
1370   - }
1371   - });
1372   - } else {
1373   - concluir(dataContabil);
1374   - }
1375   - });
  1349 + if (result.originalElement.status != undefined && !result.originalElement.status && result.originalElement.mensagens) {
  1350 + $scope.setLoading(false);
  1351 + angular.forEach(result.originalElement.mensagens, function (mensagem) {
  1352 + $scope.showAlert(mensagem.tipoMensagem, $translate.instant(mensagem.mensagem));
  1353 + });
  1354 + } else {
  1355 + $scope.entrada = result.originalElement;
  1356 +
  1357 + if ($scope.entrada.fornecedor) {
  1358 + $scope.entrada.fornecedor['pessoa.nome'] = $scope.entrada.fornecedor.pessoa.nome;
  1359 + }
  1360 +
  1361 + $scope.setLoading(false);
  1362 +
  1363 + // depois de salvar a baixa ja tendo uma referencia do id da baixa, esse metodo ira salvar os documentos se existir
  1364 + salvarListaDocumentos(entradaTemp);
  1365 +
  1366 + EntradaItemRepository.findAllByEntrada($scope.entrada.id).then(function(result) {
  1367 + $scope.itensDeEntrada = [];
  1368 + for (var i = 0; i < result.length; i++) {
  1369 + $scope.itensDeEntrada.push(result[i].originalElement);
  1370 + }
  1371 + $scope.calcularValorTotal();
  1372 +
  1373 +
  1374 + var dataContabilAntiga = angular.copy($scope.entrada.dataContabil);
  1375 +
  1376 + $scope.setLoadingSalva(true);
  1377 +
  1378 + if (dataContabilAntiga && !dataContabil) {
  1379 + TransferenciaItemRepository.buscarTransferenciaComBensPatrimonaisDaEntrada($scope.entrada.id).then(function(result) {
  1380 + if (result.length > 0) {
  1381 + var transferencias = "";
  1382 + for (var i = 0; i < result.length; i++) {
  1383 + transferencias += result[i] + "; ";
  1384 + }
  1385 + $scope.setLoading(false);
  1386 + $scope.showAlert('warning', $translate.instant('PATRIMONIO.VALIDACAO.ENTRADA_DESCONTABILIZACAO_COM_TRANSFERENCIA') + transferencias);
  1387 + } else {
  1388 + concluir(dataContabil);
  1389 + }
  1390 + });
  1391 + } else {
  1392 + concluir(dataContabil);
  1393 + }
  1394 + });
  1395 + }
1376 1396 });
1377 1397  
1378 1398 } else {
... ... @@ -1882,8 +1902,8 @@ citApp.controller(&#39;EntradaController&#39;, [&#39;$scope&#39;, &#39;$timeout&#39;, &#39;FileUploader&#39;, &#39;E
1882 1902  
1883 1903 // Controla se o usuario pode avancar o fluxo no wizard, validando os itens obrigatórios
1884 1904 function permiteAvancoFluxo() {
1885   -
1886   - $scope.permitidoAvancar = true;
  1905 +
  1906 + $scope.permitidoAvancar = true;
1887 1907 $scope.dadosEntradaForm.$submitted = false;
1888 1908 $scope.materiaisEntradaForm.$submitted = false;
1889 1909 $scope.bensPatrimoniaisMaterialForm.$submitted = false;
... ... @@ -1943,7 +1963,7 @@ citApp.controller(&#39;EntradaController&#39;, [&#39;$scope&#39;, &#39;$timeout&#39;, &#39;FileUploader&#39;, &#39;E
1943 1963  
1944 1964 }
1945 1965  
1946   - if (!$scope.permitidoAvancar && !$scope.stepValid) {
  1966 + if (!$scope.permitidoAvancar && !$scope.stepValid && !$scope.organizacao.emFechamento) {
1947 1967  
1948 1968 //Mensagem de erro de campos obrigatorios nao preenchidos
1949 1969 $scope.showAlert('error', $translate.instant('VALIDACAO.ALERTA_OBRIGATORIOS'), " ", false);
... ... @@ -1971,44 +1991,48 @@ citApp.controller(&#39;EntradaController&#39;, [&#39;$scope&#39;, &#39;$timeout&#39;, &#39;FileUploader&#39;, &#39;E
1971 1991 $scope.setCurrentStep = function(step) {
1972 1992  
1973 1993 $scope.setLoadingGet(true);
1974   -
1975   - // Condicional apenas porque as datas perdem o formato na mudanca de passos
1976   - if (step === 0) {
1977   -
1978   - $scope.entrada.dataRecebimento = $filter('date')($scope.entrada.dataRecebimento, "dd/MM/yyyy");
1979   - $scope.entrada.dataContabil = $filter('date')($scope.entrada.dataContabil, "dd/MM/yyyy");
1980   - $scope.entrada.dataReferencia = $filter('date')($scope.entrada.dataReferencia, "dd/MM/yyyy");
1981   - if ($scope.entrada.fornecedor) {
1982   - $scope.entrada.fornecedor['pessoa.nome'] = $scope.entrada.fornecedor.pessoa.nome;
1983   - }
1984   -
1985   - $scope.associarCaracteristicas = false;
1986   - }
1987   -
1988   - if (step <= ($scope.step - 1)) {
1989   -
1990   - $scope.step = step;
1991   -
1992   - } else {
1993   -
1994   - if (!$scope.edit) {
1995   -
1996   - $scope.permitidoAvancar = true;
1997   -
1998   - } else {
1999   -
2000   - permiteAvancoFluxo();
2001   -
2002   - }
2003   -
2004   - if ($scope.permitidoAvancar) {
2005   -
2006   - $scope.step = step;
2007   -
2008   - }
2009   - }
2010   -
2011   - $scope.setLoading(false);
  1994 +
  1995 + OrganizacaoRepository.get($scope.usuarioLogado.organizacao.id).then(function (result) {
  1996 + $scope.organizacao = result.originalElement;
  1997 +
  1998 + // Condicional apenas porque as datas perdem o formato na mudanca de passos
  1999 + if (step === 0) {
  2000 +
  2001 + $scope.entrada.dataRecebimento = $filter('date')($scope.entrada.dataRecebimento, "dd/MM/yyyy");
  2002 + $scope.entrada.dataContabil = $filter('date')($scope.entrada.dataContabil, "dd/MM/yyyy");
  2003 + $scope.entrada.dataReferencia = $filter('date')($scope.entrada.dataReferencia, "dd/MM/yyyy");
  2004 + if ($scope.entrada.fornecedor) {
  2005 + $scope.entrada.fornecedor['pessoa.nome'] = $scope.entrada.fornecedor.pessoa.nome;
  2006 + }
  2007 +
  2008 + $scope.associarCaracteristicas = false;
  2009 + }
  2010 +
  2011 + if (step <= ($scope.step - 1)) {
  2012 +
  2013 + $scope.step = step;
  2014 +
  2015 + } else {
  2016 +
  2017 + if (!$scope.edit) {
  2018 +
  2019 + $scope.permitidoAvancar = true;
  2020 +
  2021 + } else {
  2022 +
  2023 + permiteAvancoFluxo();
  2024 +
  2025 + }
  2026 +
  2027 + if ($scope.permitidoAvancar) {
  2028 +
  2029 + $scope.step = step;
  2030 +
  2031 + }
  2032 + }
  2033 +
  2034 + $scope.setLoading(false);
  2035 + });
2012 2036  
2013 2037 };
2014 2038  
... ... @@ -2049,7 +2073,10 @@ citApp.controller(&#39;EntradaController&#39;, [&#39;$scope&#39;, &#39;$timeout&#39;, &#39;FileUploader&#39;, &#39;E
2049 2073 $scope.handleNext = function () {
2050 2074  
2051 2075  
2052   - $scope.setLoadingGet(true);
  2076 + $scope.setLoadingGet(true);
  2077 +
  2078 + OrganizacaoRepository.get($scope.usuarioLogado.organizacao.id).then(function (result) {
  2079 + $scope.organizacao = result.originalElement;
2053 2080  
2054 2081 if(!$scope.edit){
2055 2082  
... ... @@ -2068,60 +2095,72 @@ citApp.controller(&#39;EntradaController&#39;, [&#39;$scope&#39;, &#39;$timeout&#39;, &#39;FileUploader&#39;, &#39;E
2068 2095 }
2069 2096  
2070 2097 $scope.setLoading(false);
  2098 + });
2071 2099  
2072 2100 };
2073 2101  
2074 2102  
2075 2103 // Funcao especifica que retorna se o formulario de dados da entrada esta valido
2076 2104 function validStepDadosEntrada() {
  2105 + $scope.stepValid = true;
  2106 + if (!$scope.organizacao.emFechamento) {
  2107 +
  2108 + if ($scope.dadosEntradaForm.$invalid) {
2077 2109  
2078   - $scope.stepValid = true;
  2110 + $scope.stepValid = false;
2079 2111  
2080   - if ($scope.dadosEntradaForm.$invalid) {
  2112 + } else if ($scope.entrada.dataContabil) {
2081 2113  
2082   - $scope.stepValid = false;
  2114 + if (!$scope.validarDataTransferencia($scope.entrada.dataContabil)) {
2083 2115  
2084   - } else if ($scope.entrada.dataContabil) {
  2116 + $scope.permitidoAvancar = false;
  2117 + $scope.showAlert('error', $translate.instant('MSG.MN019'));
  2118 + }
2085 2119  
2086   - if (!$scope.validarDataTransferencia($scope.entrada.dataContabil)) {
  2120 + } else if (!validarDataRecebimento($scope.entrada.dataRecebimento)) {
2087 2121  
2088 2122 $scope.permitidoAvancar = false;
2089   - $scope.showAlert('error', $translate.instant('MSG.MN019'));
2090   - }
2091   -
2092   - } else if (!validarDataRecebimento($scope.entrada.dataRecebimento)) {
  2123 + $scope.showAlert('error', $translate.instant('PATRIMONIO.VALIDACAO.DATA_RECEBIMENTO'));
2093 2124  
2094   - $scope.permitidoAvancar = false;
2095   - $scope.showAlert('error', $translate.instant('PATRIMONIO.VALIDACAO.DATA_RECEBIMENTO'));
2096   -
2097   - }
  2125 + }
2098 2126  
2099   - return $scope.stepValid;
  2127 + return $scope.stepValid;
  2128 + } else {
  2129 + $scope.showAlert('warning', $translate.instant('MSG.ORGANIZACAO_EM_FECHAMENTO_MES'));
  2130 +
  2131 + $scope.permitidoAvancar = false;
  2132 + return $scope.stepValid;
  2133 + }
2100 2134  
2101 2135 };
2102 2136  
2103 2137 // Funcao especifica que retorna se o formulario de materiais da entrada esta valido
2104 2138 function validStepMateriaisEntrada() {
  2139 + $scope.stepValid = true;
  2140 + if (!$scope.organizacao.emFechamento) {
2105 2141  
2106   - $scope.stepValid = true;
2107   -
2108   - if($scope.materiaisEntradaForm.$invalid){
  2142 + if($scope.materiaisEntradaForm.$invalid){
2109 2143  
2110   - $scope.stepValid = false;
  2144 + $scope.stepValid = false;
2111 2145  
2112   - } else if ($scope.itensDeEntrada && $scope.itensDeEntrada.length === 0){
  2146 + } else if ($scope.itensDeEntrada && $scope.itensDeEntrada.length === 0){
2113 2147  
2114   - $scope.stepValid = false;
2115   - $scope.permitidoAvancar = false;
2116   -
2117   - } else if($scope.entrada.valorTotalNota < $scope.valorTotalLancado) {
2118   -
2119   - $scope.showAlert('error', $translate.instant('ALMOXARIFADO.VALIDACAO.NOTA_FISCAL_IGUAL_VALOR_INFORMADO'));
2120   - $scope.permitidoAvancar = false;
2121   - }
  2148 + $scope.stepValid = false;
  2149 + $scope.permitidoAvancar = false;
2122 2150  
2123   - return $scope.stepValid;
  2151 + } else if($scope.entrada.valorTotalNota < $scope.valorTotalLancado) {
  2152 +
  2153 + $scope.showAlert('error', $translate.instant('ALMOXARIFADO.VALIDACAO.NOTA_FISCAL_IGUAL_VALOR_INFORMADO'));
  2154 + $scope.permitidoAvancar = false;
  2155 + }
2124 2156  
  2157 + return $scope.stepValid;
  2158 + } else {
  2159 + $scope.showAlert('warning', $translate.instant('MSG.ORGANIZACAO_EM_FECHAMENTO_MES'));
  2160 +
  2161 + $scope.permitidoAvancar = false;
  2162 + return $scope.stepValid;
  2163 + }
2125 2164 };
2126 2165  
2127 2166 // Funcao especifica que retorna se o formulario de bens Patrimoniais esta valido
... ... @@ -2140,15 +2179,21 @@ citApp.controller(&#39;EntradaController&#39;, [&#39;$scope&#39;, &#39;$timeout&#39;, &#39;FileUploader&#39;, &#39;E
2140 2179 // Funcao especifica que retorna se o formulario de documentos da entrada esta valido
2141 2180 function validStepDocumentosEntrada() {
2142 2181  
2143   - $scope.stepValid = true;
  2182 + $scope.stepValid = true;
  2183 + if (!$scope.organizacao.emFechamento) {
2144 2184  
  2185 + if ($scope.documentosEntradaForm.$invalid || !$scope.entrada.documentos.length > 0){
2145 2186  
2146   - if ($scope.documentosEntradaForm.$invalid || !$scope.entrada.documentos.length > 0){
2147   -
2148   - $scope.stepValid = false;
2149   - }
  2187 + $scope.stepValid = false;
  2188 + }
2150 2189  
2151   - return $scope.stepValid;
  2190 + return $scope.stepValid;
  2191 + } else {
  2192 + $scope.showAlert('warning', $translate.instant('MSG.ORGANIZACAO_EM_FECHAMENTO_MES'));
  2193 +
  2194 + $scope.permitidoAvancar = false;
  2195 + return $scope.stepValid;
  2196 + }
2152 2197  
2153 2198 };;
2154 2199  
... ...
citgrp-patrimonio-web/src/main/webapp/html/entrada/entradaList.html
... ... @@ -3,7 +3,7 @@
3 3 <div class="bar-buttons-action fixed">
4 4 <div class="row">
5 5 <div class="col-sm-9 text-left">
6   - <button title="{{$translate.instant('LABEL.ADICIONAR_NOVO')}}" alt="{{$translate.instant('LABEL.ADICIONAR_NOVO')}}" class="btn btn-clear" type="button" ng-click="$showPageEditWorkspace(workspace); resetForm(); cadastrarNovaEntrada();">
  6 + <button title="{{$translate.instant('PORTAL.LABEL.ADICIONAR_NOVO')}}" alt="{{$translate.instant('LABEL.ADICIONAR_NOVO')}}" class="btn btn-clear" type="button" ng-click="$showPageEditWorkspace(workspace); resetForm(); cadastrarNovaEntrada();">
7 7 <i class="fa fa-plus-circle yellow-dark"></i>
8 8 <translate>LABEL.CADASTRAR</translate>
9 9 </button>
... ...