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

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

    angular.module('s4c.controllers.AdminAlarmesCtrl', [
        'ngMaterial',
        's4c.services.Departamento',
        's4c.services.Alarme',
        's4c.services.Categoria'
    ])
        .controller('AdminAlarmesCtrl', AdminAlarmesCtrl)

    AdminAlarmesCtrl.$inject = ['$scope', 'Departamento', 'Usuario', 'Alarme', 'Categoria', '$mdDialog', 'localize']

    function AdminAlarmesCtrl($scope, Departamento, Usuario, Alarme, Categoria, $mdDialog, localize) {

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

        $scope.criandoAlarme = false;

        /**
         * @method limparAlarme
         * @param {*} recarregarAlarmes 
         */
        function limparAlarme(recarregarAlarmes) {
            $scope.alarme = {
                tipo: undefined,
                participantes: [],
                categorias: [],
                detalhes: {}
            }

            if (recarregarAlarmes) {
                carregarAlarmes();
            }
        }

        limparAlarme(true);

        /**
         * @method carregarAlarmes
         */
        function carregarAlarmes() {
            Alarme.queryAdminastracao().then(function (alarmes) {
                $scope.alarmes = alarmes;

                _.each($scope.alarmes, function (alarme) {
                    verifyType(alarme);
                });
            })
        }

        /**
         * @method adicionarParticipante
         */
        function adicionarParticipante() {
            $scope.queryParticipantes = '';

            if ($scope.participanteSelecionado) {
                $scope.alarme.participantes.push($scope.participanteSelecionado);
            }
        }

        /**
         * @method adicionarCategoria
         */
        function adicionarCategoria() {
            $scope.queryCategorias = '';

            if ($scope.categoriaSelecionada) {
                $scope.alarme.categorias.push($scope.categoriaSelecionada);
            }
        }

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

            var temRepetidos = false;
            var nome = $scope.alarme.nome;
            angular.forEach($scope.alarmes, function (alarme) {

                var newNome = alarme.nome;
                if (newNome == nome) {
                    temRepetidos = true;
                    return;
                }

            });

            return temRepetidos;
        }

        /**
         * @method verifyType
         * @param {*} alarme 
         */
        function verifyType(alarme) {

            if (!alarme) {
                return;
            }

            for (var index in $scope.tipos) {
                if (alarme.tipo.includes($scope.tipos[index].nome.substring(0, 3)) || alarme.tipo.includes('Chat') || alarme.tipo.includes('Mens')) {
                    alarme.tipoId = $scope.tipos[index].id;
                    return;
                }
            }

            $scope.alarmes.splice($scope.alarmes.indexOf(alarme), 1);
        }

        /**
         * @method salvar
         */
        function salvar() {
            $scope.alarme.detalhes.palavras = _.words($scope.alarme.detalhes.palavras);

            // Alarme validation
            if (!$scope.alarme.nome || $scope.alarme.nome === null) {
                $mdDialog
                    .show($mdDialog.alert()
                        .title($scope.res('COMUM_ERRO'))
                        .content($scope.res('ALARME_PRECISADENOME'))
                        .ok($scope.res('COMUM_OK')));

                return false;
            }

            if (!$scope.alarme.tipo) {
                $mdDialog
                    .show($mdDialog.alert()
                        .title($scope.res('COMUM_ERRO'))
                        .content($scope.res('ALARME_PRECISADETIPO'))
                        .ok($scope.res('COMUM_OK')));

                return false;
            }

            if (temAlarmessRepetidos() && !$scope.isEdition) {
                $mdDialog
                    .show($mdDialog.alert()
                        .title($scope.res('COMUM_ERRO'))
                        .content($scope.res('ALARME_EXISTENTE'))
                        .ok('OK'));

                return false;
            }

            $scope.alarme.detalhes.categorias = _.chain($scope.alarme.categorias)
                .map('id')
                .value();
            $scope.alarme.detalhes.departamentos = _.chain($scope.departamentos)
                .filter({
                    ativo: true
                })
                .map('id')
                .value();
            $scope.alarme.detalhes = $scope.alarme.detalhes;

            Alarme.save($scope.alarme)
                .then(function () {
                    $mdDialog
                        .show($mdDialog.alert()
                            .title($scope.res('COMUM_SUCESSO'))
                            .content($scope.res('ALERTA_SALVOCOMSUCESSO'))
                            .ok($scope.res('COMUM_OK')));
                    cancelar();
                    limparAlarme();
                    carregarAlarmes();
                    $scope.isEdition = false;
                })
        }

        /**
         * @method editarAlarme
         * @param {*} alarme 
         */
        function editarAlarme(alarme) {
            $scope.alarme = alarme;
            $scope.criandoAlarme = true;
            $scope.isEdition = true;

            if ($scope.alarme.tipo == "Incidente" && alarme.detalhes.tempo != null) {
                $scope.alarme.incidenteAberto = true;
            }

            _.each(alarme.detalhes.departamentos, function (departamentoId) {
                var departamento = _.find($scope.departamentos, { id: departamentoId });

                departamento.ativo = true;
            });

            $scope.alarme.categorias = [];
            _.each($scope.categorias, function (categoria) {

                _.each($scope.alarme.detalhes.categorias, function (id) {

                    if (id == categoria.id) {
                        $scope.alarme.categorias.push(categoria);
                    }
                });
            });

        }

        /**
         * @method removerAlarme
         * @param {*} alarme 
         */
        function removerAlarme(alarme) {

            var confirm = $mdDialog.confirm()
                .title($scope.res('ALARME_CONFIRMACAOREMOCAO') + alarme.nome + ' ?')
                .content($scope.res('COMUM_MENSAGEM_ACAOIRREVERSIVEL'))
                .ariaLabel($scope.res('COMUM_REMOVER'))
                .ok($scope.res('COMUM_SIM'))
                .cancel($scope.res('COMUM_NAO'));

            $mdDialog
                .show(confirm)
                .then(function () {
                    Alarme.remove(alarme)
                        .then(function () {
                            $mdDialog
                                .show($mdDialog.alert()
                                    .title($scope.res('COMUM_SUCESSO'))
                                    .content($scope.res('COMUM_ALARME') + ' ' + $scope.res('COMUM_MENSAGEMEXCLUIDOCOMSUCESSO'))
                                    .ok($scope.res('COMUM_OK')))
                            limparAlarme(true);
                        });
                });
        }

        /**
         * @method removerParticipante
         * @param {*} participante 
         */
        function removerParticipante(participante) {
            _.remove($scope.alarme.participantes, {
                id: participante.id
            })
        }

        /**
         * @method removerCategoria
         * @param {*} categoria 
         */
        function removerCategoria(categoria) {
            _.remove($scope.alarme.categorias, {
                id: categoria.id
            })
        }

        /**
         * @method limparDetalhes
         */
        function limparDetalhes() {
            if ($scope.alarme) {
                $scope.alarme.detalhes = {};
                $scope.alarme.incidenteAberto = false;
            }

            _.each($scope.departamentos, function (dept) {
                dept.ativo = false;
            })

            _.each($scope.categorias, function (cat) {
                cat.ativo = false;
            })
        }

        /**
         * @method limparMinutos
         */
        function limparMinutos() {
            if (!$scope.alarme.incidenteAberto) {
                $scope.alarme.detalhes.tempo = null;
            }
        }

        /**
         * @method cancelar
         */
        function cancelar() {
            $scope.criandoAlarme = false;
        }

        /**
         * @method novoAlarme
         */
        function novoAlarme() {
            $scope.alarme = {
                tipo: undefined,
                participantes: [],
                categorias: [],
                detalhes: {}
            };
            $scope.criandoAlarme = true;
        }

        /**
         * @method tocarAlarme
         * @param {*} alarmeSelecionado 
         */
        function tocarAlarme(alarmeSelecionado) {
            var alarme = new Audio(alarmeSelecionado);
            alarme.play();
        }

        $scope.grupos = [{
            nome: 'Incidentes'
        }, {
            nome: 'Planejamento'
        }, {
            nome: 'Twitter'
        }, {
            nome: 'Outros'
        }];

        $scope.tipos = [
            { nome: $scope.res('PLANEJAMENTO_TITULO'), id: 0 },
            { nome: 'Twitter', id: 1 },
            { nome: $scope.res('MSI_NOME'), id: 2 },
            { nome: $scope.res('CATEGORIA_TITULO'), id: 3 },
            { nome: $scope.res('MAIN_MENU_MENSAGERIA'), id: 4 },
            { nome: $scope.res('COMUM_EXTERNO'), id: 5 }
        ];

        $scope.sons = [
            {
                nome: 'Beep 1',
                arquivo: '/data-s4c/sons/beep1.wav'
            },
            {
                nome: 'Beep 2',
                arquivo: '/data-s4c/sons/beep2.wav'
            },
            {
                nome: 'Beep 3',
                arquivo: '/data-s4c/sons/beep3.wav'
            },
            {
                nome: 'Beep 4',
                arquivo: '/data-s4c/sons/beep4.wav'
            },
            {
                nome: 'Beep 5',
                arquivo: '/data-s4c/sons/beep5.wav'
            },
            {
                nome: 'Beep 6',
                arquivo: '/data-s4c/sons/beep6.wav'
            },
            {
                nome: 'Beep 7',
                arquivo: '/data-s4c/sons/beep7.wav'
            },
            {
                nome: 'Beep 8',
                arquivo: '/data-s4c/sons/beep8.wav'
            },
            {
                nome: 'Beep 9',
                arquivo: '/data-s4c/sons/beep9.wav'
            },
            {
                nome: 'Beep 10',
                arquivo: '/data-s4c/sons/beep10.wav'
            }
        ];

        Usuario.obterShortUsers().then(function (usuarios) {
            $scope.usuarios = usuarios;
        });

        Departamento.getAgencias().then(function (departamentos) {
            $scope.departamentos = departamentos;
        });

        Categoria.getShortCategorias().then(function (categorias) {
            $scope.categorias = categorias;
        });


        angular.extend($scope, {
            limparMinutos: limparMinutos,
            limparAlarme: limparAlarme,
            adicionarParticipante: adicionarParticipante,
            salvar: salvar,
            editarAlarme: editarAlarme,
            removerAlarme: removerAlarme,
            removerParticipante: removerParticipante,
            limparDetalhes: limparDetalhes,
            novoAlarme: novoAlarme,
            tocarAlarme: tocarAlarme,
            cancelar: cancelar,
            adicionarCategoria: adicionarCategoria,
            removerCategoria: removerCategoria
        })

        $scope.opcoesLembrete = [{
            nome: '5 ' + $scope.res('COMUM_MINUTOSANTES'),
            valor: {
                quantidade: 5,
                unidade: 'minutes'
            }
        }, {
            nome: '30 ' + $scope.res('COMUM_MINUTOSANTES'),
            valor: {
                quantidade: 30,
                unidade: 'minutes'
            }
        }, {
            nome: '1 ' + $scope.res('COMUM_HORAANTES'),
            valor: {
                quantidade: 1,
                unidade: 'hours'
            }
        }, {
            nome: '2 ' + $scope.res('COMUM_HORASANTES'),
            valor: {
                quantidade: 2,
                unidade: 'hours'
            }
        }, {
            nome: '6 ' + $scope.res('COMUM_HORASANTES'),
            valor: {
                quantidade: 6,
                unidade: 'hours'
            }
        }, {
            nome: '12 ' + $scope.res('COMUM_HORASANTES'),
            valor: {
                quantidade: 12,
                unidade: 'hours'
            }
        }, {
            nome: '2 ' + $scope.res('COMUM_DIASANTES'),
            valor: {
                quantidade: 2,
                unidade: 'days'
            }
        }, {
            nome: '3 ' + $scope.res('COMUM_DIASANTES'),
            valor: {
                quantidade: 3,
                unidade: 'days'
            }
        }, {
            nome: '5 ' + $scope.res('COMUM_DIASANTES'),
            valor: {
                quantidade: 5,
                unidade: 'days'
            }
        }, {
            nome: '7 ' + $scope.res('COMUM_DIASANTES'),
            valor: {
                quantidade: 7,
                unidade: 'days'
            }
        }];
    }

}());