diff --git a/app/Http/Controllers/Web/Produktivitas/PendidikanPelatihanController.php b/app/Http/Controllers/Web/Produktivitas/PendidikanPelatihanController.php index 658655a..39251f3 100644 --- a/app/Http/Controllers/Web/Produktivitas/PendidikanPelatihanController.php +++ b/app/Http/Controllers/Web/Produktivitas/PendidikanPelatihanController.php @@ -5,20 +5,159 @@ namespace App\Http\Controllers\Web\Produktivitas; use App\Http\Controllers\Controller; use Illuminate\Http\Request; use Illuminate\Support\Facades\Gate; +use Illuminate\Support\Str; use App\Models\Pertanian\Petani; +use App\Models\Pertanian\SurveyPelatihan; +use App\Models\Pertanian\SurveySertifikasi; class PendidikanPelatihanController extends Controller { - public function index($petaniId, Request $request) + private function authorizeAccess(): void { if (!Gate::any(['super_admin', 'admin', 'fasilitator'])) { abort(403); } + } + + public function index(Petani $petani) + { + $this->authorizeAccess(); $title = 'Petani - Pendidikan dan Pelatihan'; - $petani = Petani::findOrFail($petaniId); - - return view('produktivitas.petani.pendidikan-pelatihan.add', compact('title', 'petani')); + + $petani->load([ + 'surveyPelatihan', + 'surveySertifikasi', + ]); + + return view('produktivitas.petani.pendidikan-pelatihan.index', compact( + 'title', + 'petani' + )); } -} + + public function storePelatihan(Request $request, Petani $petani) + { + $this->authorizeAccess(); + + $validatedData = $request->validate([ + 'riwayat_pelatihan' => ['nullable', 'array'], + + 'riwayat_pelatihan.*.jenis_pelatihan' => ['nullable', 'string', 'max:255'], + 'riwayat_pelatihan.*.penyelenggara' => ['nullable', 'string', 'max:255'], + 'riwayat_pelatihan.*.tahun' => ['nullable', 'integer', 'min:1900', 'max:' . date('Y')], + ], [ + 'riwayat_pelatihan.*.tahun.integer' => 'Tahun pelatihan harus berupa angka.', + 'riwayat_pelatihan.*.tahun.min' => 'Tahun pelatihan tidak valid.', + 'riwayat_pelatihan.*.tahun.max' => 'Tahun pelatihan tidak boleh melebihi tahun saat ini.', + ], [ + 'riwayat_pelatihan.*.jenis_pelatihan' => 'jenis pelatihan', + 'riwayat_pelatihan.*.penyelenggara' => 'penyelenggara', + 'riwayat_pelatihan.*.tahun' => 'tahun pelatihan', + ]); + + foreach ($validatedData['riwayat_pelatihan'] ?? [] as $item) { + if ( + empty($item['jenis_pelatihan']) && + empty($item['penyelenggara']) && + empty($item['tahun']) + ) { + continue; + } + + $petani->surveyPelatihan()->create([ + 'uid' => 'SPL-' . strtoupper(Str::random(10)), + 'petani_id' => $petani->id, + 'jenis_pelatihan' => $item['jenis_pelatihan'] ?? null, + 'penyelenggara' => $item['penyelenggara'] ?? null, + 'tahun_pelaksanaan' => $item['tahun'] ?? null, + ]); + } + + return back()->with('success', 'Riwayat pelatihan berhasil disimpan.'); + } + + public function destroyPelatihan(Petani $petani, SurveyPelatihan $surveyPelatihan) + { + $this->authorizeAccess(); + + abort_unless($surveyPelatihan->petani_id === $petani->id, 404); + + $surveyPelatihan->delete(); + + return back()->with('success', 'Riwayat pelatihan berhasil dihapus.'); + } + + public function storeSertifikasi(Request $request, Petani $petani) + { + $this->authorizeAccess(); + + $sertifikasi = $request->input('sertifikasi', []); + + foreach ($sertifikasi as $index => $item) { + $status = $item['status_berlaku_sertifikat'] ?? 0; + + if (is_array($status)) { + $status = in_array('1', $status, true) ? 1 : 0; + } else { + $status = $status == 1 ? 1 : 0; + } + $sertifikasi[$index]['status_berlaku_sertifikat'] = $status; + } + + $request->merge([ + 'sertifikasi' => $sertifikasi, + ]); + + $validatedData = $request->validate([ + 'sertifikasi' => ['nullable', 'array'], + + 'sertifikasi.*.jenis_sertifikasi' => ['nullable', 'string', 'max:255'], + 'sertifikasi.*.lembaga_penerbit' => ['nullable', 'string', 'max:255'], + 'sertifikasi.*.tahun' => ['nullable', 'integer', 'min:1900', 'max:' . date('Y')], + 'sertifikasi.*.status_berlaku_sertifikat' => ['nullable', 'boolean'], + ], [ + 'sertifikasi.*.tahun.integer' => 'Tahun sertifikasi harus berupa angka.', + 'sertifikasi.*.tahun.min' => 'Tahun sertifikasi tidak valid.', + 'sertifikasi.*.tahun.max' => 'Tahun sertifikasi tidak boleh melebihi tahun saat ini.', + ], [ + 'sertifikasi.*.jenis_sertifikasi' => 'jenis sertifikasi', + 'sertifikasi.*.lembaga_penerbit' => 'lembaga penerbit', + 'sertifikasi.*.tahun' => 'tahun sertifikasi', + 'sertifikasi.*.status_berlaku_sertifikat' => 'status sertifikat', + ]); + + foreach ($validatedData['sertifikasi'] ?? [] as $item) { + if ( + empty($item['jenis_sertifikasi']) && + empty($item['lembaga_penerbit']) && + empty($item['tahun']) + ) { + continue; + } + + $petani->surveySertifikasi()->create([ + 'uid' => 'SPS-' . strtoupper(Str::random(10)), + 'petani_id' => $petani->id, + 'jenis_sertifikasi' => $item['jenis_sertifikasi'] ?? null, + 'lembaga_penerbit' => $item['lembaga_penerbit'] ?? null, + 'tahun_pelaksanaan' => $item['tahun'] ?? null, + 'is_aktif' => $item['status_berlaku_sertifikat'] ?? 0, + ]); + } + + return back()->with('success', 'Sertifikasi berhasil disimpan.'); + } + + public function destroySertifikasi(Petani $petani, SurveySertifikasi $surveySertifikasi) + { + $this->authorizeAccess(); + + abort_unless($surveySertifikasi->petani_id === $petani->id, 404); + + $surveySertifikasi->delete(); + + return back()->with('success', 'Sertifikasi berhasil dihapus.'); + } +} \ No newline at end of file diff --git a/app/Models/Pertanian/Petani.php b/app/Models/Pertanian/Petani.php index afb0a39..594512b 100644 --- a/app/Models/Pertanian/Petani.php +++ b/app/Models/Pertanian/Petani.php @@ -108,6 +108,16 @@ class Petani extends Model return $this->hasOne(surveyPanen::class, 'petani_id')->latestOfMany(); } + public function surveyPelatihan(): HasMany + { + return $this->hasMany(surveyPelatihan::class, 'petani_id'); + } + + public function surveySertifikasi(): HasMany + { + return $this->hasMany(surveySertifikasi::class, 'petani_id'); + } + public function surveyProduktivitas(): HasOne { return $this->hasOne(surveyProduktivitas::class, 'petani_id')->latestOfMany(); diff --git a/app/Models/Pertanian/SurveyPelatihan.php b/app/Models/Pertanian/SurveyPelatihan.php new file mode 100644 index 0000000..219460c --- /dev/null +++ b/app/Models/Pertanian/SurveyPelatihan.php @@ -0,0 +1,33 @@ +belongsTo(Petani::class, 'petani_id'); + } +} diff --git a/app/Models/Pertanian/SurveySertifikasi.php b/app/Models/Pertanian/SurveySertifikasi.php new file mode 100644 index 0000000..352fd9d --- /dev/null +++ b/app/Models/Pertanian/SurveySertifikasi.php @@ -0,0 +1,32 @@ +belongsTo(Petani::class, 'petani_id'); + } +} diff --git a/resources/views/produktivitas/petani/header.blade.php b/resources/views/produktivitas/petani/header.blade.php index a10b784..6beee79 100644 --- a/resources/views/produktivitas/petani/header.blade.php +++ b/resources/views/produktivitas/petani/header.blade.php @@ -285,7 +285,7 @@ diff --git a/resources/views/produktivitas/petani/pendidikan-pelatihan/index.blade.php b/resources/views/produktivitas/petani/pendidikan-pelatihan/index.blade.php new file mode 100644 index 0000000..6b2e4c5 --- /dev/null +++ b/resources/views/produktivitas/petani/pendidikan-pelatihan/index.blade.php @@ -0,0 +1,539 @@ +@extends('layout.main') + +@push('style') + +@endpush + +@section('content') +
+ @if ($errors->any()) +
+ +
+ @endif + +
+ + + +
+ + @include('produktivitas.petani.header', ['petani' => $petani]) +
+
+
+ Riwayat Pelatihan +
+ + {{-- DATA LAMA --}} + @if ($petani->surveyPelatihan->count() > 0) + @foreach ($petani->surveyPelatihan as $row) +
+
+ + +
+ +
+ + +
+ +
+ + +
+ +
+
+ @csrf + @method('DELETE') + + +
+
+
+ @endforeach + @else +

