This commit is contained in:
2026-07-14 09:20:46 +07:00
parent c4e3e460b1
commit 5b776b2ae8
6 changed files with 177 additions and 43 deletions
@@ -42,6 +42,7 @@ class AksesPasarController extends Controller
$aksesPasarData = $this->aksesPasarPayload($validated);
$aksesPasarData['uid'] = 'AKP-' . Str::uuid();
$aksesPasarData['created_by'] = Auth::id();
$aksesPasarData['updated_by'] = Auth::id();
$aksesPasar = AksesPasar::create($aksesPasarData);
@@ -59,7 +60,7 @@ class AksesPasarController extends Controller
}
}
public function update(Request $request, $id)
public function update(Request $request, $petaniId, $id)
{
$validated = $this->validateData($request);
@@ -143,6 +144,38 @@ class AksesPasarController extends Controller
'harga_jual.*.harga_panen_terakhir' => ['nullable', 'numeric', 'min:0'],
'harga_jual.*.harga_tahun_lalu' => ['nullable', 'numeric', 'min:0'],
'harga_jual.*.harga_dua_tahun_lalu' => ['nullable', 'numeric', 'min:0'],
], [
'petani_id.required' => 'Petani harus dipilih.',
'petani_id.exists' => 'Petani tidak ditemukan.',
'skor_pengalaman.integer' => 'Skor pengalaman harus berupa angka.',
'skor_pengalaman.in' => 'Skor pengalaman tidak valid.',
'alasan_berhenti.required' => 'Alasan berhenti harus diisi.',
'alasan_berhenti.string' => 'Alasan berhenti harus berupa string.',
'alasan_berhenti.max' => 'Alasan berhenti tidak boleh lebih dari 255 karakter.',
'saluran_terdahulu.array' => 'Saluran terdahulu harus berupa array.',
'saluran_terdahulu.*.string' => 'Saluran terdahulu harus berupa string.',
'saluran_terdahulu.*.in' => 'Saluran terdahulu tidak valid.',
'saluran_terdahulu_lainnya.required' => 'Saluran terdahulu lainnya harus diisi.',
'saluran_terdahulu_lainnya.string' => 'Saluran terdahulu lainnya harus berupa string.',
'saluran_terdahulu_lainnya.max' => 'Saluran terdahulu lainnya tidak boleh lebih dari 255 karakter.',
'praktik_fermentasi.string' => 'Praktik fermentasi harus berupa string.',
'praktik_fermentasi.in' => 'Praktik fermentasi tidak valid.',
'proses_fermentasi.required' => 'Proses fermentasi harus diisi.',
'proses_fermentasi.string' => 'Proses fermentasi harus berupa string.',
'model_fermentasi_memungkinkan.required' => 'Model fermentasi memungkinkan harus diisi.',
'model_fermentasi_memungkinkan.string' => 'Model fermentasi memungkinkan harus berupa string.',
'skor_kesadaran_premium.integer' => 'Skor kesadaran premium harus berupa angka.',
'skor_kesadaran_premium.in' => 'Skor kesadaran premium tidak valid.',
'sumber_info_premium.string' => 'Sumber info premium harus berupa string.',
'sumber_info_premium.max' => 'Sumber info premium tidak boleh lebih dari 255 karakter.',
'harga_jual.array' => 'Harga jual harus berupa array.',
'harga_jual.*.bentuk_produk.string' => 'Bentuk produk harus berupa string.',
'harga_jual.*.harga_panen_terakhir.numeric' => 'Harga panen terakhir harus berupa angka.',
'harga_jual.*.harga_tahun_lalu.numeric' => 'Harga tahun lalu harus berupa angka.',
'harga_jual.*.harga_dua_tahun_lalu.numeric' => 'Harga dua tahun lalu harus berupa angka.',
'harga_jual.*.harga_panen_terakhir.min' => 'Harga panen terakhir minimal 0.',
'harga_jual.*.harga_tahun_lalu.min' => 'Harga tahun lalu minimal 0.',
'harga_jual.*.harga_dua_tahun_lalu.min' => 'Harga dua tahun lalu minimal 0.',
]);
}
+7 -3
View File
@@ -8,6 +8,10 @@ use Illuminate\Support\Str;
use App\Models\User;
use App\Models\Pertanian\Petani;
use App\Models\Pertanian\SkorPetani;
use App\Enums\AksesPasar\PraktikFermentasi;
use App\Enums\AksesPasar\SaluranTerdahulu;
use App\Enums\AksesPasar\SkorPengalaman;
use App\Enums\AksesPasar\SkorKesadaranPremium;
class AksesPasar extends Model
{
@@ -58,9 +62,9 @@ class AksesPasar extends Model
]);
}
$skor->update([
'skor_d6_k1_6_pengalaman_menjual_ke_saluran_berbeda' => $aksesPasar->skor_pengalaman->value,
'skor_d6_k4_1_kesadaran_akses_pasar_premium' => $aksesPasar->skor_kesadaran_premium->value,
'skor_d6_k5_1_hambatan_mutu' => $aksesPasar->skor_kepercayaan_responden->value
'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_k5_1_hambatan_mutu' => $aksesPasar->skor_kepercayaan_responden
]);
});
}
+31
View File
@@ -11,6 +11,9 @@ use App\Models\Pertanian\SurveyPanen;
use App\Models\Pertanian\SurveyPelatihan;
use App\Models\Pertanian\SurveyProduktivitas;
use App\Models\Pertanian\SurveySertifikasi;
use App\Models\Pertanian\SkorPetani;
use App\Models\Pertanian\AksesPasar;
use App\Models\Pertanian\HargaJualPanen;
use Carbon\Carbon;
use Illuminate\Database\Eloquent\Model;
@@ -153,6 +156,11 @@ class Petani extends Model
return $this->hasOne(AksesPasar::class, 'petani_id');
}
public function hargaJualPanen(): HasMany
{
return $this->hasMany(HargaJualPanen::class, 'petani_id');
}
public function skorLahanTanaman(): ?float
{
if (! Schema::hasTable('map_lahan')) {
@@ -337,4 +345,27 @@ class Petani extends Model
{
return $value instanceof \BackedEnum ? $value->value : $value;
}
public function segmen(): ?string
{
$skor = $this->skor;
if (!$skor) {
return null;
}
if ($skor->skor_kesiapan_adopsi >= 4.0) {
return 'Penggerak';
} elseif ($skor->skor_kesiapan_adopsi >= 3.0) {
return 'Perintis';
} elseif ($skor->skor_kesiapan_adopsi >= 2.0) {
return 'Pemerhati';
} elseif ($skor->skor_kesiapan_adopsi >= 1.0) {
return 'Pemula';
} else {
return 'Belum tersegmentasi';
}
return 'Belum tersegmentasi';
}
}
+7 -7
View File
@@ -205,14 +205,14 @@ class SosialEkonomi extends Model
]);
}
$skor->update([
'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,
'skor_d4_k5_4_akses_program_bantuan' => $sosialEkonomi->keterlibatan_program_keuangan_formal->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,
'skor_d4_k5_4_akses_program_bantuan' => $sosialEkonomi->keterlibatan_program_keuangan_formal?->value,
'skor_d4_k6_3_keberadaan_hutang_terkait_panen' => $sosialEkonomi->keterikatan_hutang_panen->value,
'skor_d4_k6_5a_praktik_ijon' => $sosialEkonomi->praktik_ijon->value,
'skor_d4_k6_5b_kebebasan_memilih_pembeli' => $sosialEkonomi->kebebasan_memilih_pembeli->value,
'skor_d4_k6_3_keberadaan_hutang_terkait_panen' => $sosialEkonomi->keterikatan_hutang_panen?->value,
'skor_d4_k6_5a_praktik_ijon' => $sosialEkonomi->praktik_ijon?->value,
'skor_d4_k6_5b_kebebasan_memilih_pembeli' => $sosialEkonomi->kebebasan_memilih_pembeli?->value,
]);
});
}
@@ -221,7 +221,7 @@
<div class="mt-4 text-end">
<a href="{{ route('petani.index') }}" class="btn btn-secondary me-2 wave-effect wave-light">Kembali</a>
<button type="submit" class="btn btn-success data-submit wave-effect wave-light"><i class="ti tabler-device-floppy me-2"> Simpan Profil</button>
<button type="submit" class="btn btn-success data-submit wave-effect wave-light"><i class="ti tabler-device-floppy me-2"></i> Simpan Profil</button>
</div>
</form>
@@ -50,9 +50,10 @@
$lahanPetani = isset($petani) && \Illuminate\Support\Facades\Schema::hasTable('map_lahan')
? $petani->lahans()->get()
: collect();
$totalLuasLahan = $lahanPetani->sum('luas_lahan');
$totalTanaman = $lahanPetani->sum('jumlah_tanaman');
$totalLuasLahan = $petani ? $lahanPetani->where('komoditas_id', $petani->komoditas_id)->sum('luas_lahan') : 0;
$totalTanaman = $petani ? $lahanPetani->where('komoditas_id', $petani->komoditas_id)->sum('jumlah_tanaman') : 0;
$pendidikanLabel = isset($petani) ? $petani->pendidikan_terakhir?->label() : null;
@endphp
<div class="card mb-2 flex-grow-1">
@@ -62,12 +63,12 @@
<div class="d-flex justify-content-between align-items-center card-widget-1 border-end h-100 pe-3">
<div>
<p class="mb-0 text-muted" style="font-size: 0.75rem;">Segmen Petani</p>
<h5 class="mb-0">{{ $segmenPetani ?? '-' }}</h5>
<h5 class="mb-0">{{ $petani?->segmen() ?? '-' }}</h5>
<p class="mb-0" style="font-size: 0.75rem;">
@if(!is_null($skorSegmenPetani))
<span class="me-1">Skor {{ number_format($skorSegmenPetani, 1) }}</span>
@if(!is_null($petani?->skor))
<span class="me-1">Skor {{ number_format($petani?->skor->skor_kesiapan_adopsi, 1) }}</span>
@else
<span class="me-1">Belum isi</span>
<span class="me-1">Belum terisi</span>
@endif
</p>
</div>
@@ -91,9 +92,9 @@
</h5>
<p class="mb-0" style="font-size: 0.75rem;">
@if(!is_null($skorLahanTanaman))
<span class="me-1">Skor {{ number_format($skorLahanTanaman, 1) }}</span><span class="text-success fw-medium">{{ number_format($totalTanaman, 0, ',', '.') }} tanaman</span>
<span class="me-1">{{ number_format($totalTanaman, 0, ',', '.') }} tanaman {{ $petani?->komoditas->nama }}</span>
@else
<span class="me-1">Belum isi</span>
<span class="me-1">Belum terisi</span>
@endif
</p>
</div>
@@ -107,19 +108,15 @@
<div class="col-sm-6 col-lg-4">
<div class="d-flex justify-content-between align-items-center card-widget-1 h-100 ps-3">
<div>
<p class="mb-0 text-muted" style="font-size: 0.75rem;">Praktik Budidaya</p>
<h5 class="mb-0">
@if(!is_null($skorPraktikBudidaya))
{{ number_format(round($skorPraktikBudidaya), 0, ',', '.') }}%
@else
-
@endif
</h5>
<p class="mb-0 text-muted" style="font-size: 0.75rem;">Pendidikan & Pelatihan</p>
<h5 class="mb-0">{{ $pendidikanLabel ?? '-' }}</h5>
<p class="mb-0" style="font-size: 0.75rem;">
@if(!is_null($skorPraktikBudidaya))
<span class="me-1">Skor {{ number_format($skorPraktikBudidaya, 1) }}</span>
@if(!is_null($petani?->surveyPelatihan) && !is_null($petani?->surveySertifikasi))
<span class="me-1">
{{ $petani?->surveyPelatihan->count() }} pelatihan, {{ $petani?->surveySertifikasi->count() }} sertifikasi
</span>
@else
<span class="me-1">Belum isi</span>
<span class="me-1">Belum terisi</span>
@endif
</p>
</div>
@@ -141,12 +138,37 @@
<div class="row gy-2">
<div class="col-sm-6 col-lg-4">
<div class="d-flex justify-content-between align-items-center card-widget-1 border-end h-100 pe-3">
@php
$skorPraktik = isset($petani?->skor) ? $petani?->skor->skor_d2_sistem_praktik_budidaya : null;
if (!is_null($skorPraktik)) {
if ($skorPraktik >= 4) {
$praktik = 'Menjalankan GAP (' . number_format($skorPraktik, 1, ',', '.') . ')';
} else if ($skorPraktik >= 2) {
$praktik = 'Menjalankan sebagian GAP (' . number_format($skorPraktik, 1, ',', '.') . ')';
} else {
$praktik = 'Belum menjalankan GAP (' . number_format($skorPraktik, 1, ',', '.') . ')';
}
}
@endphp
@php
$produktivitas = isset($petani?->surveyProduktivitas) ? $petani?->surveyProduktivitas : null;
if (!is_null($produktivitas)) {
$produktivitas = $produktivitas->get()->where('komoditas_id', $petani->komoditas_id);
}
@endphp
<div>
<p class="mb-0 text-muted" style="font-size: 0.75rem;">Pendidikan</p>
<h5 class="mb-0">{{ $pendidikanLabel ?? '-' }}</h5>
<p class="mb-0 text-muted" style="font-size: 0.75rem;">Praktik Budidaya</p>
<h5 class="mb-0">
@if($produktivitas && count($produktivitas) > 0)
{{ number_format($produktivitas->sum('kuantitas'), 0, ',', '.') }}
<small>{{ $produktivitas->first()->satuan == 'ha_tahun' ? 'Ha/Tahun' : 'Pohon/Tahun' }}</small>
@else
-
@endif
</h5>
<p class="mb-0" style="font-size: 0.75rem;">
@if(!is_null($skorPendidikan))
<span class="me-1">Skor {{ number_format($skorPendidikan, 1) }}</span>
@if(!is_null($skorPraktik))
<span class="me-1">{{ $praktik }}</span>
@else
<span class="me-1">Belum isi</span>
@endif
@@ -168,18 +190,38 @@
$skorSosialEkonomi = isset($petani) ? $petani->skorSosialEkonomi() : null;
$skorSosialEkonomiBulat = is_null($skorSosialEkonomi) ? null : (int) round($skorSosialEkonomi);
@endphp
@php
$pendapatanKomoditas = isset($sosialEkonomi) ? $sosialEkonomi->pendapatanKomoditas : null;
@endphp
@php
$ekonomi = null;
if ($sosialEkonomi?->status_rekening_tabungan && $sosialEkonomi?->pengalaman_kredit_kebun) {
if ($sosialEkonomi?->status_rekening_tabungan > 1 && $sosialEkonomi?->pengalaman_kredit_kebun > 3) {
$ekonomi = 'Memiliki rekening dan pengalaman kredit';
} elseif ($sosialEkonomi?->status_rekening_tabungan > 1 && $sosialEkonomi?->pengalaman_kredit_kebun <= 3) {
$ekonomi = 'Memiliki rekening';
} elseif ($sosialEkonomi?->status_rekening_tabungan == 1 && $sosialEkonomi?->pengalaman_kredit_kebun > 3) {
$ekonomi = 'Memiliki pengalaman kredit';
} else {
$ekonomi = 'Tidak memiliki akses keuangan';
}
} else {
$ekonomi = 'Tidak memiliki akses keuangan';
}
@endphp
<h5 class="mb-0">
@if(!is_null($skorSosialEkonomi))
{{ number_format($skorSosialEkonomiBulat, 0, ',', '.') }}%
@if(!is_null($pendapatanKomoditas))
{{ number_format($pendapatanKomoditas->sum('pendapatan'), 0, ',', '.') }}
<small>pendapatan (Rp)</small>
@else
-
@endif
</h5>
<p class="mb-0" style="font-size: 0.75rem;">
@if(!is_null($skorSosialEkonomi))
<span class="me-1">Skor {{ number_format($skorSosialEkonomi, 1) }}</span>
<span class="me-1">{{ $ekonomi }}</span>
@else
<span class="me-1">Belum isi</span>
<span class="me-1">Belum terisi</span>
@endif
</p>
</div>
@@ -203,16 +245,40 @@
$skorAksesPasarBulat = (int) round($skorAksesPasar);
}
@endphp
@php
$hargaJual = isset($petani) ? $petani->hargaJualPanen : null;
if ($hargaJual) {
$hargaJual = $hargaJual->whereNotNull('bentuk_produk')
->where('harga_panen_terakhir', '>', 0)
->sortByDesc('id')
->first();
}
@endphp
@php
$pengalaman = null;
if(!is_null($aksesPasar?->skor_pengalaman) && !is_null($aksesPasar->skor_kesadaran_premium)){
if($aksesPasar->skor_pengalaman > 1){
if ($aksesPasar->skor_kesadaran_premium == 5) {
$pengalaman = 'Akses saluran lain dan pasar premium';
} else {
$pengalaman = 'Akses saluran lain';
}
} else {
$pengalaman = 'Belum akses';
}
}
@endphp
<h5 class="mb-0">
@if(!is_null($skorAksesPasar))
{{ number_format($skorAksesPasarBulat, 0, ',', '.') }}%
@if(!is_null($hargaJual))
{{ number_format($hargaJual->harga_panen_terakhir, 0, ',', '.') }}
<small>{{ $hargaJual->bentuk_produk }}</small>
@else
-
@endif
</h5>
<p class="mb-0" style="font-size: 0.75rem;">
@if(!is_null($skorAksesPasar))
<span class="me-1">Skor {{ number_format($skorAksesPasar, 1) }}</span>
@if(!is_null($aksesPasar?->skor_pengalaman) && !is_null($aksesPasar->skor_kesadaran_premium))
<span class="me-1">{{ $pengalaman }}</span>
@else
<span class="me-1">Belum isi</span>
@endif