sumber informasi harga
This commit is contained in:
@@ -118,7 +118,8 @@ class AksesPasarController extends Controller
|
||||
'skorPengalamanBerhentiValues' => [
|
||||
SkorPengalaman::PERNAH_BERHENTI_TIDAK_ADA_AKSES->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)),
|
||||
'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())],
|
||||
'proses_fermentasi' => [
|
||||
@@ -231,6 +240,10 @@ class AksesPasarController extends Controller
|
||||
$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) {
|
||||
$payload['proses_fermentasi'] = null;
|
||||
$payload['model_fermentasi_memungkinkan'] = null;
|
||||
|
||||
@@ -31,6 +31,9 @@ class AksesPasar extends Model
|
||||
'saluran_terdahulu',
|
||||
'saluran_terdahulu_lainnya',
|
||||
'alasan_berhenti',
|
||||
'tahu_harga_sebelumnya',
|
||||
'sumber_info_harga',
|
||||
'sumber_info_harga_lainnya',
|
||||
'praktik_fermentasi',
|
||||
'proses_fermentasi',
|
||||
'model_fermentasi_memungkinkan',
|
||||
@@ -51,6 +54,7 @@ class AksesPasar extends Model
|
||||
protected $casts = [
|
||||
'tujuan_penjualan' => 'array',
|
||||
'saluran_terdahulu' => 'array',
|
||||
'sumber_info_harga' => 'array',
|
||||
];
|
||||
|
||||
protected static function booted(): void
|
||||
|
||||
@@ -61,7 +61,7 @@ return new class extends Migration
|
||||
$table->integer('harga_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('deleted_by')->nullable()->constrained('users')->onDelete('set null');
|
||||
|
||||
|
||||
+28
@@ -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>
|
||||
<hr class="my-4">
|
||||
|
||||
<h5 class="pb-3 border-bottom mb-4">Pengalaman Saluran Lain</h5>
|
||||
<div class="row">
|
||||
|
||||
<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>
|
||||
@foreach($skorPengalamanOptions as $option)
|
||||
<div class="form-check mb-2">
|
||||
<input class="form-check-input @error('skor_pengalaman') is-invalid @enderror" type="radio"
|
||||
id="skor-pengalaman-{{ $option['value'] }}" name="skor_pengalaman" value="{{ $option['value'] }}"
|
||||
{{ (string) old('skor_pengalaman', $aksesPasar?->skor_pengalaman) === (string) $option['value'] ? 'checked' : '' }}>
|
||||
<label class="form-check-label" for="skor-pengalaman-{{ $option['value'] }}">{{ $option['label'] }}</label>
|
||||
</div>
|
||||
@endforeach
|
||||
@error('skor_pengalaman')<div class="invalid-feedback d-block">{{ $message }}</div>@enderror
|
||||
</div>
|
||||
<h5 class="pb-3 border-bottom mb-4">Pengalaman Saluran Lain</h5>
|
||||
<div class="row">
|
||||
|
||||
<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>
|
||||
@foreach($skorPengalamanOptions as $option)
|
||||
<div class="form-check mb-2">
|
||||
<input class="form-check-input @error('skor_pengalaman') is-invalid @enderror" type="radio"
|
||||
id="skor-pengalaman-{{ $option['value'] }}" name="skor_pengalaman" value="{{ $option['value'] }}"
|
||||
{{ (string) old('skor_pengalaman', $aksesPasar?->skor_pengalaman) === (string) $option['value'] ? 'checked' : '' }}>
|
||||
<label class="form-check-label" for="skor-pengalaman-{{ $option['value'] }}">{{ $option['label'] }}</label>
|
||||
</div>
|
||||
@endforeach
|
||||
@error('skor_pengalaman')<div class="invalid-feedback d-block">{{ $message }}</div>@enderror
|
||||
</div>
|
||||
|
||||
<div class="col-md-12" id="blok-saluran-lanjutan">
|
||||
<div class="row">
|
||||
|
||||
<div class="col-md-6 mb-4 form-control-validation">
|
||||
<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)...">
|
||||
@error('alasan_berhenti')<div class="invalid-feedback">{{ $message }}</div>@enderror
|
||||
</div>
|
||||
<div class="col-md-12" id="blok-saluran-lanjutan">
|
||||
<div class="row">
|
||||
|
||||
<div class="col-md-6 mb-4 form-control-validation">
|
||||
<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)...">
|
||||
@error('alasan_berhenti')<div class="invalid-feedback">{{ $message }}</div>@enderror
|
||||
</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">
|
||||
<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">
|
||||
@foreach($saluranTerdahuluOptions as $option)
|
||||
@if($option['value'] !== $saluranLainnyaValue)
|
||||
<div class="col-md-6">
|
||||
<div class="form-check mb-2">
|
||||
<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>
|
||||
<div class="row g-2">
|
||||
@foreach($saluranTerdahuluOptions as $option)
|
||||
@if($option['value'] !== $saluranLainnyaValue)
|
||||
<div class="col-md-6">
|
||||
<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"
|
||||
type="checkbox"
|
||||
id="saluran-terdahulu-{{ Str::slug($option['value']) }}"
|
||||
id="saluran-terdahulu-lainnya-checkbox"
|
||||
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'] }}
|
||||
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>
|
||||
@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>
|
||||
@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>
|
||||
@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>
|
||||
|
||||
<h5 class="pb-3 border-bottom mb-4 mt-4">HARGA DI SETIAP TITIK</h5>
|
||||
<h6 class="mb-2">Harga Jual Panen Terakhir</h6>
|
||||
@@ -252,6 +252,75 @@
|
||||
</table>
|
||||
</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>
|
||||
|
||||
<div class="border rounded p-4 mb-4">
|
||||
@@ -386,6 +455,7 @@
|
||||
const praktikBelumPernahValue = String(@json($praktikBelumPernahValue));
|
||||
const skorPengalamanBerhentiValues = @json($skorPengalamanBerhentiValues ?? [2,3]).map(Number);
|
||||
const skorBelumPernahValue = "1";
|
||||
const sumberInfoLainnyaValue = @json($sumberInfoLainnyaValue ?? 'Lainnya');
|
||||
|
||||
function onlyDigits(value) {
|
||||
return String(value || '').replace(/\D/g, '');
|
||||
@@ -425,6 +495,12 @@
|
||||
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() {
|
||||
const isBelumPernah = $('input[name="praktik_fermentasi"]:checked').val() === praktikBelumPernahValue;
|
||||
$('#proses-fermentasi, #model-fermentasi').prop('disabled', isBelumPernah);
|
||||
@@ -439,6 +515,7 @@
|
||||
});
|
||||
|
||||
$('input[name="saluran_terdahulu[]"]').on('change', syncSaluranLainnya);
|
||||
$('input[name="sumber_info_harga[]"]').on('change', syncSumberInfoLainnya);
|
||||
$('input[name="praktik_fermentasi"]').on('change', syncPraktikFermentasi);
|
||||
|
||||
$(document).on('input', '.rupiah-input', function () {
|
||||
@@ -457,6 +534,7 @@
|
||||
toggleSaluranLanjutan();
|
||||
syncAlasanBerhenti();
|
||||
syncSaluranLainnya();
|
||||
syncSumberInfoLainnya();
|
||||
syncPraktikFermentasi();
|
||||
});
|
||||
</script>
|
||||
|
||||
Reference in New Issue
Block a user