<?php
namespace App\Http\Controllers\Admin;
use App\Exports\PelatihanPesertasExport;
use App\Facades\DataTable;
use App\Helpers\NotifWa;
use App\Http\Controllers\Controller;
use App\Models\MateriTugas;
use App\Models\Pelatihan;
use App\Models\PelatihanJadwal;
use App\Models\PelatihanPeserta;
use App\Models\Peserta;
use App\Models\TugasPeserta;
use App\Models\User;
use Barryvdh\DomPDF\Facade\Pdf;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Log;
use Illuminate\Validation\Rules;
use Inertia\Inertia;
use Maatwebsite\Excel\Facades\Excel;
use Illuminate\Support\Str;
class PelatihanController extends Controller
{
public function index()
{
$sort = str_replace(
['title', 'created_at'],
['title', 'created_at'],
request()->query('col')
);
$query = Pelatihan::withCount('pesertas')->newQuery();
if(auth()->user()->role == "instruktur"){
$query = $query->where('user_id',auth()->user()->id);
}
$result = DataTable::query($query)
->searchable(['title', 'start_date', 'end_date'])
->applySort($sort)
->allowedSorts(['title', 'start_date', 'end_date', 'pesertas_count'])
->make()->toArray();
return Inertia::render('Admin/Pelatihan/Index', [
'datatable' => $result
]);
}
public function create()
{
$instrukturs = User::where('role', 'instruktur')->get();
return Inertia::render('Admin/Pelatihan/Create', compact('instrukturs'));
}
public function store(Request $request)
{
$request->validate([
'title' => 'required|string|max:255',
'description' => 'required|string',
'startDate' => 'required|date',
'endDate' => 'required|date',
]);
DB::beginTransaction();
try {
$user = Auth::user();
$pelatihan = Pelatihan::create([
'user_id' => $request->instruktur_id,
'title' => $request->title,
'description' => @$request->description,
'start_date' => $request->startDate,
'end_date' => $request->endDate,
'thumbnail' => $request->thumbnail->store('public/pelatihan'),
'tahun' => date("Y"),
'status' => $request->status == 1 ? "active" : "inactive",
'provinsi_id' => $request->provinsi_id,
'kabupaten_id' => $request->kabupaten_id,
'kecamatan_id' => $request->kecamatan_id,
'kelurahan_id' => $request->kelurahan_id,
'ttd_jabatan' => $request->ttd_jabatan,
'ttd_nama' => $request->ttd_nama,
]);
if (isset($request->materi)) {
foreach ($request->materi as $materi) {
$m = $pelatihan->pelatihan_materis()->create([
'code' => $materi['code'],
'name' => $materi['name'],
'description' => @$materi['description'],
'file' => $materi['file'] != null ? $materi['file']->store('private/materi') : null,
]);
$m->materi_tugas()->create([
'name' => $materi['name'],
'due_date' => $request->endDate
]);
}
}
if (isset($request->jadwal)) {
foreach ($request->jadwal as $jadwal) {
$pelatihan->pelatihan_jadwals()->create([
'code' => $jadwal['code'],
'name' => $jadwal['name'],
'description' => @$jadwal['description'],
'user_id' => @$jadwal['instruktur_id'],
'course_date' => $jadwal['course_date'],
]);
}
}
if (isset($request->syarat)) {
foreach ($request->syarat as $syarat) {
if (isset($syarat['description']) && $syarat['description'] != "") {
$pelatihan->syarat_pelatihans()->create([
'description' => @$syarat['description'],
'type' => @$syarat['type'],
'required' => @$syarat['required'],
'required_value' => @$syarat['required_value']
]);
}
}
}
DB::commit();
return redirect()->route('admin.pelatihan.index')->with('success', 'Berhasil menambah pelatihan ' . $pelatihan->title);
} catch (\Throwable $th) {
//throw $th;
DB::rollBack();
Log::error($th);
return redirect()->route('admin.pelatihan.create')->withInput($request->all())->with('error', 'Gagal menambah pelatihan');
}
}
public function show($id)
{
$pelatihan = Pelatihan::with('instructor', 'pelatihan_materis', 'pelatihan_jadwals', 'syarat_pelatihans', 'province', 'regency')->findOrFail($id);
$sort = str_replace(
['created_at'],
['created_at'],
request()->query('col')
);
$result = DataTable::query(PelatihanPeserta::has('peserta')->where('pelatihan_id', $id))
->with(['peserta.kabupaten', 'pelatihan'])
->searchable(['peserta.nama_lengkap', 'peserta.email', 'peserta.nik', 'peserta.kabupaten.name', 'peserta.tahun'])
->applySort($sort)
->allowedSorts(['created_at'])
->make()->toArray();
return Inertia::render('Admin/Pelatihan/Detail', ['datatable' => $result, 'pelatihan' => $pelatihan]);
}
public function reject($id)
{
$pelatihan_peserta = PelatihanPeserta::with('user.peserta', 'pelatihan')->findOrFail($id);
$pelatihan_peserta->status = 'reject';
$pelatihan_peserta->save();
if ($pelatihan_peserta->user->peserta->no_hp) {
NotifWa::send($pelatihan_peserta->user->peserta->no_hp, 'Pendaftaran untuk pelatihan : *' . $pelatihan_peserta->pelatihan->title . "* DITOLAK");
}
return redirect(route('admin.pelatihan.show', $pelatihan_peserta->pelatihan_id))->with('success', 'Berhasil menolak peserta ' . $pelatihan_peserta->user->nama);
}
public function approve($id)
{
$pelatihan_peserta = PelatihanPeserta::with('user.peserta', 'pelatihan')->findOrFail($id);
$pelatihan_peserta->status = 'approve';
$pelatihan_peserta->save();
if ($pelatihan_peserta->user->peserta->no_hp) {
NotifWa::send($pelatihan_peserta->user->peserta->no_hp, 'Pendaftaran untuk pelatihan : *' . $pelatihan_peserta->pelatihan->title . "* DITERIMA");
}
return redirect(route('admin.pelatihan.show', $pelatihan_peserta->pelatihan_id))->with('success', 'Berhasil menyetujui peserta ' . $pelatihan_peserta->user->nama);
}
public function edit($id)
{
$pelatihan = Pelatihan::with('instructor', 'pelatihan_materis', 'pelatihan_jadwals', 'syarat_pelatihans', 'province', 'regency')->findOrFail($id);
$instrukturs = User::where('role', 'instruktur')->get();
return Inertia::render('Admin/Pelatihan/Edit', compact('pelatihan', 'instrukturs'));
}
public function update(Request $request, $id)
{
$request->validate([
'title' => 'required|string|max:255',
'description' => 'required|string',
]);
DB::beginTransaction();
try {
$user = Auth::user();
$pelatihan = Pelatihan::findOrFail($id);
$pelatihan->update([
'user_id' => $request->instruktur_id,
'title' => $request->title,
'description' => $request->description,
'start_date' => $request->startDate,
'end_date' => $request->endDate,
'thumbnail' => $request->hasFile('thumbnail') ? $request->thumbnail->store('public/pelatihan') : $pelatihan->thumbnail,
'status' => $request->status == 1 ? "active" : "inactive",
'provinsi_id' => $request->provinsi_id,
'kabupaten_id' => $request->kabupaten_id,
'kecamatan_id' => $request->kecamatan_id,
'kelurahan_id' => $request->kelurahan_id,
'ttd_jabatan' => $request->ttd_jabatan,
'ttd_nama' => $request->ttd_nama,
]);
$delete_materi_ids = $pelatihan->pelatihan_materis()->pluck('id')->toArray();
if(isset($request->materi) && is_array($request->materi)){
foreach ($request->materi as $materi) {
$cek = $pelatihan->pelatihan_materis()->find($materi['id']);
if ($cek) {
unset($delete_materi_ids[array_search($cek->id, $delete_materi_ids)]);
$cek->update([
'code' => $materi['code'],
'name' => $materi['name'],
'description' => @$materi['description'],
'file' => $materi['file'] != null ? $materi['file']->store('private/materi') : $cek->file,
]);
if ($cek->materi_tugas()->count() <= 0) {
$cek->materi_tugas()->create([
'name' => $materi['name'],
'due_date' => $request->endDate
]);
}
} else {
$m = $pelatihan->pelatihan_materis()->create([
'code' => $materi['code'],
'name' => $materi['name'],
'description' => @$materi['description'],
'file' => $materi['file'] != null ? $materi['file']->store('private/materi') : null,
]);
$m->materi_tugas()->create([
'name' => $materi['name'],
'due_date' => $request->endDate
]);
}
}
}
if (count($delete_materi_ids) > 0) {
MateriTugas::whereIn('pelatihan_materi_id', $delete_materi_ids)->delete();
$pelatihan->pelatihan_materis()->whereIn('id', $delete_materi_ids)->delete();
}
$delete_jadwals_ids = $pelatihan->pelatihan_jadwals()->pluck('id')->toArray();
if (isset($request->jadwal) && is_array($request->jadwal)) {
foreach ($request->jadwal as $jadwal) {
$cek = $pelatihan->pelatihan_jadwals()->find($jadwal['id']);
if ($cek) {
unset($delete_jadwals_ids[array_search($cek->id, $delete_jadwals_ids)]);
$cek->update([
'code' => $jadwal['code'],
'name' => $jadwal['name'],
'description' => @$jadwal['description'],
'user_id' => @$jadwal['instruktur_id'],
'course_date' => $jadwal['course_date'],
]);
} else {
$pelatihan->pelatihan_jadwals()->create([
'code' => $jadwal['code'],
'name' => $jadwal['name'],
'description' => @$jadwal['description'],
'user_id' => @$jadwal['instruktur_id'],
'course_date' => $jadwal['course_date'],
]);
}
}
}
if (count($delete_jadwals_ids) > 0) {
$pelatihan->pelatihan_jadwals()->whereIn('id', $delete_jadwals_ids)->delete();
}
$delete_syarat_ids = $pelatihan->syarat_pelatihans()->pluck('id')->toArray();
if (isset($request->syarat) && is_array($request->syarat)) {
if (isset($request->syarat)) {
foreach ($request->syarat as $syarat) {
if (isset($syarat['description']) && trim($syarat['description']) != "") {
$cek = $pelatihan->syarat_pelatihans()->find($syarat['id']);
if ($cek) {
unset($delete_syarat_ids[array_search($cek->id, $delete_syarat_ids)]);
$cek->update([
'description' => @$syarat['description'],
'type' => @$syarat['type'],
'required' => @$syarat['required'],
'required_value' => @$syarat['required_value']
]);
} else {
$pelatihan->syarat_pelatihans()->create([
'description' => @$syarat['description'],
'type' => @$syarat['type'],
'required' => @$syarat['required'],
'required_value' => @$syarat['required_value']
]);
}
}
}
}
}
if (count($delete_syarat_ids) > 0) {
$pelatihan->syarat_pelatihans()->whereIn('id', $delete_syarat_ids)->delete();
}
DB::commit();
return redirect()->route('admin.pelatihan.index')->with('success', 'Berhasil mengubah pelatihan ' . $pelatihan->title);
} catch (\Throwable $th) {
//throw $th;
DB::rollBack();
Log::error($th);
return redirect()->route('admin.pelatihan.edit', $id)->with('error', 'Gagal mengubah pelatihan');
}
}
public function destroy($id)
{
$pelatihan = Pelatihan::findOrFail($id);
DB::beginTransaction();
try {
$pelatihan->pelatihan_pesertas()->delete();
$pelatihan->pelatihan_jadwals()->delete();
$pelatihan->pelatihan_materis()->delete();
$pelatihan->syarat_pelatihans()->delete();
$pelatihan->delete();
DB::commit();
return redirect()->route('admin.pelatihan.index')->with('success', 'Berhasil menghapus pelatihan ' . $pelatihan->title);
} catch (\Throwable $th) {
//throw $th;
DB::rollBack();
Log::error($th);
return redirect()->route('admin.pelatihan.index')->with('error', 'Gagal menghapus pelatihan ' . $pelatihan->title);
}
}
public function absensi($pelatihan_jadwal_id)
{
$jadwal = PelatihanJadwal::with('absen_pesertas.peserta')->with([
'pelatihan.pesertas' => function ($w) {
$w->whereIn('status', ['approve', 'finish', 'unfinish']);
}
])->findOrFail($pelatihan_jadwal_id);
// dd($jadwal->toArray());
return Inertia::render('Admin/Pelatihan/Absensi', compact('jadwal'));
}
public function printAbsensi($pelatihan_jadwal_id)
{
$jadwal = PelatihanJadwal::with('absen_pesertas.peserta')->with([
'pelatihan.pesertas' => function ($w) {
$w->whereIn('status', ['approve', 'finish', 'unfinish']);
}
])->findOrFail($pelatihan_jadwal_id);
return view('admin.pelatihan.absensi', compact('jadwal'));
}
public function simpanAbsensi($pelatihan_jadwal_id, Request $request)
{
$jadwal = PelatihanJadwal::with('absen_pesertas.peserta')->findOrFail($pelatihan_jadwal_id);
$user = Auth::user();
DB::beginTransaction();
try {
foreach ($request->absensi as $absensi) {
$cek = $jadwal->absen_pesertas()->where('peserta_id', $absensi['id'])->first();
if ($cek) {
$cek->update([
'hadir' => $absensi['hadir'] ?? false,
'user_id' => $user->id
]);
} else {
$jadwal->absen_pesertas()->create([
'peserta_id' => $absensi['id'],
'hadir' => $absensi['hadir'] ?? false,
'user_id' => $user->id
]);
}
}
DB::commit();
return redirect()->route('admin.pelatihan.absensi', $pelatihan_jadwal_id)->with('success', 'Berhasil menyimpan absensi');
} catch (\Throwable $th) {
//throw $th;
DB::rollBack();
Log::error($th);
return redirect()->route('admin.pelatihan.absensi', $pelatihan_jadwal_id)->with('error', 'Gagal menyimpan absensi');
}
}
public function tugas($id)
{
$pelatihan = Pelatihan::with('instructor', 'pelatihan_materis', 'pelatihan_jadwals', 'syarat_pelatihans', 'province', 'regency')->findOrFail($id);
$sort = str_replace(
['title', 'created_at'],
['title', 'created_at'],
request()->query('col')
);
$result = DataTable::query(TugasPeserta::with('materi_tugas')->with('user.peserta')->whereHas('materi_tugas.pelatihan_materi', function ($w) use ($pelatihan) {
$w->where('pelatihan_id', $pelatihan->id);
})->newQuery())
->with(['materi_tugas', 'user.peserta'])
->searchable(['materi_tugas.name', 'materi_tugas.due_date', 'created_at'])
->applySort($sort)
->allowedSorts(['materi_tugas.name', 'due_date'])
->make()->toArray();
return Inertia::render('Admin/Pelatihan/Tugas', [
'pelatihan' => $pelatihan,
'datatable' => $result
]);
}
public function rejectTugas($id)
{
$tugasPeserta = TugasPeserta::with('user')->findOrFail($id);
$tugasPeserta->status = 'reject';
$tugasPeserta->save();
$pelatihanPeserta = PelatihanPeserta::where('user_id', $tugasPeserta->user_id)->where('pelatihan_id', $tugasPeserta->materi_tugas->pelatihan_materi->pelatihan_id)->update([
'status' => 'unfinish'
]);
return redirect(route('admin.pelatihan.tugas', $tugasPeserta->materi_tugas->pelatihan_materi->pelatihan_id))->with('success', 'Berhasil menolak tugas dari ' . $tugasPeserta->user->nama);
}
public function approveTugas($id)
{
$tugasPeserta = TugasPeserta::with('user')->findOrFail($id);
$tugasPeserta->status = 'approve';
$tugasPeserta->save();
$pelatihanPeserta = PelatihanPeserta::where('user_id', $tugasPeserta->user_id)->where('pelatihan_id', $tugasPeserta->materi_tugas->pelatihan_materi->pelatihan_id)->update([
'status' => 'finish'
]);
return redirect(route('admin.pelatihan.tugas', $tugasPeserta->materi_tugas->pelatihan_materi->pelatihan_id))->with('success', 'Berhasil menyetujui tugas dari ' . $tugasPeserta->user->nama);
}
public function printSertifikat($pelatihan_id)
{
$pelatihanPesertas = PelatihanPeserta::has('peserta')->with('peserta', 'user', 'pelatihan.pelatihan_materis', 'jawaban_syarat_pelatihans.syarat_pelatihan', 'user.peserta.provinsi', 'user.peserta.kabupaten')->where('pelatihan_id', $pelatihan_id)->get();
// return view('admin.pelatihan.sertifikat',compact('pelatihanPesertas'));
$pdf = Pdf::loadView('admin.pelatihan.sertifikat', compact('pelatihanPesertas'));
$pdf->setPaper('A4', 'landscape');
// $pdf->setOption(['isRemoteEnabled' => true]);
return $pdf->stream('sertifikat.pdf');
}
public function exportPeserta($pelatihan_id)
{
$pelatihan = Pelatihan::findOrFail($pelatihan_id);
return Excel::download(new PelatihanPesertasExport($pelatihan_id), 'peserta-' . Str::slug($pelatihan->title) . '.xlsx');
}
/**
* Get available peserta that are not yet registered for the training
*/
public function availablePeserta($id)
{
// Get the pelatihan
$pelatihan = Pelatihan::findOrFail($id);
// Get IDs of users already registered for this pelatihan
$registeredUserIds = PelatihanPeserta::where('pelatihan_id', $id)->whereNotNull('peserta_id')
->pluck('peserta_id')
->toArray();
// Get search query
$search = request()->query('search');
// Get available peserta (not yet registered for this pelatihan) with pagination and search
$perPage = request()->query('per_page', 10);
$query = Peserta::with('user')
->whereNotIn('id', $registeredUserIds);
if ($search) {
$query->where(function ($q) use ($search) {
$q->where('nama_lengkap', 'like', "%$search%")
->orWhere('email', 'like', "%$search%")
->orWhere('nik', 'like', "%$search%")
->orWhere('no_hp', 'like', "%$search%")
->orWhereHas('user', function ($userQuery) use ($search) {
$userQuery->where('nama', 'like', "%$search%")
->orWhere('email', 'like', "%$search%");
});
});
}
$availablePeserta = $query->paginate($perPage);
$availablePeserta->setCollection(
$availablePeserta->getCollection()->map(function ($peserta) {
return [
'id' => $peserta->id,
'nama_lengkap' => $peserta->nama_lengkap,
'email' => $peserta->email,
'nik' => $peserta->nik,
'no_hp' => $peserta->no_hp,
'user' => [
'nama' => @$peserta->user->nama,
'email' => @$peserta->user->email
]
];
})
);
return response()->json([
'data' => $availablePeserta->items(),
'total' => $availablePeserta->total(),
'current_page' => $availablePeserta->currentPage(),
'per_page' => $availablePeserta->perPage(),
'last_page' => $availablePeserta->lastPage()
]);
}
/**
* Add selected peserta to the training
*/
public function addPeserta(Request $request, $id)
{
$request->validate([
'peserta_ids' => 'required|array',
'peserta_ids.*' => 'required|exists:pesertas,id'
]);
$pelatihan = Pelatihan::findOrFail($id);
$addedCount = 0;
DB::beginTransaction();
try {
foreach ($request->peserta_ids as $pesertaId) {
// Check if the peserta is already registered for this pelatihan
$exists = PelatihanPeserta::where('pelatihan_id', $id)
->where('peserta_id', $pesertaId)
->exists();
if (!$exists) {
// Add the peserta to the pelatihan
PelatihanPeserta::create([
'pelatihan_id' => $id,
'peserta_id' => $pesertaId,
'status' => 'approve' // Auto-approve since admin is adding them
]);
$addedCount++;
// Send notification to the peserta
// $user = User::with('peserta')->find($pesertaId);
// if ($user && $user->peserta && $user->peserta->no_hp) {
// NotifWa::send($user->peserta->no_hp, 'Anda telah ditambahkan ke pelatihan: *' . $pelatihan->title . '*');
// }
}
}
DB::commit();
return redirect()->route('admin.pelatihan.show', $id)
->with('success', 'Berhasil menambahkan ' . $addedCount . ' peserta ke pelatihan');
} catch (\Throwable $th) {
DB::rollBack();
Log::error($th);
return redirect()->route('admin.pelatihan.show', $id)
->with('error', 'Gagal menambahkan peserta ke pelatihan');
}
}
public function finishPelatihan($id){
DB::beginTransaction();
try {
$pelatihan = Pelatihan::findOrFail($id);
$pelatihanPeserta = PelatihanPeserta::where('pelatihan_id', $pelatihan->id)->where('status','approve')->update([
'status' => 'finish'
]);
$pelatihan->update([
'status' => 'inactive'
]);
DB::commit();
return redirect()->route('admin.pelatihan.index')->with('success', 'Berhasil menyelesaikan pelatihan ini');
} catch (\Throwable $th) {
//throw $th;
DB::rollback();
return redirect()->back()->with('error', 'Gagal menyelesaikan pelatihan ini');
}
}
public function finishPelatihanPeserta($id){
DB::beginTransaction();
try {
$pelatihanPeserta = PelatihanPeserta::findOrFail($id);
$pelatihanPeserta->update([
'status' => 'finish'
]);
DB::commit();
return redirect()->route('admin.pelatihan.show', $pelatihanPeserta->pelatihan_id)->with('success', 'Berhasil mengubah status peserta pelatihan');
} catch (\Throwable $th) {
//throw $th;
DB::rollback();
return redirect()->back()->with('error', 'Gagal mengubah status peserta pelatihan');
}
}
}
Anons79 File Manager Version 1.0, Coded By Anons79
Email: [email protected]