angular.module('focaModalDetalleCisternas') .controller('focaDetalleVehiculo', ['$scope', '$uibModalInstance', 'idVehiculo', 'idRemito', 'focaModalService', '$filter', 'focaModalDetalleCisternasService', 'fechaReparto', function($scope, $uibModalInstance, idVehiculo, idRemito, focaModalService, $filter, focaModalDetalleCisternasService, fechaReparto ) { //seteo variables $scope.cargandoDatos = true; $scope.idRemito = idRemito; $scope.articulos = []; $scope.vehiculo = {}; $scope.cisternas = []; $scope.cisternasCarga = []; $scope.remito = {}; $scope.aCargar = []; var cisternaMovimientos = []; var promesaRemito; if(fechaReparto) { focaModalDetalleCisternasService.fecha = fechaReparto; } var promesaVehiculo = focaModalDetalleCisternasService.obtenerVehiculoById(idVehiculo); var promesaCisternas = focaModalDetalleCisternasService .obtenerCisternasPorFecha(idVehiculo); if(idRemito !== -1) { promesaRemito = focaModalDetalleCisternasService.obtenerRemitoById(idRemito); } Promise.all([promesaVehiculo, promesaCisternas, promesaRemito]).then(function(res) { if (idRemito !== -1 && !validarCargas(res[1].data, res[2].data)) { focaModalService .alert('Los artículos del remito exceden la capacidad disponible del ' + 'vehiculo') .then(function() { $uibModalInstance.dismiss(); }, function() { $uibModalInstance.dismiss(); }); return; } $scope.cargandoDatos = false; $scope.vehiculo = res[0].data; $scope.cisternas = res[1].data; if(!$scope.cisternas.length) { focaModalService.alert('El vehículo no tiene cisternas') .then(function () { $uibModalInstance.dismiss(); }, function() { $uibModalInstance.dismiss(); }); return; } if(!res[2]) { $scope.$digest(); return; } $scope.remito = res[2].data; if($scope.remito.idUsuarioProceso) { $uibModalInstance.dismiss(focaModalService.alert('Remito ya asignado')); } $scope.articulos = $scope.remito.articulosRemito; if(!$scope.articulos.length) { $uibModalInstance.dismiss(focaModalService.alert('El remito no tiene articulos')); return; } $scope.seleccionarArticulo($scope.articulos[0]); var tieneUsuario = $scope.cisternas.filter(function(cisterna) { if(cisterna.cisternaCarga && cisterna.cisternaCarga.idUsuarioProceso) { return cisterna.cisternaCarga.idUsuarioProceso !== focaModalDetalleCisternasService.idUsuario; } }); if(tieneUsuario.length) { focaModalService.alert('Otro usario esta usando este vehículo'); $uibModalInstance.close(); } $scope.$digest(); }); $scope.aceptar = function() { $scope.cargando = true; for(var i = 0; i < $scope.cisternasCarga.length; i++) { $scope.cisternasCarga[i].idUsuarioProceso = focaModalDetalleCisternasService.idUsuario; delete $scope.cisternasCarga[i].articulo; delete $scope.cisternasCarga[i].remitos; } var cisterna = { cisternaMovimientos: cisternaMovimientos, cisternaCargas: $scope.cisternasCarga, idVehiculo: $scope.vehiculo.id, fechaReparto: focaModalDetalleCisternasService.fecha }; if(!focaModalDetalleCisternasService.idUsuario) { focaModalService.alert('No logeado como vendedor'); $scope.cargando = false; return; } focaModalDetalleCisternasService.guardarCisternas(cisterna, $scope.remito.id) .then(function() { $scope.cargando = false; $uibModalInstance.close(); }).catch(function(error) { $scope.cargando = false; $uibModalInstance.close(); if (error.status === 403) { focaModalService.alert('ERROR: ' + error.data); return; } focaModalService.alert('Hubo un error al cargar las cisternas'); }); }; $scope.cancelar = function() { $uibModalInstance.dismiss(); }; $scope.cargarACisternas = function() { for(var i = 0; i < $scope.cisternas.length; i++) { var cisterna = $scope.cisternas[i]; var aCargar = parseFloat($scope.aCargar[i]); var fechaReparto = focaModalDetalleCisternasService.fecha; //validaciones if (!aCargar || cisterna.disabled) { continue; } //cargar if (cisterna.cisternaCarga.cantidad) { cisterna.cisternaCarga.cantidad += aCargar; } else { cisterna.cisternaCarga.cantidad = aCargar; cisterna.cisternaCarga.idProducto = $scope.articuloSeleccionado.idArticulo; } cisterna.disponible = cisterna.capacidad - cisterna.cisternaCarga.cantidad; cisterna.cisternaCarga.articulo = { DetArt: $scope.articuloSeleccionado.descripcion }; $filter('filter')($scope.articulos, {id: $scope.articuloSeleccionado.id})[0] .cargado = true; $scope.calcularPorcentaje(cisterna); //Guardar var now = new Date(); var cisternaMovimiento = { fecha: now.toISOString().slice(0, 19).replace('T', ' '), cantidad: aCargar, metodo: 'carga', idCisternaCarga: cisterna.cisternaCarga.id, idRemito: $scope.remito.id }; cisterna.cisternaCarga.fechaReparto = fechaReparto; cisterna.cisternaCarga.idCisterna = cisterna.id; $scope.cisternasCarga.push(cisterna.cisternaCarga); cisternaMovimientos.push(cisternaMovimiento); } var articuloSiguiente = $scope.articulos.filter( function(filter) { return filter.cargado !== true; } ); if(articuloSiguiente.length > 0) { $scope.seleccionarArticulo(articuloSiguiente[0]); } }; $scope.calcularPorcentaje = function(cisterna) { if(!cisterna.cisternaCarga) { cisterna.cisternaCarga = { cantidad: 0 }; } var porcentaje = (cisterna.cisternaCarga.cantidad * 100 / cisterna.capacidad) + '%'; var elementHtml = document.getElementById(cisterna.id); if(elementHtml) { elementHtml.style.width = porcentaje; } }; $scope.seleccionarArticulo = function(articulo) { $scope.articuloSeleccionado = articulo; $scope.cisternaDisponible(); $scope.autoCompletar(); // $scope.actualizarArticulo(); }; $scope.actualizarArticulo = function() { $scope.articuloSeleccionado.cantidadCargada = 0; for (var i = 0; i < $scope.aCargar.length; i++) { if (!$scope.cisternas[i].disabled) { $scope.articuloSeleccionado.cantidadCargada += parseFloat($scope.aCargar[i]) || 0; } } }; $scope.autoCompletar = function() { var arrayMismoProducto = []; var arrayVacioProducto = []; for (var i = 0; i < $scope.cisternas.length; i++) { var cisterna = $scope.cisternas[i]; cisterna.posicion = i; console.info(i, cisterna.posicion); if (!cisterna.disabled && cisterna.disponible > 0) { if (cisterna.cisternaCarga) { arrayMismoProducto.push(cisterna); } else { arrayVacioProducto.push(cisterna); } } } arrayMismoProducto.sort(function(a,b) { return a.disponible - b.disponible; }); var cisternas = arrayMismoProducto.concat(arrayVacioProducto); for (var j = 0; j < cisternas.length; j++) { var aCargar = $scope.articuloSeleccionado.cantidad - ($scope.articuloSeleccionado.cantidadCargada || 0); if (aCargar > cisternas[j].disponible) { aCargar = cisternas[j].disponible; } if (aCargar > 0) { $scope.aCargar[cisternas[j].posicion] = aCargar; $scope.actualizarArticulo(); } } }; $scope.cisternaDisponible = function() { for(var i = 0; i < $scope.cisternas.length; i++) { //Puede meter un porcentaje del total // if($scope.articuloSeleccionado.cantidad > $scope.cisternas[i].disponible) { // $scope.cisternas[i].disabled = true; // continue; // } if ($scope.cisternas[i].cisternaCarga && $scope.cisternas[i].cisternaCarga.idProducto && $scope.articuloSeleccionado.idArticulo !== $scope.cisternas[i].cisternaCarga.idProducto) { $scope.cisternas[i].disabled = true; continue; } $scope.cisternas[i].disabled = false; } }; $scope.rellenarInput = function(input, cisterna) { if(!$scope.articuloSeleccionado) return; if($scope.articuloSeleccionado.cantidad - $scope.articuloSeleccionado.cantidadCargada === 0) { return input; } if(!input) input = 0; input = parseFloat(input); input += parseFloat($scope.articuloSeleccionado.cantidad - $scope.articuloSeleccionado.cantidadCargada); if(input <= 0) return; if(input > cisterna.disponible) { input = cisterna.disponible; } return input; }; $scope.distribucionDisponible = function() { if(!$scope.articuloSeleccionado || $scope.articuloSeleccionado.cantidad - $scope.articuloSeleccionado.cantidadCargada !== 0 || !$scope.tieneArticulosPendientes()) { return false; } for(var i = 0; i < $scope.cisternas.length; i++) { if($scope.aCargar[i] > $scope.cisternas[i].disponible) { return false; } } return true; }; $scope.tieneArticulosPendientes = function() { var algunValorNegativo = $scope.aCargar.filter(function(p) { return p < 0; }); if(algunValorNegativo.length) { return false; } var articulosDescargados = $scope.articulos.filter(function(filter) { return filter.cargado === true; }); if(articulosDescargados.length === $scope.articulos.length) { $scope.aCargar = []; return false; } return true; }; $scope.verRemitos = function(data) { var parametrosModal = { titulo: 'Remitos cargados', data: data, soloMostrar: true, columnas: [ { nombre: 'Fecha', propiedad: 'fechaRemito', filtro: { nombre: 'date', parametro:'dd/MM/yyyy' } }, { nombre: 'Cliente', propiedad: 'nombreCliente' }, { nombre: 'Comprobante', propiedad: ['sucursal', 'numeroRemito'], filtro: { nombre: 'comprobante' } }, { nombre: 'Importe', propiedad: 'total' } ] }; focaModalService.modal(parametrosModal).then(function(transportista) { $scope.selectVehiculo(transportista.COD, transportista.NOM); }); }; function validarCargas(cis, remito) { var result = true; var cisternas = angular.copy(cis); var articulos = angular.copy(remito.articulosRemito); cisternas.sort(ordenarCisternas); articulos.forEach(function(articulo) { cisternas.forEach(function(cisterna) { if(!cisterna.cisternaCarga) cisterna.cisternaCarga = {}; //SI LA CISTERNA ESTA VACIA O //SI LA CISTERNA TIENE EL MISMO PRODUCTO //Y AUN TIENE LUGAR if(cisterna.capacidad === cisterna.disponible || (cisterna.cisternaCarga.idProducto === articulo.idArticulo && cisterna.disponible > 0)){ var restante = articulo.cantidad - cisterna.disponible; if (restante > 0) { cisterna.disponible = 0; articulo.cantidad = restante; } else { cisterna.disponible = restante * -1; articulo.cantidad = 0; } } }); //SI AUN RESTA CANTIDAD EN EL ARTICULO if (articulo.cantidad > 0) result = false; }); return result; } function ordenarCisternas(a, b) { //DEJA LAS CISTERNAS CON CARGA PRIMERO PARA VALIDAR LAS CARGAS CORRECTAMENTE if (a.cisternaCarga && !b.cisternaCarga) { return -1; } else if (!a.cisternaCarga && b.cisternaCarga) { return 1; } else { return 0; } } }]);