diff --git a/app/Http/Controllers/PhaseController.php b/app/Http/Controllers/PhaseController.php
index b110bd6abcb91698d435c9efb9a75f4df997a6f1..a76ca2b6fde9cb0d4688fe7bb578a40a02b75a40 100644
--- a/app/Http/Controllers/PhaseController.php
+++ b/app/Http/Controllers/PhaseController.php
@@ -62,6 +62,9 @@ class PhaseController extends Controller
             PhaseController::calculateCriteriaVotes($request->projectId);
         } else if ($currentPhaseNumber == 4) {
             PhaseController::calculateCriteriaWeightVotes($request->projectId);
+        } else if ($currentPhaseNumber == 5) {
+            PhaseController::calculateScores($request->projectId);
+            PhaseController::determineScorestatus($request->projectId);
         }
 
         DB::table('projects')->where('id', $request->projectId)->increment('phase');
@@ -401,13 +404,13 @@ class PhaseController extends Controller
                 $users[] = $userWithStatus;
             }
 
-            return view('phase.phase05', ['project' => $project, 'phaseNumber' => $phaseNumber, 'phaseName' => 'Submit Weight of Criteria', 'role' => $userRole, 'users' => $users]);
+            return view('phase.phase05', ['project' => $project, 'phaseNumber' => $phaseNumber, 'phaseName' => 'Submit Score', 'role' => $userRole, 'users' => $users]);
         } else {
             $requirements = DB::table('requirements')->where('idProject', $project->id)->get();
 
             $criterias = DB::table('criterias')->where('idProject', $project->id)->where('used', 1)->get();
 
-            return view('phase.phase05', ['project' => $project, 'phaseNumber' => $phaseNumber, 'phaseName' => 'Submit Weight of Criteria', 'role' => $userRole, 'requirements' => $requirements, 'criterias' => $criterias]);
+            return view('phase.phase05', ['project' => $project, 'phaseNumber' => $phaseNumber, 'phaseName' => 'Submit Score', 'role' => $userRole, 'requirements' => $requirements, 'criterias' => $criterias]);
         }
     }
 
@@ -530,4 +533,71 @@ class PhaseController extends Controller
             $affected = DB::table('criterias')->where('id', $weight->idCriteria)->update(['weight' => $weight->weight]);
         }
     }
+
+    /**
+     * Calculate scores from fifth phase.
+     */
+    public function calculateScores($projectId) 
+    {
+        $requirements = DB::table('requirements')->where('idProject', $projectId)->get();
+
+        $criterias = DB::table('criterias')->where('idProject', $projectId)->where('used', 1)->get();
+            
+        foreach($requirements as $requirement) {
+            foreach($criterias as $criteria) {
+                $scores = DB::table('userscores')->where('idRequirement', $requirement->id)->where('idCriteria', $criteria->id)->get();
+            
+                $sumScore = 0;
+                foreach($scores as $score) {
+                    $sumScore += $score->score;
+                }
+
+                $avgScore = $sumScore / count($scores);
+
+                DB::table('scores')->updateOrInsert([
+                    'idRequirement' => $requirement->id,
+                    'idCriteria' => $criteria->id,
+                    'score' => $avgScore,
+                    'status' => 0
+                ]);
+            }
+        }
+    }
+
+    /**
+     * Determine score status from fifth phase.
+     */
+    public function determineScoreStatus($projectId) 
+    {
+        $requirements = DB::table('requirements')->where('idProject', $projectId)->get();
+
+        $criterias = DB::table('criterias')->where('idProject', $projectId)->where('used', 1)->get();
+        
+        $countMembers = DB::table('userprojects')->where('idProject', $projectId)->where('role', 2)->count();
+
+        $agreementLimit = $countMembers * 2 / 3;
+        $threshold = 1;
+
+        foreach($requirements as $requirement) {
+            foreach($criterias as $criteria) {
+                $score = DB::table('scores')->where('idRequirement', $requirement->id)->where('idCriteria', $criteria->id)->first();
+            
+                $userScores = DB::table('userscores')->where('idRequirement', $requirement->id)->where('idCriteria', $criteria->id)->get();
+
+                $agreementCount = 0;
+                $minVal = $score->score - $threshold;
+                $maxVal = $score->score + $threshold;
+                
+                foreach($userScores as $userScore) {
+                    if (($minVal <= $userScore->score) && ($userScore->score <= $maxVal)) {
+                        $agreementCount += 1;
+                    }
+                }
+
+                if ($agreementCount >= $agreementLimit) {
+                    $affected = DB::table('scores')->where('id', $score->id)->update(['status' => 1]);
+                }
+            }
+        }
+    }
 }
diff --git a/database/migrations/2021_05_19_035530_create_scores_table.php b/database/migrations/2021_05_19_035530_create_scores_table.php
index baecb65189d17fab993eb94d0a97a19607fc8ac6..e9b7316397a0378eaf4dbd5d187fd00f08fd3c4f 100644
--- a/database/migrations/2021_05_19_035530_create_scores_table.php
+++ b/database/migrations/2021_05_19_035530_create_scores_table.php
@@ -17,7 +17,7 @@ class CreateScoresTable extends Migration
             $table->id();
             $table->integer('idRequirement');
             $table->integer('idCriteria');
-            $table->integer('score');
+            $table->double('score', 8, 2)->nullable();
             $table->integer('status');
             $table->timestamps();
         });