File "ClassSchool.php"

Full Path: /home/trinadezambia/public_html/admin_panel/app/Models/ClassSchool.php
File size: 6.31 KB
MIME-type: text/x-php
Charset: utf-8

<?php

namespace App\Models;

use App\Services\CachingService;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;
use Illuminate\Support\Facades\Auth;
use App\Traits\DateFormatTrait;


class ClassSchool extends Model
{
    use SoftDeletes;
    use HasFactory, DateFormatTrait;

    protected $table = 'classes';
    protected $fillable = [
        'name',
        'include_semesters',
        'medium_id',
        'stream_id',
        'shift_id',
        'school_id'
    ];
    protected $appends = ['full_name', 'semester_name'];
    protected $hidden = ['created_at', 'updated_at'];

    public function announcement()
    {
        return $this->morphMany(Announcement::class, 'table');
    }

    public function medium()
    {
        return $this->belongsTo(Mediums::class)->select('name', 'id')->withTrashed();
    }

    public function class_sections()
    {
        return $this->hasMany(ClassSection::class, 'class_id')->withTrashed();
    }

    public function sections()
    {
        return $this->belongsToMany(Section::class, 'class_sections', 'class_id', 'section_id')->withPivot('id')->wherePivot('deleted_at');
    }

    public function section()
    {
        return $this->belongsToMany(Section::class, 'class_sections', 'class_id', 'section_id')->withPivot('id');
    }

    public function core_subjects()
    {
        return $this->belongsToMany(Subject::class, ClassSubject::class, 'class_id', 'subject_id')->wherePivot('type', 'Compulsory')->withPivot('id as class_subject_id', 'semester_id', 'session_year_id', 'syllabus_id')->where('class_subjects.deleted_at', null)->withTrashed();
    }

    public function elective_subjects()
    {
        return $this->belongsToMany(Subject::class, ClassSubject::class, 'class_id', 'subject_id')->wherePivot('type', 'Elective')->withPivot('id as class_subject_id', 'semester_id', 'session_year_id')->withTrashed();
    }

    public function all_subjects()
    {
        return $this->belongsToMany(Subject::class, ClassSubject::class, 'class_id', 'subject_id')->withPivot('id as class_subject_id', 'semester_id', 'session_year_id')->withTrashed();
    }

    //    public function semester() {
    //        return $this->hasMany(ClassSubject::class, 'class_id')->select('id', 'class_id', 'semester_id')->groupBy('semester_id');
    ////            ->with('semester:id,name');
    //    }

    public function elective_subject_groups()
    {
        return $this->hasMany(ElectiveSubjectGroup::class, 'class_id');
    }

    public function fees_class()
    {
        return $this->hasMany(FeesClassType::class, 'class_id');
    }

    public function class_teachers()
    {
        return $this->hasManyThrough(ClassTeacher::class, ClassSection::class, 'class_id', 'class_section_id');
    }

    public function subject_teachers()
    {
        return $this->hasManyThrough(SubjectTeacher::class, ClassSection::class, 'class_id', 'class_section_id');
    }

    public function stream()
    {
        return $this->belongsTo(Stream::class)->withTrashed();
    }

    public function shift()
    {
        return $this->belongsTo(Shift::class)->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);
                }


                if (Auth::user()->hasRole('Teacher')) {
                    $subjectTeacher = SubjectTeacher::where('teacher_id', Auth::user()->id)->where('session_year_id', $sessionYearId)->pluck('class_section_id');
                    $classTeacher = ClassTeacher::where('teacher_id', Auth::user()->id)->where('session_year_id', $sessionYearId)->pluck('class_section_id');
                    $classSectionIDS = array_merge(array_merge($subjectTeacher->toArray(), $classTeacher->toArray()));

                    $classIDS = ClassSection::whereIn('id', $classSectionIDS)->pluck('class_id');
                    return $query->whereIn('id', $classIDS)->where('school_id', Auth::user()->school_id);
                    //            return $query->where('school_id', Auth::user()->school_id)->whereHas('class_teachers', function ($q) {
                    //                $q->where('teacher_id', Auth::user()->id);
                    //            })->orWhereHas('subject_teachers', function ($q) {
                    //                $q->where('teacher_id', Auth::user()->id);
                    //            });
                }

                if (Auth::user()->hasRole('Student')) {
                    return $query->where('school_id', Auth::user()->school_id);
                }
                return $query->where('school_id', Auth::user()->school_id);
            }
            if (!Auth::user()->school_id) {
                if (Auth::user()->hasRole('Super Admin')) {
                    return $query;
                }
                return $query;
            }
        }


        return $query;
    }

    public function getFullNameAttribute()
    {
        $name = $this->name;

        if ($this->relationLoaded('medium') && $this->medium) {
            $name .= ' ' . $this->medium->name;
        }

        if ($this->relationLoaded('stream')) {
            $name .= !empty($this->stream->name) ? ' (' . $this->stream->name . ')' : '';
        }

        if ($this->relationLoaded('shift')) {
            $name .= !empty($this->shift->name) ? ' (' . $this->shift->name . ')' : '';
        }
        return $name;
    }

    public function getSemesterNameAttribute()
    {
        if ($this->include_semesters) {
            $cache = app(CachingService::class);
            $semester = $cache->getDefaultSemesterData();
            if ($semester) {
                return $semester->name;
            }
            return '';
        }
        return '';
    }

    public function streams()
    {
        return $this->belongsTo(Stream::class, 'stream_id')->withTrashed();
    }

    public function getCreatedAtAttribute()
    {
        return $this->formatDateValue($this->getRawOriginal('created_at'));
    }

    public function getUpdatedAtAttribute()
    {
        return $this->formatDateValue($this->getRawOriginal('updated_at'));
    }
}