Source: directives/calendario-olimpico-filter/calendario-olimpico-filter.service.js

/**
 * @ngdoc directives
 * @name CalendarioOlimpicoFilterService
 * @module s4c.directives.CalendarioOlimpicoFilter.CalendarioOlimpicoFilterService
 *
 * @description
 * `CalendarioOlimpicoFilter` Classe de Serviço do Módulo de Filtro do Calendário Olímpico
 * 
 *
 */
(function () {
    angular.module('s4c.components.calendario')
        .factory('CalendarioOlimpicoFilter', CalendarioOlimpicoFilter);

    function CalendarioOlimpicoFilter() {

        var service = {
            _filtros: {},
            getInstance: getInstance,
            limparFiltros: limparFiltros
        };

       /**
        * Obter instância  
        *
        * @method getInstance
		*        
        * @param id {Integer} Identificador
		*               
        */ 
        function getInstance(id) {
            if (!service._filtros[id]) {
                service._filtros[id] = new Service()
            }

            return service._filtros[id];
        }

       /**
        * Limpa os filtros  
        *
        * @method limparFiltros
		*        
        * 
		*               
        */
        function limparFiltros() {
            _.each(service._filtros, function (filtro) {
                _.each(filtro.categorias, function (categoria) {
                    categoria.ativo = false;
                });
            });
        }

        function Service() {
            var self = this;

            angular.extend(self, {
                on: on,
                trigger: trigger,
                filtrarIncidente: filtrarIncidente,
                ativarCategoria: ativarCategoria,
                desativarCategoria: desativarCategoria,
                categorias: [],
                prioridades: [],
                criticidades: [],
                events: {
                    'filterChanged': []
                },
                origem: ''
            });

            function on(eventName, callback) {
                self.events[eventName].push(callback);
            }

            function trigger(eventName, args) {
                _.each(self.events[eventName], function (callback) {
                    callback(args);
                });
            }

	       /**
	        * Filtra os incidentes  
	        *
	        * @method filtrarIncidente
			*        
	        * @param incidente {Object} Incidente
			*               
	        */ 
            function filtrarIncidente(incidente) {

                if (!incidente.extras) {
                    return false;
                }

                if (incidente.extras.informacoes) {

                    var prioridade = _.find(incidente.extras.informacoes, function (informacao) {
                        return informacao.label === 'Prioridade';
                    });

                    var prioridades = _.chain(self.prioridades)
                        .filter('ativo')
                        .map('texto')
                        .value();
                    var categorias = _.chain(self.categorias)
                        .filter('ativo')
                        .map('id')
                        .value();

                    var gruposUsuarios = _.chain(self.gruposUsuarios)
                        .filter('ativo')
                        .map('id')
                        .value();

                    var contemPrioridade = !prioridade || _.includes(prioridades, prioridade.valor);
                    var contemCategoria = _.includes(categorias, incidente.CategoriaIncidenteId);
                    var contemGrupoUsuarios = !gruposUsuarios.length || _.intersection(gruposUsuarios, _.map(incidente.GruposUsuarios, 'id')).length;

                    var hoje = moment().startOf('day');
                    var dataIncidente = moment(incidente.inicio);
                    var ocorridoHoje = hoje.diff(dataIncidente, 'days') === 0;

                    return contemCategoria && contemPrioridade && ocorridoHoje && contemGrupoUsuarios;
                }

                return false;
            }

	       /**
	        * Ativa a categoria  
	        *
	        * @method ativarCategoria
			*        
	        * @param categoriaId {Object} Id da categoria
	        * @param origem {Object} Origem
			*               
	        */ 
            function ativarCategoria(categoriaId, origem) {
                var categoria = _.find(self.categorias, { id: categoriaId });

                categoria.ativo = true;
                self.origem = origem;
            }

	       /**
	        * Desativa a categoria  
	        *
	        * @method ativarCategoria
			*        
	        * @param categoriaId {Object} Id da categoria
	        * @param origem {Object} Origem
			*               
	        */ 
            function desativarCategoria(categoriaId, origem) {
                var categoria = _.find(self.categorias, { id: categoriaId });

                if (categoria)
                    categoria.ativo = false;

                self.origem = origem;
            }
        }

        return service;
    }
}());