Commit 8c718c99af209f385820ad38841306f1df875c7e
1 parent
80fa4421
Exists in
master
Redmine #3822
Showing
9 changed files
with
130 additions
and
30 deletions
Show diff stats
cit-almoxarifado-api/src/main/java/br/com/centralit/api/model/AtendimentoRequisicaoConsumoItem.java
... | ... | @@ -52,7 +52,7 @@ import com.fasterxml.jackson.annotation.JsonView; |
52 | 52 | */ |
53 | 53 | @Entity |
54 | 54 | @Table(name="alm_rc_atendimentoitem") |
55 | -@JsonIgnoreProperties({"$info", "$verInfo", "$quantidade", "$locaisEstoque"}) | |
55 | +@JsonIgnoreProperties({"$info", "$verInfo", "$quantidade", "$locaisEstoque", "$hasError"}) | |
56 | 56 | public class AtendimentoRequisicaoConsumoItem extends PersistentObjectAuditOrganizacao { |
57 | 57 | |
58 | 58 | /** Atributo serialVersionUID. */ | ... | ... |
cit-almoxarifado-api/src/main/java/br/com/centralit/api/model/MaterialLocalEstoque.java
... | ... | @@ -255,4 +255,28 @@ public class MaterialLocalEstoque extends PersistentObjectAuditOrganizacao { |
255 | 255 | this.capacidade = capacidade; |
256 | 256 | } |
257 | 257 | |
258 | + @Override | |
259 | + public int hashCode() { | |
260 | + final int prime = 31; | |
261 | + int result = super.hashCode(); | |
262 | + result = prime * result + ((id == null) ? 0 : id.hashCode()); | |
263 | + return result; | |
264 | + } | |
265 | + | |
266 | + @Override | |
267 | + public boolean equals(Object obj) { | |
268 | + if (this == obj) | |
269 | + return true; | |
270 | + if (!super.equals(obj)) | |
271 | + return false; | |
272 | + if (getClass() != obj.getClass()) | |
273 | + return false; | |
274 | + MaterialLocalEstoque other = (MaterialLocalEstoque) obj; | |
275 | + if (id == null) { | |
276 | + if (other.id != null) | |
277 | + return false; | |
278 | + } else if (!id.equals(other.id)) | |
279 | + return false; | |
280 | + return true; | |
281 | + } | |
258 | 282 | } | ... | ... |
cit-almoxarifado-api/src/main/java/br/com/centralit/api/service/AtendimentoRequisicaoConsumoService.java
... | ... | @@ -3,6 +3,7 @@ package br.com.centralit.api.service; |
3 | 3 | import java.util.List; |
4 | 4 | |
5 | 5 | import br.com.centralit.api.model.AtendimentoRequisicaoConsumo; |
6 | +import br.com.centralit.api.model.MaterialLocalEstoque; | |
6 | 7 | import br.com.centralit.api.viewHelper.InformacoesAtendimentoVH; |
7 | 8 | import br.com.centralit.framework.service.arquitetura.GenericService; |
8 | 9 | |
... | ... | @@ -69,4 +70,6 @@ public interface AtendimentoRequisicaoConsumoService extends GenericService<Aten |
69 | 70 | |
70 | 71 | Boolean excluirAtendimentos(List<Long> idsRequisicao, Long idOrganizacao); |
71 | 72 | |
73 | + List<MaterialLocalEstoque> validarQuantidadesAtendidas(AtendimentoRequisicaoConsumo entity); | |
74 | + | |
72 | 75 | } | ... | ... |
cit-almoxarifado-api/src/main/java/br/com/centralit/api/service/impl/AtendimentoRequisicaoConsumoServiceImpl.java
... | ... | @@ -5,6 +5,7 @@ import java.util.ArrayList; |
5 | 5 | import java.util.HashMap; |
6 | 6 | import java.util.List; |
7 | 7 | import java.util.Map; |
8 | +import java.util.Map.Entry; | |
8 | 9 | |
9 | 10 | import org.apache.commons.lang3.StringUtils; |
10 | 11 | import org.springframework.beans.factory.annotation.Autowired; |
... | ... | @@ -16,6 +17,7 @@ import br.com.centralit.api.dao.AtendimentoRequisicaoConsumoDao; |
16 | 17 | import br.com.centralit.api.model.AtendimentoRequisicaoConsumo; |
17 | 18 | import br.com.centralit.api.model.AtendimentoRequisicaoConsumoItem; |
18 | 19 | import br.com.centralit.api.model.DominioAlmoxarifado; |
20 | +import br.com.centralit.api.model.MaterialLocalEstoque; | |
19 | 21 | import br.com.centralit.api.service.AtendimentoRequisicaoConsumoItemService; |
20 | 22 | import br.com.centralit.api.service.AtendimentoRequisicaoConsumoService; |
21 | 23 | import br.com.centralit.api.service.ConfiguracaoParametroSistemaService; |
... | ... | @@ -134,12 +136,12 @@ public class AtendimentoRequisicaoConsumoServiceImpl extends GenericServiceImpl< |
134 | 136 | @Override |
135 | 137 | public AtendimentoRequisicaoConsumo save(AtendimentoRequisicaoConsumo entity) { |
136 | 138 | |
137 | -// this.validarEntidade(entity, this.validator); | |
138 | - | |
139 | + this.validarEntidade(entity, this.validator); | |
140 | + | |
139 | 141 | if (!UtilColecao.isVazio(entity.getAtendimentos())) { |
140 | 142 | |
141 | 143 | for (AtendimentoRequisicaoConsumo atendimento : entity.getAtendimentos()) { |
142 | - | |
144 | + | |
143 | 145 | if(atendimento.getId() == null && atendimento.getDataAtendimento() == null){ |
144 | 146 | atendimento.setDataAtendimento(entity.getDataAtendimento()); |
145 | 147 | } |
... | ... | @@ -165,6 +167,37 @@ public class AtendimentoRequisicaoConsumoServiceImpl extends GenericServiceImpl< |
165 | 167 | return new AtendimentoRequisicaoConsumo(); |
166 | 168 | } |
167 | 169 | |
170 | + @Override | |
171 | + public List<MaterialLocalEstoque> validarQuantidadesAtendidas(AtendimentoRequisicaoConsumo entity) { | |
172 | + Map<MaterialLocalEstoque, BigDecimal> somatorioQuantidadesAtentidasPorMaterial = new HashMap<MaterialLocalEstoque, BigDecimal>(); | |
173 | + | |
174 | + for(AtendimentoRequisicaoConsumo atendimento : entity.getAtendimentos()){ | |
175 | + for(AtendimentoRequisicaoConsumoItem atendimentoItem : atendimento.getAtendimentoRequisicaoConsumoItems()){ | |
176 | + | |
177 | + if(somatorioQuantidadesAtentidasPorMaterial.containsKey(atendimentoItem.getMaterialLocalEstoque())){ | |
178 | + | |
179 | + somatorioQuantidadesAtentidasPorMaterial.put(atendimentoItem.getMaterialLocalEstoque(), | |
180 | + somatorioQuantidadesAtentidasPorMaterial.get(atendimentoItem.getMaterialLocalEstoque()).add(atendimentoItem.getQuantidade())); | |
181 | + | |
182 | + }else{ | |
183 | + somatorioQuantidadesAtentidasPorMaterial.put(atendimentoItem.getMaterialLocalEstoque(), atendimentoItem.getQuantidade()); | |
184 | + } | |
185 | + } | |
186 | + } | |
187 | + | |
188 | + List<MaterialLocalEstoque> materiaisRejeitados = new ArrayList<MaterialLocalEstoque>(); | |
189 | + | |
190 | + for(Entry<MaterialLocalEstoque, BigDecimal> somaItem : somatorioQuantidadesAtentidasPorMaterial.entrySet()){ | |
191 | + | |
192 | + if(somaItem.getValue().compareTo(somaItem.getKey().getQuantidade()) > 0){ | |
193 | + materiaisRejeitados.add(somaItem.getKey()); | |
194 | + } | |
195 | + } | |
196 | + | |
197 | + return materiaisRejeitados; | |
198 | + | |
199 | + } | |
200 | + | |
168 | 201 | /** |
169 | 202 | * |
170 | 203 | * Método responsável por | ... | ... |
cit-almoxarifado-web/src/main/java/br/com/centralit/controller/AtendimentoRequisicaoConsumoController.java
... | ... | @@ -212,5 +212,13 @@ public class AtendimentoRequisicaoConsumoController extends GenericController<At |
212 | 212 | return this.atendimentoRequisicaoConsumoService.excluirAtendimentos(atendimentoVH.getIdsRequisicao(), atendimentoVH.getIdOrganizacao()); |
213 | 213 | |
214 | 214 | } |
215 | + | |
216 | + @RequestMapping(value = "/validaQuantidadesAtendidas", method = RequestMethod.POST) | |
217 | + @ResponseBody | |
218 | + public ResponseBodyWrapper validaQuantidadesAtendidas(@RequestBody AtendimentoRequisicaoConsumo entity){ | |
219 | + | |
220 | + return new ResponseBodyWrapper(this.atendimentoRequisicaoConsumoService.validarQuantidadesAtendidas(entity), this.getEditView()); | |
221 | + | |
222 | + } | |
215 | 223 | |
216 | 224 | } | ... | ... |
cit-almoxarifado-web/src/main/java/br/com/centralit/listener/StartupListenerAlmoxarifado.java
... | ... | @@ -408,6 +408,8 @@ public class StartupListenerAlmoxarifado extends UtilStartup implements Applicat |
408 | 408 | internacionalizacaoList.add(new Internacionalizacao("ALMOXARIFADO.MSG.NAO_PERMITIDO_ATENDER_REQUISICAO_FINALIZADA", "Atendimento não permitido pois há requisições finalizadas selecionadas para atendimento. Desmarque as requisições finalizadas e clique novamente em 'Atender'.", dominio, modulo)); |
409 | 409 | internacionalizacaoList.add(new Internacionalizacao("ALMOXARIFADO.VALIDACAO.DATA_FINALIZACAO_FORA_REFERENCIA", "Exclusão não permitida. Data de finalização da requisição %s fora da referência vigente.", dominio, modulo)); |
410 | 410 | |
411 | + internacionalizacaoList.add(new Internacionalizacao("ALMOXARIFADO.MSG.REMOVER_REQUISICAO_ATENDIMENTO", "Remover requisição deste atendimento", dominio, modulo)); | |
412 | + | |
411 | 413 | } |
412 | 414 | } |
413 | 415 | ... | ... |
cit-almoxarifado-web/src/main/webapp/assets/js/angular/custom/controller/AtendimentoRequisicaoConsumoController.js
... | ... | @@ -85,6 +85,22 @@ citApp.controller( 'AtendimentoRequisicaoConsumoController', |
85 | 85 | } |
86 | 86 | }); |
87 | 87 | }; |
88 | + | |
89 | + $scope.removerRequisicaoDoAtendimento = function(index){ | |
90 | + $scope.$openModalConfirm({ | |
91 | + message: $translate.instant('MSG.CONFIRMA_EXCLUSAO'), | |
92 | + callback: function(){ | |
93 | + $scope.atendimentos.splice(index, 1); | |
94 | + | |
95 | + $scope.$modalConfirmInstance.dismiss('cancel'); | |
96 | + | |
97 | + if($scope.atendimentos.length == 0){ | |
98 | + $scope.$showPageSearchWorkspace($scope.workspace); | |
99 | + $scope.atualizaPaginaPesquisa(); | |
100 | + } | |
101 | + } | |
102 | + }); | |
103 | + }; | |
88 | 104 | |
89 | 105 | |
90 | 106 | // Limpa o formulario preenchido |
... | ... | @@ -372,15 +388,30 @@ citApp.controller( 'AtendimentoRequisicaoConsumoController', |
372 | 388 | $scope.finalizarRequisicoes($scope.atendimentoRequisicaoConsumo); |
373 | 389 | } else { |
374 | 390 | $scope.setLoadingSalva(true); |
375 | - AtendimentoRequisicaoConsumoRepository.save($scope.atendimentoRequisicaoConsumo).then(function(result) { | |
376 | - $scope.resetForm(); | |
377 | - $scope.listaSelecionados = []; | |
378 | - $scope.showAlert("success", $translate.instant('MSG.REGISTRO_SALVO')); | |
379 | - $scope.atendimentoRequisicaoConsumoForm.$submitted = false; | |
380 | - $scope.$modalInstance.dismiss('cancel'); | |
381 | - angular.element('#searchAtendimentoRequisicaoConsumo').scope().fetchResult(); | |
382 | - $scope.resetForm(); | |
383 | - $scope.setLoading(false); | |
391 | + AtendimentoRequisicaoConsumoRepository.validaQuantidadesAtendidas($scope.atendimentoRequisicaoConsumo).then(function(result){ | |
392 | + if(result.length > 0){ | |
393 | + result.forEach(function(localEstoque){ | |
394 | + $scope.atendimentos.forEach(function(atendimento){ | |
395 | + atendimento.atendimentoRequisicaoConsumoItems.forEach(function(atendimentoItem){ | |
396 | + if(atendimentoItem.materialLocalEstoque.id === localEstoque.id){ | |
397 | + atendimentoItem.$hasError = true; | |
398 | + } | |
399 | + }); | |
400 | + }); | |
401 | + }); | |
402 | + $scope.setLoading(false); | |
403 | + }else{ | |
404 | + AtendimentoRequisicaoConsumoRepository.save($scope.atendimentoRequisicaoConsumo).then(function(result) { | |
405 | + $scope.resetForm(); | |
406 | + $scope.listaSelecionados = []; | |
407 | + $scope.showAlert("success", $translate.instant('MSG.REGISTRO_SALVO')); | |
408 | + $scope.atendimentoRequisicaoConsumoForm.$submitted = false; | |
409 | + $scope.$modalInstance.dismiss('cancel'); | |
410 | + angular.element('#searchAtendimentoRequisicaoConsumo').scope().fetchResult(); | |
411 | + $scope.resetForm(); | |
412 | + $scope.setLoading(false); | |
413 | + }); | |
414 | + } | |
384 | 415 | }); |
385 | 416 | } |
386 | 417 | } else { | ... | ... |
cit-almoxarifado-web/src/main/webapp/assets/js/angular/custom/repository/AtendimentoRequisicaoConsumoRepository.js
... | ... | @@ -30,6 +30,10 @@ citApp.factory('AtendimentoRequisicaoConsumoRepository', ['RestangularAlmoxarifa |
30 | 30 | return restangularAlmoxarifado.all(this.route + '/excluirAtendimentos').post(atendimentoVH).then(); |
31 | 31 | }; |
32 | 32 | |
33 | + this.validaQuantidadesAtendidas = function(atendimentoRequisicaoConsumo){ | |
34 | + return restangularAlmoxarifado.all(this.route + "/validaQuantidadesAtendidas").post(atendimentoRequisicaoConsumo).then(); | |
35 | + }; | |
36 | + | |
33 | 37 | } |
34 | 38 | |
35 | 39 | AbstractRepository.extend(AtendimentoRequisicaoConsumoRepository); | ... | ... |
cit-almoxarifado-web/src/main/webapp/html/atendimentoRequisicaoConsumo/atendimentoRequisicaoConsumoEdit.html
... | ... | @@ -9,21 +9,13 @@ |
9 | 9 | </button> |
10 | 10 | <ul class="dropdown-menu-center dropdown-menu dropdown-caret" role="menu"> |
11 | 11 | <li> |
12 | - <a href="#void" ng-click="saveEdit(false)" ><i class="fa fa-file-text-o red"></i> <translate>ALMOXARIFADO.LABEL.SALVAR_APENAS</translate></a> | |
12 | + <a href="#void" ng-click="saveOrUpdate(false, atendimentoRequisicaoConsumoForm)" ><i class="fa fa-file-text-o red"></i> <translate>ALMOXARIFADO.LABEL.SALVAR_APENAS</translate></a> | |
13 | 13 | </li> |
14 | 14 | <li> |
15 | - <a href="#void" ng-click="saveEdit(true)" ><i class="fa fa-file-text green"></i> <translate>ALMOXARIFADO.LABEL.SALVAR_E_FINALIZAR_REQUISICOES</translate></a> | |
15 | + <a href="#void" ng-click="saveOrUpdate(false, atendimentoRequisicaoConsumoForm)" ><i class="fa fa-file-text green"></i> <translate>ALMOXARIFADO.LABEL.SALVAR_E_FINALIZAR_REQUISICOES</translate></a> | |
16 | 16 | </li> |
17 | 17 | </ul> |
18 | 18 | </div> |
19 | - <button class="btn btn-clear" ng-show="!edit" ng-click="edit = true"> | |
20 | - <i class="fa fa-pencil blue"></i> | |
21 | - <translate>LABEL.EDITAR</translate> | |
22 | - </button> | |
23 | -<!-- <button class="btn btn-clear" ng-click="removerAtendimentoRequisicao();" ng-show="edit"> --> | |
24 | -<!-- <i class="fa fa-times red"></i> --> | |
25 | -<!-- <translate>LABEL.REMOVER</translate> --> | |
26 | -<!-- </button> --> | |
27 | 19 | <button class="btn btn-clear" ng-click="$showPageSearchWorkspace(workspace); atualizaPaginaPesquisa();"> |
28 | 20 | <i class="fa fa-search"></i> |
29 | 21 | <translate>LABEL.PESQUISAR</translate> |
... | ... | @@ -45,9 +37,9 @@ |
45 | 37 | |
46 | 38 | <fieldset id="tableAtendimentos" ng-show="atendimentos.length > 0"> |
47 | 39 | <legend id="top"> |
48 | - <label ng-class="{'has-error' : formDialogAtendimento.$submitted && atendimentos && atendimentos.length < 1}"> | |
40 | + <label ng-class="{'has-error' : atendimentoRequisicaoConsumoForm.$submitted && atendimentos && atendimentos.length < 1}"> | |
49 | 41 | <translate>ALMOXARIFADO.LABEL.DADOS_ATENDIMENTO_REQUISICAO_CONSUMO</translate> |
50 | - <span class='red'>*</span> <i ng-show="formDialogAtendimento.$submitted && atendimentos && atendimentos.length < 1" | |
42 | + <span class='red'>*</span> <i ng-show="atendimentoRequisicaoConsumoForm.$submitted && atendimentos && atendimentos.length < 1" | |
51 | 43 | class='fa fa-warning red' |
52 | 44 | tooltip="{{$translate.instant('DADOS_ATENDIMENTO_REQUISICAO_CONSUMO') + ' ' +$translate.instant('LABEL.CAMPO_OBRIGATORIO')}}" |
53 | 45 | tooltip-placement='top'></i> |
... | ... | @@ -61,11 +53,11 @@ |
61 | 53 | <div class="row"> |
62 | 54 | <div class="col-md-6"> |
63 | 55 | <label-input-data ng-id="atendimentoRequisicaoConsumo.dataAtendimento" ng-label="ALMOXARIFADO.LABEL.DATA_ATENDIMENTO" |
64 | - ng-model="atendimentoRequisicaoConsumo.dataAtendimento" form="formDialogAtendimento" ng-obrigatorio="true" | |
56 | + ng-model="atendimentoRequisicaoConsumo.dataAtendimento" form="atendimentoRequisicaoConsumoForm" ng-obrigatorio="true" | |
65 | 57 | ng-disabled="!edit" ng-mode="day" ng-format="dd/MM/yyyy" /> |
66 | 58 | </div> |
67 | 59 | </div> |
68 | - <div style="margin-top: 20px" ng-repeat="atendimento in atendimentos"> | |
60 | + <div style="margin-top: 20px;" ng-repeat="atendimento in atendimentos"> | |
69 | 61 | <div class="widget-box margin-bottom"> |
70 | 62 | <div class="widget-header"> |
71 | 63 | <h2 class="widget-title" style="font-size: 16px !important"> |
... | ... | @@ -75,6 +67,9 @@ |
75 | 67 | <a href="#void" ng-click="widgetAtendimentoCollapsed = !widgetAtendimentoCollapsed"> |
76 | 68 | <i class="fa" ng-class="{'fa-chevron-up': widgetAtendimentoCollapsed, 'fa-chevron-down': !widgetAtendimentoCollapsed}"></i> |
77 | 69 | </a> |
70 | + <a href="#void" style="margin-left: 3px" ng-click="removerRequisicaoDoAtendimento($index) "> | |
71 | + <i class="fa fa-trash-o bigger-130 red" tooltip="{{$translate.instant('ALMOXARIFADO.MSG.REMOVER_REQUISICAO_ATENDIMENTO')}}"></i> | |
72 | + </a> | |
78 | 73 | </div> |
79 | 74 | </div> |
80 | 75 | <div collapse="!widgetAtendimentoCollapsed" class="widget-body"> |
... | ... | @@ -122,7 +117,7 @@ |
122 | 117 | </tr> |
123 | 118 | </thead> |
124 | 119 | <tbody> |
125 | - <tr ng-repeat-start="atendimentoRequisicaoConsumoItem in atendimento.atendimentoRequisicaoConsumoItems"> | |
120 | + <tr ng-repeat-start="atendimentoRequisicaoConsumoItem in atendimento.atendimentoRequisicaoConsumoItems" ng-class="atendimentoRequisicaoConsumoItem.$hasError ? 'danger' : ''"> | |
126 | 121 | <td class="text-center" ng-show="edit"> |
127 | 122 | <button type="button" ng-click="atendimentoRequisicaoConsumoItem.$verInfo = !atendimentoRequisicaoConsumoItem.$verInfo"> |
128 | 123 | <i class="ace-icon fa {{atendimentoRequisicaoConsumoItem.$verInfo ? 'fa-minus' : 'fa-plus'}} bigger-125"></i> |
... | ... | @@ -141,14 +136,14 @@ |
141 | 136 | <td class="text-center"> |
142 | 137 | <label-select ng-id="atendimentoRequisicaoConsumoItem.materialLocalEstoque$index" ng-obrigatorio="true" |
143 | 138 | ng-model="atendimentoRequisicaoConsumoItem.materialLocalEstoque.id" ng-list="atendimentoRequisicaoConsumoItem.$locaisEstoque" |
144 | - form="formDialogAtendimento" | |
139 | + form="atendimentoRequisicaoConsumoForm" | |
145 | 140 | ng-custom-options="materialLocalEstoque.id as materialLocalEstoque.endereco.descricao for materialLocalEstoque"></label-select> |
146 | 141 | |
147 | 142 | </td> |
148 | 143 | |
149 | 144 | <td ng-if="atendimentoRequisicaoConsumoItem.requisicaoConsumoItem.quantidade != atendimentoRequisicaoConsumoItem.requisicaoConsumoItem.quantidadeAtendida" class="text-center"> |
150 | 145 | <label-input-decimal ng-id="atendimentoRequisicaoConsumoItem.quantidade$index" ng-obrigatorio="true" ng-evento-blur="aplicarValidacaoDecimal" |
151 | - ng-model="atendimentoRequisicaoConsumoItem.quantidade" form="formDialogAtendimento" ng-disabled="!edit" ng-custom-maxlength="{{atendimentoRequisicaoConsumoItem.material.unidadeArmazenamento.tipoNumerico.codigo === 1 ? 4 : 11}}" | |
146 | + ng-model="atendimentoRequisicaoConsumoItem.quantidade" form="atendimentoRequisicaoConsumoForm" ng-disabled="!edit" ng-custom-maxlength="{{atendimentoRequisicaoConsumoItem.material.unidadeArmazenamento.tipoNumerico.codigo === 1 ? 4 : 11}}" | |
152 | 147 | ng-precisao="{{atendimentoRequisicaoConsumoItem.material.unidadeArmazenamento.tipoNumerico.codigo === 1 ? 0 : 'decimal'}}" /> |
153 | 148 | </td> |
154 | 149 | <td class="text-center" ng-show="atendimentoRequisicaoConsumoItem.requisicaoConsumoItem.quantidade == atendimentoRequisicaoConsumoItem.requisicaoConsumoItem.quantidadeAtendida"> | ... | ... |