###  YANG SUDAH BERES (DONE)

1. **Data Peserta Didik (Data Master)**
* Database `siswas`: Sudah fix (Ada `NIS`, `NISN`, Hapus `alamat` & `tahun_masuk`).
* CRUD Siswa: Form tambah & edit sudah sinkron dengan database baru.
* Tampilan Tabel: Alamat siswa sudah otomatis ambil dari data Wali Murid.

2. **Laporan Perkembangan (Fitur Utama)**
* **Konsep:** Menu Rapot digabung ke dalam "Laporan Perkembangan".
* **Tampilan Detail Siswa:** Ada 2 bagian (Atas: Monitoring Harian, Bawah: Riwayat Rapot Semester).
* **Tombol Data Harian:** Sudah menampilkan jumlah data (Anekdot, Karya, Ceklis).

3. **Fitur Input Rapot (Formulir)**
* Database `rapots`: Sudah dibuat tabel lengkap sesuai PDF (Narasi A-E, Fisik, Kehadiran, TTD).
* Form Input: Sudah dibuat urut A-E + Kokurikuler.
* **Dropdown Guru:** Input nama guru sudah mengambil data real dari tabel `guru` (bukan ngetik manual lagi).

4. **Fitur Lihat/Cetak Rapot (Preview)**
* **Tampilan Kertas A4:** Sudah dibuat mirip PDF asli (Font Times New Roman, Ada Bingkai/Border Ganda).
* **Struktur:** Sudah ada Kop Surat PAUD, Tabel Identitas, Isi Narasi, Tabel Fisik & Absensi.
* **Tanda Tangan:** Sudah berjejer 3 kolom (Ortu - Kepsek - Guru Kelas).
* **Print:** Tombol cetak sudah jalan (pakai fitur bawaan browser `window.print()`).

---

### 📝 YANG BELUM / PERLU DILANJUTKAN (TO-DO LIST)

1. **Input Data Harian (Anekdot, Hasil Karya, Ceklis)**
* Kita baru bikin *tombolnya* saja di halaman detail siswa. Form input untuk mengisi data-data ini belum kita sentuh hari ini.

2. **User & Role Guru**
* Kita sudah siapkan logic menu Admin vs Guru.
* **PR:** Memastikan akun Login Guru terhubung dengan Data Guru (biar nanti pas guru login, sistem tahu dia guru kelas mana). Saat ini kolom `user_id` di tabel `guru` masih banyak yang NULL.

3. **Penjemputan**
* Menu ini ada di sidebar tapi belum kita bahas fungsinya.
This commit is contained in:
ghozahimma65 2026-02-09 04:34:52 +07:00
parent ad1d7b2b93
commit ec9b09eedc
42 changed files with 2082 additions and 500 deletions

View File

@ -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)
{

View File

@ -0,0 +1,34 @@
<?php
namespace App\Http\Controllers\Admin; // Namespace sudah benar (di folder Admin)
use App\Http\Controllers\Controller; // <--- INI OBATNYA! (Panggil Controller Utama)
use Illuminate\Http\Request;
use App\Models\Penjemputan;
use Illuminate\Support\Facades\Storage;
class PenjemputanController extends Controller
{
public function index()
{
// Ambil data penjemputan, urutkan dari yang paling baru (latest)
$logs = Penjemputan::with('siswa')->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.');
}
}

View File

@ -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'));
}
}
}

View File

@ -0,0 +1,80 @@
<?php
namespace App\Http\Controllers\Admin;
use App\Http\Controllers\Controller;
use App\Models\Rapot;
use App\Models\Siswa;
use Illuminate\Http\Request;
class RapotController extends Controller
{
public function create($siswa_id)
{
$siswa = \App\Models\Siswa::findOrFail($siswa_id);
// PERBAIKAN: Ambil data dari Model 'Guru', bukan 'User'
// Kita ambil semua guru, diurutkan berdasarkan nama
$gurus = \App\Models\Guru::orderBy('nama_guru', 'asc')->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'));
}
}

View File

@ -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!');
}
}

View File

@ -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.');
}
}

View File

@ -0,0 +1,175 @@
<?php
namespace App\Http\Controllers\Api;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Validator;
use App\Models\User;
use App\Models\Siswa;
use App\Models\Penjemputan;
use App\Models\Anekdot;
use App\Models\HasilKarya;
use App\Models\PenilaianCeklis;
class MobileApiController extends Controller
{
// ==========================================
// 1. OTENTIKASI (LOGIN UMUM GURU & WALI)
// ==========================================
public function login(Request $request)
{
// Cek email & password
if (Auth::attempt(['email' => $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,
]
]);
}
}

10
app/Models/Anekdot.php Normal file
View File

@ -0,0 +1,10 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class Anekdot extends Model
{
//
}

10
app/Models/HasilKarya.php Normal file
View File

@ -0,0 +1,10 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class HasilKarya extends Model
{
//
}

10
app/Models/Indikator.php Normal file
View File

@ -0,0 +1,10 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class Indikator extends Model
{
//
}

View File

@ -0,0 +1,10 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class PenilaianCeklis extends Model
{
//
}

View File

@ -0,0 +1,22 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Penjemputan extends Model
{
use HasFactory;
protected $table = 'penjemputans';
// Kita pakai guarded kosong biar semua kolom bisa diisi
protected $guarded = [];
// Relasi: Penjemputan milik Siswa
public function siswa()
{
return $this->belongsTo(Siswa::class, 'siswa_id');
}
}

20
app/Models/Rapot.php Normal file
View File

@ -0,0 +1,20 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Rapot extends Model
{
use HasFactory;
// Ini kuncinya biar semua kolom bisa diisi
protected $guarded = [];
// Relasi balik ke Siswa
public function siswa()
{
return $this->belongsTo(Siswa::class);
}
}

View File

@ -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');
}
}

View File

@ -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",

205
composer.lock generated
View File

@ -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",

View File

@ -0,0 +1,32 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
public function up()
{
Schema::create('siswas', function (Blueprint $table) {
$table->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');
}
};

View File

@ -1,29 +0,0 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
public function up()
{
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();
});
}
public function down()
{
Schema::dropIfExists('siswas');
}
};

View File

@ -1,36 +0,0 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::create('perkembangans', function (Blueprint $table) {
$table->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');
}
};

View File

