Commit 18389550cff3a7b6f882e0668866adb7dd94f904

Authored by erick.sato
1 parent 49ac5de9
Exists in master

[Redmine Atendimento #4788]Cadastro de material local estoque

cit-adm-materiais-api/src/main/java/br/com/centralit/api/service/impl/InicializarAdmMateriaisServiceImpl.java
... ... @@ -79,6 +79,11 @@ public class InicializarAdmMateriaisServiceImpl extends UtilStartup {
79 79 filesMenuFileMaterial.add(new MenuFile(CIT_ADM_MATERIAIS_WEB_ANGULAR_CUSTOM + "repository/MaterialConsumoTipoUnidadeMedidaEntradaRepository.min.js", dominioJS, menuMaterial));
80 80 filesMenuFileMaterial.add(new MenuFile(CIT_ADM_MATERIAIS_WEB_ANGULAR_CUSTOM + "repository/UnidadeMedidaRepository.js", dominioJS, menuMaterial));
81 81 filesMenuFileMaterial.add(new MenuFile(CIT_ADM_MATERIAIS_WEB_ANGULAR_CUSTOM + "repository/UnidadeMedidaRepository.min.js", dominioJS, menuMaterial));
  82 + filesMenuFileMaterial.add(new MenuFile(CIT_ALMOXARIFADO_WEB_ANGULAR_CUSTOM + "repository/MaterialLocalEstoqueRepository.js", dominioJS, menuMaterial));
  83 + filesMenuFileMaterial.add(new MenuFile(CIT_ALMOXARIFADO_WEB_ANGULAR_CUSTOM + "repository/MaterialLocalEstoqueRepository.min.js", dominioJS, menuMaterial));
  84 + filesMenuFileMaterial.add(new MenuFile(CIT_ALMOXARIFADO_WEB_ANGULAR_CUSTOM + "repository/MaterialEnderecoEstoqueRepository.js", dominioJS, menuMaterial));
  85 + filesMenuFileMaterial.add(new MenuFile(CIT_ALMOXARIFADO_WEB_ANGULAR_CUSTOM + "repository/MaterialEnderecoEstoqueRepository.min.js", dominioJS, menuMaterial));
  86 +
82 87 menuMaterial.setIncludes(filesMenuFileMaterial);
83 88 this.menuService.mergeIfNotExist(menuMaterial);
84 89 // Menu Classificação de materiais
... ...
cit-adm-materiais-api/src/main/resources/scripts-bd/postgres/v1.15.0/01-cit-adm-materiais-v1.15.0-postgres.sql
... ... @@ -1467,4 +1467,20 @@ VALUES (NEXTVAL('hibernate_sequence'), LOCALTIMESTAMP, LOCALTIMESTAMP, 0, true,
1467 1467 INSERT INTO menufile (id, datacriacao, dataedicao, version, ativo, caminho, dominiomenufile_id, menu_id)
1468 1468 VALUES (NEXTVAL('hibernate_sequence'), LOCALTIMESTAMP, LOCALTIMESTAMP, 0, true, '/cit-almoxarifado-web/assets/js/angular/custom/repository/MaterialEnderecoEstoqueRepository.min.js',
1469 1469 (SELECT id FROM dominio WHERE chave = 'tipoFile' AND codigo = 2), (SELECT id FROM menu WHERE chave = 'USUARIO'));
  1470 +
  1471 +INSERT INTO menufile (id, datacriacao, dataedicao, version, ativo, caminho, dominiomenufile_id, menu_id)
  1472 +VALUES (NEXTVAL('hibernate_sequence'), LOCALTIMESTAMP, LOCALTIMESTAMP, 0, true, '/cit-almoxarifado-web/assets/js/angular/custom/repository/MaterialLocalEstoqueRepository.js',
  1473 + (SELECT id FROM dominio WHERE chave = 'tipoFile' AND codigo = 2), (SELECT id FROM menu WHERE chave = 'USUARIO'));
  1474 +
  1475 +INSERT INTO menufile (id, datacriacao, dataedicao, version, ativo, caminho, dominiomenufile_id, menu_id)
  1476 +VALUES (NEXTVAL('hibernate_sequence'), LOCALTIMESTAMP, LOCALTIMESTAMP, 0, true, '/cit-almoxarifado-web/assets/js/angular/custom/repository/MaterialLocalEstoqueRepository.min.js',
  1477 + (SELECT id FROM dominio WHERE chave = 'tipoFile' AND codigo = 2), (SELECT id FROM menu WHERE chave = 'USUARIO'));
  1478 +
  1479 +
  1480 +ALTER TABLE alm_me_localestoque ALTER COLUMN unidadeMedidaEntrada_id DROP NOT NULL;
  1481 +ALTER TABLE alm_me_localestoque ADD COLUMN localPrincipal BOOLEAN;
  1482 +
  1483 +
  1484 +ALTER TABLE alm_me_localestoque DROP CONSTRAINT uk_jsrcjmbvm7pnw3ql1hoiyhamj;
  1485 +ALTER TABLE alm_me_localestoque DROP CONSTRAINT uk_qnx0r3sv9yxte5bholpq15k4p;
1470 1486 -- ERICK FIM 04/05/2016
1471 1487 \ No newline at end of file
... ...
cit-adm-materiais-web/src/main/java/br/com/centralit/listener/StartupListenerAdmMaterial.java
... ... @@ -239,6 +239,11 @@ public class StartupListenerAdmMaterial extends UtilStartup implements Applicati
239 239 internacionalizacaoList.add(new Internacionalizacao("ADMINISTRACAODEMATERIAIS.MSG.FECHAMENTO_ENTRADAS_INCOMPLETAS", "Existem entradas de bens incompletas neste mês de referência! Por favor concluir as mesmas antes de realizar o fechamento do mês!", dominio, modulo));
240 240 internacionalizacaoList.add(new Internacionalizacao("ADMINISTRACAODEMATERIAIS.MSG.INFO_MSG_FECHAMENTO_MES_NOTIFICA_FIM", "Fechamento do mês de referência em execução. Quando o processo terminar, você será notificado!", dominio, modulo));
241 241 internacionalizacaoList.add(new Internacionalizacao("ADMINISTRACAODEMATERIAIS.MSG.CONFIRMA_ALTERAR_PADRAO", "Já foi definido uma Unidae de medida de entrada como padrão! Deseja Alterar?", dominio, modulo));
  242 +
  243 + internacionalizacaoList.add(new Internacionalizacao("ADMINISTRACAODEMATERIAIS.MSG.REMOVER_LOCAL_ESTOQUE_MATERIAL_PRINCIPAL", "O endereço selecionado para remoção está definido como principal de um almoxarifado. Para remover este endereço de estoque, informe outro endereço de estoque como principal para o almoxarifado.", dominio, modulo));
  244 + internacionalizacaoList.add(new Internacionalizacao("ADMINISTRACAODEMATERIAIS.MSG.EDITA_LOCAL_ESTOQUE_MATERIAL_PRINCIPAL", "Para definir esse endereço de estoque como não sendo principal, primeiramente informe outro endereço de estoque como principal para o almoxarifado.", dominio, modulo));
  245 + internacionalizacaoList.add(new Internacionalizacao("ADMINISTRACAODEMATERIAIS.MSG.LOCAL_SALVA_ESTOQUE_MATERIAL_COMO_PRINCIPAL_PARA_ALMOXARIFADO", "Este endereço de estoque é o principal do almoxarifado ", dominio, modulo));
  246 + internacionalizacaoList.add(new Internacionalizacao("ADMINISTRACAODEMATERIAIS.MSG.LOCAL_ESTOQUE_JA_VINCULADO_MATERIAL", "Este endereço de estoque já possui vínculo ao material.", dominio, modulo));
242 247 }
243 248  
244 249 }
245 250 \ No newline at end of file
... ...
cit-adm-materiais-web/src/main/webapp/assets/js/angular/custom/controller/MaterialController.js
... ... @@ -58,6 +58,7 @@ citApp.controller('MaterialController', ['$scope', 'MaterialRepository', 'Classi
58 58  
59 59 configurarDadosClassificacaoMaterial();
60 60 verificaMaterialConsumoSetGenerico();
  61 + $scope.verificaAlmoxarifadoAtivo();
61 62 $scope.setLoading(false);
62 63 });
63 64 };
... ... @@ -689,13 +690,131 @@ citApp.controller('MaterialController', ['$scope', 'MaterialRepository', 'Classi
689 690 }
690 691 };
691 692  
692   - $scope.almoxarifadoAtivo = $scope.isModuloAtivo("/cit-almoxarifado-web");
693   - if($scope.almoxarifadoAtivo){
694   - $scope.MaterialEnderecoEstoqueRepository = $injector.get(["MaterialEnderecoEstoqueRepository"]);
  693 + $scope.verificaAlmoxarifadoAtivo = function(){
  694 + $scope.almoxarifadoAtivo = $scope.isModuloAtivo("/cit-almoxarifado-web");
  695 + if($scope.almoxarifadoAtivo){
  696 + $scope.MaterialLocalEstoqueRepository = $injector.get(["MaterialLocalEstoqueRepository"]);
  697 + $scope.EstruturaOrganizacionalAlmoxarifadoRepository = $injector.get(["EstruturaOrganizacionalAlmoxarifadoRepository"]);
  698 + $scope.EnderecoEstoqueRepository = $injector.get(["EnderecoEstoqueRepository"]);
  699 +
  700 + $scope.EstruturaOrganizacionalAlmoxarifadoRepository.getAlmoxarifadoPadrao($scope.usuarioLogado.organizacao.id).then(function(result){
  701 + $scope.almoxarifadoTemp = result.originalElement.estruturaOrganizacional;
  702 + });
  703 + if($scope.material && $scope.material.id){
  704 + $scope.listaLocaisEstoqueMaterial();
  705 + }
  706 + $scope.editEnderecoEstoque = false;
  707 + }
695 708 }
696 709  
  710 +
697 711 $scope.adicionarEnderecoEstoque = function(){
698   - $scope.$openModal('modal-material-endereco-estoque.html', 'md');
  712 + $scope.$openModal('modal-material-endereco-estoque.html', 'lg');
699 713 };
700   -
  714 +
  715 + $scope.editarEnderecoEstoque = function(){
  716 + if(!$scope.matEndEstoqueCheck){
  717 + $scope.showAlert("warning", $translate.instant('LABEL.SELECIONE_UM_ITEM'));
  718 + }else{
  719 + $scope.editEnderecoEstoque = true;
  720 + $scope.materialLocalEstoque = $scope.matEndEstoqueCheck;
  721 + $scope.$openModal('modal-material-endereco-estoque.html', 'lg');
  722 + }
  723 + };
  724 +
  725 + $scope.removerEnderecoEstoque = function(){
  726 + if(!$scope.matEndEstoqueCheck){
  727 + $scope.showAlert("warning", $translate.instant('LABEL.SELECIONE_UM_ITEM'));
  728 + }else{
  729 + $scope.$openModalConfirm({message: $translate.instant('LABEL.CONFIRMA_EXCLUSAO'), callback: function() {
  730 + $scope.setLoading(true);
  731 + $scope.MaterialLocalEstoqueRepository.buscarLocaisEstoquePorIdMaterialIdAlmoxarifado($scope.material.id, $scope.matEndEstoqueCheck.endereco.estoque.almoxarifado.id).then(function(result) {
  732 + if(result && result.length > 1){
  733 + if($scope.matEndEstoqueCheck.localPrincipal){
  734 + $scope.showAlert("warning", $translate.instant('ADMINISTRACAODEMATERIAIS.MSG.REMOVER_LOCAL_ESTOQUE_MATERIAL_PRINCIPAL'));
  735 + $scope.setLoading(false);
  736 + $scope.$modalConfirmInstance.dismiss('cancel');
  737 + return;
  738 + }
  739 + }
  740 + $scope.MaterialLocalEstoqueRepository.remove($scope.matEndEstoqueCheck).then(function(result) {
  741 + $scope.listaLocaisEstoqueMaterial();
  742 + $scope.setLoading(false);
  743 + });
  744 + $scope.$modalConfirmInstance.dismiss('cancel');
  745 + });
  746 + }
  747 + });
  748 + }
  749 + };
  750 +
  751 + $scope.checkMatEndEstoque = function(materialLocalEstoque){
  752 + $scope.matEndEstoqueCheck = materialLocalEstoque.originalElement;
  753 + };
  754 +
  755 + $scope.findAutoCompleteAlmoxarifado = function(value){
  756 + return $scope.EstruturaOrganizacionalAlmoxarifadoRepository.listarEstruturasOrganizacionaisAlmoxarifadoPorOrganizacao(value, $scope.usuarioLogado.organizacao.id).then(function(result) {
  757 + return result;
  758 + });
  759 + };
  760 +
  761 + $scope.findAutoCompleteEndereco = function(value, almoxarifado){
  762 + var idAlmoxarifado = 0;
  763 + if(almoxarifado){
  764 + idAlmoxarifado = almoxarifado.id;
  765 + }
  766 + return $scope.EnderecoEstoqueRepository.listarEnderecosEstoque(value, idAlmoxarifado).then(function(result) {
  767 + return result;
  768 + });
  769 + };
  770 +
  771 + $scope.salvarMaterialEnderecoEstoque = function(materialLocalEstoque){
  772 + $scope.setLoading(true);
  773 + if(!materialLocalEstoque.materialEstoque){
  774 + materialLocalEstoque.materialEstoque = {material : $scope.material};
  775 + }
  776 + materialLocalEstoque.endereco.estoque = {almoxarifado : $scope.almoxarifadoTemp};
  777 + $scope.MaterialLocalEstoqueRepository.save(materialLocalEstoque).then(function(result) {
  778 + if( result.originalElement.localPrincipal){
  779 + $scope.showAlert("warning", $translate.instant('ADMINISTRACAODEMATERIAIS.MSG.LOCAL_SALVA_ESTOQUE_MATERIAL_COMO_PRINCIPAL_PARA_ALMOXARIFADO') + $scope.almoxarifadoTemp.codigoENome);
  780 + }
  781 + $scope.$modalInstance.dismiss('cancel');
  782 + $scope.listaLocaisEstoqueMaterial();
  783 + $scope.editEnderecoEstoque = false;
  784 + $scope.setLoading(false);
  785 + });
  786 + };
  787 +
  788 + $scope.listaLocaisEstoqueMaterial = function(){
  789 + $scope.setLoading(true);
  790 + $scope.listaMaterialEnderecoEstoque = [];
  791 + $scope.MaterialLocalEstoqueRepository.listarMaterialEstoquePorMaterial($scope.material.id).then(function(result) {
  792 + $scope.listaMaterialEnderecoEstoque = result;
  793 + $scope.matEndEstoqueCheck = null;
  794 + $scope.setLoading(false);
  795 + });
  796 + };
  797 +
  798 + $scope.bloquearEnderecoEstoque = function(){
  799 + if(!$scope.matEndEstoqueCheck){
  800 + $scope.showAlert("warning", $translate.instant('LABEL.SELECIONE_UM_ITEM'));
  801 + }else{
  802 + $scope.matEndEstoqueCheck.dataBloqueio = new Date();
  803 + $scope.MaterialLocalEstoqueRepository.save($scope.matEndEstoqueCheck).then(function(result) {
  804 + $scope.listaLocaisEstoqueMaterial();
  805 + });
  806 + }
  807 + };
  808 +
  809 + $scope.desbloquearEnderecoEstoque = function(){
  810 + if(!$scope.matEndEstoqueCheck){
  811 + $scope.showAlert("warning", $translate.instant('LABEL.SELECIONE_UM_ITEM'));
  812 + }else{
  813 + $scope.matEndEstoqueCheck.dataBloqueio = null;
  814 + $scope.MaterialLocalEstoqueRepository.save($scope.matEndEstoqueCheck).then(function(result) {
  815 + $scope.listaLocaisEstoqueMaterial();
  816 + });
  817 + }
  818 + };
  819 +
701 820 }]);
702 821 \ No newline at end of file
... ...
cit-adm-materiais-web/src/main/webapp/html/material/materialEnderecoEstoque.html
... ... @@ -26,14 +26,22 @@
26 26 <translate>LABEL.EDITAR</translate>
27 27 </button>
28 28  
29   - <button title="{{$translate.instant('LABEL.REMOVER')}}" alt="{{$translate.instant('LABEL.REMOVER')}}" class="btn btn-clear" ng-click="exibirDialogRemocaoUnidadeMedida()" ng-disabled="material.tiposUnidadeMedidaEntrada.length < 1 || !edit" type="button">
  29 + <button title="{{$translate.instant('LABEL.REMOVER')}}" alt="{{$translate.instant('LABEL.REMOVER')}}" class="btn btn-clear" ng-click="removerEnderecoEstoque()" type="button">
