Source: directives/rotas/rotas.js

/**
 * @ngdoc directives
 * @name Rotas
 * @module s4c.directives.rotas.Rotas
 *
 * @description
 * `Rotas` Controller da funcionalidade de Rotas
 *
 * @example   <s4c-rotas></s4c-rotas>
 * 
 */
(function () {
    'use strict';

    rotasCtrl.$inject = [
        '$scope',
        'RotasService',
        'PermissoesService',
        'MainState',
        'RotasManager',
        'CommService',
        'RotasFilter',
        'localize',
        '$interval'
    ];

    function rotasCtrl($scope, RotasService, PermissoesService, MainState, RotasManager, CommService, RotasFilter, localize, $interval) {

        var instance = RotasFilter.getInstance('rotas-filter');

        PermissoesService.getPermissoes().then(function (perms) {
            $scope.permissoesVisualizacao = perms.permissoesVisualizacao;
            $scope.permissoesCriacao = perms.permissoesCriacao;
            $scope.permissoesEdicao = perms.permissoesEdicao;
            $scope.permissoesRemocao = perms.permissoesRemocao;
        });


        $scope.filterAgencias = [];

        /**
         * @method rotasFilter
         */
        $scope.rotasFilter = function (rota) {
            // Filter not set at this point.
            if ($scope.filterAgencias.length === 0) return true;
            if (!instance) return true;
            if (!instance.agencias) return true;

            return $scope.filterAgencias.indexOf(rota.DepartamentoId) > -1;
        };

        instance.on('filterChanged', function () {
            var agencias = _.chain(instance.agencias)
                .filter(function (agencia) {
                    return agencia.ativo;
                })
                .map('id')
                .value();

            $scope.filterAgencias = agencias;
        });

        /**
         * @method marcarRota
         * @param {*} rota 
         */
        function marcarRota(rota) {
            RotasManager.desenharPoligono(rota);
            RotasManager.editar(rota);
        }

        /**
         * @method atualizarRotas
         */
        function atualizarRotas() {
            RotasService.pegarRotas()
                .then(function (rotas) {

                    $scope.rotas = _.chain(rotas.data)
                        .map(function (rota) {
                            definirAtraso(rota);
                            rota.cor = $scope.pegarCor(rota);

                            return rota;
                        })
                        .sortBy('atraso')
                        .value();
                });
        }

        /**
         * @method definirAtraso
         * @param {*} rota 
         */
        function definirAtraso(rota) {
            if (rota.RotaLeituras &&
                rota.RotaLeituras[0] &&
                rota.RotaLeituras[0].currentTime) {

                rota.atraso = ((100 * (rota.RotaLeituras[0].currentTime / rota.RotaLeituras[0].regularTime)) - 100);
            }

            return rota;
        }

        /**
         * @method pegarCor
         * @param {*} rota 
         */
        function pegarCor(rota) {
            if (rota.atraso) {

                if (rota.atraso <= 10) {
                    return '#8AC249';
                } else if (rota.atraso >= 10 && rota.atraso <= 50) {
                    return '#FFFF00';
                } else {
                    return '#F34235';
                }
            } else {
                return '#DDD';
            }
        }

        CommService.on('rotas', function (data) {
            atualizarRotas();
        });

        angular.extend($scope, {
            $apiRotas: {
                atualizarRotas: atualizarRotas
            },
            pegarCor: pegarCor,
            marcarRota: marcarRota,
            res: $scope.$root.res
        });

        MainState.registerDirective('rotas', $scope.$apiRotas);
        $scope.$on('$destroy', function () {
            MainState.unregisterDirective('rotas');
        });
        atualizarRotas();

    }

    function s4cRotas() {

        return {
            restrict: 'E',
            templateUrl: 'app/directives/rotas/rotas.html',
            controller: rotasCtrl
        };
    }

    function SalvarRotaCtrl($scope, $mdDialog, MapaService, MainState, RotasManager, waypoints, toasty, Departamento, localize, res) {
        $scope.res = res;
        var user = MainState.getManager('UserInfo');

        $scope.agencias = [];

        Departamento.getAgencias()
            .then(function (agencias) {
                $scope.agencias = agencias;
            });

        $scope.formRota = {};

        $scope.rota = {
            DepartamentoId: user.Departamento.id
        };

        $scope.$watch('rota.nome', function (newVal, oldVal) {
            if (newVal && newVal.length > 0) {
                if ($scope.formRota.nome) {
                    $scope.formRota.nome.error.required = false;
                    $scope.formRota.nome.touch = false;
                }
            }
        });

        /**
         * @method saveRota
         */
        $scope.saveRota = function (rotaOpts) {

            if (!rotaOpts.hasOwnProperty('nome') || rotaOpts.nome.length === 0) {
                $scope.formRota = {
                    nome: {
                        touched: true,
                        error: {
                            required: true
                        }
                    }
                };

                return false;
            }

            RotaService.salvarRota({
                nome: rotaOpts.nome,
                descricao: rotaOpts.descricao,
                origem: rotaOpts.origem,
                destino: rotaOpts.destino,
                publico: rotaOpts.publico,
                trechos: waypoints,
                DepartamentoId: rotaOpts.DepartamentoId || user.Departamento.id
            }).then(function (obj) {
                RotasManager.fechar();
                $mdDialog
                    .show($mdDialog.alert()
                        .title('Sucesso.')
                        .content('Rota criada com sucesso.')
                        .ok('OK'));
                var rotas = MainState.getDirective('rotas');
                if (rotas) {
                    rotas.atualizarRotas();
                    console.log(rotaOpts.DepartamentoId);
                }
            }, function (err) {
                toasty({
                    msg: 'Ocorreu um erro ao salvar a rota'
                });
            });
        };

        $scope.closeRota = function () {
            $mdDialog.hide();
        };
    }

    angular.module('s4c.components.rotas')
        .directive('s4cRotas', s4cRotas)
        .controller('SalvarRotaCtrl', ['$scope', '$mdDialog', 'MapaService', 'MainState', 'RotasManager', 'waypoints', 'toasty', 'Departamento', 'localize', 'res', SalvarRotaCtrl]);

}());