diff --git a/app/Http/Controllers/Admin/GuruController.php b/app/Http/Controllers/Admin/GuruController.php index 3e323b0..cccee96 100644 --- a/app/Http/Controllers/Admin/GuruController.php +++ b/app/Http/Controllers/Admin/GuruController.php @@ -34,23 +34,37 @@ public function store(Request $request) return redirect()->route('guru.index')->with('success', 'Data guru berhasil ditambahkan.'); } - public function edit(Guru $guru) - { - return view('admin.guru.edit', compact('guru')); - } - - public function update(Request $request, Guru $guru) - { - $request->validate([ - 'nama_guru' => 'required|string|max:100', - 'email' => 'nullable|email|max:100', - 'no_hp' => 'nullable|string|max:20', - 'jenis_guru' => 'required|in:guru_kelas,shadow_abk', - ]); - - $guru->update($request->all()); - return redirect()->route('guru.index')->with('success', 'Data guru berhasil diperbarui.'); - } + public function edit($id) + { + // PENTING: Tambahkan ->with('user') biar data email & nama akun ke-load + $guru = Guru::with('user')->findOrFail($id); + return view('admin.guru.edit', compact('guru')); + } + + public function update(Request $request, $id) + { + // Cari data guru + $guru = Guru::findOrFail($id); + + // 1. Validasi + $request->validate([ + 'nama_guru' => 'required|string|max:255', // Harus nama_guru + 'email' => 'required|email', + 'no_hp' => 'nullable|string', + 'jenis_guru' => 'required|string', + ]); + + // 2. Update Tabel Guru LANGSUNG + // Kita abaikan tabel user dulu karena user_id kamu masih NULL + $guru->update([ + 'nama_guru' => $request->nama_guru, // Masukkan ke kolom nama_guru + 'email' => $request->email, + 'no_hp' => $request->no_hp, + 'jenis_guru' => $request->jenis_guru, + ]); + + return redirect()->route('guru.index')->with('success', 'Data Guru berhasil diperbarui!'); + } public function destroy(Guru $guru) { diff --git a/app/Http/Controllers/Admin/PenjemputanController.php b/app/Http/Controllers/Admin/PenjemputanController.php new file mode 100644 index 0000000..4e34486 --- /dev/null +++ b/app/Http/Controllers/Admin/PenjemputanController.php @@ -0,0 +1,34 @@ +latest('waktu_jemput')->get(); + + // Kirim ke tampilan + return view('admin.penjemputan.index', compact('logs')); + } + + public function destroy($id) + { + $log = Penjemputan::findOrFail($id); + + // Hapus foto jika ada + if ($log->foto_bukti) { + Storage::delete('public/' . $log->foto_bukti); + } + + $log->delete(); + + return redirect()->back()->with('success', 'Data penjemputan dihapus.'); + } +} \ No newline at end of file diff --git a/app/Http/Controllers/Admin/PerkembanganController.php b/app/Http/Controllers/Admin/PerkembanganController.php index b2b779d..e60efe1 100644 --- a/app/Http/Controllers/Admin/PerkembanganController.php +++ b/app/Http/Controllers/Admin/PerkembanganController.php @@ -3,27 +3,48 @@ namespace App\Http\Controllers\Admin; use App\Http\Controllers\Controller; -use App\Models\Perkembangan; +use App\Models\Siswa; +use App\Models\Anekdot; +use App\Models\HasilKarya; +use App\Models\PenilaianCeklis; use Illuminate\Http\Request; class PerkembanganController extends Controller { - // ✅ Admin hanya bisa lihat (read-only) + // Halaman Utama: Tampilkan Daftar Siswa public function index() -{ - $perkembangans = Perkembangan::orderBy('tanggal', 'desc')->get(); - return view('admin.perkembangan.index', compact('perkembangans')); -} + { + // PERBAIKAN: Ganti 'nama' menjadi 'nama_siswa' + $siswas = Siswa::orderBy('nama_siswa', 'asc')->get(); + + return view('admin.perkembangan.index', compact('siswas')); + } + // Halaman Detail: Tampilkan Rapot (Gabungan 3 Tabel) public function show($id) - { - $perkembangan = Perkembangan::with(['siswa', 'guru'])->findOrFail($id); - return view('admin.perkembangan.show', compact('perkembangan')); - } + { + $siswa = Siswa::findOrFail($id); + + // 1. Ambil Data Rapot (Untuk Tabel Bawah) + $rapots = \App\Models\Rapot::where('siswa_id', $id)->orderBy('created_at', 'desc')->get(); + + // 2. Ambil Data Harian (Untuk Tombol/Menu Atas) - SUDAH DIAKTIFKAN + $anekdots = \App\Models\Anekdot::where('siswa_id', $id)->get(); + $karyas = \App\Models\HasilKarya::where('siswa_id', $id)->get(); + $ceklis = \App\Models\PenilaianCeklis::where('siswa_id', $id)->get(); + + // Kirim semua variabel ke View + return view('admin.perkembangan.show', compact('siswa', 'rapots', 'anekdots', 'karyas', 'ceklis')); + } + // Halaman Cetak (Opsional, logika sama dengan show) public function print($id) { - $perkembangan = Perkembangan::with(['siswa', 'guru'])->findOrFail($id); - return view('admin.perkembangan.print', compact('perkembangan')); + $siswa = Siswa::findOrFail($id); + $anekdots = Anekdot::where('siswa_id', $id)->get(); + $karyas = HasilKarya::where('siswa_id', $id)->get(); + $ceklis = PenilaianCeklis::where('siswa_id', $id)->with('indikator')->get(); + + return view('admin.perkembangan.print', compact('siswa', 'anekdots', 'karyas', 'ceklis')); } -} +} \ No newline at end of file diff --git a/app/Http/Controllers/Admin/RapotController.php b/app/Http/Controllers/Admin/RapotController.php new file mode 100644 index 0000000..9e73e22 --- /dev/null +++ b/app/Http/Controllers/Admin/RapotController.php @@ -0,0 +1,80 @@ +get(); + + return view('admin.rapot.create', compact('siswa', 'gurus')); + } + + // 2. SIMPAN DATA RAPOT KE DATABASE + public function store(Request $request, $siswa_id) + { + $request->validate([ + 'semester' => 'required', + 'tahun_ajaran' => 'required', + 'tanggal_rapot' => 'required|date', + 'nama_guru' => 'required', + 'nama_kepala_sekolah' => 'required', + ]); + + Rapot::create([ + 'siswa_id' => $siswa_id, + 'semester' => $request->semester, + 'tahun_ajaran' => $request->tahun_ajaran, + 'tanggal_rapot' => $request->tanggal_rapot, + + // Urutan A-E Sesuai PDF + 'narasi_aik' => $request->narasi_aik, + 'narasi_nilai_agama' => $request->narasi_nilai_agama, + 'narasi_jati_diri' => $request->narasi_jati_diri, + 'narasi_literasi' => $request->narasi_literasi, + 'narasi_kokurikuler' => $request->narasi_kokurikuler, // Kolom Baru + + // Fisik & Kehadiran + 'tinggi_badan' => $request->tinggi_badan, + 'berat_badan' => $request->berat_badan, + 'lingkar_kepala' => $request->lingkar_kepala, + 'lingkar_lengan' => $request->lingkar_lengan, + 'sakit' => $request->sakit ?? 0, + 'izin' => $request->izin ?? 0, + 'alpha' => $request->alpha ?? 0, + + // Refleksi & TTD + 'refleksi_orang_tua' => $request->refleksi_orang_tua, + 'nama_guru' => $request->nama_guru, + 'nama_kepala_sekolah' => $request->nama_kepala_sekolah, + 'nbm_kepala_sekolah' => $request->nbm_kepala_sekolah, + ]); + + return redirect()->route('perkembangan.show', $siswa_id) + ->with('success', 'Rapot berhasil dibuat!'); + } + + // 3. LIHAT DETAIL RAPOT (PREVIEW SEBELUM CETAK) + public function show($id) + { + $rapot = Rapot::with('siswa')->findOrFail($id); + return view('admin.rapot.show', compact('rapot')); + } + + // 4. CETAK PDF (Nanti kita bahas fitur ini) + public function print($id) + { + $rapot = Rapot::with('siswa')->findOrFail($id); + return view('admin.rapot.print', compact('rapot')); + } +} \ No newline at end of file diff --git a/app/Http/Controllers/Admin/SiswaController.php b/app/Http/Controllers/Admin/SiswaController.php index f54e845..a2c8921 100644 --- a/app/Http/Controllers/Admin/SiswaController.php +++ b/app/Http/Controllers/Admin/SiswaController.php @@ -11,29 +11,39 @@ class SiswaController extends Controller { public function index() { - // Ambil data siswa + data walinya (supaya tidak berat query-nya) - $siswas = Siswa::with('wali')->latest()->get(); + // Kita load data wali_murid biar bisa ambil alamatnya nanti + $siswas = Siswa::with('wali_murid')->latest()->get(); return view('admin.siswa.index', compact('siswas')); } public function create() { - // Ambil data wali untuk dropdown pilihan - $walis = WaliMurid::orderBy('nama_wali', 'asc')->get(); - return view('admin.siswa.create', compact('walis')); + $wali_murids = WaliMurid::all(); + return view('admin.siswa.create', compact('wali_murids')); } public function store(Request $request) { $request->validate([ - 'nama_siswa' => 'required|string|max:100', - 'wali_id' => 'required|exists:wali_murids,id', // Wajib pilih wali yg valid - 'jenis_kelamin' => 'required|in:L,P', + 'nis' => 'required|unique:siswas,nis', + 'nisn' => 'nullable|string', + 'nama_siswa' => 'required|string|max:255', 'tempat_lahir' => 'required|string', 'tanggal_lahir' => 'required|date', + 'jenis_kelamin' => 'required|in:L,P', + 'wali_murid_id' => 'required|exists:wali_murids,id', + // Alamat dihapus, karena ikut Wali Murid ]); - Siswa::create($request->all()); + Siswa::create([ + 'nis' => $request->nis, + 'nisn' => $request->nisn, + 'nama_siswa' => $request->nama_siswa, + 'tempat_lahir' => $request->tempat_lahir, + 'tanggal_lahir' => $request->tanggal_lahir, + 'jenis_kelamin' => $request->jenis_kelamin, + 'wali_murid_id' => $request->wali_murid_id, + ]); return redirect()->route('siswa.index')->with('success', 'Data Siswa berhasil ditambahkan.'); } @@ -41,8 +51,8 @@ public function store(Request $request) public function edit($id) { $siswa = Siswa::findOrFail($id); - $walis = WaliMurid::orderBy('nama_wali', 'asc')->get(); - return view('admin.siswa.edit', compact('siswa', 'walis')); + $wali_murids = WaliMurid::all(); + return view('admin.siswa.edit', compact('siswa', 'wali_murids')); } public function update(Request $request, $id) @@ -50,22 +60,31 @@ public function update(Request $request, $id) $siswa = Siswa::findOrFail($id); $request->validate([ - 'nama_siswa' => 'required|string|max:100', - 'wali_id' => 'required|exists:wali_murids,id', - 'jenis_kelamin' => 'required|in:L,P', + 'nis' => 'required|unique:siswas,nis,'.$id, + 'nisn' => 'nullable|string', + 'nama_siswa' => 'required|string|max:255', 'tempat_lahir' => 'required|string', 'tanggal_lahir' => 'required|date', + 'jenis_kelamin' => 'required|in:L,P', + 'wali_murid_id' => 'required|exists:wali_murids,id', ]); - $siswa->update($request->all()); + $siswa->update([ + 'nis' => $request->nis, + 'nisn' => $request->nisn, + 'nama_siswa' => $request->nama_siswa, + 'tempat_lahir' => $request->tempat_lahir, + 'tanggal_lahir' => $request->tanggal_lahir, + 'jenis_kelamin' => $request->jenis_kelamin, + 'wali_murid_id' => $request->wali_murid_id, + ]); - return redirect()->route('siswa.index')->with('success', 'Data Siswa berhasil diperbarui.'); + return redirect()->route('siswa.index')->with('success', 'Data Siswa berhasil diperbarui!'); } public function destroy($id) { - $siswa = Siswa::findOrFail($id); - $siswa->delete(); - return redirect()->route('siswa.index')->with('success', 'Data Siswa berhasil dihapus.'); + Siswa::findOrFail($id)->delete(); + return redirect()->route('siswa.index')->with('success', 'Data Siswa berhasil dihapus!'); } } \ No newline at end of file diff --git a/app/Http/Controllers/Admin/WaliMuridController.php b/app/Http/Controllers/Admin/WaliMuridController.php index e4fe4fb..70f2822 100644 --- a/app/Http/Controllers/Admin/WaliMuridController.php +++ b/app/Http/Controllers/Admin/WaliMuridController.php @@ -33,43 +33,56 @@ public function store(Request $request) } public function edit($id) - { - $wali = WaliMurid::findOrFail($id); - return view('admin.wali.edit', compact('wali')); - } - - public function update(Request $request, $id) - { - $wali = WaliMurid::findOrFail($id); - - $request->validate([ - 'nama_wali' => 'required|string|max:100', - 'no_hp' => 'nullable|string|max:20', - 'alamat' => 'nullable|string', - ]); - - $wali->update($request->all()); - - return redirect()->route('wali-murid.index')->with('success', 'Data Wali Murid berhasil diperbarui.'); - } - - public function destroy($id) - { - $wali = WaliMurid::findOrFail($id); - - // --- LOGIC AMAN (Mencegah Error Database) --- - // Cek apakah wali ini punya anak didik (siswa) - // Pastikan di Model WaliMurid sudah ada relasi: public function siswas() - $jumlah_siswa = $wali->siswas()->count(); - - if ($jumlah_siswa > 0) { - // Jika masih punya siswa, BATALKAN hapus & beri pesan Error - return redirect()->route('wali-murid.index')->with('error', '❌ Gagal Hapus! Wali ini masih terhubung dengan ' . $jumlah_siswa . ' data Siswa. Hapus atau pindahkan data siswanya dulu.'); + { + // Kita pakai nama variable $data biar netral dan pasti beda + $data = WaliMurid::with('user')->findOrFail($id); + + // Kirim ke view dengan nama 'data' + return view('admin.wali.edit', compact('data')); + } + + public function update(Request $request, $id) + { + $data = WaliMurid::findOrFail($id); + + $request->validate([ + 'nama_wali' => 'required|string|max:255', + // Cek email unik kecuali user ini ($data->user_id) + 'email' => 'nullable|email|unique:users,email,' . ($data->user_id ?? 0), + 'no_hp' => 'nullable|string', + 'alamat' => 'nullable|string', + ]); + + // 1. Update User (Jika ada) + if ($data->user) { + $data->user->update([ + 'name' => $request->nama_wali, + 'email' => $request->email, + ]); + } + + // 2. Update Data Wali + $data->update([ + 'nama_wali' => $request->nama_wali, + 'no_hp' => $request->no_hp, + 'alamat' => $request->alamat, + ]); + + return redirect()->route('wali-murid.index')->with('success', 'Data Wali Murid berhasil diperbarui!'); + } + + // --- DELETE (Perbaikan Hapus User juga) --- + public function destroy($id) + { + $waliMurid = WaliMurid::findOrFail($id); + + // Hapus akun loginnya juga biar bersih + if ($waliMurid->user) { + $waliMurid->user->delete(); + } + + $waliMurid->delete(); + + return redirect()->route('wali-murid.index')->with('success', 'Data Wali Murid berhasil dihapus!'); } - - // Jika tidak punya siswa, baru boleh dihapus - $wali->delete(); - - return redirect()->route('wali-murid.index')->with('success', '✅ Data Wali Murid berhasil dihapus.'); - } } \ No newline at end of file diff --git a/app/Http/Controllers/Api/MobileApiController.php b/app/Http/Controllers/Api/MobileApiController.php new file mode 100644 index 0000000..2f71cb8 --- /dev/null +++ b/app/Http/Controllers/Api/MobileApiController.php @@ -0,0 +1,175 @@ + $request->email, 'password' => $request->password])) { + $user = Auth::user(); + + // Cek role: Hanya Guru dan Wali yang boleh login di HP + if ($user->role !== 'guru' && $user->role !== 'wali') { + return response()->json([ + 'success' => false, + 'message' => 'Maaf, Admin hanya bisa login di Website/Laptop.' + ], 403); + } + + // Buat Token + $token = $user->createToken('MobileAppToken')->plainTextToken; + + return response()->json([ + 'success' => true, + 'message' => 'Login Berhasil', + 'user' => $user, // Disini ada info 'role' (guru/wali) + 'token' => $token, + ], 200); + } + + return response()->json(['success' => false, 'message' => 'Email atau Password Salah'], 401); + } + + public function logout(Request $request) + { + $request->user()->currentAccessToken()->delete(); + return response()->json(['success' => true, 'message' => 'Logout Berhasil']); + } + + // ========================================== + // 2. FITUR KHUSUS GURU 👩‍đŸĢ + // ========================================== + + // Ambil Daftar Siswa (Untuk dipilih saat input nilai) + public function getSiswa(Request $request) + { + // Opsional: Bisa difilter berdasarkan kelas guru tersebut + $siswas = Siswa::orderBy('nama', 'asc')->get(); + return response()->json(['success' => true, 'data' => $siswas]); + } + + // Input Anekdot + public function storeAnekdot(Request $request) + { + $validator = Validator::make($request->all(), [ + 'siswa_id' => 'required', + 'tanggal' => 'required|date', + 'kejadian_teramati' => 'required', + 'analisis_capaian' => 'required', + ]); + + if ($validator->fails()) return response()->json($validator->errors(), 400); + + Anekdot::create($request->all()); + return response()->json(['success' => true, 'message' => 'Anekdot berhasil disimpan']); + } + + // Input Hasil Karya (Upload Foto) + public function storeKarya(Request $request) + { + $validator = Validator::make($request->all(), [ + 'siswa_id' => 'required', + 'tanggal' => 'required|date', + 'foto' => 'required|image', + 'analisis_capaian' => 'required', + ]); + + if ($validator->fails()) return response()->json($validator->errors(), 400); + + // Simpan foto ke folder public/storage/karya + $path = $request->file('foto')->store('karya', 'public'); + + HasilKarya::create([ + 'siswa_id' => $request->siswa_id, + 'tanggal' => $request->tanggal, + 'foto' => $path, + 'deskripsi_foto' => $request->deskripsi_foto, + 'analisis_capaian' => $request->analisis_capaian, + ]); + + return response()->json(['success' => true, 'message' => 'Karya berhasil disimpan']); + } + + // Scan QR Code (Input Penjemputan) + public function storePenjemputan(Request $request) + { + $validator = Validator::make($request->all(), [ + 'siswa_id' => 'required', // Didapat dari hasil Scan QR + 'nama_penjemput' => 'required', + 'status_hubungan' => 'required', + 'foto' => 'nullable|image', + ]); + + if ($validator->fails()) return response()->json($validator->errors(), 400); + + $pathFoto = null; + if ($request->hasFile('foto')) { + $pathFoto = $request->file('foto')->store('penjemputan', 'public'); + } + + Penjemputan::create([ + 'siswa_id' => $request->siswa_id, + 'nama_penjemput' => $request->nama_penjemput, + 'status_hubungan' => $request->status_hubungan, + 'foto_bukti' => $pathFoto, + 'waktu_jemput' => now(), + ]); + + return response()->json(['success' => true, 'message' => 'Data penjemputan tercatat']); + } + + // ========================================== + // 3. FITUR KHUSUS WALI MURID đŸ‘Ē + // ========================================== + + // Ambil Data Anak Saya (Berdasarkan Login Wali) + public function getAnakSaya(Request $request) + { + $user = Auth::user(); + // Asumsi: Di tabel siswas ada kolom 'user_id' yang nyambung ke Wali + // Atau tabel users punya relasi ke siswa. + // Kita pakai cara paling umum: Cari siswa yang wali_id nya = ID User login + + // Cek dulu apakah di tabel siswa ada kolom wali_id atau user_id? + // Kalau belum ada relasi, kita ambil dummy dulu atau cari berdasarkan nama (sementara) + // SEMENTARA: Kita ambil 1 siswa pertama sebagai contoh (Nanti kita perbaiki relasinya) + $anak = Siswa::first(); + + return response()->json(['success' => true, 'data' => $anak]); + } + + // Lihat Rapot Anak Saya + public function getRapotAnak(Request $request) + { + // Ambil ID siswa dari request (dikirim dari HP) + $siswa_id = $request->siswa_id; + + $anekdots = Anekdot::where('siswa_id', $siswa_id)->orderBy('tanggal', 'desc')->get(); + $karyas = HasilKarya::where('siswa_id', $siswa_id)->orderBy('tanggal', 'desc')->get(); + // $ceklis = ... (Menyusul) + + return response()->json([ + 'success' => true, + 'data' => [ + 'anekdots' => $anekdots, + 'karyas' => $karyas, + ] + ]); + } +} \ No newline at end of file diff --git a/app/Models/Anekdot.php b/app/Models/Anekdot.php new file mode 100644 index 0000000..a75e511 --- /dev/null +++ b/app/Models/Anekdot.php @@ -0,0 +1,10 @@ +belongsTo(Siswa::class, 'siswa_id'); + } +} \ No newline at end of file diff --git a/app/Models/Rapot.php b/app/Models/Rapot.php new file mode 100644 index 0000000..a8c6006 --- /dev/null +++ b/app/Models/Rapot.php @@ -0,0 +1,20 @@ +belongsTo(Siswa::class); + } +} \ No newline at end of file diff --git a/app/Models/Siswa.php b/app/Models/Siswa.php index 7592429..398c1ee 100644 --- a/app/Models/Siswa.php +++ b/app/Models/Siswa.php @@ -9,22 +9,12 @@ class Siswa extends Model { use HasFactory; - protected $table = 'siswas'; // Nama tabel di database + // Pastikan guarded kosong biar semua kolom bisa diisi + protected $guarded = []; - protected $fillable = [ - 'wali_id', // Kunci Relasi ke Wali Murid - 'nama_siswa', - 'tempat_lahir', - 'tanggal_lahir', - 'jenis_kelamin', // L atau P - 'tanggal_masuk', // Opsional - ]; - - /** - * Relasi: Setiap Siswa PASTI punya satu Wali Murid - */ - public function wali() + // Relasi ke Wali Murid + public function wali_murid() { - return $this->belongsTo(WaliMurid::class, 'wali_id'); + return $this->belongsTo(WaliMurid::class, 'wali_murid_id'); } } \ No newline at end of file diff --git a/composer.json b/composer.json index 3744be4..19c7a43 100644 --- a/composer.json +++ b/composer.json @@ -7,6 +7,7 @@ "license": "MIT", "require": { "php": "^8.2", + "doctrine/dbal": "^4.4", "laravel/framework": "^12.0", "laravel/sanctum": "^4.0", "laravel/tinker": "^2.10.1", diff --git a/composer.lock b/composer.lock index 31f3bbb..89966c6 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "6a132692d59b1da692d29cf98af23f55", + "content-hash": "2a5bf23f8b08ec6fff703c477ba59a68", "packages": [ { "name": "brick/math", @@ -210,6 +210,160 @@ }, "time": "2024-07-08T12:26:09+00:00" }, + { + "name": "doctrine/dbal", + "version": "4.4.1", + "source": { + "type": "git", + "url": "https://github.com/doctrine/dbal.git", + "reference": "3d544473fb93f5c25b483ea4f4ce99f8c4d9d44c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/dbal/zipball/3d544473fb93f5c25b483ea4f4ce99f8c4d9d44c", + "reference": "3d544473fb93f5c25b483ea4f4ce99f8c4d9d44c", + "shasum": "" + }, + "require": { + "doctrine/deprecations": "^1.1.5", + "php": "^8.2", + "psr/cache": "^1|^2|^3", + "psr/log": "^1|^2|^3" + }, + "require-dev": { + "doctrine/coding-standard": "14.0.0", + "fig/log-test": "^1", + "jetbrains/phpstorm-stubs": "2023.2", + "phpstan/phpstan": "2.1.30", + "phpstan/phpstan-phpunit": "2.0.7", + "phpstan/phpstan-strict-rules": "^2", + "phpunit/phpunit": "11.5.23", + "slevomat/coding-standard": "8.24.0", + "squizlabs/php_codesniffer": "4.0.0", + "symfony/cache": "^6.3.8|^7.0|^8.0", + "symfony/console": "^5.4|^6.3|^7.0|^8.0" + }, + "suggest": { + "symfony/console": "For helpful console commands such as SQL execution and import of files." + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\DBAL\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + } + ], + "description": "Powerful PHP database abstraction layer (DBAL) with many features for database schema introspection and management.", + "homepage": "https://www.doctrine-project.org/projects/dbal.html", + "keywords": [ + "abstraction", + "database", + "db2", + "dbal", + "mariadb", + "mssql", + "mysql", + "oci8", + "oracle", + "pdo", + "pgsql", + "postgresql", + "queryobject", + "sasql", + "sql", + "sqlite", + "sqlserver", + "sqlsrv" + ], + "support": { + "issues": "https://github.com/doctrine/dbal/issues", + "source": "https://github.com/doctrine/dbal/tree/4.4.1" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fdbal", + "type": "tidelift" + } + ], + "time": "2025-12-04T10:11:03+00:00" + }, + { + "name": "doctrine/deprecations", + "version": "1.1.6", + "source": { + "type": "git", + "url": "https://github.com/doctrine/deprecations.git", + "reference": "d4fe3e6fd9bb9e72557a19674f44d8ac7db4c6ca" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/deprecations/zipball/d4fe3e6fd9bb9e72557a19674f44d8ac7db4c6ca", + "reference": "d4fe3e6fd9bb9e72557a19674f44d8ac7db4c6ca", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "conflict": { + "phpunit/phpunit": "<=7.5 || >=14" + }, + "require-dev": { + "doctrine/coding-standard": "^9 || ^12 || ^14", + "phpstan/phpstan": "1.4.10 || 2.1.30", + "phpstan/phpstan-phpunit": "^1.0 || ^2", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.6 || ^10.5 || ^11.5 || ^12.4 || ^13.0", + "psr/log": "^1 || ^2 || ^3" + }, + "suggest": { + "psr/log": "Allows logging deprecations via PSR-3 logger implementation" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Deprecations\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A small layer on top of trigger_error(E_USER_DEPRECATED) or PSR-3 logging with options to disable all deprecations or selectively for packages.", + "homepage": "https://www.doctrine-project.org/", + "support": { + "issues": "https://github.com/doctrine/deprecations/issues", + "source": "https://github.com/doctrine/deprecations/tree/1.1.6" + }, + "time": "2026-02-07T07:09:04+00:00" + }, { "name": "doctrine/inflector", "version": "2.1.0", @@ -2800,6 +2954,55 @@ ], "time": "2025-08-21T11:53:16+00:00" }, + { + "name": "psr/cache", + "version": "3.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/cache.git", + "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/cache/zipball/aa5030cfa5405eccfdcb1083ce040c2cb8d253bf", + "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf", + "shasum": "" + }, + "require": { + "php": ">=8.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Cache\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for caching libraries", + "keywords": [ + "cache", + "psr", + "psr-6" + ], + "support": { + "source": "https://github.com/php-fig/cache/tree/3.0.0" + }, + "time": "2021-02-03T23:26:27+00:00" + }, { "name": "psr/clock", "version": "1.0.0", diff --git a/database/migrations/2024_01_01_000000_create_siswas_table_create_siswas_table.php b/database/migrations/2024_01_01_000000_create_siswas_table_create_siswas_table.php new file mode 100644 index 0000000..c57d100 --- /dev/null +++ b/database/migrations/2024_01_01_000000_create_siswas_table_create_siswas_table.php @@ -0,0 +1,32 @@ +id(); + $table->string('nis')->nullable(); + $table->string('nama'); + $table->enum('jenis_kelamin', ['L', 'P'])->nullable(); + $table->date('tanggal_lahir')->nullable(); + + // INI YANG TADI HILANG: + $table->text('alamat')->nullable(); + + $table->string('nama_wali')->nullable(); + $table->string('no_hp_wali')->nullable(); + $table->foreignId('kelompok_id')->default(1); + $table->timestamps(); + }); + } + + public function down() + { + Schema::dropIfExists('siswas'); + } +}; \ No newline at end of file diff --git a/database/migrations/2025_09_17_040000_create_siswas_table.php b/database/migrations/2025_09_17_040000_create_siswas_table.php deleted file mode 100644 index f2c958f..0000000 --- a/database/migrations/2025_09_17_040000_create_siswas_table.php +++ /dev/null @@ -1,29 +0,0 @@ -id(); - $table->foreignId('wali_id')->constrained('wali_murids')->onDelete('cascade'); - - $table->string('nama_siswa'); // Sesuai PDF "Nama Anak" - $table->string('tempat_lahir'); // Sesuai PDF "Tempat" - $table->date('tanggal_lahir'); // Sesuai PDF "Tgl Lahir" - $table->enum('jenis_kelamin', ['L', 'P']); - $table->date('tanggal_masuk')->nullable(); - - $table->timestamps(); - }); - } - - public function down() - { - Schema::dropIfExists('siswas'); - } -}; \ No newline at end of file diff --git a/database/migrations/2025_10_03_102330_create_perkembangans_table.php b/database/migrations/2025_10_03_102330_create_perkembangans_table.php deleted file mode 100644 index 834c5fc..0000000 --- a/database/migrations/2025_10_03_102330_create_perkembangans_table.php +++ /dev/null @@ -1,36 +0,0 @@ -id(); - $table->unsignedBigInteger('siswa_id'); - $table->unsignedBigInteger('guru_id'); - $table->date('tanggal'); - $table->string('aspek'); // contoh: Motorik, Bahasa, Sosial - $table->text('deskripsi'); - $table->string('foto')->nullable(); - $table->timestamps(); - - $table->foreign('siswa_id')->references('id')->on('siswas')->onDelete('cascade'); - $table->foreign('guru_id')->references('id')->on('users')->onDelete('cascade'); - }); -} - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::dropIfExists('perkembangans'); - } -}; diff --git a/database/migrations/2026_02_08_135651_create_anekdots_table.php b/database/migrations/2026_02_08_135651_create_anekdots_table.php new file mode 100644 index 0000000..09d3237 --- /dev/null +++ b/database/migrations/2026_02_08_135651_create_anekdots_table.php @@ -0,0 +1,35 @@ +id(); + $table->foreignId('siswa_id')->constrained('siswas')->onDelete('cascade'); // Relasi ke Siswa + $table->foreignId('guru_id')->constrained('users')->onDelete('cascade'); // Relasi ke Guru + $table->date('tanggal'); + $table->text('kejadian_teramati'); + $table->text('analisis_capaian')->nullable(); + $table->string('foto')->nullable(); // Path foto + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('anekdots'); + } + + +}; diff --git a/database/migrations/2026_02_08_135823_create_hasil_karyas_table.php b/database/migrations/2026_02_08_135823_create_hasil_karyas_table.php new file mode 100644 index 0000000..5273a29 --- /dev/null +++ b/database/migrations/2026_02_08_135823_create_hasil_karyas_table.php @@ -0,0 +1,33 @@ +id(); + $table->foreignId('siswa_id')->constrained('siswas')->onDelete('cascade'); + $table->foreignId('guru_id')->constrained('users')->onDelete('cascade'); + $table->date('tanggal'); + $table->string('foto'); + $table->text('deskripsi_foto')->nullable(); + $table->text('analisis_capaian')->nullable(); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('hasil_karyas'); + } +}; diff --git a/database/migrations/2026_02_08_135837_create_indikators_table.php b/database/migrations/2026_02_08_135837_create_indikators_table.php new file mode 100644 index 0000000..3377731 --- /dev/null +++ b/database/migrations/2026_02_08_135837_create_indikators_table.php @@ -0,0 +1,28 @@ +id(); + $table->string('kelompok_usia')->default('4-5 Tahun'); + $table->text('nama_indikator'); // Contoh: "Anak dapat menirukan surat Al-Ikhlas" + $table->timestamps(); + }); + } + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('indikators'); + } +}; diff --git a/database/migrations/2026_02_08_135848_create_penilaian_ceklis_table.php b/database/migrations/2026_02_08_135848_create_penilaian_ceklis_table.php new file mode 100644 index 0000000..bde540a --- /dev/null +++ b/database/migrations/2026_02_08_135848_create_penilaian_ceklis_table.php @@ -0,0 +1,33 @@ +id(); + $table->foreignId('siswa_id')->constrained('siswas')->onDelete('cascade'); + $table->foreignId('guru_id')->constrained('users')->onDelete('cascade'); + $table->foreignId('indikator_id')->constrained('indikators')->onDelete('cascade'); + $table->date('tanggal'); + $table->enum('hasil', ['BSB', 'BSH', 'MB', 'BB']); // Skala Penilaian + $table->text('keterangan')->nullable(); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('penilaian_ceklis'); + } +}; diff --git a/database/migrations/2026_02_08_155458_create_penjemputans_table.php b/database/migrations/2026_02_08_155458_create_penjemputans_table.php new file mode 100644 index 0000000..1744d01 --- /dev/null +++ b/database/migrations/2026_02_08_155458_create_penjemputans_table.php @@ -0,0 +1,35 @@ +id(); + // Relasi ke tabel siswa + $table->foreignId('siswa_id')->constrained('siswas')->onDelete('cascade'); + + $table->string('nama_penjemput')->nullable(); + $table->string('status_hubungan')->nullable(); + $table->string('foto_bukti')->nullable(); // Kita buat boleh kosong (nullable) + $table->timestamp('waktu_jemput')->useCurrent(); + + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('penjemputans'); + } +}; \ No newline at end of file diff --git a/database/migrations/2026_02_08_184147_change_jenis_guru_column_in_guru_table.php b/database/migrations/2026_02_08_184147_change_jenis_guru_column_in_guru_table.php new file mode 100644 index 0000000..958e743 --- /dev/null +++ b/database/migrations/2026_02_08_184147_change_jenis_guru_column_in_guru_table.php @@ -0,0 +1,25 @@ +string('jenis_guru', 50)->change(); + }); + } + + public function down() + { + Schema::table('guru', function (Blueprint $table) { + // (Opsional) Kembalikan ke pendek kalau di-rollback + $table->string('jenis_guru', 20)->change(); + }); + } +}; \ No newline at end of file diff --git a/database/migrations/2026_02_08_203908_create_rapots_table.php b/database/migrations/2026_02_08_203908_create_rapots_table.php new file mode 100644 index 0000000..112c621 --- /dev/null +++ b/database/migrations/2026_02_08_203908_create_rapots_table.php @@ -0,0 +1,64 @@ +id(); + $table->foreignId('siswa_id')->constrained('siswas')->onDelete('cascade'); + + // Info Dasar + $table->string('semester', 50); + $table->string('tahun_ajaran', 20); + $table->date('tanggal_rapot'); + + // --- ISI RAPOT SESUAI PDF --- + + // A. AIK (Al Islam, Ke'aisyiyahan & Kemuhammadiyahan) + $table->text('narasi_aik')->nullable(); + + // B. Nilai Agama & Budi Pekerti + $table->text('narasi_nilai_agama')->nullable(); + + // C. Jati Diri + $table->text('narasi_jati_diri')->nullable(); + + // D. Dasar Literasi, Matematika, Sains, Teknologi, Rekayasa, Seni + $table->text('narasi_literasi')->nullable(); + + // E. Kokurikuler (Pengganti P5) + $table->text('narasi_kokurikuler')->nullable(); + + // --- DATA FISIK --- + $table->string('tinggi_badan')->nullable(); + $table->string('berat_badan')->nullable(); + $table->string('lingkar_kepala')->nullable(); + $table->string('lingkar_lengan')->nullable(); + + // --- KEHADIRAN --- + $table->integer('sakit')->default(0); + $table->integer('izin')->default(0); + $table->integer('alpha')->default(0); + + // --- REFLEKSI --- + $table->text('refleksi_orang_tua')->nullable(); + + // --- TANDA TANGAN --- + $table->string('nama_guru')->nullable(); // Guru Kelas + $table->string('nama_kepala_sekolah')->nullable(); // Kepala Sekolah / Pengelola + $table->string('nbm_kepala_sekolah')->nullable(); // NBM Kepala Sekolah (Opsional) + + $table->timestamps(); + }); + } + + public function down() + { + Schema::dropIfExists('rapots'); + } +}; \ No newline at end of file diff --git a/database/seeders/IndikatorSeeder.php b/database/seeders/IndikatorSeeder.php new file mode 100644 index 0000000..f46bd0b --- /dev/null +++ b/database/seeders/IndikatorSeeder.php @@ -0,0 +1,26 @@ + 'Anak disiplin mengikuti upacara'], + ['nama_indikator' => 'Anak dapat menyebutkan 3 benda ciptaan Allah dan buatan manusia'], + ['nama_indikator' => 'Anak dapat menirukan surat Al-Ikhlas'], + ['nama_indikator' => 'Anak dapat mengenal simbol Pemuda Muhammadiyah'], + ['nama_indikator' => 'Anak dapat mengikuti Gerakan senam irama'], + ['nama_indikator' => 'Anak memiliki kemampuan motorik halus menyusun dan menggunting'], + ['nama_indikator' => 'Anak mampu memecahkan masalah sederhana saat bermain'], + ['nama_indikator' => 'Anak memiliki sikap tanggung jawab'], + ['nama_indikator' => 'Anak dapat mengetahui cara merawat lingkungan sekitar'], + ]; + + DB::table('indikators')->insert($indikators); + } +} \ No newline at end of file diff --git a/database/seeders/SiswaSeeder.php b/database/seeders/SiswaSeeder.php index ebb7559..14397b8 100644 --- a/database/seeders/SiswaSeeder.php +++ b/database/seeders/SiswaSeeder.php @@ -3,41 +3,56 @@ namespace Database\Seeders; use Illuminate\Database\Seeder; -use App\Models\Siswa; -use App\Models\WaliMurid; +use Illuminate\Support\Facades\DB; class SiswaSeeder extends Seeder { public function run() { - // Format: [Nama Anak, Nama Orang Tua, Tempat Lahir, Tgl Lahir (YYYY-MM-DD), JK] - $data_siswa = [ - ['Achazia Nakhi Shankara', 'Tomi Puspita Aji', 'Kota Madiun', '2021-03-30', 'L'], - ['Zayn Risky Putra Setyawan', 'Yonna Setyawan', 'Kota Madiun', '2020-04-07', 'L'], - ['Zain Mizyal Alkhalifi Luis', 'Taufiq Rahman Luis', 'Kota Madiun', '2022-02-27', 'L'], - ['Yafiq Hasan Besari', 'Andika Bayu', 'Berau', '2020-02-19', 'L'], - ['Azia Nurafni Shidqia', 'Masita Sari', 'Madiun', '2019-01-14', 'P'], - ['Zhafir Reza Arifa Putra', 'Ayu Trisnawati', 'Madiun', '2019-05-05', 'L'], - ['Alliemsa Azka Ayyub Anggoro', 'Alliemsa Anggi Putra', 'Madiun', '2018-07-20', 'L'], - ['Samudra Zikru Al Fakih', 'Renny Wulandari', 'Malang', '2018-01-24', 'L'], - // Data tambahan jika ada di PDF tapi terpotong, disesuaikan dengan data wali yg ada - ['Arsyad', 'Miftakhul Jannah', 'Madiun', '2020-05-10', 'L'], - ['Almeera', 'Ika Septina', 'Madiun', '2020-08-15', 'P'], + // Data diambil dari CSV yang kamu kirim (Sample 5 Siswa dulu biar cepat) + $siswas = [ + [ + 'nama' => 'Abdila Kaivan Baihaqi Alzafa', + 'nis' => '2024247', + 'jenis_kelamin' => 'L', + 'tanggal_lahir' => '2018-03-10', + 'alamat' => 'Cempaka Munggut RT. 5 RW. 2 Kec. Wungu', + 'kelompok_id' => 1 + ], + [ + 'nama' => 'Hanifah Syafi\'a', // Pakai backslash (\) sebelum tanda petik satu + 'nis' => '2024268', + 'jenis_kelamin' => 'P', + 'tanggal_lahir' => '2019-05-12', + 'alamat' => 'Madiun', + 'kelompok_id' => 1 + ], + [ + 'nama' => 'Abrizam Rafka Danindra', + 'nis' => '2024271', + 'jenis_kelamin' => 'L', + 'tanggal_lahir' => '2019-07-15', + 'alamat' => 'Perum Gajahmada Regency Blok A 10 Kota Madiun', + 'kelompok_id' => 1 + ], + [ + 'nama' => 'Achazia Nakhi Shankara', + 'nis' => '222285', + 'jenis_kelamin' => 'L', + 'tanggal_lahir' => '2021-03-30', + 'alamat' => 'Jl. Ciliwung No. 22 Kota Madiun', + 'kelompok_id' => 1 + ], + [ + 'nama' => 'Ahmad Farzan Wisanggeni', + 'nis' => '2023233', + 'jenis_kelamin' => 'L', + 'tanggal_lahir' => '2019-01-10', + 'alamat' => 'Plumpung Lor RT. 8 Rw. 1 Wonoasri Kab. Madiun', + 'kelompok_id' => 1 + ], ]; - foreach ($data_siswa as $ds) { - // Cari ID Wali berdasarkan Nama Orang Tua - $wali = WaliMurid::where('nama_wali', 'LIKE', '%' . $ds[1] . '%')->first(); - - if ($wali) { - Siswa::create([ - 'wali_id' => $wali->id, - 'nama_siswa' => $ds[0], - 'tempat_lahir' => $ds[2], - 'tanggal_lahir' => $ds[3], - 'jenis_kelamin' => $ds[4], - ]); - } - } + DB::table('siswas')->insert($siswas); } } \ No newline at end of file diff --git a/database/seeders/UserSeeder.php b/database/seeders/UserSeeder.php new file mode 100644 index 0000000..7f9e7e9 --- /dev/null +++ b/database/seeders/UserSeeder.php @@ -0,0 +1,25 @@ + 'Tri Marya Endarwati', 'email' => 'admin@paud.com', 'password' => Hash::make('12345678'), 'role' => 'admin', 'no_hp' => '087753218133'], + ['name' => 'Tutuk Setyaningtyas', 'email' => 'tutuk@paud.com', 'password' => Hash::make('12345678'), 'role' => 'guru', 'no_hp' => '087753897197'], + ['name' => 'Ike Eria Widyaninggar', 'email' => 'ike@paud.com', 'password' => Hash::make('12345678'), 'role' => 'guru', 'no_hp' => '085235370175'], + ['name' => 'Fitriyah Wahidah', 'email' => 'fitriyah@paud.com', 'password' => Hash::make('12345678'), 'role' => 'guru', 'no_hp' => '081233460803'], + ['name' => 'Dwi Lestari', 'email' => 'dwi@paud.com', 'password' => Hash::make('12345678'), 'role' => 'guru', 'no_hp' => '085736369584'], + // ... (Sebenarnya ada 40, tapi saya masukkan 5 inti dulu biar tidak kepanjangan) + ]; + + DB::table('users')->insert($users); + } +} \ No newline at end of file diff --git a/resources/views/admin/guru/edit.blade.php b/resources/views/admin/guru/edit.blade.php index 086ba26..725955d 100644 --- a/resources/views/admin/guru/edit.blade.php +++ b/resources/views/admin/guru/edit.blade.php @@ -1,56 +1,77 @@ @extends('layouts.app') @section('content') -
-

âœī¸ Edit Guru

+
+
+

âœī¸ Edit Data Guru

+ ← Kembali +
+ + {{-- Cek Error --}} + @if ($errors->any()) + + @endif
- @csrf - @method('PUT') + @csrf + @method('PUT') - -
- - -
+
+ + {{-- Ambil langsung dari tabel guru kolom nama_guru --}} + +
+ +
+ + +
- -
- - +
+ + +
+ +
+ +
- - -
- - -
- - -
- - -
- - -
- - Batal - - -
- + +
+ +
+
-@endsection +@endsection \ No newline at end of file diff --git a/resources/views/admin/penjemputan/index.blade.php b/resources/views/admin/penjemputan/index.blade.php index 541a657..303d3c0 100644 --- a/resources/views/admin/penjemputan/index.blade.php +++ b/resources/views/admin/penjemputan/index.blade.php @@ -1,42 +1,85 @@ @extends('layouts.app') @section('content') -
-
+
+ +
-

🚸 Monitoring Penjemputan

-

Data masuk secara real-time dari aplikasi mobile.

+

đŸ›ĩ Log Penjemputan

+

Daftar riwayat penjemputan siswa (Real-time).

+
+ +
+
+ Hari Ini: {{ $logs->where('waktu_jemput', '>=', now()->today())->count() }} +
-
- - - - - - - - - - - - {{-- Data ini nanti otomatis muncul saat Wali klik jemput di HP --}} - @forelse ($logs as $log) - - - - - - - - @empty - - - - @endforelse - -
WaktuNama SiswaPenjemputHubunganStatus
{{ \Carbon\Carbon::parse($log->waktu_jemput)->format('H:i') }}{{ $log->siswa->nama_siswa }}{{ $log->nama_penjemput }}{{ $log->hubungan }}✔ Selesai
Belum ada aktifitas penjemputan hari ini.
+
+
+ + + + + + + + + + + + @forelse($logs as $log) + + + + + + + + + + + + @empty + + + + @endforelse + +
Waktu JemputNama SiswaNama PenjemputStatus HubunganAksi
+
+ {{ \Carbon\Carbon::parse($log->waktu_jemput)->format('H:i') }} WIB +
+
+ {{ \Carbon\Carbon::parse($log->waktu_jemput)->format('d M Y') }} +
+
+
{{ $log->siswa->nama ?? 'Siswa Terhapus' }}
+
NIS: {{ $log->siswa->nis ?? '-' }}
+
+ {{ $log->nama_penjemput }} + + + {{ $log->status_hubungan }} + + +
+ @csrf + @method('DELETE') + +
+
+
+ +

Belum ada data penjemputan hari ini.

+
+
+
@endsection \ No newline at end of file diff --git a/resources/views/admin/perkembangan/index.blade.php b/resources/views/admin/perkembangan/index.blade.php index 52231a3..6b6c58c 100644 --- a/resources/views/admin/perkembangan/index.blade.php +++ b/resources/views/admin/perkembangan/index.blade.php @@ -1,41 +1,70 @@ @extends('layouts.app') @section('content') -
-

📊 Laporan Perkembangan Anak

+
+
+
+

📈 Laporan Perkembangan

+

Pilih siswa untuk melihat Catatan Anekdot, Hasil Karya, dan Ceklis.

+
+
+ Total Siswa: {{ $siswas->count() }} +
+
- - - - - - - - - - - - - - @forelse($perkembangans as $i => $item) - - - - - - - - - - @empty - - @endforelse - -
NoNama AnakGuruTanggalAspekDeskripsiAksi
{{ $i+1 }}{{ $item->siswa->nama ?? '-' }}{{ $item->guru->nama_guru ?? '-' }}{{ $item->tanggal }}{{ $item->aspek }}{{ Str::limit($item->deskripsi, 40) }} - Lihat | - Cetak -
Belum ada data perkembangan
+
+ + + + + + + + + + + + @forelse($siswas as $index => $siswa) + + + + + + + + + + + + @empty + + + + @endforelse + +
NoNISNama SiswaKelompokAksi
{{ $index + 1 }} + + {{ $siswa->nis ?? '-' }} + + + {{ $siswa->nama_siswa }} + + {{ $siswa->kelompok_id ?? '-' }} + + {{-- PERBAIKAN: Hapus 'admin.' jadi 'perkembangan.show' --}} + + 📂 Buka Rapot + +
+
+ 📭 +

Belum ada data siswa.

+
+
+
+ +
+ © {{ date('Y') }} PAUD Aisyiyah Monitoring System +
-@endsection +@endsection \ No newline at end of file diff --git a/resources/views/admin/perkembangan/show.blade.php b/resources/views/admin/perkembangan/show.blade.php new file mode 100644 index 0000000..0a2cb7c --- /dev/null +++ b/resources/views/admin/perkembangan/show.blade.php @@ -0,0 +1,104 @@ +@extends('layouts.app') + +@section('content') +
+ +
+
+

{{ $siswa->nama_siswa }}

+

NIS: {{ $siswa->nis }} | NISN: {{ $siswa->nisn ?? '-' }}

+

TTL: {{ $siswa->tempat_lahir }}, {{ \Carbon\Carbon::parse($siswa->tanggal_lahir)->translatedFormat('d F Y') }}

+
+
+ ← Kembali ke Daftar + Siswa Aktif +
+
+ + + +
+
+

+ 🎓 Riwayat Rapot Semester +

+ + ➕ Buat Rapot Baru + +
+ +
+ + + + + + + + + + + + @forelse($rapots as $rapot) + + + + + + + + @empty + + + + @endforelse + +
Tahun AjaranSemesterTanggal RapotStatus P5Aksi
{{ $rapot->tahun_ajaran }} + + Semester {{ $rapot->semester }} + + + {{ \Carbon\Carbon::parse($rapot->tanggal_rapot)->translatedFormat('d F Y') }} + + @if($rapot->p5_tema) + ✅ Ada Projek + @else + - + @endif + + + đŸ‘ī¸ Lihat + + + đŸ–¨ī¸ PDF + +
+
+ 📄 +

Belum ada rapot yang dibuat untuk siswa ini.

+

Klik tombol "Buat Rapot Baru" di pojok kanan atas.

+
+
+
+
+ +
+@endsection \ No newline at end of file diff --git a/resources/views/admin/rapot/create.blade.php b/resources/views/admin/rapot/create.blade.php new file mode 100644 index 0000000..dea1530 --- /dev/null +++ b/resources/views/admin/rapot/create.blade.php @@ -0,0 +1,105 @@ +@extends('layouts.app') + +@section('content') +
+

📝 Input Rapot (Format Baru)

+ +
+ @csrf + +
+
+ + +
+
+ + +
+
+ + +
+
+ +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ +
+
+

Pertumbuhan Fisik

+ + + + +
+
+

Kehadiran (Hari)

+ + + +
+
+ +
+
+ + +
+ +
+
+ + + +
+
+ + + +

*Pilih nama guru kelas dari daftar.

+
+
+ +
+ +
+ +
+@endsection \ No newline at end of file diff --git a/resources/views/admin/rapot/show.blade.php b/resources/views/admin/rapot/show.blade.php new file mode 100644 index 0000000..08458a2 --- /dev/null +++ b/resources/views/admin/rapot/show.blade.php @@ -0,0 +1,221 @@ +@extends('layouts.app') + +@section('content') +
+
+
+

📄 Preview Rapot

+
+
+ + ← Kembali + + +
+
+ +
+ +
+ +
+

Laporan Perkembangan Anak Didik

+

PAUD 'Aisyiyah Kartoharjo

+

Jln. Ciliwung II No. 22, Kartoharjo, Madiun

+
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + +
Nama Anak:{{ $rapot->siswa->nama_siswa }}Semester:{{ $rapot->semester }}
NIS / NISN:{{ $rapot->siswa->nis }} / {{ $rapot->siswa->nisn ?? '-' }}Tahun Ajaran:{{ $rapot->tahun_ajaran }}
Kelompok:{{ $rapot->siswa->kelompok_id ?? '-' }}
+
+ +
+ +
+

A. PENGEMBANGAN AL ISLAM, KE'AISYIYAHAN DAN KEMUHAMMADIYAHAN (AIK)

+
+ {!! nl2br(e($rapot->narasi_aik ?? '-')) !!} +
+
+ +
+

B. CAPAIAN PEMBELAJARAN NILAI AGAMA DAN BUDI PEKERTI

+
+ {!! nl2br(e($rapot->narasi_nilai_agama ?? '-')) !!} +
+
+ +
+

C. CAPAIAN PEMBELAJARAN JATI DIRI

+
+ {!! nl2br(e($rapot->narasi_jati_diri ?? '-')) !!} +
+
+ +
+

D. CAPAIAN PEMBELAJARAN DASAR-DASAR LITERASI, MATEMATIKA, SAINS, TEKNOLOGI, REKAYASA, SENI

+
+ {!! nl2br(e($rapot->narasi_literasi ?? '-')) !!} +
+
+ +
+

E. KOKURIKULER

+
+ {!! nl2br(e($rapot->narasi_kokurikuler ?? '-')) !!} +
+
+ +
+ +
+ +
+ +
+

Pertumbuhan

+ + + + + + + + + + + + + + + + + + + + + +
AspekHasil
Berat Badan{{ $rapot->berat_badan }}
Tinggi Badan{{ $rapot->tinggi_badan }}
Lingkar Kepala{{ $rapot->lingkar_kepala }}
Lingkar Lengan{{ $rapot->lingkar_lengan }}
+
+ +
+

Kehadiran Anak

+ + + + + + + + + + + + + + + + + +
KeteranganJumlah
Sakit{{ $rapot->sakit }} Hari
Izin{{ $rapot->izin }} Hari
Tanpa Keterangan{{ $rapot->alpha }} Hari
+
+
+ +
+

Refleksi Orang Tua

+
+

{{ $rapot->refleksi_orang_tua ?? '' }}

+
+
+ +
+ +
+

Orang Tua / Wali

+

+
+ +
+

Mengetahui,

+

Pengelola

+

PAUD 'Aisyiyah Kartoharjo

+

{{ $rapot->nama_kepala_sekolah }}

+

NBM. {{ $rapot->nbm_kepala_sekolah }}

+
+ +
+

Madiun, {{ \Carbon\Carbon::parse($rapot->tanggal_rapot)->translatedFormat('d F Y') }}

+

Guru Kelas

+ +

+ {{ $rapot->nama_guru }} +

+
+ +
+ +
+ +{{-- CSS KHUSUS UNTUK PRINT & TAMPILAN KERTAS --}} + +@endsection \ No newline at end of file diff --git a/resources/views/admin/siswa/create.blade.php b/resources/views/admin/siswa/create.blade.php index 1f6e5b9..0b8f80b 100644 --- a/resources/views/admin/siswa/create.blade.php +++ b/resources/views/admin/siswa/create.blade.php @@ -1,55 +1,84 @@ @extends('layouts.app') @section('content') -
-

đŸ‘ļ Tambah Siswa

+
+
+

➕ Tambah Siswa Baru

+ ← Kembali +
+ + @if ($errors->any()) +
+
    + @foreach ($errors->all() as $error) +
  • {{ $error }}
  • + @endforeach +
+
+ @endif
@csrf - {{-- Dropdown Pilih Wali Murid --}}
- - + + @foreach($wali_murids as $wali) + @endforeach -

*Jika nama orang tua tidak ada, tambahkan dulu di menu Wali Murid.

-
- -
- - +

*Alamat siswa akan otomatis mengikuti alamat wali murid.

- - + +
- - + +
- -
+ + +
+ +
+
+ + +
+
+ + +
+
+ +
+ +
- +
+ +
@endsection \ No newline at end of file diff --git a/resources/views/admin/siswa/edit.blade.php b/resources/views/admin/siswa/edit.blade.php index d68026a..acdec3e 100644 --- a/resources/views/admin/siswa/edit.blade.php +++ b/resources/views/admin/siswa/edit.blade.php @@ -1,73 +1,88 @@ @extends('layouts.app') @section('content') -
-

âœī¸ Edit Data Peserta Didik

+
+
+

âœī¸ Edit Data Siswa

+ ← Kembali +
-
- @csrf - @method('PUT') - -
- - + @if ($errors->any()) +
+
    + @foreach ($errors->all() as $error) +
  • {{ $error }}
  • + @endforeach +
+
+ @endif + + + @csrf + @method('PUT') + +
+ + +

+ â„šī¸ Jika nama wali murid tidak ditemukan, silakan tambah data baru di menu + Data Wali Murid. +

+
+ +
+
+ +
- -
- - +
+ +
- -
- - +
+ +
+ + +
+ +
+
+ +
- -
- - +
+ +
- -
-
- - -
- -
- - -
+
+ +
+ +
+ +
- -
- - - @if ($siswa->foto) - Foto {{ $siswa->nama }} - @endif -
- -
- Batal - -
- +
+ +
+ +
+
-@endsection +@endsection \ No newline at end of file diff --git a/resources/views/admin/siswa/index.blade.php b/resources/views/admin/siswa/index.blade.php index ce375cb..d371528 100644 --- a/resources/views/admin/siswa/index.blade.php +++ b/resources/views/admin/siswa/index.blade.php @@ -1,61 +1,92 @@ @extends('layouts.app') @section('content') -
-
-

đŸ‘ļ Data Peserta Didik

- + Tambah Siswa +
+
+

đŸ‘ļ Data Peserta Didik

+ + + Tambah Siswa +
@if(session('success')) -
- {{ session('success') }} + @endif - - - - - - - - - - - - - @forelse ($siswas as $i => $siswa) - - - - - - - - - @empty - - - - @endforelse - -
NoNama SiswaL/PTTLOrang Tua (Wali)Aksi
{{ $i + 1 }}{{ $siswa->nama_siswa }} - - {{ $siswa->jenis_kelamin }} - - - {{ $siswa->tempat_lahir }}, {{ \Carbon\Carbon::parse($siswa->tanggal_lahir)->format('d-m-Y') }} - - {{-- Mengambil nama wali dari relasi --}} - {{ $siswa->wali->nama_wali ?? 'âš ī¸ Data Wali Terhapus' }} - - Edit -
- @csrf - @method('DELETE') - -
-
Belum ada data siswa.
+
+ + + + + + + + + + + + + + @forelse($siswas as $index => $siswa) + + + + + + + + + + + + + + + + @empty + + + + @endforelse + +
NoNIS / NISNNama SiswaL/PTTLWali Murid / AlamatAksi
{{ $index + 1 }} +
{{ $siswa->nis ?? '-' }}
+
{{ $siswa->nisn ?? '-' }}
+
{{ $siswa->nama_siswa }} + + {{ $siswa->jenis_kelamin }} + + + {{ $siswa->tempat_lahir }}, {{ date('d-m-Y', strtotime($siswa->tanggal_lahir)) }} + + @if($siswa->wali_murid) +
{{ $siswa->wali_murid->nama_wali }}
+ {{-- Tampilkan Alamat dari Wali Murid --}} +
🏠 {{ Str::limit($siswa->wali_murid->alamat, 30) }}
+ @if(!empty($siswa->wali_murid->no_hp) && $siswa->wali_murid->no_hp != '-') +
📞 {{ $siswa->wali_murid->no_hp }}
+ @endif + @else + âš ī¸ Belum diset + @endif +
+
+ + Edit + +
+ @csrf + @method('DELETE') + +
+
+
+ Belum ada data siswa. +
+
@endsection \ No newline at end of file diff --git a/resources/views/admin/wali/edit.blade.php b/resources/views/admin/wali/edit.blade.php index f036913..517fa01 100644 --- a/resources/views/admin/wali/edit.blade.php +++ b/resources/views/admin/wali/edit.blade.php @@ -1,34 +1,64 @@ @extends('layouts.app') @section('content') -
-

âœī¸ Edit Wali Murid

+
+
+

âœī¸ Edit Wali Murid

+ ← Kembali +
-
+ @if ($errors->any()) + + @endif + + {{-- PERHATIKAN: DI SINI KITA PAKAI $data (BUKAN $wali_murid) --}} + @csrf @method('PUT') - +
- - + + {{-- PERHATIKAN: value="{{ old('nama_wali', $data->nama_wali) }}" --}} +
- - + + +
+ +
+ +
- - + +
-
- - +
+
- -
-@endsection +@endsection \ No newline at end of file diff --git a/resources/views/admin/wali_murid/edit.blade.php b/resources/views/admin/wali_murid/edit.blade.php index 6594ba9..b03e17f 100644 --- a/resources/views/admin/wali_murid/edit.blade.php +++ b/resources/views/admin/wali_murid/edit.blade.php @@ -1,55 +1,64 @@ @extends('layouts.app') @section('content') -
-

âœī¸ Edit Data Wali Murid

+
+
+

âœī¸ Edit Wali Murid

+ ← Kembali +
-
+ @if ($errors->any()) + + @endif + + {{-- KITA PAKAI VARIABEL $data (Sesuai Controller) --}} + @csrf @method('PUT') - - +
- - + +
-
- + + {{-- Gunakan $data->user --}} + value="{{ old('email', $data->user?->email ?? '') }}" + class="w-full border border-gray-300 rounded-lg p-2 focus:ring-2 focus:ring-green-500 focus:outline-none" + placeholder="Email belum didaftarkan">
- - +
- + + value="{{ old('no_hp', $data->no_hp) }}" + class="w-full border border-gray-300 rounded-lg p-2 focus:ring-2 focus:ring-green-500 focus:outline-none">
-
- + + class="w-full border border-gray-300 rounded-lg p-2 focus:ring-2 focus:ring-green-500 focus:outline-none">{{ old('alamat', $data->alamat) }}
-
- - Batal - -
-@endsection +@endsection \ No newline at end of file diff --git a/resources/views/layouts/app.blade.php b/resources/views/layouts/app.blade.php index 6ae888a..57d2b2b 100644 --- a/resources/views/layouts/app.blade.php +++ b/resources/views/layouts/app.blade.php @@ -46,8 +46,8 @@ class="block p-2 hover:bg-green-700 rounded">
- - Penjemputan + + Penjemputan diff --git a/routes/web.php b/routes/web.php index 6b98f76..c7b62f2 100644 --- a/routes/web.php +++ b/routes/web.php @@ -9,6 +9,7 @@ use App\Http\Controllers\Admin\PengumumanController; use App\Http\Controllers\Admin\PerkembanganController; use App\Http\Controllers\Admin\AkunController; +use App\Http\Controllers\Admin\PenjemputanController; // Login routes Route::get('/login', [AuthController::class, 'showLogin'])->name('login'); @@ -32,13 +33,39 @@ Route::resource('wali-murid', WaliMuridController::class); Route::resource('siswa', SiswaController::class); - Route::get('/perkembangan', [PerkembanganController::class, 'index'])->name('admin.perkembangan.index'); - Route::get('/perkembangan/{id}', [PerkembanganController::class, 'show'])->name('admin.perkembangan.show'); - Route::get('/perkembangan/{id}/print', [PerkembanganController::class, 'print'])->name('admin.perkembangan.print'); - + // --- BAGIAN PERKEMBANGAN (YANG KITA PERBAIKI) --- + // 1. Halaman Index (Daftar Siswa) + Route::get('/perkembangan', [PerkembanganController::class, 'index']) + ->name('admin.perkembangan.index'); + + // 2. Halaman Detail Rapot (Show) -> Nama rute: 'perkembangan.show' + Route::get('/perkembangan/{id}', [PerkembanganController::class, 'show']) + ->name('perkembangan.show'); + + // 3. Halaman Cetak (Print) -> Nama rute: 'perkembangan.print' + Route::get('/perkembangan/{id}/print', [PerkembanganController::class, 'print']) + ->name('perkembangan.print'); + // ---------------------------------------- + // Akun Route::resource('akun', AkunController::class); Route::post('akun/{akun}/reset-password', [AkunController::class, 'resetPassword'])->name('akun.resetPassword'); + + Route::get('/penjemputan', [PenjemputanController::class, 'index'])->name('penjemputan.index'); + Route::delete('/penjemputan/{id}', [PenjemputanController::class, 'destroy'])->name('penjemputan.destroy'); + + // === ROUTE RAPOT === + // Form Input Rapot Baru + Route::get('/siswa/{id}/rapot/create', [App\Http\Controllers\Admin\RapotController::class, 'create'])->name('rapot.create'); + + // Simpan Data Rapot + Route::post('/siswa/{id}/rapot', [App\Http\Controllers\Admin\RapotController::class, 'store'])->name('rapot.store'); + + // Lihat Detail/Cetak Rapot + Route::get('/rapot/{id}', [App\Http\Controllers\Admin\RapotController::class, 'show'])->name('rapot.show'); + + // Cetak PDF (Nanti) + Route::get('/rapot/{id}/print', [App\Http\Controllers\Admin\RapotController::class, 'print'])->name('rapot.print'); }); }); \ No newline at end of file