This commit is contained in:
2026-07-16 11:42:40 +07:00
30 changed files with 400 additions and 111 deletions
+6 -6
View File
@@ -19,13 +19,13 @@ enum Pendidikan: string
{ {
return match($this) { return match($this) {
self::TIDAK_SEKOLAH => 'Tidak Sekolah', self::TIDAK_SEKOLAH => 'Tidak Sekolah',
self::SD => 'SD atau Sederajat', self::SD => 'SD',
self::SMP => 'SMP atau Sederajat', self::SMP => 'SMP',
self::SMA => 'SMA atau Sederajat', self::SMA => 'SMA/SMK',
self::DIPLOMA => 'Diploma 1-3 (D1-D3)', self::DIPLOMA => 'Diploma 1-3 (D1-D3)',
self::SARJANA => 'Sarjana (S1) atau sederajat', self::SARJANA => 'Sarjana (S1)',
self::MAGISTER => 'Magister (S2) atau sederajat', self::MAGISTER => 'Magister (S2)',
self::DOKTOR => 'Doktor (S3) atau sederajat', self::DOKTOR => 'Doktor (S3)',
self::PESANTREN => 'Pesantren, Semiari, Wihara, atau Pendidikan Keagamaan Formal', self::PESANTREN => 'Pesantren, Semiari, Wihara, atau Pendidikan Keagamaan Formal',
self::LAINNYA => 'Lainnya', self::LAINNYA => 'Lainnya',
}; };
@@ -17,12 +17,12 @@ class ProfilPetaniController extends Controller
{ {
public function index() public function index()
{ {
if (!Gate::allows('super_admin') && !Gate::allows('admin')) { if (!Gate::any(['super_admin', 'admin', 'fasilitator'])) {
abort(403); abort(403);
} }
$title = 'Dashboard Profil Petani'; $title = 'Dashboard Profil Petani';
$komoditas = Komoditas::all(); $komoditas = Komoditas::where('is_utama', true)->get();
$petani = Petani::pluck('id'); $petani = Petani::pluck('id');
$lahan = Lahan::whereIn('petani_id', $petani)->get(); $lahan = Lahan::whereIn('petani_id', $petani)->get();
@@ -35,8 +35,8 @@ class ProfilPetaniController extends Controller
->get(); ->get();
$lahanSummary = Lahan::select( $lahanSummary = Lahan::select(
'komoditas_id', 'komoditas_id',
DB::raw('COUNT(*) as total', DB::raw('COUNT(*) as total'),
DB::raw('SUM(luas_lahan) as luas_lahan')) DB::raw('SUM(luas_lahan) as luas_lahan')
) )
->whereIn('petani_id', $petani) ->whereIn('petani_id', $petani)
->groupBy('komoditas_id') ->groupBy('komoditas_id')
@@ -57,6 +57,7 @@ class SurveyPetaniController extends Controller
->leftJoin("{$komoditasTable} as k", 'k.id', '=', 'p.komoditas_id') ->leftJoin("{$komoditasTable} as k", 'k.id', '=', 'p.komoditas_id')
->selectRaw("COALESCE(k.nama, 'Belum ditentukan') as nama") ->selectRaw("COALESCE(k.nama, 'Belum ditentukan') as nama")
->selectRaw('COUNT(p.id) as petani_count') ->selectRaw('COUNT(p.id) as petani_count')
->where('k.is_utama', true)
->groupBy('k.id', 'k.nama') ->groupBy('k.id', 'k.nama')
->orderByDesc('petani_count') ->orderByDesc('petani_count')
->get(); ->get();
@@ -155,6 +156,7 @@ class SurveyPetaniController extends Controller
->leftJoin("{$komoditasTable} as k", 'k.id', '=', 'p.komoditas_id') ->leftJoin("{$komoditasTable} as k", 'k.id', '=', 'p.komoditas_id')
->selectRaw("COALESCE(k.nama, 'Belum ditentukan') as label") ->selectRaw("COALESCE(k.nama, 'Belum ditentukan') as label")
->selectRaw('COALESCE(SUM(l.jumlah_tanaman), 0) as total') ->selectRaw('COALESCE(SUM(l.jumlah_tanaman), 0) as total')
->where('k.is_utama', true)
->groupBy('k.id', 'k.nama') ->groupBy('k.id', 'k.nama')
->orderByDesc('total') ->orderByDesc('total')
->get(); ->get();
@@ -28,9 +28,13 @@ class KomoditasController extends Controller
public function store(Request $request) public function store(Request $request)
{ {
$validator = Validator::make($request->all(), [ $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()) { if ($validator->fails()) {
@@ -39,6 +43,8 @@ class KomoditasController extends Controller
Komoditas::create([ Komoditas::create([
'nama' => $request->nama, 'nama' => $request->nama,
'kode' => $request->kode,
'is_utama' => $request->is_utama,
'created_by' => auth()->id(), 'created_by' => auth()->id(),
'updated_by' => auth()->id(), 'updated_by' => auth()->id(),
]); ]);
@@ -56,8 +62,12 @@ class KomoditasController extends Controller
{ {
$validator = Validator::make($request->all(), [ $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()) { if ($validator->fails()) {
@@ -67,6 +77,8 @@ class KomoditasController extends Controller
$komoditas = Komoditas::findOrFail($id); $komoditas = Komoditas::findOrFail($id);
$komoditas->update([ $komoditas->update([
'nama' => $request->nama, 'nama' => $request->nama,
'kode' => $request->kode,
'is_utama' => $request->is_utama,
'updated_by' => auth()->id(), 'updated_by' => auth()->id(),
]); ]);
@@ -15,6 +15,9 @@ use App\Models\Wilayah\Provinsi;
use App\Models\Pertanian\Petani; use App\Models\Pertanian\Petani;
use App\Models\Wilayah\DesaKelurahan; use App\Models\Wilayah\DesaKelurahan;
use App\Models\Pertanian\Komoditas; 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\Pendidikan;
use App\Enums\Pekerjaan; use App\Enums\Pekerjaan;
@@ -27,6 +30,10 @@ class PetaniController extends Controller
*/ */
public function index(Request $request) public function index(Request $request)
{ {
if (!Gate::any(['super_admin', 'admin', 'fasilitator'])) {
abort(403);
}
$provinsi = Provinsi::orderBy('kode', 'asc')->get(); $provinsi = Provinsi::orderBy('kode', 'asc')->get();
$query = Petani::with('desakelurahan') $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); $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() public function create()
@@ -54,7 +87,7 @@ class PetaniController extends Controller
$pekerjaan = Pekerjaan::options(); $pekerjaan = Pekerjaan::options();
$pernikahan = Pernikahan::options(); $pernikahan = Pernikahan::options();
$komoditas = Komoditas::all(); $komoditas = Komoditas::where('is_utama', true)->get();
$provinsi = Provinsi::orderBy('kode', 'asc')->get(); $provinsi = Provinsi::orderBy('kode', 'asc')->get();
@@ -174,7 +207,7 @@ class PetaniController extends Controller
$provinsi = Provinsi::all(); $provinsi = Provinsi::all();
$komoditas = Komoditas::all(); $komoditas = Komoditas::where('is_utama', true)->get();
return view('produktivitas.petani.edit', compact('petani', 'pendidikan', 'pekerjaan', return view('produktivitas.petani.edit', compact('petani', 'pendidikan', 'pekerjaan',
'pernikahan', 'provinsi', 'komoditas')); 'pernikahan', 'provinsi', 'komoditas'));
@@ -81,8 +81,8 @@ class PetaniLahanController extends Controller
'komoditas_id' => ['required', 'exists:master_komoditas,id'], 'komoditas_id' => ['required', 'exists:master_komoditas,id'],
'jenis_komoditas_id' => ['required', 'exists:jenis_komoditas,id'], 'jenis_komoditas_id' => ['required', 'exists:jenis_komoditas,id'],
'varietas_id' => ['nullable', 'exists:master_varietas,id'], 'varietas_id' => ['nullable', 'exists:master_varietas,id'],
'jumlah_tanaman' => ['required', 'numeric', 'min:1'], 'jumlah_tanaman' => ['required', 'numeric', 'min:0'],
'umur_lahan' => ['required', 'numeric', 'min:1'], 'umur_lahan' => ['nullable', 'numeric', 'min:1'],
'umur_tanaman' => ['required', 'numeric', 'min:1'], 'umur_tanaman' => ['required', 'numeric', 'min:1'],
'kondisi_tanaman' => ['required', 'string', new Enum(KondisiTanaman::class)], 'kondisi_tanaman' => ['required', 'string', new Enum(KondisiTanaman::class)],
'serangan_hama' => ['nullable', 'string', new Enum(SeranganHama::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.', 'luas_lahan.min' => 'Luas lahan minimal 0.01.',
'jumlah_tanaman.required' => 'Jumlah tanaman wajib diisi.', 'jumlah_tanaman.required' => 'Jumlah tanaman wajib diisi.',
'jumlah_tanaman.numeric' => 'Jumlah tanaman diisi dengan angka.', 'jumlah_tanaman.numeric' => 'Jumlah tanaman diisi dengan angka.',
'jumlah_tanaman.min' => 'Jumlah tanaman minimal 1.', 'jumlah_tanaman.min' => 'Jumlah tanaman minimal 0.',
'umur_lahan.required' => 'Umur lahan wajib diisi.', //'umur_lahan.required' => 'Umur lahan wajib diisi.',
'umur_lahan.numeric' => 'Umur lahan diisi dengan angka.', 'umur_lahan.numeric' => 'Umur lahan diisi dengan angka.',
'umur_lahan.min' => 'Umur lahan minimal 1.', 'umur_lahan.min' => 'Umur lahan minimal 1.',
'umur_tanaman.required' => 'Umur tanaman wajib diisi.', 'umur_tanaman.required' => 'Umur tanaman wajib diisi.',
@@ -163,7 +163,7 @@ class PetaniLahanController extends Controller
'updated_by' => auth()->id()] '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) { $data = collect(range(1, $lahan->jumlah_tanaman))->map(function ($i) use ($lahan, $komoditas, $lahanUid) {
return [ return [
'lahan_id' => $lahan->id, '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.');
} }
return redirect()->route('petani.lahan-tanaman.index', $petaniId)->with('success', 'Lahan berhasil ditambahkan.');
} }
public function show(string $petaniId, string $id) public function show(string $petaniId, string $id)
+2 -1
View File
@@ -50,7 +50,7 @@ class AksesPasar extends Model
static::saved(function (AksesPasar $aksesPasar) { static::saved(function (AksesPasar $aksesPasar) {
$petani = Petani::find($aksesPasar->petani_id); $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) { if (!$skor) {
$petaniUid = $petani->uid; $petaniUid = $petani->uid;
$part = explode('-', $petaniUid); $part = explode('-', $petaniUid);
@@ -61,6 +61,7 @@ class AksesPasar extends Model
'updated_by' => $petani->updated_by 'updated_by' => $petani->updated_by
]); ]);
} }
$skor->update([ $skor->update([
'skor_d6_k1_6_pengalaman_menjual_ke_saluran_berbeda' => $aksesPasar->skor_pengalaman, 'skor_d6_k1_6_pengalaman_menjual_ke_saluran_berbeda' => $aksesPasar->skor_pengalaman,
'skor_d6_k4_1_kesadaran_akses_pasar_premium' => $aksesPasar->skor_kesadaran_premium, 'skor_d6_k4_1_kesadaran_akses_pasar_premium' => $aksesPasar->skor_kesadaran_premium,
+6
View File
@@ -16,11 +16,17 @@ class Komoditas extends Model
protected $table = 'master_komoditas'; protected $table = 'master_komoditas';
protected $casts = [
'is_utama' => 'boolean',
];
protected $fillable = [ protected $fillable = [
'nama', 'nama',
'kode',
'created_by', 'created_by',
'updated_by', 'updated_by',
'deleted_by', 'deleted_by',
'is_utama',
]; ];
protected static function booted() protected static function booted()
+2 -2
View File
@@ -138,9 +138,9 @@ class Petani extends Model
return $this->hasMany(SurveySertifikasi::class, 'petani_id'); 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 public function lahans(): HasMany
+19 -6
View File
@@ -91,16 +91,29 @@ class PraktikBudidaya extends Model
'updated_by' => $petani->updated_by 'updated_by' => $petani->updated_by
]); ]);
} }
$skor->update([
'skor_d2_k2_3_praktik_pemangkasan' => $praktikBudidaya->frekuensi_pemangkasan_komoditas_utama, $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_utama,
'skor_d2_k2_4_praktik_pemupukan' => $praktikBudidaya->pemberian_pupuk, '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_6_sanitasi_kebun' => $praktikBudidaya->frekuensi_sanitasi_lahan,
'skor_d2_k2_6b_pengelolaan_gulma' => $praktikBudidaya->penanganan_gulma, 'skor_d2_k2_6b_pengelolaan_gulma' => $praktikBudidaya->penanganan_gulma,
'skor_d2_k2_7_penglolaan_air_irigasi' => $praktikBudidaya->kondisi_pengelolaan_air_irigasi, 'skor_d2_k2_7_penglolaan_air_irigasi' => $praktikBudidaya->kondisi_pengelolaan_air,
//'skor_d2_k2_8_praktik_konservasi_tanah' => $praktikBudidaya->kebiasaan_konservasi_tanah, 'skor_d2_k2_8_praktik_konservasi_tanah' => $skor_konservasi_tanah,
//'skor_d2_k3_1_penentuan_pematangan' => $praktikBudidaya->
]); ]);
}); });
} }
+1 -1
View File
@@ -50,7 +50,7 @@ class SkorPetani extends Model
'skor_d4_k5_2_pengalaman_kredit_formal', 'skor_d4_k5_2_pengalaman_kredit_formal',
'skor_d4_k5_3_kepemilikan_aset_produktif', 'skor_d4_k5_3_kepemilikan_aset_produktif',
'skor_d4_k5_4_kepemilikan_aset_tidak_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_3_keberadaan_hutang_terkait_panen',
'skor_d4_k6_5a_praktik_ijon', 'skor_d4_k6_5a_praktik_ijon',
'skor_d4_k6_5b_kebebasan_memilih_pembeli', 'skor_d4_k6_5b_kebebasan_memilih_pembeli',
+36
View File
@@ -41,6 +41,7 @@ use App\Enums\SosialEkonomi\UsahaMutuTambahanHarga;
use App\Models\Pertanian\Petani; use App\Models\Pertanian\Petani;
use App\Models\Pertanian\SkorPetani; use App\Models\Pertanian\SkorPetani;
use App\Models\Pertanian\PraktikBudidaya;
use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo; use Illuminate\Database\Eloquent\Relations\BelongsTo;
@@ -204,7 +205,42 @@ class SosialEkonomi extends Model
'updated_by' => $petani->updated_by '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->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_1_kepemilikan_rekening' => $sosialEkonomi->status_rekening_tabungan?->value,
'skor_d4_k5_2_pengalaman_kredit_formal' => $sosialEkonomi->pengalaman_kredit_kebun?->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, 'skor_d4_k5_3_kepemilikan_aset_produktif' => $sosialEkonomi->kondisi_aset_produktif?->value,
+24
View File
@@ -44,6 +44,30 @@ class SurveyPanen extends Model
'deleted_by', '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 public function petani(): BelongsTo
{ {
return $this->belongsTo(Petani::class, 'petani_id'); return $this->belongsTo(Petani::class, 'petani_id');
@@ -35,24 +35,25 @@ return new class extends Migration
$table->string('cara_pemberian_pupuk')->nullable(); $table->string('cara_pemberian_pupuk')->nullable();
// 2.5 Pengendalian Organisme Pengganggu Tumbuhan (OPT) // 2.5 Pengendalian Organisme Pengganggu Tumbuhan (OPT)
$table->integer('metode_penanganan_opt')->nullable(); $table->integer('metode_penanganan_opt')->nullable();
$table->string('jenis_hama')->nullable(); $table->jsonb('jenis_hama')->nullable();
$table->string('jenis_penyakit')->nullable(); $table->jsonb('jenis_penyakit')->nullable();
$table->string('intensitas_serangan')->nullable(); $table->string('intensitas_serangan')->nullable();
$table->string('waktu_kemunculan_terparah')->nullable(); $table->string('waktu_kemunculan_terparah')->nullable();
$table->string('metode_paling_sering_dilakukan')->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 // 2.6 Sanitasi Kebun
$table->integer('frekuensi_sanitasi_lahan')->nullable(); $table->integer('frekuensi_sanitasi_lahan')->nullable();
$table->string('penanganan_sisa_buah_ranting')->nullable(); $table->string('penanganan_sisa_buah_ranting')->nullable();
$table->integer('penanganan_gulma')->nullable(); $table->integer('penanganan_gulma')->nullable();
// 2.7 Pengelolaan Air & irigasi // 2.7 Pengelolaan Air & irigasi
$table->integer('kondisi_pengelolaan_air')->nullable(); $table->integer('kondisi_pengelolaan_air')->nullable();
$table->string('sumber_air')->nullable(); $table->jsonb('sumber_air')->nullable();
$table->string('sistem_irigasi')->nullable(); $table->string('sistem_irigasi')->nullable();
$table->string('kebutuhan_air_permusim')->nullable(); $table->string('kebutuhan_air_permusim')->nullable();
// 2.8 Praktik konservasi tanah // 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->string('pemahaman_manfaat_konservasi_tanah')->nullable();
$table->integer('nilai_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->string('tindakan_panen_reject')->nullable();
$table->decimal('upah_tenaga_panen', 13, 2)->nullable(); $table->decimal('upah_tenaga_panen', 13, 2)->nullable();
$table->decimal('biaya_pengangkutan_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_sewa_alat_panen', 13, 2)->nullable();
$table->decimal('biaya_panen_lainnya', 13, 2)->nullable(); $table->decimal('biaya_panen_lainnya', 13, 2)->nullable();
$table->decimal('total_estimasi_biaya_panen', 13, 2)->nullable(); $table->decimal('total_estimasi_biaya_panen', 13, 2)->nullable();
@@ -0,0 +1,25 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::table('master_komoditas', function (Blueprint $table) {
$table->boolean('is_utama')->default(false);
});
}
public function down(): void
{
Schema::table('master_komoditas', function (Blueprint $table) {
$table->dropColumn('is_utama');
});
}
};
@@ -4,7 +4,7 @@
<div class="card-body d-flex justify-content-between align-items-center"> <div class="card-body d-flex justify-content-between align-items-center">
<div> <div>
<p class="text-muted fw-medium mb-1">{{ $title }}</p> <p class="text-muted fw-medium mb-1">{{ $title }}</p>
<h3 class="text-dark fw-bold mb-1">{{ $count }}</h3> <h3 class="text-dark fw-bold mb-1">{!! $count !!}</h3>
<small class="text-muted">{{ $subtitle }}</small> <small class="text-muted">{{ $subtitle }}</small>
</div> </div>
<div class="badge bg-label-{{ $color }} p-2 rounded"> <div class="badge bg-label-{{ $color }} p-2 rounded">
+15 -14
View File
@@ -31,7 +31,7 @@
<i class="icon-base ti tabler-trees icon-28px"></i> <i class="icon-base ti tabler-trees icon-28px"></i>
</span> </span>
</div> </div>
<h4 class="mb-0">{{ $lahanSummary->sum('luas_lahan') }}m<sup>2</sup></h4> <h4 class="mb-0">{{ number_format($lahanSummary->sum('luas_lahan'), 0, ',', '.') }}m<sup>2</sup></h4>
</div> </div>
<p class="mb-1">Lahan</p> <p class="mb-1">Lahan</p>
<p class="mb-0"> <p class="mb-0">
@@ -91,10 +91,10 @@
</div> </div>
</td> </td>
<td class="text-end pe-0"> <td class="text-end pe-0">
<span>{{ $skorSummary->where('segmentasi', 'Penggerak')->sum('total') }} petani</span> <span>{{ $skorSummary->where('segmen', 'Penggerak')->sum('total') }} petani</span>
</td> </td>
<td class="text-end pe-0"> <td class="text-end pe-0">
<span>{{ number_format(($skorSummary->where('segmentasi', 'Penggerak')->sum('total') / $petaniSummary->sum('total')) * 100, 2) }}%</span> <span>{{ number_format(($skorSummary->where('segmen', 'Penggerak')->sum('total') / $petaniSummary->sum('total')) * 100, 2) }}%</span>
</td> </td>
</tr> </tr>
<tr> <tr>
@@ -110,10 +110,10 @@
</div> </div>
</td> </td>
<td class="text-end pe-0"> <td class="text-end pe-0">
<span>{{ $skorSummary->where('segmentasi', 'Perintis')->sum('total') }} petani</span> <span>{{ $skorSummary->where('segmen', 'Perintis')->sum('total') }} petani</span>
</td> </td>
<td class="text-end pe-0"> <td class="text-end pe-0">
<span>{{ number_format(($skorSummary->where('segmentasi', 'Perintis')->sum('total') / $petaniSummary->sum('total')) * 100, 2) }}%</span> <span>{{ number_format(($skorSummary->where('segmen', 'Perintis')->sum('total') / $petaniSummary->sum('total')) * 100, 2) }}%</span>
</td> </td>
</tr> </tr>
<tr> <tr>
@@ -129,10 +129,10 @@
</div> </div>
</td> </td>
<td class="text-end pe-0"> <td class="text-end pe-0">
<span>{{ $skorSummary->where('segmentasi', 'Pemerhati')->sum('total') }} petani</span> <span>{{ $skorSummary->where('segmen', 'Pemerhati')->sum('total') }} petani</span>
</td> </td>
<td class="text-end pe-0"> <td class="text-end pe-0">
<span>{{ number_format(($skorSummary->where('segmentasi', 'Pemerhati')->sum('total') / $petaniSummary->sum('total')) * 100, 2) }}%</span> <span>{{ number_format(($skorSummary->where('segmen', 'Pemerhati')->sum('total') / $petaniSummary->sum('total')) * 100, 2) }}%</span>
</td> </td>
</tr> </tr>
<tr> <tr>
@@ -148,10 +148,10 @@
</div> </div>
</td> </td>
<td class="text-end pe-0"> <td class="text-end pe-0">
<span>{{ $skorSummary->where('segmentasi', 'Pemula')->sum('total') }} petani</span> <span>{{ $skorSummary->where('segmen', 'Pemula')->sum('total') }} petani</span>
</td> </td>
<td class="text-end pe-0"> <td class="text-end pe-0">
<span>{{ number_format(($skorSummary->where('segmentasi', 'Pemula')->sum('total') / $petaniSummary->sum('total')) * 100, 2) }}%</span> <span>{{ number_format(($skorSummary->where('segmen', 'Pemula')->sum('total') / $petaniSummary->sum('total')) * 100, 2) }}%</span>
</td> </td>
</tr> </tr>
</tbody> </tbody>
@@ -173,6 +173,7 @@
@foreach ($komoditas as $k) @foreach ($komoditas as $k)
<?php <?php
$max = $skorKomoditasSummary->where('komoditas_id', $k->id) $max = $skorKomoditasSummary->where('komoditas_id', $k->id)
->whereIn('segmen', ['Penggerak', 'Perintis', 'Pemerhati', 'Pemula'])
->sortByDesc('total') ->sortByDesc('total')
->first(); ->first();
?> ?>
@@ -182,19 +183,19 @@
</td> </td>
<td class="pe-0"> <td class="pe-0">
@if(isset($max)) @if(isset($max))
@if($max->segmentasi == 'Penggerak') @if($max->segmen == 'Penggerak')
<span class="text-success">Petani Penggerak</span> <span class="text-success">Petani Penggerak</span>
@elseif($max->segmentasi == 'Perintis') @elseif($max->segmen == 'Perintis')
<span class="text-info">Petani Perintis</span> <span class="text-info">Petani Perintis</span>
@elseif($max->segmentasi == 'Pemerhati') @elseif($max->segmen == 'Pemerhati')
<span class="text-warning">Petani Pemerhati</span> <span class="text-warning">Petani Pemerhati</span>
@elseif($max->segmentasi == 'Pemula') @elseif($max->segmen == 'Pemula')
<span class="text-danger">Petani Pemula</span> <span class="text-danger">Petani Pemula</span>
@else @else
<span>Belum Lengkap</span> <span>Belum Lengkap</span>
@endif @endif
@else @else
<span>Belum Ada</span> <span>Belum Tersegmentasi</span>
@endif @endif
</td> </td>
<td class="text-end pe-0"> <td class="text-end pe-0">
+32 -1
View File
@@ -8,7 +8,38 @@
@csrf @csrf
<div class="mb-4 form-control-validation"> <div class="mb-4 form-control-validation">
<label class="form-label" for="add-nama">Nama Komoditas<span class="text-danger">*</span></label> <label class="form-label" for="add-nama">Nama Komoditas<span class="text-danger">*</span></label>
<input type="text" class="form-control" id="add-nama" name="nama" placeholder="Cth: Padi Sabrang" /> <input type="text" class="form-control" id="add-nama" name="nama" placeholder="Cth: Kopi" />
</div>
<div class="mb-4 form-control-validation">
<label class="form-label" for="add-kode">Kode Komoditas<span class="text-danger">*</span></label>
<input type="text" class="form-control" id="add-kode" name="kode" placeholder="Cth: KP" />
</div>
<div class="mb-4 form-control-validation">
<label class="form-label d-block">Komoditas Utama <span class="text-danger">*</span></label>
<input type="hidden" name="is_utama" value="0">
<label class="switch switch-lg"><input type="checkbox" class="switch-input" id="add-is-utama" name="is_utama" value="1" @checked(old('is_utama', false))>
<span class="switch-toggle-slider">
<span class="switch-on">
<i class="icon-base ti tabler-check"></i>
</span>
<span class="switch-off">
<i class="icon-base ti tabler-x"></i>
</span>
</span>
<span class="switch-label" id="add-is-utama-label">
{{ old('is_utama', false) ? 'Komoditas Utama' : 'Tidak Termasuk' }}
</span>
</label>
@error('is_utama')
<div class="invalid-feedback d-block">
{{ $message }}
</div>
@enderror
</div> </div>
<div class="mt-4"> <div class="mt-4">
<button type="submit" class="btn btn-primary me-sm-3 me-1 data-submit">Simpan</button> <button type="submit" class="btn btn-primary me-sm-3 me-1 data-submit">Simpan</button>
@@ -6,6 +6,7 @@
<div class="offcanvas-body mx-0 flex-grow-0 p-6 h-100"> <div class="offcanvas-body mx-0 flex-grow-0 p-6 h-100">
<form id="editKomoditasForm" class="pt-0" method="POST"> <form id="editKomoditasForm" class="pt-0" method="POST">
@csrf @csrf
@method('PUT')
<input type="hidden" name="_method" value="PUT"> <input type="hidden" name="_method" value="PUT">
<input type="hidden" id="edit-id" name="id"> <input type="hidden" id="edit-id" name="id">
@@ -13,6 +14,39 @@
<label class="form-label" for="edit-nama">Nama Komoditas<span class="text-danger">*</span></label> <label class="form-label" for="edit-nama">Nama Komoditas<span class="text-danger">*</span></label>
<input type="text" class="form-control" id="edit-nama" name="nama" /> <input type="text" class="form-control" id="edit-nama" name="nama" />
</div> </div>
<div class="mb-4 form-control-validation">
<label class="form-label" for="edit-kode">Kode Komoditas<span class="text-danger">*</span></label>
<input type="text" class="form-control" id="edit-kode" name="kode" />
</div>
<div class="mb-4 form-control-validation">
<label class="form-label d-block" for="edit-is-utama">Komoditas Utama <span class="text-danger">*</span></label>
<input type="hidden" name="is_utama" value="0">
<label class="switch switch-lg">
<input
type="checkbox"
class="switch-input"
id="edit-is-utama"
name="is_utama"
value="1"
>
<span class="switch-toggle-slider">
<span class="switch-on">
<i class="icon-base ti tabler-check"></i>
</span>
<span class="switch-off">
<i class="icon-base ti tabler-x"></i>
</span>
</span>
<span class="switch-label" id="edit-is-utama-label">
Tidak Termasuk
</span>
</label>
</div>
<div class="mt-4"> <div class="mt-4">
<button type="submit" class="btn btn-primary me-sm-3 me-1 data-submit">Update</button> <button type="submit" class="btn btn-primary me-sm-3 me-1 data-submit">Update</button>
<button type="reset" class="btn btn-label-secondary" data-bs-dismiss="offcanvas">Batal</button> <button type="reset" class="btn btn-label-secondary" data-bs-dismiss="offcanvas">Batal</button>
@@ -49,6 +49,7 @@
<tr> <tr>
<th>No</th> <th>No</th>
<th>Nama Komoditas</th> <th>Nama Komoditas</th>
<th>Kode Komoditas</th>
<th>Aksi</th> <th>Aksi</th>
</tr> </tr>
</thead> </thead>
@@ -57,6 +58,7 @@
<tr> <tr>
<td>{{ $komoditas->firstItem() + $index }}</td> <td>{{ $komoditas->firstItem() + $index }}</td>
<td><span class="text-heading fw-medium">{{ $item->nama }}</span></td> <td><span class="text-heading fw-medium">{{ $item->nama }}</span></td>
<td><span class="text-heading fw-medium">{{ $item->kode }}</span></td>
<td> <td>
<div class="d-flex align-items-center"> <div class="d-flex align-items-center">
<a href="javascript:;" class="btn btn-icon btn-text-secondary rounded-pill view-record" data-id="{{ $item->id }}"><i class="ti tabler-eye ti-md"></i></a> <a href="javascript:;" class="btn btn-icon btn-text-secondary rounded-pill view-record" data-id="{{ $item->id }}"><i class="ti tabler-eye ti-md"></i></a>
@@ -144,6 +146,19 @@
if (res.status === 'success') { if (res.status === 'success') {
$('#edit-id').val(res.data.id); $('#edit-id').val(res.data.id);
$('#edit-nama').val(res.data.nama); $('#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(); if (typeof fvEdit !== 'undefined') fvEdit.resetForm();
offcanvasEdit.show(); offcanvasEdit.show();
} }
@@ -166,6 +181,15 @@
$btn.removeClass('disabled'); $btn.removeClass('disabled');
if (res.status === 'success') { if (res.status === 'success') {
$('#view-nama').val(res.data.nama); $('#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(); offcanvasView.show();
} }
}).fail((xhr) => { }).fail((xhr) => {
@@ -177,7 +201,9 @@
const editForm = document.getElementById('editKomoditasForm'); const editForm = document.getElementById('editKomoditasForm');
let fvEdit = FormValidation.formValidation(editForm, { 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: { plugins: {
trigger: new FormValidation.plugins.Trigger(), trigger: new FormValidation.plugins.Trigger(),
bootstrap5: new FormValidation.plugins.Bootstrap5({ eleValidClass: '', rowSelector: '.form-control-validation' }), 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();
});
</script> </script>
@endpush @endpush
@@ -9,6 +9,14 @@
<label class="form-label" for="view-nama">Nama Komoditas</label> <label class="form-label" for="view-nama">Nama Komoditas</label>
<input type="text" class="form-control bg-lighter" id="view-nama" readonly /> <input type="text" class="form-control bg-lighter" id="view-nama" readonly />
</div> </div>
<div class="mb-4">
<label class="form-label" for="view-kode">Kode Komoditas</label>
<input type="text" class="form-control bg-lighter" id="view-kode" readonly />
</div>
<div class="mb-4">
<label class="form-label" for="view-is-utama">Komoditas Utama</label>
<input type="text" class="form-control bg-lighter" id="view-is-utama" readonly>
</div>
<div class="mt-4"> <div class="mt-4">
<button type="button" class="btn btn-label-secondary d-grid w-100" data-bs-dismiss="offcanvas">Tutup</button> <button type="button" class="btn btn-label-secondary d-grid w-100" data-bs-dismiss="offcanvas">Tutup</button>
</div> </div>
@@ -47,27 +47,6 @@
</div> </div>
</div> </div>
<div class="col-sm-6 col-md-4 col-xl-3">
<div class="card shadow-sm border-0 h-100">
<div class="card-body p-4">
<div class="d-flex justify-content-between">
<div>
<span class="text-muted d-block mb-2">Titik Penanaman</span>
<h2 class="mb-0 fw-bold text-dark" style="font-size: 2.5rem;">
{{ number_format($totalTitikTanam, 0, ',', '.') }}
</h2>
</div>
<div>
<div class="d-flex align-items-center justify-content-center bg-label-warning text-warning" style="width: 56px; height: 56px; border-radius: 12px;">
<i class="ti tabler-map-pin" style="font-size: 1.8rem;"></i>
</div>
</div>
</div>
<small class="text-muted d-block mt-3">Distribusi lahan aktif</small>
</div>
</div>
</div>
</div> </div>
<div class="card"> <div class="card">
@@ -329,7 +329,7 @@
ktp: { required: true, digits: true, minlength: 16, maxlength: 16 }, ktp: { required: true, digits: true, minlength: 16, maxlength: 16 },
kk: { required: true, digits: true, minlength: 16, maxlength: 16 }, kk: { required: true, digits: true, minlength: 16, maxlength: 16 },
tempat_lahir: { required: true }, tempat_lahir: { required: true },
tanggal_lahir: { required: true, date: true }, tanggal_lahir: { required: true },
jenis_kelamin: { required: true }, jenis_kelamin: { required: true },
pendidikan_terakhir: { required: true }, pendidikan_terakhir: { required: true },
komoditas_id: { 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" }, 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" }, 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" }, 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" }, jenis_kelamin: { required: "Jenis kelamin wajib diisi" },
pendidikan_terakhir: { required: "Pendidikan terakhir wajib diisi" }, pendidikan_terakhir: { required: "Pendidikan terakhir wajib diisi" },
komoditas_id: { required: "Komoditas wajib diisi" }, komoditas_id: { required: "Komoditas wajib diisi" },
@@ -83,9 +83,9 @@
@error('tempat_lahir')<div class="error invalid-feedback">{{ $message }}</div>@enderror @error('tempat_lahir')<div class="error invalid-feedback">{{ $message }}</div>@enderror
</div> </div>
<div class="col-md-3 mb-4 form-control-validation"> <div class="col-md-3 mb-4 form-control-validation">
<label class="form-label" for="edit-petani-tanggal-lahir">Tanggal Lahir {{ $petani->tanggal_lahir?->format('Y-m-d') }}</label> <label class="form-label" for="edit-petani-tanggal-lahir">Tanggal Lahir</label>
<input type="date" class="form-control @error('tanggal_lahir') is-invalid @enderror" id="edit-petani-tanggal-lahir" name="tanggal_lahir" <input type="text" class="form-control @error('tanggal_lahir') is-invalid @enderror" id="edit-petani-tanggal-lahir" name="tanggal_lahir"
value="{{ old('tanggal_lahir', $petani->tanggal_lahir?->format('Y-m-d')) }}" /> value="{{ old('tanggal_lahir', $petani->tanggal_lahir?->format('d-m-Y')) }}" />
@error('tanggal_lahir')<div class="error invalid-feedback">{{ $message }}</div>@enderror @error('tanggal_lahir')<div class="error invalid-feedback">{{ $message }}</div>@enderror
</div> </div>
</div> </div>
@@ -334,7 +334,7 @@
ktp: { required: true, digits: true, minlength: 16, maxlength: 16 }, ktp: { required: true, digits: true, minlength: 16, maxlength: 16 },
kk: { required: true, digits: true, minlength: 16, maxlength: 16 }, kk: { required: true, digits: true, minlength: 16, maxlength: 16 },
tempat_lahir: { required: true }, tempat_lahir: { required: true },
tanggal_lahir: { required: true, date: true }, tanggal_lahir: { required: true },
jenis_kelamin: { required: true }, jenis_kelamin: { required: true },
pendidikan_terakhir: { required: true }, pendidikan_terakhir: { required: true },
komoditas_id: { 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" }, 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" }, 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" }, 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" }, jenis_kelamin: { required: "Jenis kelamin wajib diisi" },
pendidikan_terakhir: { required: "Pendidikan terakhir wajib diisi" }, pendidikan_terakhir: { required: "Pendidikan terakhir wajib diisi" },
alamat: { required: "Alamat wajib diisi" }, alamat: { required: "Alamat wajib diisi" },
@@ -127,7 +127,7 @@
</div> </div>
<span class="avatar"> <span class="avatar">
<span class="avatar-initial rounded"> <span class="avatar-initial rounded">
<i class="icon-base ti tabler-seedling icon-22px"></i> <i class="icon-base ti tabler-books icon-22px"></i>
</span> </span>
</span> </span>
</div> </div>
@@ -158,7 +158,7 @@
@php @php
$produktivitas = isset($petani?->surveyProduktivitas) ? $petani?->surveyProduktivitas : null; $produktivitas = isset($petani?->surveyProduktivitas) ? $petani?->surveyProduktivitas : null;
if (!is_null($produktivitas)) { if (!is_null($produktivitas)) {
$produktivitas = $produktivitas->get()->where('komoditas_id', $petani->komoditas_id); $produktivitas = $produktivitas->where('komoditas_id', $petani->komoditas_id);
} }
@endphp @endphp
<div> <div>
@@ -175,13 +175,13 @@
@if(!is_null($skorPraktik)) @if(!is_null($skorPraktik))
<span class="me-1">{{ $praktik }}</span> <span class="me-1">{{ $praktik }}</span>
@else @else
<span class="me-1">Belum isi</span> <span class="me-1">Belum terisi</span>
@endif @endif
</p> </p>
</div> </div>
<span class="avatar"> <span class="avatar">
<span class="avatar-initial rounded"> <span class="avatar-initial rounded">
<i class="icon-base ti tabler-books icon-22px"></i> <i class="icon-base ti tabler-seedling icon-22px"></i>
</span> </span>
</span> </span>
</div> </div>
@@ -285,7 +285,7 @@
@if(!is_null($aksesPasar?->skor_pengalaman) && !is_null($aksesPasar->skor_kesadaran_premium)) @if(!is_null($aksesPasar?->skor_pengalaman) && !is_null($aksesPasar->skor_kesadaran_premium))
<span class="me-1">{{ $pengalaman }}</span> <span class="me-1">{{ $pengalaman }}</span>
@else @else
<span class="me-1">Belum isi</span> <span class="me-1">Belum terisi</span>
@endif @endif
</p> </p>
</div> </div>
@@ -2,6 +2,36 @@
@section('content') @section('content')
<div class="container-xxl flex-grow-1 container-p-y"> <div class="container-xxl flex-grow-1 container-p-y">
<div class="d-flex flex-row gap-3 mb-4">
<div class="w-25">
<x-summary-card
title="Petani"
count="{{ $petani->count() }}"
subtitle="{{ $petani->where('jenis_kelamin', 1)->count() }} Laki-laki, {{ $petani->where('jenis_kelamin', 0)->count() }} Perempuan"
icon="user-check"
color="primary"
/>
</div>
<div class="w-25">
<x-summary-card
title="Lahan & Tanaman"
count="{{ number_format($lahan?->sum('luas_lahan'), 0, ',', '.') }}m<sup>2</sup>"
subtitle="{{ $tanaman?->count() }} tanaman dari {{ $komoditas?->count() }} komoditas utama"
icon="trees"
color="success"
/>
</div>
<div class="w-25">
<x-summary-card
title="Segmentasi"
count="{{ $skor->where('segmen', 'Penggerak')->count() }} Penggerak"
subtitle="{{ $skor->where('segmen', 'Perintis')->count() }} Perintis, {{ $skor->where('segmen', 'Pemerhati')->count() }} Pemerhati, {{ $skor->where('segmen', 'Pemula')->count() }} Pemula"
icon="star"
color="info"
/>
</div>
</div>
<div class="card"> <div class="card">
<div class="card-header border-bottom"> <div class="card-header border-bottom">
<h5 class="card-title mb-0">Data Petani</h5> <h5 class="card-title mb-0">Data Petani</h5>
@@ -40,6 +70,8 @@
<th>Jenis Kelamin</th> <th>Jenis Kelamin</th>
<th>Usia</th> <th>Usia</th>
<th>Desa/Kelurahan</th> <th>Desa/Kelurahan</th>
<th>Komoditas Utama</th>
<th>Segmentasi</th>
<th>Aksi</th> <th>Aksi</th>
</tr> </tr>
</thead> </thead>
@@ -51,7 +83,18 @@
<td><span class="text-muted">{{ $item->jenis_kelamin ? 'Laki-laki' : 'Perempuan' }}</span></td> <td><span class="text-muted">{{ $item->jenis_kelamin ? 'Laki-laki' : 'Perempuan' }}</span></td>
<td><span class="text-muted">{{ $item->umur }} tahun</span></td> <td><span class="text-muted">{{ $item->umur }} tahun</span></td>
<td><span class="text-muted">{{ $item->desaKelurahan?->nama }}, {{ $item->desaKelurahan?->kecamatan?->nama }}, {{ $item->desaKelurahan?->kecamatan?->kabupatenKota?->nama }}, {{ $item->desaKelurahan?->kecamatan?->kabupatenKota?->provinsi?->nama }}</span></td> <td><span class="text-muted">{{ $item->desaKelurahan?->nama }}, {{ $item->desaKelurahan?->kecamatan?->nama }}, {{ $item->desaKelurahan?->kecamatan?->kabupatenKota?->nama }}, {{ $item->desaKelurahan?->kecamatan?->kabupatenKota?->provinsi?->nama }}</span></td>
<td>{{ $item->komoditas?->nama }}</td>
<td>
@if($item->segmen() == 'Penggerak')
<span class="badge bg-label-success">Penggerak</span>
@elseif($item->segmen() == 'Perintis')
<span class="badge bg-label-info">Perintis</span>
@elseif($item->segmen() == 'Pemerhati')
<span class="badge bg-label-warning">Pemerhati</span>
@elseif($item->segmen() == 'Pemula')
<span class="badge bg-label-danger">Pemula</span>
@endif
</td>
<td> <td>
<div class="d-flex align-items-center"> <div class="d-flex align-items-center">
<!-- <a href="{{ route('petani.show', $item->id) }}" class="btn btn-icon btn-text-secondary rounded-pill view-record"><i class="ti tabler-eye ti-md"></i></a> --> <!-- <a href="{{ route('petani.show', $item->id) }}" class="btn btn-icon btn-text-secondary rounded-pill view-record"><i class="ti tabler-eye ti-md"></i></a> -->
@@ -208,13 +208,13 @@
@error('luas_lahan')<div class="error invalid-feedback">{{ $message }}</div>@enderror @error('luas_lahan')<div class="error invalid-feedback">{{ $message }}</div>@enderror
</div> </div>
<div class="col-md-3 mb-3 form-control-validation"> <div class="col-md-3 mb-3 form-control-validation">
<label class="form-label">Umur Lahan (tahun) <span class="text-danger">*</span></label> <label class="form-label">Umur Lahan (tahun)</label>
<input type="number" name="umur_lahan" class="form-control @error('umur_lahan') is-invalid @enderror" placeholder="Contoh: 1" /> <input type="number" name="umur_lahan" class="form-control @error('umur_lahan') is-invalid @enderror" placeholder="Contoh: 1" />
@error('umur_lahan')<div class="error invalid-feedback">{{ $message }}</div>@enderror @error('umur_lahan')<div class="error invalid-feedback">{{ $message }}</div>@enderror
</div> </div>
<div class="col-md-3 mb-3 form-control-validation"> <div class="col-md-3 mb-3 form-control-validation">
<label class="form-label">Jumlah Tanaman <span class="text-danger">*</span></label> <label class="form-label">Jumlah Tanaman <span class="text-danger">*</span></label>
<input type="number" name="jumlah_tanaman" class="form-control @error('jumlah_tanaman') is-invalid @enderror" placeholder="Contoh: 1" required /> <input type="number" name="jumlah_tanaman" class="form-control @error('jumlah_tanaman') is-invalid @enderror" placeholder="Contoh: 1 (min 0)" required />
@error('jumlah_tanaman')<div class="error invalid-feedback">{{ $message }}</div>@enderror @error('jumlah_tanaman')<div class="error invalid-feedback">{{ $message }}</div>@enderror
</div> </div>
<div class="col-md-3 mb-3 form-control-validation"> <div class="col-md-3 mb-3 form-control-validation">
@@ -228,7 +228,7 @@
<label class="form-label">Komoditas Utama <span class="text-danger">*</span></label> <label class="form-label">Komoditas Utama <span class="text-danger">*</span></label>
<select id="komoditas_id" name="komoditas_id" class="form-select @error('komoditas_id') is-invalid @enderror"> <select id="komoditas_id" name="komoditas_id" class="form-select @error('komoditas_id') is-invalid @enderror">
<option value="">Pilih Komoditas</option> <option value="">Pilih Komoditas</option>
@foreach($komoditas as $k) @foreach($komoditas->where('is_utama', '1') as $k)
<option value="{{ $k->id }}">{{ $k->nama }}</option> <option value="{{ $k->id }}">{{ $k->nama }}</option>
@endforeach @endforeach
</select> </select>
@@ -772,8 +772,8 @@
kabupatenkota_id: { required: true }, kabupatenkota_id: { required: true },
kecamatan_id: { required: true }, kecamatan_id: { required: true },
desa_kelurahan_id: { required: true }, desa_kelurahan_id: { required: true },
jumlah_tanaman: { required: true }, jumlah_tanaman: { required: true, number: true, min: 0 },
umur_lahan: { required: true, number: true, min: 1 }, umur_lahan: { number: true, min: 1 },
umur_tanaman: { required: true, number: true, min: 1 }, umur_tanaman: { required: true, number: true, min: 1 },
kondisi_tanaman: { required: true }, kondisi_tanaman: { required: true },
}, },
@@ -786,8 +786,8 @@
kabupatenkota_id: { required: "Kabupaten/Kota wajib diisi" }, kabupatenkota_id: { required: "Kabupaten/Kota wajib diisi" },
kecamatan_id: { required: "Kecamatan wajib diisi" }, kecamatan_id: { required: "Kecamatan wajib diisi" },
desa_kelurahan_id: { required: "Desa/Kelurahan wajib diisi" }, desa_kelurahan_id: { required: "Desa/Kelurahan wajib diisi" },
jumlah_tanaman: { required: "Jumlah tanaman wajib diisi" }, jumlah_tanaman: { required: "Jumlah tanaman wajib diisi", number: "Jumlah tanaman harus berupa angka", min: "Jumlah tanaman minimal 0" },
umur_lahan: { required: "Umur lahan wajib diisi", number: "Umur lahan harus berupa angka", min: "Umur lahan minimal 1 tahun" }, 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" }, 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" }, kondisi_tanaman: { required: "Kondisi tanaman wajib diisi" },
}, },
@@ -63,7 +63,7 @@
</div> </div>
<div class="col-md-3 mb-3 form-control-validation"> <div class="col-md-3 mb-3 form-control-validation">
<label class="form-label">Jumlah Tanaman <span class="text-danger">*</span></label> <label class="form-label">Jumlah Tanaman <span class="text-danger">*</span></label>
<input type="number" name="jumlah_tanaman" class="form-control @error('jumlah_tanaman') is-invalid @enderror" placeholder="Contoh: 1" required <input type="number" name="jumlah_tanaman" class="form-control @error('jumlah_tanaman') is-invalid @enderror" placeholder="Contoh: 1 (min 0)" required
value="{{ old('jumlah_tanaman', $lahanSelected->jumlah_tanaman) }}" /> value="{{ old('jumlah_tanaman', $lahanSelected->jumlah_tanaman) }}" />
@error('jumlah_tanaman')<div class="error invalid-feedback">{{ $message }}</div>@enderror @error('jumlah_tanaman')<div class="error invalid-feedback">{{ $message }}</div>@enderror
</div> </div>
@@ -79,7 +79,7 @@
<label class="form-label">Komoditas Utama <span class="text-danger">*</span></label> <label class="form-label">Komoditas Utama <span class="text-danger">*</span></label>
<select id="komoditas_id" name="komoditas_id" class="form-select @error('komoditas_id') is-invalid @enderror"> <select id="komoditas_id" name="komoditas_id" class="form-select @error('komoditas_id') is-invalid @enderror">
<option value="">Pilih Komoditas</option> <option value="">Pilih Komoditas</option>
@foreach($komoditas as $k) @foreach($komoditas->where('is_utama', '1') as $k)
<option value="{{ $k->id }}" {{ old('komoditas_id', $lahanSelected->komoditas_id) == $k->id ? 'selected' : '' }}>{{ $k->nama }}</option> <option value="{{ $k->id }}" {{ old('komoditas_id', $lahanSelected->komoditas_id) == $k->id ? 'selected' : '' }}>{{ $k->nama }}</option>
@endforeach @endforeach
</select> </select>
@@ -276,7 +276,7 @@
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
@forelse($lahanSelected->tanaman as $index => $item) @foreach($lahanSelected->tanaman as $item)
<tr> <tr>
<td>{{ $loop->iteration }}</td> <td>{{ $loop->iteration }}</td>
<td> <td>
@@ -339,9 +339,7 @@
</div> </div>
</td> </td>
</tr> </tr>
@empty @endforeach
<tr><td colspan="6" class="text-center py-4">Tidak ada data ditemukan.</td></tr>
@endforelse
</tbody> </tbody>
</table> </table>
</div> </div>
@@ -239,13 +239,9 @@
<td class="text-wrapped">Kepemilikan aset produktif</td> <td class="text-wrapped">Kepemilikan aset produktif</td>
<td class="text-end">{{ number_format($skor->skor_d4_k5_3_kepemilikan_aset_produktif, 1, ',', '.') }}</td> <td class="text-end">{{ number_format($skor->skor_d4_k5_3_kepemilikan_aset_produktif, 1, ',', '.') }}</td>
</tr> </tr>
<tr>
<td class="text-wrapped">Kepemilikan aset tidak produktif</td>
<td class="text-end">{{ number_format($skor->skor_d4_k5_4_kepemilikan_aset_tidak_produktif, 1, ',', '.') }}</td>
</tr>
<tr> <tr>
<td class="text-wrapped">Akses program bantuan</td> <td class="text-wrapped">Akses program bantuan</td>
<td class="text-end">{{ number_format($skor->skor_d4_k5_4_5_akses_program_bantuan, 1, ',', '.') }}</td> <td class="text-end">{{ number_format($skor->skor_d4_k5_4_akses_program_bantuan, 1, ',', '.') }}</td>
</tr> </tr>
<tr> <tr>
<td class="text-wrapped">Keberadaan hutang terkait panen</td> <td class="text-wrapped">Keberadaan hutang terkait panen</td>
+5 -2
View File
@@ -13,11 +13,14 @@ Route::post('/logout', [App\Http\Controllers\Web\Konfigurasi\AuthController::cla
Route::view('/offline', 'offline')->name('offline'); Route::view('/offline', 'offline')->name('offline');
Route::get('/', function() { 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.survey-petani');
} }
return redirect()->route('dashboard.produktivitas'); return redirect()->route('dashboard.produktivitas');
})->name('home'); })->name('home');