Commit 7114ac7e7c22ec55f3af9ad67b8d80f36ee3df55

Authored by Jose Pinto
1 parent fbb11330ff
Exists in master and in 1 other branch develop

agrego Informe de reparto óptimo detallado

src/js/controller-reparto-optimo.js
... ... @@ -0,0 +1,258 @@
  1 +angular.module('focaModalInforme')
  2 + .controller('focaModalInformeRepartoOptimoController',
  3 + [
  4 + '$filter',
  5 + '$scope',
  6 + '$uibModalInstance',
  7 + 'focaModalInformeRepartoOptimoService',
  8 + 'i18nService',
  9 + 'focaModalService',
  10 + '$uibModal',
  11 + function($filter, $scope, $uibModalInstance, focaModalInformeRepartoOptimoService,
  12 + i18nService, focaModalService, $uibModal
  13 + ) {
  14 + var fecha = new Date();
  15 + $scope.generando = false;
  16 + $scope.buscar = true;
  17 + $scope.params = {
  18 + fechaHasta: new Date(),
  19 + fechaDesde: new Date(fecha.setMonth(fecha.getMonth() - 1)),
  20 + sector: undefined,
  21 + diferenciarProductos: false,
  22 + diferenciarMeses: false
  23 + };
  24 + i18nService.setCurrentLang('es');
  25 + $scope.gridOptions = {
  26 + enableGridMenu: true,
  27 + exporterMenuCsv: false,
  28 + exporterPdfPageSize: 'A4',
  29 + exporterPdfFooter: function (currentPage, pageCount) {
  30 + return {
  31 + columns: [
  32 + {text: $filter('date')(new Date(), 'dd/MM/yyyy'),
  33 + margin: [40, 0]},
  34 + {text: currentPage + ' de ' + pageCount,
  35 + margin: [28, 0], alignment: 'right'}
  36 + ]
  37 + };
  38 + },
  39 + columnDefs: [
  40 + {
  41 + field: 'vehiculo',
  42 + enableSorting: false,
  43 + cellClass: function(grid, row, col) {
  44 + if (grid.getCellValue(row,col).indexOf('Sector:') !== -1)
  45 + return 'yellow w-100';
  46 + if (grid.getCellValue(row,col).indexOf('Producto:') !== -1)
  47 + return 'red w-100';
  48 + if (grid.getCellValue(row,col).indexOf('Fecha:') !== -1)
  49 + return 'green w-100';
  50 + }
  51 + },
  52 + {
  53 + field: 'ltsRepartidos',
  54 + enableSorting: false,
  55 + cellClass: function(grid, row, col) {
  56 + if (!grid.getCellValue(row,col))
  57 + return 'd-none';
  58 + }
  59 + },
  60 + {
  61 + field: 'ltsOptimos',
  62 + enableSorting: false,
  63 + cellClass: function(grid, row, col) {
  64 + if (!grid.getCellValue(row,col))
  65 + return 'd-none';
  66 + }
  67 + },
  68 + {
  69 + field: 'diferencia',
  70 + enableSorting: false,
  71 + cellClass: function(grid, row, col) {
  72 + if (!grid.getCellValue(row,col))
  73 + return 'd-none';
  74 + }
  75 + },
  76 + {
  77 + field: 'porcentaje',
  78 + enableSorting: false,
  79 + cellClass: function(grid, row, col) {
  80 + if (!grid.getCellValue(row,col))
  81 + return 'd-none';
  82 + }
  83 + }
  84 + ]
  85 + };
  86 +
  87 + $scope.generarInforme = function() {
  88 + $scope.generando = true;
  89 + focaModalInformeRepartoOptimoService
  90 + .getInformeData($scope.params)
  91 + .then(function(res) {
  92 + var result = [];
  93 +
  94 + res.data.forEach(function(sector) {
  95 + if (!$scope.params.sector ||
  96 + $scope.params.sector.ID === sector.idSector) {
  97 + //AGREGO SECTORES
  98 + result.push({
  99 + vehiculo: 'Sector: ' +
  100 + $filter('rellenarDigitos')(sector.idSector, 2, '0') +
  101 + ' - ' + sector.sector.trim()
  102 + });
  103 + if (!$scope.params.diferenciarProductos)
  104 + sector.productos = unirProductos(sector.productos);
  105 +
  106 + sector.productos.forEach(function(producto) {
  107 + //AGREGO PRODUCTOS
  108 + if ($scope.params.diferenciarProductos) {
  109 + result.push({
  110 + vehiculo: 'Producto: ' +
  111 + producto.idProducto +
  112 + ' - ' + producto.producto
  113 + });
  114 + }
  115 + if (!$scope.params.diferenciarMeses) {
  116 + producto.fechas = unirFechas(producto.fechas);
  117 + }
  118 + producto.fechas.forEach(function(fecha) {
  119 + //AGREGO FECHAS
  120 + if ($scope.params.diferenciarMeses) {
  121 + result.push({
  122 + vehiculo:
  123 + 'Fecha: ' + fecha.month + ' - ' + fecha.year
  124 + });
  125 + } else {
  126 + result.push({
  127 + vehiculo:
  128 + 'Fecha: ' + fecha.year
  129 + });
  130 + }
  131 + fecha.vehiculos.forEach(function(vehiculo) {
  132 + //AGREGO VEHICULOS
  133 + result.push({
  134 + vehiculo: vehiculo.vehiculo,
  135 + ltsRepartidos:
  136 + $filter('number')
  137 + (vehiculo.data.ltsRepartidos, 2),
  138 + ltsOptimos:
  139 + $filter('number')
  140 + (vehiculo.data.ltsOptimos, 2),
  141 + diferencia:
  142 + $filter('number')
  143 + (vehiculo.data.diferencia, 2),
  144 + porcentaje:
  145 + $filter('number')
  146 + (vehiculo.data.porcentaje, 2) + '%'
  147 + });
  148 + });
  149 + });
  150 + });
  151 + }
  152 + });
  153 +
  154 + $scope.gridOptions.data = result;
  155 + $scope.generando = false;
  156 + $scope.buscar = false;
  157 + });
  158 + };
  159 +
  160 +
  161 + $scope.seleccionarSector = function(key) {
  162 + if (key === 13) {
  163 + var parametrosModal = {
  164 + titulo: 'Búsqueda de Sector',
  165 + query: '/sector',
  166 + columnas: [
  167 + {
  168 + nombre: 'Código',
  169 + propiedad: 'ID'
  170 + },
  171 + {
  172 + nombre: 'Nombre',
  173 + propiedad: 'NOMBRE'
  174 + }
  175 + ],
  176 + size: 'md'
  177 + };
  178 + focaModalService.modal(parametrosModal).then(
  179 + function(sector) {
  180 + $scope.params.sector = sector;
  181 + }, function() {}
  182 + );
  183 + }
  184 + };
  185 + $scope.clearSector = function() {
  186 + $scope.params.sector = undefined;
  187 + };
  188 + $scope.volver = function() {
  189 + $scope.buscar = true;
  190 + };
  191 + $scope.cancel = function() {
  192 + $uibModalInstance.dismiss('Cancelar');
  193 + };
  194 +
  195 + function unirProductos(productos) {
  196 + var result = [{fechas: []}];
  197 + productos.forEach(function(producto) {
  198 + producto.fechas.forEach(function(fecha) {
  199 + var existe = result[0].fechas.filter(function(result) {
  200 + return result.fecha === fecha.fecha;
  201 + });
  202 + if (existe.length) {
  203 + existe[0].vehiculos = existe[0].vehiculos.concat(fecha.vehiculos);
  204 + } else {
  205 + result[0].fechas.push(fecha);
  206 + }
  207 +
  208 + });
  209 + });
  210 + result[0].fechas.forEach(function(fecha) {
  211 + fecha.vehiculos = unirVehiculos(fecha.vehiculos);
  212 + });
  213 + return result;
  214 + }
  215 +
  216 + function unirFechas(fechas) {
  217 + var results = [];
  218 + fechas.forEach(function(fecha) {
  219 + var existe = results.filter(function(result) {
  220 + return result.year === fecha.year;
  221 + });
  222 +
  223 + if (existe.length) {
  224 + existe[0].vehiculos = existe[0].vehiculos.concat(fecha.vehiculos);
  225 + } else {
  226 + results.push({
  227 + year: fecha.year,
  228 + vehiculos: fecha.vehiculos
  229 + });
  230 + }
  231 + });
  232 +
  233 + results.forEach(function(result) {
  234 + result.vehiculos = unirVehiculos(result.vehiculos);
  235 + });
  236 + return results;
  237 + }
  238 +
  239 + function unirVehiculos(vehiculos) {
  240 + var results = [];
  241 + vehiculos.forEach(function(vehiculo) {
  242 + var existe = results.filter(function(result) {
  243 + return result.vehiculo === vehiculo.vehiculo;
  244 + });
  245 +
  246 + if (existe.length) {
  247 + existe[0].data.kms += vehiculo.data.kms;
  248 + existe[0].data.lts += vehiculo.data.lts;
  249 + existe[0].data.viajes += vehiculo.data.viajes;
  250 + } else {
  251 + results.push(vehiculo);
  252 + }
  253 + });
  254 + return results;
  255 + }
  256 + }
  257 + ]
  258 + );
