/**
* @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;
}
}());