Commit a06a649b45898b353875b0efd66589b03bed3484

Authored by erick.sato
1 parent 3450ac3f
Exists in master

[Redmine Atendimento #4935]List atendimentos

cit-almoxarifado-api/src/main/java/br/com/centralit/api/service/AtendimentoRequisicaoConsumoService.java
... ... @@ -65,4 +65,8 @@ public interface AtendimentoRequisicaoConsumoService extends GenericService<Aten
65 65  
66 66 boolean removerAtendimentoRequisicao(String idsRequisicaoConsumo, Long idOrganizacao);
67 67  
  68 + Boolean finalizarRequisicoes(List<Long> idsRequisicao, Long idOrganizacao);
  69 +
  70 + Boolean excluirAtendimentos(List<Long> idsRequisicao, Long idOrganizacao);
  71 +
68 72 }
... ...
cit-almoxarifado-api/src/main/java/br/com/centralit/api/service/impl/AtendimentoRequisicaoConsumoServiceImpl.java
... ... @@ -6,6 +6,7 @@ import java.util.HashMap;
6 6 import java.util.List;
7 7 import java.util.Map;
8 8  
  9 +import org.apache.commons.lang3.StringUtils;
9 10 import org.springframework.beans.factory.annotation.Autowired;
10 11 import org.springframework.beans.factory.annotation.Qualifier;
11 12 import org.springframework.stereotype.Service;
... ... @@ -19,6 +20,7 @@ import br.com.centralit.api.service.AtendimentoRequisicaoConsumoItemService;
19 20 import br.com.centralit.api.service.AtendimentoRequisicaoConsumoService;
20 21 import br.com.centralit.api.service.ContaContabilMovimentoService;
21 22 import br.com.centralit.api.service.DominioService;
  23 +import br.com.centralit.api.service.InternacionalizacaoService;
22 24 import br.com.centralit.api.service.MaterialConsumoService;
23 25 import br.com.centralit.api.service.MovimentoEstoqueService;
24 26 import br.com.centralit.api.service.ConfiguracaoParametroSistemaService;
... ... @@ -27,6 +29,7 @@ import br.com.centralit.api.service.RequisicaoConsumoService;
27 29 import br.com.centralit.api.viewHelper.InformacoesAtendimentoVH;
28 30 import br.com.centralit.framework.exception.BusinessException;
29 31 import br.com.centralit.framework.exception.CodigoErro;
  32 +import br.com.centralit.framework.model.Dominio;
30 33 import br.com.centralit.framework.service.arquitetura.GenericServiceImpl;
31 34 import br.com.centralit.framework.util.UtilColecao;
32 35 import br.com.centralit.framework.util.UtilDate;
... ... @@ -98,7 +101,19 @@ public class AtendimentoRequisicaoConsumoServiceImpl extends GenericServiceImpl&lt;
98 101  
99 102 @Autowired
100 103 private ContaContabilMovimentoService contaContabilMovimentoService;
  104 +
  105 + @Autowired
  106 + private InternacionalizacaoService internacionalizacaoService;
101 107  
  108 + private Dominio idioma;
  109 +
  110 + private Dominio getIdioma() {
  111 + if(!UtilObjeto.isReferencia(idioma)){
  112 + idioma = this.dominioService.findByChaveAndCodigo("tipoIdioma", Dominio.TIPO_IDIOMA_PT_BR_CODIGO);
  113 + }
  114 + return idioma;
  115 + }
  116 +
