198 lines
6.6 KiB
PHP
198 lines
6.6 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers\Admin;
|
|
|
|
use App\Http\Controllers\Controller;
|
|
use App\Models\Siswa;
|
|
use App\Models\Kelas;
|
|
use App\Models\User;
|
|
use App\Models\TahunAjaran;
|
|
use App\Imports\SiswaImport;
|
|
use App\Exports\SiswaExport;
|
|
use Maatwebsite\Excel\Facades\Excel;
|
|
use Illuminate\Http\Request;
|
|
use Illuminate\Support\Facades\Hash;
|
|
use Illuminate\Support\Facades\Log;
|
|
|
|
class SiswaController extends Controller
|
|
{
|
|
public function index(Request $request)
|
|
{
|
|
$kelasId = $request->kelas_id;
|
|
$tahunAjaranId = $request->tahun_ajaran_id;
|
|
|
|
$tahunAjaranList = TahunAjaran::where('status', 'aktif')->orderBy('tahun', 'desc')->get();
|
|
|
|
$query = Siswa::with(['kelas', 'tahunAjaran', 'user']);
|
|
|
|
if ($tahunAjaranId) {
|
|
$query->where('tahun_ajaran_id', $tahunAjaranId);
|
|
}
|
|
|
|
if ($kelasId) {
|
|
$query->where('kelas_id', $kelasId);
|
|
}
|
|
|
|
$data = $query->paginate(15);
|
|
$kelasList = Kelas::all();
|
|
|
|
return view('admin.siswa.index', compact('data', 'kelasList', 'tahunAjaranList'))
|
|
->with('success', session('success'))
|
|
->withErrors(session('error'));
|
|
}
|
|
|
|
public function create()
|
|
{
|
|
$kelasList = Kelas::all();
|
|
$tahunAjaranList = TahunAjaran::orderBy('tahun', 'desc')->get();
|
|
return view('admin.siswa.create', compact('kelasList', 'tahunAjaranList'));
|
|
}
|
|
|
|
public function store(Request $request)
|
|
{
|
|
try {
|
|
$tahunAjaran = TahunAjaran::where('status', 'aktif')->first();
|
|
|
|
$request->validate([
|
|
'nisn' => 'required|unique:siswa,nisn',
|
|
'nama' => 'required',
|
|
'email' => 'required|email|unique:users,email',
|
|
'kelas_id' => 'required|exists:kelas,id',
|
|
'alamat' => 'nullable',
|
|
'jenis_kelamin' => 'required|in:L,P',
|
|
]);
|
|
|
|
$user = User::create([
|
|
'name' => $request->nama,
|
|
'email' => $request->email,
|
|
'password' => Hash::make('defaultpassword'),
|
|
'role' => 'siswa',
|
|
'is_active' => 1,
|
|
]);
|
|
|
|
Siswa::create([
|
|
'user_id' => $user->id,
|
|
'nisn' => $request->nisn,
|
|
'nama' => $request->nama,
|
|
'kelas_id' => $request->kelas_id,
|
|
'alamat' => $request->alamat,
|
|
'jenis_kelamin' => $request->jenis_kelamin,
|
|
'tahun_ajaran_id' => $tahunAjaran->id ?? null,
|
|
]);
|
|
|
|
return redirect()->route('admin.siswa.index')->with('success', 'Data siswa berhasil ditambahkan');
|
|
} catch (\Exception $e) {
|
|
Log::error('Gagal menambahkan siswa: ' . $e->getMessage());
|
|
return back()->withInput()->withErrors('Terjadi kesalahan saat menambahkan siswa.');
|
|
}
|
|
}
|
|
|
|
public function edit($id)
|
|
{
|
|
$siswa = Siswa::with(['user', 'kelas', 'tahunAjaran'])->findOrFail($id);
|
|
$kelasList = Kelas::all();
|
|
$tahunAjaranList = TahunAjaran::all();
|
|
return view('admin.siswa.edit', compact('siswa', 'kelasList', 'tahunAjaranList'));
|
|
}
|
|
|
|
public function update(Request $request, $id)
|
|
{
|
|
try {
|
|
$siswa = Siswa::with('user')->findOrFail($id);
|
|
$user = $siswa->user;
|
|
|
|
$request->validate([
|
|
'nisn' => 'required|unique:siswa,nisn,' . $siswa->id,
|
|
'nama' => 'required',
|
|
'email' => 'required|email|unique:users,email,' . $user->id,
|
|
'password' => 'nullable|min:6',
|
|
'alamat' => 'nullable',
|
|
'jenis_kelamin' => 'required|in:L,P',
|
|
'kelas_id' => 'required|exists:kelas,id',
|
|
'tahun_ajaran_id' => 'required|exists:tahun_ajaran,id',
|
|
]);
|
|
|
|
$user->name = $request->nama;
|
|
$user->email = $request->email;
|
|
if ($request->filled('password')) {
|
|
$user->password = Hash::make($request->password);
|
|
}
|
|
$user->save();
|
|
|
|
$siswa->update([
|
|
'nisn' => $request->nisn,
|
|
'nama' => $request->nama,
|
|
'alamat' => $request->alamat,
|
|
'jenis_kelamin' => $request->jenis_kelamin,
|
|
'kelas_id' => $request->kelas_id,
|
|
'tahun_ajaran_id' => $request->tahun_ajaran_id,
|
|
]);
|
|
|
|
return redirect()->route('admin.siswa.index')->with('success', 'Data siswa berhasil diperbarui');
|
|
} catch (\Exception $e) {
|
|
Log::error('Gagal mengupdate siswa: ' . $e->getMessage());
|
|
return back()->withInput()->withErrors('Terjadi kesalahan saat memperbarui data siswa.');
|
|
}
|
|
}
|
|
|
|
public function destroy($id)
|
|
{
|
|
try {
|
|
$siswa = Siswa::findOrFail($id);
|
|
$user = $siswa->user;
|
|
|
|
$siswa->delete();
|
|
if ($user) {
|
|
$user->delete();
|
|
}
|
|
|
|
return back()->with('success', 'Data siswa berhasil dihapus');
|
|
} catch (\Exception $e) {
|
|
Log::error('Gagal menghapus siswa: ' . $e->getMessage());
|
|
return back()->withErrors('Terjadi kesalahan saat menghapus data siswa.');
|
|
}
|
|
}
|
|
|
|
public function import(Request $request)
|
|
{
|
|
try {
|
|
$request->validate([
|
|
'file' => 'required|mimes:xlsx,xls',
|
|
]);
|
|
|
|
Excel::import(new SiswaImport, $request->file('file'));
|
|
|
|
return back()->with('success', 'Import data siswa berhasil!');
|
|
} catch (\Exception $e) {
|
|
Log::error('Import siswa gagal: ' . $e->getMessage());
|
|
return back()->withErrors('Terjadi kesalahan saat mengimpor data siswa.');
|
|
}
|
|
}
|
|
|
|
public function export()
|
|
{
|
|
return Excel::download(new SiswaExport, 'data_siswa.xlsx');
|
|
}
|
|
|
|
public function siswaLulus(Request $request)
|
|
{
|
|
$filterTahunAjaranId = $request->tahun_ajaran_id;
|
|
$tahunAjaranLulus = TahunAjaran::where('status', 'lulus')->pluck('id');
|
|
|
|
if ($filterTahunAjaranId) {
|
|
$tahunAjaranLulus = $tahunAjaranLulus->filter(function ($id) use ($filterTahunAjaranId) {
|
|
return $id == $filterTahunAjaranId;
|
|
});
|
|
}
|
|
|
|
$data = Siswa::with(['kelas', 'tahunAjaran', 'user'])
|
|
->whereIn('tahun_ajaran_id', $tahunAjaranLulus)
|
|
->paginate(15);
|
|
|
|
$kelasList = Kelas::all();
|
|
$tahunAjaranList = TahunAjaran::where('status', 'lulus')->get();
|
|
|
|
return view('admin.siswa.lulus', compact('data', 'kelasList', 'tahunAjaranList'));
|
|
}
|
|
}
|