diff --git a/WhatsApp Image 2026-02-04 at 19.00.08 (1).jpeg b/WhatsApp Image 2026-02-04 at 19.00.08 (1).jpeg new file mode 100644 index 0000000..427d727 Binary files /dev/null and b/WhatsApp Image 2026-02-04 at 19.00.08 (1).jpeg differ diff --git a/WhatsApp Image 2026-02-04 at 19.00.08.jpeg b/WhatsApp Image 2026-02-04 at 19.00.08.jpeg new file mode 100644 index 0000000..470a1c0 Binary files /dev/null and b/WhatsApp Image 2026-02-04 at 19.00.08.jpeg differ diff --git a/app/Http/Controllers/Admin/GuruController.php b/app/Http/Controllers/Admin/GuruController.php index 85263fe..3e323b0 100644 --- a/app/Http/Controllers/Admin/GuruController.php +++ b/app/Http/Controllers/Admin/GuruController.php @@ -10,8 +10,8 @@ class GuruController extends Controller { public function index() { - $gurus = Guru::orderBy('created_at', 'desc')->get(); - return view('admin.guru.index', compact('gurus')); + $gurus = Guru::orderBy('created_at', 'desc')->get(); + return view('admin.guru.index', compact('gurus')); } public function create() @@ -21,11 +21,12 @@ public function create() public function store(Request $request) { + // Validasi disesuaikan dengan kolom database $request->validate([ - 'nama_guru' => 'required|string|max:100', - 'email' => 'nullable|email|max:100', - 'no_hp' => 'nullable|string|max:20', - 'bidang' => 'nullable|string|max:100', + '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', // UBAH 'bidang' JADI 'jenis_guru' ]); Guru::create($request->all()); @@ -41,10 +42,10 @@ public function edit(Guru $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', - 'bidang' => 'nullable|string|max:100', + '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()); diff --git a/app/Http/Controllers/Admin/SiswaController.php b/app/Http/Controllers/Admin/SiswaController.php index 9bc3007..f54e845 100644 --- a/app/Http/Controllers/Admin/SiswaController.php +++ b/app/Http/Controllers/Admin/SiswaController.php @@ -4,91 +4,68 @@ use App\Http\Controllers\Controller; use App\Models\Siswa; -use App\Models\Kelas; use App\Models\WaliMurid; use Illuminate\Http\Request; -use Illuminate\Support\Facades\Storage; class SiswaController extends Controller { public function index() { - $siswas = Siswa::with(['waliMurid', 'kelas'])->orderBy('created_at', 'desc')->get(); + // Ambil data siswa + data walinya (supaya tidak berat query-nya) + $siswas = Siswa::with('wali')->latest()->get(); return view('admin.siswa.index', compact('siswas')); } public function create() { - $kelas = Kelas::all(); - $wali_murids = WaliMurid::all(); - return view('admin.siswa.create', compact('kelas', 'wali_murids')); + // Ambil data wali untuk dropdown pilihan + $walis = WaliMurid::orderBy('nama_wali', 'asc')->get(); + return view('admin.siswa.create', compact('walis')); } - + public function store(Request $request) - { - $validated = $request->validate([ - 'nama' => 'required|string|max:255', - 'tempat_lahir' => 'nullable|string|max:255', - 'tanggal_lahir' => 'nullable|date', - 'alamat' => 'nullable|string', - 'kelas_id' => 'nullable|exists:kelas,id', - 'wali_id' => 'nullable|exists:wali_murids,id', - 'keterangan' => 'nullable|string', - 'foto' => 'nullable|image|mimes:jpg,jpeg,png|max:2048', - ]); - - if ($request->hasFile('foto')) { - $validated['foto'] = $request->file('foto')->store('fotosiswa', 'public'); - } - - Siswa::create($validated); - - return redirect()->route('siswa.index')->with('success', 'Data peserta didik berhasil ditambahkan.'); - } - - public function edit(Siswa $siswa) - { - $kelas = Kelas::all(); - $wali_murids = WaliMurid::all(); - - return view('admin.siswa.edit', compact('siswa', 'kelas', 'wali_murids')); - } - - public function update(Request $request, Siswa $siswa) { $request->validate([ - 'nama' => 'required|string|max:255', - 'tempat_lahir' => 'nullable|string|max:100', - 'tanggal_lahir' => 'nullable|date', - 'kelas_id' => 'nullable|exists:kelas,id', - 'wali_id' => 'nullable|exists:wali_murids,id', - 'foto' => 'nullable|image|mimes:jpg,jpeg,png|max:2048', + 'nama_siswa' => 'required|string|max:100', + 'wali_id' => 'required|exists:wali_murids,id', // Wajib pilih wali yg valid + 'jenis_kelamin' => 'required|in:L,P', + 'tempat_lahir' => 'required|string', + 'tanggal_lahir' => 'required|date', ]); - - // simpan foto baru kalau diupload - if ($request->hasFile('foto')) { - $fotoPath = $request->file('foto')->store('foto_siswa', 'public'); - $siswa->foto = $fotoPath; - } - - // update data siswa - $siswa->update([ - 'nama' => $request->nama, - 'tempat_lahir' => $request->tempat_lahir, - 'tanggal_lahir' => $request->tanggal_lahir, - 'kelas_id' => $request->kelas_id, - 'wali_id' => $request->wali_id, - ]); - - return redirect()->route('siswa.index')->with('success', 'Data siswa berhasil diperbarui.'); + + Siswa::create($request->all()); + + return redirect()->route('siswa.index')->with('success', 'Data Siswa berhasil ditambahkan.'); } - public function destroy(Siswa $siswa) + public function edit($id) { - if ($siswa->foto && Storage::disk('public')->exists($siswa->foto)) { - Storage::disk('public')->delete($siswa->foto); - } - $siswa->delete(); - return redirect()->route('siswa.index')->with('success','Siswa berhasil dihapus'); + $siswa = Siswa::findOrFail($id); + $walis = WaliMurid::orderBy('nama_wali', 'asc')->get(); + return view('admin.siswa.edit', compact('siswa', 'walis')); } -} + + 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', + 'tempat_lahir' => 'required|string', + 'tanggal_lahir' => 'required|date', + ]); + + $siswa->update($request->all()); + + 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.'); + } +} \ No newline at end of file diff --git a/app/Http/Controllers/Admin/WaliMuridController.php b/app/Http/Controllers/Admin/WaliMuridController.php index 59657e4..e4fe4fb 100644 --- a/app/Http/Controllers/Admin/WaliMuridController.php +++ b/app/Http/Controllers/Admin/WaliMuridController.php @@ -10,51 +10,66 @@ class WaliMuridController extends Controller { public function index() { - $wali_murids = WaliMurid::orderBy('created_at', 'desc')->get(); - return view('admin.wali_murid.index', compact('wali_murids')); + $walis = WaliMurid::latest()->get(); + return view('admin.wali.index', compact('walis')); } public function create() { - return view('admin.wali_murid.create'); + return view('admin.wali.create'); } public function store(Request $request) { $request->validate([ 'nama_wali' => 'required|string|max:100', - 'email' => 'nullable|email|max:100', - 'no_hp' => 'nullable|string|max:20', - 'alamat' => 'nullable|string|max:255', + 'no_hp' => 'nullable|string|max:20', + 'alamat' => 'nullable|string', ]); - - WaliMurid::create($request->only(['nama_wali', 'email', 'no_hp', 'alamat'])); - - return redirect()->route('wali-murid.index')->with('success', 'Data wali murid berhasil ditambahkan.'); - } - public function edit(WaliMurid $wali_murid) - { - return view('admin.wali_murid.edit', compact('wali_murid')); + + WaliMurid::create($request->all()); + + return redirect()->route('wali-murid.index')->with('success', 'Data Wali Murid berhasil ditambahkan.'); } - public function update(Request $request, WaliMurid $wali_murid) + 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', - 'email' => 'nullable|email|max:100', - 'no_hp' => 'nullable|string|max:20', - 'alamat' => 'nullable|string|max:255', + 'no_hp' => 'nullable|string|max:20', + 'alamat' => 'nullable|string', ]); - $wali_murid->update($request->all()); + $wali->update($request->all()); - return redirect()->route('wali-murid.index')->with('success', 'Data wali murid berhasil diperbarui.'); + return redirect()->route('wali-murid.index')->with('success', 'Data Wali Murid berhasil diperbarui.'); } - public function destroy(WaliMurid $wali_murid) + public function destroy($id) { - $wali_murid->delete(); + $wali = WaliMurid::findOrFail($id); - return redirect()->route('wali-murid.index')->with('success', 'Data wali murid berhasil dihapus.'); + // --- 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.'); + } + + // 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/Models/Guru.php b/app/Models/Guru.php index c83a833..540fb63 100644 --- a/app/Models/Guru.php +++ b/app/Models/Guru.php @@ -9,12 +9,11 @@ class Guru extends Model { use HasFactory; - // kasih tahu Laravel kalau nama tabelnya "guru", bukan "gurus" - protected $table = 'guru'; + protected $table = 'guru'; // Sesuai DB kamu protected $fillable = [ - 'nama', - 'jenis_guru', + 'nama_guru', // SEBELUMNYA 'nama' (SALAH), HARUS 'nama_guru' + 'jenis_guru', // SEBELUMNYA 'jenis_guru' (SUDAH BENAR TAPI INPUT FORM SALAH) 'no_hp', 'email', 'user_id', diff --git a/app/Models/Siswa.php b/app/Models/Siswa.php index 0f1c600..7592429 100644 --- a/app/Models/Siswa.php +++ b/app/Models/Siswa.php @@ -1,28 +1,29 @@ belongsTo(Kelas::class); - } - - public function waliMurid() + /** + * Relasi: Setiap Siswa PASTI punya satu Wali Murid + */ + public function wali() { return $this->belongsTo(WaliMurid::class, 'wali_id'); } diff --git a/app/Models/WaliMurid.php b/app/Models/WaliMurid.php index 0e0f087..328fed4 100644 --- a/app/Models/WaliMurid.php +++ b/app/Models/WaliMurid.php @@ -9,18 +9,24 @@ class WaliMurid extends Model { use HasFactory; - protected $table = 'wali_murids'; + protected $table = 'wali_murids'; // Default laravel biasanya plural protected $fillable = [ - 'nama_wali', - 'no_hp', - 'email', - 'alamat', 'user_id', + 'nama_wali', // Pastikan kolom di DB 'nama_wali', bukan 'nama' + 'no_hp', + 'alamat', + 'pekerjaan', // Opsional, jaga-jaga kalau butuh ]; public function user() { return $this->belongsTo(User::class); } + + // Relasi ke Siswa (Satu wali bisa punya banyak anak) + public function siswas() + { + return $this->hasMany(Siswa::class, 'wali_id'); + } } \ No newline at end of file diff --git a/database/migrations/2025_09_17_035749_create_wali_murids_table.php b/database/migrations/2025_09_17_035749_create_wali_murids_table.php index 48bb99f..4052db7 100644 --- a/database/migrations/2025_09_17_035749_create_wali_murids_table.php +++ b/database/migrations/2025_09_17_035749_create_wali_murids_table.php @@ -6,25 +6,22 @@ return new class extends Migration { - /** - * Run the migrations. - */ - public function up(): void + public function up() { Schema::create('wali_murids', function (Blueprint $table) { $table->id(); - $table->unsignedBigInteger('user_id'); + $table->foreignId('user_id')->nullable()->constrained('users')->onDelete('set null'); + + $table->string('nama_wali'); // Sesuai PDF "Nama Orang Tua" + $table->string('no_hp')->nullable(); + $table->text('alamat')->nullable(); // Sesuai PDF "Alamat" $table->string('pekerjaan')->nullable(); - $table->string('alamat')->nullable(); - $table->decimal('lokasi_lat', 10, 7)->nullable(); - $table->decimal('lokasi_lng', 10, 7)->nullable(); + $table->timestamps(); - - $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade'); }); } - public function down(): void + public function down() { Schema::dropIfExists('wali_murids'); } diff --git a/database/migrations/2025_09_17_035928_create_gurus_table.php b/database/migrations/2025_09_17_035928_create_gurus_table.php index f0406c5..9957f89 100644 --- a/database/migrations/2025_09_17_035928_create_gurus_table.php +++ b/database/migrations/2025_09_17_035928_create_gurus_table.php @@ -6,24 +6,25 @@ return new class extends Migration { - /** - * Run the migrations. - */ - public function up(): void + public function up() { - Schema::create('guru', function (Blueprint $table) { - $table->id(); - $table->foreignId('user_id')->constrained('users')->cascadeOnDelete(); - $table->string('bidang')->nullable(); - $table->timestamps(); -}); + Schema::create('guru', function (Blueprint $table) { + $table->id(); + $table->foreignId('user_id')->nullable()->constrained('users')->onDelete('set null'); + + $table->string('nama_guru'); + $table->enum('jenis_guru', ['guru_kelas', 'shadow_abk']); + $table->string('nip')->nullable(); + $table->string('no_hp')->nullable(); + $table->string('email')->nullable(); // Wajib ada biar ga error seeder + $table->text('alamat')->nullable(); + + $table->timestamps(); + }); } - /** - * Reverse the migrations. - */ - public function down(): void + public function down() { - Schema::dropIfExists('gurus'); + Schema::dropIfExists('guru'); } -}; +}; \ 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 index fd23055..f2c958f 100644 --- a/database/migrations/2025_09_17_040000_create_siswas_table.php +++ b/database/migrations/2025_09_17_040000_create_siswas_table.php @@ -6,31 +6,24 @@ return new class extends Migration { - /** - * Run the migrations. - */ - public function up(): void + public function up() { - Schema::create('siswas', function (Blueprint $table) { - $table->id(); - $table->string('nama'); - $table->string('nis')->unique(); - $table->date('tanggal_lahir'); - $table->unsignedBigInteger('kelas_id'); - $table->unsignedBigInteger('wali_id'); - $table->string('foto')->nullable(); - $table->timestamps(); - - $table->foreign('kelas_id')->references('id')->on('kelas')->onDelete('cascade'); - $table->foreign('wali_id')->references('id')->on('wali_murids')->onDelete('cascade'); -}); + Schema::create('siswas', function (Blueprint $table) { + $table->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(); + }); } - /** - * Reverse the migrations. - */ - public function down(): void + public function down() { Schema::dropIfExists('siswas'); } -}; +}; \ No newline at end of file diff --git a/database/seeders/DatabaseSeeder.php b/database/seeders/DatabaseSeeder.php index bc1f622..c668321 100644 --- a/database/seeders/DatabaseSeeder.php +++ b/database/seeders/DatabaseSeeder.php @@ -2,15 +2,33 @@ namespace Database\Seeders; -use App\Models\User; use Illuminate\Database\Seeder; +use App\Models\User; +use Illuminate\Support\Facades\Hash; class DatabaseSeeder extends Seeder { + /** + * Seed the application's database. + */ public function run(): void { - $this->call([ - MasterSeeder::class, + // 1. Buat Akun Admin (Supaya kamu bisa Login) + // Kita buat manual di sini biar tidak error pakai seeder lama + User::create([ + 'name' => 'Administrator', + 'email' => 'admin@admin.com', + 'password' => Hash::make('password'), // Password default + 'role' => 'admin', ]); + + // 2. Jalankan Seeder Data Sekolah (Sesuai PDF) + $this->call([ + GuruSeeder::class, // Data Guru (Fixed) + WaliMuridSeeder::class, // Data Wali (Fixed) + SiswaSeeder::class, // Data Siswa (Fixed) + ]); + + // CATATAN: Jangan panggil MasterSeeder lagi karena kodenya usang. } } \ No newline at end of file diff --git a/database/seeders/GuruSeeder.php b/database/seeders/GuruSeeder.php new file mode 100644 index 0000000..cde472d --- /dev/null +++ b/database/seeders/GuruSeeder.php @@ -0,0 +1,36 @@ + 'Ibu. Junita Dhanesti, S.Pd', 'jenis_guru' => 'guru_kelas'], + ['nama_guru' => 'Ibu. Afif Wais Al Qorni, S.Pd.', 'jenis_guru' => 'guru_kelas'], + ['nama_guru' => 'Ibu. Anisa Nur Pratama, S.Psi', 'jenis_guru' => 'guru_kelas'], + + // Guru Shadow ABK + ['nama_guru' => 'Ibu. Ellyse Clara Nargata', 'jenis_guru' => 'shadow_abk'], + ['nama_guru' => 'Ibu. Efa Nur Azizah', 'jenis_guru' => 'shadow_abk'], + ['nama_guru' => 'Ibu. Istik Sundari, S.Pd.', 'jenis_guru' => 'shadow_abk'], + ]; + + foreach ($data as $d) { + DB::table('guru')->insert([ + 'nama_guru' => $d['nama_guru'], + 'jenis_guru' => $d['jenis_guru'], + 'email' => null, + 'no_hp' => '-', + 'created_at' => Carbon::now(), + 'updated_at' => Carbon::now(), + ]); + } + } +} \ No newline at end of file diff --git a/database/seeders/SiswaSeeder.php b/database/seeders/SiswaSeeder.php new file mode 100644 index 0000000..ebb7559 --- /dev/null +++ b/database/seeders/SiswaSeeder.php @@ -0,0 +1,43 @@ +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], + ]); + } + } + } +} \ No newline at end of file diff --git a/database/seeders/WaliMuridSeeder.php b/database/seeders/WaliMuridSeeder.php new file mode 100644 index 0000000..c0c98d8 --- /dev/null +++ b/database/seeders/WaliMuridSeeder.php @@ -0,0 +1,37 @@ + 'Tomi Puspita Aji', 'alamat' => 'Jl. Ciliwung No. 22 RT 47 RW 15 Taman'], + ['nama' => 'Yonna Setyawan', 'alamat' => 'Jl. Jambu Kembar 1 No. 1 CRT 20 RW 07 Taman Kota Madiun'], + ['nama' => 'Taufiq Rahman Luis', 'alamat' => 'Griya Kencana Wungu Blok C No. 12'], // Asumsi dari data sebelumnya + ['nama' => 'Andika Bayu', 'alamat' => 'Jl. Pilang Mudya 3 / 8'], + ['nama' => 'Masita Sari', 'alamat' => 'Dsn. Butan Rt 035 Rw 005 Ds. Krandegan Kec. Kebonsari'], + ['nama' => 'Ayu Trisnawati', 'alamat' => 'Rt 018 Rw 004 Jl. Remora Mas Blok O No. 7 Perum Telaga Mas'], + ['nama' => 'Alliemsa Anggi Putra', 'alamat' => 'Jl. Panglima Sudirman No. 75 RT 37 RW 12 Taman Kota Madiun'], + ['nama' => 'Renny Wulandari', 'alamat' => 'Rt 033 Rw 001 Jl. Khairil Anwar Gang Palm 1/284 Ds. Badean'], + ['nama' => 'Anggieta', 'alamat' => 'Dusun II Ds. Sukolilo Kec Jiwan Kab Madiun'], + ['nama' => 'Miftakhul Jannah', 'alamat' => 'Jl. Sasono Mulyo No. 18 Sogaten'], + ['nama' => 'Ika Septina', 'alamat' => 'Jl. Pasopati No. 18 Josenan'], + ]; + + foreach ($walis as $w) { + DB::table('wali_murids')->insert([ + 'nama_wali' => $w['nama'], + 'alamat' => $w['alamat'], + 'no_hp' => '-', + 'created_at' => Carbon::now(), + 'updated_at' => Carbon::now(), + ]); + } + } +} \ No newline at end of file diff --git a/resources/views/admin/akun/index.blade.php b/resources/views/admin/akun/index.blade.php index 7f70ca8..67c48ae 100644 --- a/resources/views/admin/akun/index.blade.php +++ b/resources/views/admin/akun/index.blade.php @@ -44,10 +44,10 @@ {{-- Kolom password (disembunyikan tapi bisa dilihat) --}}