@ -0,0 +1,35 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up()
{
Schema::create('anekdots', function (Blueprint $table) {
$table->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');
}
};

View File

@ -0,0 +1,33 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up()
{
Schema::create('hasil_karyas', function (Blueprint $table) {
$table->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');
}
};

View File

@ -0,0 +1,28 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up()
{
Schema::create('indikators', function (Blueprint $table) {
$table->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');
}
};

View File

@ -0,0 +1,33 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up()
{
Schema::create('penilaian_ceklis', function (Blueprint $table) {
$table->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');
}
};

View File

@ -0,0 +1,35 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::create('penjemputans', function (Blueprint $table) {
$table->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');
}
};

View File

@ -0,0 +1,25 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
public function up()
{
Schema::table('guru', function (Blueprint $table) {
// FUNGSI INI BUTUH DOCTRINE/DBAL (YANG BARUSAN KAMU INSTALL)
// Mengubah kolom jenis_guru jadi VARCHAR(50) biar muat tulisan panjang
$table->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();
});
}
};

View File

@ -0,0 +1,64 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
public function up()
{
Schema::create('rapots', function (Blueprint $table) {
$table->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');
}
};

View File

@ -0,0 +1,26 @@
<?php
namespace Database\Seeders;
use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\DB;
class IndikatorSeeder extends Seeder
{
public function run()
{
$indikators = [
['nama_indikator' => '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);
}
}

View File

@ -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);
}
}

View File

@ -0,0 +1,25 @@
<?php
namespace Database\Seeders;
use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Hash;
class UserSeeder extends Seeder
{
public function run()
{
// Data diambil dari CSV Guru yang kamu kirim
$users = [
['name' => '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);
}
}

View File

@ -1,56 +1,77 @@
@extends('layouts.app')
@section('content')
<div class="bg-white shadow-md rounded-lg p-6 max-w-xl mx-auto">
<h1 class="text-xl font-semibold text-gray-700 mb-4">✏️ Edit Guru</h1>
<div class="bg-white shadow-md rounded-lg p-6 max-w-xl mx-auto mt-10">
<div class="flex justify-between items-center mb-6">
<h1 class="text-xl font-bold text-gray-700">✏️ Edit Data Guru</h1>
<a href="{{ route('guru.index') }}" class="text-gray-500 hover:text-gray-700">&larr; Kembali</a>
</div>
{{-- Cek Error --}}
@if ($errors->any())
<div class="bg-red-100 border-l-4 border-red-500 text-red-700 p-4 mb-4" role="alert">
<p class="font-bold">Gagal Menyimpan:</p>
<ul class="list-disc list-inside">
@foreach ($errors->all() as $error)
<li>{{ $error }}</li>
@endforeach
</ul>
</div>
@endif
<form action="{{ route('guru.update', $guru->id) }}" method="POST">
@csrf
@method('PUT')
@csrf
@method('PUT')
<!-- Nama -->
<div class="mb-4">
<label class="block text-gray-700 font-medium">Nama</label>
<input type="text" name="nama"
value="{{ old('nama', $guru->name) }}"
class="w-full border-gray-300 rounded-lg p-2 focus:ring-green-500 focus:border-green-500">
</div>
<div class="mb-4">
<label class="block text-gray-700 font-medium mb-1">Nama Guru</label>
{{-- Ambil langsung dari tabel guru kolom nama_guru --}}
<input type="text" name="nama_guru"
value="{{ old('nama_guru', $guru->nama_guru) }}"
class="w-full border border-gray-300 rounded-lg p-2 focus:ring-2 focus:ring-green-500 focus:outline-none"
required>
</div>
<div class="mb-4">
<label class="block text-gray-700 font-medium mb-1">Email</label>
<input type="email" name="email"
value="{{ old('email', $guru->email) }}"
class="w-full border border-gray-300 rounded-lg p-2 focus:ring-2 focus:ring-green-500 focus:outline-none"
required>
</div>
<!-- Bidang -->
<div class="mb-4">
<label class="block text-gray-700 font-medium">Bidang</label>
<input type="text" name="bidang"
value="{{ old('bidang', $guru->bidang) }}"
class="w-full border-gray-300 rounded-lg p-2 focus:ring-green-500 focus:border-green-500">
<div class="mb-4">
<label class="block text-gray-700 font-medium mb-1">No HP</label>
<input type="text" name="no_hp"
value="{{ old('no_hp', $guru->no_hp) }}"
class="w-full border border-gray-300 rounded-lg p-2 focus:ring-2 focus:ring-green-500 focus:outline-none">
</div>
<div class="mb-4">
<label class="block text-gray-700 font-medium mb-1">Jenis Guru</label>
<select name="jenis_guru" class="w-full border border-gray-300 rounded-lg p-2 focus:ring-2 focus:ring-green-500 focus:outline-none">
{{-- Opsi 1: Guru Kelas --}}
<option value="guru_kelas"
{{ old('jenis_guru', $guru->jenis_guru) == 'guru_kelas' ? 'selected' : '' }}>
Guru Kelas
</option>
{{-- Opsi 2: Shadow ABK --}}
<option value="shadow_abk"
{{ old('jenis_guru', $guru->jenis_guru) == 'shadow_abk' ? 'selected' : '' }}>
Shadow ABK
</option>
</select>
</div>
<!-- No HP -->
<div class="mb-4">
<label class="block text-gray-700 font-medium">No HP</label>
<input type="text" name="no_hp"
value="{{ old('no_hp', $guru->no_hp) }}"
class="w-full border-gray-300 rounded-lg p-2 focus:ring-green-500 focus:border-green-500">
</div>
<!-- Email -->
<div class="mb-4">
<label class="block text-gray-700 font-medium">Email</label>
<input type="email" name="email"
value="{{ old('email', $guru->email) }}"
class="w-full border-gray-300 rounded-lg p-2 focus:ring-green-500 focus:border-green-500">
</div>
<!-- Tombol -->
<div class="flex justify-end mt-6 gap-3">
<a href="{{ route('guru.index') }}"
class="bg-gray-500 text-white px-5 py-2 rounded hover:bg-gray-600 transition">
Batal
</a>
<button type="submit"
class="bg-green-600 text-white px-5 py-2 rounded hover:bg-green-700 transition">
Perbarui
</button>
</div>
</form>
<div class="flex justify-end mt-6 gap-3">
<button type="submit"
class="bg-green-600 text-white font-semibold px-6 py-2 rounded-lg hover:bg-green-700 transition duration-200 shadow-md">
💾 Simpan Perubahan
</button>
</div>
</form>
</div>
@endsection
@endsection

View File

@ -1,42 +1,85 @@
@extends('layouts.app')
@section('content')
<div class="bg-white shadow-md rounded-lg p-6">
<div class="flex justify-between items-center mb-4">
<div class="container mx-auto px-4">
<div class="flex flex-col md:flex-row justify-between items-center mb-6 mt-6">
<div>
<h1 class="text-xl font-semibold text-gray-700">🚸 Monitoring Penjemputan</h1>
<p class="text-sm text-gray-500">Data masuk secara real-time dari aplikasi mobile.</p>
<h1 class="text-2xl font-bold text-gray-800">🛵 Log Penjemputan</h1>
<p class="text-gray-500 text-sm mt-1">Daftar riwayat penjemputan siswa (Real-time).</p>
</div>
<div class="flex gap-3">
<div class="bg-blue-50 text-blue-700 px-4 py-2 rounded-lg text-sm font-semibold border border-blue-100">
Hari Ini: {{ $logs->where('waktu_jemput', '>=', now()->today())->count() }}
</div>
</div>
</div>
<div class="overflow-x-auto">
<table class="w-full border-collapse">
<thead>
<tr class="bg-gray-800 text-white text-left">
<th class="p-3">Waktu</th>
<th class="p-3">Nama Siswa</th>
<th class="p-3">Penjemput</th>
<th class="p-3">Hubungan</th>
<th class="p-3">Status</th>
</tr>
</thead>
<tbody>
{{-- Data ini nanti otomatis muncul saat Wali klik jemput di HP --}}
@forelse ($logs as $log)
<tr class="border-b hover:bg-gray-50">
<td class="p-3 font-bold">{{ \Carbon\Carbon::parse($log->waktu_jemput)->format('H:i') }}</td>
<td class="p-3">{{ $log->siswa->nama_siswa }}</td>
<td class="p-3">{{ $log->nama_penjemput }}</td>
<td class="p-3"><span class="bg-blue-100 text-blue-700 px-2 py-1 rounded text-xs">{{ $log->hubungan }}</span></td>
<td class="p-3"><span class="text-green-600 font-bold"> Selesai</span></td>
</tr>
@empty
<tr>
<td colspan="5" class="text-center py-10 text-gray-400 italic">Belum ada aktifitas penjemputan hari ini.</td>
</tr>
@endforelse
</tbody>
</table>
<div class="bg-white shadow-md rounded-xl overflow-hidden border border-gray-100">
<div class="overflow-x-auto">
<table class="w-full text-left border-collapse">
<thead>
<tr class="bg-gray-100 text-gray-600 uppercase text-xs tracking-wider border-b border-gray-200">
<th class="p-4 font-bold">Waktu Jemput</th>
<th class="p-4 font-bold">Nama Siswa</th>
<th class="p-4 font-bold">Nama Penjemput</th>
<th class="p-4 font-bold text-center">Status Hubungan</th>
<th class="p-4 font-bold text-center">Aksi</th>
</tr>
</thead>
<tbody class="divide-y divide-gray-50">
@forelse($logs as $log)
<tr class="hover:bg-blue-50 transition duration-150 group">
<td class="p-4 whitespace-nowrap">
<div class="text-gray-800 font-semibold">
{{ \Carbon\Carbon::parse($log->waktu_jemput)->format('H:i') }} WIB
</div>
<div class="text-xs text-gray-500">
{{ \Carbon\Carbon::parse($log->waktu_jemput)->format('d M Y') }}
</div>
</td>
<td class="p-4">
<div class="font-bold text-gray-800">{{ $log->siswa->nama ?? 'Siswa Terhapus' }}</div>
<div class="text-xs text-gray-500">NIS: {{ $log->siswa->nis ?? '-' }}</div>
</td>
<td class="p-4 text-gray-700 font-medium">
{{ $log->nama_penjemput }}
</td>
<td class="p-4 text-center">
<span class="inline-block px-3 py-1 rounded-full text-xs font-bold bg-blue-100 text-blue-700 border border-blue-200">
{{ $log->status_hubungan }}
</span>
</td>
<td class="p-4 text-center">
<form action="{{ route('penjemputan.destroy', $log->id) }}" method="POST" onsubmit="return confirm('Hapus data log ini?');">
@csrf
@method('DELETE')
<button type="submit" class="text-gray-400 hover:text-red-500 transition-colors p-2 rounded-full hover:bg-red-50" title="Hapus Riwayat">
<svg xmlns="http://www.w3.org/2000/svg" class="h-5 w-5" fill="none" viewBox="0 0 24 24" stroke="currentColor">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16" />
</svg>
</button>
</form>
</td>
</tr>
@empty
<tr>
<td colspan="5" class="p-10 text-center text-gray-400">
<div class="flex flex-col items-center justify-center">
<svg class="w-12 h-12 mb-3 text-gray-300" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 8v4l3 3m6-3a9 9 0 11-18 0 9 9 0 0118 0z"></path></svg>
<p class="text-sm">Belum ada data penjemputan hari ini.</p>
</div>
</td>
</tr>
@endforelse
</tbody>
</table>
</div>
</div>
</div>
@endsection

View File

@ -1,41 +1,70 @@
@extends('layouts.app')
@section('content')
<div class="bg-white p-6 rounded-lg shadow">
<h1 class="text-2xl font-semibold mb-4">📊 Laporan Perkembangan Anak</h1>
<div class="container mx-auto px-4">
<div class="mb-6 flex justify-between items-center">
<div>
<h1 class="text-2xl font-bold text-gray-800">📈 Laporan Perkembangan</h1>
<p class="text-gray-600 text-sm mt-1">Pilih siswa untuk melihat Catatan Anekdot, Hasil Karya, dan Ceklis.</p>
</div>
<div class="bg-green-100 text-green-800 px-4 py-2 rounded-lg font-bold text-sm">
Total Siswa: {{ $siswas->count() }}
</div>
</div>
<table class="w-full border-collapse border border-gray-300 text-sm">
<thead class="bg-green-600 text-white">
<tr>
<th class="p-2 border">No</th>
<th class="p-2 border">Nama Anak</th>
<th class="p-2 border">Guru</th>
<th class="p-2 border">Tanggal</th>
<th class="p-2 border">Aspek</th>
<th class="p-2 border">Deskripsi</th>
<th class="p-2 border">Aksi</th>
</tr>
</thead>
<tbody>
@forelse($perkembangans as $i => $item)
<tr class="hover:bg-gray-50">
<td class="p-2 border text-center">{{ $i+1 }}</td>
<td class="p-2 border">{{ $item->siswa->nama ?? '-' }}</td>
<td class="p-2 border">{{ $item->guru->nama_guru ?? '-' }}</td>
<td class="p-2 border">{{ $item->tanggal }}</td>
<td class="p-2 border">{{ $item->aspek }}</td>
<td class="p-2 border">{{ Str::limit($item->deskripsi, 40) }}</td>
<td class="p-2 border text-center">
<a href="{{ route('admin.perkembangan.show', $item->id) }}"
class="text-blue-600 hover:underline">Lihat</a> |
<a href="{{ route('admin.perkembangan.print', $item->id) }}"
class="text-green-600 hover:underline" target="_blank">Cetak</a>
</td>
</tr>
@empty
<tr><td colspan="7" class="text-center p-4 text-gray-500">Belum ada data perkembangan</td></tr>
@endforelse
</tbody>
</table>
<div class="bg-white shadow-md rounded-lg overflow-hidden">
<table class="min-w-full bg-white">
<thead class="bg-green-600 text-white">
<tr>
<th class="py-3 px-4 text-left uppercase font-semibold text-sm">No</th>
<th class="py-3 px-4 text-left uppercase font-semibold text-sm">NIS</th>
<th class="py-3 px-4 text-left uppercase font-semibold text-sm">Nama Siswa</th>
<th class="py-3 px-4 text-center uppercase font-semibold text-sm">Kelompok</th>
<th class="py-3 px-4 text-center uppercase font-semibold text-sm">Aksi</th>
</tr>
</thead>
<tbody class="text-gray-700">
@forelse($siswas as $index => $siswa)
<tr class="hover:bg-gray-100 border-b transition duration-150">
<td class="py-3 px-4">{{ $index + 1 }}</td>
<td class="py-3 px-4">
<span class="bg-gray-100 text-gray-600 py-1 px-2 rounded text-xs font-mono">
{{ $siswa->nis ?? '-' }}
</span>
</td>
<td class="py-3 px-4 font-medium text-gray-900">
{{ $siswa->nama_siswa }}
</td>
<td class="py-3 px-4 text-center">
{{ $siswa->kelompok_id ?? '-' }}
</td>
<td class="py-3 px-4 text-center">
{{-- PERBAIKAN: Hapus 'admin.' jadi 'perkembangan.show' --}}
<a href="{{ route('perkembangan.show', $siswa->id) }}" class="inline-flex items-center gap-1 border border-green-600 text-green-600 bg-white hover:bg-green-50 px-4 py-1.5 rounded-md text-sm font-medium transition duration-200 shadow-sm">
📂 Buka Rapot
</a>
</td>
</tr>
@empty
<tr>
<td colspan="5" class="text-center py-8 text-gray-500">
<div class="flex flex-col items-center">
<span class="text-4xl mb-2">📭</span>
<p>Belum ada data siswa.</p>
</div>
</td>
</tr>
@endforelse
</tbody>
</table>
</div>
<div class="mt-4 text-center text-xs text-gray-400">
&copy; {{ date('Y') }} PAUD Aisyiyah Monitoring System
</div>
</div>
@endsection
@endsection

View File

@ -0,0 +1,104 @@
@extends('layouts.app')
@section('content')
<div class="container mx-auto px-4 py-6">
<div class="bg-white shadow-md rounded-lg p-6 mb-6 flex justify-between items-center border-l-4 border-green-600">
<div>
<h1 class="text-2xl font-bold text-gray-800">{{ $siswa->nama_siswa }}</h1>
<p class="text-gray-600">NIS: <span class="font-mono font-bold">{{ $siswa->nis }}</span> | NISN: {{ $siswa->nisn ?? '-' }}</p>
<p class="text-sm text-gray-500 mt-1">TTL: {{ $siswa->tempat_lahir }}, {{ \Carbon\Carbon::parse($siswa->tanggal_lahir)->translatedFormat('d F Y') }}</p>
</div>
<div class="text-right">
<a href="{{ route('admin.perkembangan.index') }}" class="text-gray-500 hover:text-gray-700 font-medium mb-2 block">&larr; Kembali ke Daftar</a>
<span class="bg-green-100 text-green-800 text-xs font-bold px-3 py-1 rounded-full">Siswa Aktif</span>
</div>
</div>
<div class="grid grid-cols-1 md:grid-cols-3 gap-4 mb-8">
{{-- Tombol Anekdot --}}
<a href="#" class="bg-blue-50 hover:bg-blue-100 text-blue-700 font-semibold py-4 px-6 rounded-lg border border-blue-200 shadow-sm transition flex flex-col items-center justify-center gap-1">
<span class="flex items-center gap-2 text-lg">📝 Catatan Anekdot</span>
<span class="text-xs bg-blue-200 text-blue-800 px-2 py-1 rounded-full">{{ $anekdots->count() }} Data</span>
</a>
{{-- Tombol Hasil Karya --}}
<a href="#" class="bg-purple-50 hover:bg-purple-100 text-purple-700 font-semibold py-4 px-6 rounded-lg border border-purple-200 shadow-sm transition flex flex-col items-center justify-center gap-1">
<span class="flex items-center gap-2 text-lg">🎨 Hasil Karya</span>
<span class="text-xs bg-purple-200 text-purple-800 px-2 py-1 rounded-full">{{ $karyas->count() }} Data</span>
</a>
{{-- Tombol Ceklis --}}
<a href="#" class="bg-orange-50 hover:bg-orange-100 text-orange-700 font-semibold py-4 px-6 rounded-lg border border-orange-200 shadow-sm transition flex flex-col items-center justify-center gap-1">
<span class="flex items-center gap-2 text-lg"> Ceklis Capaian</span>
<span class="text-xs bg-orange-200 text-orange-800 px-2 py-1 rounded-full">{{ $ceklis->count() }} Data</span>
</a>
</div>
<div class="bg-white shadow-lg rounded-xl overflow-hidden">
<div class="bg-gray-800 text-white p-4 flex justify-between items-center">
<h2 class="text-lg font-bold flex items-center gap-2">
🎓 Riwayat Rapot Semester
</h2>
<a href="{{ route('rapot.create', $siswa->id) }}" class="bg-green-500 hover:bg-green-600 text-white font-bold py-2 px-4 rounded shadow transition duration-200 text-sm flex items-center gap-2">
Buat Rapot Baru
</a>
</div>
<div class="p-0">
<table class="min-w-full bg-white">
<thead class="bg-gray-100 text-gray-600 uppercase text-xs font-bold">
<tr>
<th class="py-3 px-6 text-left">Tahun Ajaran</th>
<th class="py-3 px-6 text-center">Semester</th>
<th class="py-3 px-6 text-center">Tanggal Rapot</th>
<th class="py-3 px-6 text-center">Status P5</th>
<th class="py-3 px-6 text-center">Aksi</th>
</tr>
</thead>
<tbody class="text-gray-700 text-sm">
@forelse($rapots as $rapot)
<tr class="border-b hover:bg-gray-50 transition">
<td class="py-4 px-6 font-medium">{{ $rapot->tahun_ajaran }}</td>
<td class="py-4 px-6 text-center">
<span class="bg-blue-100 text-blue-800 px-2 py-1 rounded text-xs font-bold">
Semester {{ $rapot->semester }}
</span>
</td>
<td class="py-4 px-6 text-center">
{{ \Carbon\Carbon::parse($rapot->tanggal_rapot)->translatedFormat('d F Y') }}
</td>
<td class="py-4 px-6 text-center">
@if($rapot->p5_tema)
<span class="text-xs text-green-600 font-semibold"> Ada Projek</span>
@else
<span class="text-xs text-gray-400">-</span>
@endif
</td>
<td class="py-4 px-6 text-center flex justify-center gap-2">
<a href="{{ route('rapot.show', $rapot->id) }}" class="text-blue-500 hover:text-blue-700 font-semibold border border-blue-500 hover:bg-blue-50 px-3 py-1 rounded transition">
👁️ Lihat
</a>
<a href="#" class="text-red-500 hover:text-red-700 font-semibold border border-red-500 hover:bg-red-50 px-3 py-1 rounded transition">
🖨️ PDF
</a>
</td>
</tr>
@empty
<tr>
<td colspan="5" class="text-center py-8 text-gray-400">
<div class="flex flex-col items-center">
<span class="text-4xl mb-2">📄</span>
<p>Belum ada rapot yang dibuat untuk siswa ini.</p>
<p class="text-xs mt-1">Klik tombol <b>"Buat Rapot Baru"</b> di pojok kanan atas.</p>
</div>
</td>
</tr>
@endforelse
</tbody>
</table>
</div>
</div>
</div>
@endsection

View File

@ -0,0 +1,105 @@
@extends('layouts.app')
@section('content')
<div class="container mx-auto px-4 py-6">
<h1 class="text-2xl font-bold text-gray-800 mb-6">📝 Input Rapot (Format Baru)</h1>
<form action="{{ route('rapot.store', $siswa->id) }}" method="POST" class="bg-white shadow-lg rounded-xl overflow-hidden">
@csrf
<div class="bg-green-50 p-6 border-b border-green-100 grid grid-cols-3 gap-4">
<div>
<label class="font-bold text-sm">Tahun Ajaran</label>
<input type="text" name="tahun_ajaran" value="2025/2026" class="w-full border rounded p-2">
</div>
<div>
<label class="font-bold text-sm">Semester</label>
<select name="semester" class="w-full border rounded p-2">
<option value="1 (Satu)">1 (Satu)</option>
<option value="2 (Dua)">2 (Dua)</option>
</select>
</div>
<div>
<label class="font-bold text-sm">Tanggal Rapot</label>
<input type="date" name="tanggal_rapot" value="{{ date('Y-m-d') }}" class="w-full border rounded p-2">
</div>
</div>
<div class="p-6 space-y-6">
<div>
<label class="font-bold block mb-1">A. PENGEMBANGAN AL ISLAM, KE'AISYIYAHAN DAN KEMUHAMMADIYAHAN (AIK)</label>
<textarea name="narasi_aik" rows="5" class="w-full border rounded p-2" placeholder="Isi narasi AIK..."></textarea>
</div>
<div>
<label class="font-bold block mb-1">B. CAPAIAN PEMBELAJARAN NILAI AGAMA DAN BUDI PEKERTI</label>
<textarea name="narasi_nilai_agama" rows="5" class="w-full border rounded p-2" placeholder="Isi narasi Nilai Agama..."></textarea>
</div>
<div>
<label class="font-bold block mb-1">C. CAPAIAN PEMBELAJARAN JATI DIRI</label>
<textarea name="narasi_jati_diri" rows="5" class="w-full border rounded p-2" placeholder="Isi narasi Jati Diri..."></textarea>
</div>
<div>
<label class="font-bold block mb-1">D. CAPAIAN PEMBELAJARAN DASAR-DASAR LITERASI, MATEMATIKA, SAINS, TEKNOLOGI, REKAYASA, SENI</label>
<textarea name="narasi_literasi" rows="5" class="w-full border rounded p-2" placeholder="Isi narasi STEAM..."></textarea>
</div>
<div>
<label class="font-bold block mb-1">E. KOKURIKULER</label>
<textarea name="narasi_kokurikuler" rows="5" class="w-full border rounded p-2 bg-yellow-50" placeholder="Isi narasi Kokurikuler..."></textarea>
</div>
</div>
<div class="p-6 border-t bg-gray-50 grid grid-cols-2 gap-6">
<div>
<h3 class="font-bold mb-2">Pertumbuhan Fisik</h3>
<input type="text" name="berat_badan" placeholder="Berat Badan (kg)" class="w-full mb-2 border rounded p-2">
<input type="text" name="tinggi_badan" placeholder="Tinggi Badan (cm)" class="w-full mb-2 border rounded p-2">
<input type="text" name="lingkar_kepala" placeholder="Lingkar Kepala (cm)" class="w-full mb-2 border rounded p-2">
<input type="text" name="lingkar_lengan" placeholder="Lingkar Lengan (cm)" class="w-full border rounded p-2">
</div>
<div>
<h3 class="font-bold mb-2">Kehadiran (Hari)</h3>
<input type="number" name="sakit" placeholder="Sakit" class="w-full mb-2 border rounded p-2">
<input type="number" name="izin" placeholder="Izin" class="w-full mb-2 border rounded p-2">
<input type="number" name="alpha" placeholder="Alpha" class="w-full border rounded p-2">
</div>
</div>
<div class="p-6 border-t">
<div class="mb-4">
<label class="font-bold block mb-1">Refleksi Orang Tua</label>
<textarea name="refleksi_orang_tua" rows="2" class="w-full border rounded p-2"></textarea>
</div>
<div class="grid grid-cols-2 gap-6">
<div>
<label class="font-bold block mb-1">Nama Kepala Sekolah (Pengelola)</label>
<input type="text" name="nama_kepala_sekolah" value="TRI MARYA ENDARWATI, M.Pd" class="w-full border rounded p-2 bg-blue-50">
<input type="text" name="nbm_kepala_sekolah" value="NBM. 1420476" class="w-full border rounded p-2 mt-2 text-sm" placeholder="NBM/NIP">
</div>
<div>
<label class="font-bold block mb-1">Nama Guru Kelas</label>
<select name="nama_guru" class="w-full border rounded p-2 bg-blue-50 focus:ring-green-500 focus:border-green-500" required>
<option value="">-- Pilih Guru Kelas --</option>
@foreach($gurus as $guru)
<option value="{{ $guru->nama_guru }}">
{{ $guru->nama_guru }}
</option>
@endforeach
</select>
<p class="text-xs text-gray-500 mt-1">*Pilih nama guru kelas dari daftar.</p>
</div>
</div>
<div class="p-6 bg-gray-100 flex justify-end">
<button type="submit" class="bg-green-600 text-white font-bold py-3 px-8 rounded shadow">💾 Simpan Rapot</button>
</div>
</form>
</div>
@endsection

View File

@ -0,0 +1,221 @@
@extends('layouts.app')
@section('content')
<div class="container mx-auto px-4 py-6 bg-gray-100 min-h-screen">
<div class="flex justify-between items-center mb-6 no-print max-w-[21cm] mx-auto">
<div>
<h1 class="text-2xl font-bold text-gray-800">📄 Preview Rapot</h1>
</div>
<div class="flex gap-3">
<a href="{{ route('perkembangan.show', $rapot->siswa_id) }}" class="bg-gray-500 hover:bg-gray-600 text-white font-bold py-2 px-4 rounded shadow transition">
&larr; Kembali
</a>
<button onclick="window.print()" class="bg-blue-600 hover:bg-blue-700 text-white font-bold py-2 px-4 rounded shadow flex items-center gap-2 transition">
🖨️ Cetak / Simpan PDF
</button>
</div>
</div>
<div class="bg-white mx-auto max-w-[21cm] shadow-xl text-black relative print:shadow-none print:m-0 print:w-full"
style="min-height: 29.7cm; font-family: 'Times New Roman', Times, serif; border: 4px solid #000; padding: 3px;">
<div style="border: 1px solid #000; height: 100%; padding: 40px;">
<div class="text-center mb-8">
<h2 class="text-xl font-bold uppercase tracking-wider mb-2">Laporan Perkembangan Anak Didik</h2>
<h3 class="text-2xl font-bold uppercase mb-1">PAUD 'Aisyiyah Kartoharjo</h3>
<p class="text-base">Jln. Ciliwung II No. 22, Kartoharjo, Madiun</p>
<div style="border-bottom: 3px double black; margin-top: 1rem;"></div>
</div>
<div class="mb-8">
<table class="w-full text-base leading-loose">
<tr>
<td class="font-bold w-32">Nama Anak</td>
<td class="w-4">:</td>
<td class="uppercase font-semibold">{{ $rapot->siswa->nama_siswa }}</td>
<td class="font-bold w-32 text-right pl-4">Semester</td>
<td class="w-4 text-center">:</td>
<td>{{ $rapot->semester }}</td>
</tr>
<tr>
<td class="font-bold">NIS / NISN</td>
<td>:</td>
<td>{{ $rapot->siswa->nis }} / {{ $rapot->siswa->nisn ?? '-' }}</td>
<td class="font-bold text-right pl-4">Tahun Ajaran</td>
<td class="text-center">:</td>
<td>{{ $rapot->tahun_ajaran }}</td>
</tr>
<tr>
<td class="font-bold">Kelompok</td>
<td>:</td>
<td>{{ $rapot->siswa->kelompok_id ?? '-' }}</td>
<td colspan="3"></td>
</tr>
</table>
</div>
<div class="space-y-6 text-justify leading-relaxed text-lg">
<div>
<h3 class="font-bold text-lg mb-2">A. PENGEMBANGAN AL ISLAM, KE'AISYIYAHAN DAN KEMUHAMMADIYAHAN (AIK)</h3>
<div class="pl-8">
{!! nl2br(e($rapot->narasi_aik ?? '-')) !!}
</div>
</div>
<div>
<h3 class="font-bold text-lg mb-2">B. CAPAIAN PEMBELAJARAN NILAI AGAMA DAN BUDI PEKERTI</h3>
<div class="pl-8">
{!! nl2br(e($rapot->narasi_nilai_agama ?? '-')) !!}
</div>
</div>
<div>
<h3 class="font-bold text-lg mb-2">C. CAPAIAN PEMBELAJARAN JATI DIRI</h3>
<div class="pl-8">
{!! nl2br(e($rapot->narasi_jati_diri ?? '-')) !!}
</div>
</div>
<div>
<h3 class="font-bold text-lg mb-2">D. CAPAIAN PEMBELAJARAN DASAR-DASAR LITERASI, MATEMATIKA, SAINS, TEKNOLOGI, REKAYASA, SENI</h3>
<div class="pl-8">
{!! nl2br(e($rapot->narasi_literasi ?? '-')) !!}
</div>
</div>
<div>
<h3 class="font-bold text-lg mb-2">E. KOKURIKULER</h3>
<div class="pl-8">
{!! nl2br(e($rapot->narasi_kokurikuler ?? '-')) !!}
</div>
</div>
</div>
<div class="print:break-after-page mt-10"></div>
<div class="mt-8 grid grid-cols-2 gap-10">
<div>
<h3 class="font-bold text-lg mb-4 uppercase text-center" style="text-decoration: underline;">Pertumbuhan</h3>
<table class="w-full border-collapse border border-black text-base">
<tr class="bg-gray-200 print:bg-gray-300">
<td class="border border-black p-2 font-bold text-center">Aspek</td>
<td class="border border-black p-2 font-bold text-center">Hasil</td>
</tr>
<tr>
<td class="border border-black p-2 pl-4">Berat Badan</td>
<td class="border border-black p-2 text-center font-semibold">{{ $rapot->berat_badan }}</td>
</tr>
<tr>
<td class="border border-black p-2 pl-4">Tinggi Badan</td>
<td class="border border-black p-2 text-center font-semibold">{{ $rapot->tinggi_badan }}</td>
</tr>
<tr>
<td class="border border-black p-2 pl-4">Lingkar Kepala</td>
<td class="border border-black p-2 text-center font-semibold">{{ $rapot->lingkar_kepala }}</td>
</tr>
<tr>
<td class="border border-black p-2 pl-4">Lingkar Lengan</td>
<td class="border border-black p-2 text-center font-semibold">{{ $rapot->lingkar_lengan }}</td>
</tr>
</table>
</div>
<div>
<h3 class="font-bold text-lg mb-4 uppercase text-center" style="text-decoration: underline;">Kehadiran Anak</h3>
<table class="w-full border-collapse border border-black text-base">
<tr class="bg-gray-200 print:bg-gray-300">
<td class="border border-black p-2 font-bold text-center">Keterangan</td>
<td class="border border-black p-2 font-bold text-center">Jumlah</td>
</tr>
<tr>
<td class="border border-black p-2 pl-4">Sakit</td>
<td class="border border-black p-2 text-center font-semibold">{{ $rapot->sakit }} Hari</td>
</tr>
<tr>
<td class="border border-black p-2 pl-4">Izin</td>
<td class="border border-black p-2 text-center font-semibold">{{ $rapot->izin }} Hari</td>
</tr>
<tr>
<td class="border border-black p-2 pl-4">Tanpa Keterangan</td>
<td class="border border-black p-2 text-center font-semibold">{{ $rapot->alpha }} Hari</td>
</tr>
</table>
</div>
</div>
<div class="mt-12">
<h3 class="font-bold text-lg mb-2 uppercase">Refleksi Orang Tua</h3>
<div class="border-2 border-black p-4 h-32 rounded">
<p class="italic text-lg">{{ $rapot->refleksi_orang_tua ?? '' }}</p>
</div>
</div>
<div class="flex justify-between items-end mt-20 text-center text-base">
<div class="w-1/3 flex flex-col items-center">
<p class="mb-24">Orang Tua / Wali</p>
<p class="font-bold border-b border-black w-40"></p>
</div>
<div class="w-1/3 flex flex-col items-center">
<p>Mengetahui,</p>
<p class="mb-1 font-bold">Pengelola</p>
<p class="mb-16 font-bold">PAUD 'Aisyiyah Kartoharjo</p>
<p class="font-bold underline uppercase">{{ $rapot->nama_kepala_sekolah }}</p>
<p class="font-bold">NBM. {{ $rapot->nbm_kepala_sekolah }}</p>
</div>
<div class="w-1/3 flex flex-col items-center">
<p class="mb-1">Madiun, {{ \Carbon\Carbon::parse($rapot->tanggal_rapot)->translatedFormat('d F Y') }}</p>
<p class="mb-24">Guru Kelas</p>
<p class="font-bold border-b border-black w-40 uppercase">
{{ $rapot->nama_guru }}
</p>
</div>
</div>
</div> </div> </div>
{{-- CSS KHUSUS UNTUK PRINT & TAMPILAN KERTAS --}}
<style>
/* Mengatur agar tampilan web meniru kertas */
body {
background-color: #f3f4f6; /* Abu-abu muda di web */
}
/* Saat tombol CETAK diklik */
@media print {
@page {
size: A4;
margin: 1cm; /* Margin kertas saat diprint */
}
body {
background-color: white; /* Latar belakang putih saat print */
margin: 0;
}
.no-print {
display: none !important; /* Sembunyikan tombol saat print */
}
/* Paksa background warna (untuk tabel abu-abu) tercetak */
* {
-webkit-print-color-adjust: exact !important;
print-color-adjust: exact !important;
}
.shadow-xl {
box-shadow: none !important; /* Hilangkan bayangan saat print */
}
/* Pastikan bingkai tetap tercetak */
.max-w-\[21cm\] {
max-width: 100% !important;
width: 100% !important;
border: 4px solid #000 !important; /* Pastikan border luar tercetak tebal */
}
}
</style>
@endsection

View File

@ -1,55 +1,84 @@
@extends('layouts.app')
@section('content')
<div class="bg-white shadow-md rounded-lg p-6 max-w-2xl mx-auto">
<h1 class="text-xl font-semibold text-gray-700 mb-4">👶 Tambah Siswa</h1>
<div class="bg-white shadow-md rounded-lg p-6 max-w-xl mx-auto mt-10">
<div class="flex justify-between items-center mb-6">
<h1 class="text-xl font-bold text-gray-700"> Tambah Siswa Baru</h1>
<a href="{{ route('siswa.index') }}" class="text-gray-500 hover:text-gray-700">&larr; Kembali</a>
</div>
@if ($errors->any())
<div class="bg-red-100 border-l-4 border-red-500 text-red-700 p-4 mb-4">
<ul class="list-disc list-inside">
@foreach ($errors->all() as $error)
<li>{{ $error }}</li>
@endforeach
</ul>
</div>
@endif
<form action="{{ route('siswa.store') }}" method="POST">
@csrf
{{-- Dropdown Pilih Wali Murid --}}
<div class="mb-4">
<label class="block text-gray-700 font-bold mb-2">Wali Murid (Orang Tua)</label>
<select name="wali_id" class="w-full border rounded px-3 py-2 bg-gray-50 focus:ring focus:ring-green-300" required>
<option value="">-- Pilih Orang Tua --</option>
@foreach($walis as $wali)
<option value="{{ $wali->id }}">{{ $wali->nama_wali }} - ({{ Str::limit($wali->alamat, 30) }})</option>
<label class="block text-gray-700 font-medium mb-1">Wali Murid (Orang Tua)</label>
<select name="wali_murid_id" class="w-full border border-gray-300 rounded-lg p-2 focus:ring-2 focus:ring-green-500 focus:outline-none" required>
<option value="">-- Pilih Wali Murid --</option>
@foreach($wali_murids as $wali)
<option value="{{ $wali->id }}" {{ old('wali_murid_id') == $wali->id ? 'selected' : '' }}>
{{ $wali->nama_wali }}
</option>
@endforeach
</select>
<p class="text-xs text-gray-500 mt-1">*Jika nama orang tua tidak ada, tambahkan dulu di menu Wali Murid.</p>
</div>
<div class="mb-4">
<label class="block text-gray-700">Nama Siswa</label>
<input type="text" name="nama_siswa" class="w-full border rounded px-3 py-2 focus:ring focus:ring-green-300" required>
<p class="text-xs text-gray-500 mt-1">*Alamat siswa akan otomatis mengikuti alamat wali murid.</p>
</div>
<div class="grid grid-cols-2 gap-4 mb-4">
<div>
<label class="block text-gray-700">Tempat Lahir</label>
<input type="text" name="tempat_lahir" class="w-full border rounded px-3 py-2" placeholder="Contoh: Madiun" required>
<label class="block text-gray-700 font-medium mb-1">NIS (Lokal)</label>
<input type="text" name="nis" value="{{ old('nis') }}" class="w-full border border-gray-300 rounded-lg p-2 focus:ring-2 focus:ring-green-500 focus:outline-none" required placeholder="Contoh: 2024001">
</div>
<div>
<label class="block text-gray-700">Tanggal Lahir</label>
<input type="date" name="tanggal_lahir" class="w-full border rounded px-3 py-2" required>
<label class="block text-gray-700 font-medium mb-1">NISN (Nasional)</label>
<input type="text" name="nisn" value="{{ old('nisn') }}" class="w-full border border-gray-300 rounded-lg p-2 focus:ring-2 focus:ring-green-500 focus:outline-none" placeholder="Contoh: 0123456789">
</div>
</div>
<div class="mb-4">
<label class="block text-gray-700">Jenis Kelamin</label>
<div class="flex gap-4 mt-2">
<label class="block text-gray-700 font-medium mb-1">Nama Siswa</label>
<input type="text" name="nama_siswa" value="{{ old('nama_siswa') }}" class="w-full border border-gray-300 rounded-lg p-2 focus:ring-2 focus:ring-green-500 focus:outline-none" required>
</div>
<div class="grid grid-cols-2 gap-4 mb-4">
<div>
<label class="block text-gray-700 font-medium mb-1">Tempat Lahir</label>
<input type="text" name="tempat_lahir" value="{{ old('tempat_lahir') }}" class="w-full border border-gray-300 rounded-lg p-2 focus:ring-2 focus:ring-green-500 focus:outline-none" required>
</div>
<div>
<label class="block text-gray-700 font-medium mb-1">Tanggal Lahir</label>
<input type="date" name="tanggal_lahir" value="{{ old('tanggal_lahir') }}" class="w-full border border-gray-300 rounded-lg p-2 focus:ring-2 focus:ring-green-500 focus:outline-none" required>
</div>
</div>
<div class="mb-4">
<label class="block text-gray-700 font-medium mb-1">Jenis Kelamin</label>
<div class="flex gap-4">
<label class="inline-flex items-center">
<input type="radio" name="jenis_kelamin" value="L" class="text-green-600" required>
<input type="radio" name="jenis_kelamin" value="L" {{ old('jenis_kelamin') == 'L' ? 'checked' : '' }} class="form-radio text-green-600">
<span class="ml-2">Laki-laki</span>
</label>
<label class="inline-flex items-center">
<input type="radio" name="jenis_kelamin" value="P" class="text-green-600">
<input type="radio" name="jenis_kelamin" value="P" {{ old('jenis_kelamin') == 'P' ? 'checked' : '' }} class="form-radio text-green-600">
<span class="ml-2">Perempuan</span>
</label>
</div>
</div>
<button type="submit" class="bg-green-600 text-white px-6 py-2 rounded hover:bg-green-700 w-full">Simpan Data Siswa</button>
<div class="flex justify-end mt-6 gap-3">
<button type="submit" class="bg-green-600 text-white font-semibold px-6 py-2 rounded-lg hover:bg-green-700 transition shadow-md">
💾 Simpan Data
</button>
</div>
</form>
</div>
@endsection

View File

@ -1,73 +1,88 @@
@extends('layouts.app')
@section('content')
<div class="bg-white shadow-md rounded-lg p-6 max-w-2xl mx-auto">
<h1 class="text-xl font-semibold text-gray-700 mb-4">✏️ Edit Data Peserta Didik</h1>
<div class="bg-white shadow-md rounded-lg p-6 max-w-xl mx-auto mt-10">
<div class="flex justify-between items-center mb-6">
<h1 class="text-xl font-bold text-gray-700">✏️ Edit Data Siswa</h1>
<a href="{{ route('siswa.index') }}" class="text-gray-500 hover:text-gray-700">&larr; Kembali</a>
</div>
<form action="{{ route('siswa.update', $siswa->id) }}" method="POST" enctype="multipart/form-data">
@csrf
@method('PUT')
<div class="mb-4">
<label class="block text-gray-700 font-medium">Nama Anak</label>
<input type="text" name="nama" value="{{ old('nama', $siswa->nama) }}"
class="w-full border rounded px-3 py-2 focus:outline-none focus:ring focus:border-green-500">
@if ($errors->any())
<div class="bg-red-100 border-l-4 border-red-500 text-red-700 p-4 mb-4">
<ul class="list-disc list-inside">
@foreach ($errors->all() as $error)
<li>{{ $error }}</li>
@endforeach
</ul>
</div>
@endif
<form action="{{ route('siswa.update', $siswa->id) }}" method="POST">
@csrf
@method('PUT')
<div class="mb-4">
<label class="block text-gray-700 font-medium mb-1">Wali Murid (Orang Tua)</label>
<select name="wali_murid_id" class="w-full border border-gray-300 rounded-lg p-2 focus:ring-2 focus:ring-green-500 focus:outline-none" required>
<option value="">-- Pilih Wali Murid --</option>
@foreach($wali_murids as $wali)
<option value="{{ $wali->id }}" {{ $siswa->wali_murid_id == $wali->id ? 'selected' : '' }}>
{{ $wali->nama_wali }}
</option>
@endforeach
</select>
<p class="text-xs text-blue-600 mt-1">
Jika nama wali murid tidak ditemukan, silakan tambah data baru di menu
<a href="{{ route('wali-murid.index') }}" class="font-bold underline hover:text-blue-800">Data Wali Murid</a>.
</p>
</div>
<div class="grid grid-cols-2 gap-4 mb-4">
<div>
<label class="block text-gray-700 font-medium mb-1">NIS</label>
<input type="text" name="nis" value="{{ old('nis', $siswa->nis) }}" class="w-full border border-gray-300 rounded-lg p-2 focus:ring-2 focus:ring-green-500 focus:outline-none" required>
</div>
<div class="mb-4">
<label class="block text-gray-700 font-medium">Tempat Lahir</label>
<input type="text" name="tempat_lahir" value="{{ old('tempat_lahir', $siswa->tempat_lahir) }}"
class="w-full border rounded px-3 py-2 focus:outline-none focus:ring focus:border-green-500">
<div>
<label class="block text-gray-700 font-medium mb-1">NISN</label>
<input type="text" name="nisn" value="{{ old('nisn', $siswa->nisn) }}" class="w-full border border-gray-300 rounded-lg p-2 focus:ring-2 focus:ring-green-500 focus:outline-none">
</div>
<div class="mb-4">
<label class="block text-gray-700 font-medium">Tanggal Lahir</label>
<input type="date" name="tanggal_lahir" value="{{ old('tanggal_lahir', $siswa->tanggal_lahir) }}"
class="w-full border rounded px-3 py-2 focus:outline-none focus:ring focus:border-green-500">
</div>
<div class="mb-4">
<label class="block text-gray-700 font-medium mb-1">Nama Siswa</label>
<input type="text" name="nama_siswa" value="{{ old('nama_siswa', $siswa->nama_siswa) }}" class="w-full border border-gray-300 rounded-lg p-2 focus:ring-2 focus:ring-green-500 focus:outline-none" required>
</div>
<div class="grid grid-cols-2 gap-4 mb-4">
<div>
<label class="block text-gray-700 font-medium mb-1">Tempat Lahir</label>
<input type="text" name="tempat_lahir" value="{{ old('tempat_lahir', $siswa->tempat_lahir) }}" class="w-full border border-gray-300 rounded-lg p-2 focus:ring-2 focus:ring-green-500 focus:outline-none" required>
</div>
<div class="mb-4">
<label class="block text-gray-700 font-medium">Alamat</label>
<textarea name="alamat" rows="2"
class="w-full border rounded px-3 py-2 focus:outline-none focus:ring focus:border-green-500">{{ old('alamat', $siswa->alamat) }}</textarea>
<div>
<label class="block text-gray-700 font-medium mb-1">Tanggal Lahir</label>
<input type="date" name="tanggal_lahir" value="{{ old('tanggal_lahir', $siswa->tanggal_lahir) }}" class="w-full border border-gray-300 rounded-lg p-2 focus:ring-2 focus:ring-green-500 focus:outline-none" required>
</div>
<div class="grid grid-cols-2 gap-4 mb-4">
<div>
<label class="block text-gray-700 font-medium">Kelas</label>
<select name="kelas_id" class="w-full border rounded px-3 py-2 focus:outline-none focus:ring focus:border-green-500">
@foreach($kelas as $k)
<option value="{{ $k->id }}" {{ $k->id == $siswa->kelas_id ? 'selected' : '' }}>
{{ $k->nama_kelas }}
</option>
@endforeach
</select>
</div>
<div>
<label class="block text-gray-700 font-medium">Wali Murid</label>
<select name="wali_id" class="w-full border rounded px-3 py-2 focus:outline-none focus:ring focus:border-green-500">
@foreach($wali_murids as $wali)
<option value="{{ $wali->id }}" {{ $wali->id == $siswa->wali_id ? 'selected' : '' }}>
{{ $wali->nama_wali }}
</option>
@endforeach
</select>
</div>
</div>
<div class="mb-4">
<label class="block text-gray-700 font-medium mb-1">Jenis Kelamin</label>
<div class="flex gap-4">
<label class="inline-flex items-center">
<input type="radio" name="jenis_kelamin" value="L" {{ $siswa->jenis_kelamin == 'L' ? 'checked' : '' }} class="form-radio text-green-600">
<span class="ml-2">Laki-laki</span>
</label>
<label class="inline-flex items-center">
<input type="radio" name="jenis_kelamin" value="P" {{ $siswa->jenis_kelamin == 'P' ? 'checked' : '' }} class="form-radio text-green-600">
<span class="ml-2">Perempuan</span>
</label>
</div>
<div class="mb-4">
<label class="block text-gray-700 font-medium">Foto</label>
<input type="file" name="foto" class="w-full border rounded px-3 py-2 focus:outline-none focus:ring focus:border-green-500">
@if ($siswa->foto)
<img src="{{ asset('storage/' . $siswa->foto) }}" alt="Foto {{ $siswa->nama }}" class="mt-2 w-20 h-20 object-cover rounded">
@endif
</div>
<div class="flex justify-end space-x-2">
<a href="{{ route('siswa.index') }}" class="bg-gray-500 text-white px-4 py-2 rounded hover:bg-gray-600">Batal</a>
<button type="submit" class="bg-green-600 text-white px-4 py-2 rounded hover:bg-green-700">Perbarui</button>
</div>
</form>
</div>
<div class="flex justify-end mt-6 gap-3">
<button type="submit" class="bg-green-600 text-white font-semibold px-6 py-2 rounded-lg hover:bg-green-700 transition shadow-md">
💾 Simpan Perubahan
</button>
</div>
</form>
</div>
@endsection
@endsection

View File

@ -1,61 +1,92 @@
@extends('layouts.app')
@section('content')
<div class="bg-white shadow-md rounded-lg p-6">
<div class="flex justify-between items-center mb-4">
<h1 class="text-xl font-semibold text-gray-700">👶 Data Peserta Didik</h1>
<a href="{{ route('siswa.create') }}" class="bg-green-600 text-white px-4 py-2 rounded hover:bg-green-700">+ Tambah Siswa</a>
<div class="container mx-auto px-4">
<div class="flex justify-between items-center mb-6">
<h1 class="text-2xl font-bold text-gray-800">👶 Data Peserta Didik</h1>
<a href="{{ route('siswa.create') }}" class="bg-green-600 hover:bg-green-700 text-white font-bold py-2 px-4 rounded shadow-lg transition duration-200">
+ Tambah Siswa
</a>
</div>
@if(session('success'))
<div class="bg-green-100 border border-green-400 text-green-700 px-4 py-3 rounded relative mb-4">
{{ session('success') }}
<div class="bg-green-100 border-l-4 border-green-500 text-green-700 p-4 mb-4" role="alert">
<p>{{ session('success') }}</p>
</div>
@endif
<table class="w-full border-collapse">
<thead>
<tr class="bg-green-600 text-white text-left">
<th class="p-2">No</th>
<th class="p-2">Nama Siswa</th>
<th class="p-2">L/P</th>
<th class="p-2">TTL</th>
<th class="p-2">Orang Tua (Wali)</th>
<th class="p-2">Aksi</th>
</tr>
</thead>
<tbody>
@forelse ($siswas as $i => $siswa)
<tr class="border-b hover:bg-gray-50">
<td class="p-2">{{ $i + 1 }}</td>
<td class="p-2 font-bold">{{ $siswa->nama_siswa }}</td>
<td class="p-2">
<span class="badge {{ $siswa->jenis_kelamin == 'L' ? 'bg-blue-100 text-blue-800' : 'bg-pink-100 text-pink-800' }} px-2 py-1 rounded text-xs">
{{ $siswa->jenis_kelamin }}
</span>
</td>
<td class="p-2 text-sm">
{{ $siswa->tempat_lahir }}, {{ \Carbon\Carbon::parse($siswa->tanggal_lahir)->format('d-m-Y') }}
</td>
<td class="p-2">
{{-- Mengambil nama wali dari relasi --}}
{{ $siswa->wali->nama_wali ?? '⚠️ Data Wali Terhapus' }}
</td>
<td class="p-2 space-x-2">
<a href="{{ route('siswa.edit', $siswa->id) }}" class="text-blue-500 hover:underline">Edit</a>
<form action="{{ route('siswa.destroy', $siswa->id) }}" method="POST" class="inline" onsubmit="return confirm('Yakin hapus siswa ini?');">
@csrf
@method('DELETE')
<button type="submit" class="text-red-500 hover:underline">Hapus</button>
</form>
</td>
</tr>
@empty
<tr>
<td colspan="6" class="text-center text-gray-500 py-4">Belum ada data siswa.</td>
</tr>
@endforelse
</tbody>
</table>
<div class="bg-white shadow-md rounded-lg overflow-hidden">
<table class="min-w-full bg-white">
<thead class="bg-green-600 text-white">
<tr>
<th class="py-3 px-4 text-left uppercase font-semibold text-sm">No</th>
<th class="py-3 px-4 text-left uppercase font-semibold text-sm">NIS / NISN</th>
<th class="py-3 px-4 text-left uppercase font-semibold text-sm">Nama Siswa</th>
<th class="py-3 px-4 text-center uppercase font-semibold text-sm">L/P</th>
<th class="py-3 px-4 text-left uppercase font-semibold text-sm">TTL</th>
<th class="py-3 px-4 text-left uppercase font-semibold text-sm">Wali Murid / Alamat</th>
<th class="py-3 px-4 text-center uppercase font-semibold text-sm">Aksi</th>
</tr>
</thead>
<tbody class="text-gray-700">
@forelse($siswas as $index => $siswa)
<tr class="hover:bg-gray-100 border-b">
<td class="py-3 px-4">{{ $index + 1 }}</td>
<td class="py-3 px-4">
<div class="font-bold text-gray-700">{{ $siswa->nis ?? '-' }}</div>
<div class="text-xs text-gray-500">{{ $siswa->nisn ?? '-' }}</div>
</td>
<td class="py-3 px-4 font-medium">{{ $siswa->nama_siswa }}</td>
<td class="py-3 px-4 text-center">
<span class="px-2 py-1 rounded text-xs font-bold {{ $siswa->jenis_kelamin == 'L' ? 'bg-blue-100 text-blue-800' : 'bg-pink-100 text-pink-800' }}">
{{ $siswa->jenis_kelamin }}
</span>
</td>
<td class="py-3 px-4 text-sm">
{{ $siswa->tempat_lahir }}, {{ date('d-m-Y', strtotime($siswa->tanggal_lahir)) }}
</td>
<td class="py-3 px-4">
@if($siswa->wali_murid)
<div class="text-sm font-semibold text-gray-800">{{ $siswa->wali_murid->nama_wali }}</div>
{{-- Tampilkan Alamat dari Wali Murid --}}
<div class="text-xs text-gray-500 mt-1">🏠 {{ Str::limit($siswa->wali_murid->alamat, 30) }}</div>
@if(!empty($siswa->wali_murid->no_hp) && $siswa->wali_murid->no_hp != '-')
<div class="text-xs text-gray-500">📞 {{ $siswa->wali_murid->no_hp }}</div>
@endif
@else
<span class="text-red-500 text-xs italic bg-red-100 px-2 py-1 rounded">⚠️ Belum diset</span>
@endif
</td>
<td class="py-3 px-4 text-center">
<div class="flex items-center justify-center gap-4">
<a href="{{ route('siswa.edit', $siswa->id) }}" class="text-blue-500 hover:text-blue-700 hover:underline transition duration-150">
Edit
</a>
<form action="{{ route('siswa.destroy', $siswa->id) }}" method="POST" onsubmit="return confirm('Yakin ingin menghapus data siswa ini?');" class="m-0">
@csrf
@method('DELETE')
<button type="submit" class="text-red-500 hover:text-red-700 hover:underline transition duration-150">
Hapus
</button>
</form>
</div>
</td>
</tr>
@empty
<tr>
<td colspan="7" class="text-center py-6 text-gray-500">
Belum ada data siswa.
</td>
</tr>
@endforelse
</tbody>
</table>
</div>
</div>
@endsection

View File

@ -1,34 +1,64 @@
@extends('layouts.app')
@section('content')
<div class="bg-white shadow-md rounded-lg p-6 max-w-xl mx-auto">
<h1 class="text-xl font-semibold text-gray-700 mb-4">✏️ Edit Wali Murid</h1>
<div class="bg-white shadow-md rounded-lg p-6 max-w-xl mx-auto mt-10">
<div class="flex justify-between items-center mb-6">
<h1 class="text-xl font-bold text-gray-700">✏️ Edit Wali Murid</h1>
<a href="{{ route('wali-murid.index') }}" class="text-gray-500 hover:text-gray-700">&larr; Kembali</a>
</div>
<form action="{{ route('wali-murid.update', $wali_murid->id) }}" method="POST">
@if ($errors->any())
<div class="bg-red-100 border-l-4 border-red-500 text-red-700 p-4 mb-4" role="alert">
<p class="font-bold">Gagal Menyimpan:</p>
<ul class="list-disc list-inside">
@foreach ($errors->all() as $error)
<li>{{ $error }}</li>
@endforeach
</ul>
</div>
@endif
{{-- PERHATIKAN: DI SINI KITA PAKAI $data (BUKAN $wali_murid) --}}
<form action="{{ route('wali-murid.update', $data->id) }}" method="POST">
@csrf
@method('PUT')
<div class="mb-4">
<label class="block text-gray-700 mb-1">Nama Wali Murid</label>
<input type="text" name="nama_wali" value="{{ $wali_murid->nama_wali }}" class="w-full border rounded px-3 py-2 focus:ring focus:ring-green-300" required>
<label class="block text-gray-700 font-medium mb-1">Nama Wali</label>
{{-- PERHATIKAN: value="{{ old('nama_wali', $data->nama_wali) }}" --}}
<input type="text" name="nama_wali"
value="{{ old('nama_wali', $data->nama_wali) }}"
class="w-full border border-gray-300 rounded-lg p-2 focus:ring-2 focus:ring-green-500 focus:outline-none"
required>
</div>
<div class="mb-4">
<label class="block text-gray-700 mb-1">Email</label>
<input type="email" name="email" value="{{ $wali_murid->email }}" class="w-full border rounded px-3 py-2 focus:ring focus:ring-green-300">
<label class="block text-gray-700 font-medium mb-1">Email (Login)</label>
<input type="email" name="email"
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">
</div>
<div class="mb-4">
<label class="block text-gray-700 font-medium mb-1">No HP</label>
<input type="text" name="no_hp"
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">
</div>
<div class="mb-4">
<label class="block text-gray-700 mb-1">No HP</label>
<input type="text" name="no_hp" value="{{ $wali_murid->no_hp }}" class="w-full border rounded px-3 py-2 focus:ring focus:ring-green-300">
<label class="block text-gray-700 font-medium mb-1">Alamat</label>
<textarea name="alamat" rows="3"
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) }}</textarea>
</div>
<div class="mb-4">
<label class="block text-gray-700 mb-1">Alamat</label>
<textarea name="alamat" class="w-full border rounded px-3 py-2 focus:ring focus:ring-green-300">{{ $wali_murid->alamat }}</textarea>
<div class="flex justify-end mt-6 gap-3">
<button type="submit"
class="bg-green-600 text-white font-semibold px-6 py-2 rounded-lg hover:bg-green-700 transition duration-200 shadow-md">
💾 Simpan Perubahan
</button>
</div>
<button type="submit" class="bg-blue-500 text-white px-4 py-2 rounded hover:bg-blue-600">Perbarui</button>
</form>
</div>
@endsection
@endsection

View File

@ -1,55 +1,64 @@
@extends('layouts.app')
@section('content')
<div class="bg-white shadow-md rounded-lg p-6 max-w-xl mx-auto">
<h1 class="text-xl font-semibold text-gray-700 mb-4">✏️ Edit Data Wali Murid</h1>
<div class="bg-white shadow-md rounded-lg p-6 max-w-xl mx-auto mt-10">
<div class="flex justify-between items-center mb-6">
<h1 class="text-xl font-bold text-gray-700">✏️ Edit Wali Murid</h1>
<a href="{{ route('wali-murid.index') }}" class="text-gray-500 hover:text-gray-700">&larr; Kembali</a>
</div>
<form action="{{ route('wali-murid.update', $wali_murid->id) }}" method="POST">
@if ($errors->any())
<div class="bg-red-100 border-l-4 border-red-500 text-red-700 p-4 mb-4" role="alert">
<p class="font-bold">Gagal Menyimpan:</p>
<ul class="list-disc list-inside">
@foreach ($errors->all() as $error)
<li>{{ $error }}</li>
@endforeach
</ul>
</div>
@endif
{{-- KITA PAKAI VARIABEL $data (Sesuai Controller) --}}
<form action="{{ route('wali-murid.update', $data->id) }}" method="POST">
@csrf
@method('PUT')
<!-- Nama Wali -->
<div class="mb-4">
<label class="block text-gray-700 font-medium">Nama Wali</label>
<input type="text" name="nama_wali"
value="{{ old('nama_wali', $wali_murid->nama_wali) }}"
class="w-full border-gray-300 rounded-lg p-2 focus:ring-green-500 focus:border-green-500">
<label class="block text-gray-700 font-medium mb-1">Nama Wali</label>
<input type="text" name="nama_wali"
value="{{ old('nama_wali', $data->nama_wali) }}"
class="w-full border border-gray-300 rounded-lg p-2 focus:ring-2 focus:ring-green-500 focus:outline-none"
required>
</div>
<!-- Email -->
<div class="mb-4">
<label class="block text-gray-700 font-medium">Email</label>
<label class="block text-gray-700 font-medium mb-1">Email (Login)</label>
{{-- Gunakan $data->user --}}
<input type="email" name="email"
value="{{ old('email', $wali_murid->email) }}"
class="w-full border-gray-300 rounded-lg p-2 focus:ring-green-500 focus:border-green-500">
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">
</div>
<!-- No HP -->
<div class="mb-4">
<label class="block text-gray-700 font-medium">No HP</label>
<label class="block text-gray-700 font-medium mb-1">No HP</label>
<input type="text" name="no_hp"
value="{{ old('no_hp', $wali_murid->no_hp) }}"
class="w-full border-gray-300 rounded-lg p-2 focus:ring-green-500 focus:border-green-500">
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">
</div>
<!-- Alamat -->
<div class="mb-4">
<label class="block text-gray-700 font-medium">Alamat</label>
<label class="block text-gray-700 font-medium mb-1">Alamat</label>
<textarea name="alamat" rows="3"
class="w-full border-gray-300 rounded-lg p-2 focus:ring-green-500 focus:border-green-500">{{ old('alamat', $wali_murid->alamat) }}</textarea>
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) }}</textarea>
</div>
<!-- Tombol -->
<div class="flex justify-end mt-6 gap-3">
<a href="{{ route('wali-murid.index') }}"
class="bg-gray-500 text-white px-5 py-2 rounded hover:bg-gray-600 transition">
Batal
</a>
<button type="submit"
class="bg-green-600 text-white px-5 py-2 rounded hover:bg-green-700 transition">
Perbarui
<button type="submit"
class="bg-green-600 text-white font-semibold px-6 py-2 rounded-lg hover:bg-green-700 transition duration-200 shadow-md">
💾 Simpan Perubahan
</button>
</div>
</form>
</div>
@endsection
@endsection

View File

@ -46,8 +46,8 @@ class="block p-2 hover:bg-green-700 rounded">
</ul>
</div>
<a href="#" class="flex items-center p-2 rounded-lg hover:bg-green-700 transition">
<i class="fas fa-bus mr-3"></i> Penjemputan
<a href="{{ route('penjemputan.index') }}" class="flex items-center ...">
<i class="fas fa-bus me-2"></i> Penjemputan
</a>
</nav>
</aside>

View File

@ -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');
});
});