MIF_E31222519/app/Http/Controllers/AbsensiController.php

326 lines
12 KiB
PHP

<?php
namespace App\Http\Controllers;
use App\Models\Absensi;
use App\Models\JadwalPelajaran;
use App\Models\Siswa;
use App\Models\Kelas;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Http;
use Illuminate\Support\Facades\Log;
class AbsensiController extends Controller
{
public function index()
{
$user = auth()->user(); // Ambil user yang sedang login
$kelasId = request()->query('kelas');
// Cek role dari session atau user relationship
$isAdmin = session('nama_role') === 'Admin' || optional($user)->roleuser->nama_role === 'Admin';
// dd(session('id_guru'), $isAdmin);
// Ambil data kelas tergantung role
if ($isAdmin) {
$kelas = Kelas::all();
} else {
$idGuru = session('id_guru');
$kelas = JadwalPelajaran::join('kode_pembelajaran', 'jadwal_pelajaran.id_kodepembelajaran', '=', 'kode_pembelajaran.id_kodepembelajaran')
->join('kelas', 'jadwal_pelajaran.id_kelas', '=', 'kelas.id_kelas')
->where('kode_pembelajaran.id_guru', $idGuru)
->select('kelas.*')
->distinct()
->get();
}
// Ambil data absensi sesuai kelas jika dipilih
if ($kelasId) {
$absensi = Absensi::with('siswa')->whereHas('siswa', function ($query) use ($kelasId) {
$query->where('id_kelas', $kelasId);
})->get();
} else {
$absensi = Absensi::with('siswa')->get();
}
return view('absensi', compact('absensi', 'kelas'));
}
public function create()
{
$user = auth()->user();
$isAdmin = session('nama_role') === 'Admin' || optional($user)->roleuser->nama_role === 'Admin';
// dd(session('nama_role'), optional($user)->roleuser->nama_role, $isAdmin);
if ($isAdmin) {
$kelas = Kelas::all();
} else {
$idGuru = session('id_guru');
$kelas = JadwalPelajaran::join('kode_pembelajaran', 'jadwal_pelajaran.id_kodepembelajaran', '=', 'kode_pembelajaran.id_kodepembelajaran')
->join('kelas', 'jadwal_pelajaran.id_kelas', '=', 'kelas.id_kelas')
->where('kode_pembelajaran.id_guru', $idGuru)
->select('kelas.*')
->distinct()
->get();
}
$absensi = Absensi::all();
return view('absensi', compact('kelas', 'absensi'));
}
public function store(Request $request)
{
$request->validate([
'id_kelas' => 'required',
'id_kodepembelajaran' => 'required',
'siswa_ids' => 'required|array',
'siswa_ids.*' => 'required|exists:siswa,id_siswa',
'batas_waktu_absen' => 'required|date_format:Y-m-d\TH:i',
]);
foreach ($request->siswa_ids as $siswaId) {
DB::table('absensi')->insert([
'id_siswa' => $siswaId,
'id_kodepembelajaran' => $request->id_kodepembelajaran,
'status' => 'belum absen',
'batas_waktu_absen' => date('Y-m-d H:i:s', strtotime($request->batas_waktu_absen)),
]);
}
return redirect()->back()->with('success', 'Data Absensi berhasil disimpan untuk semua siswa yang dipilih.');
}
public function update(Request $request, $id)
{
$absensi = Absensi::where('id_absensi', $id)->firstOrFail(); // Menggunakan id_absensi
$absensi->status = $request->status;
$absensi->save();
return redirect()->route('absensi')->with('success', 'Status Absensi berhasil diperbarui.');
}
// public function updateketerangan(Request $request, $id)
// {
// $request->validate([
// 'keterangan_absen' => 'required|in:Hadir,Sakit,Izin,Alpha',
// ]);
// $absensi = Absensi::where('id_absensi', $id)->firstOrFail();
// $absensi->keterangan_absen = $request->keterangan_absen;
// $absensi->save();
// return redirect()->back()->with('success', 'Keterangan Absensi berhasil diperbarui.');
// }
public function updateketerangan(Request $request, $id)
{
$request->validate([
'keterangan_absen' => 'required|in:Hadir,Sakit,Izin,Alpha',
]);
$absensi = Absensi::findOrFail($id); // Pastikan data ditemukan
$absensi->keterangan_absen = $request->keterangan_absen;
$absensi->save();
return response()->json(['success' => 'Keterangan Absensi berhasil diperbarui.']);
}
public function validasiMassal(Request $request)
{
$request->validate([
'absensi_ids' => 'required|array',
'aksi' => 'required|in:diterima,ditolak',
]);
Absensi::whereIn('id_absensi', $request->absensi_ids)->update([
'status' => $request->aksi
]);
return redirect()->back()->with('success', 'Validasi massal berhasil dilakukan.');
}
// public function selesaikanValidasi()
// {
// $absensi = Absensi::all();
// foreach ($absensi as $item) {
// DB::table('history_absensi')->insert([
// 'id_siswa' => $item->id_siswa,
// 'id_kodepembelajaran'=> $item->id_kodepembelajaran,
// 'waktu_absen' => $item->waktu_absen,
// 'foto_absen' => $item->foto_absen,
// 'status' => $item->status,
// 'keterangan_absen' => $item->keterangan_absen,
// 'surat_izin' => $item->surat_izin,
// 'ditolak_keterangan' => $item->ditolak_keterangan,
// 'batas_waktu_absen' => $item->batas_waktu_absen,
// ]);
// }
// Absensi::truncate();
// return redirect()->back()->with('success', 'Semua data absensi telah dipindahkan ke history dan dikosongkan dari tabel absensi.');
// }
public function selesaikanValidasi()
{
// Ambil semua data absensi yang akan diproses
$absensi = Absensi::all();
// Pindahkan data absensi ke tabel history_absensi
foreach ($absensi as $item) {
DB::table('history_absensi')->insert([
'id_siswa' => $item->id_siswa,
'id_kodepembelajaran'=> $item->id_kodepembelajaran,
'waktu_absen' => $item->waktu_absen,
'foto_absen' => $item->foto_absen,
'status' => $item->status,
'keterangan_absen' => $item->keterangan_absen,
'surat_izin' => $item->surat_izin,
'ditolak_keterangan' => $item->ditolak_keterangan,
'batas_waktu_absen' => $item->batas_waktu_absen,
]);
// Kirim notifikasi WhatsApp ke orang tua siswa
$this->kirimNotifikasiWhatsApp($item);
}
// Kosongkan tabel absensi
Absensi::truncate();
return redirect()->back()->with('success', 'Semua data absensi telah dipindahkan ke history dan dikosongkan dari tabel absensi.');
}
private function kirimNotifikasiWhatsApp($absensi)
{
$apiKey = "CFwxvW52cgTBRSxKSprj";
$siswa = Siswa::find($absensi->id_siswa);
if (!$siswa || !$siswa->no_orangtua) {
Log::warning("Nomor orang tua tidak tersedia untuk siswa ID: {$absensi->id_siswa}");
return;
}
// Ambil informasi pelajaran & jam absensi dari relasi
$jadwal = DB::table('kode_pembelajaran')
->join('pelajaran', 'kode_pembelajaran.id_pelajaran', '=', 'pelajaran.id_pelajaran')
->where('kode_pembelajaran.id_kodepembelajaran', $absensi->id_kodepembelajaran)
->select('pelajaran.nama_pelajaran')
->first();
$namaPelajaran = $jadwal->nama_pelajaran ?? 'Tidak diketahui';
$jamAbsen = $absensi->waktu_absen ? date('H:i', strtotime($absensi->waktu_absen)) : 'Belum Absen';
$pesan = "📢 *NOTIFIKASI ABSENSI* 📢\n\n"
. "*Assalamu'alaikum Wr. Wb.*\n"
. "*Shalom*\n"
. "*Om Swastiastu*\n"
. "*Namo Buddhaya dan Salam Kebajikan*\n"
. "\n"
. "Berikut adalah informasi absensi untuk siswa:\n"
. "- Nama Siswa: {$siswa->nama_siswa}\n"
. "- NISN: {$siswa->nisn}\n"
. "- Mata Pelajaran: {$namaPelajaran}\n"
. "- Jam Absen: {$jamAbsen} WIB\n"
. "- Status Absensi: *{$absensi->status}*\n"
. "- Keterangan: *{$absensi->keterangan_absen}*\n"
. "\n"
. "Terima kasih atas perhatian Anda.\n"
. "\n"
. "*Humas SMKN 2 Jember*";
try {
$response = Http::asForm()->withHeaders([
'Authorization' => $apiKey,
])->post('https://api.fonnte.com/send', [
'target' => $siswa->no_orangtua,
'message' => $pesan,
'delay' => 2,
'countryCode' => '62',
]);
Log::info('Nomor tujuan: ' . $siswa->no_orangtua);
Log::info('Isi pesan: ' . $pesan);
Log::info('WhatsApp API response code: ' . $response->status());
Log::info('WhatsApp API response: ' . $response->body());
if ($response->successful()) {
Log::info("Notifikasi WhatsApp berhasil dikirim ke nomor: {$siswa->no_orangtua}");
} else {
Log::error("Gagal mengirim notifikasi WhatsApp ke nomor: {$siswa->no_orangtua}");
}
} catch (\Exception $e) {
Log::error('WhatsApp API error: ' . $e->getMessage());
Log::error('Exception trace: ' . $e->getTraceAsString());
}
}
public function getSiswaByKelas($idKelas)
{
$siswa = DB::table('siswa')
->where('id_kelas', $idKelas)
->select('id_siswa', 'nama_siswa', 'nisn')
->get();
return response()->json($siswa);
}
public function getMapelByKelas($idKelas)
{
$user = auth()->user();
$isAdmin = session('nama_role') === 'Admin' || optional($user)->roleuser->nama_role === 'Admin';
// dd(session('id_guru'), $isAdmin);
if ($isAdmin) {
$mapel = DB::table('jadwal_pelajaran')
->join('kode_pembelajaran', 'jadwal_pelajaran.id_kodepembelajaran', '=', 'kode_pembelajaran.id_kodepembelajaran')
->join('pelajaran', 'kode_pembelajaran.id_pelajaran', '=', 'pelajaran.id_pelajaran')
->join('guru', 'kode_pembelajaran.id_guru', '=', 'guru.id_guru')
->where('jadwal_pelajaran.id_kelas', $idKelas)
->select('kode_pembelajaran.id_kodepembelajaran', 'pelajaran.nama_pelajaran', 'guru.nama_guru')
->distinct()
->get();
} else {
$idGuru = session('id_guru');
$mapel = DB::table('jadwal_pelajaran')
->join('kode_pembelajaran', 'jadwal_pelajaran.id_kodepembelajaran', '=', 'kode_pembelajaran.id_kodepembelajaran')
->join('pelajaran', 'kode_pembelajaran.id_pelajaran', '=', 'pelajaran.id_pelajaran')
->join('guru', 'kode_pembelajaran.id_guru', '=', 'guru.id_guru')
->where('jadwal_pelajaran.id_kelas', $idKelas)
->where('kode_pembelajaran.id_guru', $idGuru)
->select('kode_pembelajaran.id_kodepembelajaran', 'pelajaran.nama_pelajaran', 'guru.nama_guru')
->distinct()
->get();
}
return response()->json($mapel);
}
public function destroy($id)
{
try {
// Find the absensi record
$absensi = Absensi::findOrFail($id);
// Delete the record
$absensi->delete();
// Optionally, delete the associated image if it exists
if ($absensi->foto_absen) {
$imagePath = public_path('uploads/absensi/' . $absensi->foto_absen);
if (file_exists($imagePath)) {
unlink($imagePath);
}
}
return redirect()->back()->with('success', 'Data absensi berhasil dihapus!');
} catch (\Exception $e) {
return redirect()->back()->with('error', 'Gagal menghapus data absensi: ' . $e->getMessage());
}
}
}