Create New Item
Item Type
File
Folder
Item Name
Search file in folder and subfolders...
Are you sure want to rename?
forbidals
/
admin_panel
/
app
/
Models
:
User.php
Advanced Search
Upload
New Item
Settings
Back
Back Up
Advanced Editor
Save
<?php namespace App\Models; use App\Repositories\StudentSubject\StudentSubjectInterface; use App\Services\CachingService; use App\Models\SessionYear; use App\Traits\DateFormatTrait; use Illuminate\Contracts\Auth\MustVerifyEmail; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Relations\HasMany; use Illuminate\Database\Eloquent\Relations\HasManyThrough; use Illuminate\Database\Eloquent\SoftDeletes; use Illuminate\Foundation\Auth\User as Authenticatable; use Illuminate\Notifications\Notifiable; use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Storage; use Laravel\Sanctum\HasApiTokens; use Spatie\Permission\Traits\HasPermissions; use Spatie\Permission\Traits\HasRoles; class User extends Authenticatable implements MustVerifyEmail { use HasApiTokens, HasFactory, Notifiable, HasRoles, SoftDeletes, HasPermissions, DateFormatTrait; /** * The attributes that are mass assignable. * * @var array */ protected $fillable = [ 'first_name', 'last_name', 'email', 'mobile', 'image', 'password', 'current_address', 'permanent_address', 'school_id', 'gender', 'dob', 'occupation', 'reset_request', 'status', 'deleted_at', 'email_verified_at', 'two_factor_secret', 'two_factor_expires_at', 'two_factor_enabled' ]; protected static function boot() { parent::boot(); static::deleting(static function ($user) { // before delete() method call this if ($user->isForceDeleting() && $user->getRawOriginal('image') && Storage::disk('public')->exists($user->getRawOriginal('image'))) { Storage::disk('public')->delete($user->getRawOriginal('image')); } }); } /** * The attributes that should be hidden for arrays. * * @var array */ protected $hidden = [ 'password', 'remember_token', ]; /** * The attributes that should be cast to native types. * * @var array */ protected $casts = [ 'email_verified_at' => 'datetime', ]; protected $appends = ['full_name', 'school_names', 'role']; public function student() { return $this->hasOne(Students::class, 'user_id', 'id')->withTrashed()->owner(); } public function promote_student() { return $this->hasMany(PromoteStudent::class, 'student_id', 'id'); } public function studentWithoutOwner() { return $this->hasOne(Students::class, 'user_id', 'id') ->withTrashed(); } // public function parent() { // return $this->hasOne(Parents::class, 'user_id', 'id'); // } public function staff() { return $this->hasOne(Staff::class, 'user_id', 'id'); } public function class_section_teacher() { return $this->hasOne(ClassSection::class, 'class_teacher_id')->withTrashed(); } /** * This method will only work with Teacher Role * @return HasManyThrough */ public function timetable() { return $this->hasManyThrough(Timetable::class, SubjectTeacher::class, 'teacher_id', 'subject_teacher_id'); } public function subjectTeachers() { return $this->hasMany(SubjectTeacher::class, 'teacher_id'); } public function school() { return $this->belongsTo(School::class)->withTrashed(); } public function students() { return $this->hasOne(Students::class, 'user_id', 'id')->owner(); } public function session_year() { return $this->hasOne(SessionYear::class, 'id', 'session_year_id'); } // public function guardianRelationChild() { // return $this->hasMany(Students::class, 'guardian_id'); // } public function scopeOwner($query) { if (Auth::user()) { if (Auth::user()->school_id) { if (Auth::user()->hasRole('School Admin')) { $query->where('school_id', Auth::user()->school_id); } else if (Auth::user()->hasRole('Teacher')) { $query->where('school_id', Auth::user()->school_id); } else if (Auth::user()->hasRole('Student')) { $query->where('school_id', Auth::user()->school_id); } else { $query->where('school_id', Auth::user()->school_id); } } else { if (Auth::user()->hasRole('Super Admin')) { $query->where('school_id', null); } else if (Auth::user()->hasRole('Guardian')) { $childId = request('child_id'); $studentAuth = Students::where('id', $childId)->first(); $query->where('school_id', $studentAuth->school_id); } else { $query->where('school_id', null); } } // Apply joining date filter for staff-related users (History-Awareness) if (!Auth::user()->hasRole('Super Admin')) { // Session Resolution (Prioritize Request Parameter) $sessionYearId = request('session_year_id'); $sessionYear = null; if ($sessionYearId) { $sessionYear = app(SessionYear::class)->find($sessionYearId); } if (!$sessionYear) { $sessionYear = app(CachingService::class)->getSessionYear(); } if ($sessionYear) { // Negative Exclusion Strategy (Recursion Safe) // Hide anyone who HAS a staff record but the joining date is in the future. $query->whereDoesntHave('staff', function ($sq) use ($sessionYear) { $sq->withoutGlobalScopes()->where('joining_date', '>', $sessionYear->original_end_date); }); } } } return $query; } /** * Get all of the support_school for the User * * @return HasMany */ public function support_school() { return $this->hasMany(StaffSupportSchool::class, 'user_id', 'id'); } //Getter Attributes public function getImageAttribute($value) { if ($value) { return url(Storage::url($value)); } return asset('assets/dummy_logo.jpg'); } public function getFullNameAttribute() { return $this->first_name . ' ' . $this->last_name; } public function guardianRelationChild() { return $this->hasMany(Students::class, 'guardian_id'); } public function child() { return $this->hasMany(Students::class, 'guardian_id')->withTrashed()->owner(); } public function teacher() { return $this->hasOne(Staff::class, 'user_id', 'id')->withoutGlobalScopes(); } public function fees_paids() { return $this->hasMany(FeesPaid::class, 'student_id')->withTrashed(); } public function fees_paid() { return $this->hasOne(FeesPaid::class, 'student_id')->withTrashed(); } public function optional_fees() { return $this->hasMany(OptionalFee::class, 'student_id')->withTrashed(); } public function compulsory_fees() { return $this->hasMany(CompulsoryFee::class, 'student_id')->withTrashed(); } public function features() { // Current active features set to sidebar menu $addons = Auth::user()->school->current_addon->pluck('name')->toArray(); $subscription = Auth::user()->school->current_subscription->features->pluck('name')->toArray(); return array_merge($addons, $subscription); } public function exam_result() { return $this->hasMany(ExamResult::class, 'student_id', 'id'); } public function exam_marks() { return $this->hasMany(ExamMarks::class, 'student_id', 'id'); } public function marks() { return $this->hasMany(ExamMarks::class, 'student_id', 'id'); } public function online_exam_attempts() { return $this->hasMany(StudentOnlineExamStatus::class, 'student_id', 'id'); } protected function setDobAttribute($value) { $this->attributes['dob'] = date('Y-m-d', strtotime($value)); } public function extra_student_details() { return $this->hasMany(ExtraStudentData::class, 'user_id', 'id')->withTrashed(); } public function extra_user_details() { return $this->hasMany(ExtraStudentData::class, 'user_id', 'id')->withTrashed(); } public function selectedStudentSubjects() { $studentSubject = app(StudentSubjectInterface::class); $cache = app(CachingService::class); $currentSemester = $cache->getDefaultSemesterData($this->school_id); $core_subjects = $this->class_section->class->core_subjects()->where(function ($query) use ($currentSemester) { (isset($currentSemester) && !empty($currentSemester)) ? $query->where('semester_id', $currentSemester->id)->orWhereNull('semester_id') : $query->orWhereNull('semester_id'); })->get(); $subjects = $core_subjects->toArray(); $elective_subject_count = $this->class_section->class->elective_subject_groups()->where(function ($query) use ($currentSemester) { (isset($currentSemester) && !empty($currentSemester)) ? $query->where('semester_id', $currentSemester->id)->orWhereNull('semester_id') : $query->orWhereNull('semester_id'); })->count(); if ($elective_subject_count > 0) { $elective_subjects = $studentSubject->builder()->where('student_id', $this->id)->with('class_subject.subject')->get(); $subjects = array_merge($subjects, $elective_subjects->toArray()); } return collect($subjects); } public function currentSemesterClassSubjects() { $cache = app(CachingService::class); $currentSemester = $cache->getDefaultSemesterData(); $core_subjects = $this->class_section->class->core_subjects()->where(function ($query) use ($currentSemester) { (isset($currentSemester) && !empty($currentSemester)) ? $query->where('semester_id', $currentSemester->id)->orWhereNull('semester_id') : $query->orWhereNull('semester_id'); })->get(); $elective_subjects = $this->class_section->class->elective_subject_groups()->where(function ($query) use ($currentSemester) { (isset($currentSemester) && !empty($currentSemester)) ? $query->where('semester_id', $currentSemester->id)->orWhereNull('semester_id') : $query->orWhereNull('semester_id'); })->with('subjects')->get(); return ['core_subject' => $core_subjects, 'elective_subject_group' => $elective_subjects]; } /** * Get the user_status associated with the User * * @return \Illuminate\Database\Eloquent\Relations\HasOne */ public function user_status() { return $this->hasOne(UserStatusForNextCycle::class); } public function getSchoolIdAttribute($value) { if (!empty($value)) { return $value; } if (Auth::check() && Auth::user()->hasRole('Guardian')) { $child_id = request('child_id'); $user = self::select('school_id')->whereHas('student', function ($q) use ($child_id) { $q->where('id', $child_id); })->first(); return $user->school_id ?? null; } return null; } public function getSchoolNamesAttribute() { if ($this->relationLoaded('support_school')) { $schools = $this->support_school->pluck('school.name')->toArray(); return implode(", ", $schools); } return ''; } public function getRoleAttribute() { if ($this->relationLoaded('roles') && $this->roles->isNotEmpty()) { return $this->roles->first()->name ?? ''; } } /** * Get all of the class_teacher for the User * * @return \Illuminate\Database\Eloquent\Relations\HasMany */ public function class_teacher() { return $this->hasMany(ClassTeacher::class, 'teacher_id'); } public function getConnectionName() { // Replace this with your logic to determine the connection name // For example, you might get it from session or config return session('db_connection_name') ?? config('database.default'); } /** * Get all of the student_subject for the User * * @return \Illuminate\Database\Eloquent\Relations\HasMany */ public function student_subject() { return $this->hasMany(StudentSubject::class, 'student_id'); } public function extra_user_datas() { return $this->hasMany(ExtraStudentData::class, 'user_id'); } public function getCreatedAtAttribute() { return $this->formatDateValue($this->getRawOriginal('created_at')); } public function getUpdatedAtAttribute() { return $this->formatDateValue($this->getRawOriginal('updated_at')); } public function getDobAttribute($value) { return $this->formatDateOnly($value); } /** * Get all of the diary_student for the User * * @return \Illuminate\Database\Eloquent\Relations\HasMany */ public function diary_student(): HasMany { return $this->hasMany(DiaryStudent::class, 'student_id', 'id'); } public function notifications() { return $this->belongsToMany(Notification::class, 'user_notifications', 'user_id', 'notification_id')->withTimestamps(); } /** * Get all FCM tokens for the user. * * @return HasMany */ public function fcmTokens(): HasMany { return $this->hasMany(FcmToken::class); } public function getDobDateAttribute() { return date('d - M', strtotime($this->getRawOriginal('dob'))); } }