IEE Edu uses a final quiz system to assess student comprehension at the end of each course. After completing 100% of a course’s lessons, a student becomes eligible to sit the exam. Scores are calculated on a 0–20 scale, and a passing result automatically triggers the creation of a downloadable PDF certificate of approval — provided the course hasDocumentation Index
Fetch the complete documentation index at: https://mintlify.com/RigbySawGame/ieeEdu_Wen/llms.txt
Use this file to discover all available pages before exploring further.
certificate_enabled = true.
Exam Flow
Complete all course lessons
The exam is locked until the student’s enrollment
progress reaches 100. This is enforced both in the UI (allLessonsCompleted prop in the classroom) and server-side in ExamController::takeExam() and ExamService::submit().Access the exam from the classroom or exams list
Navigate to the exam via the classroom’s exam panel or the dedicated exams section:Route name:
student.exams.takeThe controller loads the quiz with all questions and their answer options (quiz->load(['questions.answers', 'course'])). The current_attempt counter (current attempt number) is passed to the frontend so the student knows which attempt they are on.Submit answers
When the student finishes, answers are posted as a map of Route name: The attempt is saved as a
question_id → answer_id:student.exams.submitExamService::submit() scores the attempt before saving. Correct answers are counted and scaled to a 0–20 score:CourseExamAttempt record with status: "aprobado" or status: "reprobado".View the result
After submission the controller returns a On failure,
back() response with the exam_result flash payload:status is "reprobado", certificate_url is null, and message is "Evaluación finalizada. Sigue practicando.".Certificate generated on passing
If
status = "aprobado" and CertificateService::checkEligibility() returns true, ExamService::handlePassing() calls CertificateService::getOrCreateRecord() to persist a Certificate record. The enrollment’s completed_at timestamp is also set at this point if not already present.The certificate PDF is generated on demand when the student downloads it — not eagerly on passing — keeping submission latency low.Configuration
Exam pass threshold and attempt limits are configured via environment variables and read through theconfig('education.*') namespace:
| Variable | Default | Description |
|---|---|---|
EDUCATION_PASSING_SCORE | 14 | Minimum score (out of 20) required to pass; used as the display fallback in the exams listing when a quiz has no minimum_score set |
EDUCATION_MAX_ATTEMPTS | 3 | Maximum number of attempts a student may take per quiz; individual quizzes can override this via CourseQuiz::max_attempts |
minimum_score and max_attempts columns take precedence over these global defaults when set. During scoring, ExamService::submit() uses $quiz->minimum_score ?? 14 directly as the pass threshold.
Certificate Eligibility
CertificateService::checkEligibility(User $user, Course $course) applies three gates in sequence:
certificate_enabledflag — returnsfalseimmediately ifcourse->certificate_enabledisfalse.- All lessons completed — queries
LessonProgressto confirm every lesson in the course (across all modules) hasis_completed = truefor the student. - All quizzes passed — for each
CourseQuizbelonging to the course, verifies that at least oneCourseExamAttemptexists withstatus = "aprobado".
true.
Certificate Routes
| Method | Route | Name | Description |
|---|---|---|---|
GET | /student/certificates | student.certificates.index | List all earned certificates for the authenticated student |
GET | /student/certificates/{certificate}/download | student.certificates.download | Download or stream the certificate PDF |
certificate_enabled = true and orders them by issue_date descending. Each item includes:
code— unique certificate identifier in the formatIEE-XXXXXXXX-YYYYissue_date— formatted asd M Y(e.g.,15 Jun 2025)download_url— pre-built URL to the download routecourse_title,image— course metadata for the certificate card UI
Certificate PDF
PDFs are generated on download usingbarryvdh/laravel-dompdf with an A4 landscape paper size:
pdf.certificate Blade view receives:
| Variable | Description |
|---|---|
$user | The certificate owner |
$course | The completed course |
$date | Issue date formatted as d/m/Y |
$code | The unique certificate code |
$template | The CertificateTemplate model (if a custom template is configured for this course) |
$template_image_base64 | Base64-encoded PNG/JPG of the template background image (embedded for offline rendering) |
$is_custom | Boolean — true when a custom template image is present |
?action=stream to the download URL to display the PDF inline in the browser rather than triggering a file download:
Administrators can view and manage all issued certificates at
/admin/certificates. The admin panel lists certificates across all students and courses, and can be used to audit or revoke individual certificate records.