496 lines
19 KiB
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');
|
|
}
|
|
}
|