... ... @@ -26,7 +26,8 @@ angular.module('focaModalInforme')
26 26 return $http.get(API_ENDPOINT.URL + '/empresa/' + id);
27 27 },
28 28 getInformeData: function(params) {
29   - return $http.post(API_ENDPOINT.URL + '/informe/general-unidad-reparto', {params: params});
  29 + return $http.post(API_ENDPOINT.URL + '/informe/general-unidad-reparto',
  30 + {params: params});
30 31 }
31 32 };
32 33 }
... ... @@ -63,4 +64,16 @@ angular.module('focaModalInforme')
63 64 }
64 65 };
65 66 }
  67 + ])
  68 + .factory('focaModalInformeRepartoOptimoService', [
  69 + '$http',
  70 + 'API_ENDPOINT',
  71 + function($http, API_ENDPOINT) {
  72 + return {
  73 + getInformeData: function(params) {
  74 + return $http.post(API_ENDPOINT.URL + '/informe/reparto-optimo',
  75 + {params: params});
  76 + }
  77 + };
  78 + }
66 79 ]);
67 80 \ No newline at end of file
src/views/informe-reparto-optimo.html
... ... @@ -0,0 +1,136 @@
  1 +<div class="modal-header py-1">
  2 + <div class="row w-100">
  3 + <div class="col-12"><h5 class="modal-title">Informe de reparto óptimo detallado</h5></div>
  4 + <div class="col-12" ng-hide="buscar">
  5 + Filtros: Fecha desde: {{fechaDesde | date: 'dd/MM/yyyy'}},
  6 + Fecha hasta: {{fechaHasta | date: 'dd/MM/yyyy'}},
  7 + Transportista : {{transportista.NOM}},
  8 + Unidad: {{unidad.codigo}}
  9 + </div>
  10 + </div>
  11 + </div>
  12 + <div class="modal-body" id="modal-body">
  13 + <div class="input-group row"
  14 + ng-show="buscar">
  15 + <small class="col-md-2 col-4 text-left my-1">Fecha Desde</small>
  16 + <div class="col-md-4 col-8 input-group mb-2">
  17 + <div class="input-group-prepend">
  18 + <div class="input-group-text form-control-sm">
  19 + <i class="fa fa-calendar"></i>
  20 + </div>
  21 + </div>
  22 + <input
  23 + class="form-control form-control-sm"
  24 + id="inlineFormInputGroup"
  25 + type="text"
  26 + ng-model="params.fechaDesde"
  27 + ng-required="true"
  28 + uib-datepicker-popup="dd/MM/yyyy"
  29 + show-button-bar="false"
  30 + is-open="datepickerOpen"
  31 + on-open-focus="false"
  32 + ng-focus="datepickerOpen = true"
  33 + datepicker-options="dateOptions"
  34 + />
  35 + </div>
  36 + <small class="col-md-2 col-4 text-left my-1">Fecha Hasta</small>
  37 + <div class="col-md-4 col-8 input-group mb-2">
  38 + <div class="input-group-prepend">
  39 + <div class="input-group-text form-control-sm">
  40 + <i class="fa fa-calendar"></i>
  41 + </div>
  42 + </div>
  43 + <input
  44 + class="form-control form-control-sm"
  45 + id="inlineFormInputGroup"
  46 + type="text"
  47 + ng-model="params.fechaHasta"
  48 + ng-required="true"
  49 + uib-datepicker-popup="dd/MM/yyyy"
  50 + show-button-bar="false"
  51 + is-open="datepicker2Open"
  52 + on-open-focus="false"
  53 + ng-focus="datepicker2Open = true"
  54 + />
  55 + </div>
  56 + <small class="col-md-2 col-4 text-left my-1">Sector</small>
  57 + <div class="col-md-4 col-8 input-group mb-2">
  58 + <input
  59 + class="form-control form-control-sm"
  60 + id="inlineFormInputGroup"
  61 + type="text"
  62 + ng-model="params.sector.NOMBRE"
  63 + ng-required="true"
  64 + ng-keypress="seleccionarSector($event.keyCode)"
  65 + />
  66 + <button type="button" class="clear-input text-danger" ng-click="clearSector()">
  67 + <i class="fa fa-times"></i>
  68 + </button>
  69 + <div class="input-group-append">
  70 + <div class="input-group-append" ng-hide="ingreso">
  71 + <button
  72 + ladda="searchLoading"
  73 + data-spinner-color="#FF0000"
  74 + class="btn btn-outline-secondary"
  75 + type="button"
  76 + ng-click="seleccionarSector(13)">
  77 + <i class="fa fa-search" aria-hidden="true"></i>
  78 + </button>
  79 + </div>
  80 + </div>
  81 + </div>
  82 + <small class="col-md-4 col-8 text-left my-1">Diferenciar productos</small>
  83 + <div class="col-md-2 col-4 input-group mb-2">
  84 + <div class="custom-control custom-checkbox ml-auto">
  85 + <input
  86 + type="checkbox"
  87 + class="custom-control-input"
  88 + ng-model="params.diferenciarProductos"
  89 + id="customCheck1">
  90 + <label class="custom-control-label" for="customCheck1"></label>
  91 + </div>
  92 + </div>
  93 + <small class="col-md-4 col-8 text-left my-1">Detallar por mes</small>
  94 + <div class="col-md-2 col-4 input-group mb-2">
  95 + <div class="custom-control custom-checkbox ml-auto">
  96 + <input
  97 + type="checkbox"
  98 + class="custom-control-input"
  99 + ng-model="params.diferenciarMeses"
  100 + id="customCheck2">
  101 + <label class="custom-control-label" for="customCheck2"></label>
  102 + </div>
  103 + </div>
  104 + </div>
  105 + <div
  106 + ng-if="!buscar"
  107 + class="row">
  108 + <div class="col-12">
  109 + <div
  110 + class="gridInforme"
  111 + ui-grid="gridOptions"
  112 + ui-grid-exporter
  113 + ui-grid-resize-columns
  114 + ></div>
  115 + </div>
  116 + </div>
  117 + </div>
  118 + <div class="modal-footer py-1">
  119 + <button
  120 + class="btn btn-sm btn-secondary"
  121 + type="button"
  122 + ng-click="cancel()"
  123 + ng-show="buscar">Cancelar</button>
  124 + <button
  125 + ladda="generando"
  126 + class="btn btn-sm btn-secondary"
  127 + type="button"
  128 + ng-click="generarInforme()"
  129 + ng-show="buscar">Generar</button>
  130 + <button
  131 + class="btn btn-sm btn-secondary"
  132 + type="button"
  133 + ng-click="volver()"
  134 + ng-hide="buscar">Volver</button>
  135 + </div>
  136 +
0 137 \ No newline at end of file