Commit f776fcedbfb8e8b2ae3898f13247109c750241bd
Exists in
master
and in
2 other branches
Merge branch 'master' into 'master'
Master(efernandez) See merge request !4
Showing
3 changed files
Show diff stats
src/js/controller.js
... | ... | @@ -4,62 +4,174 @@ angular.module('focaModalDetalleHojaRuta') |
4 | 4 | '$filter', |
5 | 5 | '$scope', |
6 | 6 | '$uibModalInstance', |
7 | - 'remito', | |
7 | + 'idRemito', | |
8 | 8 | 'focaModalDetalleHojaRutaService', |
9 | - function($filter, $scope, $uibModalInstance, remito, focaModalDetalleHojaRutaService) { | |
10 | - $scope.remito = remito; | |
9 | + 'focaModalService', | |
10 | + 'focaSeguimientoService', | |
11 | + function($filter, $scope, $uibModalInstance, idRemito, focaModalDetalleHojaRutaService, | |
12 | + focaModalService, focaSeguimientoService) | |
13 | + { | |
14 | + //Seteo variables | |
15 | + $scope.remito = {}; | |
11 | 16 | $scope.cisternas = []; |
12 | 17 | $scope.articuloSeleccionado = {}; |
18 | + $scope.aDescargar = []; | |
19 | + $scope.cargando = true; | |
20 | + | |
21 | + //Datos | |
22 | + var promesaRemito = focaModalDetalleHojaRutaService | |
23 | + .getRemitoById(idRemito); | |
24 | + var promesaCisternas = focaModalDetalleHojaRutaService | |
25 | + .getCisternasByIdRemito(idRemito); | |
26 | + | |
27 | + Promise.all([promesaRemito, promesaCisternas]).then(function(res) { | |
28 | + $scope.cargando = false; | |
29 | + $scope.remito = res[0].data; | |
30 | + $scope.cisternas = res[1].data; | |
31 | + var articuloAChequear = $scope.remito.articulosRemito.filter( | |
32 | + function(articulo) { | |
33 | + return !articulo.descargado; | |
34 | + }); | |
35 | + if(!articuloAChequear.length || $scope.remito.rechazado) { | |
36 | + $scope.readonly = true; | |
37 | + $scope.cambio($scope.remito.articulosRemito[0]); | |
38 | + }else { | |
39 | + $scope.cambio(articuloAChequear[0]); | |
40 | + } | |
41 | + $scope.$digest(); | |
42 | + }, function() { | |
43 | + focaModalService.alert('El servicio no responde intente más tarde'); | |
44 | + $uibModalInstance.dismiss(); | |
45 | + }); | |
13 | 46 | $scope.cambio = function(articulo) { |
47 | + if(!$scope.articuloSeleccionado.descargado) { | |
48 | + $scope.articuloSeleccionado.cantidadDescargada = 0; | |
49 | + } | |
50 | + $scope.aDescargar = []; | |
14 | 51 | $scope.articuloSeleccionado = articulo; |
15 | 52 | }; |
16 | - focaModalDetalleHojaRutaService.getCisternasByIdRemito($scope.remito.id) | |
17 | - .then(function(res) { | |
18 | - $scope.cisternas = res.data; | |
19 | - }); | |
53 | + $scope.descargar = function(key) { | |
54 | + if(key === 13) { | |
55 | + $scope.cargando = true; | |
56 | + var hojaRutaMovimientos = []; | |
57 | + var cisternaMovimientos = []; | |
58 | + var cisternaCargas = []; | |
59 | + var totalADescargar = 0; | |
60 | + for(var i = 0; i < $scope.aDescargar.length; i++) { | |
61 | + totalADescargar += $scope.aDescargar[i] || 0; | |
62 | + } | |
63 | + focaModalService | |
64 | + .confirm('¿Desea descargar ' + totalADescargar + ' litros de ' + | |
65 | + $scope.articuloSeleccionado.descripcion + '?') | |
66 | + .then(descargar); | |
67 | + } | |
68 | + function descargar() { | |
69 | + for(var i = 0; i < $scope.cisternas.length; i++) { | |
70 | + var descarga = $scope.aDescargar[i]; | |
71 | + var cisternaCarga = $scope.cisternas[i].cisternaCarga; | |
72 | + if(!descarga) continue; | |
73 | + if(descarga > cisternaCarga.cantidad) { | |
74 | + focaModalService.alert('La cantidad a descargar no debe ser ' + | |
75 | + 'mayor a la cantidad de la cisterna'); | |
76 | + $scope.cargando = false; | |
77 | + return; | |
78 | + } | |
79 | + cisternaCarga.cantidad -= descarga; | |
20 | 80 | |
21 | - $scope.aceptar = function() { | |
22 | - var articulos = articulosDescargados(); | |
23 | - var cisternaMovimientos = []; | |
24 | - var hojaRutaMovimientos = []; | |
25 | - for(var i = 0; i < articulos.length; i++) { | |
26 | - var cisternaMovimiento = { | |
27 | - idRemito: $scope.remito.id, | |
28 | - cantidad: articulos[i].aCargar, | |
29 | - metodo: 'descarga' | |
30 | - }; | |
31 | - var hojaRutaMovimiento = { | |
32 | - idRemito: $scope.remito.id, | |
33 | - reciboDescarga: articulos[i].numeroRecibo | |
81 | + //Guardar | |
82 | + var now = new Date(); | |
83 | + var cisternaMovimiento = { | |
84 | + fecha: now.toISOString().slice(0, 19).replace('T', ' '), | |
85 | + cantidad: descarga, | |
86 | + metodo: 'descarga', | |
87 | + idCisternaCarga: cisternaCarga.id, | |
88 | + idRemito: $scope.remito.id | |
89 | + }; | |
90 | + var hojaRutaMovimiento = { | |
91 | + reciboDescarga: $scope.numeroRecibo, | |
92 | + idRemito: $scope.remito.id | |
93 | + }; | |
94 | + delete cisternaCarga.articulo; | |
95 | + cisternaCargas.push(cisternaCarga); | |
96 | + cisternaMovimientos.push(cisternaMovimiento); | |
97 | + hojaRutaMovimientos.push(hojaRutaMovimiento); | |
98 | + } | |
99 | + var save = { | |
100 | + cisternaCargas: cisternaCargas, | |
101 | + cisternaMovimientos: cisternaMovimientos, | |
102 | + hojaRutaMovimientos: hojaRutaMovimientos, | |
103 | + articulo: $scope.articuloSeleccionado | |
34 | 104 | }; |
35 | - cisternaMovimientos.push(cisternaMovimiento); | |
36 | - hojaRutaMovimientos.push(hojaRutaMovimiento); | |
105 | + focaModalDetalleHojaRutaService | |
106 | + .postMovimientoHojaRuta(save) | |
107 | + .then(guardarSeguimiento) | |
108 | + .catch(error); | |
109 | + function guardarSeguimiento(res) { | |
110 | + focaSeguimientoService | |
111 | + .guardarPosicion( | |
112 | + 'Entrega de producto', | |
113 | + res.data[0].id, | |
114 | + $scope.remito.observaciones); | |
115 | + $scope.aDescargar = []; | |
116 | + $scope.remito.observaciones = ''; | |
117 | + $scope.articuloSeleccionado.descargado = true; | |
118 | + var siguienteArticulo = $scope.remito.articulosRemito.filter( | |
119 | + function(articulo) { | |
120 | + return articulo.id != $scope.articuloSeleccionado.id; | |
121 | + } | |
122 | + ); | |
123 | + if(siguienteArticulo.length) { | |
124 | + $scope.cambio(siguienteArticulo[0]); | |
125 | + } | |
126 | + success(); | |
127 | + } | |
37 | 128 | } |
38 | - var result = { | |
39 | - cisternaMovimientos: cisternaMovimientos, | |
40 | - hojaRutaMovimientos: hojaRutaMovimientos, | |
41 | - idRemito: $scope.remito.id, | |
42 | - observaciones: $scope.remito.observaciones | |
43 | - }; | |
44 | - $uibModalInstance.close(result); | |
45 | 129 | }; |
46 | 130 | |
47 | 131 | $scope.cancel = function() { |
48 | 132 | $uibModalInstance.dismiss('cancel'); |
49 | 133 | }; |
50 | 134 | |
51 | - $scope.validar = function() { | |
52 | - return !articulosDescargados().length; | |
135 | + $scope.distribucionDisponible = function() { | |
136 | + return $scope.articuloSeleccionado.cantidadDescargada === | |
137 | + $scope.articuloSeleccionado.cantidad; | |
53 | 138 | }; |
54 | 139 | |
55 | - function articulosDescargados() { | |
56 | - var articulosDescargados = $scope.remito.articulosRemito.filter( | |
57 | - function(articulo) { | |
58 | - if(articulo.aCargar && articulo.numeroRecibo) { | |
59 | - return articulo; | |
60 | - } | |
140 | + $scope.actualizarArticulo = function() { | |
141 | + $scope.articuloSeleccionado.cantidadDescargada = 0; | |
142 | + for(var i = 0; i < $scope.aDescargar.length; i++) { | |
143 | + $scope.articuloSeleccionado.cantidadDescargada += | |
144 | + parseFloat($scope.aDescargar[i]) || 0; | |
145 | + } | |
146 | + }; | |
147 | + | |
148 | + $scope.rechazar = function() { | |
149 | + focaModalService | |
150 | + .prompt('Aclare el motivo de rechazo') | |
151 | + .then(function(motivo) { | |
152 | + $scope.cargando = true; | |
153 | + var remitoRechazado = $.extend(true, {}, $scope.remito); | |
154 | + delete remitoRechazado.articulosRemito; | |
155 | + delete remitoRechazado.notaPedido; | |
156 | + remitoRechazado.rechazado = true; | |
157 | + remitoRechazado.motivoRechazo = motivo; | |
158 | + remitoRechazado.fechaRemito = | |
159 | + remitoRechazado.fechaRemito.slice(0, 19).replace('T', ' '); | |
160 | + focaModalDetalleHojaRutaService | |
161 | + .rechazarRemito(remitoRechazado) | |
162 | + .then(success) | |
163 | + .catch(error) | |
164 | + $scope.readonly = true; | |
61 | 165 | }); |
62 | - return articulosDescargados; | |
166 | + }; | |
167 | + | |
168 | + //funciones | |
169 | + function error(error) { | |
170 | + focaModalService.alert('Hubo un error ' + error); | |
171 | + } | |
172 | + function success() { | |
173 | + focaModalService.alert('Operación realizada con éxito'); | |
174 | + $scope.cargando = false; | |
63 | 175 | } |
64 | 176 | } |
65 | 177 | ] |
src/js/service.js
... | ... | @@ -9,6 +9,15 @@ angular.module('focaModalDetalleHojaRuta') |
9 | 9 | }, |
10 | 10 | getCisternasByIdRemito: function(idRemito) { |
11 | 11 | return $http.get(API_ENDPOINT.URL + '/cisternas/obtener/remito/' + idRemito); |
12 | + }, | |
13 | + getRemitoById: function(idRemito) { | |
14 | + return $http.get(API_ENDPOINT.URL + '/remito/obtener/' + idRemito + '/punto'); | |
15 | + }, | |
16 | + postMovimientoHojaRuta: function(datos) { | |
17 | + return $http.post(API_ENDPOINT.URL + '/hoja-ruta/movimiento', datos); | |
18 | + }, | |
19 | + rechazarRemito: function(remito) { | |
20 | + return $http.post(API_ENDPOINT.URL + '/remito/update', {remito: remito}); | |
12 | 21 | } |
13 | 22 | }; |
14 | 23 | } |
src/views/modal-detalle-hoja-ruta.html
1 | 1 | <div class="modal-header py-1"> |
2 | 2 | <h5 class="modal-title">Detalle de descarga</h5> |
3 | 3 | </div> |
4 | -<div class="modal-body" id="modal-body"> | |
4 | +<div class="modal-body" id="modal-body" ladda="cargando" data-spinner-color="#FF0000" data-spinner-size="5"> | |
5 | 5 | <form name="formDetalleHojaRuta"> |
6 | - <div class="form-group row"> | |
6 | + <div class="form-group row" ng-show="!cargando"> | |
7 | 7 | <div class="col-12 px-0"> |
8 | - <label class="form-control-sm"> | |
9 | - <b>Remito Nº</b> | |
10 | - <span ng-bind="[remito.numeroRemito, remito.sucursal] | comprobante"/> | |
11 | - </label> | |
12 | - </div> | |
13 | - <div class="col-12 px-0"> | |
14 | - <label class="form-control-sm"> | |
15 | - <b>Cliente</b> | |
16 | - </label> | |
17 | - <span ng-bind="remito.nombreCliente"/> | |
18 | - </div> | |
19 | - <div class="col-12 px-0"> | |
20 | - <label class="form-control-sm"> | |
21 | - <b>Domicilio</b> | |
22 | - <span ng-bind="remito.domicilioStamp"/> | |
23 | - </label> | |
24 | - </div> | |
25 | - <div class="col-12 px-0"> | |
26 | - <strong>Articulo a descargar</strong> | |
27 | - <table class="table table-sm"> | |
28 | - <thead> | |
29 | - <tr> | |
30 | - <th></th> | |
31 | - <th>Articulo</th> | |
32 | - <th>Total</th> | |
33 | - <th>Descargado</th> | |
34 | - </tr> | |
35 | - </thead> | |
36 | - <tbody> | |
37 | - <tr ng-repeat="(key, articulo) in remito.articulosRemito"> | |
38 | - <td class="pt-2"><input | |
39 | - type="radio" | |
40 | - name="articuloRadio" | |
41 | - id="{{'articulo' + articulo.id}}" | |
42 | - ng-click="cambio(articulo)" | |
43 | - ng-disabled="articulo.cargado" | |
44 | - ></td> | |
45 | - <td ng-bind="articulo.descripcion"></td> | |
46 | - <td ng-bind="articulo.cantidad"></td> | |
47 | - <td ng-bind="articulo.descargado || articulo.cantidad"></td> | |
48 | - </tbody> | |
49 | - </table> | |
50 | - <strong>Cisterna</strong> | |
51 | - <table class="table table-sm"> | |
52 | - <thead> | |
53 | - <tr> | |
54 | - <th>Código</th> | |
55 | - <th>Articulo</th> | |
56 | - <th>Total</th> | |
57 | - <th>A descargar</th> | |
58 | - </tr> | |
59 | - </thead> | |
60 | - <tbody> | |
61 | - <tr ng-repeat="(key, cisterna) in cisternas"> | |
62 | - <td ng-bind="cisterna.codigo"></td> | |
63 | - <td ng-bind="cisterna.cisternaCarga.articulo.DetArt"></td> | |
64 | - <td ng-bind="cisterna.cisternaCarga.cantidad"></td> | |
65 | - <td><input | |
66 | - class="form-control form-control-sm" | |
67 | - type="number" | |
68 | - ng-model="cisterna.aDescargar" | |
69 | - foca-focus="" | |
70 | - ng-disabled="articuloSeleccionado.idArticulo != cisterna.cisternaCarga.idProducto"/></td> | |
71 | - </tr> | |
72 | - </tbody> | |
73 | - </table> | |
74 | - </div> | |
75 | - <div class="col-12 px-0"> | |
76 | - <label class="form-control-sm px-0"> | |
77 | - <b>Observaciones</b> | |
78 | - </label> | |
79 | - </div> | |
80 | - <div class="col-12"> | |
81 | - <textarea | |
82 | - ng-model="remito.observaciones" | |
83 | - class="form-control form-control-sm" | |
84 | - rows="1" | |
85 | - ></textarea> | |
86 | - </div> | |
87 | - <div class="col-12 row mt-2"> | |
88 | - <label class="form-control-sm px-0 col-3"><b>Nº Recibo</b></label> | |
89 | - <input | |
90 | - class="form-control form-control-sm col-4" | |
91 | - type="number" | |
92 | - ng-model="numeroRecibo"> | |
8 | + <strong>Información Remito</strong> | |
93 | 9 | <button |
94 | - class="ml-4 form-control-sm btn btn-success col-4" | |
95 | - ladda="cargando" | |
96 | - data-spinner-color="#FF0000" | |
97 | - type="button" | |
98 | - ng-disabled="!distribucionDisponible()" | |
99 | - ng-click="cargarACisternas(vehiculo)" | |
100 | - foca-focus="distribucionDisponible()"> | |
101 | - Descargar | |
10 | + class="btn btn-sm btn-outline-light selectable" | |
11 | + ng-click="verInformacion = !verInformacion" | |
12 | + ><i | |
13 | + class="fa fa-chevron-down" | |
14 | + ng-show="verInformacion"></i> | |
15 | + <i | |
16 | + class="fa fa-chevron-up" | |
17 | + ng-hide="verInformacion"> | |
18 | + </i> | |
102 | 19 | </button> |
103 | 20 | </div> |
21 | + <div class="row" ng-show="verInformacion"> | |
22 | + <div class="col-12"> | |
23 | + <label class="form-control-sm"> | |
24 | + <b>Remito Nº</b> | |
25 | + <span ng-bind="[remito.numeroRemito, remito.sucursal] | comprobante"/> | |
26 | + </label> | |
27 | + </div> | |
28 | + <div class="col-12"> | |
29 | + <label class="form-control-sm"> | |
30 | + <b>Cliente</b> | |
31 | + </label> | |
32 | + <span ng-bind="remito.nombreCliente"/> | |
33 | + </div> | |
34 | + <div class="col-12"> | |
35 | + <label class="form-control-sm"> | |
36 | + <b>Domicilio</b> | |
37 | + <span ng-bind="remito.domicilioStamp"/> | |
38 | + </label> | |
39 | + </div> | |
40 | + <div ng-show="remito.notaPedido.notaPedidoPuntoDescarga.length" class="px-3"> | |
41 | + <label class="form-control-sm"> | |
42 | + <b>Puntos de descarga</b> | |
43 | + </label> | |
44 | + <table class="table table-sm"> | |
45 | + <thead> | |
46 | + <tr> | |
47 | + <th>Nombre</th> | |
48 | + <th>Articulo</th> | |
49 | + <th>Cantidad</th> | |
50 | + </tr> | |
51 | + </thead> | |
52 | + <tbody> | |
53 | + <tr ng-repeat="(key, puntoDescarga) in remito.notaPedido.notaPedidoPuntoDescarga"> | |
54 | + <td ng-bind="puntoDescarga.puntoDescarga.descripcion"></td> | |
55 | + <td ng-bind="puntoDescarga.producto.DetArt"></td> | |
56 | + <td ng-bind="puntoDescarga.cantidad"></td> | |
57 | + </tbody> | |
58 | + </table> | |
59 | + </div> | |
60 | + </div> | |
61 | + <strong>Articulo a descargar</strong> | |
62 | + <table class="table table-sm"> | |
63 | + <thead> | |
64 | + <tr> | |
65 | + <th></th> | |
66 | + <th>Articulo</th> | |
67 | + <th>Total</th> | |
68 | + <th>Descargado</th> | |
69 | + </tr> | |
70 | + </thead> | |
71 | + <tbody> | |
72 | + <tr ng-repeat="(key, articulo) in remito.articulosRemito"> | |
73 | + <td class="pt-2"> | |
74 | + <input | |
75 | + type="radio" | |
76 | + name="articuloRadio" | |
77 | + id="{{'articulo' + articulo.id}}" | |
78 | + ng-click="cambio(articulo)" | |
79 | + ng-disabled="articulo.descargado || readonly" | |
80 | + ng-checked="articuloSeleccionado.id === articulo.id" | |
81 | + ></td> | |
82 | + <td ng-bind="articulo.descripcion"></td> | |
83 | + <td ng-bind="articulo.cantidad"></td> | |
84 | + <td ng-bind="articulo.cantidadDescargada || 0"></td> | |
85 | + </tbody> | |
86 | + </table> | |
87 | + <strong>Cisterna</strong> | |
88 | + <table class="table table-sm"> | |
89 | + <thead> | |
90 | + <tr> | |
91 | + <th>Código</th> | |
92 | + <th>Articulo</th> | |
93 | + <th>Total</th> | |
94 | + <th>A descargar</th> | |
95 | + </tr> | |
96 | + </thead> | |
97 | + <tbody> | |
98 | + <tr ng-repeat="(key, cisterna) in cisternas"> | |
99 | + <td ng-bind="cisterna.codigo"></td> | |
100 | + <td ng-bind="cisterna.cisternaCarga.articulo.DetArt"></td> | |
101 | + <td ng-bind="cisterna.cisternaCarga.cantidad"></td> | |
102 | + <td><input | |
103 | + class="form-control form-control-sm" | |
104 | + type="number" | |
105 | + ng-model="aDescargar[key]" | |
106 | + ng-change="actualizarArticulo()" | |
107 | + foca-focus="articuloSeleccionado.idArticulo == cisterna.cisternaCarga.idProducto" | |
108 | + ng-disabled="articuloSeleccionado.idArticulo != cisterna.cisternaCarga.idProducto | |
109 | + || readonly"/></td> | |
110 | + </tr> | |
111 | + </tbody> | |
112 | + </table> | |
113 | + <div class="col-12 px-0"> | |
114 | + <label class="form-control-sm px-0"> | |
115 | + <b>Observaciones</b> | |
116 | + </label> | |
117 | + </div> | |
118 | + <div class="col-12"> | |
119 | + <textarea | |
120 | + ng-model="remito.observaciones" | |
121 | + ng-disabled="readonly" | |
122 | + class="form-control form-control-sm" | |
123 | + rows="1" | |
124 | + ></textarea> | |
125 | + </div> | |
126 | + <div class="col-12 row mt-2"> | |
127 | + <label class="form-control-sm px-0 col-3"><b>Nº Recibo</b></label> | |
128 | + <input | |
129 | + class="form-control form-control-sm col-4" | |
130 | + type="number" | |
131 | + ng-disabled="readonly" | |
132 | + ng-model="numeroRecibo" | |
133 | + ng-keypress="descargar($event.keyCode)" | |
134 | + foca-focus="distribucionDisponible()"> | |
135 | + <button | |
136 | + class="ml-4 form-control-sm btn btn-success col-4" | |
137 | + ladda="cargando" | |
138 | + data-spinner-color="#FF0000" | |
139 | + type="button" | |
140 | + ng-disabled="!distribucionDisponible() || !numeroRecibo" | |
141 | + ng-click="descargar(13)"> | |
142 | + Descargar | |
143 | + </button> | |
104 | 144 | </div> |
105 | 145 | </form> |
106 | 146 | </div> |
... | ... | @@ -108,18 +148,12 @@ |
108 | 148 | <button |
109 | 149 | class="btn btn-danger btn-sm" |
110 | 150 | type="button" |
111 | - ng-click="" | |
112 | - ng-disabled="" | |
113 | - >Anular</button> | |
151 | + ng-click="rechazar()" | |
152 | + ng-disabled="readonly" | |
153 | + >Rechazar</button> | |
114 | 154 | <button |
115 | 155 | class="btn btn-secondary btn-sm" |
116 | 156 | type="button" |
117 | 157 | ng-click="cancel()" |
118 | - >Cancelar</button> | |
119 | - <button | |
120 | - class="btn btn-primary btn-sm" | |
121 | - type="button" | |
122 | - ng-click="aceptar()" | |
123 | - ng-disabled="validar()" | |
124 | - >Aceptar</button> | |
158 | + >Salir</button> | |
125 | 159 | </div> |