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

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


    function AdminBriefingCtrl($scope, Briefing, $mdDialog, $filter) {

        $scope.res = $scope.$root.res;
        $scope.isBriefing = true;

        angular.extend($scope, {
            salvarBriefing: salvarBriefing,
            adicionarHora: adicionarHora,
            editBriefing: editBriefing,
            removerBriefing: removerBriefing,
            getPeriodicidade: getPeriodicidade,
            selecionarBriefing: selecionarBriefing,
            setClass: setClass,
            getSumario: getSumario,
            executeSearch: executeSearch,
            selecionarRecursivo: selecionarRecursivo,
            adicionarLembreteAlarme: adicionarLembreteAlarme,
            removerLembreteAlarme: removerLembreteAlarme,
            novoBriefing: novoBriefing,
            cancelar: cancelar,
            lembretesAlarme: [{
                label: '1 ',
                valor: 1,
                unidade: 'minutes'
            }, {
                label: '2 ',
                valor: 2,
                unidade: 'minutes'
            }, {
                label: '5 ',
                valor: 5,
                unidade: 'minutes'
            }, {
                label: '15 ',
                valor: 15,
                unidade: 'minutes'
            }, {
                label: '30 ',
                valor: 30,
                unidade: 'minutes'
            }, {
                label: '45 ',
                valor: 45,
                unidade: 'minutes'
            }, {
                label: '1 ',
                valor: 1,
                unidade: 'hours'
            }, {
                label: '2 ',
                valor: 2,
                unidade: 'hours'
            }, {
                label: '3 ',
                valor: 3,
                unidade: 'hours'
            }, {
                label: '4 ',
                valor: 4,
                unidade: 'hours'
            }],
            scheduler: {
                dias: [0, 1, 2, 3, 4, 5, 6],
                horarios: [],
                lembretes: []
            }
        });


        $scope.$watch('scheduler.horarios', function (value) {
            angular.forEach($scope.scheduler.horarios, function (horario, key) {
                var hExp = horario.display.split(":");
                horario.hora = hExp[0];
                horario.minuto = hExp[1];
            });
        }, true);

        /**
         * @method adicionarHora
         */
        function adicionarHora() {
            var h = moment().format('HH');
            var m = moment().format('mm');
            $scope.scheduler.horarios.push({
                hora: h,
                minuto: m,
                display: h + ":" + m
            });
        }

        $scope.detalhesBriefing = false;
        $scope.isEdition = false;
        $scope.isAdding = false;
        $scope.cancelado = true;
        $scope.recursivoSelecionado;
        $scope.recursivos = [$scope.res('NUNCA'), $scope.res('DIARIO'), $scope.res('SEMANAL'), $scope.res('MENSAL')];
        $scope.dias = [];
        $scope.dias['SEGUNDA'] = false;
        $scope.dias['TERCA'] = false;
        $scope.dias['QUARTA'] = false;
        $scope.dias['QUINTA'] = false;
        $scope.dias['SEXTA'] = false;
        $scope.dias['SABADO'] = false;
        $scope.dias['DOMINGO'] = false;

        Briefing.getBriefings().then(function (briefings) {
            $scope.briefings = briefings;
            $scope.briefingsSelecionados = briefings;
        });

        /**
         * @method removerBriefing
         * @param {*} briefing 
         */
        function removerBriefing(briefing) {

            if (briefing.respostas) {

                var confirm = $mdDialog.confirm()
                    .title($scope.res('REMOVER_BRIEFING'))
                    .content($scope.res('TEM_CERTEZA_REMOVER_BRIEFING'))
                    .ok($scope.res('COMUM_SIM'))
                    .cancel($scope.res('COMUM_CANCELAR'));

                $mdDialog.show(confirm).then(function () {

                    Briefing.removeBriefing(briefing.id).then(function (result) {
                        var index = $scope.briefings.indexOf(briefing);
                        $scope.briefings.splice(index, 1);
                    });

                }, function (err) {

                });

            } else {

                Briefing.removeBriefing(briefing.id).then(function (result) {
                    var index = $scope.briefings.indexOf(briefing);
                    $scope.briefings.splice(index, 1);
                });
            }

            if ($scope.briefingSelecionado && briefing.id == $scope.briefingSelecionado.id) {
                $scope.detalhesBriefing = false;
                cancelar();
                $scope.briefingSelecionado = undefined;
            }
        }

        /**
         * @method getPeriodicidade
         * @param {*} briefing 
         */
        function getPeriodicidade(briefing) {

            if (briefing.periodicidade.repeticao == 'NUNCA') {
                return $scope.res('APENAS_EM') + ' ' + briefing.periodicidade.dia;
            }

            if (briefing.periodicidade.repeticao == 'DIARIO') {
                return $scope.res('DIARIO');
            }

            if (briefing.periodicidade.repeticao == 'SEMANAL') {
                return $scope.res('SEMANAL');
            }

            if (briefing.periodicidade.repeticao == 'MENSAL') {
                return $scope.res('MENSAL') + ', ' + $scope.res('TODO_DIA') + ' ' + briefing.periodicidade.dia.substring(0, 2) + ' ' + $scope.res('DO_MES');
            }

        }

        $scope.sumario = '';
        /**
         * @method getSumario
         */
        function getSumario() {

            if ($scope.recursivoSelecionado == $scope.recursivos[0]) {
                $scope.sumario = $scope.res('APENAS_EM') + ' '
                    + ($scope.briefingSelecionado.dataConsolidacao ? $scope.briefingSelecionado.dataConsolidacao :
                        $scope.briefingSelecionado.periodicidade.dia + ' ' + $scope.res('COMUM_AS') + ' ' + $scope.briefingSelecionado.periodicidade.hora);
            }

            if ($scope.recursivoSelecionado == $scope.recursivos[1]) {
                $scope.sumario = $scope.res('DIARIO') + ', ' + $scope.res('SEMPRE_AS') + ' '
                    + ($scope.briefingSelecionado.dataConsolidacao ? $scope.briefingSelecionado.dataConsolidacao : $scope.briefingSelecionado.periodicidade.hora);
            }

            if ($scope.recursivoSelecionado == $scope.recursivos[2]) {
                $scope.sumario = $scope.res('SEMANAL') + ', ' + getDayNames() + ' ' + $scope.res('COMUM_AS') + ' '
                    + ($scope.briefingSelecionado.dataConsolidacao ? $scope.briefingSelecionado.dataConsolidacao : $scope.briefingSelecionado.periodicidade.hora);
            }

            if ($scope.recursivoSelecionado == $scope.recursivos[3]) {
                $scope.sumario = $scope.res('MENSAL') + ', ' + $scope.res('TODO_DIA') + ' ' + getDay() + ' ' + $scope.res('DO_MES');
            }

            return $scope.sumario;
        }

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

            if (($scope.dias['SEGUNDA'] == true &&
                $scope.dias['TERCA'] == true &&
                $scope.dias['QUARTA'] == true &&
                $scope.dias['QUINTA'] == true &&
                $scope.dias['SEXTA'] == true &&
                $scope.dias['SABADO'] == true &&
                $scope.dias['DOMINGO'] == true) ||
                ($scope.dias['SEGUNDA'] == false &&
                    $scope.dias['TERCA'] == false &&
                    $scope.dias['QUARTA'] == false &&
                    $scope.dias['QUINTA'] == false &&
                    $scope.dias['SEXTA'] == false &&
                    $scope.dias['SABADO'] == false &&
                    $scope.dias['DOMINGO'] == false)) {
                return $scope.res('TODOS_DIAS');
            }

            if ($scope.dias['SEGUNDA'] == true &&
                $scope.dias['TERCA'] == true &&
                $scope.dias['QUARTA'] == true &&
                $scope.dias['QUINTA'] == true &&
                $scope.dias['SEXTA'] == true &&
                $scope.dias['SABADO'] == false &&
                $scope.dias['DOMINGO'] == false) {
                return $scope.res('DIAS_UTEIS');
            }

            if ($scope.dias['SEGUNDA'] == false &&
                $scope.dias['TERCA'] == false &&
                $scope.dias['QUARTA'] == false &&
                $scope.dias['QUINTA'] == false &&
                $scope.dias['SEXTA'] == false &&
                $scope.dias['SABADO'] == true &&
                $scope.dias['DOMINGO'] == true) {
                return $scope.res('FIM_DE_SEMANA');
            }

            var names = '';

            var diaNome;
            for (diaNome in $scope.dias) {

                if (diaNome != 'DOM') {
                    if ($scope.dias[diaNome]) {
                        names += $scope.res(diaNome) + ', ';
                    }
                } else {
                    if ($scope.dias[diaNome]) {
                        names += $scope.res(diaNome);
                    } else {
                        names = names.substring(0, names.lenght - 3);
                    }
                }
            }

            return names.replace(/,([^,]*)$/, ' ');
        }

        /**
         * @method getDay
         */
        function getDay() {
            return $scope.briefingSelecionado.dataConsolidacao ? $scope.briefingSelecionado.dataConsolidacao.substring(0, 2) :
                $scope.briefingSelecionado.periodicidade.dia.substring(0, 2);
        }

        $scope.briefing;
        /**
         * @method editBriefing
         * @param {*} briefing 
         */
        function editBriefing(briefing) {

            $scope.isAdding = false;
            $scope.cancelado = false;
            $scope.isEdition = true;
            $scope.briefing = briefing;

            angular.forEach($scope.briefingsSelecionados, function (b) {
                b.val = false;
            });

            briefing.val = true;
            $scope.briefingSelecionado = angular.copy(briefing);


            if (briefing.periodicidade.repeticao == 'DIARIO' || briefing.periodicidade.repeticao == 'SEMANAL') {
                $scope.briefingSelecionado.dataConsolidacao = $scope.briefingSelecionado.periodicidade.hora;
            } else {

                $scope.briefingSelecionado.dataConsolidacao = ($scope.briefingSelecionado.periodicidade.dia ? $scope.briefingSelecionado.periodicidade.dia : '')
                    + ' ' + $scope.briefingSelecionado.periodicidade.hora;
            }

            $scope.recursivoSelecionado = $scope.res($scope.briefingSelecionado.periodicidade.repeticao);

            $scope.dias['SEGUNDA'] = $scope.briefingSelecionado.periodicidade.dias_semana.indexOf('SEGUNDA') != -1 ? true : false;
            $scope.dias['TERCA'] = $scope.briefingSelecionado.periodicidade.dias_semana.indexOf('TERCA') != -1 ? true : false;
            $scope.dias['QUARTA'] = $scope.briefingSelecionado.periodicidade.dias_semana.indexOf('QUARTA') != -1 ? true : false;
            $scope.dias['QUINTA'] = $scope.briefingSelecionado.periodicidade.dias_semana.indexOf('QUINTA') != -1 ? true : false;
            $scope.dias['SEXTA'] = $scope.briefingSelecionado.periodicidade.dias_semana.indexOf('SEXTA') != -1 ? true : false;
            $scope.dias['SABADO'] = $scope.briefingSelecionado.periodicidade.dias_semana.indexOf('SABADO') != -1 ? true : false;
            $scope.dias['DOMINGO'] = $scope.briefingSelecionado.periodicidade.dias_semana.indexOf('DOMINGO') != -1 ? true : false;

        }

        function setClass() {
            $("#participantesDiv").attr("class", "participantes-briefing");
        }

        $scope.briefingSelecionado;
        /**
         * @method selecionarBriefing
         * @param {*} briefing 
         */
        function selecionarBriefing(briefing) {

            if ($scope.isEdition || $scope.isAdding) {
                return;
            }

            angular.forEach($scope.briefingsSelecionados, function (b) {
                b.val = false;
            });

            briefing.val = true;
            $scope.briefingSelecionado = briefing;
            $scope.recursivoSelecionado = $scope.res($scope.briefingSelecionado.periodicidade.repeticao);
            $scope.detalhesBriefing = true;

            $scope.dias['SEGUNDA'] = $scope.briefingSelecionado.periodicidade.dias_semana.indexOf('SEGUNDA') != -1 ? true : false;
            $scope.dias['TERCA'] = $scope.briefingSelecionado.periodicidade.dias_semana.indexOf('TERCA') != -1 ? true : false;
            $scope.dias['QUARTA'] = $scope.briefingSelecionado.periodicidade.dias_semana.indexOf('QUARTA') != -1 ? true : false;
            $scope.dias['QUINTA'] = $scope.briefingSelecionado.periodicidade.dias_semana.indexOf('QUINTA') != -1 ? true : false;
            $scope.dias['SEXTA'] = $scope.briefingSelecionado.periodicidade.dias_semana.indexOf('SEXTA') != -1 ? true : false;
            $scope.dias['SABADO'] = $scope.briefingSelecionado.periodicidade.dias_semana.indexOf('SABADO') != -1 ? true : false;
            $scope.dias['DOMINGO'] = $scope.briefingSelecionado.periodicidade.dias_semana.indexOf('DOMINGO') != -1 ? true : false;
        }

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

            $scope.isAdding = true;
            $scope.cancelado = false;
            $scope.isEdition = false;
            $scope.briefingSelecionado = {};
            $scope.briefingSelecionado.alarmes = [];
            $scope.briefingSelecionado.gruposUsuariosParticipantes = [];
            $scope.briefingSelecionado.usuariosParticipantes = [];
            $scope.briefingSelecionado.agenciasParticipantes = [];
            $scope.recursivoSelecionado = undefined;

            $scope.dias['SEGUNDA'] = false;
            $scope.dias['TERCA'] = false;
            $scope.dias['QUARTA'] = false;
            $scope.dias['QUINTA'] = false;
            $scope.dias['SEXTA'] = false;
            $scope.dias['SABADO'] = false;
            $scope.dias['DOMINGO'] = false;

        }

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

            if ($scope.isAdding) {
                $scope.detalhesBriefing = false;
            }

            $scope.isAdding = false;
            $scope.isEdition = false;
            $scope.cancelado = true;
        }

        /**
         * @method adicionarLembreteAlarme
         */
        function adicionarLembreteAlarme() {
            $scope.briefingSelecionado.alarmes.push(angular.copy($scope.lembretesAlarme[0]));
        }

        /**
         * @method removerLembreteAlarme
         * @param {*} lembreteAlarme 
         */
        function removerLembreteAlarme(lembreteAlarme) {
            var index = $scope.briefingSelecionado.alarmes.indexOf(lembreteAlarme);
            $scope.briefingSelecionado.alarmes.splice(index, 1);
        }

        function selecionarRecursivo(recursivoSelecionado) {
            $scope.recursivoSelecionado = recursivoSelecionado;

            if (!$scope.briefingSelecionado.dataConsolidacao) {
                return;
            }

            if ($scope.recursivoSelecionado == $scope.res('MENSAL') || $scope.recursivoSelecionado == $scope.res('NUNCA')) {
                if ($scope.briefingSelecionado.dataConsolidacao.length < 8) {
                    $scope.briefingSelecionado.dataConsolidacao = undefined;
                }
            }

            if ($scope.recursivoSelecionado == $scope.res('SEMANAL') || $scope.recursivoSelecionado == $scope.res('DIARIO')) {
                if ($scope.briefingSelecionado.dataConsolidacao.length > 6) {
                    $scope.briefingSelecionado.dataConsolidacao = undefined;
                }
            }
        }

        function ordenaAlertas() {

            $scope.briefingSelecionado.alarmes = $scope.briefingSelecionado.alarmes.sort(function (a, b) {

                var aValue = getValueInMinutes(a);
                var bValue = getValueInMinutes(b);

                return aValue < bValue ? 1 : aValue > bValue ? -1 : 0
            });
        }

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

            var unidade = alarme.unidade;

            if (unidade == 'hours') {
                return alarme.valor * 60;
            }

            return alarme.valor;
        }

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

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

                var newLabel = getValueInMinutes(alarme);
                if (newLabel == label) {
                    temRepetidos = true;
                    return;
                }

                label = newLabel;

            });

            return temRepetidos;
        }

        $scope.textoBusca;

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

            $scope.briefingsSelecionados = [];
            if (!$scope.textoBusca || $scope.textoBusca.length == 0) {
                $scope.briefingsSelecionados = angular.copy($scope.briefings);
                return;
            }

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

            angular.forEach($scope.briefings, function (briefing) {

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

                if (nome.indexOf(texto) !== -1 || descricao.indexOf(texto) !== -1) {
                    $scope.briefingsSelecionados.push(briefing);
                }
            });
        }

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

            //Verificar se existem alertas com tempos repetidos
            if (temAlertasRepetidos()) {
                $mdDialog.show({
                    targetEvent: evt,
                    scope: $scope.$new(),
                    template: '<md-dialog><md-content>' + $scope.res('BRIEFING_ALERT_REPETIDO') + '</md-content></md-dialog>'
                });

                return;
            }

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

                return;
            }

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

                return;
            }

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

                return;
            }

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

                return;
            }

            carregarBriefing();

            //Ordenar alertas em ordem decrescente
            ordenaAlertas();

            $scope.briefingSelecionado.data = undefined;
            if ($scope.isAdding) {

                Briefing.newBriefing($scope.briefingSelecionado)
                    .then(function (result) {
                        $mdDialog.show({
                            targetEvent: evt,
                            scope: $scope.$new(),
                            template: '<md-dialog><md-content>' + $scope.res('BRIEFING_TITULO') + ' ' + $scope.res('COMUM_MENSAGEM_SALVOCOMSUCESSO') + '</md-content></md-dialog>'
                        });

                        $scope.briefingSelecionado.id = result.id;
                        $scope.briefings.push($scope.briefingSelecionado);
                        $scope.isAdding = false;
                        $scope.cancelado = true;
                    });
            } else {

                Briefing.updateBriefing($scope.briefingSelecionado)
                    .then(function (result) {
                        $mdDialog.show({
                            targetEvent: evt,
                            scope: $scope.$new(),
                            template: '<md-dialog><md-content>' + $scope.res('BRIEFING_TITULO') + ' ' + $scope.res('COMUM_MENSAGEM_SALVOCOMSUCESSO') + '</md-content></md-dialog>'
                        });

                        $scope.briefings.splice($scope.briefings.indexOf($scope.briefing), 1);
                        $scope.briefings.push($scope.briefingSelecionado);
                        $scope.isEdition = false;
                        $scope.cancelado = true;
                    });
            }

            $scope.detalhesBriefing = true;
        }

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

            var rep;
            if ($scope.recursivoSelecionado == $scope.recursivos[0]) {
                rep = 'NUNCA';
            }

            if ($scope.recursivoSelecionado == $scope.recursivos[1]) {
                rep = 'DIARIO';
            }

            if ($scope.recursivoSelecionado == $scope.recursivos[2]) {
                rep = 'SEMANAL';
            }

            if ($scope.recursivoSelecionado == $scope.recursivos[3]) {
                rep = 'MENSAL';
            }

            var valores = [];
            var diaNome;
            for (diaNome in $scope.dias) {
                if ($scope.dias[diaNome]) {
                    valores.push(diaNome);
                }
            }

            var diaSelecionado;
            var horaSelecionada;
            if ($scope.recursivoSelecionado == $scope.recursivos[0] || $scope.recursivoSelecionado == $scope.recursivos[3]) {
                diaSelecionado = $scope.briefingSelecionado.dataConsolidacao.substring(0, 10);
                horaSelecionada = $scope.briefingSelecionado.dataConsolidacao.substring(10, 17);
            } else {
                horaSelecionada = $scope.briefingSelecionado.dataConsolidacao;
            }

            $scope.briefingSelecionado.periodicidade = {

                repeticao: rep,
                dias_semana: valores,
                dia: diaSelecionado,
                hora: horaSelecionada
            }

            delete $scope.briefingSelecionado.dataRevisao;
            delete $scope.briefingSelecionado.createdAt;
            delete $scope.briefingSelecionado.updatedAt;
        }

    }

    AdminBriefingCtrl.$inject = [
        '$scope',
        'Briefing',
        '$mdDialog',
        '$filter'
    ];

    angular.module('s4c.controllers.AdminBriefingCtrl', ['s4c.filters', 'ui.utils.masks'])
        .controller('AdminBriefingCtrl', AdminBriefingCtrl);
}());