30 30 <i class="fa fa-close red"></i>
31 31 <translate>LABEL.REMOVER</translate> </a>
32 32 </button>
33 33  
34   - <bloquear-desbloquear ng-model="enderecoEstoque" ng-repository="MaterialEnderecoEstoqueRepository" ng-edit="true"></bloquear-desbloquear>
  34 + <button title="{{$translate.instant('PORTAL.LABEL.BLOQUEAR')}}" alt="{{$translate.instant('PORTAL.LABEL.BLOQUEAR')}}" class="btn btn-clear" ng-show="!matEndEstoqueCheck.dataBloqueio" ng-click="bloquearEnderecoEstoque()" type="button">
  35 + <i class="fa fa-lock"></i>
  36 + <translate>PORTAL.LABEL.BLOQUEAR</translate> </a>
  37 + </button>
  38 +
  39 + <button type="button" title="{{$translate.instant('LABEL.DESBLOQUEAR')}}" alt="{{$translate.instant('LABEL.DESBLOQUEAR')}}" class="btn btn-clear" ng-show="matEndEstoqueCheck.dataBloqueio" ng-click="desbloquearEnderecoEstoque();">
  40 + <i class="fa fa-unlock grey"></i> <translate>LABEL.DESBLOQUEAR</translate>
  41 + </button>
