From 3fd63e844cc7b5868d2f90405d510abb94f8f401 Mon Sep 17 00:00:00 2001 From: Irwan Cahyono Date: Tue, 28 Apr 2026 15:02:53 +0700 Subject: [PATCH] data ekosistem petani Co-authored-by: Copilot --- app/Enums/HubunganDalamKeluarga.php | 31 ++ app/Enums/Pekerjaan.php | 58 ++++ app/Enums/Pendidikan.php | 41 +++ app/Enums/Pernikahan.php | 31 ++ .../Web/Ekosistem/PetaniCPMController.php | 187 ++++++++++ app/Models/Ekosistem/PetaniCPM.php | 88 +++++ .../2026_04_27_092222_create_petani_table.php | 58 ++++ .../views/ekosistem/petani-cpm/add.blade.php | 315 +++++++++++++++++ .../views/ekosistem/petani-cpm/edit.blade.php | 323 ++++++++++++++++++ .../ekosistem/petani-cpm/index.blade.php | 113 ++++++ .../views/ekosistem/petani-cpm/view.blade.php | 158 +++++++++ routes/web.php | 3 + 12 files changed, 1406 insertions(+) create mode 100644 app/Enums/HubunganDalamKeluarga.php create mode 100644 app/Enums/Pekerjaan.php create mode 100644 app/Enums/Pendidikan.php create mode 100644 app/Enums/Pernikahan.php create mode 100644 app/Http/Controllers/Web/Ekosistem/PetaniCPMController.php create mode 100644 app/Models/Ekosistem/PetaniCPM.php create mode 100644 database/migrations/2026_04_27_092222_create_petani_table.php create mode 100644 resources/views/ekosistem/petani-cpm/add.blade.php create mode 100644 resources/views/ekosistem/petani-cpm/edit.blade.php create mode 100644 resources/views/ekosistem/petani-cpm/index.blade.php create mode 100644 resources/views/ekosistem/petani-cpm/view.blade.php diff --git a/app/Enums/HubunganDalamKeluarga.php b/app/Enums/HubunganDalamKeluarga.php new file mode 100644 index 0000000..1e89129 --- /dev/null +++ b/app/Enums/HubunganDalamKeluarga.php @@ -0,0 +1,31 @@ + 'Kepala Keluarga', + self::ISTRI_SUAMI => 'Istri/Suami', + self::ANAK => 'Anak', + self::KELUARGA_INTI => 'Keluarga Inti (Menantu, Cucu, Orang Tua, Mertua, Saudara Kandung)', + self::FAMILI_LAIN => 'Famili Lain/Pembantu', + }; + } + + public static function options(): array + { + return collect(self::cases())->map(fn ($case) => [ + 'value' => $case->value, + 'label' => $case->label(), + ])->toArray(); + } +} \ No newline at end of file diff --git a/app/Enums/Pekerjaan.php b/app/Enums/Pekerjaan.php new file mode 100644 index 0000000..1bd2906 --- /dev/null +++ b/app/Enums/Pekerjaan.php @@ -0,0 +1,58 @@ + 'Petani Pemilik Lahan', + self::PETANI_PENYEWA => 'Petani Penyewa', + self::BURUH_TANI => 'Buruh Tani', + self::NELAYAN_PEMILIK => 'Nelayan Pemilik Kapal/Perahu', + self::NELAYAN_PENYEWA => 'Nelayan Penyewa Kapal/Perahu', + self::BURUH_NELAYAN => 'Buruh Nelayan', + self::PNS => 'PNS', + self::PEDAGANG => 'Pedagang', + self::GURU => 'Guru', + self::GURU_AGAMA => 'Guru Agama', + self::PERANGKAT_DESA => 'Perangkat Desa', + self::PEGAWAI_DESA => 'Pegawai Kantor Desa', + self::PENGOLAHAN_INDUSTRI => 'Pengolahan/Industri', + self::TNI_POLRI => 'TNI/Polri', + self::KARYAWAN_SWASTA => 'Karyawan Swasta', + self::WIRAUSAHA => 'Wirausaha', + self::TKI => 'TKI', + self::LAINNYA => 'Lainnya', + }; + } + + public static function options(): array + { + return collect(self::cases())->map(fn ($case) => [ + 'value' => $case->value, + 'label' => $case->label(), + ])->toArray(); + } +} diff --git a/app/Enums/Pendidikan.php b/app/Enums/Pendidikan.php new file mode 100644 index 0000000..6dbdc22 --- /dev/null +++ b/app/Enums/Pendidikan.php @@ -0,0 +1,41 @@ + 'Tidak Sekolah', + self::SD => 'SD atau Sederajat', + self::SMP => 'SMP atau Sederajat', + self::SMA => 'SMA atau Sederajat', + self::DIPLOMA => 'Diploma 1-3 (D1-D3)', + self::SARJANA => 'Sarjana (S1) atau sederajat', + self::MAGISTER => 'Magister (S2) atau sederajat', + self::DOKTOR => 'Doktor (S3) atau sederajat', + self::PESANTREN => 'Pesantren, Semiari, Wihara, atau Pendidikan Keagamaan Formal', + self::LAINNYA => 'Lainnya', + }; + } + + public static function options(): array + { + return collect(self::cases())->map(fn ($case) => [ + 'value' => $case->value, + 'label' => $case->label(), + ])->toArray(); + } +} diff --git a/app/Enums/Pernikahan.php b/app/Enums/Pernikahan.php new file mode 100644 index 0000000..a063eb2 --- /dev/null +++ b/app/Enums/Pernikahan.php @@ -0,0 +1,31 @@ + 'Belum Menikah', + self::KAWIN_TERCATAT => 'Menikah (Tercatat)', + self::KAWIN_BELUM_TERCATAT => 'Menikah (Belum Tercatat)', + self::CERAI_HIDUP => 'Cerai Hidup', + self::CERAI_MATI => 'Cerai Mati', + }; + } + + public static function options(): array + { + return collect(self::cases())->map(fn ($case) => [ + 'value' => $case->value, + 'label' => $case->label(), + ])->toArray(); + } +} \ No newline at end of file diff --git a/app/Http/Controllers/Web/Ekosistem/PetaniCPMController.php b/app/Http/Controllers/Web/Ekosistem/PetaniCPMController.php new file mode 100644 index 0000000..e67b130 --- /dev/null +++ b/app/Http/Controllers/Web/Ekosistem/PetaniCPMController.php @@ -0,0 +1,187 @@ +query('per_page', 10); + $search = strtolower($request->query('search', '')); + + $petani = PetaniCPM::when($search, function ($query, $search) { + return $query->where('nama', 'like', "%{$search}%"); + }) + ->paginate($perPage); + + return view('ekosistem.petani-cpm.index', compact('petani')); + } + + public function create(): View + { + if (!Gate::any(['super_admin', 'admin', 'fasilitator'])) { + abort(403); + } + + $pendidikan = Pendidikan::options(); + $pekerjaan = Pekerjaan::options(); + $pernikahan = Pernikahan::options(); + $statusKeluarga = HubunganDalamKeluarga::options(); + + $provinsi = Provinsi::all(); + $komoditas = Komoditas::all(); + + return view('ekosistem.petani-cpm.add', compact('pendidikan', 'pekerjaan', + 'pernikahan', 'statusKeluarga', 'provinsi', 'komoditas')); + } + + /** + * Store a newly created resource in storage. + */ + public function store(Request $request): RedirectResponse + { + if (!Gate::any(['super_admin', 'admin', 'fasilitator'])) { + abort(403); + } + + $validatedData = $request->validate([ + 'nama' => ['required','string','max:255'], + 'jenis_kelamin' => ['required','boolean'], + 'tanggal_lahir' => ['required','date'], + 'pendidikan_terakhir' => ['required', Rule::enum(Pendidikan::class)], + 'alamat' => ['required','string','max:500'], + 'desa_kelurahan_id' => ['required','exists:master_desa_kelurahan,id'], + 'pekerjaan_utama' => ['required', Rule::enum(Pekerjaan::class)], + 'komoditas_id' => ['required','exists:master_komoditas,id'], + 'lama_bertani' => ['required','numeric','min:0'], + 'luas_lahan' => ['required','numeric','min:0'], + 'pekerjaan_sampingan' => ['nullable', Rule::enum(Pekerjaan::class)], + 'komoditas_sampingan_id' => ['nullable','exists:master_komoditas,id'], + 'lama_bertani_sampingan' => ['nullable','numeric','min:0'], + 'luas_lahan_sampingan' => ['nullable','numeric','min:0'], + 'status_perkawinan' => ['required', Rule::enum(Pernikahan::class)], + 'status_keluarga' => ['required', Rule::enum(HubunganDalamKeluarga::class)], + 'jumlah_tanggungan' => ['nullable','integer','min:0'], + 'petani_pengumpul' => ['nullable','array'], + 'petani_pengumpul.*' => ['in:petani,pengumpul'], + ]); + + PetaniCPM::create([...$validatedData, + 'created_by' => auth()->id(), + 'updated_by' => auth()->id()]); + + return redirect()->route('petani-cpm.index')->with('success', 'Data petani CPM berhasil ditambahkan.'); + } + + /** + * Display the specified resource. + */ + public function show(string $id) + { + if (!Gate::any(['super_admin', 'admin', 'fasilitator'])) { + abort(403); + } + + $petani = PetaniCPM::findOrFail($id); + + return view('ekosistem.petani-cpm.view', compact('petani')); + } + + /** + * Show the form for editing the specified resource. + */ + public function edit(string $id) + { + if (!Gate::any(['super_admin', 'admin', 'fasilitator'])) { + abort(403); + } + + $petani = PetaniCPM::findOrFail($id); + + $pendidikan = Pendidikan::options(); + $pekerjaan = Pekerjaan::options(); + $pernikahan = Pernikahan::options(); + $statusKeluarga = HubunganDalamKeluarga::options(); + + $provinsi = Provinsi::all(); + $komoditas = Komoditas::all(); + + return view('ekosistem.petani-cpm.edit', compact('petani', 'pendidikan', 'pekerjaan', + 'pernikahan', 'statusKeluarga', 'provinsi', 'komoditas')); + } + + /** + * Update the specified resource in storage. + */ + public function update(Request $request, string $id) + { + if (!Gate::any(['super_admin', 'admin', 'fasilitator'])) { + abort(403); + } + + $petani = PetaniCPM::findOrFail($id); + + $validatedData = $request->validate([ + 'nama' => ['required','string','max:255'], + 'jenis_kelamin' => ['required','boolean'], + 'tanggal_lahir' => ['required','date'], + 'pendidikan_terakhir' => ['required', Rule::enum(Pendidikan::class)], + 'alamat' => ['required','string','max:500'], + 'desa_kelurahan_id' => ['required','exists:master_desa_kelurahan,id'], + 'pekerjaan_utama' => ['required', Rule::enum(Pekerjaan::class)], + 'komoditas_id' => ['required','exists:master_komoditas,id'], + 'lama_bertani' => ['required','numeric','min:0'], + 'luas_lahan' => ['required','numeric','min:0'], + 'pekerjaan_sampingan' => ['nullable', Rule::enum(Pekerjaan::class)], + 'komoditas_sampingan_id' => ['nullable','exists:master_komoditas,id'], + 'lama_bertani_sampingan' => ['nullable','numeric','min:0'], + 'luas_lahan_sampingan' => ['nullable','numeric','min:0'], + 'status_perkawinan' => ['required', Rule::enum(Pernikahan::class)], + 'status_keluarga' => ['required', Rule::enum(HubunganDalamKeluarga::class)], + 'jumlah_tanggungan' => ['nullable','integer','min:0'], + 'petani_pengumpul' => ['nullable','array'], + 'petani_pengumpul.*' => ['in:petani,pengumpul'], + ]); + + $petani->update([...$validatedData, + 'updated_by' => auth()->id()]); + + return redirect()->route('petani-cpm.index')->with('success', 'Data petani CPM berhasil diperbarui.'); + } + + /** + * Remove the specified resource from storage. + */ + public function destroy(string $id) + { + if (!Gate::any(['super_admin', 'admin', 'fasilitator'])) { + abort(403); + } + + $petani = PetaniCPM::findOrFail($id); + $petani->update(['deleted_by' => auth()->id()]); + $petani->delete(); + + return redirect()->route('petani-cpm.index')->with('success', 'Data petani CPM berhasil dihapus.'); + } +} diff --git a/app/Models/Ekosistem/PetaniCPM.php b/app/Models/Ekosistem/PetaniCPM.php new file mode 100644 index 0000000..f5a606f --- /dev/null +++ b/app/Models/Ekosistem/PetaniCPM.php @@ -0,0 +1,88 @@ + 'boolean', + 'tanggal_lahir' => 'date', + 'lama_bertani' => 'float', + 'luas_lahan' => 'float', + 'lama_bertani_sampingan' => 'float', + 'luas_lahan_sampingan' => 'float', + 'jumlah_tanggungan' => 'integer', + 'petani_pengumpul' => 'array', + 'pendidikan_terakhir' => Pendidikan::class, + 'pekerjaan_utama' => Pekerjaan::class, + 'pekerjaan_sampingan' => Pekerjaan::class, + 'status_perkawinan' => Pernikahan::class, + 'status_keluarga' => HubunganDalamKeluarga::class, + ]; + + public function getUmurAttribute(): ?int + { + if (!$this->tanggal_lahir) { + return null; + } + + return Carbon::parse($this->tanggal_lahir)->age; + } + + public function desaKelurahan(): BelongsTo + { + return $this->belongsTo(DesaKelurahan::class, 'desa_kelurahan_id'); + } + + public function komoditas(): BelongsTo + { + return $this->belongsTo(Komoditas::class, 'komoditas_id'); + } + + public function komoditasSampingan(): BelongsTo + { + return $this->belongsTo(Komoditas::class, 'komoditas_sampingan_id'); + } +} diff --git a/database/migrations/2026_04_27_092222_create_petani_table.php b/database/migrations/2026_04_27_092222_create_petani_table.php new file mode 100644 index 0000000..13df24f --- /dev/null +++ b/database/migrations/2026_04_27_092222_create_petani_table.php @@ -0,0 +1,58 @@ +id(); + + $table->string('nama'); + $table->boolean('jenis_kelamin'); + $table->date('tanggal_lahir'); + + $table->string('pendidikan_terakhir')->nullable(); + + $table->string('alamat')->nullable(); + $table->foreignId('desa_kelurahan_id')->nullable()->constrained('master_desa_kelurahan'); + + $table->string('pekerjaan_utama')->nullable(); + $table->foreignId('komoditas_id')->nullable()->constrained('master_komoditas'); + $table->float('lama_bertani', 8)->nullable(); + $table->float('luas_lahan', 8)->nullable(); + + $table->string('pekerjaan_sampingan')->nullable(); + $table->foreignId('komoditas_sampingan_id')->nullable()->constrained('master_komoditas'); + $table->float('lama_bertani_sampingan', 8)->nullable(); + $table->float('luas_lahan_sampingan', 8)->nullable(); + + $table->string('status_perkawinan')->nullable(); + $table->string('status_keluarga')->nullable(); + $table->integer('jumlah_tanggungan')->nullable(); + + $table->jsonb('petani_pengumpul')->nullable(); + + $table->foreignId('created_by')->nullable()->constrained('users')->onDelete('set null'); + $table->foreignId('updated_by')->nullable()->constrained('users')->onDelete('set null'); + $table->foreignId('deleted_by')->nullable()->constrained('users')->onDelete('set null'); + + $table->timestamps(); + $table->softDeletes(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('ekosistem_petani_cpm'); + } +}; diff --git a/resources/views/ekosistem/petani-cpm/add.blade.php b/resources/views/ekosistem/petani-cpm/add.blade.php new file mode 100644 index 0000000..bb67a67 --- /dev/null +++ b/resources/views/ekosistem/petani-cpm/add.blade.php @@ -0,0 +1,315 @@ +@extends('layout.main') + +@section('content') +
+
+
+
Tambah Petani (CPM) Baru
+
+ +
+
+ @csrf + + @if ($errors->any()) +
+
    + @foreach ($errors->all() as $error) +
  • {{ $error }}
  • + @endforeach +
