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

/**
 * @ngdoc controllers
 * @name PermissaoAreaAtuacao
 * @module s4c.components.admin.controllers.PermissaoAreaAtuacao
 *
 * @description
 * `AdminPermissaoAreaAtuacaoCtrl` Controller da tela de Permissão de Área de Atuação do módulo de administração
 * 
 * 
 */
(function () {
    'use strict';

    AdminPermissaoAreaAtuacaoCtrl.$inject = [
        '$scope',
        '$http',
        '$mdDialog',
        'API_ENDPOINT',
        '$rootScope',
        'MainState'

    ];

    angular.module('s4c.controllers.AdminPermissaoAreaAtuacaoCtrl', [
        's4c.directives.ngFileReader'
    ])
        .controller('AdminPermissaoAreaAtuacaoCtrl', AdminPermissaoAreaAtuacaoCtrl)
        .directive('focusOn', function () {
            return function (scope, elem, attr) {
                scope.$on(attr.focusOn, function (e) {
                    elem[0].focus();
                });
            };
        });

    function AdminPermissaoAreaAtuacaoCtrl($scope, $http, $mdDialog, API_ENDPOINT, $rootScope, MainState) {

        $scope.res = $rootScope.res;
        $scope.grupoUsuarios = {};
        $scope.editar = false;
        $scope.incluirGrupo = false;
        $scope.gruposComRestricoes = [];
        $scope.gruposUsuarios = [];
        $scope.regioes = [];
        $scope.msgSalvandoHidden = true;
        carregarGruposComRestricoes();
        carregarAreas();

        /**
         * @method adicionarGrupo
         */
        function adicionarGrupo() {
            carregarGruposSemRestricoes();
            $scope.grupoUsuarioEdicao = {};
            $scope.grupoUsuarios = {};
            reiniciarObjetosPermissao();
            $scope.incluirGrupo = true;
        }

        /**
         * @method selecionaGrupoUsuario
         */
        function selecionaGrupoUsuario() {
            if (typeof $scope.grupoUsuarios === 'string' || $scope.grupoUsuarios instanceof String) {
                $scope.grupoUsuarioEdicao = JSON.parse($scope.grupoUsuarios);
            }
            else {
                $scope.grupoUsuarioEdicao = $scope.grupoUsuarios;
            }
        }

        /**
         * @method callCarregarRegioes
         * 
         */
        function callCarregarRegioes() {
            var areaAtuacao;
            if (typeof $scope.areaAtuacao === 'string' || $scope.areaAtuacao instanceof String) {
                areaAtuacao = JSON.parse($scope.areaAtuacao);
            }
            carregarRegioes(areaAtuacao.id);
        }

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

            if (!$scope.grupoUsuarioEdicao.id) {
                $mdDialog
                    .show($mdDialog.alert()
                        .title($scope.res('COMUM_AVISO'))
                        .content($scope.res('PERMISSAO_AREAATUACAO_SELECIONAR_GRUPO'))
                        .ok($scope.res('COMUM_OK')));
                return;
            }

            if (!$scope.areaAtuacao) {
                $mdDialog
                    .show($mdDialog.alert()
                        .title($scope.res('COMUM_AVISO'))
                        .content($scope.res('PERMISSAO_AREAATUACAO_SELECIONAR_AREA_ATUACAO'))
                        .ok($scope.res('COMUM_OK')));
                return;
            }

            if (!$scope.regiao) {
                $mdDialog
                    .show($mdDialog.alert()
                        .title($scope.res('COMUM_AVISO'))
                        .content($scope.res('PERMISSAO_AREAATUACAO_SELECIONAR_REGIAO'))
                        .ok($scope.res('COMUM_OK')));
                return;
            }

            $scope.permissaoAreaAtuacao = { _id: _.uniqueId() };
            var regiao;
            var areaAtuacao;

            if (typeof $scope.regiao === 'string' || $scope.regiao instanceof String) {
                regiao = JSON.parse($scope.regiao);
            }
            if (typeof $scope.areaAtuacao === 'string' || $scope.areaAtuacao instanceof String) {
                areaAtuacao = JSON.parse($scope.areaAtuacao);
            }

            if (!$scope.grupoUsuarioEdicao.permissoesAreaAtuacao) {
                $scope.grupoUsuarioEdicao.permissoesAreaAtuacao = [];
            }

            var permissaoExiste = false;
            //Verifica se a permissão já existe na lista. Caso exista não inclui e avisa o usuário
            _.each($scope.grupoUsuarioEdicao.permissoesAreaAtuacao, function (permissaoAreaAtuacao) {
                if ((permissaoAreaAtuacao.areaAtuacao.id == areaAtuacao.id && !permissaoAreaAtuacao.regiao)
                    || (permissaoAreaAtuacao.regiao && permissaoAreaAtuacao.areaAtuacao.id == areaAtuacao.id && permissaoAreaAtuacao.regiao.id == regiao.id)) {
                    permissaoExiste = true;
                }
            });

            if (permissaoExiste) {
                $mdDialog
                    .show($mdDialog.alert()
                        .title($scope.res('COMUM_AVISO'))
                        .content($scope.res('PERMISSAO_AREAATUACAO_PERMISSAO_INCLUIDA'))
                        .ok($scope.res('COMUM_OK')));
                return;
            }

            if (regiao.id > -1) {
                $scope.permissaoAreaAtuacao.regiao = regiao;
            }

            $scope.permissaoAreaAtuacao.areaAtuacao = areaAtuacao;

            if (!$scope.permissaoAreaAtuacao.objetosPermissao) {
                $scope.permissaoAreaAtuacao.objetosPermissao = [];
            }

            if ($scope.objetoIncidente) {
                var objetoPermissao = { objeto: 'CRIAR_INCIDENTE' };
                $scope.permissaoAreaAtuacao.objetosPermissao.push(objetoPermissao);
            }
            if ($scope.objetoBaseConhecimento) {
                var objetoPermissao = { objeto: 'CRIAR_BASE_CONHECIMENTO' };
                $scope.permissaoAreaAtuacao.objetosPermissao.push(objetoPermissao);
            }
            if ($scope.objetoPlanejamento) {
                var objetoPermissao = { objeto: 'CRIAR_PLANEJAMENTO' };
                $scope.permissaoAreaAtuacao.objetosPermissao.push(objetoPermissao);
            }
            if ($scope.objetoRota) {
                var objetoPermissao = { objeto: 'CRIAR_ROTA' };
                $scope.permissaoAreaAtuacao.objetosPermissao.push(objetoPermissao);
            }
            if ($scope.objetoZonaObservacao) {
                var objetoPermissao = { objeto: 'CRIAR_ZONA_OBSERVACAO' };
                $scope.permissaoAreaAtuacao.objetosPermissao.push(objetoPermissao);
            }

            $scope.grupoUsuarioEdicao.permissoesAreaAtuacao.push($scope.permissaoAreaAtuacao);
            reiniciarObjetosPermissao();
        }

        /**
         * @method deletePermissaoAreaAtuacao
         * @param {*} permissaoAreaAtuacaoExcluir 
         */
        function deletePermissaoAreaAtuacao(permissaoAreaAtuacaoExcluir) {
            var index = 0;
            var indexDelete = -1;

            _.each($scope.grupoUsuarioEdicao.permissoesAreaAtuacao, function (permissaoAreaAtuacao) {
                if (permissaoAreaAtuacao._id == permissaoAreaAtuacaoExcluir._id) {
                    indexDelete = index;
                }

                index++;
            });

            if (indexDelete > -1) {
                $scope.grupoUsuarioEdicao.permissoesAreaAtuacao.splice(indexDelete, 1);
            }
        }

        /**
         * @method editGrupoUsuariosRestricao
         * @param {*} grupoComRestricoes 
         */
        function editGrupoUsuariosRestricao(grupoComRestricoes) {

            if (typeof grupoComRestricoes === 'string' || grupoComRestricoes instanceof String) {
                grupoComRestricoes = JSON.parse(grupoComRestricoes);
            }

            if ($scope.grupoUsuarioEdicao) {
                $scope.grupoUsuarioEdicao.val = false;
            }
            grupoComRestricoes.val = true;
            $scope.grupoUsuarioEdicao = grupoComRestricoes;
            $scope.incluirGrupo = false;
            reiniciarObjetosPermissao();
        }

        /**
         * @method deleteGrupoUsuariosRestricao
         * @param {*} grupoExcluir 
         */
        function deleteGrupoUsuariosRestricao(grupoExcluir) {

            if (typeof grupoExcluir === 'string' || grupoExcluir instanceof String) {
                grupoExcluir = JSON.parse(grupoExcluir);
            }

            $http.post("/grupo_usuarios/removerRestricaoAreaAtuacao", grupoExcluir)
                .then(function (data) {
                    $mdDialog
                        .show($mdDialog.alert()
                            .title($scope.res('COMUM_SUCESSO'))
                            .content($scope.res('PERMISSAO_AREAATUACAO_EXCLUIDA'))
                            .ok($scope.res('COMUM_OK')));
                    $scope.editar = false;
                    $scope.incluirGrupo = false;
                    $scope.grupoUsuarioEdicao = {};
                    reiniciarObjetosPermissao();

                    var index = 0;
                    var indexDelete = -1;

                    _.each($scope.gruposComRestricoes, function (grupoComRestricoes) {
                        if (grupoComRestricoes._id == grupoExcluir._id) {
                            indexDelete = index;
                        }

                        index++;
                    });

                    if (indexDelete > -1) {
                        $scope.gruposComRestricoes.splice(indexDelete, 1);
                    }

                }, function (err) {
                    $mdDialog
                        .show($mdDialog.alert()
                            .title($scope.res('COMUM_ERRO'))
                            .content(err.data.message)
                            .ok($scope.res('COMUM_OK')));
                    $scope.msgSalvandoHidden = true;
                });
        }

        /**
         * @method editarPermissaoAreaAtuacao
         * @param {*} permissaoAreaAtuacao 
         */
        function editarPermissaoAreaAtuacao(permissaoAreaAtuacao) {
            if ($scope.permissaoAreaAtuacao) {
                $scope.permissaoAreaAtuacao.val = false;
            }
            permissaoAreaAtuacao.val = true;
            $scope.permissaoAreaAtuacao = permissaoAreaAtuacao;
            reiniciarObjetosPermissao();

            _.each(permissaoAreaAtuacao.objetosPermissao, function (objetoPermissao) {
                if (objetoPermissao.objeto == 'CRIAR_INCIDENTE') {
                    $scope.objetoIncidente = true;
                }
                if (objetoPermissao.objeto == 'CRIAR_BASE_CONHECIMENTO') {
                    $scope.objetoBaseConhecimento = true;
                }
                if (objetoPermissao.objeto == 'CRIAR_PLANEJAMENTO') {
                    $scope.objetoPlanejamento = true;
                }
                if (objetoPermissao.objeto == 'CRIAR_ROTA') {
                    $scope.objetoRota = true;
                }
                if (objetoPermissao.objeto == 'CRIAR_ZONA_OBSERVACAO') {
                    $scope.objetoZonaObservacao = true;
                }
            });
        }

        /**
         * @method reiniciarObjetosPermissao
         */
        function reiniciarObjetosPermissao() {
            $scope.objetoIncidente = false;
            $scope.objetoBaseConhecimento = false;
            $scope.objetoPlanejamento = false;
            $scope.objetoRota = false;
            $scope.objetoZonaObservacao = false;
        }

        $scope.disable = false;
        /**
         * @method salvar
         */
        function salvar() {

            if (!$scope.grupoUsuarioEdicao || !$scope.grupoUsuarioEdicao.permissoesAreaAtuacao) {
                $mdDialog
                    .show($mdDialog.alert()
                        .title($scope.res('COMUM_AVISO'))
                        .content($scope.res('PERMISSAO_AREAATUACAO_SELECIONAR_GRUPO'))
                        .ok($scope.res('COMUM_OK')));
                return;
            }

            if ($scope.grupoUsuarioEdicao.permissoesAreaAtuacao.length == 0) {
                $mdDialog
                    .show($mdDialog.alert()
                        .title($scope.res('COMUM_AVISO'))
                        .content($scope.res('PERMISSAO_AREAATUACAO_NAO_INFORMADA'))
                        .ok($scope.res('COMUM_OK')));
                return;
            }

            $scope.msgSalvandoHidden = false;

            $scope.permissaoAreaAtuacao.objetosPermissao = [];

            if ($scope.objetoIncidente) {
                var objetoPermissao = { objeto: 'CRIAR_INCIDENTE' };
                $scope.permissaoAreaAtuacao.objetosPermissao.push(objetoPermissao);
            }
            if ($scope.objetoBaseConhecimento) {
                var objetoPermissao = { objeto: 'CRIAR_BASE_CONHECIMENTO' };
                $scope.permissaoAreaAtuacao.objetosPermissao.push(objetoPermissao);
            }
            if ($scope.objetoPlanejamento) {
                var objetoPermissao = { objeto: 'CRIAR_PLANEJAMENTO' };
                $scope.permissaoAreaAtuacao.objetosPermissao.push(objetoPermissao);
            }
            if ($scope.objetoRota) {
                var objetoPermissao = { objeto: 'CRIAR_ROTA' };
                $scope.permissaoAreaAtuacao.objetosPermissao.push(objetoPermissao);
            }
            if ($scope.objetoZonaObservacao) {
                var objetoPermissao = { objeto: 'CRIAR_ZONA_OBSERVACAO' };
                $scope.permissaoAreaAtuacao.objetosPermissao.push(objetoPermissao);
            }

            $scope.grupoUsuarioEdicao.permissoesAreaAtuacao = [];
            $scope.grupoUsuarioEdicao.permissoesAreaAtuacao.push($scope.permissaoAreaAtuacao);

            $scope.disable = true;
            $http.post("/grupo_usuarios/restricaoAreaAtuacao", $scope.grupoUsuarioEdicao)
                .then(function (data) {
                    $mdDialog
                        .show($mdDialog.alert()
                            .title($scope.res('COMUM_SUCESSO'))
                            .content($scope.res('PERMISSAO_AREAATUACAO_SALVA'))
                            .ok($scope.res('COMUM_OK')));
                    $scope.editar = false;
                    $scope.incluirGrupo = false;
                    $scope.grupoUsuarioEdicao = {};
                    reiniciarObjetosPermissao();
                    carregarGruposComRestricoes();
                    $scope.msgSalvandoHidden = true;

                    $scope.disable = false;

                }, function (err) {
                    $mdDialog
                        .show($mdDialog.alert()
                            .title($scope.res('COMUM_ERRO'))
                            .content(err.data.message)
                            .ok($scope.res('COMUM_OK')));
                    $scope.msgSalvandoHidden = true;
                });

        }

        /**
         * @method carregarAreas
         */
        function carregarAreas() {
            $http.get(API_ENDPOINT + "area_atuacao")
                .then(function (result) {
                    $scope.areasAtuacao = result.data;
                    _.each($scope.areasAtuacao, function (areaAtuacao) {
                        areaAtuacao._id = _.uniqueId();
                    });
                }, function (err) {
                    $mdDialog
                        .show($mdDialog.alert()
                            .title($scope.res('COMUM_ERRO'))
                            .content(err.data.message)
                            .ok($scope.res('COMUM_OK')));
                });
        }

        /**
         * @method carregarRegioes
         * @param {*} areaAtuacaoId 
         */
        function carregarRegioes(areaAtuacaoId) {
            $http.get(API_ENDPOINT + "regiao/area_atuacao/" + areaAtuacaoId)
                .then(function (result) {
                    var todasRegioes = { id: -1, nome: $scope.res('COMUM_TODOS') };
                    $scope.regioes = [];
                    $scope.regioes.push(todasRegioes);
                    $scope.regiao = null;

                    _.each(result.data, function (item) {
                        $scope.regioes.push(item);
                    });

                    $scope.regioesSelecionadas = angular.copy($scope.regioes);

                }, function (err) {
                    $mdDialog
                        .show($mdDialog.alert()
                            .title($scope.res('COMUM_ERRO'))
                            .content(err.data.message)
                            .ok($scope.res('COMUM_OK')));
                });
        }

        /**
         * @method carregarGruposComRestricoes
         */
        function carregarGruposComRestricoes() {
            $http.get(API_ENDPOINT + "grupo_usuarios/restricaoAreaAtuacao")
                .then(function (result) {
                    $scope.gruposComRestricoes = result.data;
                    _.each($scope.gruposComRestricoes, function (grupoComRestricoes) {
                        grupoComRestricoes._id = _.uniqueId();
                        _.each(grupoComRestricoes.permissoesAreaAtuacao, function (permissaoAreaAtuacao) {
                            permissaoAreaAtuacao._id = _.uniqueId();
                        });
                    });
                }, function (err) {
                    $mdDialog
                        .show($mdDialog.alert()
                            .title($scope.res('COMUM_ERRO'))
                            .content(err.data.message)
                            .ok($scope.res('COMUM_OK')));
                });
        }

        /**
         * @method carregarGruposSemRestricoes
         */
        function carregarGruposSemRestricoes() {
            $http.get(API_ENDPOINT + "grupo_usuarios/semRestricaoAreaAtuacao")
                .then(function (result) {
                    $scope.gruposUsuarios = result.data;
                    _.each($scope.gruposUsuarios, function (grupoUsuarios) {
                        grupoUsuarios._id = _.uniqueId();
                    });
                }, function (err) {
                    $mdDialog
                        .show($mdDialog.alert()
                            .title($scope.res('COMUM_ERRO'))
                            .content(err.data.message)
                            .ok($scope.res('COMUM_OK')));
                });
        }

        /**
         * @method searchGrupos
         * @param {*} e 
         */
        function searchGrupos(e) {
            e.stopPropagation();
        }

        /**
         * @method searchRegioes
         * @param {*} e 
         */
        function searchRegioes(e) {
            e.stopPropagation();
        }

        angular.extend($scope, {
            adicionarGrupo: adicionarGrupo,
            callCarregarRegioes: callCarregarRegioes,
            adicionarPermissaoAreaAtuacao: adicionarPermissaoAreaAtuacao,
            deletePermissaoAreaAtuacao: deletePermissaoAreaAtuacao,
            editGrupoUsuariosRestricao: editGrupoUsuariosRestricao,
            deleteGrupoUsuariosRestricao: deleteGrupoUsuariosRestricao,
            editarPermissaoAreaAtuacao: editarPermissaoAreaAtuacao,
            selecionaGrupoUsuario: selecionaGrupoUsuario,
            searchGrupos: searchGrupos,
            searchRegioes: searchRegioes,
            salvar: salvar
        });
    }

}());