-
Kurniandha Sukma Yunastrian authoredc8252ede
PhaseController.php 27.30 KiB
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Auth;
class PhaseController extends Controller
{
/**
* Create a new controller instance.
*
* @return void
*/
public function __construct()
{
$this->middleware('auth');
}
/**
* Show the application dashboard.
*
* @return \Illuminate\Contracts\Support\Renderable
*/
public function index($idProject, $phaseNumber)
{
$view;
$project = DB::table('projects')->where('id', $idProject)->first();
$userRole = DB::table('userprojects')->where('idProject', $idProject)->where('idUser', Auth::id())->first()->role;
if ($project->phase < $phaseNumber) {
abort(404);
}
if ($phaseNumber == 1) {
$view = PhaseController::phase01View($project, $phaseNumber, $userRole);
} else if ($phaseNumber == 2) {
$view = PhaseController::phase02View($project, $phaseNumber, $userRole);
} else if ($phaseNumber == 3) {
$view = PhaseController::phase03View($project, $phaseNumber, $userRole);
} else if ($phaseNumber == 4) {
$view = PhaseController::phase04View($project, $phaseNumber, $userRole);
} else if ($phaseNumber == 5) {
$view = PhaseController::phase05View($project, $phaseNumber, $userRole);
} else if ($phaseNumber == 6) {
$view = PhaseController::phase06View($project, $phaseNumber, $userRole);
} else if ($phaseNumber == 7) {
$view = PhaseController::phase07View($project, $phaseNumber, $userRole);
} else {
abort(404);
}
return $view;
}
/**
* Update phase
*/
public function updatePhase(Request $request)
{
$currentPhaseNumber = DB::table('projects')->where('id', $request->projectId)->first()->phase;
if ($currentPhaseNumber == 2) {
PhaseController::calculateCriteriaVotes($request->projectId);
} else if ($currentPhaseNumber == 4) {
PhaseController::calculateCriteriaWeightVotes($request->projectId);
} else if ($currentPhaseNumber == 5) {
PhaseController::calculateScores($request->projectId);
PhaseController::determineScorestatus($request->projectId);
} else if ($currentPhaseNumber == 6) {
PhaseController::calculateScoreStatusVotes($request->projectId);
} else if ($currentPhaseNumber == 7) {
PhaseController::calculateRequirementScore($request->projectId);
}
DB::table('projects')->where('id', $request->projectId)->increment('phase');
DB::table('userprojects')->where('idProject', $request->projectId)->where('idUser', Auth::id())->increment('phase');
return redirect()->route('project', ['id' => $request->projectId])->with('msg', 'Phase updated successfully');
}
/**
* Open view first phase.
*/
public function phase01View($project, $phaseNumber, $userRole)
{
if ($userRole == 1) {
$members = DB::table('userprojects')->where('idProject', $project->id)->where('role', 2)->get();
$users = [];
foreach($members as $member) {
$user = DB::table('users')->where('id', $member->idUser)->first();
$status = "Done";
if ($member->phase == 1) {
$status = "WIP";
}
$userWithStatus = array(
"name" => $user->name,
"status" => $status
);
$users[] = $userWithStatus;
}
return view('phase.phase01', ['project' => $project, 'phaseNumber' => $phaseNumber, 'phaseName' => 'Submit value criteria candidate', 'role' => $userRole, 'users' => $users]);
} else {
return view('phase.phase01', ['project' => $project, 'phaseNumber' => $phaseNumber, 'phaseName' => 'Submit value criteria candidate', 'role' => $userRole]);
}
}
/**
* Submit first phase.
*/
public function phase01Submit(Request $request)
{
DB::table('criterias')->updateOrInsert([
'idProject' => $request->projectId,
'name' => $request->criteria1,
'used' => 0
]);
DB::table('criterias')->updateOrInsert([
'idProject' => $request->projectId,
'name' => $request->criteria2,
'used' => 0
]);
DB::table('criterias')->updateOrInsert([
'idProject' => $request->projectId,
'name' => $request->criteria3,
'used' => 0
]);
if ($request->criteria4 != null) {
DB::table('criterias')->updateOrInsert([
'idProject' => $request->projectId,
'name' => $request->criteria4,
'used' => 0
]);
}
if ($request->criteria5 != null) {
DB::table('criterias')->updateOrInsert([
'idProject' => $request->projectId,
'name' => $request->criteria5,
'used' => 0
]);
}
DB::table('userprojects')->where('idUser', Auth::id())->increment('phase');
return redirect()->route('project', ['id' => $request->projectId])->with('msg', 'Phase 1 submitted successfully');
}
/**
* Open view second phase.
*/
public function phase02View($project, $phaseNumber, $userRole)
{
if ($userRole == 1) {
$members = DB::table('userprojects')->where('idProject', $project->id)->where('role', 2)->get();
$users = [];
foreach($members as $member) {
$user = DB::table('users')->where('id', $member->idUser)->first();
$status = "Done";
if ($member->phase == 2) {
$status = "WIP";
}
$userWithStatus = array(
"name" => $user->name,
"status" => $status
);
$users[] = $userWithStatus;
}
return view('phase.phase02', ['project' => $project, 'phaseNumber' => $phaseNumber, 'phaseName' => 'Vote Criteria', 'role' => $userRole, 'users' => $users]);
} else {
$criterias = DB::table('criterias')->where('idProject', $project->id)->get();
return view('phase.phase02', ['project' => $project, 'phaseNumber' => $phaseNumber, 'phaseName' => 'Vote Criteria', 'role' => $userRole, 'criterias' => $criterias]);
}
}
/**
* Submit second phase.
*/
public function phase02Submit(Request $request)
{
if ($request->criteria1) {
DB::table('criteriavotes')->updateOrInsert([
'idUser' => Auth::id(),
'idCriteria' => $request->criteria1
]);
}
if ($request->criteria2) {
DB::table('criteriavotes')->updateOrInsert([
'idUser' => Auth::id(),
'idCriteria' => $request->criteria2
]);
}
if ($request->criteria3) {
DB::table('criteriavotes')->updateOrInsert([
'idUser' => Auth::id(),
'idCriteria' => $request->criteria3
]);
}
if ($request->criteria4) {
DB::table('criteriavotes')->updateOrInsert([
'idUser' => Auth::id(),
'idCriteria' => $request->criteria4
]);
}
if ($request->criteria5) {
DB::table('criteriavotes')->updateOrInsert([
'idUser' => Auth::id(),
'idCriteria' => $request->criteria5
]);
}
DB::table('userprojects')->where('idUser', Auth::id())->increment('phase');
return redirect()->route('project', ['id' => $request->projectId])->with('msg', 'Phase 2 submitted successfully');
}
/**
* Open view third phase.
*/
public function phase03View($project, $phaseNumber, $userRole)
{
if ($userRole == 1) {
$members = DB::table('userprojects')->where('idProject', $project->id)->where('role', 2)->get();
$users = [];
foreach($members as $member) {
$user = DB::table('users')->where('id', $member->idUser)->first();
$status = "Done";
if ($member->phase == 3) {
$status = "WIP";
}
$userWithStatus = array(
"name" => $user->name,
"status" => $status
);
$users[] = $userWithStatus;
}
return view('phase.phase03', ['project' => $project, 'phaseNumber' => $phaseNumber, 'phaseName' => 'Submit Weight of Criteria', 'role' => $userRole, 'users' => $users]);
} else {
$criterias = DB::table('criterias')->where('idProject', $project->id)->where('used', 1)->get();
return view('phase.phase03', ['project' => $project, 'phaseNumber' => $phaseNumber, 'phaseName' => 'Submit Weight of Criteria', 'role' => $userRole, 'criterias' => $criterias]);
}
}
/**
* Submit third phase.
*/
public function phase03Submit(Request $request)
{
DB::table('criteriaweights')->updateOrInsert(
['idCriteria' => $request->criteria1, 'weight' => $request->weight1],
['idUser' => Auth::id()]
);
DB::table('criteriaweights')->updateOrInsert(
['idCriteria' => $request->criteria2, 'weight' => $request->weight2],
['idUser' => Auth::id()]
);
DB::table('criteriaweights')->updateOrInsert(
['idCriteria' => $request->criteria3, 'weight' => $request->weight3],
['idUser' => Auth::id()]
);
DB::table('criteriaweights')->updateOrInsert(
['idCriteria' => $request->criteria4, 'weight' => $request->weight4],
['idUser' => Auth::id()]
);
DB::table('criteriaweights')->updateOrInsert(
['idCriteria' => $request->criteria5, 'weight' => $request->weight5],
['idUser' => Auth::id()]
);
DB::table('userprojects')->where('idUser', Auth::id())->increment('phase');
return redirect()->route('project', ['id' => $request->projectId])->with('msg', 'Phase 3 submitted successfully');
}
/**
* Open view fourth phase.
*/
public function phase04View($project, $phaseNumber, $userRole)
{
if ($userRole == 1) {
$members = DB::table('userprojects')->where('idProject', $project->id)->where('role', 2)->get();
$users = [];
foreach($members as $member) {
$user = DB::table('users')->where('id', $member->idUser)->first();
$status = "Done";
if ($member->phase == 4) {
$status = "WIP";
}
$userWithStatus = array(
"name" => $user->name,
"status" => $status
);
$users[] = $userWithStatus;
}
return view('phase.phase04', ['project' => $project, 'phaseNumber' => $phaseNumber, 'phaseName' => 'Vote Weight', 'role' => $userRole, 'users' => $users]);
} else {
$criterias = DB::table('criterias')->where('idProject', $project->id)->where('used', 1)->get();
$weights = [];
foreach($criterias as $criteria) {
$weights[] = DB::table('criteriaweights')->where('idCriteria', $criteria->id)->get();
}
return view('phase.phase04', ['project' => $project, 'phaseNumber' => $phaseNumber, 'phaseName' => 'Vote Weight', 'role' => $userRole, 'criterias' => $criterias, 'weights' => $weights]);
}
}
/**
* Submit fourth phase.
*/
public function phase04Submit(Request $request)
{
if ($request->weight1) {
DB::table('criteriaweightvotes')->updateOrInsert([
'idUser' => Auth::id(),
'idWeight' => $request->weight1
]);
}
if ($request->weight2) {
DB::table('criteriaweightvotes')->updateOrInsert([
'idUser' => Auth::id(),
'idWeight' => $request->weight2
]);
}
if ($request->weight3) {
DB::table('criteriaweightvotes')->updateOrInsert([
'idUser' => Auth::id(),
'idWeight' => $request->weight3
]);
}
if ($request->weight4) {
DB::table('criteriaweightvotes')->updateOrInsert([
'idUser' => Auth::id(),
'idWeight' => $request->weight4
]);
}
if ($request->weight5) {
DB::table('criteriaweightvotes')->updateOrInsert([
'idUser' => Auth::id(),
'idWeight' => $request->weight5
]);
}
DB::table('userprojects')->where('idUser', Auth::id())->increment('phase');
return redirect()->route('project', ['id' => $request->projectId])->with('msg', 'Phase 4 submitted successfully');
}
/**
* Open view fifth phase.
*/
public function phase05View($project, $phaseNumber, $userRole)
{
if ($userRole == 1) {
$members = DB::table('userprojects')->where('idProject', $project->id)->where('role', 2)->get();
$users = [];
foreach($members as $member) {
$user = DB::table('users')->where('id', $member->idUser)->first();
$status = "Done";
if ($member->phase == 5) {
$status = "WIP";
}
$userWithStatus = array(
"name" => $user->name,
"status" => $status
);
$users[] = $userWithStatus;
}
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 Score', 'role' => $userRole, 'requirements' => $requirements, 'criterias' => $criterias]);
}
}
/**
* Submit fifth phase.
*/
public function phase05Submit(Request $request)
{
$requirements = DB::table('requirements')->where('idProject', $request->projectId)->get();
for ($i = 1; $i <= count($requirements); $i++) {
for ($j = 1; $j <= 5; $j++) {
DB::table('userscores')->updateOrInsert([
'idUser' => Auth::id(),
'idRequirement' => $request->input('requirement-' . $i . '-' . $j),
'idCriteria' => $request->input('criteria-' . $i . '-' . $j),
'score' => $request->input('score-' . $i . '-' . $j)
]);
}
}
DB::table('userprojects')->where('idUser', Auth::id())->increment('phase');
return redirect()->route('project', ['id' => $request->projectId])->with('msg', 'Phase 5 submitted successfully');
}
/**
* Open view sixth phase.
*/
public function phase06View($project, $phaseNumber, $userRole)
{
if ($userRole == 1) {
$members = DB::table('userprojects')->where('idProject', $project->id)->where('role', 2)->get();
$users = [];
foreach($members as $member) {
$user = DB::table('users')->where('id', $member->idUser)->first();
$status = "Done";
if ($member->phase == 6) {
$status = "WIP";
}
$userWithStatus = array(
"name" => $user->name,
"status" => $status
);
$users[] = $userWithStatus;
}
$requirements = DB::table('requirements')->where('idProject', $project->id)->get();
$criterias = DB::table('criterias')->where('idProject', $project->id)->where('used', 1)->get();
$scores = [];
foreach($requirements as $requirement) {
foreach($criterias as $criteria) {
$score = DB::table('scores')->where('idRequirement', $requirement->id)->where('idCriteria', $criteria->id)->first();
$scores[] = $score;
}
}
return view('phase.phase06', ['project' => $project, 'phaseNumber' => $phaseNumber, 'phaseName' => 'Vote for Unapproved Score', 'role' => $userRole, 'users' => $users, 'requirements' => $requirements, 'criterias' => $criterias, 'scores' => $scores]);
} else {
$requirements = DB::table('requirements')->where('idProject', $project->id)->get();
$criterias = DB::table('criterias')->where('idProject', $project->id)->where('used', 1)->get();
$scores = [];
$isAllApproved = true;
foreach($requirements as $requirement) {
foreach($criterias as $criteria) {
$score = DB::table('scores')->where('idRequirement', $requirement->id)->where('idCriteria', $criteria->id)->first();
if ($score->status == 0) {
$isAllApproved = false;
}
$scores[] = $score;
}
}
return view('phase.phase06', ['project' => $project, 'phaseNumber' => $phaseNumber, 'phaseName' => 'Vote for Unapproved Score', 'role' => $userRole, 'requirements' => $requirements, 'criterias' => $criterias, 'scores' => $scores, 'isAllApproved' => $isAllApproved]);
}
}
/**
* Submit sixth phase.
*/
public function phase06Submit(Request $request)
{
foreach($request->scoreId as $index => $id) {
DB::table('scorevotes')->updateOrInsert([
'idUser' => Auth::id(),
'idScore' => $id,
'vote' => $request->scoreVal[$index]
]);
}
DB::table('userprojects')->where('idUser', Auth::id())->increment('phase');
return redirect()->route('project', ['id' => $request->projectId])->with('msg', 'Phase 6 submitted successfully');
}
/**
* Open view seventh phase.
*/
public function phase07View($project, $phaseNumber, $userRole)
{
$requirements = DB::table('requirements')->where('idProject', $project->id)->get();
$criterias = DB::table('criterias')->where('idProject', $project->id)->where('used', 1)->get();
$scores = [];
$isAllApproved = true;
foreach($requirements as $requirement) {
foreach($criterias as $criteria) {
$score = DB::table('scores')->where('idRequirement', $requirement->id)->where('idCriteria', $criteria->id)->first();
if ($score->status == 0) {
$isAllApproved = false;
}
$scores[] = $score;
}
}
return view('phase.phase07', ['project' => $project, 'phaseNumber' => $phaseNumber, 'phaseName' => 'Discuss Unapproved Score', 'role' => $userRole, 'requirements' => $requirements, 'criterias' => $criterias, 'scores' => $scores, 'isAllApproved' => $isAllApproved]);
}
/**
* Submit seventh phase.
*/
public function phase07Submit(Request $request)
{
foreach($request->scoreId as $index => $id) {
$affected = DB::table('scores')->where('id', $id)->update(['status' => 1]);
$affected = DB::table('scores')->where('id', $id)->update(['score' => $request->scoreVal[$index]]);
}
DB::table('userprojects')->where('idUser', Auth::id())->increment('phase');
return redirect()->route('project', ['id' => $request->projectId])->with('msg', 'Phase 7 submitted successfully');
}
/**
* Calculate criteria votes from second phase.
*/
public function calculateCriteriaVotes($projectId)
{
$criterias = DB::table('criterias')->where('idProject', $projectId)->get();
$criteriaVotes = DB::table('criteriavotes')->get();
$votes = [];
foreach($criterias as $criteria) {
$vote = 0;
foreach($criteriaVotes as $criteriaVote) {
if ($criteria->id == $criteriaVote->idCriteria) {
$vote += 1;
}
}
$votes[] = $vote;
}
$finalCriteria = [];
for ($i = 0; $i < 5; $i++) {
$id = -1;
$max = -1;
for ($j = 0; $j < count($votes); $j++) {
if ($max <= $votes[$j]) {
$id = $j;
$max = $votes[$j];
}
}
$finalCriteria[] = $criterias[$id]->id;
$votes[$id] = -2;
}
for ($i = 0; $i < count($finalCriteria); $i++) {
$affected = DB::table('criterias')->where('id', $finalCriteria[$i])->update(['used' => 1]);
}
}
/**
* Calculate criteria weight votes from fourth phase.
*/
public function calculateCriteriaWeightVotes($projectId)
{
$criterias = DB::table('criterias')->where('idProject', $projectId)->where('used', 1)->get();
$weights = [];
foreach($criterias as $criteria) {
$weights[] = DB::table('criteriaweights')->where('idCriteria', $criteria->id)->get();
}
$weightVotes = DB::table('criteriaweightvotes')->get();
$finalWeight = [];
foreach($weights as $weight) {
$votes = [];
foreach($weight as $singleWeight) {
$vote = 0;
foreach($weightVotes as $weightVote) {
if ($singleWeight->id == $weightVote->idWeight) {
$vote += 1;
}
}
$votes[] = $vote;
}
$id = -1;
$max = -1;
for ($j = 0; $j < count($votes); $j++) {
if ($max <= $votes[$j]) {
$id = $j;
$max = $votes[$j];
}
}
$finalWeight[] = $weight[$id]->id;
}
foreach($finalWeight as $final) {
$weight = DB::table('criteriaweights')->where('id', $final)->first();
$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]);
}
}
}
}
/**
* Calculate criteria weight votes from fourth phase.
*/
public function calculateScoreStatusVotes($projectId)
{
$requirements = DB::table('requirements')->where('idProject', $projectId)->get();
$criterias = DB::table('criterias')->where('idProject', $projectId)->where('used', 1)->get();
$scores = [];
$countMembers = DB::table('userprojects')->where('idProject', $projectId)->where('role', 2)->count();
$agreementLimit = $countMembers * 2 / 3;
foreach($requirements as $requirement) {
foreach($criterias as $criteria) {
$score = DB::table('scores')->where('idRequirement', $requirement->id)->where('idCriteria', $criteria->id)->where('status', 0)->first();
if($score) {
$scores[] = $score;
}
}
}
$scoreVotes = DB::table('scoreVotes')->get();
$finalStatus = [];
foreach($scores as $score) {
$vote = 0;
foreach($scoreVotes as $scoreVote) {
if ($score->id == $scoreVote->idScore) {
$vote += $scoreVote->vote;
}
}
if ($vote > $agreementLimit) {
$affected = DB::table('scores')->where('id', $score->id)->update(['status' => 1]);
}
}
}
/**
* Calculate requirement score from seventh phase.
*/
public function calculateRequirementScore($projectId)
{
$requirements = DB::table('requirements')->where('idProject', $projectId)->get();
$criterias = DB::table('criterias')->where('idProject', $projectId)->where('used', 1)->get();
foreach($requirements as $requirement) {
$requirementScore = 0;
foreach($criterias as $criteria) {
$criteriaScore = DB::table('scores')->where('idRequirement', $requirement->id)->where('idCriteria', $criteria->id)->first();
$requirementScore += $criteriaScore->score * $criteria->weight;
}
$affected = DB::table('requirements')->where('id', $requirement->id)->update(['score' => $requirementScore]);
}
}
}