match_making/app/Http/Controllers/PenawaranProjectController.php
2025-01-02 09:09:28 +07:00

429 lines
17 KiB
PHP

<?php
namespace App\Http\Controllers;
use App\Models\FollowPenawaran;
use App\Models\PenawaranProject;
use App\Models\PenawaranPelatihan;
use App\Models\PenawaranPendanaan;
use App\Models\PenawaranRiset;
use Illuminate\Http\Request;
class PenawaranProjectController extends Controller
{
// Menampilkan semua penawaran projects
public function index()
{
$user = auth()->user();
$penawaranProjects = PenawaranProject::with(['Pelatihan', 'Pendanaan', 'Riset'])->where('user_id', $user->id)->get();
return view('penawaran.index', compact('penawaranProjects'));
}
// Menampilkan halaman pelatihan
public function pelatihan(Request $request)
{
// Ambil query search dari request
$search = $request->input('search');
// Query untuk pelatihan dengan whereHas dan pencarian berdasarkan judul atau deskripsi
$projects = PenawaranProject::with('pelatihan')
->whereHas('pelatihan', function ($query) use ($search) {
if ($search) {
$query->where('judul_project', 'like', "%{$search}%")
->orWhere('deskripsi_project', 'like', "%{$search}%");
}
})
->paginate(10); // Set pagination dengan 10 item per halaman
// Passing variabel 'projects' dan 'search' ke view
return view('penawaran.pelatihan', compact('projects', 'search'));
}
// Menampilkan halaman pendanaan
public function pendanaan(Request $request)
{
// Ambil query search dari request
$search = $request->input('search');
// Query untuk pendanaan dengan whereHas dan pencarian berdasarkan judul atau deskripsi
$projects = PenawaranProject::with('pendanaan')
->whereHas('pendanaan', function ($query) use ($search) {
if ($search) {
$query->where('judul_project', 'like', "%{$search}%")
->orWhere('deskripsi_project', 'like', "%{$search}%");
}
})
->paginate(10); // Pagination 10 item per halaman
// Passing variabel 'projects' dan 'search' ke view
return view('penawaran.pendanaan', compact('projects', 'search'));
}
// Menampilkan halaman riset
public function riset(Request $request)
{
// Ambil query search dari request
$search = $request->input('search');
// Query untuk riset dengan whereHas dan pencarian berdasarkan judul atau deskripsi
$projects = PenawaranProject::with('riset')
->whereHas('riset', function ($query) use ($search) {
if ($search) {
$query->where('judul_project', 'like', "%{$search}%")
->orWhere('deskripsi_project', 'like', "%{$search}%");
}
})
->paginate(10); // Pagination 10 item per halaman
// Passing variabel 'projects' dan 'search' ke view
return view('penawaran.riset', compact('projects', 'search'));
}
// Menampilkan form untuk menambah penawaran project baru
public function create()
{
return view('penawaran.create');
}
// Menyimpan penawaran project baru
public function store(Request $request)
{
// Validasi input
$rules = [
'judul_project' => 'required|string|max:255',
// 'bidang_sub_sektor_ekonomi_kreatif' => 'required|string|max:255',
'bidang_sub_sektor_ekonomi_kreatif' => 'required|array',
'bidang_sub_sektor_ekonomi_kreatif.*' => 'string',
'deskripsi_project' => 'required|string',
'jenis_penawaran' => 'required|in:pelatihan,pendanaan,riset',
'audiens' => 'required|string',
'batas_terima_tawaran' => 'required|date',
'kontak' => 'required|string|max:255',
'foto_proyek' => 'nullable|image|mimes:jpeg,png,jpg,gif|max:2048',
'status' => 'required|string',
'benefit' => 'required|string',
];
// Validasi input berdasarkan kategori (jenis_penawaran)
switch ($request->input('jenis_penawaran')) {
case 'pelatihan':
$rules = array_merge($rules, [
'lokasi_pelatihan' => 'required|string',
'durasi_pelatihan' => 'required|numeric',
'jumlah_peserta' => 'required|numeric',
]);
break;
case 'pendanaan':
$rules = array_merge($rules, [
'jumlah_dana' => 'required|numeric',
]);
break;
case 'riset':
$rules = array_merge($rules, [
'institusi_penelitian' => 'required|string',
'bidang_penelitian' => 'required|string',
'lokasi_riset' => 'required|string',
'metodologi' => 'required|string',
'hasil' => 'required|string',
]);
break;
}
// Validasi input
$validatedData = $request->validate($rules);
$foto_proyek = $request->file('foto_proyek')
? $request->file('foto_proyek')->storeAs('foto_proyek', $request->file('foto_proyek')->getClientOriginalName(), 'public')
: null;
$bidangSubSektor = $validatedData['bidang_sub_sektor_ekonomi_kreatif'];
$bidangSubSektorString = implode(',', $bidangSubSektor);
// $project = PenawaranProject::create([
// 'judul_project' => $request->input('judul_project'),
// // 'bidang_sub_sektor_ekonomi_kreatif' => $request->input('bidang_sub_sektor_ekonomi_kreatif'),
// 'bidang_sub_sektor_ekonomi_kreatif' => $request->input['bidang_sub_sektor_ekonomi_kreatif'],
// 'bidang_sub_sektor_ekonomi_kreatif' => implode(',', $request->input['bidang_sub_sektor_ekonomi_kreatif']), // Simpan sebagai string
// 'deskripsi_project' => $request->input('deskripsi_project'),
// 'batas_terima_tawaran' => $request->input('batas_terima_tawaran'),
// 'jenis_penawaran' => $request->input('jenis_penawaran'),
// 'audiens' => $request->input('audiens'),
// 'kontak' => $request->input('kontak'),
// 'status' => $request->input('status'),
// 'benefit' => $request->input('benefit'),
// 'foto_proyek' => $foto_proyek,
// 'user_id' => auth()->id(),
// ]);
$project = PenawaranProject::create([
'judul_project' => $validatedData['judul_project'],
'bidang_sub_sektor_ekonomi_kreatif' => $bidangSubSektorString, // Simpan sebagai string
'deskripsi_project' => $validatedData['deskripsi_project'],
'batas_terima_tawaran' => $validatedData['batas_terima_tawaran'],
'jenis_penawaran' => $validatedData['jenis_penawaran'],
'audiens' => $validatedData['audiens'],
'kontak' => $validatedData['kontak'],
'status' => $validatedData['status'],
'benefit' => $validatedData['benefit'],
'foto_proyek' => $foto_proyek,
'user_id' => auth()->id(),
]);
// Simpan data tambahan berdasarkan jenis_penawaran
// switch ($request->input('jenis_penawaran')) {
// case 'pelatihan':
// PenawaranPelatihan::create([
// 'penawaran_project_id' => $project->id,
// 'lokasi_pelatihan' => $request->input('lokasi_pelatihan'),
// 'durasi_pelatihan' => $request->input('durasi_pelatihan'),
// 'jumlah_peserta' => $request->input('jumlah_peserta'),
// ]);
// break;
// case 'pendanaan':
// PenawaranPendanaan::create([
// 'penawaran_project_id' => $project->id,
// 'jumlah_dana' => $request->input('jumlah_dana'),
// ]);
// break;
// case 'riset':
// PenawaranRiset::create([
// 'penawaran_project_id' => $project->id,
// 'institusi_penelitian' => $request->input('institusi_penelitian'),
// 'bidang_penelitian' => $request->input('bidang_penelitian'),
// 'lokasi_riset' => $request->input('lokasi_riset'),
// 'metodologi' => $request->input('metodologi'),
// 'hasil' => $request->input('hasil'),
// ]);
// break;
// }
// Simpan data tambahan berdasarkan jenis_penawaran
switch ($validatedData['jenis_penawaran']) {
case 'pelatihan':
PenawaranPelatihan::create([
'penawaran_project_id' => $project->id,
'lokasi_pelatihan' => $validatedData['lokasi_pelatihan'],
'durasi_pelatihan' => $validatedData['durasi_pelatihan'],
'jumlah_peserta' => $validatedData['jumlah_peserta'],
]);
break;
case 'pendanaan':
PenawaranPendanaan::create([
'penawaran_project_id' => $project->id,
'jumlah_dana' => $validatedData['jumlah_dana'],
]);
break;
case 'riset':
PenawaranRiset::create([
'penawaran_project_id' => $project->id,
'institusi_penelitian' => $validatedData['institusi_penelitian'],
'bidang_penelitian' => $validatedData['bidang_penelitian'],
'lokasi_riset' => $validatedData['lokasi_riset'],
'metodologi' => $validatedData['metodologi'],
'hasil' => $validatedData['hasil'],
]);
break;
}
return redirect()->route('penawaranprojects.index')->with('success', 'Penawaran project berhasil ditambahkan.');
}
// Menampilkan form untuk mengedit penawaran project
public function edit($id)
{
$project = PenawaranProject::find($id);
if (!$project) {
return redirect()->route('penawaranprojects.index')->with('error', 'Project not found');
}
$relatedData = null;
switch ($project->jenis_penawaran) {
case 'pelatihan':
$relatedData = $project->pelatihan;
break;
case 'pendanaan':
$relatedData = $project->pendanaan;
break;
case 'riset':
$relatedData = $project->riset;
break;
}
return view('penawaran.edit', compact('project', 'relatedData'));
}
// Memperbarui penawaran project yang sudah ada
public function update(Request $request, $id)
{
// Find the project by ID
$project = PenawaranProject::find($id);
// If the project is not found, redirect with an error message
if (!$project) {
return redirect()->route('penawaranprojects.index')->with('error', 'Project not found');
}
// Validasi input
$rules = [
'judul_project' => 'required|string|max:255',
// 'bidang_sub_sektor_ekonomi_kreatif' => 'required|string|max:255',
'bidang_sub_sektor_ekonomi_kreatif' => 'required|array',
'bidang_sub_sektor_ekonomi_kreatif.*' => 'string',
'deskripsi_project' => 'required|string',
'jenis_penawaran' => 'required|in:pelatihan,pendanaan,riset',
'audiens' => 'required|string',
'batas_terima_tawaran' => 'required|date',
'kontak' => 'required|string|max:255',
'foto_proyek' => 'nullable|image|mimes:jpeg,png,jpg,gif|max:2048',
'status' => 'required|string',
'benefit' => 'required|string',
];
// Validasi input berdasarkan kategori (jenis_penawaran)
switch ($request->input('jenis_penawaran', $project->jenis_penawaran)) {
case 'pelatihan':
$rules = array_merge($rules, [
'lokasi_pelatihan' => 'required|string',
'durasi_pelatihan' => 'required|numeric',
'jumlah_peserta' => 'required|numeric',
]);
break;
case 'pendanaan':
$rules = array_merge($rules, [
'jumlah_dana' => 'required|numeric',
]);
break;
case 'riset':
$rules = array_merge($rules, [
'institusi_penelitian' => 'required|string',
'bidang_penelitian' => 'required|string',
'lokasi_riset' => 'required|string',
'metodologi' => 'required|string',
'hasil' => 'required|string',
]);
break;
}
// Validasi data input
$validatedData = $request->validate($rules);
// Mengubah array bidang_sub_sektor_ekonomi_kreatif menjadi string
$validatedData['bidang_sub_sektor_ekonomi_kreatif'] = implode(',', $validatedData['bidang_sub_sektor_ekonomi_kreatif']);
if ($request->hasFile('foto_proyek')) {
$validatedData['foto_proyek'] = $request->file('foto_proyek')
? $request->file('foto_proyek')->storeAs('foto_proyek', $request->file('foto_proyek')->getClientOriginalName(), 'public')
: $project->foto_proyek;
}
// Update data project
$project->update($validatedData);
// Update atau simpan data tambahan berdasarkan jenis_penawaran
switch ($request->input('jenis_penawaran', $project->jenis_penawaran)) {
case 'pelatihan':
$project->Pelatihan()->updateOrCreate(
['penawaran_project_id' => $project->id],
[
'lokasi_pelatihan' => $request->input('lokasi_pelatihan'),
'durasi_pelatihan' => $request->input('durasi_pelatihan'),
'jumlah_peserta' => $request->input('jumlah_peserta'),
]
);
break;
case 'pendanaan':
$project->Pendanaan()->updateOrCreate(
['penawaran_project_id' => $project->id],
[
'jumlah_dana' => $request->input('jumlah_dana'),
]
);
break;
case 'riset':
$project->Riset()->updateOrCreate(
['penawaran_project_id' => $project->id],
[
'institusi_penelitian' => $request->input('institusi_penelitian'),
'bidang_penelitian' => $request->input('bidang_penelitian'),
'lokasi_riset' => $request->input('lokasi_riset'),
'metodologi' => $request->input('metodologi'),
'hasil' => $request->input('hasil'),
]
);
break;
}
return redirect()->route('penawaranprojects.index')->with('success', 'Penawaran project berhasil diperbarui.');
}
// Menghapus penawaran project
public function destroy($id)
{
$penawaranProject = PenawaranProject::findOrFail($id);
$penawaranProject->delete();
return redirect()->route('penawaranprojects.index')->with('success', 'Penawaran project berhasil dihapus.');
}
public function showPelatihan($id)
{
// Find the project by its ID with related pelatihan data
$project = PenawaranProject::with('pelatihan')->findOrFail($id);
// Mengambil daftar pengikut untuk proyek ini
$followers = FollowPenawaran::where('project_id', $id)
->where('status', 'accepted') // Hanya pengikut yang diterima
->with('user') // Ambil data pengguna yang mengikuti
->get();
// Return the view for Pelatihan with the related pelatihan data
return view('penawaran.show_pelatihan', compact('project', 'followers'));
}
public function showPendanaan($id)
{
// Find the project by its ID
$project = PenawaranProject::with('pendanaan')->findOrFail($id);
// Mengambil daftar pengikut untuk proyek ini
$followers = FollowPenawaran::where('project_id', $id)
->where('status', 'accepted') // Hanya pengikut yang diterima
->with('user') // Ambil data pengguna yang mengikuti
->get();
return view('penawaran.show_pendanaan', compact('project', 'followers'));
}
public function showRiset($id)
{
// Find the project by its ID
$project = PenawaranProject::with('riset')->findOrFail($id);
// Mengambil daftar pengikut untuk proyek ini
$followers = FollowPenawaran::where('project_id', $id)
->where('status', 'accepted') // Hanya pengikut yang diterima
->with('user') // Ambil data pengguna yang mengikuti
->get();
return view('penawaran.show_riset', compact('project', 'followers'));
}
}