MIF_E31230356/app/Http/Controllers/Admin/GuruController.php

220 lines
7.0 KiB
PHP

<?php
namespace App\Http\Controllers\Admin;
use App\Http\Controllers\Controller;
use App\Models\Guru;
use App\Models\Mapel;
use App\Models\Kelas;
use App\Models\Mengajar;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Hash;
use Barryvdh\DomPDF\Facade\Pdf;
class GuruController extends Controller
{
public function index(Request $request)
{
$query = Guru::with('mengajars.mapel', 'mengajars.kelas');
if ($request->filled('search')) {
$search = $request->search;
$query->where(function($q) use ($search) {
$q->where('nama', 'like', "%$search%")
->orWhere('nip', 'like', "%$search%");
});
}
$perPage = $request->get('perPage', 10);
$gurus = $query->paginate($perPage)->appends($request->all());
$mapels = Mapel::all();
$kelas = Kelas::all();
return view('admin.guru.index', compact('gurus', 'mapels', 'kelas'));
}
public function create()
{
return view('admin.guru.create');
}
/**
* Tambah guru + bisa pilih banyak pasangan (mapel, kelas)
* Input: mapel[] dan kelas[] dengan index yang bersesuaian
*/
public function store(Request $request)
{
$request->validate([
'nip' => 'required|string|max:30|unique:gurus,nip',
'nama' => 'required|string|max:100',
'password' => 'required|string|min:6',
'id_mapel' => 'required|array|min:1',
'id_mapel.*' => 'required|exists:mapels,id_mapel',
'id_kelas' => 'required|array|min:1',
'id_kelas.*' => 'required|exists:kelas,id_kelas',
], [
'id_mapel.required' => 'Pilih minimal 1 mata pelajaran.',
'id_kelas.required' => 'Pilih minimal 1 kelas.',
]);
$guru = Guru::create([
'nip' => $request->nip,
'nama' => $request->nama,
'password' => Hash::make($request->password),
]);
foreach ($request->id_mapel as $i => $idMapel) {
$idKelas = $request->id_kelas[$i] ?? $request->id_kelas[0];
Mengajar::updateOrCreate(
[
'id_mapel' => $idMapel,
'id_kelas' => $idKelas,
'id_guru' => null,
],
[
'id_guru' => $guru->id_guru,
]
);
}
return redirect()->route('admin.guru.index')
->with('success', 'Data guru berhasil ditambahkan.');
}
public function show(string $id)
{
$guru = Guru::findOrFail($id);
return view('admin.guru.show', compact('guru'));
}
public function edit(string $id)
{
$guru = Guru::findOrFail($id);
return view('admin.guru.edit', compact('guru'));
}
/**
* Update guru — hapus semua mengajar lama, insert ulang
*/
public function update(Request $request, string $id)
{
$guru = Guru::findOrFail($id);
$request->validate([
'nip' => 'required|string|max:30|unique:gurus,nip,' . $guru->id_guru . ',id_guru',
'nama' => 'required|string|max:100',
'password' => 'nullable|string|min:6',
'id_mapel' => 'required|array|min:1',
'id_mapel.*' => 'required|exists:mapels,id_mapel',
'id_kelas' => 'required|array|min:1',
'id_kelas.*' => 'required|exists:kelas,id_kelas',
]);
$guru->nip = $request->nip;
$guru->nama = $request->nama;
if ($request->filled('password')) {
$guru->password = Hash::make($request->password);
}
$guru->save();
// Hapus semua data mengajar lama, insert ulang
Mengajar::where('id_guru', $guru->id_guru)->delete();
foreach ($request->id_mapel as $i => $idMapel) {
$idKelas = $request->id_kelas[$i] ?? $request->id_kelas[0];
Mengajar::updateOrCreate(
[
'id_mapel' => $idMapel,
'id_kelas' => $idKelas,
'id_guru' => null,
],
[
'id_guru' => $guru->id_guru,
]
);
}
return redirect()->route('admin.guru.index')
->with('success', 'Data guru berhasil diupdate.');
}
public function destroy(string $id)
{
$guru = Guru::findOrFail($id);
$guru->delete();
return redirect()->route('admin.guru.index')
->with('success', 'Data guru berhasil dihapus.');
}
public function downloadPdf(Request $request)
{
$query = Guru::with('mengajars.mapel', 'mengajars.kelas');
if ($request->filled('search')) {
$search = $request->search;
$query->where(function($q) use ($search) {
$q->where('nama', 'like', "%$search%")
->orWhere('nip', 'like', "%$search%");
});
}
$gurus = $query->get();
$pdf = Pdf::loadView('admin.guru.pdf', compact('gurus'))
->setPaper('a4', 'landscape');
return $pdf->download('daftar-guru-' . date('Ymd') . '.pdf');
}
public function downloadExcel(Request $request)
{
$query = Guru::with('mengajars.mapel', 'mengajars.kelas');
if ($request->filled('search')) {
$search = $request->search;
$query->where(function($q) use ($search) {
$q->where('nama', 'like', "%$search%")
->orWhere('nip', 'like', "%$search%");
});
}
$gurus = $query->get();
$filename = 'daftar-guru-' . date('Ymd') . '.csv';
$headers = [
'Content-Type' => 'text/csv',
'Content-Disposition' => "attachment; filename=\"$filename\"",
];
$callback = function () use ($gurus) {
$file = fopen('php://output', 'w');
// BOM agar Excel bisa baca UTF-8
fprintf($file, chr(0xEF).chr(0xBB).chr(0xBF));
fputcsv($file, ['No', 'Nama', 'NIP', 'Mata Pelajaran', 'Kelas']);
foreach ($gurus as $i => $guru) {
$mapels = $guru->mengajars->map(fn($m) => optional($m->mapel)->nama_mapel ?? '-')->join(', ');
$kelas = $guru->mengajars->map(fn($m) => (optional($m->kelas)->tingkat . ' ' . optional($m->kelas)->nama_kelas))->join(', ');
fputcsv($file, [$i + 1, $guru->nama, $guru->nip, $mapels, $kelas]);
}
fclose($file);
};
return response()->stream($callback, 200, $headers);
}
/**
* API: Ambil kelas yang memiliki mapel tertentu (lewat tabel mengajars)
* Dipanggil via AJAX saat admin pilih mapel di modal
*/
public function getKelasByMapel(Request $request)
{
$idMapel = $request->id_mapel;
// Cari kelas yang sudah punya mapel ini di tabel mengajars
$kelasList = Kelas::whereHas('mengajars', function ($q) use ($idMapel) {
$q->where('id_mapel', $idMapel);
})
->get(['id_kelas', 'nama_kelas', 'tingkat']);
return response()->json($kelasList);
}
}