Commit 8c718c99af209f385820ad38841306f1df875c7e

Authored by Ronan Tavares Camargo
1 parent 80fa4421
Exists in master

Redmine #3822

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&lt;
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&lt;
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&lt;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( &#39;AtendimentoRequisicaoConsumoController&#39;,
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( &#39;AtendimentoRequisicaoConsumoController&#39;,
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(&#39;AtendimentoRequisicaoConsumoRepository&#39;, [&#39;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">
... ...