102 117 /**
103 118 * Responsável pela criação de novas instâncias desta classe.
104 119 *
... ... @@ -462,4 +477,40 @@ public class AtendimentoRequisicaoConsumoServiceImpl extends GenericServiceImpl&lt;
462 477 return true;
463 478 }
464 479  
  480 + @Override
  481 + public Boolean finalizarRequisicoes(List<Long> idsRequisicao, Long idOrganizacao) {
  482 + for (Long idRequisicao : idsRequisicao) {
  483 + List<AtendimentoRequisicaoConsumo> listaAtendimentoPorRequisicaoConsumo = this.listaAtendimentoPorRequisicaoConsumo(idRequisicao, idOrganizacao);
  484 + for (AtendimentoRequisicaoConsumo atendimentoRequisicaoConsumo : listaAtendimentoPorRequisicaoConsumo) {
  485 + atendimentoRequisicaoConsumo.getRequisicaoConsumo().setTipoStatusRequisicao(this.dominioService.findByChaveAndCodigo(DominioAlmoxarifado.TIPO_STATUS_REQUISICAO, DominioAlmoxarifado.TIPO_STATUS_FINALIZADA));
  486 + super.merge(atendimentoRequisicaoConsumo);
  487 + }
  488 + }
  489 + return true;
  490 + }
  491 +
  492 + @Override
  493 + public Boolean excluirAtendimentos(List<Long> idsRequisicao, Long idOrganizacao) {
  494 + for (Long idRequisicao : idsRequisicao) {
  495 + List<AtendimentoRequisicaoConsumo> listaAtendimentoPorRequisicaoConsumo = this.listaAtendimentoPorRequisicaoConsumo(idRequisicao, idOrganizacao);
  496 + StringBuilder mensagem = new StringBuilder();
  497 + for (AtendimentoRequisicaoConsumo atendimentoRequisicaoConsumo : listaAtendimentoPorRequisicaoConsumo) {
  498 + if (!UtilDate.isDentroMes(atendimentoRequisicaoConsumo.getRequisicaoConsumo().getDataFinalizacaoAtendimento(), atendimentoRequisicaoConsumo.getRequisicaoConsumo().getOrganizacao().getDataReferenciaVigente())) {
  499 + String validacao = this.internacionalizacaoService.getTranslate("ALMOXARIFADO.VALIDACAO.DATA_FINALIZACAO_FORA_REFERENCIA", this.getIdioma());
  500 + validacao = String.format(validacao, atendimentoRequisicaoConsumo.getRequisicaoConsumo().getNumeroRequisicao());
  501 + validacao += "</br></br>";
  502 + mensagem.append(validacao);
  503 + }
  504 + }
  505 + if(StringUtils.isNotBlank(mensagem.toString())){
  506 + throw new BusinessException(mensagem.toString(), CodigoErro.REGRA_NEGOCIO.getValue());
  507 + }else{
  508 + for (AtendimentoRequisicaoConsumo atendimentoRequisicaoConsumo : listaAtendimentoPorRequisicaoConsumo) {
  509 + this.remove(atendimentoRequisicaoConsumo);
  510 + }
  511 + }
  512 + }
  513 + return true;
  514 + }
  515 +
465 516 }
... ...
cit-almoxarifado-web/src/main/java/br/com/centralit/controller/AtendimentoRequisicaoConsumoController.java
... ... @@ -10,10 +10,14 @@ import org.springframework.web.bind.annotation.RequestMethod;
10 10 import org.springframework.web.bind.annotation.RequestParam;
11 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 +
13 16 import br.com.centralit.api.framework.json.ViewsAlmoxarifado;
14 17 import br.com.centralit.api.model.AtendimentoRequisicaoConsumo;
15 18 import br.com.centralit.api.model.RequisicaoConsumo;
16 19 import br.com.centralit.api.service.AtendimentoRequisicaoConsumoService;
  20 +import br.com.centralit.api.viewHelper.AtendimentoVH;
17 21 import br.com.centralit.api.viewHelper.InformacoesAtendimentoVH;
18 22 import br.com.centralit.framework.controller.GenericController;
19 23 import br.com.centralit.framework.dao.arquitetura.SearchSeven;
... ... @@ -23,9 +27,6 @@ import br.com.centralit.framework.model.SearchParams;
23 27 import br.com.centralit.framework.view.GridVH;
24 28 import br.com.centralit.framework.view.ResultResponseVH;
25 29  
26   -import com.googlecode.genericdao.search.Search;
27   -import com.googlecode.genericdao.search.SearchResult;
28   -
29 30 /**
30 31 * <p><img src="http://centralit.com.br/images/logo_central.png"></p>
31 32 *
... ... @@ -195,5 +196,21 @@ public class AtendimentoRequisicaoConsumoController extends GenericController&lt;At
195 196  
196 197 return new ResponseBodyWrapper(this.atendimentoRequisicaoConsumoService.removerAtendimentoRequisicao(idsRequisicaoConsumo, idOrganizacao), this.getEditView());
197 198 }
  199 +
  200 + @RequestMapping(value = "/finalizarRequisicoes", method = RequestMethod.POST, produces = "application/json")
  201 + @ResponseBody
  202 + public Boolean finalizarRequisicoes(@RequestBody AtendimentoVH atendimentoVH) {
  203 +
  204 + return this.atendimentoRequisicaoConsumoService.finalizarRequisicoes(atendimentoVH.getIdsRequisicao(), atendimentoVH.getIdOrganizacao());
  205 +
  206 + }
  207 +
  208 + @RequestMapping(value = "/excluirAtendimentos", method = RequestMethod.POST, produces = "application/json")
  209 + @ResponseBody
  210 + public Boolean excluirAtendimentos(@RequestBody AtendimentoVH atendimentoVH) {
  211 +
  212 + return this.atendimentoRequisicaoConsumoService.excluirAtendimentos(atendimentoVH.getIdsRequisicao(), atendimentoVH.getIdOrganizacao());
  213 +
  214 + }
198 215  
199 216 }
... ...
cit-almoxarifado-web/src/main/java/br/com/centralit/listener/StartupListenerAlmoxarifado.java
... ... @@ -325,6 +325,7 @@ public class StartupListenerAlmoxarifado extends UtilStartup implements Applicat
325 325 internacionalizacaoList.add(new Internacionalizacao("ALMOXARIFADO.LABEL.BAIXA_S", "Baixa(s)", dominio, modulo));
326 326  
327 327 internacionalizacaoList.add(new Internacionalizacao("ALMOXARIFADO.LABEL.FINALIZAR_REQUISICAO", "Finalizar requisição", dominio, modulo));
  328 + internacionalizacaoList.add(new Internacionalizacao("ALMOXARIFADO.LABEL.EXCLUIR_ATENDIMENTO", "Excluir atendimento", dominio, modulo));
328 329 }
329 330  
330 331 private void gerarValidacao(Dominio dominio, Modulo modulo, List<Internacionalizacao> internacionalizacaoList) {
... ... @@ -400,6 +401,14 @@ public class StartupListenerAlmoxarifado extends UtilStartup implements Applicat
400 401 internacionalizacaoList.add(new Internacionalizacao("ALMOXARIFADO.MSG.ENTRADA_ENDERECOS_ESTOQUE_DESVINCULADOS_MATERIAL", "Todos os materiais desta entrada tiveram seu endereço de estoque retirados!", dominio, modulo));
401 402 internacionalizacaoList.add(new Internacionalizacao("ALMOXARIFADO.MSG.ENTRADA_ENDERECOS_ESTOQUE_PADRAO_VINCULADOS_MATERIAL", "Todos os materiais desta entrada que tinham endereços padrões neste almoxarifado foram vinculados a ele!", dominio, modulo));
402 403 internacionalizacaoList.add(new Internacionalizacao("ALMOXARIFADO.MSG.EXCLUSAO_ULTIMO_ITEM_ENTRADA", "É necessário existir ao menos um item nesta lista, para continuar exclua a entrada inteira ou adicione outro item primeiro!", dominio, modulo));
  404 +
  405 + internacionalizacaoList.add(new Internacionalizacao("ALMOXARIFADO.MSG.FINALIZAR_ATENDIMENTO_SOMENTE_ATENDIMENTO_PARCIAL", "A finalização de atendimento somente é permitido para requisições com a situação igual a 'Atendida parcialmente'.", dominio, modulo));
  406 + internacionalizacaoList.add(new Internacionalizacao("ALMOXARIFADO.MSG.EXCLUIR_ATENDIMENTO_SOMENTE_ATENDIMENTO_PARCIAL_FINALIZADA", "A exclusão de atendimento somente é permitido para requisições com a situação igual a 'Atendida parcialmente' ou 'Finalizada'.", dominio, modulo));
  407 + internacionalizacaoList.add(new Internacionalizacao("ALMOXARIFADO.MSG.CONFIRMA_FINALIZAR_REQUISICAO", "Confirma finalização das requisições selecionados?", dominio, modulo));
  408 + internacionalizacaoList.add(new Internacionalizacao("ALMOXARIFADO.MSG.CONFIRMA_EXCLUSAO_ATENDIMENTO_REQUISICAO", "Confirma exclusão dos atendimentos selecionados?", dominio, modulo));
  409 + 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));
  410 + 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));
  411 +
403 412 }
404 413 }
405 414  
... ...
cit-almoxarifado-web/src/main/webapp/assets/js/angular/custom/controller/AtendimentoRequisicaoConsumoListController.js
... ... @@ -19,8 +19,8 @@ citApp.controller(&#39;AtendimentoRequisicaoConsumoListController&#39;, [&#39;$scope&#39;, &#39;Aten
19 19 // DIFINE FILTROS DE PESQUISA E CAMPOS QUE DEVEM SER APRESENTADOS NA LISTAGEM
20 20 $scope.filterCriteria = {
21 21 start : 1,
22   - dir : 'desc',
23   - sort : 'numeroRequisicao; tipoStatusRequisicao.codigo',
  22 + dir : 'asc',
  23 + sort : 'desc:numeroRequisicao;tipoStatusRequisicao.codigo',
24 24 limit : 10,
25 25 fields: ['id', 'numeroRequisicao', 'tipoStatusRequisicao.descricao', 'dataRequisicao', 'unidadeRequisitante.nome', 'almoxarifado.nome', 'tipoStatusRequisicao.codigo'],
26 26 filters : [ {type : 'numeric-range', field : 'numeroRequisicao' } ,
... ... @@ -29,8 +29,8 @@ citApp.controller(&#39;AtendimentoRequisicaoConsumoListController&#39;, [&#39;$scope&#39;, &#39;Aten
29 29 {type : 'string', field : 'unidadeRequisitante.nome' } ,
30 30 {type : 'string', field : 'almoxarifado.nome' } ]
31 31 };
32   -
33   - $scope.filterCriteria.filters.push({type: 'string', field: 'tipoStatusRequisicao.nome', value: 'FINALIZADA', comparison: 'ne', notFilter : true});
  32 +
  33 + $scope.filterCriteria.filters.push({type: 'string', field: 'tipoStatusRequisicao.nome', value: 'DEVOLVIDA', comparison: 'ne', notFilter : true});
34 34 $scope.filterCriteria.filters.push({type: 'string', field: 'tipoStatusRequisicao.nome', value: 'NAO_CONCLUIDA', comparison: 'ne', notFilter : true});
35 35 };
36 36  
... ... @@ -39,7 +39,7 @@ citApp.controller(&#39;AtendimentoRequisicaoConsumoListController&#39;, [&#39;$scope&#39;, &#39;Aten
39 39 DominioRepository.findAllDominio('tipoStatusRequisicao').then(function(result) {
40 40 var listaDominio = [];
41 41 angular.forEach(result, function(dominio){
42   - if(dominio.nome != 'NAO_CONCLUIDA'){
  42 + if(dominio.nome != 'NAO_CONCLUIDA' && dominio.nome != 'DEVOLVIDA'){
43 43 listaDominio.push(dominio)
44 44 }
45 45  
... ... @@ -83,7 +83,96 @@ citApp.controller(&#39;AtendimentoRequisicaoConsumoListController&#39;, [&#39;$scope&#39;, &#39;Aten
83 83 };
84 84  
85 85 $scope.iniciarAtendimento = function(){
86   - angular.element('#editAtendimentoRequisicaoConsumo').scope().prepararAtendimentoRequisicoes($scope.listaSelecionados);
  86 +
  87 + if($scope.listaSelecionados && $scope.listaSelecionados.length == 0) {
  88 + $scope.showAlert('warning', $translate.instant('MSG.SELECIONE_AO_MENOS_UM_ITEM'));
  89 + return;
  90 + }
  91 +
  92 + var permiteAtender = true;
  93 + angular.forEach($scope.listaSelecionados, function (requisicaoSelecionado) {
  94 + if(requisicaoSelecionado['tipoStatusRequisicao.codigo'] == 5){
  95 + permiteAtender = false;
  96 + $scope.showAlert('warning', $translate.instant('ALMOXARIFADO.MSG.NAO_PERMITIDO_ATENDER_REQUISICAO_FINALIZADA'));
  97 + }
  98 + });
  99 +
  100 + if(permiteAtender){
  101 + angular.element('#editAtendimentoRequisicaoConsumo').scope().prepararAtendimentoRequisicoes($scope.listaSelecionados);
  102 + }
87 103 };
88   -
  104 +
  105 + function getIdsRequisicao(){
  106 + $scope.idsSelecionados = [];
  107 + angular.forEach($scope.listaSelecionados, function (requisicaoSelecionado) {
  108 + $scope.idsSelecionados.push(requisicaoSelecionado.id);
  109 + });
  110 + }
  111 +
  112 + $scope.finalizarRequisicao = function(){
  113 +
  114 + if($scope.listaSelecionados && $scope.listaSelecionados.length == 0) {
  115 + $scope.showAlert('warning', $translate.instant('MSG.SELECIONE_AO_MENOS_UM_ITEM'));
  116 + return;
  117 + }
  118 +
  119 + var permiteFinalizar = true;
  120 + angular.forEach($scope.listaSelecionados, function (requisicaoSelecionado) {
  121 + if(requisicaoSelecionado['tipoStatusRequisicao.codigo'] != 1){
  122 + permiteFinalizar = false;
  123 + $scope.showAlert('warning', $translate.instant('ALMOXARIFADO.MSG.FINALIZAR_ATENDIMENTO_SOMENTE_ATENDIMENTO_PARCIAL'));
  124 + }
  125 + });
  126 +
  127 + if(permiteFinalizar){
  128 + $scope.$openModalConfirm({
  129 + message: $translate.instant('ALMOXARIFADO.MSG.CONFIRMA_FINALIZAR_REQUISICAO'),
  130 + callback: function () {
  131 +
  132 + getIdsRequisicao();
  133 + var atendimentoVH = {idsRequisicao : $scope.idsSelecionados, idOrganizacao : $scope.usuarioLogado.organizacao.id};
  134 + AtendimentoRequisicaoConsumoRepository.finalizarRequisicoes(atendimentoVH).then(function(result) {
  135 + $scope.$modalConfirmInstance.dismiss('cancel');
  136 + $scope.showAlert('success', $translate.instant('MSG.MG001'), " ", false);
  137 + $scope.recarregar();
  138 + });
  139 + }
  140 + });
  141 + }
  142 +
  143 + };
  144 +
  145 + $scope.excluirAtendimento = function(){
  146 +
  147 + if($scope.listaSelecionados && $scope.listaSelecionados.length == 0) {
  148 + $scope.showAlert('warning', $translate.instant('MSG.SELECIONE_AO_MENOS_UM_ITEM'));
  149 + return;
  150 + }
  151 +
  152 + var permiteExcluir = true;
  153 + angular.forEach($scope.listaSelecionados, function (requisicaoSelecionado) {
  154 + if(requisicaoSelecionado['tipoStatusRequisicao.codigo'] != 1 || requisicaoSelecionado['tipoStatusRequisicao.codigo'] != 5){
  155 + permiteExcluir = false;
  156 + $scope.showAlert('warning', $translate.instant('ALMOXARIFADO.MSG.EXCLUIR_ATENDIMENTO_SOMENTE_ATENDIMENTO_PARCIAL_FINALIZADA'));
  157 + }
  158 + });
  159 +
  160 + if(permiteExcluir){
  161 + $scope.$openModalConfirm({
  162 + message: $translate.instant('ALMOXARIFADO.MSG.CONFIRMA_EXCLUSAO_ATENDIMENTO_REQUISICAO'),
  163 + callback: function () {
  164 +
  165 + getIdsRequisicao();
  166 + var atendimentoVH = {idsRequisicao : $scope.idsSelecionados, idOrganizacao : $scope.usuarioLogado.organizacao.id};
  167 + AtendimentoRequisicaoConsumoRepository.excluirAtendimentos(atendimentoVH).then(function(result) {
  168 + $scope.$modalConfirmInstance.dismiss('cancel');
  169 + $scope.showAlert('success', $translate.instant('MSG.MG001'), " ", false);
  170 + $scope.recarregar();
  171 + });
  172 + }
  173 + });
  174 + }
  175 +
  176 + };
  177 +
89 178 }]);
90 179 \ No newline at end of file
... ...
cit-almoxarifado-web/src/main/webapp/assets/js/angular/custom/repository/AtendimentoRequisicaoConsumoRepository.js
... ... @@ -21,7 +21,15 @@ citApp.factory(&#39;AtendimentoRequisicaoConsumoRepository&#39;, [&#39;RestangularAlmoxarifa
21 21 this.removerAtendimentoRequisicao = function (idsRequisicaoConsumo, idOrganizacao) {
22 22 return this.restangular.one(this.route +'/removerAtendimentoRequisicao').get({idsRequisicaoConsumo : idsRequisicaoConsumo, idOrganizacao : idOrganizacao}).then();
23 23 };
24   -
  24 +
  25 + this.finalizarRequisicoes = function(atendimentoVH){
  26 + return restangularAlmoxarifado.all(this.route + '/finalizarRequisicoes').post(atendimentoVH).then();
  27 + };
  28 +
  29 + this.excluirAtendimentos = function(atendimentoVH){
  30 + return restangularAlmoxarifado.all(this.route + '/excluirAtendimentos').post(atendimentoVH).then();
  31 + };
  32 +
25 33 }
26 34  
27 35 AbstractRepository.extend(AtendimentoRequisicaoConsumoRepository);
... ...
cit-almoxarifado-web/src/main/webapp/html/atendimentoRequisicaoConsumo/atendimentoRequisicaoConsumoList.html
... ... @@ -5,29 +5,24 @@
5 5  
6 6 <button class="btn btn-clear" ng-click="iniciarAtendimento();">
7 7 <i class="fa fa-plus-circle yellow-dark"></i>
8   - <translate>ALMOXARIFADO.LABEL.INICIAR_ATENDIMENTO</translate>
  8 + <translate>ALMOXARIFADO.LABEL.ATENDER</translate>
9 9 </button>
10 10  
11   - <button class="btn btn-clear" ng-click="finalizarRequisicao();" ng-disabled="permiteFinalizarRequisicao">
12   - <i class="fa fa-file-text-o red"></i>
  11 + <button class="btn btn-clear" ng-click="finalizarRequisicao();">
  12 + <i class="fa fa-file-text-o green"></i>
13 13 <translate>ALMOXARIFADO.LABEL.FINALIZAR_REQUISICAO</translate>
14 14 </button>
15 15  
  16 + <button class="btn btn-clear" ng-click="excluirAtendimento()">
  17 + <i class="fa fa-times red"></i>
  18 + <translate>ALMOXARIFADO.LABEL.EXCLUIR_ATENDIMENTO</translate>
  19 + </button>
  20 +
16 21 <button ng-show="listaSelecionados.length == 1" class="btn btn-clear" ng-click="abrirVisualizar(false);">
17 22 <i class="fa fa-search blue"></i>
18 23 <translate>LABEL.VISUALIZAR</translate>
19 24 </button>
20 25  
21   - <button ng-show="listaSelecionados.length == 1" class="btn btn-clear" ng-click="abrirVisualizar(true);">
22   - <i class="fa fa-pencil blue"></i>
23   - <translate>LABEL.EDITAR</translate>
24   - </button>
25   -
26   -<!-- <button class="btn btn-clear" ng-click="removerAtendimentoRequisicao();"> -->
27   -<!-- <i class="fa fa-times red"></i> -->
28   -<!-- <translate>LABEL.REMOVER</translate> -->
29   -<!-- </button> -->
30   -
31 26 <span class="divider-vertical"></span>
32 27  
33 28 <filtros ng-filter="filterCriteria" ng-workspace="workspace"></filtros>
... ...