+
+ @endif + +
Informasi Petani
+
+
+ + + @error('nama')
{{ $message }}
@enderror +
+
+ + + @error('jenis_kelamin')
{{ $message }}
@enderror +
+
+ + + @error('tanggal_lahir')
{{ $message }}
@enderror +
+
+ + + @error('pendidikan_terakhir')
{{ $message }}
@enderror +
+
+
+
+ + + @error('alamat')
{{ $message }}
@enderror +
+
+
+
+ + + @error('provinsi_id')
{{ $message }}
@enderror +
+
+ + + @error('kabupaten_id')
{{ $message }}
@enderror +
+
+ + + @error('kecamatan_id')
{{ $message }}
@enderror +
+
+ + + @error('desa_kelurahan_id')
{{ $message }}
@enderror +
+
+ +
+
Informasi Pekerjaan
+ +
+
+ + + @error('pekerjaan_utama')
{{ $message }}
@enderror +
+
+ + + @error('komoditas_id')
{{ $message }}
@enderror +
+
+ + + @error('luas_lahan')
{{ $message }}
@enderror +
+
+ + + @error('lama_bertani')
{{ $message }}
@enderror +
+
+
+
+ + + @error('pekerjaan_sampingan')
{{ $message }}
@enderror +
+
+ + + @error('komoditas_sampingan_id')
{{ $message }}
@enderror +
+
+ + + @error('luas_lahan_sampingan')
{{ $message }}
@enderror +
+
+ + + @error('lama_bertani_sampingan')
{{ $message }}
@enderror +
+
+
+
+ + + @error('petani_pengumpul')
{{ $message }}
@enderror +
+
+ +
+
Informasi Keluarga
+ +
+
+ + + @error('status_perkawinan')
{{ $message }}
@enderror +
+
+ + + @error('status_keluarga')
{{ $message }}
@enderror +
+
+ + + @error('jumlah_tanggungan')
{{ $message }}
@enderror +
+
+ +
+ Kembali + +
+
+
+
+
+@endsection + +@push('scripts') + +@endpush \ No newline at end of file diff --git a/resources/views/ekosistem/petani-cpm/edit.blade.php b/resources/views/ekosistem/petani-cpm/edit.blade.php new file mode 100644 index 0000000..626408b --- /dev/null +++ b/resources/views/ekosistem/petani-cpm/edit.blade.php @@ -0,0 +1,323 @@ +@extends('layout.main') + +@section('content') +
+
+
+
Edit Petani (CPM)
+
+ +
+
+ @csrf + @method('PUT') + + @if ($errors->any()) +
+
    + @foreach ($errors->all() as $error) +
  • {{ $error }}
  • + @endforeach +