35 42  
36 43 </div>
  44 +
37 45 <table class="table table-bordered table-striped">
38 46 <thead>
39 47 <tr>
... ... @@ -77,14 +85,11 @@
77 85 {{matEndEstoque.quantidade}}
78 86 </td>
79 87 <td>
80   - {{matEndEstoque.localPrincipal}}
  88 + {{matEndEstoque.localPrincipal | booleanSimNao}}
81 89 </td>
82 90 <td>
83 91 {{matEndEstoque.dataBloqueio | date : 'dd/MM/yyyy'}}
84 92 </td>
85   - <td>
86   - <input type="checkbox" ng-model="medidaEntrada.isPadrao" ng-disabled="true"/>
87   - </td>
88 93 </tr>
89 94 </tbody>
90 95 </table>
... ... @@ -99,38 +104,36 @@
99 104  
100 105 <script type="text/ng-template" id="modal-material-endereco-estoque.html">
101 106 <form name="formDialogMaterialEnderecoEstoque" novalidate >
102   - <div class="modal-content modal-dialog modal-md">
103   - <div class="modal-header">
104   - <button title="{{$translate.instant('LABEL.SALVAR')}}" alt="{{$translate.instant('LABEL.SALVAR')}}" ng-click="salvarMaterialEnderecoEstoque()" class="btn btn-clear" type="button">
105   - <i class="fa fa-save green"></i>
106   - <translate>LABEL.SALVAR</translate>
107   - </button>
  107 + <div class="modal-header">
  108 + <button title="{{$translate.instant('LABEL.SALVAR')}}" alt="{{$translate.instant('LABEL.SALVAR')}}" ng-click="salvarMaterialEnderecoEstoque(materialLocalEstoque)" class="btn btn-clear" type="button">
  109 + <i class="fa fa-save green"></i>
  110 + <translate>LABEL.SALVAR</translate>
  111 + </button>
