sumber informasi harga

This commit is contained in:
2026-10-19 10:03:05 +07:00
parent c66eed56e2
commit 4ab745cfe5
5 changed files with 182 additions and 59 deletions
@@ -118,7 +118,8 @@ class AksesPasarController extends Controller
'skorPengalamanBerhentiValues' => [ 'skorPengalamanBerhentiValues' => [
SkorPengalaman::PERNAH_BERHENTI_TIDAK_ADA_AKSES->value, SkorPengalaman::PERNAH_BERHENTI_TIDAK_ADA_AKSES->value,
SkorPengalaman::PERNAH_BERHENTI_MUNGKIN_KEMBALI->value SkorPengalaman::PERNAH_BERHENTI_MUNGKIN_KEMBALI->value
] ],
'sumberInfoLainnyaValue' => 'Lainnya',
]; ];
} }
@@ -154,6 +155,14 @@ class AksesPasarController extends Controller
Rule::requiredIf(fn () => in_array(SaluranTerdahulu::LAINNYA->value, $request->input('saluran_terdahulu', []), true)), Rule::requiredIf(fn () => in_array(SaluranTerdahulu::LAINNYA->value, $request->input('saluran_terdahulu', []), true)),
'nullable', 'string', 'max:255' 'nullable', 'string', 'max:255'
], ],
'tahu_harga_sebelumnya' => ['nullable', 'string', 'max:255'],
'sumber_info_harga' => ['nullable', 'array'],
'sumber_info_harga.*' => ['string'],
'sumber_info_harga_lainnya' => [
Rule::requiredIf(fn () => in_array('Lainnya', $request->input('sumber_info_harga', []), true)),
'nullable', 'string', 'max:255'
],
'praktik_fermentasi' => ['nullable', 'string', Rule::in(PraktikFermentasi::values())], 'praktik_fermentasi' => ['nullable', 'string', Rule::in(PraktikFermentasi::values())],
'proses_fermentasi' => [ 'proses_fermentasi' => [
@@ -231,6 +240,10 @@ class AksesPasarController extends Controller
$payload['saluran_terdahulu_lainnya'] = null; $payload['saluran_terdahulu_lainnya'] = null;
} }
if (!in_array('Lainnya', $payload['sumber_info_harga'] ?? [], true)) {
$payload['sumber_info_harga_lainnya'] = null;
}
if (($payload['praktik_fermentasi'] ?? null) === PraktikFermentasi::BELUM_PERNAH->value) { if (($payload['praktik_fermentasi'] ?? null) === PraktikFermentasi::BELUM_PERNAH->value) {
$payload['proses_fermentasi'] = null; $payload['proses_fermentasi'] = null;
$payload['model_fermentasi_memungkinkan'] = null; $payload['model_fermentasi_memungkinkan'] = null;
+4
View File
@@ -31,6 +31,9 @@ class AksesPasar extends Model
'saluran_terdahulu', 'saluran_terdahulu',
'saluran_terdahulu_lainnya', 'saluran_terdahulu_lainnya',
'alasan_berhenti', 'alasan_berhenti',
'tahu_harga_sebelumnya',
'sumber_info_harga',
'sumber_info_harga_lainnya',
'praktik_fermentasi', 'praktik_fermentasi',
'proses_fermentasi', 'proses_fermentasi',
'model_fermentasi_memungkinkan', 'model_fermentasi_memungkinkan',
@@ -51,6 +54,7 @@ class AksesPasar extends Model
protected $casts = [ protected $casts = [
'tujuan_penjualan' => 'array', 'tujuan_penjualan' => 'array',
'saluran_terdahulu' => 'array', 'saluran_terdahulu' => 'array',
'sumber_info_harga' => 'array',
]; ];
protected static function booted(): void protected static function booted(): void
@@ -61,7 +61,7 @@ return new class extends Migration
$table->integer('harga_tahun_lalu')->nullable(); $table->integer('harga_tahun_lalu')->nullable();
$table->integer('harga_dua_tahun_lalu')->nullable(); $table->integer('harga_dua_tahun_lalu')->nullable();
$table ->foreignId('created_by')->nullable()->constrained('users')->onDelete('set null'); $table ->foreignId('created_by')->nullable()->constrained('users')->onDelete('set null');
$table ->foreignId('updated_by')->nullable()->constrained('users')->onDelete('set null'); $table ->foreignId('updated_by')->nullable()->constrained('users')->onDelete('set null');
$table ->foreignId('deleted_by')->nullable()->constrained('users')->onDelete('set null'); $table ->foreignId('deleted_by')->nullable()->constrained('users')->onDelete('set null');
@@ -0,0 +1,28 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
public function up(): void
{
Schema::table('akses_pasar', function (Blueprint $table) {
$table->string('tahu_harga_sebelumnya')->nullable();
$table->text('sumber_info_harga')->nullable();
$table->string('sumber_info_harga_lainnya')->nullable();
});
}
public function down(): void
{
Schema::table('akses_pasar', function (Blueprint $table) {
$table->dropColumn([
'tahu_harga_sebelumnya',
'sumber_info_harga',
'sumber_info_harga_lainnya',
]);
});
}
};
@@ -130,78 +130,78 @@
</div> </div>
<hr class="my-4"> <hr class="my-4">
<h5 class="pb-3 border-bottom mb-4">Pengalaman Saluran Lain</h5> <h5 class="pb-3 border-bottom mb-4">Pengalaman Saluran Lain</h5>
<div class="row"> <div class="row">
<div class="col-md-12 mb-4 form-control-validation"> <div class="col-md-12 mb-4 form-control-validation">
<label class="form-label d-block fw-bold">Apakah pernah menjual ke tempat lain sebelumnya?</label> <label class="form-label d-block fw-bold">Apakah pernah menjual ke tempat lain sebelumnya?</label>
@foreach($skorPengalamanOptions as $option) @foreach($skorPengalamanOptions as $option)
<div class="form-check mb-2"> <div class="form-check mb-2">
<input class="form-check-input @error('skor_pengalaman') is-invalid @enderror" type="radio" <input class="form-check-input @error('skor_pengalaman') is-invalid @enderror" type="radio"
id="skor-pengalaman-{{ $option['value'] }}" name="skor_pengalaman" value="{{ $option['value'] }}" id="skor-pengalaman-{{ $option['value'] }}" name="skor_pengalaman" value="{{ $option['value'] }}"
{{ (string) old('skor_pengalaman', $aksesPasar?->skor_pengalaman) === (string) $option['value'] ? 'checked' : '' }}> {{ (string) old('skor_pengalaman', $aksesPasar?->skor_pengalaman) === (string) $option['value'] ? 'checked' : '' }}>
<label class="form-check-label" for="skor-pengalaman-{{ $option['value'] }}">{{ $option['label'] }}</label> <label class="form-check-label" for="skor-pengalaman-{{ $option['value'] }}">{{ $option['label'] }}</label>
</div> </div>
@endforeach @endforeach
@error('skor_pengalaman')<div class="invalid-feedback d-block">{{ $message }}</div>@enderror @error('skor_pengalaman')<div class="invalid-feedback d-block">{{ $message }}</div>@enderror
</div> </div>
<div class="col-md-12" id="blok-saluran-lanjutan"> <div class="col-md-12" id="blok-saluran-lanjutan">
<div class="row"> <div class="row">
<div class="col-md-6 mb-4 form-control-validation"> <div class="col-md-6 mb-4 form-control-validation">
<label class="form-label" for="alasan-berhenti">Alasan berhenti</label> <label class="form-label" for="alasan-berhenti">Alasan berhenti</label>
<input type="text" class="form-control @error('alasan_berhenti') is-invalid @enderror" id="alasan-berhenti" name="alasan_berhenti" value="{{ old('alasan_berhenti', $aksesPasar?->alasan_berhenti) }}" placeholder="Opsional (jika sudah berhenti)..."> <input type="text" class="form-control @error('alasan_berhenti') is-invalid @enderror" id="alasan-berhenti" name="alasan_berhenti" value="{{ old('alasan_berhenti', $aksesPasar?->alasan_berhenti) }}" placeholder="Opsional (jika sudah berhenti)...">
@error('alasan_berhenti')<div class="invalid-feedback">{{ $message }}</div>@enderror @error('alasan_berhenti')<div class="invalid-feedback">{{ $message }}</div>@enderror
</div> </div>
<div class="col-md-6 mb-4"></div> <div class="col-md-6 mb-4"></div>
<div class="col-md-12 mb-4 form-control-validation"> <div class="col-md-12 mb-4 form-control-validation">
<label class="form-label d-block mb-2" for="saluran-terdahulu">Jika pernah, dulu menjual ke mana? (boleh pilih lebih dari satu)</label> <label class="form-label d-block mb-2" for="saluran-terdahulu">Jika pernah, dulu menjual ke mana? (boleh pilih lebih dari satu)</label>
<div class="row g-2"> <div class="row g-2">
@foreach($saluranTerdahuluOptions as $option) @foreach($saluranTerdahuluOptions as $option)
@if($option['value'] !== $saluranLainnyaValue) @if($option['value'] !== $saluranLainnyaValue)
<div class="col-md-6"> <div class="col-md-6">
<div class="form-check mb-2"> <div class="form-check mb-2">
<input class="form-check-input @error('saluran_terdahulu') is-invalid @enderror"
type="checkbox"
id="saluran-terdahulu-{{ Str::slug($option['value']) }}"
name="saluran_terdahulu[]"
value="{{ $option['value'] }}"
{{ in_array($option['value'], (array) old('saluran_terdahulu', $aksesPasar?->saluran_terdahulu ?? []), true) ? 'checked' : '' }}>
<label class="form-check-label" for="saluran-terdahulu-{{ Str::slug($option['value']) }}">
{{ $option['label'] }}
</label>
</div>
</div>
@endif
@endforeach
<div class="col-12 mt-2">
<div class="d-flex align-items-center gap-2 flex-wrap">
<div class="form-check mb-0">
<input class="form-check-input @error('saluran_terdahulu') is-invalid @enderror" <input class="form-check-input @error('saluran_terdahulu') is-invalid @enderror"
type="checkbox" type="checkbox"
id="saluran-terdahulu-{{ Str::slug($option['value']) }}" id="saluran-terdahulu-lainnya-checkbox"
name="saluran_terdahulu[]" name="saluran_terdahulu[]"
value="{{ $option['value'] }}" value="{{ $saluranLainnyaValue }}"
{{ in_array($option['value'], (array) old('saluran_terdahulu', $aksesPasar?->saluran_terdahulu ?? []), true) ? 'checked' : '' }}> {{ in_array($saluranLainnyaValue, (array) old('saluran_terdahulu', $aksesPasar?->saluran_terdahulu ?? []), true) ? 'checked' : '' }}>
<label class="form-check-label" for="saluran-terdahulu-{{ Str::slug($option['value']) }}"> <label class="form-check-label text-nowrap" for="saluran-terdahulu-lainnya-checkbox">
{{ $option['label'] }} Lainnya:
</label> </label>
</div> </div>
<input type="text" class="form-control form-control-sm w-auto flex-grow-1 @error('saluran_terdahulu_lainnya') is-invalid @enderror" style="max-width: 400px;" id="saluran-lainnya" name="saluran_terdahulu_lainnya" value="{{ old('saluran_terdahulu_lainnya', $aksesPasar?->saluran_terdahulu_lainnya) }}" placeholder="Sebutkan saluran lainnya...">
</div> </div>
@endif
@endforeach
<div class="col-12 mt-2">
<div class="d-flex align-items-center gap-2 flex-wrap">
<div class="form-check mb-0">
<input class="form-check-input @error('saluran_terdahulu') is-invalid @enderror"
type="checkbox"
id="saluran-terdahulu-lainnya-checkbox"
name="saluran_terdahulu[]"
value="{{ $saluranLainnyaValue }}"
{{ in_array($saluranLainnyaValue, (array) old('saluran_terdahulu', $aksesPasar?->saluran_terdahulu ?? []), true) ? 'checked' : '' }}>
<label class="form-check-label text-nowrap" for="saluran-terdahulu-lainnya-checkbox">
Lainnya:
</label>
</div>
<input type="text" class="form-control form-control-sm w-auto flex-grow-1 @error('saluran_terdahulu_lainnya') is-invalid @enderror" style="max-width: 400px;" id="saluran-lainnya" name="saluran_terdahulu_lainnya" value="{{ old('saluran_terdahulu_lainnya', $aksesPasar?->saluran_terdahulu_lainnya) }}" placeholder="Sebutkan saluran lainnya...">
</div> </div>
</div> </div>
@error('saluran_terdahulu')<div class="invalid-feedback d-block">{{ $message }}</div>@enderror
@error('saluran_terdahulu_lainnya')<div class="invalid-feedback d-block">{{ $message }}</div>@enderror
</div> </div>
@error('saluran_terdahulu')<div class="invalid-feedback d-block">{{ $message }}</div>@enderror
@error('saluran_terdahulu_lainnya')<div class="invalid-feedback d-block">{{ $message }}</div>@enderror
</div>
</div>
</div> </div>
</div> </div>
</div>
<h5 class="pb-3 border-bottom mb-4 mt-4">HARGA DI SETIAP TITIK</h5> <h5 class="pb-3 border-bottom mb-4 mt-4">HARGA DI SETIAP TITIK</h5>
<h6 class="mb-2">Harga Jual Panen Terakhir</h6> <h6 class="mb-2">Harga Jual Panen Terakhir</h6>
@@ -252,6 +252,75 @@
</table> </table>
</div> </div>
<h6 class="fw-bold text-dark mt-4 mb-2">Sumber Informasi Harga</h6>
<div class="border rounded p-4 mb-4">
<div class="mb-4">
<label class="form-label fw-semibold">Sebelum menjual, apakah Bapak/Ibu sudah tahu harga yang akan diterima?</label>
<div class="row g-2">
@php
$tahuHargaOptions = [
'Selalu tahu sebelum pergi jual',
'Kadang tahu, kadang tidak',
'Baru tahu saat sudah di tempat pembeli',
'Tidak pernah tahu sebelumnya — langsung jual saja'
];
@endphp
@foreach($tahuHargaOptions as $tahu)
<div class="col-md-6">
<div class="form-check mb-2">
<input class="form-check-input @error('tahu_harga_sebelumnya') is-invalid @enderror" type="radio" name="tahu_harga_sebelumnya" value="{{ $tahu }}" id="tahu-{{ Str::slug($tahu) }}" {{ old('tahu_harga_sebelumnya', $aksesPasar?->tahu_harga_sebelumnya) === $tahu ? 'checked' : '' }}>
<label class="form-check-label" for="tahu-{{ Str::slug($tahu) }}">{{ $tahu }}</label>
</div>
</div>
@endforeach
</div>
@error('tahu_harga_sebelumnya')<div class="invalid-feedback d-block">{{ $message }}</div>@enderror
</div>
<div class="mb-0">
<label class="form-label fw-semibold">Dari mana biasanya Bapak/Ibu tahu harga hasil panen sebelum menjual? (boleh pilih lebih dari satu)</label>
<div class="row g-2">
@php
$sumberInfoHargaOptions = [
'Tengkulak/pedagang yang datang langsung',
'Sesama petani/tetangga',
'PPL/petugas dinas',
'HP/WhatsApp/internet',
'Radio/TV',
'Facebook',
'Tiktok',
'Instagram',
'Tidak pernah cek — langsung jual saja'
];
$sumberInfoLainnyaValue = 'Lainnya';
@endphp
@foreach($sumberInfoHargaOptions as $sumber)
<div class="col-md-4">
<div class="form-check mb-2">
<input class="form-check-input @error('sumber_info_harga') is-invalid @enderror" type="checkbox" name="sumber_info_harga[]" value="{{ $sumber }}" id="sumber-{{ Str::slug($sumber) }}" {{ in_array($sumber, (array) old('sumber_info_harga', $aksesPasar?->sumber_info_harga ?? []), true) ? 'checked' : '' }}>
<label class="form-check-label" for="sumber-{{ Str::slug($sumber) }}">{{ $sumber }}</label>
</div>
</div>
@endforeach
<div class="col-12 mt-2">
<div class="d-flex align-items-center gap-2 flex-wrap">
<div class="form-check mb-0">
<input class="form-check-input @error('sumber_info_harga') is-invalid @enderror" type="checkbox" name="sumber_info_harga[]" value="{{ $sumberInfoLainnyaValue }}" id="sumber-lainnya-checkbox" {{ in_array($sumberInfoLainnyaValue, (array) old('sumber_info_harga', $aksesPasar?->sumber_info_harga ?? []), true) ? 'checked' : '' }}>
<label class="form-check-label text-nowrap" for="sumber-lainnya-checkbox">Lainnya:</label>
</div>
<input type="text" class="form-control form-control-sm w-auto flex-grow-1 @error('sumber_info_harga_lainnya') is-invalid @enderror" style="max-width: 400px;" id="sumber-info-lainnya-input" name="sumber_info_harga_lainnya" value="{{ old('sumber_info_harga_lainnya', $aksesPasar?->sumber_info_harga_lainnya) }}" placeholder="Sebutkan sumber lainnya...">
</div>
</div>
</div>
@error('sumber_info_harga')<div class="invalid-feedback d-block">{{ $message }}</div>@enderror
@error('sumber_info_harga_lainnya')<div class="invalid-feedback d-block">{{ $message }}</div>@enderror
</div>
</div>
<h5 class="pb-3 border-bottom mb-4 mt-4">PELUANG NILAI TAMBAH</h5> <h5 class="pb-3 border-bottom mb-4 mt-4">PELUANG NILAI TAMBAH</h5>
<div class="border rounded p-4 mb-4"> <div class="border rounded p-4 mb-4">
@@ -386,6 +455,7 @@
const praktikBelumPernahValue = String(@json($praktikBelumPernahValue)); const praktikBelumPernahValue = String(@json($praktikBelumPernahValue));
const skorPengalamanBerhentiValues = @json($skorPengalamanBerhentiValues ?? [2,3]).map(Number); const skorPengalamanBerhentiValues = @json($skorPengalamanBerhentiValues ?? [2,3]).map(Number);
const skorBelumPernahValue = "1"; const skorBelumPernahValue = "1";
const sumberInfoLainnyaValue = @json($sumberInfoLainnyaValue ?? 'Lainnya');
function onlyDigits(value) { function onlyDigits(value) {
return String(value || '').replace(/\D/g, ''); return String(value || '').replace(/\D/g, '');
@@ -425,6 +495,12 @@
if (!isLainnya) $('#saluran-lainnya').val(''); if (!isLainnya) $('#saluran-lainnya').val('');
} }
function syncSumberInfoLainnya() {
const isLainnya = $('input[name="sumber_info_harga[]"][value="' + sumberInfoLainnyaValue + '"]').is(':checked');
$('#sumber-info-lainnya-input').prop('disabled', !isLainnya);
if (!isLainnya) $('#sumber-info-lainnya-input').val('');
}
function syncPraktikFermentasi() { function syncPraktikFermentasi() {
const isBelumPernah = $('input[name="praktik_fermentasi"]:checked').val() === praktikBelumPernahValue; const isBelumPernah = $('input[name="praktik_fermentasi"]:checked').val() === praktikBelumPernahValue;
$('#proses-fermentasi, #model-fermentasi').prop('disabled', isBelumPernah); $('#proses-fermentasi, #model-fermentasi').prop('disabled', isBelumPernah);
@@ -439,6 +515,7 @@
}); });
$('input[name="saluran_terdahulu[]"]').on('change', syncSaluranLainnya); $('input[name="saluran_terdahulu[]"]').on('change', syncSaluranLainnya);
$('input[name="sumber_info_harga[]"]').on('change', syncSumberInfoLainnya);
$('input[name="praktik_fermentasi"]').on('change', syncPraktikFermentasi); $('input[name="praktik_fermentasi"]').on('change', syncPraktikFermentasi);
$(document).on('input', '.rupiah-input', function () { $(document).on('input', '.rupiah-input', function () {
@@ -457,6 +534,7 @@
toggleSaluranLanjutan(); toggleSaluranLanjutan();
syncAlasanBerhenti(); syncAlasanBerhenti();
syncSaluranLainnya(); syncSaluranLainnya();
syncSumberInfoLainnya();
syncPraktikFermentasi(); syncPraktikFermentasi();
}); });
</script> </script>