diff --git a/app/Http/Controllers/DocumentDownloadController.php b/app/Http/Controllers/DocumentDownloadController.php
new file mode 100644
index 0000000..f29b410
--- /dev/null
+++ b/app/Http/Controllers/DocumentDownloadController.php
@@ -0,0 +1,333 @@
+session()->has('student_id') ||
+ $request->session()->has('student_log_id') ||
+ auth()->check();
+ }
+
+ /**
+ * Academic Calendar PDF Download
+ */
+ public function downloadAcademicCalendar(Request $request)
+ {
+ if (!$this->isAuthenticated($request)) {
+ return redirect()->route('students')->with('error', 'Please login first to download official academic documents!');
+ }
+
+ $title = "Official Academic Calendar 2026";
+ $subtitle = "Semester Schedules, Lecture Weeks, Holidays & Important Deadlines";
+ $refNo = "REF: AC-2026-CAL";
+
+ $tables = [
+ [
+ 'title' => '1. SEMESTER DATES & LECTURE WEEKS',
+ 'headers' => ['Academic Event / Phase', 'Start Date', 'End Date', 'Status'],
+ 'rows' => [
+ ['Semester 1 Commencement', 'January 15, 2026', 'March 20, 2026', 'Active'],
+ ['Mid-Semester Recess', 'March 21, 2026', 'March 29, 2026', 'Scheduled'],
+ ['Practical Lab Intensive Weeks', 'March 30, 2026', 'May 15, 2026', 'Scheduled'],
+ ['Semester 1 Final Examinations', 'June 01, 2026', 'June 20, 2026', 'Scheduled'],
+ ['Semester 2 Commencement', 'July 15, 2026', 'November 30, 2026', 'Upcoming']
+ ]
+ ],
+ [
+ 'title' => '2. INSTITUTIONAL & PUBLIC HOLIDAYS',
+ 'headers' => ['Holiday / Event Name', 'Date(s)', 'Impact on Classes'],
+ 'rows' => [
+ ['National Independence Day', 'February 04, 2026', 'Campus Closed'],
+ ['Sinhala & Tamil New Year Vacation', 'April 12 - April 18, 2026', 'No Lectures / Workshops'],
+ ['Vesak Festival Holiday', 'May 23 - May 25, 2026', 'Campus Closed'],
+ ['Annual Automotive Tech Symposium', 'August 20, 2026', 'Special Event (Mandatory Attendance)']
+ ]
+ ],
+ [
+ 'title' => '3. CRITICAL ACADEMIC DEADLINES',
+ 'headers' => ['Deadline Description', 'Cut-off Date', 'Action Required'],
+ 'rows' => [
+ ['Course Module Drop / Add Period', 'February 10, 2026', 'Submit online form'],
+ ['Mid-Term Assignment 1 Submission', 'March 18, 2026', 'Upload via Portal'],
+ ['Examination Fee Clearance', 'May 15, 2026', 'Settle at Finance Office']
+ ]
+ ]
+ ];
+
+ return $this->renderPdf($title, $subtitle, $refNo, $tables, "Academic_Calendar_2026.pdf");
+ }
+
+ /**
+ * Student Handbook PDF Download
+ */
+ public function downloadStudentHandbook(Request $request)
+ {
+ if (!$this->isAuthenticated($request)) {
+ return redirect()->route('students')->with('error', 'Please login first to download official academic documents!');
+ }
+
+ $title = "Student Handbook & Code of Conduct";
+ $subtitle = "Academic Regulations, Workshop Safety Rules & Grading Policies";
+ $refNo = "REF: HB-2026-REG";
+
+ $tables = [
+ [
+ 'title' => '1. ATTENDANCE & ACADEMIC INTEGRITY POLICIES',
+ 'headers' => ['Regulation Category', 'Requirement / Policy Detail', 'Penalty for Violation'],
+ 'rows' => [
+ ['Class Attendance', 'Minimum 80% attendance required for practical labs and lectures.', 'Barred from Final Exams'],
+ ['Academic Honesty', 'Zero tolerance for plagiarism, cheating, or proxy attendance.', 'Disciplinary Hearing & Grade F'],
+ ['Enrollment Status', 'Students must maintain continuous registration every term.', 'De-registration after 30 days']
+ ]
+ ],
+ [
+ 'title' => '2. WORKSHOP & HIGH-VOLTAGE LAB SAFETY RULES',
+ 'headers' => ['Safety Protocol', 'Required Equipment / PPE', 'Compliance Rule'],
+ 'rows' => [
+ ['General Workshop PPE', 'Safety boots (steel toe), protective eyewear, lab coats', 'Mandatory at all times'],
+ ['Hybrid / EV High Voltage Labs', 'Class 0 rated insulated safety gloves (1000V rated)', 'Strict supervision required'],
+ ['Vehicle Lift Operation', 'Hydraulic lift locks must be verified before underbody work', 'Never operate alone']
+ ]
+ ],
+ [
+ 'title' => '3. ACADEMIC GRADING SCHEME',
+ 'headers' => ['Grade', 'Percentage Range', 'GPA Value', 'Classification'],
+ 'rows' => [
+ ['A+', '90% - 100%', '4.00', 'High Distinction'],
+ ['A', '80% - 89%', '3.70', 'Distinction'],
+ ['B', '70% - 79%', '3.00', 'Credit Pass'],
+ ['C', '55% - 69%', '2.00', 'Pass'],
+ ['F', 'Below 50%', '0.00', 'Fail (Re-sit Required)']
+ ]
+ ]
+ ];
+
+ return $this->renderPdf($title, $subtitle, $refNo, $tables, "Student_Handbook_2026.pdf");
+ }
+
+ /**
+ * Exam Code of Conduct PDF Download
+ */
+ public function downloadExamCode(Request $request)
+ {
+ if (!$this->isAuthenticated($request)) {
+ return redirect()->route('students')->with('error', 'Please login first to download official academic documents!');
+ }
+
+ $title = "Exam Code of Conduct & Rules";
+ $subtitle = "Examination Hall Admission, Practical Station Rules & Disciplinary Code";
+ $refNo = "REF: EX-2026-RULES";
+
+ $tables = [
+ [
+ 'title' => '1. EXAMINATION HALL ADMISSION RULES',
+ 'headers' => ['Rule Item', 'Requirement Detail', 'Enforcement'],
+ 'rows' => [
+ ['Student Identification', 'Valid Student ID Card & Exam Admission Ticket required.', 'Strictly Enforced'],
+ ['Entry Time Limit', 'Candidates admitted up to 30 minutes after commencement.', 'No extra time given'],
+ ['Prohibited Items', 'Mobile phones, smartwatches, programmable notes, bags.', 'Immediate Confiscation']
+ ]
+ ],
+ [
+ 'title' => '2. PRACTICAL DIAGNOSTIC EXAMINATIONS',
+ 'headers' => ['Station Requirement', 'Procedure Standard', 'Evaluator Note'],
+ 'rows' => [
+ ['Station Attire', 'Clean workshop overall and non-slip safety shoes required.', 'Visual inspection at entry'],
+ ['Tool Calibration', 'Verify diagnostic scan tools before beginning fault-finding.', 'Instructor verification'],
+ ['Safety Shutoff', 'Always disengage high-voltage battery service plug first.', 'Immediate disqualification if missed']
+ ]
+ ]
+ ];
+
+ return $this->renderPdf($title, $subtitle, $refNo, $tables, "Exam_Code_of_Conduct_2026.pdf");
+ }
+
+ /**
+ * Student Helpdesk Guide PDF Download
+ */
+ public function downloadHelpdeskGuide(Request $request)
+ {
+ if (!$this->isAuthenticated($request)) {
+ return redirect()->route('students')->with('error', 'Please login first to download official academic documents!');
+ }
+
+ $title = "Student Helpdesk & Support Directory";
+ $subtitle = "Portal Assistance, Technical Enquiries & Department Contact List";
+ $refNo = "REF: HD-2026-SUPP";
+
+ $tables = [
+ [
+ 'title' => '1. PORTAL & IT SUPPORT CHANNELS',
+ 'headers' => ['Support Issue', 'Resolution Method', 'Response Time'],
+ 'rows' => [
+ ['Password & PIN Reset', 'Self-service PIN reset or visit IT Help Desk (Level 2)', 'Instant / 15 Mins'],
+ ['Module Material Access', 'Email portal-support@autoedu.lk with Student ID', 'Within 2 Hours'],
+ ['Wi-Fi & Email Setup', 'Visit Student IT Counter with Student ID Card', 'Immediate']
+ ]
+ ],
+ [
+ 'title' => '2. DEPARTMENT CONTACT DIRECTORY',
+ 'headers' => ['Department Name', 'Location', 'Extension', 'Official Email'],
+ 'rows' => [
+ ['Student Affairs & Registration', 'Admin Block - Ground Floor', 'Ext. 101', 'students@autoedu.lk'],
+ ['Finance & Tuition Payments', 'Admin Block - Room 104', 'Ext. 104', 'finance@autoedu.lk'],
+ ['Examinations & Results Branch', 'Academic Wing - Room 202', 'Ext. 108', 'exams@autoedu.lk'],
+ ['Automotive Workshop Office', 'Lab Complex - Block B', 'Ext. 112', 'workshop@autoedu.lk']
+ ]
+ ]
+ ];
+
+ return $this->renderPdf($title, $subtitle, $refNo, $tables, "Student_Helpdesk_Support_Guide.pdf");
+ }
+
+ /**
+ * Render HTML to DomPDF output
+ */
+ private function renderPdf($title, $subtitle, $refNo, $tables, $filename)
+ {
+ $studentName = session('student_name', 'Authenticated Student');
+ $studentId = session('student_id', 'STU-2026-0042');
+ $dateStr = date('F d, Y');
+
+ $tablesHtml = '';
+ foreach ($tables as $table) {
+ $tablesHtml .= '
';
+ $tablesHtml .= '';
+ foreach ($table['headers'] as $th) {
+ $tablesHtml .= '' . htmlspecialchars($th) . ' ';
+ }
+ $tablesHtml .= ' ';
+ foreach ($table['rows'] as $row) {
+ $tablesHtml .= '';
+ foreach ($row as $cell) {
+ $tablesHtml .= '' . htmlspecialchars($cell) . ' ';
+ }
+ $tablesHtml .= ' ';
+ }
+ $tablesHtml .= 'tbody>
';
+ }
+
+ $html = '
+
+
+
+
+ ' . htmlspecialchars($title) . '
+
+
+
+
+
+
+
+
+
+
' . htmlspecialchars($title) . '
+
' . htmlspecialchars($subtitle) . '
+
+
+
+
+
+ Issued To: ' . htmlspecialchars($studentName) . '
+ Student ID: ' . htmlspecialchars($studentId) . '
+ Issue Date: ' . htmlspecialchars($dateStr) . '
+
+
+
+
+ ' . $tablesHtml . '
+
+
+
+
+
+
+ ';
+
+ try {
+ $options = new Options();
+ $options->set('isHtml5ParserEnabled', true);
+ $options->set('isRemoteEnabled', true);
+
+ $dompdf = new Dompdf($options);
+ $dompdf->loadHtml($html);
+ $dompdf->setPaper('A4', 'portrait');
+ $dompdf->render();
+
+ return response($dompdf->output(), 200, [
+ 'Content-Type' => 'application/pdf',
+ 'Content-Disposition' => 'attachment; filename="' . $filename . '"',
+ 'Cache-Control' => 'private, max-age=0, must-revalidate',
+ 'Pragma' => 'public'
+ ]);
+ } catch (\Exception $e) {
+ // Fallback response if rendering fails
+ return response($html, 200, [
+ 'Content-Type' => 'text/html',
+ ]);
+ }
+ }
+}
diff --git a/composer.json b/composer.json
index b17af3e..738fbfc 100644
--- a/composer.json
+++ b/composer.json
@@ -7,6 +7,7 @@
"license": "MIT",
"require": {
"php": "^8.2",
+ "barryvdh/laravel-dompdf": "^3.1",
"laravel/framework": "^12.0",
"laravel/tinker": "^2.10.1"
},
diff --git a/composer.lock b/composer.lock
index efe53ff..0343d62 100644
--- a/composer.lock
+++ b/composer.lock
@@ -4,8 +4,85 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
- "content-hash": "53b5d56b3b7e3cbac1713e68c8850f6c",
+ "content-hash": "bf969a713724ba1caaf90ec885c262c2",
"packages": [
+ {
+ "name": "barryvdh/laravel-dompdf",
+ "version": "v3.1.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/barryvdh/laravel-dompdf.git",
+ "reference": "ee3b72b19ccdf57d0243116ecb2b90261344dedc"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/barryvdh/laravel-dompdf/zipball/ee3b72b19ccdf57d0243116ecb2b90261344dedc",
+ "reference": "ee3b72b19ccdf57d0243116ecb2b90261344dedc",
+ "shasum": ""
+ },
+ "require": {
+ "dompdf/dompdf": "^3.0",
+ "illuminate/support": "^9|^10|^11|^12|^13.0",
+ "php": "^8.1"
+ },
+ "require-dev": {
+ "larastan/larastan": "^2.7|^3.0",
+ "orchestra/testbench": "^7|^8|^9.16|^10|^11.0",
+ "phpro/grumphp": "^2.5",
+ "squizlabs/php_codesniffer": "^3.5"
+ },
+ "type": "library",
+ "extra": {
+ "laravel": {
+ "aliases": {
+ "PDF": "Barryvdh\\DomPDF\\Facade\\Pdf",
+ "Pdf": "Barryvdh\\DomPDF\\Facade\\Pdf"
+ },
+ "providers": [
+ "Barryvdh\\DomPDF\\ServiceProvider"
+ ]
+ },
+ "branch-alias": {
+ "dev-master": "3.0-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Barryvdh\\DomPDF\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Barry vd. Heuvel",
+ "email": "barryvdh@gmail.com"
+ }
+ ],
+ "description": "A DOMPDF Wrapper for Laravel",
+ "keywords": [
+ "dompdf",
+ "laravel",
+ "pdf"
+ ],
+ "support": {
+ "issues": "https://github.com/barryvdh/laravel-dompdf/issues",
+ "source": "https://github.com/barryvdh/laravel-dompdf/tree/v3.1.2"
+ },
+ "funding": [
+ {
+ "url": "https://fruitcake.nl",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/barryvdh",
+ "type": "github"
+ }
+ ],
+ "time": "2026-02-21T08:51:10+00:00"
+ },
{
"name": "brick/math",
"version": "0.14.8",
@@ -377,6 +454,161 @@
],
"time": "2024-02-05T11:56:58+00:00"
},
+ {
+ "name": "dompdf/dompdf",
+ "version": "v3.1.6",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/dompdf/dompdf.git",
+ "reference": "6d4b4eb8500f7a786da8868ba463a71b725a4005"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/dompdf/dompdf/zipball/6d4b4eb8500f7a786da8868ba463a71b725a4005",
+ "reference": "6d4b4eb8500f7a786da8868ba463a71b725a4005",
+ "shasum": ""
+ },
+ "require": {
+ "dompdf/php-font-lib": "^1.0.0",
+ "dompdf/php-svg-lib": "^1.0.0",
+ "ext-dom": "*",
+ "ext-mbstring": "*",
+ "masterminds/html5": "^2.0",
+ "php": "^7.1 || ^8.0"
+ },
+ "require-dev": {
+ "ext-gd": "*",
+ "ext-json": "*",
+ "ext-zip": "*",
+ "mockery/mockery": "^1.3",
+ "phpunit/phpunit": "^7.5 || ^8 || ^9 || ^10 || ^11",
+ "squizlabs/php_codesniffer": "^3.5",
+ "symfony/process": "^4.4 || ^5.4 || ^6.2 || ^7.0"
+ },
+ "suggest": {
+ "ext-gd": "Needed to process images",
+ "ext-gmagick": "Improves image processing performance",
+ "ext-imagick": "Improves image processing performance",
+ "ext-zlib": "Needed for pdf stream compression"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Dompdf\\": "src/"
+ },
+ "classmap": [
+ "lib/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "LGPL-2.1"
+ ],
+ "authors": [
+ {
+ "name": "The Dompdf Community",
+ "homepage": "https://github.com/dompdf/dompdf/blob/master/AUTHORS.md"
+ }
+ ],
+ "description": "DOMPDF is a CSS 2.1 compliant HTML to PDF converter",
+ "homepage": "https://github.com/dompdf/dompdf",
+ "support": {
+ "issues": "https://github.com/dompdf/dompdf/issues",
+ "source": "https://github.com/dompdf/dompdf/tree/v3.1.6"
+ },
+ "time": "2026-07-20T12:29:38+00:00"
+ },
+ {
+ "name": "dompdf/php-font-lib",
+ "version": "1.0.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/dompdf/php-font-lib.git",
+ "reference": "a6e9a688a2a80016ac080b97be73d3e10c444c9a"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/dompdf/php-font-lib/zipball/a6e9a688a2a80016ac080b97be73d3e10c444c9a",
+ "reference": "a6e9a688a2a80016ac080b97be73d3e10c444c9a",
+ "shasum": ""
+ },
+ "require": {
+ "ext-mbstring": "*",
+ "php": "^7.1 || ^8.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^7.5 || ^8 || ^9 || ^10 || ^11 || ^12"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "FontLib\\": "src/FontLib"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "LGPL-2.1-or-later"
+ ],
+ "authors": [
+ {
+ "name": "The FontLib Community",
+ "homepage": "https://github.com/dompdf/php-font-lib/blob/master/AUTHORS.md"
+ }
+ ],
+ "description": "A library to read, parse, export and make subsets of different types of font files.",
+ "homepage": "https://github.com/dompdf/php-font-lib",
+ "support": {
+ "issues": "https://github.com/dompdf/php-font-lib/issues",
+ "source": "https://github.com/dompdf/php-font-lib/tree/1.0.2"
+ },
+ "time": "2026-01-20T14:10:26+00:00"
+ },
+ {
+ "name": "dompdf/php-svg-lib",
+ "version": "1.0.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/dompdf/php-svg-lib.git",
+ "reference": "8259ffb930817e72b1ff1caef5d226501f3dfeb1"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/dompdf/php-svg-lib/zipball/8259ffb930817e72b1ff1caef5d226501f3dfeb1",
+ "reference": "8259ffb930817e72b1ff1caef5d226501f3dfeb1",
+ "shasum": ""
+ },
+ "require": {
+ "ext-mbstring": "*",
+ "php": "^7.1 || ^8.0",
+ "sabberworm/php-css-parser": "^8.4 || ^9.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^7.5 || ^8 || ^9 || ^10 || ^11"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Svg\\": "src/Svg"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "LGPL-3.0-or-later"
+ ],
+ "authors": [
+ {
+ "name": "The SvgLib Community",
+ "homepage": "https://github.com/dompdf/php-svg-lib/blob/master/AUTHORS.md"
+ }
+ ],
+ "description": "A library to read, parse and export to PDF SVG files.",
+ "homepage": "https://github.com/dompdf/php-svg-lib",
+ "support": {
+ "issues": "https://github.com/dompdf/php-svg-lib/issues",
+ "source": "https://github.com/dompdf/php-svg-lib/tree/1.0.2"
+ },
+ "time": "2026-01-02T16:01:13+00:00"
+ },
{
"name": "dragonmantank/cron-expression",
"version": "v3.6.0",
@@ -2025,6 +2257,73 @@
],
"time": "2026-03-08T20:05:35+00:00"
},
+ {
+ "name": "masterminds/html5",
+ "version": "2.10.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/Masterminds/html5-php.git",
+ "reference": "fd5018f6815fff903946d0564977b44ce8010e29"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/Masterminds/html5-php/zipball/fd5018f6815fff903946d0564977b44ce8010e29",
+ "reference": "fd5018f6815fff903946d0564977b44ce8010e29",
+ "shasum": ""
+ },
+ "require": {
+ "ext-dom": "*",
+ "php": ">=5.3.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^4.8.35 || ^5.7.21 || ^6 || ^7 || ^8 || ^9 || ^10"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.7-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Masterminds\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Matt Butcher",
+ "email": "technosophos@gmail.com"
+ },
+ {
+ "name": "Matt Farina",
+ "email": "matt@mattfarina.com"
+ },
+ {
+ "name": "Asmir Mustafic",
+ "email": "goetas@gmail.com"
+ }
+ ],
+ "description": "An HTML5 parser and serializer.",
+ "homepage": "http://masterminds.github.io/html5-php",
+ "keywords": [
+ "HTML5",
+ "dom",
+ "html",
+ "parser",
+ "querypath",
+ "serializer",
+ "xml"
+ ],
+ "support": {
+ "issues": "https://github.com/Masterminds/html5-php/issues",
+ "source": "https://github.com/Masterminds/html5-php/tree/2.10.1"
+ },
+ "time": "2026-06-23T18:43:15+00:00"
+ },
{
"name": "monolog/monolog",
"version": "3.10.0",
@@ -3299,6 +3598,86 @@
},
"time": "2026-06-18T03:57:49+00:00"
},
+ {
+ "name": "sabberworm/php-css-parser",
+ "version": "v9.4.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/MyIntervals/PHP-CSS-Parser.git",
+ "reference": "fd3bf9fb173e0df649bc4e3e0d088a1b2417c08f"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/MyIntervals/PHP-CSS-Parser/zipball/fd3bf9fb173e0df649bc4e3e0d088a1b2417c08f",
+ "reference": "fd3bf9fb173e0df649bc4e3e0d088a1b2417c08f",
+ "shasum": ""
+ },
+ "require": {
+ "ext-iconv": "*",
+ "php": "^7.2.0 || ~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0 || ~8.5.0",
+ "thecodingmachine/safe": "^1.3 || ^2.5 || ^3.4"
+ },
+ "require-dev": {
+ "php-parallel-lint/php-parallel-lint": "1.4.0",
+ "phpstan/extension-installer": "1.4.3",
+ "phpstan/phpstan": "1.12.33 || 2.2.2",
+ "phpstan/phpstan-phpunit": "1.4.2 || 2.0.16",
+ "phpstan/phpstan-strict-rules": "1.6.2 || 2.0.11",
+ "phpunit/phpunit": "8.5.52",
+ "rawr/phpunit-data-provider": "3.3.1",
+ "rector/rector": "1.2.10 || 2.4.6",
+ "rector/type-perfect": "1.0.0 || 2.1.3",
+ "squizlabs/php_codesniffer": "4.0.1",
+ "thecodingmachine/phpstan-safe-rule": "1.2.0 || 1.4.3"
+ },
+ "suggest": {
+ "ext-mbstring": "for parsing UTF-8 CSS"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "9.5.x-dev"
+ }
+ },
+ "autoload": {
+ "files": [
+ "src/Rule/Rule.php",
+ "src/RuleSet/RuleContainer.php"
+ ],
+ "psr-4": {
+ "Sabberworm\\CSS\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Raphael Schweikert"
+ },
+ {
+ "name": "Oliver Klee",
+ "email": "github@oliverklee.de"
+ },
+ {
+ "name": "Jake Hotson",
+ "email": "jake.github@qzdesign.co.uk"
+ }
+ ],
+ "description": "Parser for CSS Files written in PHP",
+ "homepage": "https://www.sabberworm.com/blog/2010/6/10/php-css-parser",
+ "keywords": [
+ "css",
+ "parser",
+ "stylesheet"
+ ],
+ "support": {
+ "issues": "https://github.com/MyIntervals/PHP-CSS-Parser/issues",
+ "source": "https://github.com/MyIntervals/PHP-CSS-Parser/tree/v9.4.0"
+ },
+ "time": "2026-06-18T15:10:53+00:00"
+ },
{
"name": "symfony/clock",
"version": "v7.4.8",
@@ -5808,6 +6187,149 @@
],
"time": "2026-06-08T20:24:16+00:00"
},
+ {
+ "name": "thecodingmachine/safe",
+ "version": "v3.4.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/thecodingmachine/safe.git",
+ "reference": "705683a25bacf0d4860c7dea4d7947bfd09eea19"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/thecodingmachine/safe/zipball/705683a25bacf0d4860c7dea4d7947bfd09eea19",
+ "reference": "705683a25bacf0d4860c7dea4d7947bfd09eea19",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^8.1"
+ },
+ "require-dev": {
+ "php-parallel-lint/php-parallel-lint": "^1.4",
+ "phpstan/phpstan": "^2",
+ "phpunit/phpunit": "^10",
+ "squizlabs/php_codesniffer": "^3.2"
+ },
+ "type": "library",
+ "autoload": {
+ "files": [
+ "lib/special_cases.php",
+ "generated/apache.php",
+ "generated/apcu.php",
+ "generated/array.php",
+ "generated/bzip2.php",
+ "generated/calendar.php",
+ "generated/classobj.php",
+ "generated/com.php",
+ "generated/cubrid.php",
+ "generated/curl.php",
+ "generated/datetime.php",
+ "generated/dir.php",
+ "generated/eio.php",
+ "generated/errorfunc.php",
+ "generated/exec.php",
+ "generated/fileinfo.php",
+ "generated/filesystem.php",
+ "generated/filter.php",
+ "generated/fpm.php",
+ "generated/ftp.php",
+ "generated/funchand.php",
+ "generated/gettext.php",
+ "generated/gmp.php",
+ "generated/gnupg.php",
+ "generated/hash.php",
+ "generated/ibase.php",
+ "generated/ibmDb2.php",
+ "generated/iconv.php",
+ "generated/image.php",
+ "generated/imap.php",
+ "generated/info.php",
+ "generated/inotify.php",
+ "generated/json.php",
+ "generated/ldap.php",
+ "generated/libxml.php",
+ "generated/lzf.php",
+ "generated/mailparse.php",
+ "generated/mbstring.php",
+ "generated/misc.php",
+ "generated/mysql.php",
+ "generated/mysqli.php",
+ "generated/network.php",
+ "generated/oci8.php",
+ "generated/opcache.php",
+ "generated/openssl.php",
+ "generated/outcontrol.php",
+ "generated/pcntl.php",
+ "generated/pcre.php",
+ "generated/pgsql.php",
+ "generated/posix.php",
+ "generated/ps.php",
+ "generated/pspell.php",
+ "generated/readline.php",
+ "generated/rnp.php",
+ "generated/rpminfo.php",
+ "generated/rrd.php",
+ "generated/sem.php",
+ "generated/session.php",
+ "generated/shmop.php",
+ "generated/sockets.php",
+ "generated/sodium.php",
+ "generated/solr.php",
+ "generated/spl.php",
+ "generated/sqlsrv.php",
+ "generated/ssdeep.php",
+ "generated/ssh2.php",
+ "generated/stream.php",
+ "generated/strings.php",
+ "generated/swoole.php",
+ "generated/uodbc.php",
+ "generated/uopz.php",
+ "generated/url.php",
+ "generated/var.php",
+ "generated/xdiff.php",
+ "generated/xml.php",
+ "generated/xmlrpc.php",
+ "generated/yaml.php",
+ "generated/yaz.php",
+ "generated/zip.php",
+ "generated/zlib.php"
+ ],
+ "classmap": [
+ "lib/DateTime.php",
+ "lib/DateTimeImmutable.php",
+ "lib/Exceptions/",
+ "generated/Exceptions/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "description": "PHP core functions that throw exceptions instead of returning FALSE on error",
+ "support": {
+ "issues": "https://github.com/thecodingmachine/safe/issues",
+ "source": "https://github.com/thecodingmachine/safe/tree/v3.4.0"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/OskarStark",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/shish",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/silasjoisten",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/staabm",
+ "type": "github"
+ }
+ ],
+ "time": "2026-02-04T18:08:13+00:00"
+ },
{
"name": "tijsverkoyen/css-to-inline-styles",
"version": "v2.4.0",
diff --git a/resources/views/StudentPortal.blade.php b/resources/views/StudentPortal.blade.php
index 199fd6c..2a4f236 100644
--- a/resources/views/StudentPortal.blade.php
+++ b/resources/views/StudentPortal.blade.php
@@ -291,6 +291,57 @@ body {
+
+
+ Official Document Downloads (PDF)
+
+
+
+
@endsection
\ No newline at end of file
diff --git a/resources/views/students.blade.php b/resources/views/students.blade.php
index 77388b1..da6d1cb 100644
--- a/resources/views/students.blade.php
+++ b/resources/views/students.blade.php
@@ -6,40 +6,43 @@
@@ -500,28 +649,29 @@ h1, h2, h3, h4, h5, h6 {
@endforeach
-
+
-
Your Academic Hub
-
Student Portal
-
- Access your courses, timetable, assignments, examination results,
- payments and profile from one place.
+ Student Academic Portal
+
Student Portal & Learning Hub
+
+ Your central gateway to enrolled courses, lecture timetables, assignment submissions,
+ examination results, and academic services.
-
- Student Login
+
+ Login to Portal
- Browse Services
+ Explore Services
- 24/7 Access
- Secure Login
- 6 Portal Services
+ 24/7 Portal Access
+ Encrypted SSL Auth
+ 6 Core Services
+ Real-Time Notices
@@ -529,187 +679,277 @@ h1, h2, h3, h4, h5, h6 {
-
-
-
Student Services
-
- Everything you need during your academic journey.
+
+
+
+
-
-
-
-
-
+
+
+
+
+
+
+
Academic
+
+
-
My Courses
-
View enrolled courses and learning materials.
-
Access Portal
+
My Courses
+
Access enrolled course modules, lecture slides, video tutorials, and study resources.
+
Open Course Dashboard
-
-
-
-
+
+
+
+
Schedule
+
+
-
Class Timetable
-
Check your weekly lecture schedule.
-
Access Portal
+
Class Timetable
+
Check weekly lecture schedules, lab practical sessions, and room allocation updates.
+
View Weekly Schedule
-
-
-
-
+
+
+
+
Tasks
+
+
-
Assignments
-
Submit assignments and download resources.
-
Access Portal
+
Assignments
+
Submit coursework online, check upcoming submission deadlines, and review lecturer feedback.
+
Manage Submissions
-
-
-
-
+
+
+
+
Grades
+
+
-
Exam Results
-
View semester and final examination results.
-
Access Portal
+
Exam Results
+
View semester GPA, final examination marks, and official academic transcript summaries.
+
Check Exam Marks
-
-
-
-
+
+
+
+
Finance
+
+
-
Fee Payments
-
Pay course fees and download payment receipts.
-
Access Portal
+
Fee Payments
+
Review tuition fee balances, complete online payments securely, and download official receipts.
+
Payment Portal
-
-
-
-
+
+
+
+
Account
+
+
-
Student Profile
-
Update your personal information securely.
-
Access Portal
+
Student Profile
+
Update personal contact info, change password credentials, and manage security PIN settings.
+
Manage Account
+
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+ Updates Feed
+
Campus Announcements
+
+
Live
+
+
+
-
-
+
+
+ Exam
+
-
Quick Links
-
Access important student portals and resources
+
+
Final Semester Examination Timetable Published
+ Today
+
+
The final examination schedule for the current semester is now available. Log in to your portal to check your assigned exam hall and seats.
-
-
-
-
-
-
Ready to Access Your Student Account?
-
Log in to manage your academic activities and stay updated.
-
- Student Login
-
+
+
+
+
+
Authorized Access Only
+
Ready to Access Your Student Account?
+
+ Log in to view your courses, check schedules, submit assignments, and track exam results.
+
+
+ Login to Student Portal
+
+
@@ -717,15 +957,15 @@ h1, h2, h3, h4, h5, h6 {
-
-
+
+
-
+
-
+
Student Portal Login
-
-
Enter your credentials to continue
+
+
Enter your institutional credentials to authenticate
@@ -766,13 +1006,25 @@ h1, h2, h3, h4, h5, h6 {