108 112  
109   - <button title="{{$translate.instant('LABEL.CANCELAR')}}" alt="{{$translate.instant('LABEL.CANCELAR')}}" ng-click="$dismiss('cancel');" class="btn btn-clear" type="button">
110   - <i class="fa fa-times red"></i>
111   - <translate>LABEL.CANCELAR</translate>
112   - </button>
113   - </div>
  113 + <button title="{{$translate.instant('LABEL.CANCELAR')}}" alt="{{$translate.instant('LABEL.CANCELAR')}}" ng-click="$dismiss('cancel');" class="btn btn-clear" type="button">
  114 + <i class="fa fa-times red"></i>
  115 + <translate>LABEL.CANCELAR</translate>
  116 + </button>
  117 + </div>
114 118  
115   - <div class="modal-body">
116   - <div class="row">
117   - <div class="col-md-12">
118   - <auto-complete ng-id="materialLocalEstoque.materialEstoque.estoque.almoxarifado" ng-label="ALMOXARIFADO.LABEL.ALMOXARIFADO" ng-model="materialLocalEstoque.materialEstoque.estoque.almoxarifado" form="formDialogMaterialEnderecoEstoque" ng-obrigatorio="false" ng-find="findAutoCompleteAlmoxarifado(value)" ng-item="item.nome" />
119   - </div>
120   - </div>
121   - <div class="row">
122   - <div class="col-md-7">
123   - <auto-complete ng-id="materialLocalEstoque.materialEstoque.endereco" ng-label="ALMOXARIFADO.LABEL.ENDERECO_ESTOQUE" ng-model="materialLocalEstoque.materialEstoque.endereco" form="formDialogMaterialEnderecoEstoque" ng-obrigatorio="true" ng-find="findAutoCompleteEndereco(value)" ng-item="item.nome" />
124   - </div>
125   - <div class="col-md-5">
126   - <label-input-number ng-max-number="99999" ng-min-number="0" ng-type="text" ng-id="materialLocalEstoque.quantidade" ng-obrigatorio="true" form="formDialogMaterialEnderecoEstoque" ng-label="LABEL.CAPACIDADE" ng-model="materialLocalEstoque.quantidade" ng-custom-maxlength="5" />
127   - </div>
128   - </div>
129   - <div class="row">
130   - <div class="col-md-12">
131   - <label-input-checkbox ng-model="materialLocalEstoque.localPrincipal" ng-label="LABEL.PRINCIPAL" form="formDialogMaterialEnderecoEstoque"/>
132   - </div>
133   - </div>
  119 + <div class="modal-body">
  120 + <div class="row">
  121 + <div class="col-md-12">
  122 + <auto-complete ng-id="almoxarifadoTemp" ng-label="ALMOXARIFADO.LABEL.ALMOXARIFADO" ng-model="almoxarifadoTemp" form="formDialogMaterialEnderecoEstoque" ng-obrigatorio="false" ng-find="findAutoCompleteAlmoxarifado(value)" ng-item="item.nome" />
  123 + </div>
  124 + </div>
  125 + <div class="row">
  126 + <div class="col-md-7">
  127 + <auto-complete ng-id="materialLocalEstoque.endereco" ng-label="ALMOXARIFADO.LABEL.ENDERECO_ESTOQUE" ng-model="materialLocalEstoque.endereco" form="formDialogMaterialEnderecoEstoque" ng-obrigatorio="true" ng-find="findAutoCompleteEndereco(value, almoxarifadoTemp)" ng-item="item.descricao" />
  128 + </div>
  129 + <div class="col-md-5">
  130 + <label-input-number ng-max-number="99999" ng-min-number="0" ng-type="text" ng-id="materialLocalEstoque.quantidade" ng-obrigatorio="true" form="formDialogMaterialEnderecoEstoque" ng-label="LABEL.CAPACIDADE" ng-model="materialLocalEstoque.quantidade" ng-custom-maxlength="5" />
  131 + </div>
  132 + </div>
  133 + <div class="row">
  134 + <div class="col-md-12">
  135 + <label-input-checkbox ng-model="materialLocalEstoque.localPrincipal" ng-label="LABEL.PRINCIPAL" form="formDialogMaterialEnderecoEstoque"/>
  136 + </div>
134 137 </div>
135 138 </form>
136 139 </script>
... ...