@extends('frontend.maintemplate.maintemplate') @section('title', 'Course Details' . ' :: AgeLess Institute') @section('content')
{{ $checkCoursePurchase->course->name }}
Course Program

{{ $checkCoursePurchase->course->subcategory->name ?? '' }}

@php $progress = $progressData[$checkCoursePurchase->course->id] ?? 0; $course = $checkCoursePurchase->course; @endphp

{{ $progress }}% Complete

@if ($progress == 100)
done

Completed

@else

In Progress

@endif

Track ID: {{ $checkCoursePurchase->tracking_id ?? '' }}

{{ $checkCoursePurchase->course->name ?? '' }} Course
@php $canStartNextTopic = true; // First topic always starts $topicCount = 1; $courseFullyCompleted = true; $blockSubsequentTopics = false; @endphp @foreach ($sortedCoursePurchaseTopics as $courseTopic) @php // if ($courseTopic->type === 'practical_only') { // continue; // } $topicId = $courseTopic->topic->id; $isPurchasedTopic = in_array($topicId, $purchasedTopics); $statuses = $topicProgress[$topicId] ?? []; $status1 = $statuses['read_book'] ?? 'pending'; $status2 = $statuses['watch_video'] ?? 'pending'; $status3 = $statuses['mcq'] ?? 'pending'; // NEW: Check MCQ pass status (preserves your existing exam_master logic) // $mcqPassed = isset($examScores[$topicId]) && $examScores[$topicId] >= env('EXAM_PASS_SCORE'); $mcqPassed = isset($examAttempts[$topicId]) && $examAttempts[$topicId]->firstWhere('status', 'pass') !== null; $currentTopicFailed = $status3 === 'complete' && !$mcqPassed; // Modified progression logic if ($blockSubsequentTopics) { $canStartTopic = false; } else { $canStartTopic = $canStartNextTopic; } // Set flag if this topic failed if ($currentTopicFailed) { $blockSubsequentTopics = true; } // $filename = $courseTopic->topic->video->video_upload ?? null; $hasVideo = $courseTopic->topic->video->count() > 0 ?? null; $btnMap = function ($status) { return [ 'text' => $status === 'pending' ? 'Start' : ($status === 'inprogress' ? 'Complete' : 'Completed'), 'class' => $status === 'inprogress' ? 'btn-success' : ($status === 'complete' ? 'btn-secondary' : 'btn-primary'), ]; }; $b1 = $btnMap($status1); $b2 = $btnMap($status2); $b3 = $btnMap($status3); // Only allow access if previous topic was fully complete // $canStartTopic = $canStartNextTopic; $videoStepEnabled = $hasVideo && $checkCoursePurchase->course->is_government_course == 0; // Check if this topic is completed $statusesToCheck = [$status1, $status3]; if ($videoStepEnabled) { $statusesToCheck[] = $status2; } $isCurrentTopicComplete = !in_array('pending', $statusesToCheck) && !in_array('inprogress', $statusesToCheck); // 👇 Add this line if (!$isCurrentTopicComplete) { $courseFullyCompleted = false; } // Prepare for next topic $canStartNextTopic = $isCurrentTopicComplete && $mcqPassed; @endphp {{-- Now call topic_card --}} @include( 'frontend.course_detail.topic_card', compact( 'course', 'courseTopic', 'status1', 'status2', 'status3', 'b1', 'b2', 'b3', 'checkCoursePurchase', 'canStartTopic', 'hasVideo', 'topicCount', 'currentTopicFailed', )) @php $topicCount++; @endphp @endforeach
{{-- @php $totalPracticalHours = $checkCoursePurchase->coursePurchaseTopics->sum(function ($purchaseTopic) { return $purchaseTopic->topic->practical_hours ?? 0; }); @endphp --}}
Remaining Hours : {{ fmod($totalHours, 1) == 0 ? intval($totalHours) : number_format($totalHours, 1) }} Hrs
@php $isLockedAfterForfeit = false; $forfeitId = ""; $allPreviousTopicsScheduled = true; $lastCompletedSessionId = ''; $count = 1; @endphp @foreach ($sortedCoursePurchaseTopics as $key => $courseTopic) @php $sessions = $sessionsByTopic[$courseTopic->topic_id] ?? collect(); // $highestScore = \App\Models\ExamMaster::where('course_purchase_id', $checkCoursePurchase->id) // ->where('topic_id', $courseTopic->topic_id) // ->max('score'); // $isTheoryExamPass = $highestScore !== null && $highestScore >= env('EXAM_PASS_SCORE'); // $isTheoryExamPass = $courseTopic->type === 'practical_only' ? true : (isset($examAttempts[$courseTopic->topic_id]) && $examAttempts[$courseTopic->topic_id]->firstWhere('status', 'pass') !== null); $isTheoryExamPass = isset($examAttempts[$courseTopic->topic_id]) && $examAttempts[$courseTopic->topic_id]->firstWhere('status', 'pass') !== null; // Skip this topic if no sessions are available if ($sessions->isEmpty()) continue; // Check if all previous topics are fully scheduled // foreach ($checkCoursePurchase->coursePurchaseTopics as $prevKey => $prevTopic) { // if ($prevKey >= $key) break; // $prevSessions = $sessionsByTopic[$prevTopic->topic_id] ?? collect(); // foreach ($prevSessions as $prevSession) { // $prevSchedule = $prevSession->practicalSchedules->where('secdule_status', 'Pending')->where('course_purchase_id',$checkCoursePurchase->id)->first(); // if (!$prevSchedule) { // $allPreviousTopicsScheduled = false; // break 2; // } // } // } // Skip current topic if previous topics are not fully scheduled // if (!$allPreviousTopicsScheduled) continue; // Calculate total hours for this topic $totalSessionMinutes = $sessions->sum(function($session) { return $session->practicalsession->time ?? 0; }); $totalSessionHours = round($totalSessionMinutes / 60, 1); @endphp @php $canScheduleThis = true; // Allow first session in this topic $currentScheduledId = ""; @endphp @foreach ($sessions as $session) @php $schedule = $session->practicalSchedules->whereIn('secdule_status', ['Pending', 'Forfeited'])->whereNull('extra_practical_hour_id')->where('course_purchase_id',$checkCoursePurchase->id)->last(); $rescheduleBeforeHours = env('RESCHEDULE_BEFORE_HOURS'); $canReschedule = false; $isForfeited = false; $sessionStart = ""; if ($schedule && $schedule->slot && $schedule->date) { $currentScheduledId = $schedule->id; $sessionStart = \Carbon\Carbon::parse($schedule->date . ' ' . $schedule->slot->start_time); $now = \Carbon\Carbon::now(); $canReschedule = $now->diffInHours($sessionStart, false) >= $rescheduleBeforeHours; } if (!empty($sessionStart) && $sessionStart->lt($now)) { $isForfeited = true; $isLockedAfterForfeit = true; if($forfeitId==""){ $forfeitId = $session->id; } } $session->can_reschedule = $canReschedule; $sessionTime = round($session->practicalsession->time / 60, 2); @endphp @php if(!isset($schedule) || $schedule->secdule_status == 'Cancel'){ $allPreviousTopicsScheduled = false; } @endphp @if (!empty($extraPurchasedSession[$session->practicalsession_id] ?? [])) @foreach ($extraPurchasedSession[$session->practicalsession_id] as $extra) @php $schedule = $session->practicalSchedules->whereIn('secdule_status', ['Pending', 'Forfeited'])->where('course_purchase_id',$checkCoursePurchase->id)->where('id', $extra['practical_schedule_id'])->last(); // dd($schedule); $rescheduleBeforeHours = env('RESCHEDULE_BEFORE_HOURS'); $canReschedule = false; $isForfeited = false; $sessionStartExtra = ""; if ($schedule && $schedule->slot && $schedule->date) { $sessionStartExtra = \Carbon\Carbon::parse($schedule->date . ' ' . $schedule->slot->start_time); $now = \Carbon\Carbon::now(); $canReschedule = $now->diffInHours($sessionStartExtra, false) >= $rescheduleBeforeHours; } if (!empty($sessionStartExtra) && $sessionStartExtra->lt($now)) { $isForfeited = true; // $isLockedAfterForfeit = true; }else{ $isLockedAfterForfeit = false; } $session->can_reschedule = $canReschedule; $sessionTime = round($session->practicalsession->time / 60, 2); // $canScheduleThis = true; @endphp @php if(!isset($schedule) || $schedule->secdule_status == 'Cancel'){ $allPreviousTopicsScheduled = false; } @endphp @endforeach @endif @endforeach @endforeach
Topic Total Practical Hrs Model Requirement Scheduling
{{ $count++ }}. {{ $courseTopic->topic->title }} Practical Hrs = {{ $totalSessionHours ?? 0 }} Hrs
{{ $session->practicalsession->title }} {{ $sessionTime }} Hrs
{{ $session->model_requirement }}
@if ($schedule)
@if ($isForfeited)
done
@else
done
@endif
@php $canScheduleThis = true; @endphp @else {{-- @dd(!$isLockedAfterForfeit) --}} @if (!$isLockedAfterForfeit && $canScheduleThis && ($allPreviousTopicsScheduled) && $totalHours >= $sessionTime && $isTheoryExamPass) @php $canScheduleThis = false; @endphp @else @endif @endif
{{ $session->practicalsession->title }} Extra : {{ $extra['time'] / 60 }} Hrs @if ($schedule)
@if ($isForfeited)
done
@else
done
@endif
@php $canScheduleThis = true; @endphp @else @if ((!$isLockedAfterForfeit || ($forfeitId==$session->id)) && ($allPreviousTopicsScheduled) && $totalHours >= $sessionTime) @php $canScheduleThis = false; @endphp @else @endif @endif
Want To Reschedule?
Contact Us
@foreach ($bookedSessions as $key => $bookedSession) {{-- --}} @endforeach
Course Topic Date Time Practical Hours Booked Model Requirement Status
{{ $key + 1 }}. {{ $bookedSession->practicalsession->title }} {{ \Carbon\Carbon::parse($bookedSession->date)->format('d-m-Y') }} @php $canReschedule = false; $rescheduleBeforeHours = env('RESCHEDULE_BEFORE_HOURS', 24); // default to 24 if not set if ( $bookedSession->secdule_status != 'Cancel' && $bookedSession->slot && $bookedSession->date ) { $sessionStart = \Carbon\Carbon::parse($bookedSession->date . ' ' . $bookedSession->slot->start_time); $now = \Carbon\Carbon::now(); $canReschedule = $now->diffInHours($sessionStart, false) >= $rescheduleBeforeHours; } @endphp @if ($bookedSession->secdule_status != 'Cancel') @if ($canReschedule) {{-- Reschedule > --}} @else Reschedule > @endif @endif {{-- @if($bookedSession->secdule_status != 'Cancel') Reschedule > @endif --}} {{-- @php $schedule = $bookedSession->slot; $start = $end = null; if ($schedule) { $start = \Carbon\Carbon::parse($schedule->start_time)->format('g:i A'); $end = \Carbon\Carbon::parse($schedule->end_time)->format('g:i A'); } @endphp {{ $start && $end ? $start . ' - ' . $end : 'N/A' }} --}} @php $slots = $bookedSession->multiSlotBookingForStudent->load('slot'); $start = $end = null; if ($slots && $slots->count() > 0) { // sort by slot start time $sorted = $slots->sortBy(function ($item) { return $item->slot->start_time; }); $start = \Carbon\Carbon::parse($sorted->first()->slot->start_time) ->format('g:i A'); $end = \Carbon\Carbon::parse($sorted->last()->slot->end_time) ->format('g:i A'); } @endphp {{ $start && $end ? $start . ' - ' . $end : 'N/A' }} {{ $bookedSession->practicalsession->time }} Hrs{{ number_format($bookedSession->practicalsession->time / 60, 1) }} Hrs {{ $bookedSession->courseAssignSession->model_requirement }} {{ $bookedSession->secdule_status }}
@endsection @section('custome_js') {{-- --}} @endsection