+
+ @endif + +
Informasi Petani
+
+
+ + + @error('nama')
{{ $message }}
@enderror +
+
+ + + @error('jenis_kelamin')
{{ $message }}
@enderror +
+
+ + + @error('tanggal_lahir')
{{ $message }}
@enderror +
+
+ + + @error('pendidikan_terakhir')
{{ $message }}
@enderror +
+
+
+
+ + + @error('alamat')
{{ $message }}
@enderror +
+
+
+
+ + + @error('provinsi_id')
{{ $message }}
@enderror +
+
+ + + @error('kabupaten_id')
{{ $message }}
@enderror +
+
+ + + @error('kecamatan_id')
{{ $message }}
@enderror +
+
+ + + @error('desa_kelurahan_id')
{{ $message }}
@enderror +
+
+ +
+
Informasi Pekerjaan
+ +
+
+ + + @error('pekerjaan_utama')
{{ $message }}
@enderror +
+
+ + + @error('komoditas_id')
{{ $message }}
@enderror +
+
+ + + @error('luas_lahan')
{{ $message }}
@enderror +
+
+ + + @error('lama_bertani')
{{ $message }}
@enderror +
+
+
+
+ + + @error('pekerjaan_sampingan')
{{ $message }}
@enderror +
+
+ + + @error('komoditas_sampingan_id')
{{ $message }}
@enderror +
+
+ + + @error('luas_lahan_sampingan')
{{ $message }}
@enderror +
+
+ + + @error('lama_bertani_sampingan')
{{ $message }}
@enderror +
+
+
+
+ + + @error('petani_pengumpul')
{{ $message }}
@enderror +
+
+ +
+
Informasi Keluarga
+ +
+
+ + + @error('status_perkawinan')
{{ $message }}
@enderror +
+
+ + + @error('status_keluarga')
{{ $message }}
@enderror +
+
+ + + @error('jumlah_tanggungan')
{{ $message }}
@enderror +
+
+ +
+ Kembali + +
+
+
+
+
+@endsection + +@push('scripts') + +@endpush \ No newline at end of file diff --git a/resources/views/ekosistem/petani-cpm/index.blade.php b/resources/views/ekosistem/petani-cpm/index.blade.php new file mode 100644 index 0000000..56238f2 --- /dev/null +++ b/resources/views/ekosistem/petani-cpm/index.blade.php @@ -0,0 +1,113 @@ +@extends('layout.main') + +@section('content') +
+
+
+
+
+
+ + + +
+
+
+
+ + +
+ + Tambah + +
+
+
+ +
+ + + + + + + + + + + + + @forelse($petani as $p) + + + + + + + + + @empty + + + + @endforelse + +
NoNama PetaniJenis KelaminUsiaDesa/KelurahanAksi
{{ $loop->iteration }}{{ $p->nama }}{{ $p->jenis_kelamin ? 'Laki-laki' : 'Perempuan' }}{{ $p->umur }} tahun{{ $p->desaKelurahan->nama }}, {{ $p->desaKelurahan->kecamatan->nama }}, {{ $p->desaKelurahan->kecamatan->kabupatenKota->nama }}, {{ $p->desaKelurahan->kecamatan->kabupatenKota->provinsi->nama }} +
+ + + +
+
Tidak ada data ditemukan.
+
+ + +
+
+@endsection + +@push('scripts') + +@endpush \ No newline at end of file diff --git a/resources/views/ekosistem/petani-cpm/view.blade.php b/resources/views/ekosistem/petani-cpm/view.blade.php new file mode 100644 index 0000000..32212be --- /dev/null +++ b/resources/views/ekosistem/petani-cpm/view.blade.php @@ -0,0 +1,158 @@ +@extends('layout.main') + +@section('content') +
+
+
+
Edit Petani (CPM)
+
+ +
+
+ +
Informasi Petani
+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+
+
+ + +
+
+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ +
+
Informasi Pekerjaan
+ +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+
+
+ + +
+
+ +
+
Informasi Keluarga
+ +
+
+ + +
+
+ + +
+
+ + +
+
+ +
+ Kembali +
+
+
+
+
+@endsection + +@push('scripts') + +@endpush \ No newline at end of file diff --git a/routes/web.php b/routes/web.php index 35232b8..48a1d5d 100644 --- a/routes/web.php +++ b/routes/web.php @@ -117,10 +117,13 @@ Route::middleware('auth') Route::put('tabel/{tabelId}/kolom/{id}/move-down', [App\Http\Controllers\Web\Ekosistem\KolomBasisDataController::class, 'moveDown'])->name('tabel.kolom.move-down'); Route::resource('tabel.kolom', App\Http\Controllers\Web\Ekosistem\KolomBasisDataController::class)->only(['show', 'store', 'update', 'destroy']); Route::resource('tabel.data', App\Http\Controllers\Web\Ekosistem\ValueBasisDataController::class); + Route::resource('petani-cpm', App\Http\Controllers\Web\Ekosistem\PetaniCPMController::class); // Monev Route::resource('framework', App\Http\Controllers\Web\Program\FrameworkController::class); Route::resource('framework.transformasi', App\Http\Controllers\Web\Program\TransformasiController::class)->only(['show', 'store', 'update', 'destroy']); Route::resource('framework.transformasi.aktivitas', App\Http\Controllers\Web\Program\AktivitasController::class)->only(['show', 'store', 'update', 'destroy']); Route::resource('framework.transformasi.aktivitas.target', App\Http\Controllers\Web\Program\TargetController::class)->only(['show', 'store', 'update', 'destroy']); + + }); \ No newline at end of file