File "Exam.php"
Full Path: /home/trinadezambia/public_html/admin_panel/app/Models/Exam.php
File size: 7.33 KB
MIME-type: text/x-php
Charset: utf-8
<?php
namespace App\Models;
use App\Traits\DateFormatTrait;
use Carbon\Carbon;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Log;
use App\Services\CachingService;
class Exam extends Model
{
use HasFactory;
use SoftDeletes;
use DateFormatTrait;
protected $fillable = [
'name',
'session_year_id',
'description',
'start_date',
'end_date',
'school_id',
'publish',
'last_result_submission_date',
'class_id'
];
protected $hidden = ['created_at', 'updated_at'];
protected $appends = ["exam_status", "exam_status_name", "has_timetable", "class_name"];
public function class()
{
return $this->belongsTo(ClassSchool::class, 'class_id')->withTrashed();
}
public function session_year()
{
return $this->belongsTo(SessionYear::class, 'session_year_id')->withTrashed();
}
public function marks()
{
return $this->hasManyThrough(ExamMarks::class, ExamTimetable::class, 'exam_id', 'exam_timetable_id')->orderBy('date');
}
public function timetable()
{
return $this->hasMany(ExamTimetable::class);
}
public function results()
{
return $this->hasMany(ExamResult::class, 'exam_id');
}
public function semester()
{
return $this->belongsTo(Semester::class, 'semester_id')->withTrashed();
}
public function scopeOwner($query)
{
if (Auth::user()) {
$sessionYearId = app(CachingService::class)->getSessionYear()->id;
if (Auth::user()->school_id) {
if (Auth::user()->hasRole('School Admin')) {
return $query->where(['school_id' => Auth::user()->school_id, 'session_year_id' => $sessionYearId]);
}
if (Auth::user()->hasRole('Teacher')) {
$classTeacherData = ClassTeacher::where(['teacher_id' => Auth::user()->id, 'session_year_id' => $sessionYearId])->with('class_section')->get();
$subjectTeacherData = SubjectTeacher::where(['teacher_id' => Auth::user()->id, 'session_year_id' => $sessionYearId])->with('class_section')->get();
$subjectTeacherData = $subjectTeacherData->pluck('class_section.class_id')->filter()->toArray();
$classIds = $classTeacherData->pluck('class_id')->filter()->toArray();
$classIds = array_merge($subjectTeacherData, $classIds);
$classIds = array_unique($classIds);
return $query->whereIn('class_id', $classIds)->where(['school_id' => Auth::user()->school_id, 'session_year_id' => $sessionYearId]);
}
if (Auth::user()->hasRole('Student')) {
return $query->where(['school_id' => Auth::user()->school_id, 'session_year_id' => $sessionYearId]);
}
return $query->where(['school_id' => Auth::user()->school_id, 'session_year_id' => $sessionYearId]);
}
if (!Auth::user()->school_id) {
if (Auth::user()->hasRole('Super Admin')) {
return $query;
}
if (Auth::user()->hasRole('Guardian')) {
$childId = request('child_id');
$studentAuth = Students::where('id', $childId)->first();
return $query->where(['school_id' => $studentAuth->school_id, 'session_year_id' => $sessionYearId]);
}
return $query;
}
}
return $query;
}
public function getExamStatusAttribute()
{
if ($this->relationLoaded('timetable')) {
// $startDate = date('Y-m-d', strtotime($this->timetable->min('date')));
// $endDate = date('Y-m-d', strtotime($this->timetable->max('date')));
$startDate = $this->timetable->min(function ($item) {
return $item->getRawOriginal('date');
});
$endDate = $this->timetable->max(function ($item) {
return $item->getRawOriginal('date');
});
$currentTime = Carbon::now();
$current_date = date($currentTime->toDateString());
$current_time = Carbon::now();
// 0- Upcoming, 1-On Going, 2-Completed, 3-All Details
$exam_status = 3;
if ($current_date == $startDate && $current_date == $endDate) {
if (count($this->timetable)) {
$exam_end_time = Carbon::parse($this->timetable->first()->getRawOriginal('end_time'));
$exam_start_time = Carbon::parse($this->timetable->first()->getRawOriginal('start_time'));
if ($current_time->lt($exam_start_time)) {
$exam_status = "0";
} elseif ($current_time->gt($exam_end_time)) {
$exam_status = "2";
} else {
$exam_status = "1";
}
}
return $exam_status;
} else {
if (count($this->timetable)) {
if ($current_date < $startDate) {
$exam_status = "0"; // Upcoming
} elseif ($current_date >= $startDate && $current_date <= $endDate) {
$exam_status = "1"; // Ongoing
} else {
$exam_status = "2"; // Ended
}
} else {
$exam_status = 0;
}
}
return $exam_status;
}
return null;
}
public function getExamStatusNameAttribute()
{
if ($this->relationLoaded('timetable')) {
$startDate = $this->timetable->min('date');
$endDate = $this->timetable->max('date');
$currentDate = now()->toDateString();
if ($currentDate >= $startDate && $currentDate <= $endDate) {
return "On Going"; // Upcoming = 0 , On Going = 1 , Completed = 2
}
if ($currentDate < $startDate) {
return "Completed"; // Upcoming = 0 , On Going = 1 , Completed = 2
}
return "Upcoming"; // Upcoming = 0 , On Going = 1 , Completed = 2
}
return null;
}
public function getHasTimetableAttribute()
{
if ($this->relationLoaded('timetable')) {
return count($this->timetable) > 0;
}
return false;
}
public function getPrefixNameAttribute()
{
return $this->name . ' # ' . $this->class->name . ' - ' . $this->class->medium->name;
}
public function getClassNameAttribute()
{
if ($this->relationLoaded('class')) {
return $this->class->name . ' - ' . $this->class->medium->name;
}
return '';
}
public function getStartDateAttribute($value)
{
return $this->formatDateOnly($value);
}
public function getEndDateAttribute($value)
{
return $this->formatDateOnly($value);
}
public function getLastResultSubmissionDateAttribute($value)
{
if ($value ?? null) {
return $this->formatDateOnly($value);
}
return null;
}
}