MIF_E31221225/routes/web.php

299 lines
16 KiB
PHP

<?php
use App\Http\Controllers\ProfileController;
use Illuminate\Support\Facades\Route;
// admin
use App\Http\Controllers\Admin\GuruController;
use App\Http\Controllers\Admin\SiswaController;
use App\Http\Controllers\Admin\KelasController;
use App\Http\Controllers\Admin\MapelController;
use App\Http\Controllers\Admin\GuruMapelController;
use App\Http\Controllers\Admin\UserManagementController;
use App\Http\Controllers\Admin\InfoAngketController;
use App\Http\Controllers\Admin\ProdiLanjutanController;
use App\Http\Controllers\Admin\HasilAngketController;
use App\Http\Controllers\Admin\KelasMapelController;
use App\Http\Controllers\Admin\TahunAjaranController;
use App\Http\Controllers\Admin\AdminProfileController;
// guru
use App\Http\Controllers\Guru\ProfileController as GuruProfileController;
use App\Http\Controllers\Guru\PelajaranController;
use App\Http\Controllers\Guru\MateriController;
use App\Http\Controllers\Guru\UjianController;
use App\Http\Controllers\Guru\SoalPilganController;
use App\Http\Controllers\Guru\SoalEssayController;
use App\Http\Controllers\Guru\TugasController;
use App\Http\Controllers\Guru\NilaiEssayController;
use App\Http\Controllers\Guru\EvaluasiController;
// siswa
use App\Http\Controllers\Siswa\ProfileSiswaController;
use App\Http\Controllers\Siswa\ModulController;
use App\Http\Controllers\Siswa\SubjekController;
use App\Http\Controllers\Siswa\TugasSiswaController;
use App\Http\Controllers\Siswa\UjianSiswaController;
use App\Http\Controllers\Siswa\DashboardSiswaController;
use App\Http\Controllers\Siswa\EvaluasiSiswaController;
use App\Http\Controllers\Siswa\AngketController;
use Illuminate\Support\Facades\Mail;
Route::get('/kirim-email', function () {
Mail::raw('Ini adalah email tes dari Laravel via SendGrid.', function ($message) {
$message->to('targetemail@example.com')
->subject('Tes Email SendGrid');
});
return 'Email terkirim (jika konfigurasi benar).';
});
Route::get('/', function () {
return redirect()->route('login');
});
Route::get('/dashboard', function () {
return redirect()->route('redirect-dashboard');
});
// Group middleware untuk semua route yang membutuhkan autentikasi
Route::middleware('auth')->group(function () {
// Profile management routes
Route::get('/profile', [ProfileController::class, 'edit'])->name('profile.edit');
Route::patch('/profile', [ProfileController::class, 'update'])->name('profile.update');
Route::delete('/profile', [ProfileController::class, 'destroy'])->name('profile.destroy');
// Route redirect berdasarkan role login
Route::get('/redirect-dashboard', function () {
$user = auth()->user();
if (!$user) {
return redirect('/login')->withErrors(['email' => 'Anda harus login terlebih dahulu.']);
}
if (!$user->is_active) {
auth()->logout();
return redirect('/login')->withErrors(['email' => 'Akun belum diaktifkan admin.']);
}
switch ($user->role) {
case 'admin':
return redirect()->route('admin.dashboard');
case 'guru':
return redirect()->route('guru.dashboard');
case 'siswa':
return redirect()->route('siswa.dashboard');
default:
return abort(403);
}
})->name('redirect-dashboard');
// Group route untuk admin
Route::middleware(['role:admin'])->prefix('admin')->name('admin.')->group(function () {
Route::get('/dashboard', [App\Http\Controllers\Admin\DashboardController::class, 'index'])->name('dashboard');
Route::get('profile', [AdminProfileController::class, 'edit'])->name('profile.edit');
Route::put('profile', [AdminProfileController::class, 'update'])->name('profile.update');
Route::resource('guru', GuruController::class)->except(['show']);
Route::resource('mapel', MapelController::class);
Route::resource('kelas', KelasController::class);
Route::resource('tahun_ajaran', TahunAjaranController::class);
Route::resource('guru-mapel', GuruMapelController::class);
// Siswa
Route::get('/siswa/lulus', [SiswaController::class, 'siswaLulus'])->name('siswa.lulus');
Route::get('/siswa/create/{kelas_id?}', [SiswaController::class, 'create'])->name('siswa.create');
Route::post('/siswa/store', [SiswaController::class, 'store'])->name('siswa.store');
Route::get('/siswa', [SiswaController::class, 'index'])->name('siswa.index');
// Route dinamis yang bisa menangkap parameter apapun harus di bawah
Route::get('/siswa/{id}/edit', [SiswaController::class, 'edit'])->name('siswa.edit');
Route::put('/siswa/{id}', [SiswaController::class, 'update'])->name('siswa.update');
Route::delete('/siswa/{id}', [SiswaController::class, 'destroy'])->name('siswa.destroy');
Route::resource('/paket-mapel', \App\Http\Controllers\Admin\PaketMapelController::class)->names('paket-mapel');
// Route index
Route::get('/users', [UserManagementController::class, 'index'])->name('users.index');
// Edit user
Route::get('/users/{id}/edit', [UserManagementController::class, 'edit'])->name('users.edit');
// Update user
Route::put('/users/{id}', [UserManagementController::class, 'update'])->name('users.update');
// Delete user
Route::delete('/users/{id}', [UserManagementController::class, 'destroy'])->name('users.destroy');
// Toggle aktif user
Route::patch('/users/{id}/toggle', [UserManagementController::class, 'toggleAktif'])->name('users.toggle');
Route::resource('kelas_mapel', KelasMapelController::class);
//angket
Route::get('/angket', [HasilAngketController::class, 'index'])->name('angket.index');
// CRUD Info
Route::resource('info', InfoAngketController::class)->except(['show']);
// CRUD Prodi Lanjutan
Route::resource('prodi-lanjutan', ProdiLanjutanController::class)->except(['show']);
// Edit hasil pemilihan siswa
Route::get('hasil-pemilihan', [HasilAngketController::class, 'index'])->name('hasil.index');
Route::get('hasil-pemilihan/{siswa}/edit', [HasilAngketController::class, 'edit'])->name('hasil.edit');
Route::put('hasil-pemilihan/{siswa}', [HasilAngketController::class, 'update'])->name('hasil.update');
Route::delete('hasil-pemilihan/{siswa}', [HasilAngketController::class, 'destroy'])->name('hasil.destroy');
Route::get('/hasil-angket/hitung', [HasilAngketController::class, 'hitung'])->name('h');
Route::post('/siswa/import', [SiswaController::class, 'import'])->name('siswa.import');
Route::get('/siswa/export', [SiswaController::class, 'export'])->name('siswa.export');
Route::get('guru/export', [GuruController::class, 'export'])->name('guru.export');
Route::post('guru/import', [GuruController::class, 'import'])->name('guru.import');
});
// Dashboard Guru
Route::middleware(['auth', 'role:guru'])->prefix('guru')->name('guru.')->group(function () {
//dashboard
Route::get('/dashboard', [App\Http\Controllers\Guru\DashboardGuruController::class, 'index'])->name('dashboard');
//profile
Route::get('/profile', [GuruProfileController::class, 'index'])->name('profile.index');
Route::get('/profile/edit', [GuruProfileController::class, 'edit'])->name('profile.edit');
Route::post('/profile', [GuruProfileController::class, 'update'])->name('profile.update');
Route::resource('materi', MateriController::class);
// Route tugas tanpa nested materi (akses tugas langsung via /guru/tugas)
Route::prefix('tugas')->name('tugas.')->group(function () {
Route::get('/grafik', [\App\Http\Controllers\Guru\TugasController::class, 'grafik'])->name('grafik');
Route::get('/', [TugasController::class, 'index'])->name('index'); // GET /guru/tugas
Route::get('create', [TugasController::class, 'create'])->name('create'); // GET /guru/tugas/create
Route::post('/', [TugasController::class, 'store'])->name('store'); // POST /guru/tugas
Route::get('{tugas}', [TugasController::class, 'show'])->name('show'); // GET /guru/tugas/{tugas}
Route::get('{tugas}/edit', [TugasController::class, 'edit'])->name('edit'); // GET /guru/tugas/{tugas}/edit
Route::put('{tugas}', [TugasController::class, 'update'])->name('update'); // PUT /guru/tugas/{tugas}
Route::delete('{tugas}', [TugasController::class, 'destroy'])->name('destroy'); // DELETE /guru/tugas/{tugas}
Route::get('show/{id}', [TugasController::class, 'show'])->name('guru.tugas.show');
// Penilaian tugas
Route::get('{tugas}/penilaian', [TugasController::class, 'penilaian'])->name('penilaian');
Route::put('penilaian/update-nilai/{id}', [TugasController::class, 'updateNilai'])->name('nilai.update'); });
// Route pelajaran dan materi (sesuai contoh)
Route::get('/pelajaran', [PelajaranController::class, 'index'])->name('pelajaran.index');
Route::get('materi/{id}/preview', [MateriController::class, 'preview'])->name('materi.preview');
Route::get('materi/{id}/edit-isi', [MateriController::class, 'editIsi'])->name('materi.editIsi');
Route::put('materi/{id}/update-isi', [MateriController::class, 'updateIsi'])->name('materi.updateIsi');
Route::post('materi/upload', [MateriController::class, 'upload'])->name('materi.upload');
//ujian
Route::resource('ujian', UjianController::class)->except(['show']);
Route::get('ujian/{ujian}/preview', [UjianController::class, 'preview'])->name('ujian.preview');
Route::patch('ujian/{ujian}/status', [UjianController::class, 'updateStatus'])->name('ujian.updateStatus');
Route::get('ujian/hasil', [UjianController::class, 'daftarHasil'])->name('ujian.hasil.index');
Route::get('ujian/{ujian}/hasil', [UjianController::class, 'hasil'])->name('ujian.hasil');
Route::get('ujian/{ujian}/detail', [UjianController::class, 'detail'])
->name('ujian.detail');
// Soal Essay
Route::prefix('ujian/{ujian}')->name('ujian.')->group(function () {
Route::get('soal-essay', [SoalEssayController::class, 'index'])->name('soal_essay');
Route::get('soal-essay/create', [SoalEssayController::class, 'create'])->name('soal_essay.create');
Route::post('soal-essay', [SoalEssayController::class, 'store'])->name('soal_essay.store');
Route::get('soal-essay/{soal}/edit', [SoalEssayController::class, 'edit'])->name('soal_essay.edit');
Route::put('soal-essay/{soal}', [SoalEssayController::class, 'update'])->name('soal_essay.update');
Route::delete('soal-essay/{soal}', [SoalEssayController::class, 'destroy'])->name('soal_essay.destroy');
});
Route::prefix('ujian/{ujian_id}/soal_pilgan')->name('ujian.soal_pg.')->group(function () {
Route::get('/export', [SoalPilganController::class, 'exportExcel'])->name('export');
Route::post('/import', [SoalPilganController::class, 'importExcel'])->name('import');
});
// Soal Pilihan Ganda
Route::prefix('ujian/{ujian}')->name('ujian.')->group(function () {
Route::get('soal-pg', [SoalPilganController::class, 'index'])->name('soal_pg');
Route::get('soal-pg/create', [SoalPilganController::class, 'create'])->name('soal_pg.create');
Route::post('soal-pg', [SoalPilganController::class, 'store'])->name('soal_pg.store');
Route::get('soal-pg/{soal}/edit', [SoalPilganController::class, 'edit'])->name('soal_pg.edit');
Route::put('soal-pg/{soal}', [SoalPilganController::class, 'update'])->name('soal_pg.update');
Route::delete('soal-pg/{soal}', [SoalPilganController::class, 'destroy'])->name('soal_pg.destroy');
});
Route::get('/hasil/{id}/nilai-essay', [NilaiEssayController::class, 'edit'])->name('nilai_essay.edit');
Route::put('/hasil/{id}/nilai-essay', [NilaiEssayController::class, 'update'])->name('nilai_essay.update');
Route::get('/ujian/grafik', [\App\Http\Controllers\Guru\UjianController::class, 'grafik'])->name('ujian.grafik');
Route::get('/penilaian', [App\Http\Controllers\Guru\TugasController::class, 'daftarPenilaian'])
->name('penilaian.index');
Route::get('tugas/{tugas}/penilaian', [TugasController::class, 'penilaian'])->name('tugas.penilaian');
Route::put('tugas/penilaian/update-nilai/{id}', [TugasController::class, 'updateNilai'])->name('tugas.nilai.update');
//evaluasi
Route::prefix('evaluasi')->middleware(['auth', 'role:guru'])->group(function () {
Route::get('/', [EvaluasiController::class, 'index'])->name('evaluasi.index');
Route::post('/simpan-bobot', [EvaluasiController::class, 'simpanBobot'])->name('evaluasi.simpanBobot');
Route::post('/hitung-nilai', [EvaluasiController::class, 'hitungNilaiTotal'])->name('evaluasi.hitungNilaiTotal');
// Tambahkan ini:
Route::post('/simpan-nilai-sikap', [EvaluasiController::class, 'simpanNilaiSikap'])->name('evaluasi.simpanNilaiSikap');
});
});
// Dashboard Siswa
Route::middleware(['role:siswa'])->group(function () {
//dashboard
Route::get('/siswa/dashboard', [DashboardSiswaController::class, 'index'])->name('siswa.dashboard');
//profile
Route::get('/siswa/profile', [ProfileSiswaController::class, 'index'])->name('siswa.profile.show');
Route::get('/siswa/profile/edit', [ProfileSiswaController::class, 'edit'])->name('siswa.profile.edit');
Route::put('/siswa/profile', [ProfileSiswaController::class, 'update'])->name('siswa.profile.update');
//pelajaran
Route::get('/siswa/pelajaran', [ModulController::class, 'index'])->name('siswa.pelajaran.index');
Route::get('/siswa/materi', [SubjekController::class, 'index'])->name('siswa.materi.index');
Route::get('/siswa/materi/{id}', [SubjekController::class, 'show'])->name('siswa.materi.show');
Route::get('/siswa/materi/{materi}/tugas', [TugasSiswaController::class, 'index'])->name('siswa.materi.tugas.index');
// Detail tugas di materi tertentu
Route::get('siswa/materi/{id}', [SubjekController::class, 'show'])->name('siswa.materi.show');
Route::post('siswa/materi/{materi}/tugas/{tugas}/jawaban', [TugasSiswaController::class, 'store'])->name('siswa.tugas.store');
// Kirim jawaban tugas
Route::post('siswa/materi/{materi}/tugas/{tugas}', [TugasSiswaController::class, 'store'])->name('siswa.materi.tugas.store');
//ujian
Route::prefix('siswa/ujian')->middleware(['auth'])->name('siswa.ujian.')->group(function () {
Route::get('/', [UjianSiswaController::class, 'index'])->name('index');
Route::get('/{id}/kerjakan', [UjianSiswaController::class, 'kerjakan'])->name('kerjakan');
Route::post('/{id}/submit', [UjianSiswaController::class, 'submit'])->name('submit');
Route::get('/{id}/hasil', [UjianSiswaController::class, 'hasil'])->name('hasil');
Route::get('/{id}', [UjianSiswaController::class, 'show'])->name('show'); // <-- paling bawah
});
Route::get('/nilai/tugas', [TugasSiswaController::class, 'nilaiTugas'])->name('siswa.nilai.tugas');
Route::get('siswa/nilai', [UjianSiswaController::class, 'evaluasi'])->name('siswa.nilai');
//angket
Route::prefix('siswa')->name('siswa.')->group(function () {
Route::get('/angket', [AngketController::class, 'index'])->name('angket.index');
Route::get('/angket/info', [AngketController::class, 'info'])->name('angket.info');
Route::get('/angket/pilih', [AngketController::class, 'create'])->name('angket.create');
Route::post('/angket', [AngketController::class, 'store'])->name('angket.store');
Route::get('/angket/hasil', [AngketController::class, 'hasil'])->name('angket.hasil');
});
//evaluasi
Route::get('siswa/evaluasi/mapel', [EvaluasiSiswaController::class, 'mapel'])->name('siswa.evaluasi.mapel');
Route::get('evaluasi/mapel/pdf', [EvaluasiSiswaController::class, 'exportPdf'])->name('evaluasi.mapel.pdf'); // ✅ ini penting
Route::get('siswa/evaluasi/mapel/{mapel}', [EvaluasiSiswaController::class, 'detailEvaluasi'])->name('siswa.evaluasi.detail');
});
}); // << Penutup group middleware(auth) — penting!
// Route auth bawaan Laravel Breeze/Fortify/etc.
require __DIR__.'/auth.php';