public List <Semana> GetSemanas(int ano, int idProduto, int matricula, Semana.TipoAba aba) { try { const int ativo = 1; const int inativo = 0; const int produtoAdaptamed = 73; new Util.Log().SetLog(new LogMsPro { Matricula = matricula, IdApp = Aplicacoes.MsProMobile, Tela = aba == Semana.TipoAba.Aulas ? Util.Log.MsProLog_Tela.MainAula : aba == Semana.TipoAba.Questoes ? Util.Log.MsProLog_Tela.MainQuestao : 0, Acao = Util.Log.MsProLog_Acao.Abriu }); var anoVigente = Utilidades.GetYear(); using (var ctx = new DesenvContext()) { var lSemanas = new List <Semana>(); var semanaAtual = Utilidades.GetNumeroSemanaAtual(DateTime.Now); var listaEntidades = ctx.Set <msp_API_ListaEntidades_Result>().FromSqlRaw("msp_API_ListaEntidades @intProductGroup = {0}, @intYear = {1}, @matricula = {2}", idProduto, ano, matricula) .ToList(); int prod = ProdutoEntity.GetProductByCourse(idProduto); var temas = listaEntidades.Select(y => y.intLessonTitleID); var entidades = listaEntidades.Select(y => y.intID) .ToArray(); var acessoAntecipado = AlunoTemAcessoAntecipado(matricula); var semanas = listaEntidades.GroupBy(x => new { entidade = x.intID, semana = x.intSemana, dataInicio = x.dataInicio, datafim = x.datafim }) .ToList(); var mesesCursados = ctx.csp_loadMesesCursados(matricula, prod); var mesesCursadosAnoAnterior = mesesCursados.Where(x => x.intYear < anoVigente).Select(x => (int)x.intMonth).ToArray(); var mesesCursadosAnoAtual = mesesCursados.Where(x => x.intYear == anoVigente).Select(x => (int)x.intMonth).ToArray(); if (anoVigente > DateTime.Now.Year) { semanaAtual = 1; } var isSemanasDisabled = false; if (!semanas.Any()) { isSemanasDisabled = true; const int matriculaGlobal = 96409; semanas.AddRange(ctx.Set <msp_API_ListaEntidades_Result>().FromSqlRaw("msp_API_ListaEntidades @intProductGroup = {0}, @intYear = {1}, @matricula = {2}", idProduto, ano, matriculaGlobal).AsEnumerable() .GroupBy(x => new { entidade = x.intID, semana = x.intSemana, dataInicio = x.dataInicio, datafim = x.datafim }) .ToList()); } var dicProgressos = new Dictionary <int, int>(); var dicProgressosQuestoes = new Dictionary <long, int>(); switch (aba) { case Semana.TipoAba.Aulas: dicProgressos = new MednetEntity().GetProgressoAulas(temas.ToArray(), matricula); break; case Semana.TipoAba.Materiais: break; case Semana.TipoAba.Questoes: dicProgressosQuestoes = GetProgressoQuestoes(entidades, matricula); break; case Semana.TipoAba.Revalida: break; default: break; } foreach (var itSemana in semanas) { var numeroSemana = itSemana.Key.semana ?? 0; var semana = new Semana(); if (idProduto == produtoAdaptamed) { var currentYear = ano; if (currentYear == 0) { currentYear = DateTime.Now.Year; } var dataTextoInicio = itSemana.Key.dataInicio + "/" + currentYear; var dataInicio = DateTime.ParseExact(dataTextoInicio, "dd/MM/yyyy", CultureInfo.InvariantCulture); var liberacao = dataInicio <= DateTime.Now; semana.Ativa = isSemanasDisabled ? 0 : Convert.ToInt32(liberacao); semana.Numero = numeroSemana; semana.DataInicio = itSemana.Key.dataInicio; semana.DataFim = itSemana.Key.datafim; semana.Apostilas = new List <Apostila>(); semana.SemanaAtiva = Convert.ToInt32((dataTextoInicio == "15/09/2017")); } else { semana.Ativa = VerificaLiberacaoSemana(acessoAntecipado, isSemanasDisabled, semanaAtual, itSemana.Key.semana, mesesCursadosAnoAnterior, mesesCursadosAnoAtual, itSemana.Key.dataInicio); semana.Numero = numeroSemana; semana.DataInicio = itSemana.Key.dataInicio; semana.DataFim = itSemana.Key.datafim; semana.Apostilas = new List <Apostila>(); semana.SemanaAtiva = semanaAtual == numeroSemana ? ativo : inativo; } if (itSemana.Count() > 2) { var entidadeAgrupada = itSemana.GroupBy(y => new { idEntidade = y.intID, entidade = y.entidade }).ToList(); foreach (var entidade in entidadeAgrupada) { var percentlido = 0; switch (aba) { case Semana.TipoAba.Aulas: percentlido = semana.Ativa == 1 ? (int?)dicProgressos.FirstOrDefault(x => x.Key == entidade.First().intLessonTitleID).Value ?? 0 : 0; //GetProgressoAula(entidade.First().intLessonTitleID, matricula) : 0; break; case Semana.TipoAba.Materiais: percentlido = semana.Ativa == 1 ? new MaterialApostilaEntity().GetProgressoMaterial(entidade.First().intID, matricula) : 0; break; case Semana.TipoAba.Questoes: percentlido = semana.Ativa == 1 ? (int?)dicProgressosQuestoes.FirstOrDefault(x => x.Key == entidade.First().intID).Value ?? 0 : 0; //GetPercentQuestoes((int)entidade.First().intID, matricula) : 0; break; default: break; } var apostila = new Apostila { IdEntidade = (int)entidade.Key.idEntidade, Nome = entidade.Key.entidade, PercentLido = percentlido, Temas = new List <AulaTema>() }; foreach (var tema in entidade) { apostila.Temas.Add(new AulaTema { TemaID = tema.intLessonTitleID }); } semana.Apostilas.Add(apostila); if (entidadeAgrupada.Count() == 1) { semana.Apostilas.Add(apostila); } } } else { foreach (var tema in itSemana) { var percentlido = 0; switch (aba) { case Semana.TipoAba.Aulas: //percentlido = semana.Ativa == 1 ? GetProgressoAula(tema.intLessonTitleID, matricula) : 0; percentlido = semana.Ativa == 1 ? (int?)dicProgressos.FirstOrDefault(x => x.Key == tema.intLessonTitleID).Value ?? 0 : 0; break; case Semana.TipoAba.Materiais: //percentlido = semana.Ativa == 1 ? new MaterialApostilaEntity().GetProgressoMaterial(semana.Apostilas.FirstOrDefault().IdEntidade, matricula) : 0; percentlido = new MaterialApostilaEntity().GetProgressoMaterial(tema.intID, matricula); break; case Semana.TipoAba.Questoes: percentlido = semana.Ativa == 1 ? (int?)dicProgressosQuestoes.FirstOrDefault(x => x.Key == tema.intID).Value ?? 0 : 0; // GetPercentQuestoes((int)tema.intID, matricula) : 0; break; default: break; } var apostila = new Apostila { IdEntidade = (int)tema.intID, Nome = tema.entidade, PercentLido = percentlido, Temas = new List <AulaTema>() }; apostila.Temas.Add(new AulaTema { TemaID = tema.intLessonTitleID }); semana.Apostilas.Add(apostila); if (itSemana.Count() == 1) { semana.Apostilas.Add(apostila); } } } lSemanas.Add(semana); } //Se nenhuma semana estiver marcada como semana atual, marca a ultima if (lSemanas.Any() && lSemanas.All(x => x.SemanaAtiva != 1)) { lSemanas.Last().SemanaAtiva = 1; } return(lSemanas); } } catch { throw; } }