MIF_E31231594/app/Http/Controllers/Admin/KegiatanController.php

284 lines
6.9 KiB
PHP

<?php
namespace App\Http\Controllers\Admin;
use App\Http\Controllers\Controller;
use App\Models\Kegiatan;
use App\Models\Organisasi;
use App\Models\User;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\Validation\Rule;
use Illuminate\Support\Facades\Storage;
use Illuminate\Support\Str;
use Illuminate\View\View;
class KegiatanController extends Controller
{
private const ALLOWED_STATUSES = [
'pending',
'disetujui pembina',
'disetujui admin',
'ditolak pembina',
'ditolak admin',
];
public function __invoke(): View
{
$query = Kegiatan::with([
'organisasi:id,nama_organisasi',
'penanggungJawab:id,name',
])->latest('id');
$status = request('status');
$search = request('search', '');
// filter status
if ($status) {
if ($status === 'disetujui') {
$query->whereIn('status', [
'disetujui pembina',
'disetujui admin'
]);
} elseif ($status === 'ditolak') {
$query->whereIn('status', [
'ditolak pembina',
'ditolak admin'
]);
} elseif (in_array($status, self::ALLOWED_STATUSES, true)) {
$query->where('status', $status);
}
}
// search
if ($search) {
$query->where(function ($q) use ($search) {
$q->where('nama_kegiatan', 'like', "%{$search}%")
->orWhere('deskripsi', 'like', "%{$search}%")
->orWhere('tempat', 'like', "%{$search}%");
});
}
$kegiatan = $query->get([
'id',
'organisasi_id',
'nama_kegiatan',
'deskripsi',
'tanggal_mulai',
'tempat',
'penanggung_jawab',
'tanggal_berakhir',
'proposal',
'status',
]);
$organisasiList = Organisasi::with('pembinaUsers:id,name')->orderBy('nama_organisasi')
->get([
'id',
'nama_organisasi'
]);
return view('admin.kegiatan', compact(
'kegiatan',
'organisasiList',
'search',
'status'
));
}
public function store(Request $request): RedirectResponse
{
$validated = $request->validate([
'organisasi_id' => [
'required',
'integer',
Rule::exists('organisasi', 'id')
],
'nama_kegiatan' => [
'required',
'string',
'max:150'
],
'deskripsi' => [
'nullable',
'string'
],
'penanggung_jawab' => [
'nullable',
'integer',
Rule::exists('users', 'id')
],
'tanggal_mulai' => [
'nullable',
'date'
],
'tanggal_berakhir' => [
'nullable',
'date',
'after_or_equal:tanggal_mulai'
],
'tempat' => [
'nullable',
'string',
'max:150'
],
'proposal' => [
'required',
'file',
'mimes:pdf,doc,docx',
'max:5120'
],
'status' => [
'required',
Rule::in(self::ALLOWED_STATUSES)
],
]);
// upload proposal
if ($request->hasFile('proposal')) {
$organisasi = Organisasi::find($validated['organisasi_id']);
$folder = 'proposal/' . Str::slug($organisasi->nama_organisasi);
$file = $request->file('proposal');
$filename = time() . '_' . $file->getClientOriginalName();
$validated['proposal'] = $file->storeAs(
$folder,
$filename,
'public'
);
}
Kegiatan::create($validated);
return redirect()
->route('admin.kegiatan')
->with('success', 'Kegiatan berhasil ditambahkan.');
}
public function update(Request $request, Kegiatan $kegiatan): RedirectResponse
{
$validated = $request->validate([
'organisasi_id' => [
'required',
'integer',
Rule::exists('organisasi', 'id')
],
'nama_kegiatan' => [
'required',
'string',
'max:150'
],
'deskripsi' => [
'nullable',
'string'
],
'penanggung_jawab' => [
'nullable',
'integer',
Rule::exists('users', 'id')
],
'tanggal_mulai' => [
'nullable',
'date'
],
'tanggal_berakhir' => [
'nullable',
'date',
'after_or_equal:tanggal_mulai'
],
'tempat' => [
'nullable',
'string',
'max:150'
],
'proposal' => [
'nullable',
'file',
'mimes:pdf,doc,docx',
'max:5120'
],
'status' => [
'required',
Rule::in(self::ALLOWED_STATUSES)
],
]);
// upload proposal baru
if ($request->hasFile('proposal')) {
// hapus file lama
if ($kegiatan->proposal && !str_starts_with($kegiatan->proposal, 'http')) {
Storage::disk('public')->delete($kegiatan->proposal);
}
$organisasi = Organisasi::find($validated['organisasi_id']);
$folder = 'proposal/' . Str::slug($organisasi->nama_organisasi);
$file = $request->file('proposal');
$filename = time() . '_' . $file->getClientOriginalName();
$validated['proposal'] = $file->storeAs(
$folder,
$filename,
'public'
);
} else {
unset($validated['proposal']);
}
$kegiatan->update($validated);
return redirect()
->route('admin.kegiatan')
->with('success', 'Data kegiatan berhasil diperbarui.');
}
public function destroy(Kegiatan $kegiatan): RedirectResponse
{
// hapus proposal
if ($kegiatan->proposal && !str_starts_with($kegiatan->proposal, 'http')) {
Storage::disk('public')->delete($kegiatan->proposal);
}
$kegiatan->delete();
return redirect()
->route('admin.kegiatan')
->with('success', 'Kegiatan berhasil dihapus.');
}
}