Source: services/Permissoes.service.js

    /**
     * @ngdoc service
     * @name Permissoes.Service
     * @module s4c.services.Permissoes.Service
     * 
     * @description  Componente para acesso a api do backend e/ou comunicação entre controllers
     * 
     *
     */  
     
(function () {

    angular.module('s4c.services.PermissoesService', [])
        .factory('PermissoesService', PermissoesService);

   /**	
	* @method PermissoesService
	* @param {*} $http
	* @param {*} $q
	* @param {*} PERMISSOES_ENUM
	* @param {*} AuthService
	* @param {*} CamadasService
	* @param {*} MainState
	*/
    function PermissoesService(
        AuthService,
        PERMISSOES_ENUM,
        $q,
        $http,
        CamadasService,
        MainState
    ) {

        var service = {};

  	   /**	
		* @method getPermissoes
		*/
        function getPermissoes() {

            var p = $q.defer();

            service.permissoesVisualizacao = {
                baseConhecimentoPublica: false,
                planejamentoPublico: false,
                rotaPublica: false,
                zonaObservacaoPublica: false,
                presetPublico: false
            };

            service.permissoesCriacao = {
                baseConhecimentoPublica: false,
                planejamentoPublico: false,
                rotaPublica: false,
                zonaObservacaoPublica: false,
                presetPublico: false,
                arquivoPublico: false
            };

            service.permissoesEdicao = {
                baseConhecimentoPublica: false,
                planejamentoPublico: false,
                rotaPublica: false,
                zonaObservacaoPublica: false,
                presetPublico: false
            };

            service.permissoesRemocao = {
                baseConhecimentoPublica: false,
                planejamentoPublico: false,
                rotaPublica: false,
                zonaObservacaoPublica: false,
                presetPublico: false,
                arquivoPublico: false
            };

            service.permissoesExtras = {
                responderBriefing: false,
                salaDeBriefing: false,
                adicionarPresetAgencia: false,
                adicionarNota: false,
                adicionarArquivo: false,
                removerArquivo: false,
                removerIncidente: false
            };

            AuthService.getUserInfo().then(function (userInfo) {

                service.permissoesNums = [];

                _.each(userInfo.Perfils, function (perfil) {

                    service.permissoesNums = service.permissoesNums.concat(_.map(perfil.PermissaoAcessos, 'numero'));

                });

                if (service.permissoesNums.length > 0) {

                    service.permissoesVisualizacao.baseConhecimentoPublica = _.includes(service.permissoesNums, PERMISSOES_ENUM.VISUALIZAR_BASE_CONHECIMENTO_PUBLICA);
                    service.permissoesVisualizacao.planejamentoPublico = _.includes(service.permissoesNums, PERMISSOES_ENUM.VISUALIZAR_PLANEJAMENTO_PUBLICO);
                    service.permissoesVisualizacao.rotaPublica = _.includes(service.permissoesNums, PERMISSOES_ENUM.VISUALIZAR_ROTA_PUBLICA);
                    service.permissoesVisualizacao.zonaObservacaoPublica = _.includes(service.permissoesNums, PERMISSOES_ENUM.VISUALIZAR_ZONA_OBSERVACAO_PUBLICA);
                    service.permissoesVisualizacao.presetPublico = _.includes(service.permissoesNums, PERMISSOES_ENUM.VISUALIZAR_PRESET_PUBLICO);

                    service.permissoesCriacao.baseConhecimentoPublica = _.includes(service.permissoesNums, PERMISSOES_ENUM.CRIAR_BASE_CONHECIMENTO_PUBLICA);
                    service.permissoesCriacao.planejamentoPublico = _.includes(service.permissoesNums, PERMISSOES_ENUM.CRIAR_PLANEJAMENTO_PUBLICO);
                    service.permissoesCriacao.rotaPublica = _.includes(service.permissoesNums, PERMISSOES_ENUM.CRIAR_ROTA_PUBLICA);
                    service.permissoesCriacao.zonaObservacaoPublica = _.includes(service.permissoesNums, PERMISSOES_ENUM.CRIAR_ZONA_OBSERVACAO_PUBLICA);
                    service.permissoesCriacao.presetPublico = _.includes(service.permissoesNums, PERMISSOES_ENUM.CRIAR_PRESET_PUBLICO);

                    service.permissoesEdicao.baseConhecimentoPublica = _.includes(service.permissoesNums, PERMISSOES_ENUM.EDITAR_BASE_CONHECIMENTO_PUBLICA);
                    service.permissoesEdicao.planejamentoPublico = _.includes(service.permissoesNums, PERMISSOES_ENUM.EDITAR_PLANEJAMENTO_PUBLICO);
                    service.permissoesEdicao.rotaPublica = _.includes(service.permissoesNums, PERMISSOES_ENUM.EDITAR_ROTA_PUBLICA);
                    service.permissoesEdicao.zonaObservacaoPublica = _.includes(service.permissoesNums, PERMISSOES_ENUM.EDITAR_ZONA_OBSERVACAO_PUBLICA);
                    service.permissoesEdicao.presetPublico = _.includes(service.permissoesNums, PERMISSOES_ENUM.EDITAR_PRESET_PUBLICO);

                    service.permissoesRemocao.baseConhecimentoPublica = _.includes(service.permissoesNums, PERMISSOES_ENUM.REMOVER_BASE_CONHECIMENTO_PUBLICA);
                    service.permissoesRemocao.planejamentoPublico = _.includes(service.permissoesNums, PERMISSOES_ENUM.REMOVER_PLANEJAMENTO_PUBLICO);
                    service.permissoesRemocao.rotaPublica = _.includes(service.permissoesNums, PERMISSOES_ENUM.REMOVER_ROTA_PUBLICA);
                    service.permissoesRemocao.zonaObservacaoPublica = _.includes(service.permissoesNums, PERMISSOES_ENUM.REMOVER_ZONA_OBSERVACAO_PUBLICA);
                    service.permissoesRemocao.presetPublico = _.includes(service.permissoesNums, PERMISSOES_ENUM.REMOVER_PRESET_PUBLICO);

                    service.permissoesCriacao.arquivoPublico = _.includes(service.permissoesNums, PERMISSOES_ENUM.ADICIONAR_ARQUIVO_PUBLICO);
                    service.permissoesRemocao.arquivoPublico = _.includes(service.permissoesNums, PERMISSOES_ENUM.REMOVER_ARQUIVO_PUBLICO);

                    service.permissoesExtras.responderBriefing = _.includes(service.permissoesNums, PERMISSOES_ENUM.RESPONDER_BRIEFING);
                    service.permissoesExtras.salaDeBriefing = _.includes(service.permissoesNums, PERMISSOES_ENUM.SALA_DE_BRIEFING);
                    service.permissoesExtras.alterarPresetAgencia = _.includes(service.permissoesNums, PERMISSOES_ENUM.ALTERAR_PRESET_AGENCIA);
                    service.permissoesExtras.removerIncidente = _.includes(service.permissoesNums, PERMISSOES_ENUM.REMOVER_INCIDENTE);
                    service.permissoesExtras.adicionarNota = _.includes(service.permissoesNums, PERMISSOES_ENUM.ADICIONAR_NOTA);
                    service.permissoesExtras.adicionarArquivo = _.includes(service.permissoesNums, PERMISSOES_ENUM.ADICIONAR_ARQUIVO);
                    service.permissoesExtras.removerArquivo = _.includes(service.permissoesNums, PERMISSOES_ENUM.REMOVER_ARQUIVO);
                }

                p.resolve(service);

            });

            return p.promise;
        }

  	   /**	
		* @method atualizarPermissoes
		* @param {*} perfil
		*/
        function atualizarPermissoes(perfil) {

            var p = $q.defer();

            service.permissoesVisualizacao = {
                baseConhecimentoPublica: false,
                planejamentoPublico: false,
                rotaPublica: false,
                zonaObservacaoPublica: false,
                presetPublico: false
            };

            service.permissoesCriacao = {
                baseConhecimentoPublica: false,
                planejamentoPublico: false,
                rotaPublica: false,
                zonaObservacaoPublica: false,
                presetPublico: false,
                arquivoPublico: false
            };

            service.permissoesEdicao = {
                baseConhecimentoPublica: false,
                planejamentoPublico: false,
                rotaPublica: false,
                zonaObservacaoPublica: false,
                presetPublico: false
            };

            service.permissoesRemocao = {
                baseConhecimentoPublica: false,
                planejamentoPublico: false,
                rotaPublica: false,
                zonaObservacaoPublica: false,
                presetPublico: false,
                arquivoPublico: false
            };

            service.permissoesExtras = {
                responderBriefing: false,
                salaDeBriefing: false,
                adicionarPresetAgencia: false,
                adicionarNota: false,
                adicionarArquivo: false,
                removerArquivo: false,
                removerIncidente: false
            };


            service.permissoesNums = [];

            service.permissoesNums = service.permissoesNums.concat(_.map(perfil.permissaoAcessos, 'numero'));

            if (service.permissoesNums.length > 0) {

                service.permissoesVisualizacao.baseConhecimentoPublica = _.includes(service.permissoesNums, PERMISSOES_ENUM.VISUALIZAR_BASE_CONHECIMENTO_PUBLICA);
                service.permissoesVisualizacao.planejamentoPublico = _.includes(service.permissoesNums, PERMISSOES_ENUM.VISUALIZAR_PLANEJAMENTO_PUBLICO);
                service.permissoesVisualizacao.rotaPublica = _.includes(service.permissoesNums, PERMISSOES_ENUM.VISUALIZAR_ROTA_PUBLICA);
                service.permissoesVisualizacao.zonaObservacaoPublica = _.includes(service.permissoesNums, PERMISSOES_ENUM.VISUALIZAR_ZONA_OBSERVACAO_PUBLICA);
                service.permissoesVisualizacao.presetPublico = _.includes(service.permissoesNums, PERMISSOES_ENUM.VISUALIZAR_PRESET_PUBLICO);

                service.permissoesCriacao.baseConhecimentoPublica = _.includes(service.permissoesNums, PERMISSOES_ENUM.CRIAR_BASE_CONHECIMENTO_PUBLICA);
                service.permissoesCriacao.planejamentoPublico = _.includes(service.permissoesNums, PERMISSOES_ENUM.CRIAR_PLANEJAMENTO_PUBLICO);
                service.permissoesCriacao.rotaPublica = _.includes(service.permissoesNums, PERMISSOES_ENUM.CRIAR_ROTA_PUBLICA);
                service.permissoesCriacao.zonaObservacaoPublica = _.includes(service.permissoesNums, PERMISSOES_ENUM.CRIAR_ZONA_OBSERVACAO_PUBLICA);
                service.permissoesCriacao.presetPublico = _.includes(service.permissoesNums, PERMISSOES_ENUM.CRIAR_PRESET_PUBLICO);

                service.permissoesEdicao.baseConhecimentoPublica = _.includes(service.permissoesNums, PERMISSOES_ENUM.EDITAR_BASE_CONHECIMENTO_PUBLICA);
                service.permissoesEdicao.planejamentoPublico = _.includes(service.permissoesNums, PERMISSOES_ENUM.EDITAR_PLANEJAMENTO_PUBLICO);
                service.permissoesEdicao.rotaPublica = _.includes(service.permissoesNums, PERMISSOES_ENUM.EDITAR_ROTA_PUBLICA);
                service.permissoesEdicao.zonaObservacaoPublica = _.includes(service.permissoesNums, PERMISSOES_ENUM.EDITAR_ZONA_OBSERVACAO_PUBLICA);
                service.permissoesEdicao.presetPublico = _.includes(service.permissoesNums, PERMISSOES_ENUM.EDITAR_PRESET_PUBLICO);

                service.permissoesRemocao.baseConhecimentoPublica = _.includes(service.permissoesNums, PERMISSOES_ENUM.REMOVER_BASE_CONHECIMENTO_PUBLICA);
                service.permissoesRemocao.planejamentoPublico = _.includes(service.permissoesNums, PERMISSOES_ENUM.REMOVER_PLANEJAMENTO_PUBLICO);
                service.permissoesRemocao.rotaPublica = _.includes(service.permissoesNums, PERMISSOES_ENUM.REMOVER_ROTA_PUBLICA);
                service.permissoesRemocao.zonaObservacaoPublica = _.includes(service.permissoesNums, PERMISSOES_ENUM.REMOVER_ZONA_OBSERVACAO_PUBLICA);
                service.permissoesRemocao.presetPublico = _.includes(service.permissoesNums, PERMISSOES_ENUM.REMOVER_PRESET_PUBLICO);

                service.permissoesCriacao.arquivoPublico = _.includes(service.permissoesNums, PERMISSOES_ENUM.ADICIONAR_ARQUIVO_PUBLICO);
                service.permissoesRemocao.arquivoPublico = _.includes(service.permissoesNums, PERMISSOES_ENUM.REMOVER_ARQUIVO_PUBLICO);

                service.permissoesExtras.responderBriefing = _.includes(service.permissoesNums, PERMISSOES_ENUM.RESPONDER_BRIEFING);
                service.permissoesExtras.salaDeBriefing = _.includes(service.permissoesNums, PERMISSOES_ENUM.SALA_DE_BRIEFING);
                service.permissoesExtras.alterarPresetAgencia = _.includes(service.permissoesNums, PERMISSOES_ENUM.ALTERAR_PRESET_AGENCIA);
                service.permissoesExtras.removerIncidente = _.includes(service.permissoesNums, PERMISSOES_ENUM.REMOVER_INCIDENTE);
                service.permissoesExtras.adicionarNota = _.includes(service.permissoesNums, PERMISSOES_ENUM.ADICIONAR_NOTA);
                service.permissoesExtras.adicionarArquivo = _.includes(service.permissoesNums, PERMISSOES_ENUM.ADICIONAR_ARQUIVO);
                service.permissoesExtras.removerArquivo = _.includes(service.permissoesNums, PERMISSOES_ENUM.REMOVER_ARQUIVO);
            }

            AuthService.getUserInfo().then(function (userInfo) {
                _.each(userInfo.Perfils, function (perfil_) {
                    if (perfil_.id = perfil.id) {
                        perfil_.PermissaoAcessos = perfil.permissaoAcessos;
                    }
                });
            });

            p.resolve(service);



            return p.promise;
        }

  	   /**	
		* @method verificarPermissaoAreaAtuacao
		* @param {*} filtro
		*/
        function verificarPermissaoAreaAtuacao(filtro) {
            var deferred = $q.defer();

            $http.post("/permissoes/areaAtuacao", filtro)
                .then(function (result) {
                    var dto = result.data;
                    var areaAtuacaoDirective = MainState.getDirective('areaAtuacao');

                    if (!dto.temPermissao) {
                        areaAtuacaoDirective.carregarLayerAreaAtuacaoNaoPermitida(dto.regioes);
                    }
                    deferred.resolve(dto.temPermissao);

                }, function (err) {
                    deferred.reject(err);
                });

            return deferred.promise;
        }

  	   /**	
		* @method verificarPermissaoAreaAtuacaoLista
		* @param {*} filtros
		*/
        function verificarPermissaoAreaAtuacaoLista(filtros) {
            var deferred = $q.defer();

            $http.post("/permissoes/areaAtuacao/list", filtros)
                .then(function (result) {
                    var list = result.data;
                    var areaAtuacaoDirective = MainState.getDirective('areaAtuacao');
                    var regioes = [];

                    _.each(list, function (dto) {
                        if (!dto.temPermissao) {
                            //Faço isso para remover regiões repetidas
                            _.each(dto.regioes, function (regiao) {
                                if (!verificaExistenciaRegiao(regioes, regiao)) {
                                    regioes.push(regiao);
                                }
                            });
                        }
                    });

                    areaAtuacaoDirective.carregarLayerAreaAtuacaoNaoPermitida(regioes);
                    deferred.resolve(result.data);

                }, function (err) {
                    deferred.reject(err);
                });

            return deferred.promise;
        }

  	   /**	
		* @method verificaExistenciaRegiao
		* @param {*} regioes
		* @param {*} regiaoBuscar
		*/
        function verificaExistenciaRegiao(regioes, regiaoBuscar) {

            for (var i = 0; i < regioes.length; i++) {
                if (regioes[i].id == regiaoBuscar.id) {
                    return true;
                }
            }

            return false;
        }

        return {
            getPermissoes: getPermissoes,
            verificarPermissaoAreaAtuacao: verificarPermissaoAreaAtuacao,
            verificarPermissaoAreaAtuacaoLista: verificarPermissaoAreaAtuacaoLista,
            atualizarPermissoes: atualizarPermissoes
        };
    }

    PermissoesService.$inject = [
        'AuthService',
        'PERMISSOES_ENUM',
        '$q',
        '$http',
        'CamadasService',
        'MainState'
    ];

}());