shell bypass 403
<?php
namespace Modules\CourseSetting\Entities;
use App\Models\LmsBadge;
use App\User;
use Carbon\Carbon;
use App\LessonComplete;
use App\Traits\Tenantable;
use Cocur\Slugify\Slugify;
use Illuminate\Support\Str;
use Modules\Forum\Entities\Forum;
use Modules\Group\Entities\Group;
use Modules\OrgInstructorPolicy\Entities\OrgPolicyCourseList;
use Modules\OrgSubscription\Entities\OrgAttendance;
use Modules\OrgSubscription\Entities\OrgSubscriptionCheckout;
use Modules\OrgSubscription\Entities\OrgSubscriptionCourseList;
use Modules\Payment\Entities\Cart;
use Illuminate\Support\Facades\Auth;
use Modules\Quiz\Entities\OnlineQuiz;
use Illuminate\Database\Eloquent\Model;
use Modules\Localization\Entities\Language;
use Modules\Homework\Entities\InfixHomework;
use Modules\Quiz\Entities\QuizTest;
use Modules\Survey\Entities\Survey;
use Modules\VirtualClass\Entities\ClassComplete;
use Modules\VirtualClass\Entities\VirtualClass;
use Modules\Subscription\Entities\SubscriptionCourseList;
use Spatie\Sluggable\HasSlug;
use Spatie\Sluggable\SlugOptions;
use Spatie\Translatable\HasTranslations;
class Course extends Model
{
use HasSlug;
use Tenantable;
protected $guarded = [];
protected $appends = ['dateFormat', 'publishedDate', 'sumRev', 'purchasePrice', 'enrollCount'];
use HasTranslations;
public $translatable = ['about', 'outcomes', 'requirements', 'title'];
public function forums()
{
return $this->hasMany(Forum::class, 'course_id', 'id');
}
public function enrollUsers()
{
return $this->belongsToMany(User::class, 'course_enrolleds', 'course_id', 'user_id');
}
public function cartUsers()
{
return $this->belongsToMany(User::class, 'carts', 'course_id', 'user_id');
}
public function BookmarkUsers()
{
return $this->belongsToMany(User::class, 'bookmark_courses', 'course_id', 'user_id');
}
public function quiz()
{
return $this->belongsTo(OnlineQuiz::class, 'quiz_id', 'id')
->withDefault([
'title' => ' '
]);
}
public function class()
{
return $this->belongsTo(VirtualClass::class, 'class_id', 'id')->withDefault();
}
public function category()
{
return $this->belongsTo(Category::class, 'category_id', 'id')->withDefault([
'name' => ' '
]);
}
public function user()
{
return $this->belongsTo(User::class, 'user_id', 'id')->withDefault([
'name' => ' '
]);
}
public function subCategory()
{
return $this->belongsTo(Category::class, 'subcategory_id', 'id')->withDefault();
}
public function chapters()
{
return $this->hasMany(Chapter::class)->orderBy('position', 'asc');
}
public function lessons()
{
return $this->hasMany(Lesson::class, 'course_id')
->orderBy('position', 'asc');
}
public function enrolls()
{
return $this->hasMany(CourseEnrolled::class, 'course_id', 'id');
}
public function comments()
{
return $this->hasMany(CourseComment::class, 'course_id')
->select(
'id',
'user_id',
'course_id',
'instructor_id',
'status',
'comment',
'created_at',
);
}
public function reviews()
{
return $this->hasMany(CourseReveiw::class, 'course_id')
->select(
'user_id',
'course_id',
'status',
'comment',
'star',
);
}
public function files()
{
return $this->hasMany(CourseExercise::class, 'course_id');
}
public function getdateFormatAttribute()
{
return Carbon::parse($this->created_at)->format(Settings('active_date_format') ?? 'jS M, Y');
}
public function getpublishedDateAttribute()
{
return Carbon::parse($this->created_at)->format(Settings('active_date_format') ?? 'jS M, Y');
}
public function getsumRevAttribute()
{
return round($this->enrolls->sum('reveune'), 2);
}
public function getenrollCountAttribute()
{
return $this->enrolls->count();
}
public function getpurchasePriceAttribute()
{
return round($this->enrolls->sum('purchase_price'), 2);
}
public function virtualClass()
{
return $this->belongsTo(VirtualClass::class, 'class_id')->withDefault();
}
public function completeLessons()
{
if (Auth::check()) {
return $this->hasMany(LessonComplete::class)->where('user_id', Auth::user()->id);
} else {
return $this->hasMany(LessonComplete::class)->whereNull('user_id');
}
}
public function completeQuiz()
{
if (Auth::check()) {
return $this->hasMany(QuizTest::class)->where('user_id', Auth::user()->id);
} else {
return $this->hasMany(QuizTest::class)->whereNull('user_id');
}
}
public function offerPrice($course, $price)
{
if ($course->offer == 1) {
if (Settings('offer_type') == 0) {
$price = Settings('offer_amount');
} else {
$price = (Settings('offer_amount') / 100) * $price;
}
}
return $price;
}
/*public function getPriceAttribute()
{
$price = $this->attributes['price'];
if (Auth::check() && Auth::user()->role_id == 3 && isModuleActive('Subscription') && isSubscribe()) {
$type = Settings('subscription_type');
if ($type == 2) {
if ($this->attributes['subscription'] == 0) {
return $price;
} else {
$plans = userCurrentPlan();
if (count($plans) != 0) {
$check = SubscriptionCourseList::whereIn('plan_id', $plans)->where('course_id', $this->attributes['id'])->first();
if ($check) {
return 0;
} else {
return $price;
}
} else {
return $price;
}
}
}
return 0;
} elseif (isModuleActive('CourseOffer')) {
// $price= $this->offerPrice($this, $price);
}
return $price;
}
*/
public function getDiscountPriceAttribute()
{
$price = $this->attributes['discount_price'];
if (Auth::check() && Auth::user()->role_id == 3 && isModuleActive('Subscription') && isSubscribe()) {
return 0;
} elseif (isModuleActive('CourseOffer')) {
if ($this->offer == 1) {
if (!$price) {
$price = $this->attributes['price'];
}
}
return $this->offerPrice($this, $price);
}
return $price;
}
public function courseLevel()
{
return $this->belongsTo(CourseLevel::class, 'level')->withDefault();
}
public function activeReviews()
{
return $this->hasMany(CourseReveiw::class, 'course_id', 'id')->where('status', 1);
}
public function getTotalReviewAttribute()
{
if(empty($this->total_rating)){
$total =0;
}else{
$total =$this->total_rating;
}
return $total ;
}
public function getIsLoginUserEnrolledAttribute()
{
if (\auth()->user()->role_id == 1) {
return true;
}
if (isModuleActive('MyClass') && auth()->user()->role_id == 2) {
if($this->hasEnrollForClass()){
return true;
}
}
if (isModuleActive('CPD') && auth()->user()->role_id == 2) {
if($this->hasEnrollForCPd()){
return true;
}
}
if (\auth()->user()->role_id == 2) {
if ($this->user_id == \auth()->user()->id) {
return true;
} else {
if (!empty($this->assistant_instructors) && in_array(\auth()->user()->id, $this->assistantInstructorsIds)) {
return true;
} else {
return false;
}
}
}
if (auth()->user()->role_id == 4 || auth()->user()->role_id > 5) {
if (Settings('staff_can_view_course') == 'yes') {
return true;
}
}
if (!$this->enrollUsers->where('id', \auth()->user()->id)->count()) {
return false;
} else {
return true;
}
}
public function getIsLoginUserCartAttribute()
{
if (!$this->cartUsers->where('user_id', \auth()->user()->id)->count()) {
return false;
} else {
return true;
}
}
public function getIsLoginUserBookmarkAttribute()
{
if (!$this->BookmarkUsers->where('user_id', \auth()->user()->id)->count()) {
return false;
} else {
return true;
}
}
public function getIsLoginUserReviewAttribute()
{
if (!$this->activeReviews->where('user_id', \auth()->user()->id)->count()) {
return false;
} else {
return true;
}
}
public function getLoginUserTotalPercentageAttribute()
{
$percentage = 0;
if ($this->attributes['type'] == 2) {
$countCourse = count($this->completeQuiz->where('pass', 1));
if ($countCourse != 0) {
$percentage = 100;
}
} else {
$countCourse = count($this->completeLessons->where('status', 1));
if ($countCourse != 0) {
$percentage = ceil($countCourse / count($this->lessons) * 100);
}
if ($percentage > 100) {
$percentage = 100;
}
}
return $percentage;
}
public function userTotalPercentage($user_id, $course_id)
{
$complete_lesson = LessonComplete::where('user_id', $user_id)->where('course_id', $course_id)->where('status', 1)->get();
$countCourse = count($complete_lesson);
if ($countCourse != 0) {
$percentage = ceil($countCourse / count($this->lessons) * 100);
} else {
$percentage = 0;
}
if ($percentage > 100) {
$percentage = 100;
}
return $percentage;
}
public function userTotalClassPercentage($user_id, $course_id)
{
$complete_class = ClassComplete::where('user_id', $user_id)->where('course_id', $course_id)->where('status', 1)->get();
$countCourse = count($complete_class);
$class = $this->class;
$totalClass = 0;
if ($class->host == 'Zoom') {
$totalClass = count($class->zoomMeetings);
} elseif ($class->host == 'BBB') {
$totalClass = count($class->bbbMeetings);
} elseif ($class->host == 'Jitsi') {
$totalClass = count($class->jitsiMeetings);
}
if ($countCourse != 0) {
$percentage = ceil($countCourse / $totalClass * 100);
} else {
$percentage = 0;
}
if ($percentage > 100) {
$percentage = 100;
}
return $percentage;
}
public function userTotalQuizPercentage($user_id, $course_id)
{
$percentage = 0;
$givenQuiz = QuizTest::where('user_id', $user_id)->where('course_id', $course_id)->get();
if (count($givenQuiz) != 0) {
$percentage = 50;
foreach ($givenQuiz as $q) {
if ($q->pass == 1) {
$percentage = 100;
}
}
}
return $percentage;
}
public function userQuizPercentage($user_id, $course_id)
{
$percentage = 0;
$givenQuiz = QuizTest::where('user_id', $user_id)->where('course_id', $course_id)->get();
if (count($givenQuiz) != 0) {
$percentage = 50;
foreach ($givenQuiz as $q) {
$percentage = 100;
}
}
return $percentage;
}
public function getIsGuestUserCartAttribute()
{
if (session()->has('cart')) {
foreach (session()->get('cart') as $item) {
if ($item['course_id'] == $this->id) {
return true;
}
}
}
return false;
}
public function getStarWiseReviewAttribute()
{
$data['1'] = $this->activeReviews->where('star', '1')->count();
$data['2'] = $this->activeReviews->where('star', '2')->count();
$data['3'] = $this->activeReviews->where('star', '3')->count();
$data['4'] = $this->activeReviews->where('star', '4')->count();
$data['5'] = $this->activeReviews->where('star', '5')->count();
$data['total'] = $data['1'] + $data['2'] + $data['3'] + $data['4'] + $data['5'];
return $data;
}
protected static function boot()
{
parent::boot();
static::created(function ($course) {
if ($course->type == 1) {
saasPlanManagement('course', 'create');
}
});
static::updating(function ($course) {
$carts = Cart::where('course_id', $course->id)->get();
foreach ($carts as $cart) {
if ($course->discount_price != null) {
$price = $course->discount_price;
} else {
$price = $course->price;
}
$cart->price = $price;
$cart->save();
}
});
self::deleted(function ($model) {
if ($model->type == 1) {
saasPlanManagement('course', 'delete');
}
});
}
/* private function createSlug($name)
{
if (static::whereSlug($slug = Str::slug($name))->exists()) {
$max = static::whereTitle($name)->latest('id')->skip(1)->value('slug');
if (isset($max[-1]) && is_numeric($max[-1])) {
return preg_replace_callback('/(\d+)$/', function ($mathces) {
return $mathces[1] + 1;
}, $max);
}
return "{$slug}-2";
}
return $slug;
}*/
public function language()
{
return $this->belongsTo(Language::class, 'lang_id', 'id')->withDefault();
}
public function result()
{
$incomplete = 0;
$complete = 0;
foreach ($this->enrolls as $key => $enroll) {
$percentage = round($this->userTotalPercentage($enroll->user_id, $enroll->course_id));
if ($percentage < 100) {
$incomplete += 1;
} else {
$complete += 1;
}
}
$result = [
'incomplete' => $incomplete,
'complete' => $complete,
];
return $result;
}
public function isGroupCourse()
{
return $this->hasOne(Group::class, 'course_id');
}
public function courseStudyMaterials()
{
return $this->hasMany(InfixHomework::class, 'course_id', 'id');
}
//slug start
public function getSlugOptions(): SlugOptions
{
return SlugOptions::create()
->generateSlugsFrom('title')
->saveSlugsTo('slug');
}
protected function generateNonUniqueSlug(): string
{
$slugField = $this->slugOptions->slugField;
if ($this->hasCustomSlugBeenUsed() && !empty($this->$slugField)) {
return $this->$slugField;
}
try {
$slugify = new Slugify(['rulesets' => ['default', lcfirst($this->language->name)]]);
} catch (\Exception $e) {
$slugify = new Slugify(['rulesets' => ['default']]);
}
return $slugify->slugify($this->getSlugSourceString(), $this->slugOptions->slugSeparator);
}
//slug end
public function survey()
{
return $this->hasOne(Survey::class, 'course_id', 'id')
->where('publish_date', '>=', date('m/d/Y'))
->where('publish_time', '>=', date("h:i:sa"));
}
public function badges()
{
return $this->morphMany(LmsBadge::class, 'badgeable');
}
public function userEnrollPercentage($enroll_id, $user_id, $course_id)
{
$complete_lesson = LessonComplete::where('user_id', $user_id)
->where('course_id', $course_id)
->where('enroll_id', $enroll_id)
->where('status', 1)
->get();
$countCourse = count($complete_lesson);
if ($countCourse != 0) {
$percentage = ceil($countCourse / count($this->lessons) * 100);
} else {
$percentage = 0;
}
if ($percentage > 100) {
$percentage = 100;
}
return $percentage;
}
public function getAssistantInstructorsIdsAttribute()
{
$result = null;
$assistant_instructors = $this->assistant_instructors;
if (!empty($assistant_instructors)) {
$result = json_decode($assistant_instructors, true);
}
return $result;
}
public function totalStatistic()
{
$data['not_start'] = 0;
$data['in_process'] = 0;
$data['finished'] = 0;
$totalEnroll = $this->enrolls;
foreach ($totalEnroll as $enroll) {
$result = $this->userTotalPercentage($enroll->user_id, $enroll->course_id);
if ($result == 0) {
$data['not_start'] = $data['not_start'] + 1;
} elseif ($result == 100) {
$data['finished'] = $data['finished'] + 1;
} else {
$data['in_process'] = $data['in_process'] + 1;
}
}
$data['total_enroll'] = $data['not_start'] + $data['in_process'] + $data['finished'];
return $data;
}
public function totalQuizStatistic()
{
$data['not_start'] = 0;
$data['fail'] = 0;
$data['pass'] = 0;
$totalEnroll = $this->enrolls;
foreach ($totalEnroll as $enroll) {
$result = $this->userTotalQuizPercentage($enroll->user_id, $enroll->course_id);
if ($result == 0) {
$data['not_start'] = $data['not_start'] + 1;
} elseif ($result == 100) {
$data['pass'] = $data['pass'] + 1;
} else {
$data['fail'] = $data['fail'] + 1;
}
}
$data['total_enroll'] = $data['not_start'] + $data['pass'] + $data['fail'];
return $data;
}
public function getNotStatedYetAttribute()
{
return $this->totalStatistic()['not_start'];
}
public function getInProcessAttribute()
{
return $this->totalStatistic()['in_process'];
}
/* public function getTotalEnrolledAttribute()
{
$total = $this->attributes['total_enrolled'];
if (isModuleActive('OrgSubscription')) {
$checkout = OrgSubscriptionCheckout::whereHas('plan', function ($query) {
$query->whereHas('assign', function ($query) {
$query->where('course_id', $this->id);
});
})->count();
$total = $total + $checkout;
}
return $total;
}*/
public function orgCourseList()
{
return $this->hasMany(OrgSubscriptionCourseList::class, 'course_id');
}
public function orgAttendance()
{
return $this->hasMany(OrgAttendance::class, 'course_id', 'id');
}
public function attendanceData()
{
$total_enroll = $this->attributes['total_enrolled'];
$attendances = $this->orgAttendance;
$ontime = $attendances->where('attend', '=', 'O')->count();
$late = $attendances->where('attend', '=', 'L')->count();
$absence = $total_enroll - ($ontime + $late);
$pass = $attendances->where('pass', '=', '1')->count();
$fail = $total_enroll - $pass;
$attend_rate = getPercentage(($ontime + $late), $total_enroll);
$pass_rate = getPercentage($pass, $total_enroll);
$data['on_time'] = $ontime;
$data['late'] = $late;
$data['absence'] = $absence;
$data['pass'] = $pass;
$data['fail'] = $fail;
$data['attend_rate'] = $attend_rate;
$data['pass_rate'] = $pass_rate;
return $data;
}
public function orgSubscriptionCourseList()
{
return $this->hasMany(orgSubscriptionCourseList::class, 'course_id');
}
public function quizCompletes()
{
return $this->hasMany(QuizTest::class, 'course_id', 'id')->where('user_id', \auth()->id())->orderBy('id');
}
public function moreQuizzes()
{
return Course::where('type', 2)->where('id', '!=', $this->attributes['id'])->take(5)->get();
}
public function hasEnrollForCPd()
{
return $this->hasOne('Modules\CPD\Entities\AssignStudent', 'course_id', 'id')->when(auth()->user(), function($q) {
$q->where('student_id', auth()->user()->id);
});
}
public function hasEnrollForClass()
{
return $this->hasOne('Modules\MyClass\Entities\ClassCourseAssignStudent', 'course_id', 'id')->when(auth()->user(), function($q) {
$q->where('student_id', auth()->user()->id);
});
}
}