Belum ada riwayat pelatihan.

+ @endif + + {{-- FORM TAMBAH DATA BARU --}} +
+ @csrf + +
+
+
+
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ +
+
+ +
+
+
+ +
+ + + +
+
+
+
+ + {{-- SERTIFIKASI KEAHLIAN --}} +
+
+
+ Sertifikasi Keahlian +
+ + {{-- DATA LAMA --}} + @if ($petani->surveySertifikasi->count() > 0) + @foreach ($petani->surveySertifikasi as $row) +
+
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + + @php + $statusBerlaku = (bool) $row->is_aktif; + @endphp + +
+ + + + {{ $statusBerlaku ? 'Masih Berlaku' : 'Tidak Berlaku' }} + +
+
+ +
+
+ @csrf + @method('DELETE') + + +
+
+
+ @endforeach + @else +

Belum ada data sertifikasi.

+ @endif + + {{-- FORM TAMBAH DATA BARU --}} +
+ @csrf + +
+
+
+
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + + +
+ +
+ +
+
+ +
+
+
+ +
+ + + +
+
+
+
+
+
+
+@endsection + +@push('scripts') + +@endpush \ No newline at end of file diff --git a/routes/web.php b/routes/web.php index 6bd2f46..7d08cbb 100644 --- a/routes/web.php +++ b/routes/web.php @@ -197,7 +197,15 @@ Route::middleware('auth') Route::resource('petani.lahan-tanaman.tanaman', App\Http\Controllers\Web\Produktivitas\PetaniLahanTanamanController::class)->only(['show', 'update', 'destroy'])->whereNumber('petani'); Route::resource('petani.praktik-budidaya', App\Http\Controllers\Web\Produktivitas\PraktikBudidayaController::class)->whereNumber('petani'); Route::resource('petani.survey-produktivitas', App\Http\Controllers\Web\Produktivitas\SurveyProduktivitasController::class)->only(['store', 'destroy']); - Route::resource('petani.pendidikan-pelatihan', App\Http\Controllers\Web\Produktivitas\PendidikanPelatihanController::class); + + Route::prefix('petani/{petani}/pendidikan-pelatihan')->name('petani.pendidikan-pelatihan.')->group(function () { + Route::get('/', [App\Http\Controllers\Web\Produktivitas\PendidikanPelatihanController::class, 'index'])->name('index'); + Route::post('/pelatihan', [App\Http\Controllers\Web\Produktivitas\PendidikanPelatihanController::class, 'storePelatihan'])->name('pelatihan.store'); + Route::delete('/pelatihan/{surveyPelatihan}', [App\Http\Controllers\Web\Produktivitas\PendidikanPelatihanController::class, 'destroyPelatihan'])->name('pelatihan.destroy'); + Route::post('/sertifikasi', [App\Http\Controllers\Web\Produktivitas\PendidikanPelatihanController::class, 'storeSertifikasi'])->name('sertifikasi.store'); + Route::delete('/sertifikasi/{surveySertifikasi}', [App\Http\Controllers\Web\Produktivitas\PendidikanPelatihanController::class, 'destroySertifikasi'])->name('sertifikasi.destroy'); + }); + Route::resource('petani.sosial-ekonomi', App\Http\Controllers\Web\Produktivitas\SosialEkonomiController::class)->whereNumber('petani'); Route::resource('petani.akses-pasar', App\Http\Controllers\Web\Produktivitas\AksesPasarController::class)->whereNumber('petani'); });