public ActionResult SalvarHistorico(int idWorkzone)
        {
            tblMatrizWorkzoneHistorico            matrizHistorico = new tblMatrizWorkzoneHistorico();
            List <tblTreinamento>                 trainingList    = new List <tblTreinamento>();
            List <tblMatrizFuncActivityHistorico> atividadeHist   = new List <tblMatrizFuncActivityHistorico>();
            List <tblMatrizFuncTreinHistorico>    trainingHist    = new List <tblMatrizFuncTreinHistorico>();

            // OBJETOS PARA ADICIONAR TREINAMENTOS E ATIVIDADES NAS LISTAS
            tblMatrizFuncTreinHistorico    newTrainingHistoricoObj = new tblMatrizFuncTreinHistorico();
            tblMatrizFuncActivityHistorico newActivityHistoricoObj = new tblMatrizFuncActivityHistorico();

            //OBTÉM O ID DA MATRIZ PARA CRIAR O HISTÓRICO E AS INFOS DA WORKZONE(Nome,BU,CC,Linha,Id)
            var TempMatriz   = _matrizTempService.GetMatrizTempByWZId(idWorkzone);
            var workzone     = _workzone.GetWorkzoneById(TempMatriz.idWorkzone);
            var activiesList = _workzoneXActivity.SetUpActivitiesList(idWorkzone);

            //  ----------- CRIA A TABELA PRINCIPAL DO HISTÓRICO - 'MATRIZ HISTÓRICO'
            var username = "";

            try
            {
                username = AuthorizationHelper.GetSystem().Usuario.ChaveAmericas;
            }
            catch
            {
                username = "";
            }

            matrizHistorico.idWorkzone     = TempMatriz.idWorkzone;
            matrizHistorico.nomeWorkzone   = workzone.Nome;
            matrizHistorico.BUWorkzone     = workzone.idBU;
            matrizHistorico.CCWorkzone     = workzone.idCC.ToString();
            matrizHistorico.LinhaWorkzone  = workzone.idLinha.ToString();
            matrizHistorico.DataCriacao    = DateTime.Now;
            matrizHistorico.UsuarioCriacao = username;

            var matrizHistoricoCreated = _matrizHistoricoService.SalvarHistoricoMatrizWorkzone(matrizHistorico);

            // VERIFICA SE A MATRIZ POSSUI AVALIAÇÕES EM ATIVIDADE
            var avalAtiv = _matrizFuncActivityTempService.GetMatrizTempByIdMWZ(TempMatriz.idMatrizWZTemp);


            foreach (var a in activiesList)
            {
                foreach (var wz in workzone.tblWorkzoneXFuncionario)
                {
                    //Verifica se algum usuário possui avaliação na Atividade[n]
                    var existAvalInActivity = avalAtiv
                                              .Where(aa => aa.idAtividade == a.idAtividade &&
                                                     aa.idFuncionario == wz.idFuncionario);

                    var objAtivAval = existAvalInActivity.FirstOrDefault();

                    //Se a Atividade[n] possui avaliação para aquele usuário
                    // Ele adiciona no histórico


                    if (existAvalInActivity.Count() > 0)
                    {
                        // var existeAtiv =
                        //_matrizHistoricoService.getMatrizHistoricoActivityByWZIdFuncAtiv(matrizHistoricoCreated.idMatrizHistorico, objAtivAval.idFuncionario, objAtivAval.idAtividade);

                        var existeAtiv =
                            atividadeHist.Exists(m => m.idFuncionario == objAtivAval.idFuncionario &&
                                                 m.idMatrizWorkzoneHistorico == matrizHistoricoCreated.idMatrizHistorico &&
                                                 m.idAtividade == objAtivAval.idAtividade);

                        if (!existeAtiv)
                        {
                            newActivityHistoricoObj = new tblMatrizFuncActivityHistorico();

                            newActivityHistoricoObj.idAtividade               = objAtivAval.idAtividade;
                            newActivityHistoricoObj.nomeAtividade             = objAtivAval.tblAtividades.Nome;
                            newActivityHistoricoObj.siglaAtividade            = objAtivAval.tblAtividades.Sigla;
                            newActivityHistoricoObj.idFuncionario             = objAtivAval.idFuncionario;
                            newActivityHistoricoObj.nomeFuncionario           = objAtivAval.tblFuncionarios.Nome;
                            newActivityHistoricoObj.REFuncionario             = objAtivAval.tblFuncionarios.RE;
                            newActivityHistoricoObj.BUFuncionario             = objAtivAval.tblFuncionarios.idBu_Origem.ToString();
                            newActivityHistoricoObj.idItemPerfil              = objAtivAval.idItemPerfil;
                            newActivityHistoricoObj.siglaItemPerfil           = objAtivAval.tblPerfilItens.Sigla;
                            newActivityHistoricoObj.alocacaoForcada           = objAtivAval.alocacaoForcada;
                            newActivityHistoricoObj.cor                       = objAtivAval.cor;
                            newActivityHistoricoObj.idMatrizWorkzoneHistorico = matrizHistoricoCreated.idMatrizHistorico;


                            atividadeHist.Add(newActivityHistoricoObj);
                            //_matrizHistoricoService.SalvarActivityHistorico(newActivityHistoricoObj);
                        }
                    }
                    else
                    // Senão ele adiciona aquela atividade[n] sem avaliação
                    {
                        var existeAtiv =
                            atividadeHist.Exists(m => m.idFuncionario == wz.idFuncionario &&
                                                 m.idMatrizWorkzoneHistorico == matrizHistoricoCreated.idMatrizHistorico &&
                                                 m.idAtividade == a.idAtividade);

                        // var existeAtiv =
                        //_matrizHistoricoService.getMatrizHistoricoActivityByWZIdFuncAtiv(matrizHistoricoCreated.idMatrizHistorico, wz.idFuncionario, a.idAtividade);
                        if (!existeAtiv)
                        {
                            newActivityHistoricoObj = new tblMatrizFuncActivityHistorico();

                            newActivityHistoricoObj.idAtividade               = a.idAtividade;
                            newActivityHistoricoObj.nomeAtividade             = a.Nome;
                            newActivityHistoricoObj.siglaAtividade            = a.Sigla;
                            newActivityHistoricoObj.idFuncionario             = wz.idFuncionario;
                            newActivityHistoricoObj.nomeFuncionario           = wz.tblFuncionarios.Nome;
                            newActivityHistoricoObj.REFuncionario             = wz.tblFuncionarios.RE;
                            newActivityHistoricoObj.BUFuncionario             = wz.tblFuncionarios.idBu_Origem.ToString();
                            newActivityHistoricoObj.idItemPerfil              = 0;
                            newActivityHistoricoObj.cor                       = "gray";
                            newActivityHistoricoObj.siglaItemPerfil           = "";
                            newActivityHistoricoObj.idMatrizWorkzoneHistorico = matrizHistoricoCreated.idMatrizHistorico;

                            atividadeHist.Add(newActivityHistoricoObj);

                            //_matrizHistoricoService.SalvarActivityHistorico(newActivityHistoricoObj);
                        }
                    }
                }
            }

            // MONTA A LISTA DE TREINAMENTOS
            foreach (var aList in activiesList)
            {
                //Pega todos IDs de atividades associados a treinamentos DA ZONA
                foreach (var aXt in aList.tblAtividadeXTreinamentos)
                {
                    var aux = _training.GetTrainingById(aXt.idTreinamento);

                    //Verifica se o treinamento já existe na Lista
                    if (trainingList.Exists(t => t.IdTreinamento == aux.IdTreinamento) == false)
                    {
                        trainingList.Add(aux);
                    }
                }
            }


            var avalTraining = _matrizFuncTrainingTempService.GetMatrizTempByIdMWZ(TempMatriz.idMatrizWZTemp);

            foreach (var t in trainingList)
            {
                foreach (var wz in workzone.tblWorkzoneXFuncionario)
                {
                    //Verifica se algum usuário possui avaliação na Atividade[n]
                    var existAvalInTraining = avalTraining
                                              .Where(tt => tt.idTreinamento == t.IdTreinamento &&
                                                     tt.idFuncionario == wz.idFuncionario);

                    var objTrainAval = existAvalInTraining.FirstOrDefault();


                    //Se o Treinamento[n] possui avaliação para aquele usuário
                    // Ele adiciona no histórico
                    if (existAvalInTraining.Count() > 0)
                    {
                        var existeTrein =
                            trainingHist.Exists(m => m.idFuncionario == objTrainAval.idFuncionario &&
                                                m.idMatrizWorkzoneHistorico == matrizHistoricoCreated.idMatrizHistorico &&
                                                m.idTreinamento == objTrainAval.idTreinamento);
                        //_matrizHistoricoService.getMatrizHistoricoTrainingByWZIdFuncAtiv(matrizHistoricoCreated.idMatrizHistorico, objTrainAval.idFuncionario, objTrainAval.idTreinamento);

                        if (!existeTrein)
                        {
                            newTrainingHistoricoObj = new tblMatrizFuncTreinHistorico();

                            newTrainingHistoricoObj.idTreinamento             = objTrainAval.idTreinamento;
                            newTrainingHistoricoObj.nomeTreinamento           = objTrainAval.tblTreinamento.Nome;
                            newTrainingHistoricoObj.idTipoTreinamento         = (int)objTrainAval.tblTreinamento.idTipoTreinamento;
                            newTrainingHistoricoObj.nomeTipoTreinamento       = objTrainAval.tblTreinamento.tblTipoTreinamento.Nome;
                            newTrainingHistoricoObj.siglaTipoTreinamento      = objTrainAval.tblTreinamento.tblTipoTreinamento.Sigla;
                            newTrainingHistoricoObj.idFuncionario             = objTrainAval.idFuncionario;
                            newTrainingHistoricoObj.nomeFuncionario           = objTrainAval.tblFuncionarios.Nome;
                            newTrainingHistoricoObj.REFuncionario             = objTrainAval.tblFuncionarios.RE;
                            newTrainingHistoricoObj.BUFuncionario             = objTrainAval.tblFuncionarios.idBu_Origem.ToString();
                            newTrainingHistoricoObj.idItemPerfil              = objTrainAval.idItemPerfil;
                            newTrainingHistoricoObj.siglaItemPerfil           = objTrainAval.tblPerfilItens.Sigla;
                            newTrainingHistoricoObj.idMatrizWorkzoneHistorico = matrizHistoricoCreated.idMatrizHistorico;

                            trainingHist.Add(newTrainingHistoricoObj);

                            //_matrizHistoricoService.SalvarTreinHistorico(newTrainingHistoricoObj);
                        }
                    }
                    else
                    // Senão ele adiciona aquele treinaemnto[n] sem avaliação
                    {
                        var existeTrein =
                            trainingHist.Exists(m => m.idFuncionario == wz.idFuncionario &&
                                                m.idMatrizWorkzoneHistorico == matrizHistoricoCreated.idMatrizHistorico &&
                                                m.idTreinamento == t.IdTreinamento);

                        //_matrizHistoricoService.getMatrizHistoricoTrainingByWZIdFuncAtiv(matrizHistoricoCreated.idMatrizHistorico, wz.idFuncionario, t.IdTreinamento);
                        if (!existeTrein)
                        {
                            newTrainingHistoricoObj = new tblMatrizFuncTreinHistorico();

                            newTrainingHistoricoObj.idTreinamento             = t.IdTreinamento;
                            newTrainingHistoricoObj.nomeTreinamento           = t.Nome;
                            newTrainingHistoricoObj.idTipoTreinamento         = (int)t.tblTipoTreinamento.IdTipoTreinamento;
                            newTrainingHistoricoObj.nomeTipoTreinamento       = t.tblTipoTreinamento.Nome;
                            newTrainingHistoricoObj.siglaTipoTreinamento      = t.tblTipoTreinamento.Sigla;
                            newTrainingHistoricoObj.idFuncionario             = wz.idFuncionario;
                            newTrainingHistoricoObj.nomeFuncionario           = wz.tblFuncionarios.Nome;
                            newTrainingHistoricoObj.REFuncionario             = wz.tblFuncionarios.RE;
                            newTrainingHistoricoObj.BUFuncionario             = wz.tblFuncionarios.idBu_Origem.ToString();
                            newTrainingHistoricoObj.idItemPerfil              = 0;
                            newTrainingHistoricoObj.siglaItemPerfil           = "";
                            newTrainingHistoricoObj.idMatrizWorkzoneHistorico = matrizHistoricoCreated.idMatrizHistorico;

                            trainingHist.Add(newTrainingHistoricoObj);

                            //_matrizHistoricoService.SalvarTreinHistorico(newTrainingHistoricoObj);
                        }
                    }
                }
            }

            SetColorToHistory(trainingHist, atividadeHist);

            TransferirValoresMatrizTempToOficial(idWorkzone);

            // Apaga os valores da Matriz Temporária equivalente ao idWorkzone passado
            // Tabela que foi usada pra criar o histórico e passou seus valores pra matriz OFICIAL
            var matrizTemp = _matrizTempService.GetMatrizTempByWZId(idWorkzone);

            if (matrizTemp != null)
            {
                _matrizFuncActivityTempService.DeleteMatrizTempAll(matrizTemp.idMatrizWZTemp);
                _matrizFuncTrainingTempService.DeleteMatrizTempAll(matrizTemp.idMatrizWZTemp);
                _matrizTempService.DeleteMatrizTemp(matrizTemp.idMatrizWZTemp);
            }

            return(RedirectToAction("Index"));
        }
        public void SalvarActivityHistorico(tblMatrizFuncActivityHistorico actvityHistorico)
        {
            _db.tblMatrizFuncActivityHistorico.Add(actvityHistorico);

            _db.SaveChanges();
        }