Source: components/admin/controllers/usuarios_grupos_perfis.controller.js

/**
 * @ngdoc controllers
 * @name UsuarioGrupoUsuariosPerfil
 * @module s4c.components.admin.controllers.UsuarioGrupoUsuariosPerfil
 *
 * @description
 * `AdminUsuarioGrupoUsuariosPerfilCtrl` Controller da tela de integração de Grupo de Usuários e Perfis do módulo de administração
 * 
 * 
 */
(function () {
    'use strict';

    function AdminUsuarioGrupoUsuariosPerfilCtrl($scope, $http, $q, $mdDialog, API_ENDPOINT,
        Usuario, GrupoUsuarios, PermissaoAcesso, Perfil, Base, localize, FileUploader, MainService, $filter, PermissoesService, MainState) {

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

            $scope.nomeExists = false;

            var perfis = angular.copy($scope.perfis);
            _.remove(perfis, { id: $scope.perfilSelecionado.id });

            if (_.includes(_.map(perfis, 'nome'), $scope.perfilSelecionado.nome)) {
                $scope.nomeExists = true;
            }

            if ($scope.nomeExists) {
                $mdDialog.show($mdDialog.alert()
                    .title($scope.res('COMUM_ERRO'))
                    .content($scope.res('PERFIL_NOME_EXISTENTE'))
                    .ok($scope.res('COMUM_OK')));

                return;
            }

            delete $scope.perfilSelecionado.PermissaoAcessos;
            $scope.perfilSelecionado.permissaoAcessos = _.filter($scope.permissoesAcesso, 'val');
            if (!$scope.perfilSelecionado || (!$scope.perfilSelecionado.nome || _.isEmpty($scope.perfilSelecionado.nome))) {

                $mdDialog.show($mdDialog.alert()
                    .title($scope.res('COMUM_ERRO'))
                    .content($scope.res('COMUM_FAVOR_INSERIR_NOME'))
                    .ok($scope.res('COMUM_OK')));

            }
            else {

                $scope.perfilSelecionado.GrupoUsuarioId = $scope.grupoUsuariosSelecionado.id;
                Perfil.crud().save($scope.perfilSelecionado)
                    .$promise.then(function (perfil) {
                        PermissoesService.atualizarPermissoes($scope.perfilSelecionado);
                        popularPerfis();
                        $mdDialog.show($mdDialog.alert()
                            .title($scope.res('COMUM_SUCESSO'))
                            .content($scope.res('PERFIL_SALVOCOMSUCESSO'))
                            .ok($scope.res('COMUM_OK')));

                        $scope.editandoPerfil = false;
                        $scope.perfilSelecionado = undefined;

                    });
            }
        }

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

            $scope.nomeExists = false;

            var grupos = angular.copy($scope.grupoUsuarios);
            _.remove(grupos, { id: $scope.grupoUsuariosSelecionado.id });

            if (_.includes(_.map(grupos, 'nome'), $scope.grupoUsuariosSelecionado.nome)) {
                $scope.nomeExists = true;
            }

            if (!$scope.nomeExists) {

                if (!$scope.grupoUsuariosSelecionado || (!$scope.grupoUsuariosSelecionado.nome || _.isEmpty($scope.grupoUsuariosSelecionado.nome))) {

                    $mdDialog.show($mdDialog.alert()
                        .title($scope.res('COMUM_ERRO'))
                        .content($scope.res('COMUM_FAVOR_INSERIR_NOME'))
                        .ok($scope.res('COMUM_OK')));

                }
                else {

                    GrupoUsuarios.save($scope.grupoUsuariosSelecionado)
                        .$promise.then(function (grupoUsuarios) {
                            popularGrupoUsuarios();
                            $mdDialog.show($mdDialog.alert()
                                .title($scope.res('COMUM_SUCESSO'))
                                .content($scope.res('COMUM_GRUPO') + ' ' + $scope.res('COMUM_MENSAGEM_SALVOCOMSUCESSO'))
                                .ok($scope.res('COMUM_OK')));

                            $scope.editandoGrupo = false;
                        });
                }

            } else {

                $mdDialog.show($mdDialog.alert()
                    .title($scope.res('COMUM_ERRO'))
                    .content($scope.res('GRUPO_NOME_EXISTENTE'))
                    .ok($scope.res('COMUM_OK')));
            }
        }


        /**
         * @method novoGrupoUsuarios
         */
        function novoGrupoUsuarios() {
            $scope.editandoPerfil = false;
            $scope.editandoGrupo = true;
            $scope.grupoUsuariosSelecionado = {};
        }

        /**
         * @method novoPerfil
         */
        function novoPerfil() {
            $scope.editandoPerfil = true;
            $scope.editandoGrupo = false;
            $scope.perfilSelecionado = {};

            _.each($scope.modulos, function (modulo) {
                $scope.todasPublicas[modulo] = false;

            });

            $scope.checked = false;

            $scope.permissoesAcesso = _.map($scope.permissoesAcesso, function (permissao) {

                permissao.val = false;
                return permissao;

            });
            $scope.usuarios = [];
        }

        /**
         * @method deletePerfil
         */
        function deletePerfil(event, perfil) {
            var confirm = $mdDialog.confirm()
                .title($scope.res('PERFIL_MENSAGEM_CONFIRMACAODELECAO') + ' ' + perfil.nome + ' ?')
                .content($scope.res('COMUM_MENSAGEM_ACAOIRREVERSIVEL'))
                .ariaLabel($scope.res('COMUM_DELETAR') + ' ' + $scope.res('COMUM_PERFIL_SINGULAR'))
                .ok($scope.res('COMUM_SIM'))
                .cancel($scope.res('COMUM_CANCELAR'))
                .targetEvent(event);

            $mdDialog.show(confirm).then(function () {
                Perfil.crud().delete({
                    id: perfil.id
                })
                    .$promise.then(function () {

                        $scope.perfisSelecionados.splice($scope.perfisSelecionados.indexOf(perfil), 1);

                        if ($scope.perfilSelecionado && $scope.perfilSelecionado.id == perfil.id) {
                            $scope.perfilSelecionado = undefined;
                        }


                    });
            }, function () {
            });
        }

        /**
         * @method editGrupoUsuarios
         */
        function editGrupoUsuarios(grupo) {
            $scope.editandoPerfil = false;
            $scope.editandoGrupo = true;
            $scope.grupoUsuariosSelecionado = angular.copy(grupo);
        }

        /**
         * @method editarPerfil
         * @param {*} perfil 
         */
        function editarPerfil(perfil) {
            selecionarPerfil(perfil);
            $scope.editandoPerfil = true;
            $scope.editandoGrupo = false;
            $scope.perfilSelecionado = angular.copy(perfil);
        }

        /**
         * @method deleteGrupoUsuarios
         * 
         * @param {*} event 
         * @param {*} grupoUsuarios 
         */
        function deleteGrupoUsuarios(event, grupoUsuarios) {
            var confirm = $mdDialog.confirm()
                .title($scope.res('GRUPO_MENSAGEM_CONFIRMACAODELECAO') + ' ' + grupoUsuarios.nome + ' ?')
                .content($scope.res('COMUM_MENSAGEM_ACAOIRREVERSIVEL'))
                .ariaLabel($scope.res('COMUM_DELETAR') + ' ' + $scope.res('GRUPOUSUARIO_TITULO'))
                .ok($scope.res('COMUM_SIM'))
                .cancel($scope.res('COMUM_CANCELAR'))
                .targetEvent(event);

            $mdDialog.show(confirm).then(function () {
                var promises = [];

                $q.all(promises)
                    .then(function () {
                        GrupoUsuarios.delete({
                            id: grupoUsuarios.id
                        })
                            .$promise.then(function () {

                                $scope.gruposSelecionados.splice($scope.gruposSelecionados.indexOf(grupoUsuarios), 1);
                                $scope.grupoUsuarios.splice($scope.grupoUsuarios.indexOf(grupoUsuarios), 1);

                                if ($scope.grupoUsuariosSelecionado && $scope.grupoUsuariosSelecionado.id == grupoUsuarios.id) {
                                    $scope.grupoUsuariosSelecionado = undefined;
                                    $scope.perfilSelecionado = false;
                                }
                            })
                    }, function (err) {
                        alert($scope.res('COMUM_HOUVEUMERROAODELETAR') + ' ' + $scope.res("COMUM_GRUPO") + '. ' + $scope.res('COMUM_DEVEHAVERUSUARIOSOUPERMISSOESVINCULADAS'));
                    });

            }, function (err) {
                console.log(err);
            });
        }

        /**
         * @method isLdapLogin
         */
        function isLdapLogin() {
            Base.obter('ldap/authenticatedUser').then(function (response) {
                if (response.ldapAuthenticatedUser != null && response.ldapAuthenticatedUser) {
                    $scope.isLdapAuthenticatedUser = true;
                } else {
                    $scope.isLdapAuthenticatedUser = false;
                }
            });
        }

        $scope.gruposSelecionados = [];
        /**
         * @method popularGrupoUsuarios
         */
        function popularGrupoUsuarios() {
            var deferred = $q.defer();

            $http.get(API_ENDPOINT + 'grupo_usuarios/adm')
                .then(function (responseGruposUsuarios) {
                    if (typeof responseGruposUsuarios.data === 'object') {
                        $scope.grupoUsuarios = _.map(responseGruposUsuarios.data, function (grupoUsuarios) {
                            return {
                                id: grupoUsuarios.id,
                                nome: grupoUsuarios.nome
                            };
                        });

                        $scope.gruposSelecionados = angular.copy($scope.grupoUsuarios);
                    } else {
                        return deferred.reject(responseGruposUsuarios.data);
                    }
                }, function (responseGruposUsuarios) {
                    return deferred.reject(responseGruposUsuarios.data);
                });

            return deferred.promise;
        }

        $scope.perfisSelecionados = [];
        /**
         * @method popularPerfis
         * @param {*} event 
         */
        function popularPerfis(event) {
            var deferred = $q.defer();

            var url = $scope.grupoUsuariosSelecionado ? 'perfil/grupo_usuario/' + $scope.grupoUsuariosSelecionado.id : 'perfil/';

            $http.get(API_ENDPOINT + url)
                .then(function (response) {
                    if (typeof response.data === 'object') {
                        $scope.perfis = _.map(response.data, function (perfil) {
                            if ($scope.grupoUsuariosSelecionado) {
                                response.data = _.filter(response.data, function (perfil) {
                                    return perfil.GrupoUsuarioId == $scope.grupoUsuariosSelecionado.id;
                                })
                            }
                            return {
                                id: perfil.id,
                                nome: perfil.nome,
                                descricao: perfil.descricao,
                                val: false,
                                PermissaoAcessos: perfil.PermissaoAcessos,
                                grupoUsuarioId: perfil.GrupoUsuarioId,
                                usuarios: _.chain(perfil.Usuarios)
                                    .filter(function (usuario) {
                                        if (usuario.ativo)
                                            return usuario;
                                    })
                                    .map(function (usuario) {
                                        return {
                                            id: usuario.id,
                                            nome: usuario.nome,
                                            GruposUsuarioIds: _.map(usuario.GrupoUsuarios, 'id')
                                        }
                                    })
                                    .value()
                            };
                        });

                        $scope.perfisSelecionados = $scope.perfis;
                        deferred.resolve();
                    } else {
                        return deferred.reject(response.data);
                    }
                }, function (response) {
                    return deferred.reject(response.data);
                });

            return deferred.promise;
        }

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

            if ($scope.perfilSelecionado == undefined) {

                $scope.perfilSelecionado = perfil;
                perfil.val = true;

            }
            else {

                if (perfil !== $scope.perfilSelecionado) {

                    $scope.perfilSelecionado.val = false;
                    $scope.perfilSelecionado = perfil;
                    perfil.val = true;

                }
                else {

                    if (perfil.val == false) {
                        perfil.val == true;
                        $scope.perfilSelecionado.val = true;
                    }
                    else {
                        $scope.perfilSelecionado.val = false;
                        $scope.perfilSelecionado = undefined;
                        perfil.val = false;
                    }
                }

            }

            carregarUsuarios(perfil);
            organizarPermissoesAcesso();
        }

        $scope.usuarios = [];
        /**
         * @method carregarUsuarios
         * @param {*} perfil 
         */
        function carregarUsuarios(perfil) {

            var deferred = $q.defer();
            var url = 'usuarios/perfil/' + perfil.id;

            $http.get(API_ENDPOINT + url)
                .then(function (response) {
                    if (typeof response.data === 'object') {

                        $scope.usuarios = response.data;
                        deferred.resolve();
                    } else {
                        return deferred.reject(response.data);
                    }
                }, function (response) {
                    return deferred.reject(response.data);
                });

            return deferred.promise;
        }

        /**
         * @method selecionarGrupoUsuarios
         * @param {*} grupoUsuarios 
         */
        function selecionarGrupoUsuarios(grupoUsuarios) {

            $scope.editandoPerfil = false;
            $scope.editandoGrupo = false;
            $scope.perfilSelecionado = undefined;

            if ($scope.grupoUsuariosSelecionado === undefined) {
                $scope.grupoUsuariosSelecionado = $scope.grupoUsuarios[0];
                $scope.grupoUsuariosSelecionado.val = true;
            }

            if (grupoUsuarios !== $scope.grupoUsuariosSelecionado) {
                $scope.grupoUsuariosSelecionado.val = false;
                $scope.grupoUsuariosSelecionado = grupoUsuarios;
                grupoUsuarios.val = true;
            }

            popularPerfis();
        }

        $scope.textoBuscaGrupo;
        /**
         * @method executeSearchGrupo
         */
        function executeSearchGrupo() {

            $scope.gruposSelecionados = [];
            if (!$scope.textoBuscaGrupo || $scope.textoBuscaGrupo.length == 0) {
                $scope.gruposSelecionados = angular.copy($scope.grupoUsuarios);
                return;
            }

            var texto = $filter('latinize')($scope.textoBuscaGrupo.toLowerCase());

            angular.forEach($scope.grupoUsuarios, function (grupo) {

                var nome = $filter('latinize')(grupo.nome.toLowerCase());

                if (nome.indexOf(texto) !== -1) {
                    $scope.gruposSelecionados.push(grupo);
                }
            });

        }

        $scope.textoBuscaPerfil;
        /**
         * @method executeSearchPerfil
         */
        function executeSearchPerfil() {

            $scope.perfisSelecionados = [];
            if (!$scope.textoBuscaPerfil || $scope.textoBuscaPerfil.length == 0) {
                $scope.perfisSelecionados = angular.copy($scope.perfis);
                return;
            }

            var texto = $filter('latinize')($scope.textoBuscaPerfil.toLowerCase());

            angular.forEach($scope.perfis, function (perfil) {

                var nome = $filter('latinize')(perfil.nome.toLowerCase());

                if (nome.indexOf(texto) !== -1) {
                    $scope.perfisSelecionados.push(perfil);
                }
            });

        }

        /**
         * @method popularPermissoesAcesso
         */
        function popularPermissoesAcesso() {
            PermissaoAcesso.query()
                .$promise
                .then(function (permissoesAcesso) {

                    permissoesAcesso = _.filter(permissoesAcesso, function (perm) {
                        return isNotInABlackList(perm);
                    });

                    $scope.permissoesPublicas = _.filter(permissoesAcesso, function (perm) { return perm.tipoPermissao != 'Extra'; });
                    $scope.permissoesExtras = _.filter(permissoesAcesso, function (perm) { return perm.tipoPermissao == 'Extra'; });

                    translateNames($scope.permissoesPublicas);
                    translateNames($scope.permissoesExtras);

                    $scope.tiposPermissao = _.uniq(_.map(permissoesAcesso, 'tipoPermissao'), false);
                    $scope.modulos = _.uniq(_.map($scope.permissoesPublicas, 'modulo'), false);
                    $scope.modulosExtra = _.uniq(_.map($scope.permissoesExtras, 'modulo'), false);

                    $scope.permissoesAcesso = permissoesAcesso.concat($scope.permissoesExtras);
                    organizarPermissoesAcesso();
                });
        }

        /**
         * @method translateNames
         * @param {*} names 
         */
        function translateNames(names) {

            for (var index in names) {

                switch (names[index].modulo) {
                    case 'Briefing':
                        names[index].modulo = $scope.res('TITULO_BRIEFING');
                        break;
                    case 'Incidentes':
                        names[index].modulo = $scope.res('INCIDENTES_TITULO');
                        break;
                    case 'Base de Conhecimento':
                        names[index].modulo = $scope.res('BASECONHECIMENTO_TITULO_PLURAL');
                        break;
                    case 'Planejamento':
                        names[index].modulo = $scope.res('Planejamento');
                        break;
                    case 'Zona de Observação':
                        names[index].modulo = $scope.res('ZONAOBSERVACAO_TITULO');
                        break;
                    case 'Rota':
                        names[index].modulo = $scope.res('Rota');
                        break;
                    case 'Pontos de Interesse':
                        names[index].modulo = $scope.res('PONTOSDEINTERESSE_TITULO');
                        break;
                    default:
                        break;
                }
            }

        }

        /**
         * @method isNotInABlackList
         * 
         * @param {*} o 
         */
        function isNotInABlackList(o) {
            if (o.modulo == 'Zona de Observação' && !MainState.isToShow('zona_mapa')) {
                return false;
            }
            if (o.modulo == 'Incidentes' && !MainState.isToShow('incidentes_mapa')) {
                return false;
            }
            if (o.modulo == 'Base de Conhecimento' && !MainState.isToShow('base_mapa')) {
                return false;
            }
            if (o.modulo == 'Planejamento' && !MainState.isToShow('planejamento_mapa')) {
                return false;
            }
            if (o.modulo == 'Rota' && !MainState.isToShow('rota_mapa')) {
                return false;
            }
            return true;
        }

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

            if (!$scope.perfilSelecionado) {
                return;
            }

            $scope.permissoesAcesso = _.map($scope.permissoesAcesso, function (permissao) {

                if (_.find($scope.perfilSelecionado.PermissaoAcessos, {
                    'id': permissao.id
                })) {
                    permissao.val = true;
                    return permissao;
                }

                permissao.val = false;
                return permissao;

            });

            $scope.permissoesPublicasPerfil = _.filter($scope.permissoesAcesso, function (o) { return _.includes(o.descricao, 'blic') });
            $scope.permissoesExtrasPerfil = _.filter($scope.permissoesAcesso, function (o) { return o.tipoPermissao == 'Extra'; });

            $scope.todasPublicas = [];

            _.each($scope.modulos, function (modulo) {
                $scope.todasPublicas[modulo] = false;

            });

        }

        $scope.checked = true;
        /**
         * @method marcarTodas
         */
        function marcarTodas() {

            _.each($scope.permissoesPublicas, function (permissao) {
                permissao.val = angular.copy($scope.checked);
            });

            _.each($scope.permissoesExtras, function (permissao) {
                permissao.val = angular.copy($scope.checked);
            });

            $scope.todasPublicas['Planejamento'] = angular.copy($scope.checked);
            $scope.checked = !$scope.checked;
        }

        $scope.cancelado = true;
        $scope.editandoPerfil = false;
        $scope.editandoGrupo = false;
        /**
         * @method cancelar
         */
        function cancelar() {

            $scope.cancelado = true;
            $scope.editandoPerfil = false;
            $scope.editandoGrupo = false;

        }

        /**
         * @method deleteUsuarioFromPerfil
         * @param {*} usuario 
         */
        function deleteUsuarioFromPerfil(usuario) {

            var confirm = $mdDialog.confirm()
                .title($scope.res('COMUM_CONFIRMACAO'))
                .content($scope.res('COMUM_MENSAGEMCONFIRMACAOREMOVERDOPERFIL') + ' ' + usuario.nome + '?')
                .ariaLabel($scope.res('COMUM_CONFIRMACAO'))
                .ok($scope.res('COMUM_SIM'))
                .cancel($scope.res('COMUM_NAO'));

            $mdDialog.show(confirm)
                .then(function () {
                    Usuario.removeFromProfile(usuario.id, $scope.perfilSelecionado.id).then(function () {

                        $mdDialog
                            .show($mdDialog.alert()
                                .title($scope.res('COMUM_SUCESSO'))
                                .content($scope.res('REMOVER_USUARIO_SUCESSO'))
                                .ok($scope.res('COMUM_OK')));

                        $scope.usuarios.splice($scope.usuarios.indexOf(usuario), 1);
                    });
                });
        }

        popularPermissoesAcesso();

        angular.extend($scope, {
            selecionarGrupoUsuarios: selecionarGrupoUsuarios,
            selecionarPerfil: selecionarPerfil,
            novoGrupoUsuarios: novoGrupoUsuarios,
            editGrupoUsuarios: editGrupoUsuarios,
            deleteGrupoUsuarios: deleteGrupoUsuarios,
            novoPerfil: novoPerfil,
            deletePerfil: deletePerfil,
            executeSearchPerfil: executeSearchPerfil,
            executeSearchGrupo: executeSearchGrupo,
            marcarTodas: marcarTodas,
            cancelar: cancelar,
            deleteUsuarioFromPerfil: deleteUsuarioFromPerfil,
            salvarGrupo: salvarGrupo,
            salvarPerfil: salvarPerfil,
            editarPerfil: editarPerfil
        });

        popularGrupoUsuarios();

        isLdapLogin();
    }

    AdminUsuarioGrupoUsuariosPerfilCtrl.$inject = [
        '$scope',
        '$http',
        '$q',
        '$mdDialog',
        'API_ENDPOINT',
        'Usuario',
        'GrupoUsuarios',
        'PermissaoAcesso',
        'Perfil',
        'Base',
        'localize',
        'FileUploader',
        'MainService',
        '$filter',
        'PermissoesService',
        'MainState'
    ];

    angular.module('s4c.controllers.AdminUsuarioGrupoUsuariosPerfilCtrl', [
        'ngMaterial',
        's4c.services.Usuario',
        's4c.services.GrupoUsuarios'
    ])
        .controller('AdminUsuarioGrupoUsuariosPerfilCtrl', AdminUsuarioGrupoUsuariosPerfilCtrl);

}());