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

/**
 * @ngdoc controller
 * @name Incidentes
 * @module s4c.components.admin.controllers.Incidentes
 *
 * @description
 * `AdminIncidentesCtrl` Controller da tela de Incidentes do módulo de administração
 * 
 * 
 */
(function () {
    'use strict';

    angular.module('s4c.controllers.AdminIncidentesCtrl', [
        'ngMaterial'
    ])
        .controller('AdminIncidentesCtrl', AdminIncidentesCtrl)

    AdminIncidentesCtrl.$inject = ['$scope', '$mdDialog', 'IncidentesService']

    function AdminIncidentesCtrl($scope, $mdDialog, IncidentesService) {

        $scope.res = $scope.$root.res;

        IncidentesService.getIncidenteTipos().then(function (resultado_tipo) {
            $scope.tipos = resultado_tipo;
            ordenaArray($scope.tipos);
        });

        IncidentesService.getIncidenteGravidades().then(function (resultado_gravidades) {
            $scope.gravidades = resultado_gravidades;
            ordenaArray($scope.gravidades);
        });

        IncidentesService.getIncidenteCategorias().then(function (resultado_categorias) {
            $scope.categorias = resultado_categorias;
            ordenaArray($scope.categorias);
        });

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

            var tipo = {};
            tipo.nome = "";
            tipo.status = 1;
            tipo.createdAt = moment();

            $scope.tipos.push(tipo);
        }

        /**
         * @method adicionarNovaGravidade
         */
        function adicionarNovaGravidade() {
            if ($scope.gravidades == null) {
                $scope.gravidades = [];
            }
            var gravidade = {};
            gravidade.nome = "";
            gravidade.status = 1;
            gravidade.createdAt = moment();

            $scope.gravidades.push(gravidade);
        }

        /**
         * @method adicionarNovaCategoria
         */
        function adicionarNovaCategoria() {
            if ($scope.categorias == null) {
                $scope.categorias = [];
            }
            var categoria = {};
            categoria.nome = "";
            categoria.status = 1;
            categoria.urlIcone = "";
            categoria.urlIconeFechado = "";

            $scope.categorias.push(categoria);
        }

        /**
         * @method removerTipo
         * @param {*} tipo 
         */
        function removerTipo(tipo) {

            if (tipo.id) {
                tipo.status = 0;
            } else {
                $scope.tipos.splice($scope.tipos.indexOf(tipo), 1);
            }

        }

        /**
         * @method removerGravidade
         * @param {*} gravidade 
         */
        function removerGravidade(gravidade) {

            if (gravidade.id) {
                gravidade.status = 0;
            } else {
                $scope.gravidades.splice($scope.gravidades.indexOf(gravidade), 1);
            }

        }

        /**
         * @method removerCategoria
         * @param {*} categoria 
         */
        function removerCategoria(categoria) {

            if (categoria.id) {
                categoria.status = 0;
            } else {
                $scope.categorias.splice($scope.categorias.indexOf(categoria), 1);
            }

        }

        /**
         * @method temNomesRepetidos
         * @param {*} array 
         */
        function temNomesRepetidos(array) {

            var temRepetidos = false;
            var label;

            for (var index in array) {

                for (var index2 in array) {

                    if (array[index].nome == array[index2].nome && array[index] != array[index2]) {
                        temRepetidos = true;
                        return;
                    }

                }
            }

            return temRepetidos;
        }

        /**
         * @method temElementosSemNome
         * @param {*} array 
         */
        function temElementosSemNome(array) {

            var semNome = false;
            for (var index in array) {

                if (!array[index].nome) {
                    semNome = true;
                    return;
                }

            }

            return semNome;
        }

        /**
         * @method ordenaArray
         * @param {*} array 
         */
        function ordenaArray(array) {

            array = array.sort(function (a, b) {

                return a.nome > b.nome ? 1 : a.nome < b.nome ? -1 : 0
            });
        }

        /**
         * @method verificarExistenciaElemento
         * @param {*} array 
         */
        function verificarExistenciaElemento(array) {

            var existe = false;
            var elementosParaRemover = [];
            for (var index in array) {

                if (!array[index].id) {

                    for (var index2 in array) {

                        //Se já tem tipo desativado com o memso nome, reativa.
                        if (array[index2].id && array[index2].nome == array[index].nome && array[index2].status == 0) {
                            array[index2].status = 1;
                            existe = true;
                            elementosParaRemover.push(array[index]);
                        }

                    }
                }
            }

            //Remove os tipos novos pois os desativados ficarão no lugar deles.
            if (existe) {
                for (var index in elementosParaRemover) {
                    array.splice(array.indexOf(elementosParaRemover[index]), 1);
                }
            }
        }

        /**
         * @method salvar
         * @param {*} evt 
         */
        function salvar(evt) {

            //Verifica se algum novo tipo adicionado tem mesmo nome de um desativado.
            verificarExistenciaElemento($scope.tipos);

            //Verifica se alguma nova gravidade adicionada tem mesmo nome de uma desativada.
            verificarExistenciaElemento($scope.gravidades);

            //Verifica se alguma nova categoria adicionada tem mesmo nome de uma desativada.
            verificarExistenciaElemento($scope.categorias);

            //Verificar se tem nomes repetidos para tipo
            if (temNomesRepetidos($scope.tipos)) {
                $mdDialog.show({
                    targetEvent: evt,
                    scope: $scope.$new(),
                    template: '<md-dialog><md-content>' + $scope.res('TIPO_NOMES_IGUAIS') + '</md-content></md-dialog>'
                });

                return;
            }

            //Verificar se tem nomes repetidos para gravidade
            if (temNomesRepetidos($scope.gravidades)) {
                $mdDialog.show({
                    targetEvent: evt,
                    scope: $scope.$new(),
                    template: '<md-dialog><md-content>' + $scope.res('GRAVIDADE_NOMES_IGUAIS') + '</md-content></md-dialog>'
                });

                return;
            }

            //Verificar se tem nomes repetidos para categorias
            if (temNomesRepetidos($scope.categorias)) {
                $mdDialog.show({
                    targetEvent: evt,
                    scope: $scope.$new(),
                    template: '<md-dialog><md-content>' + $scope.res('CATEGORIA_NOMES_IGUAIS') + '</md-content></md-dialog>'
                });

                return;
            }

            //Verificar se tem tipos sem nome
            if (temElementosSemNome($scope.tipos)) {
                $mdDialog.show({
                    targetEvent: evt,
                    scope: $scope.$new(),
                    template: '<md-dialog><md-content>' + $scope.res('TIPO_SEM_NOME') + '</md-content></md-dialog>'
                });

                return;
            }

            //Verificar se tem gravidades sem nome
            if (temElementosSemNome($scope.gravidades)) {
                $mdDialog.show({
                    targetEvent: evt,
                    scope: $scope.$new(),
                    template: '<md-dialog><md-content>' + $scope.res('GRAVIDADE_SEM_NOME') + '</md-content></md-dialog>'
                });

                return;
            }

            //Verificar se tem categorias sem nome
            if (temElementosSemNome($scope.categorias)) {
                $mdDialog.show({
                    targetEvent: evt,
                    scope: $scope.$new(),
                    template: '<md-dialog><md-content>' + $scope.res('CATEGORIA_SEM_NOME') + '</md-content></md-dialog>'
                });

                return;
            }

            ordenaArray($scope.tipos);
            ordenaArray($scope.gravidades);
            ordenaArray($scope.categorias);

            IncidentesService.salvarTipos($scope.tipos)
                .then(function (result) {

                    IncidentesService.salvarGravidades($scope.gravidades)
                        .then(function (result) {

                            IncidentesService.salvarCategorias($scope.categorias)
                                .then(function (result) {

                                    $mdDialog.show({
                                        targetEvent: evt,
                                        scope: $scope.$new(),
                                        template: '<md-dialog><md-content>' + $scope.res('TIPO_GRAVIDADE_SALVO') + '</md-dialog>'
                                    });
                                });
                        });
                });


        }

        angular.extend($scope, {

            salvar: salvar,
            adicionarNovoTipo: adicionarNovoTipo,
            adicionarNovaGravidade: adicionarNovaGravidade,
            adicionarNovaCategoria: adicionarNovaCategoria,
            removerTipo: removerTipo,
            removerGravidade: removerGravidade,
            removerCategoria: removerCategoria

        })
    }

}());