ihir
### ✅ 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:
parent
ad1d7b2b93
commit
ec9b09eedc
|
|
@ -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)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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.');
|
||||
}
|
||||
}
|
||||
|
|
@ -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'));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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'));
|
||||
}
|
||||
}
|
||||
|
|
@ -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!');
|
||||
}
|
||||
}
|
||||
|
|
@ -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.');
|
||||
}
|
||||
}
|
||||
|
|
@ -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,
|
||||
]
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,10 @@
|
|||
<?php
|
||||
|
||||
namespace App\Models;
|
||||
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
|
||||
class Anekdot extends Model
|
||||
{
|
||||
//
|
||||
}
|
||||
|
|
@ -0,0 +1,10 @@
|
|||
<?php
|
||||
|
||||
namespace App\Models;
|
||||
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
|
||||
class HasilKarya extends Model
|
||||
{
|
||||
//
|
||||
}
|
||||
|
|
@ -0,0 +1,10 @@
|
|||
<?php
|
||||
|
||||
namespace App\Models;
|
||||
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
|
||||
class Indikator extends Model
|
||||
{
|
||||
//
|
||||
}
|
||||
|
|
@ -0,0 +1,10 @@
|
|||
<?php
|
||||
|
||||
namespace App\Models;
|
||||
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
|
||||
class PenilaianCeklis extends Model
|
||||
{
|
||||
//
|
||||
}
|
||||
|
|
@ -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');
|
||||
}
|
||||
}
|
||||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
@ -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');
|
||||
}
|
||||
}
|
||||
|
|
@ -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",
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
|
|
|
|||
|
|
@ -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');
|
||||
}
|
||||
};
|
||||
|
|
@ -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');
|
||||
}
|
||||
};
|
||||
|
|
@ -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');
|
||||
}
|
||||
};
|
||||
|
|
@ -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');
|
||||
}
|
||||
|
||||
|
||||
};
|
||||
|
|
@ -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');
|
||||
}
|
||||
};
|
||||
|
|
@ -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');
|
||||
}
|
||||
};
|
||||
|
|
@ -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');
|
||||
}
|
||||
};
|
||||
|
|
@ -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');
|
||||
}
|
||||
};
|
||||
|
|
@ -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();
|
||||
});
|
||||
}
|
||||
};
|
||||
|
|
@ -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');
|
||||
}
|
||||
};
|
||||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
@ -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">← 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
|
||||
|
|
@ -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
|
||||
|
|
@ -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">
|
||||
© {{ date('Y') }} PAUD Aisyiyah Monitoring System
|
||||
</div>
|
||||
</div>
|
||||
@endsection
|
||||
@endsection
|
||||
|
|
@ -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">← 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
|
||||
|
|
@ -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
|
||||
|
|
@ -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">
|
||||
← 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
|
||||
|
|
@ -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">← 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
|
||||
|
|
@ -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">← 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
|
||||
|
|
@ -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
|
||||
|
|
@ -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">← 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
|
||||
|
|
@ -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">← 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
|
||||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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');
|
||||
});
|
||||
|
||||
});
|
||||
Loading…
Reference in New Issue