bajapro/Penilaian-Esai/app/Http/Controllers/StudentCourseController.php
2025-06-07 16:18:13 +07:00

268 lines
12 KiB
PHP

<?php
namespace App\Http\Controllers;
use App\Models\BadgeSetting;
use App\Models\Content;
use App\Models\Course;
use App\Models\EssayQuestion;
use App\Models\Question;
use App\Models\StudentCourse;
use App\Models\User;
use App\Models\Level;
use App\Models\Lesson;
use App\Models\UserScore;
use App\Models\WonderingScore;
use App\Models\ExplainingScore;
use App\Models\TotalScore;
use App\Models\Explains;
use App\Models\ExerciseCodeLog;
use App\Models\UserAnswer;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Log;
use stdClass;
class StudentCourseController extends Controller
{
//
function __construct()
{
$this->middleware('auth');
}
public function index()
{
if (Auth::check()) {
$user_id = Auth::user()->id;
$student_courses = Course::select(["courses.id", "courses.course_name", "courses.description"])
->join("student_courses", "courses.id", "=", "student_courses.course_id")
->where("student_courses.user_id", $user_id)->get();
return view("student_courses.index", ["studentCourses" => $student_courses]);
}
}
public function detail($course_id)
{
$course = Course::find($course_id);
$total_score = UserScore::where("user_id", Auth::id())->sum("score");
$current_badge = BadgeSetting::all();
$fullbadge = BadgeSetting::all();
$getBadge = "(SELECT badge_settings.name FROM badge_settings WHERE badge_settings.min <= 'total_score' and badge_settings.max >= 'total_score' LIMIT 1)";
$getBadgeFile = "(SELECT badge_settings.file FROM badge_settings WHERE badge_settings.min <= 'total_score' and badge_settings.max >= 'total_score' LIMIT 1)";
$leader_board = UserScore::select(DB::raw("user_id, SUM(score) as total_score, $getBadge as badge_name, $getBadgeFile as file"))->groupBy("user_id")->orderBy("total_score", "DESC")->get();
$question = Question::where("is_essay", "1")->pluck("id");
$lboard = [];
foreach ($leader_board as $key => $lead) {
$answeredQues = UserScore::where("user_id", $lead->user_id)->whereIn("question_id", $question)->count();
$percentage = number_format((float)$answeredQues / $question->count() * 100, 1, '.', '');
$badge = BadgeSetting::where("min", "<=", $lead->total_score)->where("max", ">=", $lead->total_score)->first();
$lboard[$key]['user'] = User::find($lead->user_id)->name;
$lboard[$key]['total_score'] = $lead->total_score;
$lboard[$key]['percentage'] = $percentage;
$lboard[$key]['badge_name'] = $badge->name;
$lboard[$key]['file'] = $badge->file;
$lboard[$key]['answered_question'] = $answeredQues;
$lboard[$key]['code_questions'] = $question->count();
}
return view("student_courses.detail", [
"course" => $course,
"total_score" => $total_score,
"current_badge" => $current_badge,
"leader_board" => $lboard
]);
}
public function takeCourse(Request $request)
{
if (Auth::check()) {
$user_id = Auth::user()->id;
$check_course = StudentCourse::where(["user_id" => $user_id, "course_id" => $request["course_id"]]);
if ($check_course->count() == 0) {
$student_course = StudentCourse::create(["user_id" => $user_id, "course_id" => $request["course_id"]]);
if ($student_course->save()) {
session()->flash('msg_error1', 'You take it success');
return redirect()->back();
}
} else {
session()->flash('msg_error', 'You already take it');
return redirect()->back();
}
}
}
public function my_course($course_id , $level_id, $content_id = null)
{
if($content_id == 1){
$check = WonderingScore::where('user_id', Auth::id())->where('content_id', $content_id);
if($check->count()==0){
WonderingScore::create([
'user_id'=>Auth::id(),
'content_id' => $content_id,
'score'=>10,
]);
}
}
$course = Course::find($course_id);
$level = Level::find($level_id);
$contents = $content_id != null ? Content::find($content_id) : $level->lessons[0]->contents->first();
// $user_score = UserScore::where(["content_id" => $content_id == null ? $contents->id : $content_id, "user_id" => Auth::id()])->first();
$user_score = TotalScore::where(["content_id" => $content_id == null ? $contents->id : $content_id, "user_id" => Auth::id()])->first();
$wondering = WonderingScore::where(["user_id" => Auth::id()])->sum("score");
$exploring = UserScore::where("user_id", Auth::id())->sum("score");
$explainKonteks = ExplainingScore::where("user_id",Auth::id())->sum("konteks_penjelasan");
$explainBenar = ExplainingScore::where("user_id", Auth::id())->sum("kebenaran");
$explainKeruntutan = ExplainingScore::where("user_id", Auth::id())->sum("keruntutan");
$final_score = $wondering + $exploring + $explainKonteks + $explainBenar + $explainKeruntutan;
$current_badge = BadgeSetting::where("min", "<=", $final_score)->where("max", ">=", $final_score)->first();
$active_lesson = $content_id != null ? Content::find($content_id)->lesson : $level->lessons->first();
$questions = Question::where(["is_essay" => "0", "content_id" => $content_id])->get();
$code_test = Question::where(["is_essay" => "1", "content_id" => $content_id])->get();
$take = UserScore::where("user_id", Auth::id())->pluck("question_id")->toArray();
$check_read = WonderingScore::where(["user_id" => Auth::id()])->where('content_id', $content_id)->count();
$is_last = 0;
$check_explain = 0;
if($content_id != null){
$last_lesson = Lesson::where('level_id', $level_id)->orderBy('posisition', 'Desc')->first();
$content = Content::where('lesson_id', $last_lesson->id)->pluck('id')->toArray();
$last_question = Question::whereIn('content_id', $content)->pluck('id')->toArray();
$last_content = max($content);
$history_question = UserScore::where('user_id', Auth::id())->whereIn('content_id', $content)->pluck('question_id')->toArray();
$check_explain = Explains::where("user_id", Auth::id())->where('level_id', $level_id)->where('code', 0)->count();
$check_question = array_diff($last_question, $history_question);
if(empty($check_question) && $last_content == $content_id){
$is_last = 1;
}
}
// $tanya = Question::where('content_id', 7)->pluck('id')->toArray();
// $check = UserScore::where('user_id', Auth::user()->id)->where('content_id', 7)->orderBy('question_id', 'asc')->pluck('question_id')->toArray();
// $different = array_diff($tanya, $check);
// if(empty($different)){
// $pass = 1;
// } else{
// $pass =0;
// }
// dd([$tanya, $check, $pass]);
//active_lesson untuk melihat course yang dibuka saat ini
return view("student_courses.my_course", [
"level" => $level,
"course" => $course,
"content" => $contents,
"score" => $user_score,
"final_score" => $final_score,
"active_lesson" => $active_lesson,
"active_content" => $contents,
"current_badge" => $current_badge,
"questions" => $questions,
"code_tests" => $code_test,
"percentage" => UserScore::getPercentage(),
"finish_code_tests" => $take,
"is_last" => $is_last,
"check_explain" => $check_explain,
"check_read" => $check_read
]);
}
public function report()
{
$user_score = UserScore::where(["user_id" => Auth::id()])->get();
$take = UserScore::where("user_id", Auth::id())->pluck("question_id")->toArray();
$code_test_score = UserScore::where(["user_id" => Auth::id()])->whereNotNull("question_id")->get();
$wondering = WonderingScore::where(["user_id" => Auth::id()])->sum("score");
$exploring = UserScore::where("user_id", Auth::id())->sum("score");
$explainKonteks = ExplainingScore::where("user_id",Auth::id())->sum("konteks_penjelasan");
$explainBenar = ExplainingScore::where("user_id", Auth::id())->sum("kebenaran");
$explainKeruntutan = ExplainingScore::where("user_id", Auth::id())->sum("keruntutan");
$final_score = $wondering + $exploring + $explainKonteks + $explainBenar + $explainKeruntutan;
$current_badge = BadgeSetting::where("min", "<=", $final_score)->where("max", ">=", $final_score)->first();
// $his_error = ExerciseCodeLog::where()
// $his_success = ExerciseCodeLog::where
return view("student_courses.report", [
"score" => $user_score,
"final_score" => $final_score,
"current_badge" => $current_badge,
"percentage" => UserScore::getPercentage(),
"finish_code_tests" => $take,
"code_score" => $code_test_score,
]);
}
public function detailReport($question_id){
$user_id = Auth::id();
$question = Question::find($question_id);
// $score = UserScore::where("user_id", Auth::id())->where("question_id", $question_id)->first();
$score = TotalScore::where("user_id", Auth::id())->where("question_id", $question_id)->first();
$wondering = WonderingScore::where(["user_id" => Auth::id()])->sum("score");
$exploring = UserScore::where("user_id", Auth::id())->sum("score");
$explainKonteks = ExplainingScore::where("user_id",Auth::id())->sum("konteks_penjelasan");
$explainBenar = ExplainingScore::where("user_id", Auth::id())->sum("kebenaran");
$explainKeruntutan = ExplainingScore::where("user_id", Auth::id())->sum("keruntutan");
$final_score = $wondering + $exploring + $explainKonteks + $explainBenar + $explainKeruntutan;
$exercise_logs = ExerciseCodeLog::where("user_id", Auth::id())->where("question_id", $question_id)->orderBy('id','DESC')->get();
$essay = EssayQuestion::where('question_id', $question_id)->pluck('id');
$explain = UserAnswer::whereIn('essay_question_id', $essay)->where('user_id', $user_id)->get();
$title = "code";
return view("student_courses.detail_report", compact('exercise_logs', 'score', 'question', 'explain', 'title', 'final_score'));
}
public function level($course_id){
$level = Level::where('course_id', $course_id)->get();
$l = Level::firstwhere('id',2);
//isi level 1
$level_down = $l->id - 1;
$lessons1 = Lesson::where('level_id', $level_down)->pluck('id');
$content1 = Content::whereIn('lesson_id', $lessons1)->pluck('id');
$question1 = Question::whereIn('content_id', $content1)->pluck('id')->toArray();
$check = UserScore::where('user_id', Auth::user()->id)->where('level_id', $level_down)->orderBy('question_id', 'asc')->pluck('question_id')->toArray();
return view("student_courses.level", compact('level', 'course_id'));
}
public function readScore(Request $request){
try{
$content_id = $request->input('content_id');
$check = WonderingScore::where('user_id', Auth::id())->where('content_id', $content_id);
if($check->count() == 0){
WonderingScore::create([
'user_id' => Auth::id(),
'content_id' => $content_id,
'score' => 10,
]);
}
return response()->json([
'status' => '200',
'message' => 'Success add score',
],200);
} catch(Exception $err){
return response()->json([
'status' => '500',
'message' => 'Error add score',
],500);
}
}
}