controller.js 16.2 KB
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)) {
                    var error = 'Los artículos del remito exceden la cantidad disponible del ' +
                     'vehiculo';
                    $uibModalInstance.dismiss(error);
                    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');
                    $uibModalInstance.dismiss();
                    return;
                }
                if(!res[2]) {
                    $scope.$digest();
                    return;
                }
                $scope.remito = res[2].data;
                if($scope.remito.idUsuarioProceso) {
                    focaModalService.alert('Remito ya asignado');
                    $uibModalInstance.close();
                }
                $scope.articulos = $scope.remito.articulosRemito;
                if(!$scope.articulos.length) {
                    focaModalService.alert('El remito no tiene articulos');
                    $uibModalInstance.dismiss();
                    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;
                }
            }
    }]);