Source: directives/briefing/sala-briefing/sala-briefing.js

/**
 * @ngdoc directives
 * @name sala-briefing
 * @module s4c.directives.briefing.salaBriefing.sala-briefing
 * 
 * @description `SalaBriefingCtrl` Controller da funcão de Sala de Briefing
 *              
 *
 */
(function () {
    'use strict';

    angular.module('s4c.components.sala-briefing', ['angular-momentjs'])
        .directive('salaBriefing', SalaBriefing);

    SalaBriefingCtrl.$inject = [
        '$scope',
        'Briefing',
        '$mdDialog',
        'Departamento',
        'localize'
    ];

    function SalaBriefing() {
        return {
            restrict: 'E',
            templateUrl: 'app/directives/briefing/sala-briefing/sala-briefing.html',
            replace: true,
            scope: {},
            controller: SalaBriefingCtrl
        }
    }

    function SalaBriefingCtrl($scope, Briefing, $mdDialog, Departamento, localize) {

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

        angular.extend($scope, {
            imagem: '',
            briefingConsolidado: null,
            isLoading: true,
            fecharBriefingQuestion: fecharBriefingQuestion,
            showQuestion: false,
            fecharBriefing: fecharBriefing,
            selecionarBriefing: selecionarBriefing,
            fechandoBriefing: false,
            fecharDialog: fecharDialog,
            fechamentoOk: false,
            fechamentoError: false,
            removerImagem: removerImagem
        });

       /**
        * Fecha a pergunta do Briefing 
        *
        * @method fecharBriefingQuestion
		*        
		*               
        */  
        function fecharBriefingQuestion() {
            $scope.showQuestion = !$scope.showQuestion;
            $scope.fechandoBriefing = false;
            $scope.fechamentoError = false;
        }

       /**
        * Fecha o briefing 
        *
        * @method fecharBriefing
		*        
		*               
        */  
        function fecharBriefing() {
            $scope.fechandoBriefing = true;
            var fechamento = {
                comentarios: []
            };
            fechamento.conclusao = $scope.briefingConsolidado.conclusao;
            fechamento.texto = $scope.briefingConsolidado.texto;

            _.each($scope.briefingConsolidado.respostasAgencias, function (resposta) {
                _.each(resposta.respostas, function (resposta_) {
                    var text = '{}';
                    var comentario_ = JSON.parse(text);
                    comentario_.DepartamentoId = resposta.agencia.id;
                    comentario_.text = resposta_.comentario;
                    comentario_.usuarioId = resposta_.UsuarioId;
                    fechamento.comentarios.push(comentario_);
                });
            });

            if ($scope.briefingConsolidado.imagem) {
                fechamento.imagem = $scope.briefingConsolidado.imagem.data;
            }

            Briefing.postBriefing($scope.briefingConsolidado.id, fechamento)
                .then(function () {
                    $scope.fechandoBriefing = false;
                    $scope.fechamentoOk = true;
                }, function (err) {
                    $scope.fechandoBriefing = false;
                    $scope.fechamentoError = true;
                });
        }

        $scope.dia;
        $scope.hora;
        $scope.briefingConsolidado;
        
       /**
        * Seleciona o briefing 
        *
        * @method selecionarBriefing
		*        
        * @param id {Integer} id
		*               
        */          
        function selecionarBriefing(id) {

            angular.forEach($scope.briefings, function (briefing) {
                if (id == briefing.id) {
                    $scope.briefingConsolidado = briefing;
                    $scope.dia = briefing.periodicidade.dia ? briefing.periodicidade.dia : formattedDate(briefing);
                    $scope.hora = briefing.periodicidade.hora;
                    return;
                }
            })

        }

       /**
        * Fecha o dialogo 
        *
        * @method fecharDialog
		*        
		*               
        */     
        function fecharDialog() {
            $mdDialog.hide();
        }

       /**
        * Remove as imagens anexadas no briefing 
        *
        * @method removerImagem
		*        
		*               
        */  
        function removerImagem() {
            $scope.briefingConsolidado.imagem = {};
        }

       /**
        * Obtem o briefing 
        *
        * @method getBriefingConsolidado
		*        
		*               
        */  
        var getBriefingConsolidado = function () {
            $scope.isLoading = true;
            Briefing.getBriefingsByFiltro({
                where: {
                    status: 'EM_REVISAO'
                },
                include: [{
                    model: 'RespostaBriefing',
                    'as': 'Respostas',
                    include: [{
                        model: 'Usuario',
                        include: [{
                            model: 'Departamento'
                        }, {
                            model: 'Perfil',
                            include: [{
                                model: 'PermissaoAcesso'
                            }]
                        }]
                    }]
                }, 'BriefingConsolidadoComentario']
            }).then(function (briefings) {

                $scope.briefings = briefings;
                if (briefings.length == 0) {
                    $scope.briefingConsolidado = null;
                    $scope.isLoading = false;
                    Briefing.getBriefings({
                        where: {
                            status: 'EM_ANDAMENTO'
                        }
                    })
                        .then(function (briefingsConsolidados) {

                            $scope.briefings = briefingsConsolidados;
                            $scope.proximoBriefing = briefingsConsolidados[0];
                            $scope.proximoBriefing.horario = moment(briefingsConsolidados[0].data).format("HH:mm");
                        });

                    return;
                }

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

                    var briefingModel = {};

                    briefingModel = briefing;
                    briefingModel.respostas = [];

                    if (briefing.Respostas && briefing.Respostas.length > 0) {
                        var respostasAgencias = [];
                        briefingModel.respostas = _.chain(briefing.Respostas)
                            .map(function (resposta) {
                                return {
                                    id: resposta.Usuario.Departamento.id,
                                    nome: resposta.Usuario.Departamento.nome
                                };
                            })
                            .uniqBy('id')
                            .reduce(function (respostas, dept) {
                                var usuarios = _.chain(briefing.Respostas)
                                    .filter(function (resposta) {
                                        return resposta.Usuario.Departamento.id === dept.id;
                                    })
                                    .map(function (resposta) {
                                        return {
                                            id: resposta.Usuario.id,
                                            nome: resposta.Usuario.nome,
                                            horario: resposta.updatedAt,
                                            perfil: _.max(resposta.Usuario.Perfils, 'PermissaoAcessos.length')
                                        }
                                    })
                                    .uniqBy('id')
                                    .value();

                                var respostaAgencia = {
                                    agencia: dept,
                                    respostas: _.chain(briefing.Respostas)
                                        .filter(
                                            function (resposta) {
                                                return resposta.Usuario.Departamento.id === dept.id;
                                            }
                                        )
                                        .map(
                                            function (resposta) {
                                                if (typeof resposta.texto === 'string') {
                                                    resposta.texto = resposta.texto.replace(/(?:\r\n|\r|\n)/g, '<br />');
                                                }

                                                return resposta;
                                            }
                                        )
                                        .value()
                                };

                                respostasAgencias.push(respostaAgencia);

                                var respostaLast = _.chain(briefing.Respostas)
                                    .filter(function (resposta) {
                                        return resposta.Usuario.Departamento.id === dept.id;
                                    })
                                    .max(function (resposta) {
                                        return resposta.id;
                                    })
                                    .value();

                                respostas.push({
                                    corporacao: dept,
                                    id: respostaLast.id,
                                    ultimaResposta: respostaLast.texto,
                                    operadores: usuarios,
                                    comentario: ''
                                });
                                return respostas;
                            }, [])
                            .value();

                        briefingModel.respostasAgencias = _.map(respostasAgencias, function (resposta) {

                            var respostasUsuarios = _.chain(resposta.respostas)
                                .map('Usuario')
                                .uniqBy('id')
                                .value();

                            var ultimasRespostasUsuarios = [];

                            _.each(respostasUsuarios, function (usuario) {
                                console.log('Usuario => ', usuario);
                                var respostasDoUsuario = _.filter(resposta.respostas, { 'UsuarioId': usuario.id });
                                ultimasRespostasUsuarios.push(_.max(respostasDoUsuario, 'id'));
                            });

                            return {
                                agencia: resposta.agencia,
                                respostas: _.flatten(ultimasRespostasUsuarios)
                            };
                        });

                        $scope.isLoading = false;

                    }

                });

            })
        };

        getBriefingConsolidado();
    }
}());