diff --git a/app/Enums/Pendidikan.php b/app/Enums/Pendidikan.php index 6dbdc22..459c954 100644 --- a/app/Enums/Pendidikan.php +++ b/app/Enums/Pendidikan.php @@ -19,13 +19,13 @@ enum Pendidikan: string { return match($this) { self::TIDAK_SEKOLAH => 'Tidak Sekolah', - self::SD => 'SD atau Sederajat', - self::SMP => 'SMP atau Sederajat', - self::SMA => 'SMA atau Sederajat', + self::SD => 'SD', + self::SMP => 'SMP', + self::SMA => 'SMA/SMK', 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::SARJANA => 'Sarjana (S1)', + self::MAGISTER => 'Magister (S2)', + self::DOKTOR => 'Doktor (S3)', self::PESANTREN => 'Pesantren, Semiari, Wihara, atau Pendidikan Keagamaan Formal', self::LAINNYA => 'Lainnya', }; diff --git a/app/Http/Controllers/Web/Dashboard/ProfilPetaniController.php b/app/Http/Controllers/Web/Dashboard/ProfilPetaniController.php index 6d88699..dd154e5 100644 --- a/app/Http/Controllers/Web/Dashboard/ProfilPetaniController.php +++ b/app/Http/Controllers/Web/Dashboard/ProfilPetaniController.php @@ -17,12 +17,12 @@ class ProfilPetaniController extends Controller { public function index() { - if (!Gate::allows('super_admin') && !Gate::allows('admin')) { + if (!Gate::any(['super_admin', 'admin', 'fasilitator'])) { abort(403); } $title = 'Dashboard Profil Petani'; - $komoditas = Komoditas::all(); + $komoditas = Komoditas::where('is_utama', true)->get(); $petani = Petani::pluck('id'); $lahan = Lahan::whereIn('petani_id', $petani)->get(); @@ -35,8 +35,8 @@ class ProfilPetaniController extends Controller ->get(); $lahanSummary = Lahan::select( 'komoditas_id', - DB::raw('COUNT(*) as total', - DB::raw('SUM(luas_lahan) as luas_lahan')) + DB::raw('COUNT(*) as total'), + DB::raw('SUM(luas_lahan) as luas_lahan') ) ->whereIn('petani_id', $petani) ->groupBy('komoditas_id') diff --git a/app/Http/Controllers/Web/Dashboard/SurveyPetaniController.php b/app/Http/Controllers/Web/Dashboard/SurveyPetaniController.php index eaf892c..3c3042e 100644 --- a/app/Http/Controllers/Web/Dashboard/SurveyPetaniController.php +++ b/app/Http/Controllers/Web/Dashboard/SurveyPetaniController.php @@ -57,6 +57,7 @@ class SurveyPetaniController extends Controller ->leftJoin("{$komoditasTable} as k", 'k.id', '=', 'p.komoditas_id') ->selectRaw("COALESCE(k.nama, 'Belum ditentukan') as nama") ->selectRaw('COUNT(p.id) as petani_count') + ->where('k.is_utama', true) ->groupBy('k.id', 'k.nama') ->orderByDesc('petani_count') ->get(); @@ -155,6 +156,7 @@ class SurveyPetaniController extends Controller ->leftJoin("{$komoditasTable} as k", 'k.id', '=', 'p.komoditas_id') ->selectRaw("COALESCE(k.nama, 'Belum ditentukan') as label") ->selectRaw('COALESCE(SUM(l.jumlah_tanaman), 0) as total') + ->where('k.is_utama', true) ->groupBy('k.id', 'k.nama') ->orderByDesc('total') ->get(); diff --git a/app/Http/Controllers/Web/Master/KomoditasController.php b/app/Http/Controllers/Web/Master/KomoditasController.php index 14d4583..3f599f6 100644 --- a/app/Http/Controllers/Web/Master/KomoditasController.php +++ b/app/Http/Controllers/Web/Master/KomoditasController.php @@ -28,9 +28,13 @@ class KomoditasController extends Controller public function store(Request $request) { $validator = Validator::make($request->all(), [ - 'nama' => ['required', 'string', 'max:255', 'unique:master_komoditas,nama'], // Tambah unique biar nggak ada data kembar + 'nama' => ['required', 'string', 'max:255', 'unique:master_komoditas,nama'], + 'kode' => ['required', 'string', 'max:2', 'unique:master_komoditas,kode'], + 'is_utama' => ['nullable', 'boolean'], ], [ - 'nama.unique' => 'Nama komoditas ini sudah ada di database.' + 'nama.unique' => 'Nama komoditas ini sudah ada di database.', + 'kode.unique' => 'Kode komoditas ini sudah ada di database.', + 'kode.max' => 'Kode komoditas maksimal 2 Digit.' ]); if ($validator->fails()) { @@ -39,6 +43,8 @@ class KomoditasController extends Controller Komoditas::create([ 'nama' => $request->nama, + 'kode' => $request->kode, + 'is_utama' => $request->is_utama, 'created_by' => auth()->id(), 'updated_by' => auth()->id(), ]); @@ -55,9 +61,13 @@ class KomoditasController extends Controller public function update(Request $request, $id) { $validator = Validator::make($request->all(), [ - 'nama' => ['required', 'string', 'max:255', 'unique:master_komoditas,nama,' . $id], + 'nama' => ['required', 'string', 'max:255', 'unique:master_komoditas,nama,' . $id], + 'kode' => ['required', 'string', 'max:2', 'unique:master_komoditas,kode,' . $id], + 'is_utama' => ['nullable', 'boolean'], ], [ - 'nama.unique' => 'Nama komoditas ini sudah digunakan.' + 'nama.unique' => 'Nama komoditas ini sudah ada di database.', + 'kode.unique' => 'Kode komoditas ini sudah ada di database.', + 'kode.max' => 'Kode komoditas maksimal 2 Digit.' ]); if ($validator->fails()) { @@ -66,8 +76,10 @@ class KomoditasController extends Controller $komoditas = Komoditas::findOrFail($id); $komoditas->update([ - 'nama' => $request->nama, - 'updated_by' => auth()->id(), + 'nama' => $request->nama, + 'kode' => $request->kode, + 'is_utama' => $request->is_utama, + 'updated_by' => auth()->id(), ]); return response()->json(['status' => 'success', 'message' => 'Komoditas berhasil diupdate.']); diff --git a/app/Http/Controllers/Web/Produktivitas/PetaniController.php b/app/Http/Controllers/Web/Produktivitas/PetaniController.php index 387ba64..92a99ef 100644 --- a/app/Http/Controllers/Web/Produktivitas/PetaniController.php +++ b/app/Http/Controllers/Web/Produktivitas/PetaniController.php @@ -15,6 +15,9 @@ use App\Models\Wilayah\Provinsi; use App\Models\Pertanian\Petani; use App\Models\Wilayah\DesaKelurahan; use App\Models\Pertanian\Komoditas; +use App\Models\Pertanian\Tanaman; +use App\Models\Pertanian\Lahan; +use App\Models\Pertanian\SkorPetani; use App\Enums\Pendidikan; use App\Enums\Pekerjaan; @@ -27,6 +30,10 @@ class PetaniController extends Controller */ public function index(Request $request) { + if (!Gate::any(['super_admin', 'admin', 'fasilitator'])) { + abort(403); + } + $provinsi = Provinsi::orderBy('kode', 'asc')->get(); $query = Petani::with('desakelurahan') @@ -39,9 +46,35 @@ class PetaniController extends Controller }); } + if (auth()->user()->role->value === 'fasilitator') { + $query->where('created_by', auth()->user()->id); + } + $petani = $query->paginate($request->per_page ?? 10); - return view('produktivitas.petani.index', compact('petani', 'provinsi')); + $komoditas = Komoditas::where('is_utama', true)->get(); + $lahan = Lahan::whereIn('petani_id', $petani->pluck('id')) + ->whereIn('komoditas_id', $komoditas->pluck('id')) + ->get(); + $tanaman = Tanaman::whereIn('lahan_id', $lahan->pluck('id')) + ->whereIn('lahan_id', $lahan->pluck('id')) + ->get(); + + $case = " + CASE + WHEN skor_kesiapan_adopsi >= 4.0 THEN 'Penggerak' + WHEN skor_kesiapan_adopsi >= 3.0 THEN 'Perintis' + WHEN skor_kesiapan_adopsi >= 2.0 THEN 'Pemerhati' + WHEN skor_kesiapan_adopsi >= 1.0 THEN 'Pemula' + ELSE 'Belum Lengkap' + END + "; + $skor = SkorPetani::selectRaw("$case AS segmen, COUNT(*) AS total") + ->whereIn('petani_id', $petani->pluck('id')) + ->groupByRaw($case) + ->get(); + + return view('produktivitas.petani.index', compact('petani', 'provinsi', 'lahan', 'komoditas', 'tanaman', 'skor')); } public function create() @@ -54,7 +87,7 @@ class PetaniController extends Controller $pekerjaan = Pekerjaan::options(); $pernikahan = Pernikahan::options(); - $komoditas = Komoditas::all(); + $komoditas = Komoditas::where('is_utama', true)->get(); $provinsi = Provinsi::orderBy('kode', 'asc')->get(); @@ -174,7 +207,7 @@ class PetaniController extends Controller $provinsi = Provinsi::all(); - $komoditas = Komoditas::all(); + $komoditas = Komoditas::where('is_utama', true)->get(); return view('produktivitas.petani.edit', compact('petani', 'pendidikan', 'pekerjaan', 'pernikahan', 'provinsi', 'komoditas')); diff --git a/app/Http/Controllers/Web/Produktivitas/PetaniLahanController.php b/app/Http/Controllers/Web/Produktivitas/PetaniLahanController.php index 248413b..c4febdb 100644 --- a/app/Http/Controllers/Web/Produktivitas/PetaniLahanController.php +++ b/app/Http/Controllers/Web/Produktivitas/PetaniLahanController.php @@ -81,8 +81,8 @@ class PetaniLahanController extends Controller 'komoditas_id' => ['required', 'exists:master_komoditas,id'], 'jenis_komoditas_id' => ['required', 'exists:jenis_komoditas,id'], 'varietas_id' => ['nullable', 'exists:master_varietas,id'], - 'jumlah_tanaman' => ['required', 'numeric', 'min:1'], - 'umur_lahan' => ['required', 'numeric', 'min:1'], + 'jumlah_tanaman' => ['required', 'numeric', 'min:0'], + 'umur_lahan' => ['nullable', 'numeric', 'min:1'], 'umur_tanaman' => ['required', 'numeric', 'min:1'], 'kondisi_tanaman' => ['required', 'string', new Enum(KondisiTanaman::class)], 'serangan_hama' => ['nullable', 'string', new Enum(SeranganHama::class)], @@ -104,8 +104,8 @@ class PetaniLahanController extends Controller 'luas_lahan.min' => 'Luas lahan minimal 0.01.', 'jumlah_tanaman.required' => 'Jumlah tanaman wajib diisi.', 'jumlah_tanaman.numeric' => 'Jumlah tanaman diisi dengan angka.', - 'jumlah_tanaman.min' => 'Jumlah tanaman minimal 1.', - 'umur_lahan.required' => 'Umur lahan wajib diisi.', + 'jumlah_tanaman.min' => 'Jumlah tanaman minimal 0.', + //'umur_lahan.required' => 'Umur lahan wajib diisi.', 'umur_lahan.numeric' => 'Umur lahan diisi dengan angka.', 'umur_lahan.min' => 'Umur lahan minimal 1.', 'umur_tanaman.required' => 'Umur tanaman wajib diisi.', @@ -163,7 +163,7 @@ class PetaniLahanController extends Controller 'updated_by' => auth()->id()] ); - if ($lahan) { + if ($lahan && $lahan->jumlah_tanaman > 0) { $data = collect(range(1, $lahan->jumlah_tanaman))->map(function ($i) use ($lahan, $komoditas, $lahanUid) { return [ 'lahan_id' => $lahan->id, @@ -199,6 +199,8 @@ class PetaniLahanController extends Controller return redirect()->route('petani.lahan-tanaman.index', $petaniId)->with('success', 'Lahan berhasil ditambahkan.'); } + + return redirect()->route('petani.lahan-tanaman.index', $petaniId)->with('success', 'Lahan berhasil ditambahkan.'); } public function show(string $petaniId, string $id) diff --git a/app/Models/Pertanian/AksesPasar.php b/app/Models/Pertanian/AksesPasar.php index f455bd2..8f77920 100644 --- a/app/Models/Pertanian/AksesPasar.php +++ b/app/Models/Pertanian/AksesPasar.php @@ -50,7 +50,7 @@ class AksesPasar extends Model static::saved(function (AksesPasar $aksesPasar) { $petani = Petani::find($aksesPasar->petani_id); - $skor = SkorPetani::where('petani_id')->orderBy('id')->first(); + $skor = SkorPetani::where('petani_id', $petani->id)->orderBy('id')->first(); if (!$skor) { $petaniUid = $petani->uid; $part = explode('-', $petaniUid); @@ -61,6 +61,7 @@ class AksesPasar extends Model 'updated_by' => $petani->updated_by ]); } + $skor->update([ 'skor_d6_k1_6_pengalaman_menjual_ke_saluran_berbeda' => $aksesPasar->skor_pengalaman, 'skor_d6_k4_1_kesadaran_akses_pasar_premium' => $aksesPasar->skor_kesadaran_premium, diff --git a/app/Models/Pertanian/Komoditas.php b/app/Models/Pertanian/Komoditas.php index fc044b0..53b992c 100644 --- a/app/Models/Pertanian/Komoditas.php +++ b/app/Models/Pertanian/Komoditas.php @@ -16,11 +16,17 @@ class Komoditas extends Model protected $table = 'master_komoditas'; + protected $casts = [ + 'is_utama' => 'boolean', + ]; + protected $fillable = [ 'nama', + 'kode', 'created_by', 'updated_by', 'deleted_by', + 'is_utama', ]; protected static function booted() diff --git a/app/Models/Pertanian/Petani.php b/app/Models/Pertanian/Petani.php index 82db184..95cb12a 100644 --- a/app/Models/Pertanian/Petani.php +++ b/app/Models/Pertanian/Petani.php @@ -138,9 +138,9 @@ class Petani extends Model return $this->hasMany(SurveySertifikasi::class, 'petani_id'); } - public function surveyProduktivitas(): HasOne + public function surveyProduktivitas(): HasMany { - return $this->hasOne(SurveyProduktivitas::class, 'petani_id')->latestOfMany(); + return $this->hasMany(SurveyProduktivitas::class, 'petani_id'); } public function lahans(): HasMany diff --git a/app/Models/Pertanian/PraktikBudidaya.php b/app/Models/Pertanian/PraktikBudidaya.php index 9f82177..0a3782c 100644 --- a/app/Models/Pertanian/PraktikBudidaya.php +++ b/app/Models/Pertanian/PraktikBudidaya.php @@ -91,16 +91,29 @@ class PraktikBudidaya extends Model 'updated_by' => $petani->updated_by ]); } + + $kebiasaan = $praktikBudidaya->kebiasaan_konservasi_tanah ? count($praktikBudidaya->kebiasaan_konservasi_tanah) : 0; + $pemahaman = $praktikBudidaya->pemahaman_manfaat_konservasi_tanah == 'Ya, tahu manfaatnya' ? 1 : 0; + $skor_konservasi_tanah = 0; + if ($kebiasaan == 0) { + $skor_konservasi_tanah = 1; + } elseif ($kebiasaan == 1 && $pemahaman == 0) { + $skor_konservasi_tanah = 2; + } elseif ($kebiasaan == 1 && $pemahaman == 1) { + $skor_konservasi_tanah = 3; + } elseif ($kebiasaan > 1 && $pemahaman == 0) { + $skor_konservasi_tanah = 4; + } elseif ($kebiasaan > 1 && $pemahaman == 1) { + $skor_konservasi_tanah = 5; + } $skor->update([ - - 'skor_d2_k2_3_praktik_pemangkasan' => $praktikBudidaya->frekuensi_pemangkasan_komoditas_utama, + 'skor_d2_k2_3_praktik_pemangkasan' => $praktikBudidaya->frekuensi_pemangkasan_utama, 'skor_d2_k2_4_praktik_pemupukan' => $praktikBudidaya->pemberian_pupuk, - 'skor_d2_k2_5_pengendalian_opt' => $praktikBudidaya->metode_penanganan_hama_penyakit, + 'skor_d2_k2_5_pengendalian_opt' => $praktikBudidaya->metode_penanganan_opt, 'skor_d2_k2_6_sanitasi_kebun' => $praktikBudidaya->frekuensi_sanitasi_lahan, 'skor_d2_k2_6b_pengelolaan_gulma' => $praktikBudidaya->penanganan_gulma, - 'skor_d2_k2_7_penglolaan_air_irigasi' => $praktikBudidaya->kondisi_pengelolaan_air_irigasi, - //'skor_d2_k2_8_praktik_konservasi_tanah' => $praktikBudidaya->kebiasaan_konservasi_tanah, - //'skor_d2_k3_1_penentuan_pematangan' => $praktikBudidaya-> + 'skor_d2_k2_7_penglolaan_air_irigasi' => $praktikBudidaya->kondisi_pengelolaan_air, + 'skor_d2_k2_8_praktik_konservasi_tanah' => $skor_konservasi_tanah, ]); }); } diff --git a/app/Models/Pertanian/SkorPetani.php b/app/Models/Pertanian/SkorPetani.php index 69c649b..ccb5a4b 100644 --- a/app/Models/Pertanian/SkorPetani.php +++ b/app/Models/Pertanian/SkorPetani.php @@ -50,7 +50,7 @@ class SkorPetani extends Model 'skor_d4_k5_2_pengalaman_kredit_formal', 'skor_d4_k5_3_kepemilikan_aset_produktif', 'skor_d4_k5_4_kepemilikan_aset_tidak_produktif', - 'skor_d4_k5_4_5_akses_program_bantuan', + 'skor_d4_k5_4_akses_program_bantuan', 'skor_d4_k6_3_keberadaan_hutang_terkait_panen', 'skor_d4_k6_5a_praktik_ijon', 'skor_d4_k6_5b_kebebasan_memilih_pembeli', diff --git a/app/Models/Pertanian/SosialEkonomi.php b/app/Models/Pertanian/SosialEkonomi.php index 4cb082e..2cabcb2 100644 --- a/app/Models/Pertanian/SosialEkonomi.php +++ b/app/Models/Pertanian/SosialEkonomi.php @@ -41,6 +41,7 @@ use App\Enums\SosialEkonomi\UsahaMutuTambahanHarga; use App\Models\Pertanian\Petani; use App\Models\Pertanian\SkorPetani; +use App\Models\Pertanian\PraktikBudidaya; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\BelongsTo; @@ -204,7 +205,42 @@ class SosialEkonomi extends Model 'updated_by' => $petani->updated_by ]); } + $praktik = PraktikBudidaya::where('petani_id', $petani->id)->orderBy('id')->first(); + $pendapatan = PendapatanKomoditas::where('sosial_ekonomi_id', $sosialEkonomi->id)->get(); + + $rasio = 0; + if ($praktik && ($pendapatan && $pendapatan->count() > 0 && $pendapatan->sum('pendapatan') > 0)) { + $rasio = $praktik->total_estimasi_biaya_produksi / $pendapatan->sum('pendapatan'); + } + if ($rasio >= 0.8) { + $skorRasio = 1; + } else if ($rasio >= 0.6) { + $skorRasio = 2; + } else if ($rasio >= 0.45) { + $skorRasio = 3; + } else if ($rasio >= 0.3) { + $skorRasio = 4; + } else { + $skorRasio = 5; + } + $skor->update([ + 'skor_d4_k3_1_praktik_baru' => $sosialEkonomi->kemauan_mencoba_praktik_baru?->value, + 'skor_d4_k3_4_pemahaman_mutu_harga' => $sosialEkonomi->pemahaman_mutu_harga?->value, + 'skor_d4_k3_5_role_model' => $sosialEkonomi->panutan_petani_sukses?->value, + 'skor_d4_k3_6_kemampuan_keterlibatan_program' => $sosialEkonomi->kemauan_ikut_program?->value, + 'skor_d4_k3_7_orientasi_jangka_panjang' => $sosialEkonomi->orientasi_rencana_jangka_panjang?->value, + + 'skor_d4_k2_5_stabilitas_penghasilan' => $sosialEkonomi->skor_periode_paceklik?->value, + 'skor_d4_k2_8_kemampuan_menabung' => $sosialEkonomi->skor_kemampuan_menabung?->value, + 'skor_d4_k2_9_kecukupan_penghasilan' => $sosialEkonomi->skor_kecukupan_penghasilan?->value, + 'skor_d4_k2_3_k2_7_rasio_biaya_produksi_pendapatan' => $skorRasio, + 'skor_d4_k2_11_hak_kelola_lahan' => $sosialEkonomi->skor_kejelasan_status_lahan?->value, + + 'skor_d4_k4_2_keaktifan_pertemuan' => $sosialEkonomi->keaktifan_pertemuan_kelompok?->value, + 'skor_d4_k4_3_peran_dalam_kelompok' => $sosialEkonomi->peran_dalam_kelompok?->value, + 'skor_d4_k4_4_manfaat_dirasakan' => $sosialEkonomi->manfaat_kelompok_tani?->value, + 'skor_d4_k5_1_kepemilikan_rekening' => $sosialEkonomi->status_rekening_tabungan?->value, 'skor_d4_k5_2_pengalaman_kredit_formal' => $sosialEkonomi->pengalaman_kredit_kebun?->value, 'skor_d4_k5_3_kepemilikan_aset_produktif' => $sosialEkonomi->kondisi_aset_produktif?->value, diff --git a/app/Models/Pertanian/SurveyPanen.php b/app/Models/Pertanian/SurveyPanen.php index 04a4c18..5a7f4ab 100644 --- a/app/Models/Pertanian/SurveyPanen.php +++ b/app/Models/Pertanian/SurveyPanen.php @@ -44,6 +44,30 @@ class SurveyPanen extends Model 'deleted_by', ]; + protected static function booted(): void + { + static::saved(function (SurveyPanen $survey) { + + $petani = Petani::find($survey->petani_id); + $skor = SkorPetani::where('petani_id', $petani->id)->orderBy('id')->first(); + if (!$skor) { + $petaniUid = $petani->uid; + $part = explode('-', $petaniUid); + $skor = SkorPetani::create([ + 'petani_id' => $petani->id, + 'uid' => 'SKR-' . $part[1] . '-' . strtoupper(Str::random(10)), + 'created_by' => $petani->created_by, + 'updated_by' => $petani->updated_by + ]); + } + + $skor->update([ + 'skor_d2_k3_1_penentuan_pematangan' => $survey->dasar_penentuan_panen, + 'skor_d2_k3_5_sortasi_awal_pemisahan_kualitas' => $survey->praktik_sortasi, + ]); + }); + } + public function petani(): BelongsTo { return $this->belongsTo(Petani::class, 'petani_id'); diff --git a/database/migrations/2026_06_29_141634_create_praktik_budidaya_table.php b/database/migrations/2026_06_29_141634_create_praktik_budidaya_table.php index 0cac968..4491c7c 100644 --- a/database/migrations/2026_06_29_141634_create_praktik_budidaya_table.php +++ b/database/migrations/2026_06_29_141634_create_praktik_budidaya_table.php @@ -35,24 +35,25 @@ return new class extends Migration $table->string('cara_pemberian_pupuk')->nullable(); // 2.5 Pengendalian Organisme Pengganggu Tumbuhan (OPT) $table->integer('metode_penanganan_opt')->nullable(); - $table->string('jenis_hama')->nullable(); - $table->string('jenis_penyakit')->nullable(); + $table->jsonb('jenis_hama')->nullable(); + $table->jsonb('jenis_penyakit')->nullable(); $table->string('intensitas_serangan')->nullable(); $table->string('waktu_kemunculan_terparah')->nullable(); $table->string('metode_paling_sering_dilakukan')->nullable(); - $table->integer('volume_obat_obatan_permusim')->nullable(); + $table->decimal('volume_obat_obatan_padat_permusim', 10, 2)->nullable(); + $table->decimal('volume_obat_obatan_cair_permusim', 10, 2)->nullable(); // 2.6 Sanitasi Kebun $table->integer('frekuensi_sanitasi_lahan')->nullable(); $table->string('penanganan_sisa_buah_ranting')->nullable(); $table->integer('penanganan_gulma')->nullable(); // 2.7 Pengelolaan Air & irigasi $table->integer('kondisi_pengelolaan_air')->nullable(); - $table->string('sumber_air')->nullable(); + $table->jsonb('sumber_air')->nullable(); $table->string('sistem_irigasi')->nullable(); $table->string('kebutuhan_air_permusim')->nullable(); // 2.8 Praktik konservasi tanah - $table->string('kebiasaan_konservasi_tanah')->nullable(); + $table->jsonb('kebiasaan_konservasi_tanah')->nullable(); $table->string('pemahaman_manfaat_konservasi_tanah')->nullable(); $table->integer('nilai_konservasi_tanah')->nullable(); @@ -99,7 +100,7 @@ return new class extends Migration $table->string('tindakan_panen_reject')->nullable(); $table->decimal('upah_tenaga_panen', 13, 2)->nullable(); $table->decimal('biaya_pengangkutan_panen', 13, 2)->nullable(); - $table->decimal('biaya_wadah-Panen', 13, 2)->nullable(); + $table->decimal('biaya_wadah_Panen', 13, 2)->nullable(); $table->decimal('biaya_sewa_alat_panen', 13, 2)->nullable(); $table->decimal('biaya_panen_lainnya', 13, 2)->nullable(); $table->decimal('total_estimasi_biaya_panen', 13, 2)->nullable(); diff --git a/database/migrations/2026_07_15_110145_update_komoditas_table.php b/database/migrations/2026_07_15_110145_update_komoditas_table.php new file mode 100644 index 0000000..41dd782 --- /dev/null +++ b/database/migrations/2026_07_15_110145_update_komoditas_table.php @@ -0,0 +1,25 @@ +boolean('is_utama')->default(false); + }); + } + + public function down(): void + { + Schema::table('master_komoditas', function (Blueprint $table) { + $table->dropColumn('is_utama'); + }); + } +}; diff --git a/resources/views/components/summary-card.blade.php b/resources/views/components/summary-card.blade.php index 901a701..7f5d918 100644 --- a/resources/views/components/summary-card.blade.php +++ b/resources/views/components/summary-card.blade.php @@ -4,7 +4,7 @@

{{ $title }}

-

{{ $count }}

+

{!! $count !!}

{{ $subtitle }}
diff --git a/resources/views/dashboard/petani.blade.php b/resources/views/dashboard/petani.blade.php index 3cc247b..649aa99 100644 --- a/resources/views/dashboard/petani.blade.php +++ b/resources/views/dashboard/petani.blade.php @@ -31,7 +31,7 @@
-

{{ $lahanSummary->sum('luas_lahan') }}m2

+

{{ number_format($lahanSummary->sum('luas_lahan'), 0, ',', '.') }}m2

Lahan

@@ -91,10 +91,10 @@ - {{ $skorSummary->where('segmentasi', 'Penggerak')->sum('total') }} petani + {{ $skorSummary->where('segmen', 'Penggerak')->sum('total') }} petani - {{ number_format(($skorSummary->where('segmentasi', 'Penggerak')->sum('total') / $petaniSummary->sum('total')) * 100, 2) }}% + {{ number_format(($skorSummary->where('segmen', 'Penggerak')->sum('total') / $petaniSummary->sum('total')) * 100, 2) }}% @@ -110,10 +110,10 @@ - {{ $skorSummary->where('segmentasi', 'Perintis')->sum('total') }} petani + {{ $skorSummary->where('segmen', 'Perintis')->sum('total') }} petani - {{ number_format(($skorSummary->where('segmentasi', 'Perintis')->sum('total') / $petaniSummary->sum('total')) * 100, 2) }}% + {{ number_format(($skorSummary->where('segmen', 'Perintis')->sum('total') / $petaniSummary->sum('total')) * 100, 2) }}% @@ -129,10 +129,10 @@ - {{ $skorSummary->where('segmentasi', 'Pemerhati')->sum('total') }} petani + {{ $skorSummary->where('segmen', 'Pemerhati')->sum('total') }} petani - {{ number_format(($skorSummary->where('segmentasi', 'Pemerhati')->sum('total') / $petaniSummary->sum('total')) * 100, 2) }}% + {{ number_format(($skorSummary->where('segmen', 'Pemerhati')->sum('total') / $petaniSummary->sum('total')) * 100, 2) }}% @@ -148,10 +148,10 @@ - {{ $skorSummary->where('segmentasi', 'Pemula')->sum('total') }} petani + {{ $skorSummary->where('segmen', 'Pemula')->sum('total') }} petani - {{ number_format(($skorSummary->where('segmentasi', 'Pemula')->sum('total') / $petaniSummary->sum('total')) * 100, 2) }}% + {{ number_format(($skorSummary->where('segmen', 'Pemula')->sum('total') / $petaniSummary->sum('total')) * 100, 2) }}% @@ -173,6 +173,7 @@ @foreach ($komoditas as $k) where('komoditas_id', $k->id) + ->whereIn('segmen', ['Penggerak', 'Perintis', 'Pemerhati', 'Pemula']) ->sortByDesc('total') ->first(); ?> @@ -182,19 +183,19 @@ @if(isset($max)) - @if($max->segmentasi == 'Penggerak') + @if($max->segmen == 'Penggerak') Petani Penggerak - @elseif($max->segmentasi == 'Perintis') + @elseif($max->segmen == 'Perintis') Petani Perintis - @elseif($max->segmentasi == 'Pemerhati') + @elseif($max->segmen == 'Pemerhati') Petani Pemerhati - @elseif($max->segmentasi == 'Pemula') + @elseif($max->segmen == 'Pemula') Petani Pemula @else Belum Lengkap @endif @else - Belum Ada + Belum Tersegmentasi @endif diff --git a/resources/views/master/komoditas/add.blade.php b/resources/views/master/komoditas/add.blade.php index ac0b7a1..179b842 100644 --- a/resources/views/master/komoditas/add.blade.php +++ b/resources/views/master/komoditas/add.blade.php @@ -8,7 +8,38 @@ @csrf

- + +
+
+ + +
+
+ + + + + + @error('is_utama') +
+ {{ $message }} +
+ @enderror
diff --git a/resources/views/master/komoditas/edit.blade.php b/resources/views/master/komoditas/edit.blade.php index 33a95a2..b1e374a 100644 --- a/resources/views/master/komoditas/edit.blade.php +++ b/resources/views/master/komoditas/edit.blade.php @@ -6,6 +6,7 @@
@csrf + @method('PUT') @@ -13,6 +14,39 @@
+
+ + +
+
+ + + + + +
diff --git a/resources/views/master/komoditas/index.blade.php b/resources/views/master/komoditas/index.blade.php index ac261da..0cdad51 100644 --- a/resources/views/master/komoditas/index.blade.php +++ b/resources/views/master/komoditas/index.blade.php @@ -49,6 +49,7 @@ No Nama Komoditas + Kode Komoditas Aksi @@ -57,6 +58,7 @@ {{ $komoditas->firstItem() + $index }} {{ $item->nama }} + {{ $item->kode }}
@@ -144,6 +146,19 @@ if (res.status === 'success') { $('#edit-id').val(res.data.id); $('#edit-nama').val(res.data.nama); + $('#edit-kode').val(res.data.kode); + + const isUtama = + res.data.is_utama === true || + res.data.is_utama === 1 || + res.data.is_utama === '1'; + + $('#edit-is-utama').prop('checked', isUtama); + + $('#edit-is-utama-label').text( + isUtama ? 'Komoditas Utama' : 'Tidak Termasuk' + ); + if (typeof fvEdit !== 'undefined') fvEdit.resetForm(); offcanvasEdit.show(); } @@ -166,6 +181,15 @@ $btn.removeClass('disabled'); if (res.status === 'success') { $('#view-nama').val(res.data.nama); + $('#view-kode').val(res.data.kode); + const isUtama = + res.data.is_utama === true || + res.data.is_utama === 1 || + res.data.is_utama === '1'; + + $('#view-is-utama').val( + isUtama ? 'Komoditas Utama' : 'Tidak Termasuk' + ); offcanvasView.show(); } }).fail((xhr) => { @@ -177,7 +201,9 @@ const editForm = document.getElementById('editKomoditasForm'); let fvEdit = FormValidation.formValidation(editForm, { - fields: { nama: { validators: { notEmpty: { message: 'Nama komoditas wajib diisi' } } } }, + fields: { nama: { validators: { notEmpty: { message: 'Nama komoditas wajib diisi' } } } , + kode: {validators: { notEmpty: { message: 'Kode komoditas wajib diisi' } } } + }, plugins: { trigger: new FormValidation.plugins.Trigger(), bootstrap5: new FormValidation.plugins.Bootstrap5({ eleValidClass: '', rowSelector: '.form-control-validation' }), @@ -245,5 +271,20 @@ }); }); }); + + document.addEventListener('DOMContentLoaded', function () { + const switchInput = document.getElementById('add-is-utama'); + const switchLabel = document.getElementById('add-is-utama-label'); + + function updateKomoditasLabel() { + switchLabel.textContent = switchInput.checked + ? 'Komoditas Utama' + : 'Tidak Termasuk'; + } + + switchInput.addEventListener('change', updateKomoditasLabel); + + updateKomoditasLabel(); + }); @endpush \ No newline at end of file diff --git a/resources/views/master/komoditas/view.blade.php b/resources/views/master/komoditas/view.blade.php index e84dc21..b450496 100644 --- a/resources/views/master/komoditas/view.blade.php +++ b/resources/views/master/komoditas/view.blade.php @@ -9,6 +9,14 @@
+
+ + +
+
+ + +
diff --git a/resources/views/master/varietas/index.blade.php b/resources/views/master/varietas/index.blade.php index ace8140..cf0b7e0 100644 --- a/resources/views/master/varietas/index.blade.php +++ b/resources/views/master/varietas/index.blade.php @@ -47,27 +47,6 @@
-
-
-
-
-
- Titik Penanaman -

- {{ number_format($totalTitikTanam, 0, ',', '.') }} -

-
-
-
- -
-
-
- Distribusi lahan aktif -
-
-
-
diff --git a/resources/views/produktivitas/petani/add.blade.php b/resources/views/produktivitas/petani/add.blade.php index 1d53f37..15fbb69 100644 --- a/resources/views/produktivitas/petani/add.blade.php +++ b/resources/views/produktivitas/petani/add.blade.php @@ -329,7 +329,7 @@ ktp: { required: true, digits: true, minlength: 16, maxlength: 16 }, kk: { required: true, digits: true, minlength: 16, maxlength: 16 }, tempat_lahir: { required: true }, - tanggal_lahir: { required: true, date: true }, + tanggal_lahir: { required: true }, jenis_kelamin: { required: true }, pendidikan_terakhir: { required: true }, komoditas_id: { required: true }, @@ -349,7 +349,7 @@ ktp: { required: "NIK wajib diisi", digits: "NIK harus berupa angka", minlength: "NIK harus 16 digit", maxlength: "NIK harus 16 digit" }, kk: { digits: "No. KK harus berupa angka", minlength: "No. KK harus 16 digit", maxlength: "No. KK harus 16 digit" }, tempat_lahir: { required: "Tempat lahir wajib diisi" }, - tanggal_lahir: { required: "Tanggal lahir wajib diisi", date: "Format tanggal salah" }, + tanggal_lahir: { required: "Tanggal lahir wajib diisi" }, jenis_kelamin: { required: "Jenis kelamin wajib diisi" }, pendidikan_terakhir: { required: "Pendidikan terakhir wajib diisi" }, komoditas_id: { required: "Komoditas wajib diisi" }, diff --git a/resources/views/produktivitas/petani/edit.blade.php b/resources/views/produktivitas/petani/edit.blade.php index 38f9d95..cc3dd1b 100644 --- a/resources/views/produktivitas/petani/edit.blade.php +++ b/resources/views/produktivitas/petani/edit.blade.php @@ -83,9 +83,9 @@ @error('tempat_lahir')
{{ $message }}
@enderror
- - + + @error('tanggal_lahir')
{{ $message }}
@enderror
@@ -334,7 +334,7 @@ ktp: { required: true, digits: true, minlength: 16, maxlength: 16 }, kk: { required: true, digits: true, minlength: 16, maxlength: 16 }, tempat_lahir: { required: true }, - tanggal_lahir: { required: true, date: true }, + tanggal_lahir: { required: true }, jenis_kelamin: { required: true }, pendidikan_terakhir: { required: true }, komoditas_id: { required: true }, @@ -354,7 +354,7 @@ ktp: { required: "NIK wajib diisi", digits: "NIK harus berupa angka", minlength: "NIK harus 16 digit", maxlength: "NIK harus 16 digit" }, kk: { required: "No. KK wajib diisi", digits: "No. KK harus berupa angka", minlength: "No. KK harus 16 digit", maxlength: "No. KK harus 16 digit" }, tempat_lahir: { required: "Tempat lahir wajib diisi" }, - tanggal_lahir: { required: "Tanggal lahir wajib diisi", date: "Format tanggal salah" }, + tanggal_lahir: { required: "Tanggal lahir wajib diisi" }, jenis_kelamin: { required: "Jenis kelamin wajib diisi" }, pendidikan_terakhir: { required: "Pendidikan terakhir wajib diisi" }, alamat: { required: "Alamat wajib diisi" }, diff --git a/resources/views/produktivitas/petani/header.blade.php b/resources/views/produktivitas/petani/header.blade.php index 9521240..70b8c67 100644 --- a/resources/views/produktivitas/petani/header.blade.php +++ b/resources/views/produktivitas/petani/header.blade.php @@ -127,7 +127,7 @@ - + @@ -158,7 +158,7 @@ @php $produktivitas = isset($petani?->surveyProduktivitas) ? $petani?->surveyProduktivitas : null; if (!is_null($produktivitas)) { - $produktivitas = $produktivitas->get()->where('komoditas_id', $petani->komoditas_id); + $produktivitas = $produktivitas->where('komoditas_id', $petani->komoditas_id); } @endphp
@@ -175,13 +175,13 @@ @if(!is_null($skorPraktik)) {{ $praktik }} @else - Belum isi + Belum terisi @endif

- + @@ -285,7 +285,7 @@ @if(!is_null($aksesPasar?->skor_pengalaman) && !is_null($aksesPasar->skor_kesadaran_premium)) {{ $pengalaman }} @else - Belum isi + Belum terisi @endif

diff --git a/resources/views/produktivitas/petani/index.blade.php b/resources/views/produktivitas/petani/index.blade.php index 51dd6e3..33ae852 100644 --- a/resources/views/produktivitas/petani/index.blade.php +++ b/resources/views/produktivitas/petani/index.blade.php @@ -2,6 +2,36 @@ @section('content')
+
+
+ +
+
+ +
+
+ +
+
+
Data Petani
@@ -40,6 +70,8 @@ Jenis Kelamin Usia Desa/Kelurahan + Komoditas Utama + Segmentasi Aksi @@ -51,7 +83,18 @@ {{ $item->jenis_kelamin ? 'Laki-laki' : 'Perempuan' }} {{ $item->umur }} tahun {{ $item->desaKelurahan?->nama }}, {{ $item->desaKelurahan?->kecamatan?->nama }}, {{ $item->desaKelurahan?->kecamatan?->kabupatenKota?->nama }}, {{ $item->desaKelurahan?->kecamatan?->kabupatenKota?->provinsi?->nama }} - + {{ $item->komoditas?->nama }} + + @if($item->segmen() == 'Penggerak') + Penggerak + @elseif($item->segmen() == 'Perintis') + Perintis + @elseif($item->segmen() == 'Pemerhati') + Pemerhati + @elseif($item->segmen() == 'Pemula') + Pemula + @endif +
diff --git a/resources/views/produktivitas/petani/lahan/add.blade.php b/resources/views/produktivitas/petani/lahan/add.blade.php index 6962c5e..5103d90 100644 --- a/resources/views/produktivitas/petani/lahan/add.blade.php +++ b/resources/views/produktivitas/petani/lahan/add.blade.php @@ -208,13 +208,13 @@ @error('luas_lahan')
{{ $message }}
@enderror
- + @error('umur_lahan')
{{ $message }}
@enderror
- + @error('jumlah_tanaman')
{{ $message }}
@enderror
@@ -228,7 +228,7 @@ @@ -772,8 +772,8 @@ kabupatenkota_id: { required: true }, kecamatan_id: { required: true }, desa_kelurahan_id: { required: true }, - jumlah_tanaman: { required: true }, - umur_lahan: { required: true, number: true, min: 1 }, + jumlah_tanaman: { required: true, number: true, min: 0 }, + umur_lahan: { number: true, min: 1 }, umur_tanaman: { required: true, number: true, min: 1 }, kondisi_tanaman: { required: true }, }, @@ -786,8 +786,8 @@ kabupatenkota_id: { required: "Kabupaten/Kota wajib diisi" }, kecamatan_id: { required: "Kecamatan wajib diisi" }, desa_kelurahan_id: { required: "Desa/Kelurahan wajib diisi" }, - jumlah_tanaman: { required: "Jumlah tanaman wajib diisi" }, - umur_lahan: { required: "Umur lahan wajib diisi", number: "Umur lahan harus berupa angka", min: "Umur lahan minimal 1 tahun" }, + jumlah_tanaman: { required: "Jumlah tanaman wajib diisi", number: "Jumlah tanaman harus berupa angka", min: "Jumlah tanaman minimal 0" }, + umur_lahan: { number: "Umur lahan harus berupa angka", min: "Umur lahan minimal 1 tahun" }, umur_tanaman: { required: "Umur tanaman wajib diisi", number: "Umur tanaman harus berupa angka", min: "Umur tanaman minimal 1 tahun" }, kondisi_tanaman: { required: "Kondisi tanaman wajib diisi" }, }, diff --git a/resources/views/produktivitas/petani/lahan/edit.blade.php b/resources/views/produktivitas/petani/lahan/edit.blade.php index ef85fd3..2d4a280 100644 --- a/resources/views/produktivitas/petani/lahan/edit.blade.php +++ b/resources/views/produktivitas/petani/lahan/edit.blade.php @@ -63,7 +63,7 @@
- @error('jumlah_tanaman')
{{ $message }}
@enderror
@@ -79,7 +79,7 @@ @@ -276,7 +276,7 @@ - @forelse($lahanSelected->tanaman as $index => $item) + @foreach($lahanSelected->tanaman as $item) {{ $loop->iteration }} @@ -339,9 +339,7 @@
- @empty - Tidak ada data ditemukan. - @endforelse + @endforeach
diff --git a/resources/views/produktivitas/petani/skor/index.blade.php b/resources/views/produktivitas/petani/skor/index.blade.php index b14d92c..674a3a4 100644 --- a/resources/views/produktivitas/petani/skor/index.blade.php +++ b/resources/views/produktivitas/petani/skor/index.blade.php @@ -239,13 +239,9 @@ Kepemilikan aset produktif {{ number_format($skor->skor_d4_k5_3_kepemilikan_aset_produktif, 1, ',', '.') }} - - Kepemilikan aset tidak produktif - {{ number_format($skor->skor_d4_k5_4_kepemilikan_aset_tidak_produktif, 1, ',', '.') }} - Akses program bantuan - {{ number_format($skor->skor_d4_k5_4_5_akses_program_bantuan, 1, ',', '.') }} + {{ number_format($skor->skor_d4_k5_4_akses_program_bantuan, 1, ',', '.') }} Keberadaan hutang terkait panen diff --git a/routes/web.php b/routes/web.php index 58e3be9..5a23c34 100644 --- a/routes/web.php +++ b/routes/web.php @@ -13,11 +13,14 @@ Route::post('/logout', [App\Http\Controllers\Web\Konfigurasi\AuthController::cla Route::view('/offline', 'offline')->name('offline'); Route::get('/', function() { - $userRole = auth()->check() ? (auth()->user()->role instanceof \App\Enums\Role ? auth()->user()->role->value : auth()->user()->role) : null; + if (!auth()->check()) { + return redirect()->route('login'); + } - if ($userRole == 'fasilitator') { + if (auth()->user()->role->value === 'fasilitator') { return redirect()->route('dashboard.survey-petani'); } + return redirect()->route('dashboard.produktivitas'); })->name('home');