|
Server : Apache/2.4.41 (Ubuntu) System : Linux vmi1525618.contaboserver.net 5.4.0-105-generic #119-Ubuntu SMP Mon Mar 7 18:49:24 UTC 2022 x86_64 User : www-data ( 33) PHP Version : 8.2.12 Disable Function : NONE Directory : /var/www/lecturebazaar.com/app/Models/Traits/ |
Upload File : |
<?php
namespace App\Models\Traits;
use App\Models\QuizzesResult;
use App\Models\Sale;
use App\Models\WebinarAssignmentHistory;
use App\Models\WebinarChapterItem;
use App\Models\WebinarPartnerTeacher;
trait SequenceContent
{
protected $test = false;
public function checkSequenceContent($user = null, $test = false)
{
//$this->test = $test; // use for debug
$user = $user ?: auth()->user();
$result = null; // null means user can access to this content
if ($this->checkUserCanPass($this, $user)) {
return $result;
}
if (getFeaturesSettings('sequence_content_status')) {
$chapter = $this->chapter;
if (!empty($chapter)) {
$previousChapters = $chapter->getPreviousContents();
$result['all_passed_items_error'] = $this->checkChapterAllContentPassed($previousChapters);
}
if ($this->check_previous_parts and empty($result['all_passed_items_error'])) {
$previousItems = $this->getPreviousContents();
$result['all_passed_items_error'] = $this->checkAllPassedItems($previousItems);
}
if (!empty($this->access_after_day)) {
$result['access_after_day_error'] = $this->checkAccessAfterDay($user);
}
}
return $result;
}
public function getPreviousContents()
{
if ($this->table == 'webinar_chapters') {
$previousItems = $this->getPreviousChapters();
} else {
$chapter = $this->chapter;
$type = WebinarChapterItem::$chapterFile;
if ($this->table == 'sessions') {
$type = WebinarChapterItem::$chapterSession;
} else if ($this->table == 'text_lessons') {
$type = WebinarChapterItem::$chapterTextLesson;
} else if ($this->table == 'quizzes') {
$type = WebinarChapterItem::$chapterQuiz;
} else if ($this->table == 'webinar_assignments') {
$type = WebinarChapterItem::$chapterAssignment;
}
$currentItemOrder = WebinarChapterItem::where('user_id', $this->creator_id)
->where('item_id', $this->id)
->where('chapter_id', $this->chapter_id)
->where('type', $type)
->first();
$previousItems = $this->getPreviousItemsByChapter($chapter, !empty($currentItemOrder) ? $currentItemOrder->order : null);
if (empty($previousItems) or count($previousItems) < 1) {
$previousChapters = $chapter->getPreviousContents();
if (!empty($previousChapters) and count($previousChapters)) {
$previousChapter = $previousChapters->first();
$previousItems = $this->getPreviousItemsByChapter($previousChapter);
}
}
}
return $previousItems;
}
private function checkChapterAllContentPassed($chapters)
{
$result = null;
if (!empty($chapters) and count($chapters)) {
foreach ($chapters as $chapter) {
if ($chapter->check_all_contents_pass) {
$chapterItems = $this->getPreviousItemsByChapter($chapter);
$chapterResult = $this->checkAllPassedItems($chapterItems);
if (!empty($chapterResult)) {
$result = trans('update.you_should_pass_the_previous_chapter_to_view_this_chapter_parts');;
}
}
}
}
return $result;
}
private function checkAccessAfterDay($user = null)
{
$result = null;
$user = $user ?: auth()->user();
$day = $this->access_after_day;
if (!empty($user)) {
$sale = Sale::where('buyer_id', $user->id)
->where('webinar_id', $this->webinar_id)
->whereNull('refund_at')
->first();
if (!empty($sale)) {
$conditionDay = strtotime("+$day days", $sale->created_at);
if (time() < $conditionDay) {
$result = trans('update.this_content_will_be_accessible_for_you_on_date', ['date' => dateTimeFormat($conditionDay, 'j M Y H:i')]);
}
} else {
$result = trans('public.not_access_to_this_content');
}
} else {
$result = trans('public.not_login_toast_msg_lang');
}
return $result;
}
private function checkAllPassedItems($chapterItems)
{
$userId = auth()->id();
$result = null;
foreach ($chapterItems as $chapterItem) {
if ($chapterItem->type == \App\Models\WebinarChapterItem::$chapterSession and !empty($chapterItem->session)) {
$item = $chapterItem->session;
} else if ($chapterItem->type == \App\Models\WebinarChapterItem::$chapterFile and !empty($chapterItem->file)) {
$item = $chapterItem->file;
} else if ($chapterItem->type == \App\Models\WebinarChapterItem::$chapterTextLesson and !empty($chapterItem->textLesson)) {
$item = $chapterItem->textLesson;
} else if ($chapterItem->type == \App\Models\WebinarChapterItem::$chapterAssignment) {
$item = $chapterItem->assignment;
} else if ($chapterItem->type == \App\Models\WebinarChapterItem::$chapterQuiz) {
$item = $chapterItem->quiz;
}
// Only check previous content that has the check_previous_parts enabled => Vahid Daghighy
if (!empty($item)) {
if ($chapterItem->type == \App\Models\WebinarChapterItem::$chapterSession or
$chapterItem->type == \App\Models\WebinarChapterItem::$chapterFile or
$chapterItem->type == \App\Models\WebinarChapterItem::$chapterTextLesson
) {
if (empty($item->learningStatus)) {
$result = trans('update.you_should_pass_the_previous_lesson_to_view_this_part');
}
} else if ($chapterItem->type == \App\Models\WebinarChapterItem::$chapterAssignment) {
$assignmentHistory = WebinarAssignmentHistory::where('assignment_id', $item->id)
->where('student_id', $userId)
->where('status', WebinarAssignmentHistory::$passed)
->first();
if (empty($assignmentHistory)) {
$result = trans('update.you_should_pass_the_previous_lesson_to_view_this_part');
}
} else if ($chapterItem->type == \App\Models\WebinarChapterItem::$chapterQuiz) {
$quizHistory = QuizzesResult::where('quiz_id', $item->id)
->where('user_id', $userId)
->where('status', QuizzesResult::$passed)
->first();
if (empty($quizHistory)) {
$result = trans('update.you_should_pass_the_previous_lesson_to_view_this_part');
}
}
}
}
return $result;
}
private function getPreviousChapters()
{
$query = $this->newQuery();
$query->where('webinar_id', $this->webinar_id);
$query->where('status', 'active');
if (!empty($this->order)) {
$query->where(function ($query) {
$query->whereNull('order')
->orWhere('order', '<', $this->order);
});
} else {
$query->whereNull('order');
$query->where('id', '<', $this->id);
}
$query->orderBy('order', 'desc');
$query->orderBy('id', 'desc');
return $query->get();
}
private function getPreviousItemsByChapter($chapter, $currentItemOrder = null)
{
$query = $chapter->chapterItems();
if (!empty($currentItemOrder)) {
$query->where('order', '<', $currentItemOrder);
}
return $query->orderBy('order', 'desc')
->get();
}
/*private function getPreviousItems()
{
$currentItemOrder = WebinarChapterItem::where('user_id', $this->creator_id)
->where('item_id', $this->id)
->where('chapter_id', $this->chapter_id)
->first();
$webinar = Webinar::where('id', $this->webinar_id)
->where(function ($query) {
$query->where('creator_id', $this->creator_id)
->orWhere('teacher_id', $this->creator_id);
})
->first();
if (!empty($webinar)) {
$creatorIds = [$webinar->creator_id, $webinar->teacher_id];
$query = $this->newQuery();
$query->join('webinar_chapter_items', 'webinar_chapter_items.item_id', "{$this->table}.id");
$query->select("{$this->table}.*", DB::raw('webinar_chapter_items.order as itemOrder'));
$query->where("{$this->table}.chapter_id", $this->chapter_id);
$query->where("{$this->table}.webinar_id", $this->webinar_id);
$query->whereIn("{$this->table}.creator_id", $creatorIds);
$query->where("webinar_chapter_items.chapter_id", $this->chapter_id);
$query->whereIn("webinar_chapter_items.user_id", $creatorIds);
$query->where('status', 'active');
$query->where("{$this->table}.id", '!=', $this->id);
if (!empty($currentItemOrder)) {
$query->where("webinar_chapter_items.order", '<', $currentItemOrder->order);
}
$query->orderBy('itemOrder', 'desc');
return $query->get();
}
return null;
}*/
private function checkUserCanPass($item, $user = null)
{
if (empty($user)) {
$user = auth()->user();
}
if (!empty($user)) {
$invitedWebinars = WebinarPartnerTeacher::query()->where('teacher_id', $user->id)->pluck('webinar_id')->toArray();
// Creator, Teacher, Admin and invited partners can pass
if (
$user->id == $item->creator_id or
$user->id == $item->teacher_id or
$user->isAdmin() or
in_array($item->webinar_id, $invitedWebinars)
) {
return true;
}
}
return false;
}
}