penjadwalan-ga/app/Http/Controllers/Admin/GuruController.php

496 lines
19 KiB
PHP

<?php
namespace App\Http\Controllers\Admin;
use App\Http\Controllers\Controller;
use App\Models\DivisiGuru;
use App\Models\Guru;
use App\Models\JadwalKelas;
use App\Models\Kelas;
use App\Models\Logbooks;
use App\Models\PengajarLogbook;
use App\Models\User;
use Illuminate\Database\QueryException;
use Illuminate\Http\Request;
use Illuminate\Support\Carbon;
class GuruController extends Controller
{
public function index(){
$divisi_guru = DivisiGuru::all();
$data = Guru::orderByRaw("FIELD(status, 'Aktif', 'Non Aktif')")->orderBy('start_join', 'asc')->get();
return view('admin.pages.guru', compact('data', 'divisi_guru'));
}
public function generateNID($date)
{
$tahunMasuk = date('Y', strtotime($date));
$lastPegawai = Guru::whereYear('created_at', $tahunMasuk)->latest('id')->first();
if ($lastPegawai) {
$lastNumber = (int) substr($lastPegawai->nid, -4);
$newNumber = str_pad($lastNumber + 1, 4, '0', STR_PAD_LEFT);
} else {
$newNumber = '0001';
}
return $tahunMasuk . $newNumber;
}
public function getDataGuru(){
$data = Guru::all();
return response()->json([
'Semua' => $data->count(),
'Aktif' => $data->where('status', 'Aktif')->count(),
'Non-Aktif' => $data->where('status', 'Non Aktif')->count(),
]
);
}
public function dateFormat($date){
$tanggalparse = $date
? Carbon::parse($date)->locale('id')->translatedFormat('d F Y')
: null;
return $tanggalparse;
}
public function show($id, Request $request){
$divisi_guru = DivisiGuru::all();
$guru = Guru::findOrFail($id);
// ====== Alltime Stats ======
// Sesi/Kelas dari JadwalKelas dan Logbook
$kelasIdsJadwal = JadwalKelas::where('guru_id', $id)->pluck('kelas_id');
$kelasIdsLogbook = Logbooks::where('guru_id', $id)->pluck('kelas_id');
$kelasIds = $kelasIdsJadwal->concat($kelasIdsLogbook)->unique()->filter();
$kelasPic = Kelas::whereIn('id', $kelasIds)->get();
$sesiPic = Logbooks::whereIn('kelas_id', $kelasIds)->count();
$sesiCompleted = Logbooks::whereIn('kelas_id', $kelasIds)->where('status', 'completed')->count();
$jumlahKelas = $kelasPic->count();
// Sesi sebagai pengajar (via logbook.guru_id)
$sesiPengajar = Logbooks::where('guru_id', $id)->count();
// ====== Rekap per Semester ======
$semestersPic = Kelas::whereIn('id', $kelasIds)
->whereNotNull('semester')
->whereNotNull('tahun_ajaran')
->select('semester', 'tahun_ajaran')
->distinct()
->get()
->toBase()
->map(fn($k) => ['semester' => $k->semester, 'tahun_ajaran' => $k->tahun_ajaran]);
$semestersPengajar = Logbooks::where('guru_id', $id)
->join('kelas', 'logbook.kelas_id', '=', 'kelas.id')
->whereNotNull('kelas.semester')
->whereNotNull('kelas.tahun_ajaran')
->select('kelas.semester', 'kelas.tahun_ajaran')
->distinct()
->get()
->toBase()
->map(fn($k) => ['semester' => $k->semester, 'tahun_ajaran' => $k->tahun_ajaran]);
// Gabungkan dan deduplikasi semester
$allSemesters = $semestersPic->concat($semestersPengajar)
->filter(fn($s) => !empty($s['semester']) && !empty($s['tahun_ajaran']))
->unique(fn($s) => $s['semester'] . '-' . $s['tahun_ajaran'])
->sortByDesc(fn($s) => $s['tahun_ajaran'] . '-' . $s['semester'])
->values();
// Hitung jumlah logbook + kelas per semester
$rekap = $allSemesters->map(function ($sem) use ($id, $kelasIds) {
$kelas = Kelas::whereIn('id', $kelasIds)
->where('semester', $sem['semester'])
->where('tahun_ajaran', $sem['tahun_ajaran'])
->get();
$semKelasIds = $kelas->pluck('id');
$logbookPengajar = Logbooks::where('guru_id', $id)
->whereIn('kelas_id',
Kelas::where('semester', $sem['semester'])
->where('tahun_ajaran', $sem['tahun_ajaran'])
->pluck('id')
)->count();
$logbookPic = Logbooks::whereIn('kelas_id', $semKelasIds)->count();
return [
'semester' => $sem['semester'],
'tahun_ajaran' => $sem['tahun_ajaran'],
'jumlah_kelas' => $kelas->count(),
'sesi_pic' => $logbookPic,
'sesi_pengajar' => $logbookPengajar,
'total_sesi' => max($logbookPic, $logbookPengajar),
];
});
$data = $guru;
// ====== Ketersediaan Mengajar ======
$sesiList = \App\Models\Sesi::orderBy('id', 'asc')->get();
$ketersediaan = $guru->ketersediaanMengajar->groupBy('hari');
$days = [1, 2, 3, 4, 5, 6];
$ketersediaanData = [];
foreach ($days as $day) {
$ketersediaanData[$day] = $ketersediaan->has($day)
? $ketersediaan->get($day)->pluck('sesi_id')->toArray()
: [];
}
return view('admin.pages.guru_detail', compact(
'data', 'sesiPic', 'sesiPengajar', 'sesiCompleted', 'jumlahKelas', 'rekap', 'divisi_guru', 'sesiList', 'ketersediaanData'
));
}
public function raportDetail($id, $semester, $tahun_ajaran){
$guru = Guru::findOrFail($id);
$kelasIdsJadwal = JadwalKelas::where('guru_id', $id)->pluck('kelas_id');
$kelasIdsLogbook = Logbooks::where('guru_id', $id)->pluck('kelas_id');
$allTeacherKelasIds = $kelasIdsJadwal->concat($kelasIdsLogbook)->unique()->filter();
// Kelas sebagai pengajar di semester ini
$kelasPic = Kelas::whereIn('id', $allTeacherKelasIds)
->where('semester', $semester)
->where('tahun_ajaran', $tahun_ajaran)
->with('Programs')
->get();
$kelasIdsPic = $kelasPic->pluck('id');
// Logbook di semester ini
$logbookPic = Logbooks::whereIn('kelas_id', $kelasIdsPic)
->with('Kelas.Programs', 'FotoLogbook', 'Guru')
->orderBy('tanggal', 'asc')
->get();
// Logbook sebagai pengajar di semester ini
$logbookPengajar = Logbooks::where('guru_id', $id)
->whereIn('kelas_id',
Kelas::where('semester', $semester)
->where('tahun_ajaran', $tahun_ajaran)
->pluck('id')
)
->with('Kelas.Programs', 'FotoLogbook', 'Guru')
->orderBy('tanggal', 'asc')
->get();
return view('admin.pages.guru_raport_detail', compact(
'guru', 'semester', 'tahun_ajaran',
'kelasPic', 'logbookPic', 'logbookPengajar'
));
}
public function getData($id){
$data = Guru::where('id', $id)->first();
return response()->json([
'id' => $data->id,
'nama' => $data->nama ?? null,
'no_hp' => $data->no_hp ?? null,
'tempat_lahir' => $data->tempat_lahir ?? null,
'tanggal_lahir' => $data->tanggal_lahir ?? null,
'tanggal_lahir_parse' => $this->dateFormat($data->tanggal_lahir),
'jenis_kelamin' => $data->jenis_kelamin ?? null,
'email' => $data->email ?? null,
'alamat' => $data->alamat ?? null,
'pendidikan_terakhir' => $data->pendidikan_terakhir ?? null,
'instansi_pendidikan' => $data->instansi_pendidikan ?? null,
'jurusan' => $data->jurusan ?? null,
'divisi' => $data->divisi ?? null,
'jabatan' => $data->jabatan ?? null,
'level_maksimal' => $data->level_maksimal ?? null,
'start_join' => $data->start_join ?? null,
'start_join_parse' => $this->dateFormat($data->start_join),
'pekerja' => $data->pekerja ?? null,
'status' => $data->status ?? null,
'no_rekening' => $data->no_rekening ?? null,
'bank_keterangan' => $data->bank_keterangan ?? null,
'talent_mapping' => $data->talent_mapping ?? null,
'foto' => $data->foto ?? null,
]);
}
public function store(Request $request){
$validated = $request->validate(
[
'nama' => 'required|string|max:255',
],
[
'nama.required' => 'Nama anak wajib diisi',
'nama.max' => 'Nama anak terlalu panjang',
]
);
if ($request->no_hp !== null || $request->no_hp !== ''){
$str = ltrim($request->no_hp, '0');
$validated['no_hp'] = $str;
}
if ($request->tempat_lahir !== null || $request->tempat_lahir !== ''){
$validated['tempat_lahir'] = $request['tempat_lahir'];
}
if ($request->tanggal_lahir !== null || $request->tanggal_lahir !== ''){
$validated['tanggal_lahir'] = $request['tanggal_lahir'];
}
if ($request->jenis_kelamin !== null || $request->jenis_kelamin !== ''){
$validated['jenis_kelamin'] = $request['jenis_kelamin'];
}else{
$validated['jenis_kelamin'] = 'L';
}
if ($request->email !== null || $request->email !== ''){
$validated['email'] = $request['email'];
}
if ($request->alamat !== null || $request->alamat !== ''){
$validated['alamat'] = $request['alamat'];
}
if ($request->pendidikan_terakhir !== null || $request->pendidikan_terakhir !== ''){
$validated['pendidikan_terakhir'] = $request['pendidikan_terakhir'];
}
if ($request->instansi_pendidikan !== null || $request->instansi_pendidikan !== ''){
$validated['instansi_pendidikan'] = $request['instansi_pendidikan'];
}
if ($request->jurusan !== null || $request->jurusan !== ''){
$validated['jurusan'] = $request['jurusan'];
}
if ($request->divisi !== null || $request->divisi !== ''){
$validated['divisi'] = $request['divisi'];
}
if ($request->jabatan !== null || $request->jabatan !== ''){
$validated['jabatan'] = $request['jabatan'];
}
if ($request->filled('level_maksimal') || $request->level_maksimal !== null){
$validated['level_maksimal'] = $request['level_maksimal'] ?: null;
}
if ($request->start_join !== null || $request->start_join !== ''){
$validated['start_join'] = $request['start_join'];
$validated['nid'] = $this->generateNID($request->start_join);
}
if ($request->pekerja !== null || $request->pekerja !== ''){
$validated['pekerja'] = $request['pekerja'];
}
if ($request->status !== null || $request->status !== ''){
$validated['status'] = $request['status'];
}
if ($request->no_rekening !== null || $request->no_rekening !== ''){
$validated['no_rekening'] = $request['no_rekening'];
}
if ($request->bank_keterangan !== null || $request->bank_keterangan !== ''){
$validated['bank_keterangan'] = $request['bank_keterangan'];
}
if ($request->hasFile('talent_mapping')) {
$file = $request->file('talent_mapping');
$hashedName = md5(time() . $file->getClientOriginalName()) . '.' . $file->getClientOriginalExtension();
$file->storeAs('talent-mapping', $hashedName, 'public');
$validated['talent_mapping'] = 'talent-mapping/' . $hashedName;
}
if ($request->hasFile('foto')) {
$file = $request->file('foto');
$hashedName = md5(time() . $file->getClientOriginalName()) . '.' . $file->getClientOriginalExtension();
$file->storeAs('anak', $hashedName, 'public');
$validated['foto'] = 'anak/' . $hashedName;
}
try {
$user = User::create([
'name' => $validated['nama'],
'username' => strtolower($validated['nama']),
'email' => $request->email,
'no_hp_orangtua' => $request->no_hp,
'password' => bcrypt('12345'),
'role' => 'guru',
]);
$validated['user_id'] = $user->id;
Guru::create($validated);
return redirect('/admin/guru')->with('success', 'Data Berhasil Disimpan');
}catch (QueryException $e){
return redirect('/admin/guru')->with('error', 'Data Gagal Disimpan');
}
}
public function update(Request $request, $id){
$data = Guru::where('id', $id)->first();
$validated = $request->validate(
[
'nama' => 'required|string|max:255',
],
[
'nama.required' => 'Nama anak wajib diisi',
'nama.max' => 'Nama anak terlalu panjang',
]
);
if ($request->no_hp !== null || $request->no_hp !== ''){
$str = ltrim($request->no_hp, '0');
$validated['no_hp'] = $str;
}
if ($request->tempat_lahir !== null || $request->tempat_lahir !== ''){
$validated['tempat_lahir'] = $request['tempat_lahir'];
}
if ($request->tanggal_lahir !== null || $request->tanggal_lahir !== ''){
$validated['tanggal_lahir'] = $request['tanggal_lahir'];
}
if ($request->jenis_kelamin !== null || $request->jenis_kelamin !== ''){
$validated['jenis_kelamin'] = $request['jenis_kelamin'];
}else{
$validated['jenis_kelamin'] = 'L';
}
if ($request->email !== null || $request->email !== ''){
$validated['email'] = $request['email'];
}
if ($request->alamat !== null || $request->alamat !== ''){
$validated['alamat'] = $request['alamat'];
}
if ($request->pendidikan_terakhir !== null || $request->pendidikan_terakhir !== ''){
$validated['pendidikan_terakhir'] = $request['pendidikan_terakhir'];
}
if ($request->instansi_pendidikan !== null || $request->instansi_pendidikan !== ''){
$validated['instansi_pendidikan'] = $request['instansi_pendidikan'];
}
if ($request->jurusan !== null || $request->jurusan !== ''){
$validated['jurusan'] = $request['jurusan'];
}
if ($request->divisi !== null || $request->divisi !== ''){
$validated['divisi'] = $request['divisi'];
}
if ($request->jabatan !== null || $request->jabatan !== ''){
$validated['jabatan'] = $request['jabatan'];
}
if ($request->has('level_maksimal')){
$validated['level_maksimal'] = $request['level_maksimal'] ?: null;
}
if ($request->start_join !== null || $request->start_join !== ''){
$validated['start_join'] = $request['start_join'];
// $validated['nid'] = $this->generateNID($request->start_join);
}
if ($request->pekerja !== null || $request->pekerja !== ''){
$validated['pekerja'] = $request['pekerja'];
}
if ($request->status !== null || $request->status !== ''){
$validated['status'] = $request['status'];
}
if ($request->no_rekening !== null || $request->no_rekening !== ''){
$validated['no_rekening'] = $request['no_rekening'];
}
if ($request->bank_keterangan !== null || $request->bank_keterangan !== ''){
$validated['bank_keterangan'] = $request['bank_keterangan'];
}
if ($request->hasFile('talent_mapping')) {
if ($data->talent_mapping) {
$imagePath = storage_path('app/public/' . $data->talent_mapping);
if (file_exists($imagePath)) {
unlink($imagePath);
}
}
$file = $request->file('talent_mapping');
$hashedName = md5(time() . $file->getClientOriginalName()) . '.' . $file->getClientOriginalExtension();
$file->storeAs('talent-mapping', $hashedName, 'public');
$validated['talent_mapping'] = 'talent-mapping/' . $hashedName;
}
if ($request->hasFile('foto')) {
if ($data->foto) {
$imagePath = storage_path('app/public/' . $data->foto);
if (file_exists($imagePath)) {
unlink($imagePath);
}
}
$file = $request->file('foto');
$hashedName = md5(time() . $file->getClientOriginalName()) . '.' . $file->getClientOriginalExtension();
$file->storeAs('guru', $hashedName, 'public');
$validated['foto'] = 'guru/' . $hashedName;
}
try {
$data->update($validated);
$firstWord = explode(' ', trim($data->nama))[0];
$user = User::where('id', $data->user_id)->first();
if($user === null){
$user = User::create([
'name' => $data->nama,
'username' => strtolower($firstWord),
'email' => $data->email,
'no_hp_orangtua' => $data->no_hp,
'password' => bcrypt('12345'),
'role' => 'guru',
]);
$data->update(['user_id' => $user->id]);
}else{
$user->update([
'name' => $data->nama,
'username' => strtolower($firstWord),
'no_hp_orangtua' => $data->no_hp,
'email' => $data->email,
'role' => 'guru',
]);
}
return redirect('/admin/guru')->with('success', 'Data Berhasil Diubah');
}catch (QueryException $e){
// dd($e->getMessage());
return redirect('/admin/guru')->with('error', 'Data Gagal Disimpan');
}
}
public function destroy(string $id)
{
$data = Guru::findOrFail($id);
if ($data->foto) {
$imagePath = storage_path('app/public/' . $data->foto);
if (file_exists($imagePath)) {
unlink($imagePath);
}
}
$user = User::where('id', $data->user_id)->first();
$data->delete();
$user->delete();
return redirect('/admin/guru')->with('success', 'Data Berhasil Dihapus');
}
public function updateKetersediaan(Request $request, $id)
{
$guru = Guru::findOrFail($id);
$request->validate([
'ketersediaan' => 'nullable|array',
'ketersediaan.*' => 'nullable|array',
]);
$data = $request->input('ketersediaan', []);
foreach ([1, 2, 3, 4, 5, 6] as $day) {
$daySesiIds = $data[$day] ?? [];
\App\Models\KetersediaanMengajar::where('guru_id', $id)
->where('hari', $day)
->delete();
foreach ($daySesiIds as $sesiId) {
\App\Models\KetersediaanMengajar::create([
'guru_id' => $id,
'hari' => $day,
'sesi_id' => $sesiId,
]);
}
}
return redirect()->route('admin.guru.detail', ['id' => $id, 'tab' => 'ketersediaan'])
->with('success', 'Ketersediaan mengajar guru berhasil diperbarui');
}
}