penjadwalan-ga/app/Http/Controllers/Guru/ProfileGuruController.php

241 lines
8.5 KiB
PHP

<?php
namespace App\Http\Controllers\Guru;
use App\Http\Controllers\Controller;
use App\Models\Guru;
use App\Models\User;
use Illuminate\Database\QueryException;
use Illuminate\Http\Request;
use Illuminate\Support\Carbon;
use Illuminate\Support\Facades\Hash;
use Illuminate\Validation\ValidationException;
class ProfileGuruController extends Controller
{
public function index(){
return view('guru.pages.profile');
}
public function dateFormat($date){
$tanggalparse = $date
? Carbon::parse($date)->locale('id')->translatedFormat('d F Y')
: null;
return $tanggalparse;
}
public function getDataProfile(){
$guru_id = auth()->user()->Guru->id;
$data = Guru::where('id', $guru_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,
'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 saveDataProfile(Request $request)
{
$guru = auth()->user()->Guru;
$validated = $request->validate([
'nama' => 'required|string|max:255',
], [
'nama.required' => 'Nama anak wajib diisi',
'nama.max' => 'Nama anak terlalu panjang',
]);
// Ambil semua field opsional
$fields = [
'no_hp', 'tempat_lahir', 'tanggal_lahir', 'jenis_kelamin', 'email',
'alamat', 'pendidikan_terakhir', 'instansi_pendidikan', 'jurusan',
'divisi', 'jabatan', 'start_join', 'pekerja', 'status',
'no_rekening', 'bank_keterangan'
];
foreach ($fields as $field) {
if ($request->filled($field)) {
// khusus no_hp -> hilangkan 0 di depan
$validated[$field] = $field === 'no_hp'
? ltrim($request->no_hp, '0')
: $request->$field;
}
}
// default jenis kelamin
$validated['jenis_kelamin'] = $validated['jenis_kelamin'] ?? 'L';
// Upload file
if ($request->hasFile('talent_mapping')) {
if ($guru->talent_mapping && file_exists(storage_path('app/public/' . $guru->talent_mapping))) {
unlink(storage_path('app/public/' . $guru->talent_mapping));
}
$validated['talent_mapping'] = $request->file('talent_mapping')
->storeAs('talent-mapping', md5(time() . $request->file('talent_mapping')->getClientOriginalName()) . '.' . $request->file('talent_mapping')->getClientOriginalExtension(), 'public');
}
if ($request->hasFile('foto')) {
if ($guru->foto && file_exists(storage_path('app/public/' . $guru->foto))) {
unlink(storage_path('app/public/' . $guru->foto));
}
$validated['foto'] = $request->file('foto')
->storeAs('guru', md5(time() . $request->file('foto')->getClientOriginalName()) . '.' . $request->file('foto')->getClientOriginalExtension(), 'public');
}
try {
$guru->update($validated);
$firstWord = strtolower(strtok($guru->nama, ' '));
$user = User::find($guru->user_id);
if (!$user) {
$user = User::create([
'name' => $guru->nama,
'username' => $firstWord,
'email' => $guru->email,
'no_hp_orangtua' => $guru->no_hp,
'password' => bcrypt('12345'),
'role' => 'guru',
]);
$guru->update(['user_id' => $user->id]);
} else {
$user->update([
'name' => $guru->nama,
'username' => $firstWord,
'email' => $guru->email,
'no_hp_orangtua' => $guru->no_hp,
'role' => 'guru',
]);
}
return response()->json([
'status' => 'success',
'message' => 'Data diri berhasil diperbarui',
]);
} catch (QueryException $e) {
return response()->json([
'status' => 'fail',
'message' => $e->getMessage(),
]);
}
}
public function updatePassword(Request $request){
$request->validate(
[
'old_password' => ['required'],
'new_password' => ['required', 'min:6', 'confirmed'],
],
[
'old_password.required' => 'Password lama harus diisi',
'new_password.required' => 'Password baru harus diisi',
'new_password.min' => 'Password baru minimal 6 karakter',
'new_password.confirmed' => 'Konfirmasi password baru harus sama'
]
);
$id = auth()->user()->id;
$user = User::findOrFail($id);
// cek password lama
if (!Hash::check($request->old_password, $user->password)) {
throw ValidationException::withMessages([
'old_password' => ['Password lama tidak sesuai.'],
]);
}
// update password baru
$user->password = Hash::make($request->new_password);
$user->save();
return response()->json([
'status' => 'success',
'message' => 'Password berhasil diperbarui',
'data' => null
]);
}
public function ketersediaan()
{
$guru = auth()->user()->Guru;
if (!$guru) {
return redirect()->back()->with('error', 'Data guru tidak ditemukan');
}
$isLocked = \App\Models\KetersediaanSetting::getRecord()->lock_edit;
$sesiList = \App\Models\Sesi::orderBy('id', 'asc')->get();
// Fetch ketersediaan
$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('guru.pages.ketersediaan', compact('guru', 'sesiList', 'ketersediaanData', 'isLocked'));
}
public function updateKetersediaan(Request $request)
{
$isLocked = \App\Models\KetersediaanSetting::getRecord()->lock_edit;
if ($isLocked) {
return redirect()->back()->with('error', 'Pengubahan ketersediaan mengajar dikunci oleh Admin.');
}
$guru = auth()->user()->Guru;
if (!$guru) {
return redirect()->back()->with('error', 'Data guru tidak ditemukan');
}
$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', $guru->id)
->where('hari', $day)
->delete();
foreach ($daySesiIds as $sesiId) {
\App\Models\KetersediaanMengajar::create([
'guru_id' => $guru->id,
'hari' => $day,
'sesi_id' => $sesiId,
]);
}
}
return redirect()->route('guru.ketersediaan')
->with('success', 'Ketersediaan mengajar berhasil diperbarui');
}
}