public JsonResult EnviarNotaFalta(int idMatricula, int idAluno, int idTurma, int idModulo, string campo, string valor)
        {
            try
            {
                Repositorio<NotaFalta> dbNT = new Repositorio<NotaFalta>();
                NotaFalta notaFalta = dbNT.FindOne(x => x.idAluno == idAluno && x.idTurma == idTurma && x.idModulo == idModulo);
                NotaFalta nt;
                if (notaFalta == null)
                {
                    nt = new NotaFalta();
                    nt.idAluno = idAluno;
                    nt.idTurma = idTurma;
                    nt.idModulo = idModulo;
                    nt.nota1 = null;
                    nt.nota2 = null;
                    nt.qtdFalta = 0;
                    nt.notaFinal = null;
                }
                else
                {
                    nt = notaFalta;
                }

                switch (campo)
                {
                    case "Nota1":
                        nt.nota1 = !string.IsNullOrEmpty(valor) ?  Convert.ToDecimal(valor.Replace(".",",")) : (decimal?)null;
                        nt.notaFinal = nt.nota1;
                        break;
                    case "Nota2":
                        nt.nota2 = !string.IsNullOrEmpty(valor) ?  Convert.ToDecimal(valor.Replace(".",",")) : (decimal?)null;
                        break;
                    case "Faltas":
                        nt.qtdFalta = Convert.ToInt32(valor);
                        break;
                }
                if (notaFalta == null)
                {
                    dbNT.Adicionar(nt);
                }
                else
                {
                    dbNT.Atualizar(nt);
                }
                dbNT.SaveChanges();

                //Verifica a situação do aluno
                var ntFalta = verificaSituacao(idMatricula, idAluno, idTurma, idModulo);

                return Json(new { notaFalta = ntFalta, success = true }, JsonRequestBehavior.AllowGet);

            }
            catch (Exception e)
            {

                return Json(new { success = false, message = e.Message }, JsonRequestBehavior.AllowGet);

            }
        }
        public JsonResult EnviarNotaFalta(int idMatricula, int idAluno, int idTurma, int idModulo, string campo, string valor)
        {
            try
            {
                Repositorio <NotaFalta> dbNT = new Repositorio <NotaFalta>();
                NotaFalta notaFalta          = dbNT.FindOne(x => x.idAluno == idAluno && x.idTurma == idTurma && x.idModulo == idModulo);
                NotaFalta nt;
                if (notaFalta == null)
                {
                    nt           = new NotaFalta();
                    nt.idAluno   = idAluno;
                    nt.idTurma   = idTurma;
                    nt.idModulo  = idModulo;
                    nt.nota1     = null;
                    nt.nota2     = null;
                    nt.qtdFalta  = 0;
                    nt.notaFinal = null;
                }
                else
                {
                    nt = notaFalta;
                }

                switch (campo)
                {
                case "Nota1":
                    nt.nota1     = !string.IsNullOrEmpty(valor) ?  Convert.ToDecimal(valor.Replace(".", ",")) : (decimal?)null;
                    nt.notaFinal = nt.nota1;
                    break;

                case "Nota2":
                    nt.nota2 = !string.IsNullOrEmpty(valor) ?  Convert.ToDecimal(valor.Replace(".", ",")) : (decimal?)null;
                    break;

                case "Faltas":
                    nt.qtdFalta = Convert.ToInt32(valor);
                    break;
                }
                if (notaFalta == null)
                {
                    dbNT.Adicionar(nt);
                }
                else
                {
                    dbNT.Atualizar(nt);
                }
                dbNT.SaveChanges();

                //Verifica a situação do aluno
                var ntFalta = verificaSituacao(idMatricula, idAluno, idTurma, idModulo);

                return(Json(new { notaFalta = ntFalta, success = true }, JsonRequestBehavior.AllowGet));
            }
            catch (Exception e)
            {
                return(Json(new { success = false, message = e.Message }, JsonRequestBehavior.AllowGet));
            }
        }
        //Implementação das regras de negocio
        private NotaFalta verificaSituacao(int idMatricula, int idAluno, int idTurma, int idModulo)
        {
            NotaFalta nt = dbNotaFalta.FindOne(x => x.idAluno == idAluno && x.idTurma == idTurma && x.idModulo == idModulo);

            if (nt.nota1 != null && nt.qtdFalta != null)
            {
                Turma   t          = dbTurma.FindOne(x => x.idTurma == idTurma);
                Modulo  m          = dbModulo.FindOne(x => x.idModulo == idModulo);
                decimal percFaltas = (decimal)((nt.qtdFalta * 100) / m.tempoDuracao);
                if (nt.nota1 >= 7 && percFaltas <= 25)
                {
                    //Aprovado
                    atualizaSituacaoAluno(idAluno, idTurma, idModulo, EnumStatus.Aprovado);
                    nt.situacaoAluno = (int)EnumStatus.Aprovado;
                }
                else if (nt.nota1 >= 2 && nt.nota1 < 7 && percFaltas <= 25)
                {
                    if (((nt.nota2 / 2) + nt.nota1) >= 7)
                    {
                        //Aprovado após recuperação
                        atualizaSituacaoAluno(idAluno, idTurma, idModulo, EnumStatus.Aprovado);
                        nt.situacaoAluno = (int)EnumStatus.Aprovado;
                        if (nt.nota2 > 0)
                        {
                            nt.notaFinal = 7;
                            dbNotaFalta.Atualizar(nt);
                            dbNotaFalta.SaveChanges();
                        }
                    }
                    else if (nt.nota2 != null && ((nt.nota2 / 2) + nt.nota1) < 7)
                    {
                        //Aprovado após recuperação
                        atualizaSituacaoAluno(idAluno, idTurma, idModulo, EnumStatus.Reprovado);
                        nt.situacaoAluno = (int)EnumStatus.Reprovado;
                    }
                    else
                    {
                        //Recuperacao
                        atualizaSituacaoAluno(idAluno, idTurma, idModulo, EnumStatus.Recuperacao);
                        nt.situacaoAluno = (int)EnumStatus.Recuperacao;
                    }
                }
                else if (nt.nota1 < 2 || percFaltas > 25)
                {
                    //Reprovado
                    atualizaSituacaoAluno(idAluno, idTurma, idModulo, EnumStatus.Reprovado);
                    nt.situacaoAluno = (int)EnumStatus.Reprovado;
                }

                //Calcula média final
                int qtdModulos         = dbModulo.FindAll(x => x.idCurso == t.idCurso).Count;
                int qtdModulosCursados = dbNotaFalta.FindAll(x => x.idTurma == idTurma && x.idAluno == idAluno && x.nota1 != null).Count;
                if (qtdModulos == qtdModulosCursados)
                {
                    List <NotaFalta> lstNotaFalta = dbNotaFalta.FindAll(x => x.idTurma == idTurma && x.idAluno == idAluno);
                    int modulosAprovados          = lstNotaFalta.Where(x => x.situacaoAluno == (int)EnumStatus.Aprovado).Count();
                    var notaFinal = lstNotaFalta.Average(x => x.notaFinal);
                    if (modulosAprovados == qtdModulosCursados)
                    {
                        //Aprovado no curso
                        atualizaSituacaoFinalAluno(idMatricula, idTurma, EnumStatus.Aprovado, notaFinal.Value);
                    }
                    else
                    {
                        //Reprovado no curso
                        atualizaSituacaoFinalAluno(idMatricula, idTurma, EnumStatus.Reprovado, notaFinal.Value);
                    }
                }
            }

            return(nt);
        }