/Smart-Grace-Mark-Calculator

A user-friendly, interactive web app that removes the tedious task of class advisers manually entering grace marks and uses an efficient algorithm to allocate grace marks for eligible students to maximize their grades.

Primary LanguageJavaScript

Smart-Grace-Mark-Calculator

Quality Gate Status Bugs Security Rating Maintainability RatingDuplicated Lines (%) Lines of Code

Student Profile Page

Student Profile Page

Faculty Mark Allocation Page

Student Profile Page

Student List for class Advisor

Student Profile Page

Grade change after Grace Mark

Student Profile Page

Admin Profile Page

Student Profile Page

Faculy List

Student Profile Page

Course Report

Student Profile Page

Grade Range

Student Profile Page

Gracemark List

Student Profile Page

Final Result page for students

Student Profile Page

Algorithm used to add grace mark and calculate new grade.

exports.calculateNewGrade = (req, res) => {
  const id = req.params.id;
  const { grace, gm } = req.body;
  if (gm === undefined) {
    return res.status(400).json({
      message: "No Grace Mark",
    });
  }
  for (let _range of grace) {
    if (_range.O === "") {
      return res.status(400).json({
        message: "Grade Ranges not set",
      });
    }
  }
  let maxCredits = 0;
  let GraceMarkUsed = 0;
  // If the person has failed in any subject one or more
  for (let info of grace) {
    if (
      parseInt(info.Total) < parseInt(info.P) &&
      parseInt(info.Total) + parseInt(gm) >= parseInt(info.P)
    ) {
      maxCredits = Math.max(maxCredits, info.credits);
    }
  }
  // The student has failed and if we add grace mark he will pass
  if (maxCredits != 0) {
    for (let info of grace) {
      if (info.Total < info.P && info.credits == maxCredits) {
        GraceMarkUsed = 1;
        info.Total = parseInt(info.Total) + parseInt(gm);
        let cid = info.CourseID;
        //Grade to P
        con.query(
          `UPDATE course_mark SET Total=?,Final_Grade=? WHERE CourseID=? AND RollNum=?;UPDATE course_mark SET final_status=? WHERE RollNum=?;UPDATE student SET final_status="N/P",cgpa_status=?,grace_status=? WHERE RollNum=?`,
          [info.Total, "P", cid, id, "P", id, "N/P", "P", id],
          (err, result) => {
            if (err) {
              return res.status(400).json({
                message: "Unable to Update",
              });
            }
            return res.json({
              message: "Total Marks Updated",
              Total: info.Total,
              Grade: "P",
            });
          }
        );
        break;
      }
    }
  }

  //If the student has not failed
  else {
    let passMaxCredits = 0;
    for (let info of grace) {
      let index = 0;
      let range = []; // minimum marks for each grade(in grade change)
      let gradeChange = []; // To handle A+ to O and A to A+
      if (info.Grade == "A+") {
        if (parseInt(info.Total) + parseInt(gm) >= parseInt(info.O)) {
          passMaxCredits = Math.max(
            passMaxCredits,
            0.5 * parseInt(info.credits)
          );
        }
      } else if (info.Grade != "O" && info.Grade != "A+") {
        range.push(parseInt(info.P));
        gradeChange.push(1);
        range.push(parseInt(info.C));
        gradeChange.push(1);
        range.push(parseInt(info.B));
        gradeChange.push(1);
        range.push(parseInt(info.Bp));
        gradeChange.push(1);
        range.push(parseInt(info.A));
        gradeChange.push(0.5);
        range.push(parseInt(info.Ap));
        gradeChange.push(0.5);
        range.push(parseInt(info.O));
        // Next grade that the student might get if we add grace marks (Index)
        while (range[index] < parseInt(info.Total)) {
          index++;
        }
        // Maximum Grade change for the available grace marks
        if (parseInt(info.Total) + parseInt(gm) >= parseInt(range[index])) {
          passMaxCredits = Math.max(
            passMaxCredits,
            gradeChange[index] * parseInt(info.credits)
          );

          console.log(
            "change index",
            gradeChange[index] * parseInt(info.credits)
          );
        }
      }
    }

    let changeValue = 0;
    let FinalGrade = "";
    for (let info of grace) {
      if (info.Grade == "A" || info.Grade == "A+") {
        changeValue = 0.5;
      } else {
        changeValue = 1;
      }

      //assigning to maximum grade change
      if (
        info.Grade != "O" &&
        changeValue * parseInt(info.credits) == passMaxCredits
      ) {
        // Before change to After Grade change
        GraceMarkUsed = 1;
        if (info.Grade == "P") {
          FinalGrade = "C";
        } else if (info.Grade == "C") {
          FinalGrade = "B";
        } else if (info.Grade == "B") {
          FinalGrade = "B+";
        } else if (info.Grade == "B+") {
          FinalGrade = "A";
        } else if (info.Grade == "A") {
          FinalGrade = "A+";
        } else {
          FinalGrade = "O";
        }
        //Update your Final Grade into data base both grade and marks reflected in database
        con.query(
          `UPDATE course_mark SET Total =? ,Final_Grade=? WHERE RollNum=? AND CourseID=?;UPDATE course_mark SET final_status=? WHERE RollNum=?;UPDATE student SET final_status="N/P", cgpa_status=?,grace_status=? WHERE RollNum=?`,
          [
            parseInt(info.Total) + parseInt(gm),
            FinalGrade,
            id,
            info.CourseID,
            "P",
            id,
            "N/P",
            "P",
            id,
          ],
          (err, result) => {
            if (err) {
              return res.status(400).json({
                message: "Unable to update Grades",
              });
            }
            return res.json({
              message: "Grades updated",
              Total: parseInt(info.Total) + parseInt(gm),
              Grade: FinalGrade,
            });
          }
        );
        break;
      }
    }
  }
  if (GraceMarkUsed == 0) {
    return res.json({
      message: "No Grade Change",
    });
  }
};