Compare commits
110
Commits
a1d9b34d93
...
program
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
909f03cb9a | ||
|
|
4475cd0098 | ||
|
|
67c111a2b3 | ||
|
|
3bcaa3ea50 | ||
|
|
bed9a6f620 | ||
|
|
712b10e405 | ||
|
|
6cfcf46ba6 | ||
|
|
b1b9828514 | ||
|
|
7af7e1bdaf | ||
|
|
bd05fc7f0f | ||
|
|
17b5687db8 | ||
|
|
e7f48b6500 | ||
|
|
a5884d0f8c | ||
|
|
9576c6295e | ||
|
|
079e300d5d | ||
|
|
2c94316439 | ||
|
|
690b53e5a2 | ||
|
|
50c9adfdc7 | ||
|
|
696c7dede8 | ||
|
|
5967e7d6f3 | ||
|
|
4c66d72dc5 | ||
|
|
c43483a9f8 | ||
|
|
e02a34a527 | ||
|
|
713355ce0a | ||
|
|
12f8d0bbda | ||
|
|
8afe7f9b38 | ||
|
|
fbf84eb4cb | ||
|
|
e04093ad3f | ||
|
|
3e1d3a33ee | ||
|
|
e316d064ef | ||
|
|
0c289ec244 | ||
|
|
089f1b515d | ||
|
|
4c647ea8ce | ||
|
|
419404e273 | ||
|
|
837e542851 | ||
|
|
9378d15d71 | ||
|
|
0381e9bf0e | ||
|
|
3a70445e9a | ||
|
|
d2ed2c58fd | ||
|
|
9b201efa06 | ||
|
|
2b3a0b7c58 | ||
|
|
a187fb1095 | ||
|
|
6b44c11181 | ||
|
|
090153e53a | ||
|
|
a79a93d291 | ||
|
|
62f0f1bdbc | ||
|
|
f0acd8c7ed | ||
|
|
3908b0be71 | ||
|
|
05cc3be9d3 | ||
|
|
f4c83d348a | ||
|
|
61bd8dc388 | ||
|
|
002d6044b4 | ||
|
|
30196278d7 | ||
|
|
08c19c0714 | ||
|
|
d6c036e19a | ||
|
|
981bc0d494 | ||
|
|
857da1e900 | ||
|
|
66fc7227e6 | ||
|
|
3edfc57ba7 | ||
|
|
4a560ebc4e | ||
|
|
d4eb27e583 | ||
|
|
d1c0f90afd | ||
|
|
a1dadd1b1b | ||
|
|
2c28bb06db | ||
|
|
96a53c8754 | ||
|
|
fcc5d7dcc5 | ||
|
|
e383aacbeb | ||
|
|
5b776b2ae8 | ||
|
|
c4e3e460b1 | ||
|
|
a7dc1dc58b | ||
|
|
d01c737364 | ||
|
|
8d50757b51 | ||
|
|
f146cb2608 | ||
|
|
095d84ec7f | ||
|
|
f259c6728a | ||
|
|
a241a62136 | ||
|
|
4755c8a482 | ||
|
|
7672877299 | ||
|
|
92e8efb247 | ||
|
|
599269410b | ||
|
|
c5b5721b31 | ||
|
|
2bf2a68a3a | ||
|
|
b445392e9f | ||
|
|
bcc15d5240 | ||
|
|
d33bc8a42b | ||
|
|
df5bfeb67f | ||
|
|
b0e1f3f131 | ||
|
|
a19871366a | ||
|
|
b4b851c7a9 | ||
|
|
e6f6257434 | ||
|
|
469e57ba28 | ||
|
|
d06da22ae5 | ||
|
|
350df6adcf | ||
|
|
1788efaed5 | ||
|
|
d49bd4953c | ||
|
|
26f6e83328 | ||
|
|
79f6426125 | ||
|
|
9557d1ec64 | ||
|
|
7bab43df71 | ||
|
|
316b256ae0 | ||
|
|
bfabab96c5 | ||
|
|
bd9b0873a3 | ||
|
|
3464a802e2 | ||
|
|
6c95c462cb | ||
|
|
626fdba065 | ||
|
|
2152079b26 | ||
|
|
6559a97f43 | ||
|
|
05c2e53378 | ||
|
|
3df381a66c | ||
|
|
6fac76127d |
@@ -0,0 +1,28 @@
|
||||
<?php
|
||||
|
||||
namespace App\Enums\AksesPasar;
|
||||
|
||||
enum PraktikFermentasi: string
|
||||
{
|
||||
case RUTIN_SENDIRI = 'Ya, rutin — dilakukan sendiri/individual';
|
||||
case RUTIN_KELOMPOK = 'Ya, rutin — bersama kelompok tani/kolektif';
|
||||
case PERNAH_SENDIRI = 'Pernah mencoba — sendiri';
|
||||
case PERNAH_KELOMPOK = 'Pernah mencoba — bersama kelompok';
|
||||
case BELUM_PERNAH = 'Belum pernah';
|
||||
|
||||
public static function options(): array
|
||||
{
|
||||
return [
|
||||
['value' => self::RUTIN_SENDIRI->value, 'label' => 'Ya, rutin — dilakukan sendiri/individual'],
|
||||
['value' => self::RUTIN_KELOMPOK->value, 'label' => 'Ya, rutin — bersama kelompok tani/kolektif'],
|
||||
['value' => self::PERNAH_SENDIRI->value, 'label' => 'Pernah mencoba — sendiri'],
|
||||
['value' => self::PERNAH_KELOMPOK->value, 'label' => 'Pernah mencoba — bersama kelompok'],
|
||||
['value' => self::BELUM_PERNAH->value, 'label' => 'Belum pernah'],
|
||||
];
|
||||
}
|
||||
|
||||
public static function values(): array
|
||||
{
|
||||
return array_column(self::cases(), 'value');
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,28 @@
|
||||
<?php
|
||||
|
||||
namespace App\Enums\AksesPasar;
|
||||
|
||||
enum SaluranTerdahulu: string
|
||||
{
|
||||
case TENGKULAK = 'Tengkulak–pedagang lokal';
|
||||
case KOPERASI = 'Koperasi';
|
||||
case BUMDES = 'BUMDes';
|
||||
case LANGSUNG_PEMBELI = 'Langsung ke pembeli–eksportir';
|
||||
case LAINNYA = 'Lainnya';
|
||||
|
||||
public static function options(): array
|
||||
{
|
||||
return [
|
||||
['value' => self::TENGKULAK->value, 'label' => 'Tengkulak–pedagang lokal'],
|
||||
['value' => self::KOPERASI->value, 'label' => 'Koperasi'],
|
||||
['value' => self::BUMDES->value, 'label' => 'BUMDes'],
|
||||
['value' => self::LANGSUNG_PEMBELI->value, 'label' => 'Langsung ke pembeli–eksportir'],
|
||||
['value' => self::LAINNYA->value, 'label' => 'Lainnya'],
|
||||
];
|
||||
}
|
||||
|
||||
public static function values(): array
|
||||
{
|
||||
return array_column(self::cases(), 'value');
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,28 @@
|
||||
<?php
|
||||
|
||||
namespace App\Enums\AksesPasar;
|
||||
|
||||
enum SkorKesadaranPremium: int
|
||||
{
|
||||
case BELUM_PERNAH_DENGAR = 1;
|
||||
case PERNAH_BELUM_PAHAM = 2;
|
||||
case PERNAH_SEDIKIT_PAHAM = 3;
|
||||
case SANGAT_PAHAM_BELUM_AKSES = 4;
|
||||
case SUDAH_AKSES_KONSISTEN = 5;
|
||||
|
||||
public static function options(): array
|
||||
{
|
||||
return [
|
||||
['value' => self::BELUM_PERNAH_DENGAR->value, 'label' => 'Belum pernah dengar'],
|
||||
['value' => self::PERNAH_BELUM_PAHAM->value, 'label' => 'Pernah dengar tapi belum paham syarat'],
|
||||
['value' => self::PERNAH_SEDIKIT_PAHAM->value, 'label' => 'Pernah dengar & sedikit paham syarat'],
|
||||
['value' => self::SANGAT_PAHAM_BELUM_AKSES->value, 'label' => 'Sangat paham syarat tapi belum pernah akses'],
|
||||
['value' => self::SUDAH_AKSES_KONSISTEN->value, 'label' => 'Sudah akses & dapat harga premium konsisten'],
|
||||
];
|
||||
}
|
||||
|
||||
public static function values(): array
|
||||
{
|
||||
return array_column(self::cases(), 'value');
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,28 @@
|
||||
<?php
|
||||
|
||||
namespace App\Enums\AksesPasar;
|
||||
|
||||
enum SkorPengalaman: int
|
||||
{
|
||||
case BELUM_PERNAH = 1;
|
||||
case PERNAH_BERHENTI_TIDAK_ADA_AKSES = 2;
|
||||
case PERNAH_BERHENTI_MUNGKIN_KEMBALI = 3;
|
||||
case PERNAH_SESEKALI_JUAL = 4;
|
||||
case PERNAH_MASIH_AKTIF = 5;
|
||||
|
||||
public static function options(): array
|
||||
{
|
||||
return [
|
||||
['value' => self::BELUM_PERNAH->value, 'label' => 'Belum pernah coba saluran lain'],
|
||||
['value' => self::PERNAH_BERHENTI_TIDAK_ADA_AKSES->value, 'label' => 'Pernah, sudah berhenti & tidak ada akses'],
|
||||
['value' => self::PERNAH_BERHENTI_MUNGKIN_KEMBALI->value, 'label' => 'Pernah, berhenti tapi masih mungkin kembali'],
|
||||
['value' => self::PERNAH_SESEKALI_JUAL->value, 'label' => 'Pernah & sesekali masih jual ke sana'],
|
||||
['value' => self::PERNAH_MASIH_AKTIF->value, 'label' => 'Pernah & masih punya akses aktif'],
|
||||
];
|
||||
}
|
||||
|
||||
public static function values(): array
|
||||
{
|
||||
return array_column(self::cases(), 'value');
|
||||
}
|
||||
}
|
||||
@@ -7,4 +7,21 @@ enum KeparahanSerangan: string
|
||||
case RINGAN = 'ringan';
|
||||
case SEDANG = 'sedang';
|
||||
case BERAT = 'berat';
|
||||
|
||||
public function label(): string
|
||||
{
|
||||
return match($this) {
|
||||
self::RINGAN => 'Ringan, hanya beberapa tanaman',
|
||||
self::SEDANG => 'Sedang, sebagian tanaman terdampak',
|
||||
self::BERAT => 'Parah, sebagian besar tanaman terdampak',
|
||||
};
|
||||
}
|
||||
|
||||
public static function options(): array
|
||||
{
|
||||
return collect(self::cases())->map(fn ($case) => [
|
||||
'value' => $case->value,
|
||||
'label' => $case->label(),
|
||||
])->toArray();
|
||||
}
|
||||
}
|
||||
@@ -7,6 +7,24 @@ enum KondisiTanaman: string
|
||||
case BAIK = 'baik';
|
||||
case SEDANG = 'sedang';
|
||||
case BURUK = 'buruk';
|
||||
case SAKIT= 'sakit';
|
||||
//case SAKIT= 'sakit';
|
||||
case MATI = 'mati';
|
||||
|
||||
public function label(): string
|
||||
{
|
||||
return match($this) {
|
||||
self::BAIK => 'Baik, tumbuh lebat, banyak buah',
|
||||
self::SEDANG => 'Sedang, cukup tumbuh, ada masalah',
|
||||
self::BURUK => 'Buruk, banyak tanaman tua dan lemah/tidak berbuah',
|
||||
self::MATI => 'Mati, tanaman telah mati, tidak dapat tumbuh maupun berbuah',
|
||||
};
|
||||
}
|
||||
|
||||
public static function options(): array
|
||||
{
|
||||
return collect(self::cases())->map(fn ($case) => [
|
||||
'value' => $case->value,
|
||||
'label' => $case->label(),
|
||||
])->toArray();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -19,13 +19,13 @@ enum Pendidikan: string
|
||||
{
|
||||
return match($this) {
|
||||
self::TIDAK_SEKOLAH => 'Tidak Sekolah',
|
||||
self::SD => 'SD atau Sederajat',
|
||||
self::SMP => 'SMP atau Sederajat',
|
||||
self::SMA => 'SMA atau Sederajat',
|
||||
self::SD => 'SD',
|
||||
self::SMP => 'SMP',
|
||||
self::SMA => 'SMA/SMK',
|
||||
self::DIPLOMA => 'Diploma 1-3 (D1-D3)',
|
||||
self::SARJANA => 'Sarjana (S1) atau sederajat',
|
||||
self::MAGISTER => 'Magister (S2) atau sederajat',
|
||||
self::DOKTOR => 'Doktor (S3) atau sederajat',
|
||||
self::SARJANA => 'Sarjana (S1)',
|
||||
self::MAGISTER => 'Magister (S2)',
|
||||
self::DOKTOR => 'Doktor (S3)',
|
||||
self::PESANTREN => 'Pesantren, Semiari, Wihara, atau Pendidikan Keagamaan Formal',
|
||||
self::LAINNYA => 'Lainnya',
|
||||
};
|
||||
|
||||
@@ -0,0 +1,26 @@
|
||||
<?php
|
||||
|
||||
namespace App\Enums\PendidikanPelatihan;
|
||||
|
||||
enum PelatihanGAP: string
|
||||
{
|
||||
case PEMANGKASAN = 'Pemangkasan atau perawatan tanaman';
|
||||
case PEMUPUKAN = 'Pemupukan atau nutrisi tanah';
|
||||
case PENGENDALIAN = 'Pengendalian hama dan penyakit';
|
||||
case PRAKTIK = 'Praktik Berkebun yang Baik (GAP)';
|
||||
case PENGOLAHAN = 'Pengolahan/pascapanen';
|
||||
case PENYERBUKAN = 'Penyerbukan manual (Vanili)';
|
||||
|
||||
public function label(): string
|
||||
{
|
||||
return $this->value;
|
||||
}
|
||||
|
||||
public static function options(): array
|
||||
{
|
||||
return collect(self::cases())->map(fn ($case) => [
|
||||
'value' => $case->value,
|
||||
'label' => $case->label(),
|
||||
])->toArray();
|
||||
}
|
||||
}
|
||||
@@ -8,4 +8,22 @@ enum PenyakitTanaman: string
|
||||
case DAUN_MENGUNING = 'daun_menguning';
|
||||
case DAUN_BERCAK = 'daun_bercak';
|
||||
case TANAMAN_LAYU = 'tanaman_layu';
|
||||
|
||||
public function label(): string
|
||||
{
|
||||
return match ($this) {
|
||||
self::BUSUK_BUAH => 'Busuk Buah',
|
||||
self::DAUN_MENGUNING => 'Daun Menguning',
|
||||
self::DAUN_BERCAK => 'Daun Bercak',
|
||||
self::TANAMAN_LAYU => 'Tanaman Layu',
|
||||
};
|
||||
}
|
||||
|
||||
public static function options(): array
|
||||
{
|
||||
return collect(self::cases())->map(fn ($case) => [
|
||||
'value' => $case->value,
|
||||
'label' => $case->label(),
|
||||
])->toArray();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,32 @@
|
||||
<?php
|
||||
|
||||
namespace App\Enums\PraktikBudidaya;
|
||||
|
||||
enum Bulan: string
|
||||
{
|
||||
case JANUARI = 'Januari';
|
||||
case FEBRUARI = 'Februari';
|
||||
case MARET = 'Maret';
|
||||
case APRIL = 'April';
|
||||
case MEI = 'Mei';
|
||||
case JUNI = 'Juni';
|
||||
case JULI = 'Juli';
|
||||
case AGUSTUS = 'Agustus';
|
||||
case SEPTEMBER = 'September';
|
||||
case OKTOBER = 'Oktober';
|
||||
case NOVEMBER = 'November';
|
||||
case DESEMBER = 'Desember';
|
||||
|
||||
public function label(): string
|
||||
{
|
||||
return $this->value;
|
||||
}
|
||||
|
||||
public static function options(): array
|
||||
{
|
||||
return collect(self::cases())->map(fn ($case) => [
|
||||
'value' => $case->value,
|
||||
'label' => $case->label(),
|
||||
])->toArray();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,31 @@
|
||||
<?php
|
||||
|
||||
namespace App\Enums\PraktikBudidaya;
|
||||
|
||||
enum CaraSortasi: string
|
||||
{
|
||||
case DIPILAH = 'Dipilah manual dengan tangan (memilih satu per satu buah/biji yang bagus dan membuang yang rusak)';
|
||||
case ALAT_BANTU = 'Menggunakan alat bantu sederhana (tampah, ayakan, atau bak untuk memisahkan kotoran ringan)';
|
||||
case PERENDAMAN = 'Metode perendaman/tenggelam (memisahkan buah mengapung dan tenggelam)';
|
||||
case GRADING_KRITERIA = 'Grading berdasarkan kriteria (ukuran, warna, atau tingkat kematangan)';
|
||||
case PEMBERSIHAN = 'Hanya pembersihan kotoran kasar (membuang dahan atau sampah besar)';
|
||||
|
||||
public function label(): string
|
||||
{
|
||||
return match($this) {
|
||||
self::DIPILAH => 'Dipilah manual dengan tangan (memilih satu per satu buah/biji yang bagus dan membuang yang rusak)',
|
||||
self::ALAT_BANTU => 'Menggunakan alat bantu sederhana (tampah, ayakan, atau bak untuk memisahkan kotoran ringan)',
|
||||
self::PERENDAMAN => 'Metode perendaman/tenggelam (memisahkan buah mengapung dan tenggelam)',
|
||||
self::GRADING_KRITERIA => 'Grading berdasarkan kriteria (ukuran, warna, atau tingkat kematangan)',
|
||||
self::PEMBERSIHAN => 'Hanya pembersihan kotoran kasar (membuang dahan atau sampah besar)',
|
||||
};
|
||||
}
|
||||
|
||||
public static function options(): array
|
||||
{
|
||||
return collect(self::cases())->map(fn ($case) => [
|
||||
'value' => $case->value,
|
||||
'label' => $case->label(),
|
||||
])->toArray();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,31 @@
|
||||
<?php
|
||||
|
||||
namespace App\Enums\PraktikBudidaya;
|
||||
|
||||
enum DasarPenentuanPanen: int
|
||||
{
|
||||
case KEBUTUHAN_UANG = 1;
|
||||
case UMUR_TANPA_KONDISI_BUAH = 2;
|
||||
case BUAH_JATUH = 3;
|
||||
case TINGKAT_KEPADATAN = 4;
|
||||
case WARNA_KULIT_BUAH = 5;
|
||||
|
||||
public function label(): string
|
||||
{
|
||||
return match($this) {
|
||||
self::KEBUTUHAN_UANG => 'Kebutuhan uang mendesak, tanpa mempertimbangkan kematangan',
|
||||
self::UMUR_TANPA_KONDISI_BUAH => 'Umur/jadwal tetap, tanpa melihat kondisi buah langsung',
|
||||
self::BUAH_JATUH => 'Buah jatuh/matang pohon (sudah terlalu matang saat dipetik)',
|
||||
self::TINGKAT_KEPADATAN => 'Bersuara saat diketuk atau tingkat kepadatan buah',
|
||||
self::WARNA_KULIT_BUAH => 'Warna kulit buah (indikator paling akurat dan konsisten untuk menentukan kematangan optimal)',
|
||||
};
|
||||
}
|
||||
|
||||
public static function options(): array
|
||||
{
|
||||
return collect(self::cases())->map(fn ($case) => [
|
||||
'value' => $case->value,
|
||||
'label' => $case->label(),
|
||||
])->toArray();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,33 @@
|
||||
<?php
|
||||
|
||||
namespace App\Enums\PraktikBudidaya;
|
||||
|
||||
enum EstimasiKehilanganHasil: string
|
||||
{
|
||||
case TIDAK_ADA = 'Tidak ada kehilangan';
|
||||
case SEDIKIT = 'Sedikit, sekitar 25 % dari total panen';
|
||||
case LUMAYAN = 'Lumayan, sekitar 50% dari total panen';
|
||||
case BANYAK = 'Banyak, sekitar 75% dari total panen';
|
||||
case HAMPIR_SEMUA = 'Hampir semua rusak, lebih dari 75%';
|
||||
case TIDAK_TAHU = 'Hanya pembersihan kotoran kasar (membuang dahan atau sampah besar)';
|
||||
|
||||
public function label(): string
|
||||
{
|
||||
return match($this) {
|
||||
self::TIDAK_ADA => 'Tidak ada kehilangan',
|
||||
self::SEDIKIT => 'Sedikit, sekitar 25 % dari total panen',
|
||||
self::LUMAYAN => 'Lumayan, sekitar 50% dari total panen',
|
||||
self::BANYAK => 'Banyak, sekitar 75% dari total panen',
|
||||
self::HAMPIR_SEMUA => 'Hampir semua rusak, lebih dari 75%',
|
||||
self::TIDAK_TAHU => 'Tidak tahu/sulit memperkirakan',
|
||||
};
|
||||
}
|
||||
|
||||
public static function options(): array
|
||||
{
|
||||
return collect(self::cases())->map(fn ($case) => [
|
||||
'value' => $case->value,
|
||||
'label' => $case->label(),
|
||||
])->toArray();
|
||||
}
|
||||
}
|
||||
@@ -13,11 +13,11 @@ enum PenangananGulma: int
|
||||
public function label(): string
|
||||
{
|
||||
return match($this) {
|
||||
self::DIBIARKAN => 'Dibiarkan di kebun',
|
||||
self::DICABUT => 'Dikumpulkan dan dibuang',
|
||||
self::DISEMPROT => 'Dijadikan kompos',
|
||||
self::RUTIN_DICABUT_TANPA_JADWAL => 'Dikumpulkan dan dibuang',
|
||||
self::RUTIN_TERJADWAL => 'Dijadikan kompos',
|
||||
self::DIBIARKAN => 'Dibiarkan saja, tidak pernah ditangani',
|
||||
self::DICABUT => 'Dicabut/dibersihkan sesekali, tidak terjadwal',
|
||||
self::DISEMPROT => 'Disemprot herbisida sesekali, tidak terjadwal',
|
||||
self::RUTIN_DICABUT_TANPA_JADWAL => 'Rutin dicabut/dipangkas, tapi tanpa jadwal yang jelas',
|
||||
self::RUTIN_TERJADWAL => 'Rutin terjadwal dengan metode yang konsisten (dicabut/dipangkas/dikelola sebagai mulsa)',
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,31 @@
|
||||
<?php
|
||||
|
||||
namespace App\Enums\PraktikBudidaya;
|
||||
|
||||
enum PraktikSortasi: int
|
||||
{
|
||||
case TIDAK_PERNAH = 1;
|
||||
case SANGAT_SEDERHANA = 2;
|
||||
case TIDAK_SETIAP_PANEN = 3;
|
||||
case SETIAP_PANEN = 4;
|
||||
case KETAT = 5;
|
||||
|
||||
public function label(): string
|
||||
{
|
||||
return match($this) {
|
||||
self::TIDAK_PERNAH => 'Tidak pernah melakukan sortasi sama sekali',
|
||||
self::SANGAT_SEDERHANA => 'Sortasi sangat sederhana, hanya membuang yang jelas-jelas rusak/busuk',
|
||||
self::TIDAK_SETIAP_PANEN => 'Sortasi dilakukan tapi tidak setiap panen (kadang dilakukan, kadang tidak)',
|
||||
self::SETIAP_PANEN => 'Sortasi dilakukan setiap panen, tapi standarnya belum konsisten',
|
||||
self::KETAT => 'Sortasi ketat dengan standar yang jelas dan konsisten setiap panen',
|
||||
};
|
||||
}
|
||||
|
||||
public static function options(): array
|
||||
{
|
||||
return collect(self::cases())->map(fn ($case) => [
|
||||
'value' => $case->value,
|
||||
'label' => $case->label(),
|
||||
])->toArray();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,25 @@
|
||||
<?php
|
||||
|
||||
namespace App\Enums\PraktikBudidaya;
|
||||
|
||||
enum TindakanPanenReject: string
|
||||
{
|
||||
case BUANG = 'Dibuang';
|
||||
case JUAL = 'Dijual ke tempat lain';
|
||||
|
||||
public function label(): string
|
||||
{
|
||||
return match($this) {
|
||||
self::BUANG => 'Dibuang',
|
||||
self::JUAL => 'Dijual ke tempat lain',
|
||||
};
|
||||
}
|
||||
|
||||
public static function options(): array
|
||||
{
|
||||
return collect(self::cases())->map(fn ($case) => [
|
||||
'value' => $case->value,
|
||||
'label' => $case->label(),
|
||||
])->toArray();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,31 @@
|
||||
<?php
|
||||
|
||||
namespace App\Enums\PraktikBudidaya;
|
||||
|
||||
enum TingkatPanenReject: int
|
||||
{
|
||||
case SERING = 1;
|
||||
case CUKUP_SERING = 2;
|
||||
case KADANG = 3;
|
||||
case JARANG = 4;
|
||||
case TIDAK_ADA = 5;
|
||||
|
||||
public function label(): string
|
||||
{
|
||||
return match($this) {
|
||||
self::SERING => 'Sering ditolak, lebih dari 50% hasil panen biasanya ditolak/tidak laku karena mutu',
|
||||
self::CUKUP_SERING => 'Cukup sering, sekitar 25–50% hasil panen ditolak/tidak laku',
|
||||
self::KADANG => 'Kadang ditolak, sekitar 10–25% hasil panen',
|
||||
self::JARANG => 'Jarang ditolak, kurang dari 10% hasil panen',
|
||||
self::TIDAK_ADA => 'Tidak ada yang ditolak, semua hasil panen sesuai standar pasar utama',
|
||||
};
|
||||
}
|
||||
|
||||
public static function options(): array
|
||||
{
|
||||
return collect(self::cases())->map(fn ($case) => [
|
||||
'value' => $case->value,
|
||||
'label' => $case->label(),
|
||||
])->toArray();
|
||||
}
|
||||
}
|
||||
@@ -7,4 +7,21 @@ enum SeranganHama: string
|
||||
case ULAT = 'ulat';
|
||||
case BELALANG = 'belalang';
|
||||
case KUTU = 'kutu';
|
||||
|
||||
public function label(): string
|
||||
{
|
||||
return match ($this) {
|
||||
self::ULAT => 'Ulat',
|
||||
self::BELALANG => 'Belalang',
|
||||
self::KUTU => 'Kutu',
|
||||
};
|
||||
}
|
||||
|
||||
public static function options(): array
|
||||
{
|
||||
return collect(self::cases())->map(fn ($case) => [
|
||||
'value' => $case->value,
|
||||
'label' => $case->label(),
|
||||
])->toArray();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,36 @@
|
||||
<?php
|
||||
|
||||
namespace App\Enums\SosialEkonomi;
|
||||
|
||||
enum AlasanKreditDitolak: string
|
||||
{
|
||||
case TIDAK_PUNYA_JAMINAN_AGUNAN = 'tidak_punya_jaminan_agunan';
|
||||
case PROSES_TERLALU_RUMIT = 'proses_terlalu_rumit';
|
||||
case TAKUT_TIDAK_BISA_BAYAR = 'takut_tidak_bisa_bayar';
|
||||
case TIDAK_TAHU_CARANYA = 'tidak_tahu_caranya';
|
||||
case LAINNYA = 'lainnya';
|
||||
|
||||
public function label(): string
|
||||
{
|
||||
return match ($this) {
|
||||
self::TIDAK_PUNYA_JAMINAN_AGUNAN => 'Tidak punya jaminan-agunan',
|
||||
self::PROSES_TERLALU_RUMIT => 'Proses terlalu rumit',
|
||||
self::TAKUT_TIDAK_BISA_BAYAR => 'Takut tidak bisa bayar',
|
||||
self::TIDAK_TAHU_CARANYA => 'Tidak tahu caranya',
|
||||
self::LAINNYA => 'Lainnya',
|
||||
};
|
||||
}
|
||||
|
||||
public static function options(): array
|
||||
{
|
||||
return collect(self::cases())->map(fn ($case) => [
|
||||
'value' => $case->value,
|
||||
'label' => $case->label(),
|
||||
])->toArray();
|
||||
}
|
||||
|
||||
public static function values(): array
|
||||
{
|
||||
return array_column(self::cases(), 'value');
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,30 @@
|
||||
<?php
|
||||
|
||||
namespace App\Enums\SosialEkonomi;
|
||||
|
||||
enum BisaBeliPupukBersubsidi: string
|
||||
{
|
||||
case YA = 'ya';
|
||||
case TIDAK = 'tidak';
|
||||
|
||||
public function label(): string
|
||||
{
|
||||
return match ($this) {
|
||||
self::YA => 'Ya',
|
||||
self::TIDAK => 'Tidak',
|
||||
};
|
||||
}
|
||||
|
||||
public static function options(): array
|
||||
{
|
||||
return collect(self::cases())->map(fn ($case) => [
|
||||
'value' => $case->value,
|
||||
'label' => $case->label(),
|
||||
])->toArray();
|
||||
}
|
||||
|
||||
public static function values(): array
|
||||
{
|
||||
return array_column(self::cases(), 'value');
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,34 @@
|
||||
<?php
|
||||
|
||||
namespace App\Enums\SosialEkonomi;
|
||||
|
||||
enum JenisAsetProduktif: string
|
||||
{
|
||||
case TERNAK = 'ternak';
|
||||
case KENDARAAN = 'kendaraan';
|
||||
case ALAT_PERTANIAN = 'alat_pertanian';
|
||||
case LAINNYA = 'lainnya';
|
||||
|
||||
public function label(): string
|
||||
{
|
||||
return match ($this) {
|
||||
self::TERNAK => 'Ternak',
|
||||
self::KENDARAAN => 'Kendaraan',
|
||||
self::ALAT_PERTANIAN => 'Alat pertanian',
|
||||
self::LAINNYA => 'Lainnya',
|
||||
};
|
||||
}
|
||||
|
||||
public static function options(): array
|
||||
{
|
||||
return collect(self::cases())->map(fn ($case) => [
|
||||
'value' => $case->value,
|
||||
'label' => $case->label(),
|
||||
])->toArray();
|
||||
}
|
||||
|
||||
public static function values(): array
|
||||
{
|
||||
return array_column(self::cases(), 'value');
|
||||
}
|
||||
}
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
<?php
|
||||
|
||||
namespace App\Enums;
|
||||
namespace App\Enums\SosialEkonomi;
|
||||
|
||||
enum KategoriPendapatanKomoditas: string
|
||||
{
|
||||
@@ -0,0 +1,36 @@
|
||||
<?php
|
||||
|
||||
namespace App\Enums\SosialEkonomi;
|
||||
|
||||
enum KeaktifanPertemuanKelompok: int
|
||||
{
|
||||
case TIDAK_PERNAH_HADIR = 1;
|
||||
case JARANG_HADIR = 2;
|
||||
case SERING_HADIR_LEBIH_BANYAK_DIAM = 3;
|
||||
case HAMPIR_SELALU_HADIR_KADANG_DISKUSI = 4;
|
||||
case SELALU_HADIR_AKTIF_DISKUSI = 5;
|
||||
|
||||
public function label(): string
|
||||
{
|
||||
return match ($this) {
|
||||
self::TIDAK_PERNAH_HADIR => 'Tidak pernah hadir',
|
||||
self::JARANG_HADIR => 'Jarang hadir',
|
||||
self::SERING_HADIR_LEBIH_BANYAK_DIAM => 'Sering hadir tapi lebih banyak diam',
|
||||
self::HAMPIR_SELALU_HADIR_KADANG_DISKUSI => 'Hampir selalu hadir & kadang diskusi',
|
||||
self::SELALU_HADIR_AKTIF_DISKUSI => 'Selalu hadir & aktif diskusi',
|
||||
};
|
||||
}
|
||||
|
||||
public static function options(): array
|
||||
{
|
||||
return collect(self::cases())->map(fn ($case) => [
|
||||
'value' => $case->value,
|
||||
'label' => $case->label(),
|
||||
])->toArray();
|
||||
}
|
||||
|
||||
public static function values(): array
|
||||
{
|
||||
return array_column(self::cases(), 'value');
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,36 @@
|
||||
<?php
|
||||
|
||||
namespace App\Enums\SosialEkonomi;
|
||||
|
||||
enum KebebasanMemilihPembeli: int
|
||||
{
|
||||
case TIDAK_BEBAS_TERIKAT_SATU_PEMBELI = 1;
|
||||
case AGAK_TERIKAT_ADA_TEKANAN = 2;
|
||||
case AGAK_BEBAS_CENDERUNG_PEMBELI_SAMA = 3;
|
||||
case CUKUP_BEBAS_SESEKALI_PINDAH = 4;
|
||||
case SANGAT_BEBAS_PINDAH_KAPAN_SAJA = 5;
|
||||
|
||||
public function label(): string
|
||||
{
|
||||
return match ($this) {
|
||||
self::TIDAK_BEBAS_TERIKAT_SATU_PEMBELI => 'Tidak bebas, terikat satu pembeli',
|
||||
self::AGAK_TERIKAT_ADA_TEKANAN => 'Agak terikat, ada tekanan',
|
||||
self::AGAK_BEBAS_CENDERUNG_PEMBELI_SAMA => 'Agak bebas, cenderung pembeli sama',
|
||||
self::CUKUP_BEBAS_SESEKALI_PINDAH => 'Cukup bebas, sesekali pindah',
|
||||
self::SANGAT_BEBAS_PINDAH_KAPAN_SAJA => 'Sangat bebas, pindah kapan saja',
|
||||
};
|
||||
}
|
||||
|
||||
public static function options(): array
|
||||
{
|
||||
return collect(self::cases())->map(fn ($case) => [
|
||||
'value' => $case->value,
|
||||
'label' => $case->label(),
|
||||
])->toArray();
|
||||
}
|
||||
|
||||
public static function values(): array
|
||||
{
|
||||
return array_column(self::cases(), 'value');
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,34 @@
|
||||
<?php
|
||||
|
||||
namespace App\Enums\SosialEkonomi;
|
||||
|
||||
enum KedekatanSesamaAnggota: string
|
||||
{
|
||||
case SANGAT_DEKAT = 'sangat_dekat';
|
||||
case CUKUP_DEKAT = 'cukup_dekat';
|
||||
case SEBATAS_KENAL = 'sebatas_kenal';
|
||||
case TIDAK_BEGITU_KENAL = 'tidak_begitu_kenal';
|
||||
|
||||
public function label(): string
|
||||
{
|
||||
return match ($this) {
|
||||
self::SANGAT_DEKAT => 'Sangat dekat',
|
||||
self::CUKUP_DEKAT => 'Cukup dekat',
|
||||
self::SEBATAS_KENAL => 'Sebatas kenal',
|
||||
self::TIDAK_BEGITU_KENAL => 'Tidak begitu kenal',
|
||||
};
|
||||
}
|
||||
|
||||
public static function options(): array
|
||||
{
|
||||
return collect(self::cases())->map(fn ($case) => [
|
||||
'value' => $case->value,
|
||||
'label' => $case->label(),
|
||||
])->toArray();
|
||||
}
|
||||
|
||||
public static function values(): array
|
||||
{
|
||||
return array_column(self::cases(), 'value');
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,36 @@
|
||||
<?php
|
||||
|
||||
namespace App\Enums\SosialEkonomi;
|
||||
|
||||
enum KemauanIkutProgram: int
|
||||
{
|
||||
case TIDAK_MAU = 1;
|
||||
case RAGU_RAGU = 2;
|
||||
case MAU_PERLU_DIPASTIKAN_MANFAAT = 3;
|
||||
case MAU_LIHAT_PROGRAM_DULU = 4;
|
||||
case MAU_LANGSUNG_IKUT = 5;
|
||||
|
||||
public function label(): string
|
||||
{
|
||||
return match ($this) {
|
||||
self::TIDAK_MAU => 'Tidak mau',
|
||||
self::RAGU_RAGU => 'Ragu-ragu',
|
||||
self::MAU_PERLU_DIPASTIKAN_MANFAAT => 'Mau, perlu dipastikan manfaatnya',
|
||||
self::MAU_LIHAT_PROGRAM_DULU => 'Mau, ingin lihat programnya dulu',
|
||||
self::MAU_LANGSUNG_IKUT => 'Mau, langsung ikut',
|
||||
};
|
||||
}
|
||||
|
||||
public static function options(): array
|
||||
{
|
||||
return collect(self::cases())->map(fn ($case) => [
|
||||
'value' => $case->value,
|
||||
'label' => $case->label(),
|
||||
])->toArray();
|
||||
}
|
||||
|
||||
public static function values(): array
|
||||
{
|
||||
return array_column(self::cases(), 'value');
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,36 @@
|
||||
<?php
|
||||
|
||||
namespace App\Enums\SosialEkonomi;
|
||||
|
||||
enum KemauanMencobaPraktikBaru: int
|
||||
{
|
||||
case TIDAK_MAU = 1;
|
||||
case RAGU_RAGU = 2;
|
||||
case MAU_LIHAT_HASIL_DULU = 3;
|
||||
case MAU_LANGSUNG_COBA = 4;
|
||||
case MAU_COBA_SAMPAI_BERHASIL = 5;
|
||||
|
||||
public function label(): string
|
||||
{
|
||||
return match ($this) {
|
||||
self::TIDAK_MAU => 'Tidak mau',
|
||||
self::RAGU_RAGU => 'Ragu-ragu',
|
||||
self::MAU_LIHAT_HASIL_DULU => 'Mau, lihat hasil dulu',
|
||||
self::MAU_LANGSUNG_COBA => 'Mau langsung coba',
|
||||
self::MAU_COBA_SAMPAI_BERHASIL => 'Mau coba sampai berhasil',
|
||||
};
|
||||
}
|
||||
|
||||
public static function options(): array
|
||||
{
|
||||
return collect(self::cases())->map(fn ($case) => [
|
||||
'value' => $case->value,
|
||||
'label' => $case->label(),
|
||||
])->toArray();
|
||||
}
|
||||
|
||||
public static function values(): array
|
||||
{
|
||||
return array_column(self::cases(), 'value');
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,38 @@
|
||||
<?php
|
||||
|
||||
namespace App\Enums\SosialEkonomi;
|
||||
|
||||
enum KeterikatanHutangPanen: int
|
||||
{
|
||||
case TIDAK_BERSEDIA_MENJAWAB = 0;
|
||||
case HUTANG_BESAR_HAMPIR_SELURUH_PANEN_TERIKAT = 1;
|
||||
case HUTANG_LEBIH_DARI_SEPARUH_PANEN_TERIKAT = 2;
|
||||
case HUTANG_SEBAGIAN_KECIL_TERIKAT = 3;
|
||||
case HUTANG_KECIL_TIDAK_MENGIKAT_PANEN = 4;
|
||||
case TIDAK_ADA = 5;
|
||||
|
||||
public function label(): string
|
||||
{
|
||||
return match ($this) {
|
||||
self::TIDAK_BERSEDIA_MENJAWAB => 'Tidak bersedia menjawab',
|
||||
self::HUTANG_BESAR_HAMPIR_SELURUH_PANEN_TERIKAT => 'Ada hutang besar, hampir seluruh panen terikat',
|
||||
self::HUTANG_LEBIH_DARI_SEPARUH_PANEN_TERIKAT => 'Ada hutang, >separuh panen terikat',
|
||||
self::HUTANG_SEBAGIAN_KECIL_TERIKAT => 'Ada hutang, sebagian kecil terikat',
|
||||
self::HUTANG_KECIL_TIDAK_MENGIKAT_PANEN => 'Ada hutang kecil, tidak mengikat panen',
|
||||
self::TIDAK_ADA => 'Tidak ada',
|
||||
};
|
||||
}
|
||||
|
||||
public static function options(): array
|
||||
{
|
||||
return collect(self::cases())->map(fn ($case) => [
|
||||
'value' => $case->value,
|
||||
'label' => $case->label(),
|
||||
])->toArray();
|
||||
}
|
||||
|
||||
public static function values(): array
|
||||
{
|
||||
return array_column(self::cases(), 'value');
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,36 @@
|
||||
<?php
|
||||
|
||||
namespace App\Enums\SosialEkonomi;
|
||||
|
||||
enum KeterlibatanProgramKeuanganFormal: int
|
||||
{
|
||||
case TIDAK_PERNAH_MENERIMA = 1;
|
||||
case PERNAH_SATU_TIDAK_BERMANFAAT = 2;
|
||||
case SEDANG_MENERIMA_SATU = 3;
|
||||
case SEDANG_MENERIMA_LEBIH_DARI_SATU = 4;
|
||||
case AKTIF_BEBERAPA_PROGRAM_BERMANFAAT = 5;
|
||||
|
||||
public function label(): string
|
||||
{
|
||||
return match ($this) {
|
||||
self::TIDAK_PERNAH_MENERIMA => 'Tidak pernah menerima',
|
||||
self::PERNAH_SATU_TIDAK_BERMANFAAT => 'Pernah 1 program, tidak lagi & tidak bermanfaat',
|
||||
self::SEDANG_MENERIMA_SATU => 'Sedang menerima 1 program',
|
||||
self::SEDANG_MENERIMA_LEBIH_DARI_SATU => 'Sedang menerima >1 program',
|
||||
self::AKTIF_BEBERAPA_PROGRAM_BERMANFAAT => 'Aktif beberapa program & merasakan manfaat nyata',
|
||||
};
|
||||
}
|
||||
|
||||
public static function options(): array
|
||||
{
|
||||
return collect(self::cases())->map(fn ($case) => [
|
||||
'value' => $case->value,
|
||||
'label' => $case->label(),
|
||||
])->toArray();
|
||||
}
|
||||
|
||||
public static function values(): array
|
||||
{
|
||||
return array_column(self::cases(), 'value');
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,36 @@
|
||||
<?php
|
||||
|
||||
namespace App\Enums\SosialEkonomi;
|
||||
|
||||
enum KondisiAsetProduktif: int
|
||||
{
|
||||
case TIDAK_ADA = 1;
|
||||
case ADA_SATU_KURANG_BAIK = 2;
|
||||
case ADA_SATU_BAIK = 3;
|
||||
case ADA_DUA_LEBIH_SEBAGIAN_KURANG_BAIK = 4;
|
||||
case ADA_DUA_LEBIH_SEMUA_BAIK = 5;
|
||||
|
||||
public function label(): string
|
||||
{
|
||||
return match ($this) {
|
||||
self::TIDAK_ADA => 'Tidak ada',
|
||||
self::ADA_SATU_KURANG_BAIK => 'Ada 1 jenis, kondisi kurang baik',
|
||||
self::ADA_SATU_BAIK => 'Ada 1 jenis, kondisi baik',
|
||||
self::ADA_DUA_LEBIH_SEBAGIAN_KURANG_BAIK => 'Ada 2+ jenis, sebagian kurang baik',
|
||||
self::ADA_DUA_LEBIH_SEMUA_BAIK => 'Ada 2+ jenis, semua kondisi baik',
|
||||
};
|
||||
}
|
||||
|
||||
public static function options(): array
|
||||
{
|
||||
return collect(self::cases())->map(fn ($case) => [
|
||||
'value' => $case->value,
|
||||
'label' => $case->label(),
|
||||
])->toArray();
|
||||
}
|
||||
|
||||
public static function values(): array
|
||||
{
|
||||
return array_column(self::cases(), 'value');
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,36 @@
|
||||
<?php
|
||||
|
||||
namespace App\Enums\SosialEkonomi;
|
||||
|
||||
enum ManfaatKelompokTani: int
|
||||
{
|
||||
case TIDAK_ADA_MANFAAT = 1;
|
||||
case MANFAAT_SOSIAL_SAJA = 2;
|
||||
case SEDIKIT_MANFAAT_PRODUKSI_PEMASARAN = 3;
|
||||
case MANFAAT_CUKUP_TERASA = 4;
|
||||
case MANFAAT_NYATA_SIGNIFIKAN = 5;
|
||||
|
||||
public function label(): string
|
||||
{
|
||||
return match ($this) {
|
||||
self::TIDAK_ADA_MANFAAT => 'Tidak ada manfaat',
|
||||
self::MANFAAT_SOSIAL_SAJA => 'Manfaat sosial saja',
|
||||
self::SEDIKIT_MANFAAT_PRODUKSI_PEMASARAN => 'Sedikit manfaat produksi-pemasaran',
|
||||
self::MANFAAT_CUKUP_TERASA => 'Manfaat cukup terasa',
|
||||
self::MANFAAT_NYATA_SIGNIFIKAN => 'Manfaat nyata & signifikan',
|
||||
};
|
||||
}
|
||||
|
||||
public static function options(): array
|
||||
{
|
||||
return collect(self::cases())->map(fn ($case) => [
|
||||
'value' => $case->value,
|
||||
'label' => $case->label(),
|
||||
])->toArray();
|
||||
}
|
||||
|
||||
public static function values(): array
|
||||
{
|
||||
return array_column(self::cases(), 'value');
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,34 @@
|
||||
<?php
|
||||
|
||||
namespace App\Enums\SosialEkonomi;
|
||||
|
||||
enum MinatPembeliHargaStabil: string
|
||||
{
|
||||
case MAU_HARGA_STABIL_LEBIH_PENTING = 'mau_harga_stabil_lebih_penting';
|
||||
case MAU_TAPI_INGIN_BANDINGKAN_DULU = 'mau_tapi_ingin_bandingkan_dulu';
|
||||
case RAGU_RAGU = 'ragu_ragu';
|
||||
case TIDAK_MAU_CARI_HARGA_TERBAIK = 'tidak_mau_cari_harga_terbaik';
|
||||
|
||||
public function label(): string
|
||||
{
|
||||
return match ($this) {
|
||||
self::MAU_HARGA_STABIL_LEBIH_PENTING => 'Mau-harga stabil lebih penting',
|
||||
self::MAU_TAPI_INGIN_BANDINGKAN_DULU => 'Mau tapi ingin bandingkan dulu',
|
||||
self::RAGU_RAGU => 'Ragu-ragu',
|
||||
self::TIDAK_MAU_CARI_HARGA_TERBAIK => 'Tidak mau-cari harga terbaik tiap jual',
|
||||
};
|
||||
}
|
||||
|
||||
public static function options(): array
|
||||
{
|
||||
return collect(self::cases())->map(fn ($case) => [
|
||||
'value' => $case->value,
|
||||
'label' => $case->label(),
|
||||
])->toArray();
|
||||
}
|
||||
|
||||
public static function values(): array
|
||||
{
|
||||
return array_column(self::cases(), 'value');
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,36 @@
|
||||
<?php
|
||||
|
||||
namespace App\Enums\SosialEkonomi;
|
||||
|
||||
enum OrientasiRencanaJangkaPanjang: int
|
||||
{
|
||||
case BELUM_KEPIKIRAN = 1;
|
||||
case INGIN_TETAP_SEPERTI_SEKARANG = 2;
|
||||
case INGIN_BERUBAH_BELUM_TAHU_CARANYA = 3;
|
||||
case INGIN_SUDAH_MULAI_DIPIKIRKAN = 4;
|
||||
case PUNYA_RENCANA_KONKRET = 5;
|
||||
|
||||
public function label(): string
|
||||
{
|
||||
return match ($this) {
|
||||
self::BELUM_KEPIKIRAN => 'Belum kepikiran',
|
||||
self::INGIN_TETAP_SEPERTI_SEKARANG => 'Ingin tetap seperti sekarang',
|
||||
self::INGIN_BERUBAH_BELUM_TAHU_CARANYA => 'Ada keinginan berubah tapi belum tahu caranya',
|
||||
self::INGIN_SUDAH_MULAI_DIPIKIRKAN => 'Ada keinginan & sudah mulai dipikirkan',
|
||||
self::PUNYA_RENCANA_KONKRET => 'Sudah punya rencana konkret',
|
||||
};
|
||||
}
|
||||
|
||||
public static function options(): array
|
||||
{
|
||||
return collect(self::cases())->map(fn ($case) => [
|
||||
'value' => $case->value,
|
||||
'label' => $case->label(),
|
||||
])->toArray();
|
||||
}
|
||||
|
||||
public static function values(): array
|
||||
{
|
||||
return array_column(self::cases(), 'value');
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,36 @@
|
||||
<?php
|
||||
|
||||
namespace App\Enums\SosialEkonomi;
|
||||
|
||||
enum PanutanPetaniSukses: int
|
||||
{
|
||||
case TIDAK_ADA = 1;
|
||||
case ADA_DENGAR_DARI_ORANG_LAIN = 2;
|
||||
case TAHU_SIAPA_TIDAK_KENAL = 3;
|
||||
case KENAL_BELUM_DISKUSI = 4;
|
||||
case KENAL_PERNAH_DISKUSI_LANGSUNG = 5;
|
||||
|
||||
public function label(): string
|
||||
{
|
||||
return match ($this) {
|
||||
self::TIDAK_ADA => 'Tidak ada',
|
||||
self::ADA_DENGAR_DARI_ORANG_LAIN => 'Ada, dengar dari orang lain saja',
|
||||
self::TAHU_SIAPA_TIDAK_KENAL => 'Tahu siapa, tapi tidak kenal',
|
||||
self::KENAL_BELUM_DISKUSI => 'Kenal, belum pernah diskusi',
|
||||
self::KENAL_PERNAH_DISKUSI_LANGSUNG => 'Kenal & pernah diskusi langsung',
|
||||
};
|
||||
}
|
||||
|
||||
public static function options(): array
|
||||
{
|
||||
return collect(self::cases())->map(fn ($case) => [
|
||||
'value' => $case->value,
|
||||
'label' => $case->label(),
|
||||
])->toArray();
|
||||
}
|
||||
|
||||
public static function values(): array
|
||||
{
|
||||
return array_column(self::cases(), 'value');
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,36 @@
|
||||
<?php
|
||||
|
||||
namespace App\Enums\SosialEkonomi;
|
||||
|
||||
enum PemahamanMutuHarga: int
|
||||
{
|
||||
case TIDAK_TAHU = 1;
|
||||
case PERNAH_DENGAR_TIDAK_YAKIN = 2;
|
||||
case TAHU_BEDA_BELUM_BUKTIKAN = 3;
|
||||
case TAHU_PERNAH_HARGA_LEBIH_TINGGI = 4;
|
||||
case TAHU_BETUL_BISA_JELASKAN_RINCI = 5;
|
||||
|
||||
public function label(): string
|
||||
{
|
||||
return match ($this) {
|
||||
self::TIDAK_TAHU => 'Tidak tahu',
|
||||
self::PERNAH_DENGAR_TIDAK_YAKIN => 'Pernah dengar, tidak yakin',
|
||||
self::TAHU_BEDA_BELUM_BUKTIKAN => 'Tahu ada beda, belum buktikan',
|
||||
self::TAHU_PERNAH_HARGA_LEBIH_TINGGI => 'Tahu & pernah dapat harga lebih tinggi',
|
||||
self::TAHU_BETUL_BISA_JELASKAN_RINCI => 'Tahu betul & bisa jelaskan rinci',
|
||||
};
|
||||
}
|
||||
|
||||
public static function options(): array
|
||||
{
|
||||
return collect(self::cases())->map(fn ($case) => [
|
||||
'value' => $case->value,
|
||||
'label' => $case->label(),
|
||||
])->toArray();
|
||||
}
|
||||
|
||||
public static function values(): array
|
||||
{
|
||||
return array_column(self::cases(), 'value');
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,36 @@
|
||||
<?php
|
||||
|
||||
namespace App\Enums\SosialEkonomi;
|
||||
|
||||
enum PengalamanKreditKebun: int
|
||||
{
|
||||
case TIDAK_PERNAH_MENCOBA = 1;
|
||||
case PERNAH_COBA_DITOLAK = 2;
|
||||
case SEDANG_PROSES = 3;
|
||||
case BERHASIL_MASIH_PELUNASAN = 4;
|
||||
case BERHASIL_SUDAH_LUNAS = 5;
|
||||
|
||||
public function label(): string
|
||||
{
|
||||
return match ($this) {
|
||||
self::TIDAK_PERNAH_MENCOBA => 'Tidak pernah mencoba',
|
||||
self::PERNAH_COBA_DITOLAK => 'Pernah coba tapi ditolak',
|
||||
self::SEDANG_PROSES => 'Sedang dalam proses',
|
||||
self::BERHASIL_MASIH_PELUNASAN => 'Berhasil, masih proses pelunasan',
|
||||
self::BERHASIL_SUDAH_LUNAS => 'Berhasil & sudah lunas',
|
||||
};
|
||||
}
|
||||
|
||||
public static function options(): array
|
||||
{
|
||||
return collect(self::cases())->map(fn ($case) => [
|
||||
'value' => $case->value,
|
||||
'label' => $case->label(),
|
||||
])->toArray();
|
||||
}
|
||||
|
||||
public static function values(): array
|
||||
{
|
||||
return array_column(self::cases(), 'value');
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,34 @@
|
||||
<?php
|
||||
|
||||
namespace App\Enums\SosialEkonomi;
|
||||
|
||||
enum PengetahuanHargaHasilOlah: string
|
||||
{
|
||||
case TIDAK_TAHU = 'tidak_tahu';
|
||||
case PERNAH_DENGAR_TIDAK_TAHU_PENGARUH = 'pernah_dengar_tidak_tahu_pengaruh';
|
||||
case TAHU_BEDA_HARGA_BELUM_COBA = 'tahu_beda_harga_belum_coba';
|
||||
case PERNAH_JUAL_HASIL_OLAH_HARGA_LEBIH_TINGGI = 'pernah_jual_hasil_olah_harga_lebih_tinggi';
|
||||
|
||||
public function label(): string
|
||||
{
|
||||
return match ($this) {
|
||||
self::TIDAK_TAHU => 'Tidak tahu',
|
||||
self::PERNAH_DENGAR_TIDAK_TAHU_PENGARUH => 'Pernah dengar tapi tidak tahu pengaruh ke harga',
|
||||
self::TAHU_BEDA_HARGA_BELUM_COBA => 'Tahu ada beda harga tapi belum coba',
|
||||
self::PERNAH_JUAL_HASIL_OLAH_HARGA_LEBIH_TINGGI => 'Sudah pernah jual hasil olah dengan harga lebih tinggi',
|
||||
};
|
||||
}
|
||||
|
||||
public static function options(): array
|
||||
{
|
||||
return collect(self::cases())->map(fn ($case) => [
|
||||
'value' => $case->value,
|
||||
'label' => $case->label(),
|
||||
])->toArray();
|
||||
}
|
||||
|
||||
public static function values(): array
|
||||
{
|
||||
return array_column(self::cases(), 'value');
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,36 @@
|
||||
<?php
|
||||
|
||||
namespace App\Enums\SosialEkonomi;
|
||||
|
||||
enum PeranDalamKelompok: int
|
||||
{
|
||||
case ANGGOTA_PASIF = 1;
|
||||
case ANGGOTA_BIASA_KADANG_DILIBATKAN = 2;
|
||||
case ANGGOTA_BIASA_CUKUP_AKTIF = 3;
|
||||
case PENGURUS_BELUM_BANYAK_TANGGUNG_JAWAB = 4;
|
||||
case KETUA_PENGURUS_AKTIF = 5;
|
||||
|
||||
public function label(): string
|
||||
{
|
||||
return match ($this) {
|
||||
self::ANGGOTA_PASIF => 'Anggota pasif',
|
||||
self::ANGGOTA_BIASA_KADANG_DILIBATKAN => 'Anggota biasa, kadang dilibatkan',
|
||||
self::ANGGOTA_BIASA_CUKUP_AKTIF => 'Anggota biasa, cukup aktif',
|
||||
self::PENGURUS_BELUM_BANYAK_TANGGUNG_JAWAB => 'Pengurus, belum banyak menjalankan tanggung jawab',
|
||||
self::KETUA_PENGURUS_AKTIF => 'Ketua-pengurus aktif & menjalankan tanggung jawab nyata',
|
||||
};
|
||||
}
|
||||
|
||||
public static function options(): array
|
||||
{
|
||||
return collect(self::cases())->map(fn ($case) => [
|
||||
'value' => $case->value,
|
||||
'label' => $case->label(),
|
||||
])->toArray();
|
||||
}
|
||||
|
||||
public static function values(): array
|
||||
{
|
||||
return array_column(self::cases(), 'value');
|
||||
}
|
||||
}
|
||||
@@ -1,6 +1,6 @@
|
||||
<?php
|
||||
|
||||
namespace App\Enums;
|
||||
namespace App\Enums\SosialEkonomi;
|
||||
|
||||
enum PeriodePendapatan: string
|
||||
{
|
||||
@@ -0,0 +1,30 @@
|
||||
<?php
|
||||
|
||||
namespace App\Enums\SosialEkonomi;
|
||||
|
||||
enum PernahBantuanNgoPerusahaan: string
|
||||
{
|
||||
case PERNAH = 'pernah';
|
||||
case TIDAK_PERNAH = 'tidak_pernah';
|
||||
|
||||
public function label(): string
|
||||
{
|
||||
return match ($this) {
|
||||
self::PERNAH => 'Pernah',
|
||||
self::TIDAK_PERNAH => 'Tidak pernah',
|
||||
};
|
||||
}
|
||||
|
||||
public static function options(): array
|
||||
{
|
||||
return collect(self::cases())->map(fn ($case) => [
|
||||
'value' => $case->value,
|
||||
'label' => $case->label(),
|
||||
])->toArray();
|
||||
}
|
||||
|
||||
public static function values(): array
|
||||
{
|
||||
return array_column(self::cases(), 'value');
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,30 @@
|
||||
<?php
|
||||
|
||||
namespace App\Enums\SosialEkonomi;
|
||||
|
||||
enum PernahJualHargaLebihTinggi: string
|
||||
{
|
||||
case BELUM_PERNAH = 'belum_pernah';
|
||||
case PERNAH = 'pernah';
|
||||
|
||||
public function label(): string
|
||||
{
|
||||
return match ($this) {
|
||||
self::BELUM_PERNAH => 'Belum pernah',
|
||||
self::PERNAH => 'Pernah',
|
||||
};
|
||||
}
|
||||
|
||||
public static function options(): array
|
||||
{
|
||||
return collect(self::cases())->map(fn ($case) => [
|
||||
'value' => $case->value,
|
||||
'label' => $case->label(),
|
||||
])->toArray();
|
||||
}
|
||||
|
||||
public static function values(): array
|
||||
{
|
||||
return array_column(self::cases(), 'value');
|
||||
}
|
||||
}
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
<?php
|
||||
|
||||
namespace App\Enums;
|
||||
namespace App\Enums\SosialEkonomi;
|
||||
|
||||
enum PihakMembantuKonflik: string
|
||||
{
|
||||
@@ -0,0 +1,32 @@
|
||||
<?php
|
||||
|
||||
namespace App\Enums\SosialEkonomi;
|
||||
|
||||
enum PinjamanTokohAdatPanen: string
|
||||
{
|
||||
case TIDAK_ADA = 'tidak_ada';
|
||||
case ADA = 'ada';
|
||||
case TIDAK_BERSEDIA_MENJAWAB = 'tidak_bersedia_menjawab';
|
||||
|
||||
public function label(): string
|
||||
{
|
||||
return match ($this) {
|
||||
self::TIDAK_ADA => 'Tidak ada',
|
||||
self::ADA => 'Ada',
|
||||
self::TIDAK_BERSEDIA_MENJAWAB => 'Tidak bersedia menjawab',
|
||||
};
|
||||
}
|
||||
|
||||
public static function options(): array
|
||||
{
|
||||
return collect(self::cases())->map(fn ($case) => [
|
||||
'value' => $case->value,
|
||||
'label' => $case->label(),
|
||||
])->toArray();
|
||||
}
|
||||
|
||||
public static function values(): array
|
||||
{
|
||||
return array_column(self::cases(), 'value');
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,38 @@
|
||||
<?php
|
||||
|
||||
namespace App\Enums\SosialEkonomi;
|
||||
|
||||
enum PraktikIjon: int
|
||||
{
|
||||
case TIDAK_BERSEDIA_MENJAWAB = 0;
|
||||
case HAMPIR_SELURUH_PANEN_TERIKAT = 1;
|
||||
case SEBAGIAN_BESAR_TERIKAT = 2;
|
||||
case SESEKALI_SEBAGIAN_KECIL = 3;
|
||||
case PERNAH_SUDAH_LAMA_TIDAK_LAGI = 4;
|
||||
case TIDAK_PERNAH = 5;
|
||||
|
||||
public function label(): string
|
||||
{
|
||||
return match ($this) {
|
||||
self::TIDAK_BERSEDIA_MENJAWAB => 'Tidak bersedia menjawab',
|
||||
self::HAMPIR_SELURUH_PANEN_TERIKAT => 'Hampir seluruh panen terikat ijon',
|
||||
self::SEBAGIAN_BESAR_TERIKAT => 'Sebagian besar terikat',
|
||||
self::SESEKALI_SEBAGIAN_KECIL => 'Sesekali-sebagian kecil',
|
||||
self::PERNAH_SUDAH_LAMA_TIDAK_LAGI => 'Pernah, sudah lama tidak lagi',
|
||||
self::TIDAK_PERNAH => 'Tidak pernah',
|
||||
};
|
||||
}
|
||||
|
||||
public static function options(): array
|
||||
{
|
||||
return collect(self::cases())->map(fn ($case) => [
|
||||
'value' => $case->value,
|
||||
'label' => $case->label(),
|
||||
])->toArray();
|
||||
}
|
||||
|
||||
public static function values(): array
|
||||
{
|
||||
return array_column(self::cases(), 'value');
|
||||
}
|
||||
}
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
<?php
|
||||
|
||||
namespace App\Enums;
|
||||
namespace App\Enums\SosialEkonomi;
|
||||
|
||||
enum SkorKecukupanPenghasilan: int
|
||||
{
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
<?php
|
||||
|
||||
namespace App\Enums;
|
||||
namespace App\Enums\SosialEkonomi;
|
||||
|
||||
enum SkorKejelasanStatusLahan: int
|
||||
{
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
<?php
|
||||
|
||||
namespace App\Enums;
|
||||
namespace App\Enums\SosialEkonomi;
|
||||
|
||||
enum SkorKemampuanMenabung: int
|
||||
{
|
||||
@@ -1,6 +1,6 @@
|
||||
<?php
|
||||
|
||||
namespace App\Enums;
|
||||
namespace App\Enums\SosialEkonomi;
|
||||
|
||||
enum SkorPeriodePaceklik: int
|
||||
{
|
||||
@@ -0,0 +1,32 @@
|
||||
<?php
|
||||
|
||||
namespace App\Enums\SosialEkonomi;
|
||||
|
||||
enum StatusKartuTani: string
|
||||
{
|
||||
case BELUM_PUNYA = 'belum_punya';
|
||||
case SUDAH_PUNYA_BELUM_AKTIF = 'sudah_punya_belum_aktif';
|
||||
case SUDAH_PUNYA_AKTIF_DIGUNAKAN = 'sudah_punya_aktif_digunakan';
|
||||
|
||||
public function label(): string
|
||||
{
|
||||
return match ($this) {
|
||||
self::BELUM_PUNYA => 'Belum punya',
|
||||
self::SUDAH_PUNYA_BELUM_AKTIF => 'Sudah punya tapi belum aktif',
|
||||
self::SUDAH_PUNYA_AKTIF_DIGUNAKAN => 'Sudah punya & aktif digunakan',
|
||||
};
|
||||
}
|
||||
|
||||
public static function options(): array
|
||||
{
|
||||
return collect(self::cases())->map(fn ($case) => [
|
||||
'value' => $case->value,
|
||||
'label' => $case->label(),
|
||||
])->toArray();
|
||||
}
|
||||
|
||||
public static function values(): array
|
||||
{
|
||||
return array_column(self::cases(), 'value');
|
||||
}
|
||||
}
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
<?php
|
||||
|
||||
namespace App\Enums;
|
||||
namespace App\Enums\SosialEkonomi;
|
||||
|
||||
enum StatusKepemilikanLahanSosialEkonomi: string
|
||||
{
|
||||
@@ -1,6 +1,6 @@
|
||||
<?php
|
||||
|
||||
namespace App\Enums;
|
||||
namespace App\Enums\SosialEkonomi;
|
||||
|
||||
enum StatusKonflik: string
|
||||
{
|
||||
@@ -0,0 +1,32 @@
|
||||
<?php
|
||||
|
||||
namespace App\Enums\SosialEkonomi;
|
||||
|
||||
enum StatusProgramKeuanganFormal: string
|
||||
{
|
||||
case SEDANG_MENERIMA = 'sedang_menerima';
|
||||
case PERNAH_TAPI_TIDAK_LAGI = 'pernah_tapi_tidak_lagi';
|
||||
case BELUM_PERNAH = 'belum_pernah';
|
||||
|
||||
public function label(): string
|
||||
{
|
||||
return match ($this) {
|
||||
self::SEDANG_MENERIMA => 'Sedang Menerima',
|
||||
self::PERNAH_TAPI_TIDAK_LAGI => 'Pernah tapi Tidak Lagi',
|
||||
self::BELUM_PERNAH => 'Belum Pernah',
|
||||
};
|
||||
}
|
||||
|
||||
public static function options(): array
|
||||
{
|
||||
return collect(self::cases())->map(fn ($case) => [
|
||||
'value' => $case->value,
|
||||
'label' => $case->label(),
|
||||
])->toArray();
|
||||
}
|
||||
|
||||
public static function values(): array
|
||||
{
|
||||
return array_column(self::cases(), 'value');
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,36 @@
|
||||
<?php
|
||||
|
||||
namespace App\Enums\SosialEkonomi;
|
||||
|
||||
enum StatusRekeningTabungan: int
|
||||
{
|
||||
case TIDAK_PUNYA_REKENING = 1;
|
||||
case PUNYA_TIDAK_AKTIF = 2;
|
||||
case PUNYA_KADANG_DIGUNAKAN = 3;
|
||||
case PUNYA_CUKUP_RUTIN = 4;
|
||||
case AKTIF_RUTIN_DIGUNAKAN = 5;
|
||||
|
||||
public function label(): string
|
||||
{
|
||||
return match ($this) {
|
||||
self::TIDAK_PUNYA_REKENING => 'Tidak punya rekening',
|
||||
self::PUNYA_TIDAK_AKTIF => 'Punya tapi tidak aktif',
|
||||
self::PUNYA_KADANG_DIGUNAKAN => 'Punya, kadang digunakan',
|
||||
self::PUNYA_CUKUP_RUTIN => 'Punya, cukup rutin',
|
||||
self::AKTIF_RUTIN_DIGUNAKAN => 'Aktif & rutin digunakan',
|
||||
};
|
||||
}
|
||||
|
||||
public static function options(): array
|
||||
{
|
||||
return collect(self::cases())->map(fn ($case) => [
|
||||
'value' => $case->value,
|
||||
'label' => $case->label(),
|
||||
])->toArray();
|
||||
}
|
||||
|
||||
public static function values(): array
|
||||
{
|
||||
return array_column(self::cases(), 'value');
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,30 @@
|
||||
<?php
|
||||
|
||||
namespace App\Enums\SosialEkonomi;
|
||||
|
||||
enum TekananJualSegera: string
|
||||
{
|
||||
case TIDAK_ADA = 'tidak_ada';
|
||||
case ADA = 'ada';
|
||||
|
||||
public function label(): string
|
||||
{
|
||||
return match ($this) {
|
||||
self::TIDAK_ADA => 'Tidak ada',
|
||||
self::ADA => 'Ada',
|
||||
};
|
||||
}
|
||||
|
||||
public static function options(): array
|
||||
{
|
||||
return collect(self::cases())->map(fn ($case) => [
|
||||
'value' => $case->value,
|
||||
'label' => $case->label(),
|
||||
])->toArray();
|
||||
}
|
||||
|
||||
public static function values(): array
|
||||
{
|
||||
return array_column(self::cases(), 'value');
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,30 @@
|
||||
<?php
|
||||
|
||||
namespace App\Enums\SosialEkonomi;
|
||||
|
||||
enum TerdaftarKelompokTani: string
|
||||
{
|
||||
case YA = 'ya';
|
||||
case TIDAK = 'tidak';
|
||||
|
||||
public function label(): string
|
||||
{
|
||||
return match ($this) {
|
||||
self::YA => 'Ya',
|
||||
self::TIDAK => 'Tidak',
|
||||
};
|
||||
}
|
||||
|
||||
public static function options(): array
|
||||
{
|
||||
return collect(self::cases())->map(fn ($case) => [
|
||||
'value' => $case->value,
|
||||
'label' => $case->label(),
|
||||
])->toArray();
|
||||
}
|
||||
|
||||
public static function values(): array
|
||||
{
|
||||
return array_column(self::cases(), 'value');
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,32 @@
|
||||
<?php
|
||||
|
||||
namespace App\Enums\SosialEkonomi;
|
||||
|
||||
enum UsahaMutuTambahanHarga: string
|
||||
{
|
||||
case SEBANDING_COCOK_DICOBA = 'sebanding_cocok_dicoba';
|
||||
case TIDAK_YAKIN = 'tidak_yakin';
|
||||
case TIDAK_SEBANDING_TERLALU_BANYAK_USAHA = 'tidak_sebanding_terlalu_banyak_usaha';
|
||||
|
||||
public function label(): string
|
||||
{
|
||||
return match ($this) {
|
||||
self::SEBANDING_COCOK_DICOBA => 'Sebanding-cocok dicoba',
|
||||
self::TIDAK_YAKIN => 'Tidak yakin',
|
||||
self::TIDAK_SEBANDING_TERLALU_BANYAK_USAHA => 'Tidak sebanding-terlalu banyak usaha',
|
||||
};
|
||||
}
|
||||
|
||||
public static function options(): array
|
||||
{
|
||||
return collect(self::cases())->map(fn ($case) => [
|
||||
'value' => $case->value,
|
||||
'label' => $case->label(),
|
||||
])->toArray();
|
||||
}
|
||||
|
||||
public static function values(): array
|
||||
{
|
||||
return array_column(self::cases(), 'value');
|
||||
}
|
||||
}
|
||||
@@ -13,7 +13,7 @@ use App\Http\Resources\UserResource;
|
||||
|
||||
class AuthController extends Controller
|
||||
{
|
||||
public function login(Request $request): JSONResponse
|
||||
public function login(Request $request): JsonResponse
|
||||
{
|
||||
$credentials = $request->validate([
|
||||
'email' => ['required', 'email'],
|
||||
@@ -27,6 +27,13 @@ class AuthController extends Controller
|
||||
}
|
||||
|
||||
$user = Auth::user();
|
||||
|
||||
if ($user->status === 'pending') {
|
||||
return response()->json([
|
||||
'message' => 'Akun Anda masih berstatus pending. Silakan tunggu verifikasi dari Super Admin.'
|
||||
], 403);
|
||||
}
|
||||
|
||||
$user->tokens()->delete();
|
||||
|
||||
$token = $user->createToken('mobile-token')->plainTextToken;
|
||||
@@ -37,14 +44,13 @@ class AuthController extends Controller
|
||||
]);
|
||||
}
|
||||
|
||||
public function signup(Request $request): JSONResponse
|
||||
public function signup(Request $request): JsonResponse
|
||||
{
|
||||
$credentials = $request->validate([
|
||||
'name' => ['required', 'string', 'max:255'],
|
||||
'email' => ['required', 'email', 'max:255', 'unique:users'],
|
||||
'password' => ['required', 'string', 'min:8', 'confirmed'],
|
||||
'username' => ['required', 'string', 'max:255'],
|
||||
'role' => ['string'],
|
||||
'uid' => ['required','string', 'unique:users'],
|
||||
]);
|
||||
|
||||
@@ -53,35 +59,27 @@ class AuthController extends Controller
|
||||
'email' => $credentials['email'],
|
||||
'password' => Hash::make($credentials['password']),
|
||||
'username' => $credentials['username'],
|
||||
'role' => $credentials['role'],
|
||||
'uid' => $credentials['uid'],
|
||||
'role' => null,
|
||||
'status' => 'pending',
|
||||
]);
|
||||
|
||||
$profile = Profile::create([
|
||||
'nama' => $credentials['name'],
|
||||
'email' => $credentials['email'],
|
||||
'role' => $credentials['role'],
|
||||
'user_uid' => $credentials['uid'],
|
||||
'user_id' => $user->id,
|
||||
'created_by' => $user->id,
|
||||
'updated_by' => $user->id,
|
||||
|
||||
|
||||
'role' => null,
|
||||
]);
|
||||
|
||||
if (!Auth::attempt($credentials)) {
|
||||
return response()->json([
|
||||
'message' => 'Email dan/atau password tidak sesuai'
|
||||
], 401);
|
||||
}
|
||||
|
||||
$user = Auth::user();
|
||||
$user->tokens()->delete();
|
||||
|
||||
$token = $user->createToken('mobile-token')->plainTextToken;
|
||||
|
||||
|
||||
return response()->json([
|
||||
'access_token' => $token,
|
||||
'token_type' => 'Bearer',
|
||||
]);
|
||||
'message' => 'Registrasi berhasil. Akun Anda berstatus pending dan sedang menunggu verifikasi Super Admin.'
|
||||
], 201);
|
||||
}
|
||||
|
||||
public function me(Request $request): JSONResponse
|
||||
|
||||
@@ -16,7 +16,7 @@ use App\Enums\StatusLahan;
|
||||
|
||||
class LahanController extends Controller
|
||||
{
|
||||
/**
|
||||
/**
|
||||
* Display a listing of the resource.
|
||||
*/
|
||||
public function index(Request $request): AnonymousResourceCollection
|
||||
@@ -97,11 +97,12 @@ class LahanController extends Controller
|
||||
'nama' => ['required', 'string', 'max:255'],
|
||||
'status_kepemilikan' => ['required', new Enum(StatusLahan::class)],
|
||||
'desa_kelurahan_id' => ['nullable', 'numeric', 'exists:master_desa_kelurahan,id'],
|
||||
'path' => ['nullable', 'array'],
|
||||
'path.*' => ['array'],
|
||||
'path' => ['nullable', 'string'],
|
||||
'luas_lahan' => ['nullable', 'numeric'],
|
||||
'uid' => ['required', 'string'],
|
||||
'profile_id' => $profileRule,
|
||||
'foto' => ['nullable', 'array'],
|
||||
'foto.*' => ['image', 'mimes:jpeg,png,jpg', 'max:5120'], // Max 5MB
|
||||
]);
|
||||
|
||||
$targetProfileId = $user->role === 'fasilitator'
|
||||
@@ -120,10 +121,22 @@ class LahanController extends Controller
|
||||
? $profile->desa_kelurahan_id
|
||||
: ($validated['desa_kelurahan_id'] ?? $profile->desa_kelurahan_id);
|
||||
|
||||
$fotoPaths = [];
|
||||
if ($request->hasFile('foto')) {
|
||||
foreach ($request->file('foto') as $file) {
|
||||
$fotoPaths[] = $file->store('foto_lahan', 'public');
|
||||
}
|
||||
}
|
||||
|
||||
$lahan = Lahan::create([
|
||||
...$validated,
|
||||
'profile_id' => $profile->id,
|
||||
'nama' => $validated['nama'],
|
||||
'status_kepemilikan' => $validated['status_kepemilikan'],
|
||||
'desa_kelurahan_id' => $desaKelurahanId,
|
||||
'path' => $validated['path'] ?? null,
|
||||
'luas_lahan' => $validated['luas_lahan'] ?? null,
|
||||
'uid' => $validated['uid'],
|
||||
'profile_id' => $profile->id,
|
||||
'foto' => $fotoPaths,
|
||||
]);
|
||||
|
||||
return (new LahanResource($lahan))
|
||||
@@ -153,7 +166,7 @@ class LahanController extends Controller
|
||||
/**
|
||||
* Update the specified resource in storage.
|
||||
*/
|
||||
public function update(Request $request, string $id): JsonResponse
|
||||
public function update(Request $request, string $id): JsonResponse
|
||||
{
|
||||
if (!Gate::any(['petani', 'fasilitator','super_admin'])) {
|
||||
abort(403);
|
||||
@@ -173,9 +186,26 @@ class LahanController extends Controller
|
||||
'path' => ['nullable', 'array'],
|
||||
'path.*' => ['array'],
|
||||
'luas_lahan' => ['nullable', 'numeric'],
|
||||
'foto' => ['nullable', 'array'],
|
||||
'foto.*' => ['image', 'mimes:jpeg,png,jpg', 'max:5120'],
|
||||
]);
|
||||
|
||||
$lahan->update($validated);
|
||||
$fotoPaths = $lahan->foto ?? [];
|
||||
|
||||
if ($request->hasFile('foto')) {
|
||||
foreach ($request->file('foto') as $file) {
|
||||
$fotoPaths[] = $file->store('foto_lahan', 'public');
|
||||
}
|
||||
}
|
||||
|
||||
$lahan->update([
|
||||
'nama' => $validated['nama'],
|
||||
'status_kepemilikan' => $validated['status_kepemilikan'],
|
||||
'desa_kelurahan_id' => $validated['desa_kelurahan_id'] ?? $lahan->desa_kelurahan_id,
|
||||
'path' => $validated['path'] ?? null,
|
||||
'luas_lahan' => $validated['luas_lahan'] ?? null,
|
||||
'foto' => $fotoPaths,
|
||||
]);
|
||||
|
||||
return (new LahanResource($lahan))->response();
|
||||
}
|
||||
|
||||
@@ -0,0 +1,150 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers\Web\Dashboard;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\Gate;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
|
||||
use App\Models\Pertanian\Petani;
|
||||
use App\Models\Pertanian\Komoditas;
|
||||
use App\Models\Pertanian\Lahan;
|
||||
use App\Models\Pertanian\Tanaman;
|
||||
use App\Models\Pertanian\SkorPetani;
|
||||
|
||||
class ProfilPetaniController extends Controller
|
||||
{
|
||||
public function index()
|
||||
{
|
||||
if (!Gate::any(['super_admin', 'admin', 'fasilitator'])) {
|
||||
abort(403);
|
||||
}
|
||||
$title = 'Dashboard Profil Petani';
|
||||
|
||||
$komoditas = Komoditas::where('is_utama', true)->get();
|
||||
|
||||
$petani = Petani::pluck('id');
|
||||
$lahan = Lahan::whereIn('petani_id', $petani)->get();
|
||||
|
||||
$petaniSummary = Petani::select(
|
||||
'komoditas_id',
|
||||
DB::raw('COUNT(*) as total')
|
||||
)
|
||||
->groupBy('komoditas_id')
|
||||
->get();
|
||||
$lahanSummary = Lahan::select(
|
||||
'komoditas_id',
|
||||
DB::raw('COUNT(*) as total'),
|
||||
DB::raw('SUM(luas_lahan) as luas_lahan')
|
||||
)
|
||||
->whereIn('petani_id', $petani)
|
||||
->groupBy('komoditas_id')
|
||||
->get();
|
||||
$tanamanSummary = Tanaman::select(
|
||||
'komoditas_id',
|
||||
DB::raw('COUNT(*) as total')
|
||||
)
|
||||
->whereIn('lahan_id', $lahan->pluck('id'))
|
||||
->groupBy('komoditas_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
|
||||
";
|
||||
$skorSummary = SkorPetani::selectRaw("$case AS segmen, COUNT(*) AS total")
|
||||
->whereIn('petani_id', $petani)
|
||||
->groupByRaw($case)
|
||||
->get();
|
||||
|
||||
$skorKomoditasSummary = SkorPetani::query()
|
||||
->join('petani', 'petani_skor.petani_id', '=', 'petani.id')
|
||||
->selectRaw("
|
||||
petani.komoditas_id,
|
||||
$case AS segmen,
|
||||
COUNT(petani.id) AS total
|
||||
")
|
||||
->whereIn('petani_skor.petani_id', $petani)
|
||||
->groupBy('petani.komoditas_id')
|
||||
->groupByRaw($case)
|
||||
->get();
|
||||
|
||||
|
||||
$skorAverage = SkorPetani::query()
|
||||
->join('petani', 'petani_skor.petani_id', '=', 'petani.id')
|
||||
->whereIn('petani_id', $petani)
|
||||
->whereIn('petani.komoditas_id', $komoditas->pluck('id'))
|
||||
->avg('skor_kesiapan_adopsi');
|
||||
if ($skorAverage >= 4.0) {
|
||||
$segmenAverage = 'Penggerak';
|
||||
} elseif ($skorAverage >= 3.0) {
|
||||
$segmenAverage = 'Perintis';
|
||||
} elseif ($skorAverage >= 2.0) {
|
||||
$segmenAverage = 'Pemerhati';
|
||||
} elseif ($skorAverage >= 1.0) {
|
||||
$segmenAverage = 'Pemula';
|
||||
} else {
|
||||
$segmenAverage = 'Belum Lengkap';
|
||||
}
|
||||
|
||||
$skorDimensi = SkorPetani::query()
|
||||
->join('petani', 'petani_skor.petani_id', '=', 'petani.id')
|
||||
->whereIn('petani_id', $petani)
|
||||
->whereIn('petani.komoditas_id', $komoditas->pluck('id'))
|
||||
->selectRaw("
|
||||
avg(skor_d2_sistem_praktik_budidaya) as skor_d2_sistem_praktik_budidaya,
|
||||
avg(skor_d4_sosial_ekonomi) as skor_d4_sosial_ekonomi,
|
||||
avg(skor_d6_rantai_nilai_akses_pasar) as skor_d6_rantai_nilai_akses_pasar")
|
||||
->first();
|
||||
|
||||
$skorKomponen = SkorPetani::query()
|
||||
->join('petani', 'petani_skor.petani_id', '=', 'petani.id')
|
||||
->whereIn('petani_id', $petani)
|
||||
->whereIn('petani.komoditas_id', $komoditas->pluck('id'))
|
||||
->selectRaw("avg(skor_komp_1_d4_k3_motivasi_kapasitas_adopsi) as skor_komp_1_d4_k3_motivasi_kapasitas_adopsi,
|
||||
avg(skor_komp_2_d4_k2_ekonomi_rumah_tangga) as skor_komp_2_d4_k2_ekonomi_rumah_tangga,
|
||||
avg(skor_komp_3_d2_praktik_budidaya_gap) as skor_komp_3_d2_praktik_budidaya_gap,
|
||||
avg(skor_komp_4_d4_k4_keterlibatan_kelembagaan) as skor_komp_4_d4_k4_keterlibatan_kelembagaan,
|
||||
avg(skor_komp_5_d4_k5_k6_akses_kebebasan_keuangan) as skor_komp_5_d4_k5_k6_akses_kebebasan_keuanga,
|
||||
avg(skor_komp_6_d6_k1_k4_k5_rantai_nilai_akses_pasar) as skor_komp_6_d6_k1_k4_k5_rantai_nilai_akses_pasar")
|
||||
->first();
|
||||
|
||||
$skorMultiDimensi = SkorPetani::query()
|
||||
->join('petani', 'petani_skor.petani_id', '=', 'petani.id')
|
||||
->whereIn('petani_id', $petani)
|
||||
->whereIn('petani.komoditas_id', $komoditas->pluck('id'))
|
||||
->selectRaw("$case AS segmen,
|
||||
avg(skor_kesiapan_adopsi) as skor_kesiapan_adopsi,
|
||||
avg(skor_d2_sistem_praktik_budidaya) as skor_d2_sistem_praktik_budidaya,
|
||||
avg(skor_d4_sosial_ekonomi) as skor_d4_sosial_ekonomi,
|
||||
avg(skor_d6_rantai_nilai_akses_pasar) as skor_d6_rantai_nilai_akses_pasar")
|
||||
->groupByRaw($case)
|
||||
->get();
|
||||
|
||||
$petani = Petani::with(['skor'])
|
||||
->whereIn('id', $petani)
|
||||
->whereIn('komoditas_id', $komoditas->pluck('id'))
|
||||
->get();
|
||||
|
||||
return view('dashboard.petani', compact('title',
|
||||
'komoditas',
|
||||
'petaniSummary',
|
||||
'lahanSummary',
|
||||
'tanamanSummary',
|
||||
'skorSummary',
|
||||
'skorKomoditasSummary',
|
||||
'segmenAverage',
|
||||
'skorAverage',
|
||||
'skorDimensi',
|
||||
'skorKomponen',
|
||||
'skorMultiDimensi',
|
||||
'petani',
|
||||
));
|
||||
}
|
||||
}
|
||||
@@ -25,8 +25,8 @@ class SummaryController extends Controller
|
||||
|
||||
public function produktivitas(Request $request)
|
||||
{
|
||||
if (!Gate::allows('super_admin') && !Gate::allows('admin')) {
|
||||
abort(403);
|
||||
if (!Gate::allows('super_admin') && !Gate::allows('admin') && !Gate::allows('fasilitator')) {
|
||||
abort(403);
|
||||
}
|
||||
|
||||
$title = 'Produktivitas Dashboard';
|
||||
@@ -34,12 +34,42 @@ class SummaryController extends Controller
|
||||
$totalpetani = Profile::where('role', 'petani')->count();
|
||||
$totallahan = Lahan::whereNotNull('path')->count();
|
||||
|
||||
$petaniList = Profile::where('role', 'petani')
|
||||
->with(['lahan.tanaman.komoditas', 'desaKelurahan'])
|
||||
$petaniList = Profile::select('id', 'nama', 'role', 'desa_kelurahan_id')
|
||||
->where('role', 'petani')
|
||||
->with([
|
||||
'lahan:id,profile_id,luas_lahan',
|
||||
'desaKelurahan:id,nama,kecamatan_id',
|
||||
])
|
||||
->paginate(20);
|
||||
|
||||
$allLahan = Lahan::whereNotNull('path')
|
||||
->with(['profile', 'tanaman.komoditas', 'desaKelurahan.kecamatan.kabupatenKota.provinsi'])
|
||||
$lahanSummaryByDesa = Lahan::whereNotNull('path')
|
||||
->whereNotNull('desa_kelurahan_id')
|
||||
->select('desa_kelurahan_id')
|
||||
->selectRaw('COUNT(*) as total_lahan')
|
||||
->selectRaw('COALESCE(SUM(luas_lahan), 0) as total_luas')
|
||||
->groupBy('desa_kelurahan_id')
|
||||
->get();
|
||||
|
||||
$desaList = DesaKelurahan::select('id', 'nama', 'path', 'kecamatan_id')
|
||||
->whereIn('id', $lahanSummaryByDesa->pluck('desa_kelurahan_id')->filter()->unique()->values())
|
||||
->with([
|
||||
'kecamatan:id,nama,path,kabupaten_kota_id',
|
||||
'kecamatan.kabupatenKota:id,nama,path,provinsi_id',
|
||||
'kecamatan.kabupatenKota.provinsi:id,nama,path',
|
||||
])
|
||||
->get()
|
||||
->keyBy('id');
|
||||
|
||||
$mapLahanLimit = min(max((int) $request->integer('map_lahan_limit', 500), 0), 2000);
|
||||
$mapLahan = Lahan::whereNotNull('path')
|
||||
->select('id', 'profile_id', 'desa_kelurahan_id', 'path', 'luas_lahan')
|
||||
->with([
|
||||
'profile:id,nama',
|
||||
'tanaman:id,lahan_id,komoditas_id',
|
||||
'tanaman.komoditas:id,nama',
|
||||
])
|
||||
->orderByDesc('updated_at')
|
||||
->limit($mapLahanLimit)
|
||||
->get();
|
||||
|
||||
$geoProvinsi = [];
|
||||
@@ -48,47 +78,51 @@ class SummaryController extends Controller
|
||||
$geoDesa = [];
|
||||
$geoLahan = [];
|
||||
|
||||
foreach ($allLahan as $lahan) {
|
||||
$desa = $lahan->desaKelurahan;
|
||||
foreach ($lahanSummaryByDesa as $summary) {
|
||||
$desa = $desaList->get($summary->desa_kelurahan_id);
|
||||
$kec = $desa ? $desa->kecamatan : null;
|
||||
$kab = $kec ? $kec->kabupatenKota : null;
|
||||
$prov = $kab ? $kab->provinsi : null;
|
||||
$totalLahan = (int) $summary->total_lahan;
|
||||
$totalLuas = (float) $summary->total_luas;
|
||||
|
||||
if ($prov && $prov->path) {
|
||||
if (!isset($geoProvinsi[$prov->id])) {
|
||||
$geoProvinsi[$prov->id] = ['id' => $prov->id, 'nama' => $prov->nama, 'polygon' => $prov->path, 'total_lahan' => 0, 'total_luas' => 0];
|
||||
}
|
||||
$geoProvinsi[$prov->id]['total_lahan']++;
|
||||
$geoProvinsi[$prov->id]['total_luas'] += $lahan->luas_lahan;
|
||||
$geoProvinsi[$prov->id]['total_lahan'] += $totalLahan;
|
||||
$geoProvinsi[$prov->id]['total_luas'] += $totalLuas;
|
||||
}
|
||||
|
||||
if ($kab && $kab->path) {
|
||||
if (!isset($geoKabupaten[$kab->id])) {
|
||||
$geoKabupaten[$kab->id] = ['id' => $kab->id, 'parent_id' => $prov->id ?? null, 'nama' => $kab->nama, 'polygon' => $kab->path, 'total_lahan' => 0, 'total_luas' => 0];
|
||||
}
|
||||
$geoKabupaten[$kab->id]['total_lahan']++;
|
||||
$geoKabupaten[$kab->id]['total_luas'] += $lahan->luas_lahan;
|
||||
$geoKabupaten[$kab->id]['total_lahan'] += $totalLahan;
|
||||
$geoKabupaten[$kab->id]['total_luas'] += $totalLuas;
|
||||
}
|
||||
|
||||
if ($kec && $kec->path) {
|
||||
if (!isset($geoKecamatan[$kec->id])) {
|
||||
$geoKecamatan[$kec->id] = ['id' => $kec->id, 'parent_id' => $kab->id ?? null, 'nama' => $kec->nama, 'polygon' => $kec->path, 'total_lahan' => 0, 'total_luas' => 0];
|
||||
}
|
||||
$geoKecamatan[$kec->id]['total_lahan']++;
|
||||
$geoKecamatan[$kec->id]['total_luas'] += $lahan->luas_lahan;
|
||||
$geoKecamatan[$kec->id]['total_lahan'] += $totalLahan;
|
||||
$geoKecamatan[$kec->id]['total_luas'] += $totalLuas;
|
||||
}
|
||||
|
||||
if ($desa && $desa->path) {
|
||||
if (!isset($geoDesa[$desa->id])) {
|
||||
$geoDesa[$desa->id] = ['id' => $desa->id, 'parent_id' => $kec->id ?? null, 'nama' => $desa->nama, 'polygon' => $desa->path, 'total_lahan' => 0, 'total_luas' => 0];
|
||||
}
|
||||
$geoDesa[$desa->id]['total_lahan']++;
|
||||
$geoDesa[$desa->id]['total_luas'] += $lahan->luas_lahan;
|
||||
$geoDesa[$desa->id]['total_lahan'] += $totalLahan;
|
||||
$geoDesa[$desa->id]['total_luas'] += $totalLuas;
|
||||
}
|
||||
}
|
||||
|
||||
foreach ($mapLahan as $lahan) {
|
||||
$geoLahan[] = [
|
||||
'id' => $lahan->id,
|
||||
'parent_id' => $desa->id ?? null,
|
||||
'parent_id' => $lahan->desa_kelurahan_id,
|
||||
'polygon' => $lahan->path,
|
||||
'nama_petani' => $lahan->profile->nama ?? 'N/A',
|
||||
'luas' => $lahan->luas_lahan,
|
||||
|
||||
@@ -0,0 +1,377 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers\Web\Dashboard;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use Illuminate\Support\Str;
|
||||
|
||||
use App\Models\User;
|
||||
use App\Models\Pertanian\Petani;
|
||||
use App\Models\Pertanian\Komoditas;
|
||||
use App\Models\Pertanian\Lahan;
|
||||
use App\Models\Pertanian\Tanaman;
|
||||
use App\Models\Pertanian\SurveyPelatihan;
|
||||
use App\Models\Pertanian\SurveySertifikasi;
|
||||
|
||||
use BackedEnum;
|
||||
|
||||
class SurveyPetaniController extends Controller
|
||||
{
|
||||
private const GAP_ENUM_CLASS = 'App\\Enums\\PendidikanPelatihan\\PelatihanGap';
|
||||
public function index()
|
||||
{
|
||||
$colors = $this->colors();
|
||||
|
||||
// Progres per enumerator
|
||||
|
||||
$enumerators = User::query()
|
||||
->where('role', 'fasilitator')
|
||||
->withCount([
|
||||
'petaniDibuat as done',
|
||||
])
|
||||
->orderByDesc('done')
|
||||
->get()
|
||||
->map(function ($enumerator) use ($colors) {
|
||||
$color = $colors[array_rand($colors)];
|
||||
|
||||
return [
|
||||
'name' => $enumerator->name,
|
||||
'done' => (int) $enumerator->done,
|
||||
'color' => $color['color'],
|
||||
'bg' => $color['bg'],
|
||||
'tx' => $color['tx'],
|
||||
];
|
||||
})
|
||||
->values();
|
||||
|
||||
// Tabel dan nama model
|
||||
|
||||
$petaniTable = (new Petani())->getTable();
|
||||
$komoditasTable = (new Komoditas())->getTable();
|
||||
$lahanTable = (new Lahan())->getTable();
|
||||
|
||||
// Distribusi petani berdasarkan komoditas
|
||||
|
||||
$komoditasCollection = DB::table("{$petaniTable} as p")
|
||||
->leftJoin("{$komoditasTable} as k", 'k.id', '=', 'p.komoditas_id')
|
||||
->selectRaw("COALESCE(k.nama, 'Belum ditentukan') as nama")
|
||||
->selectRaw('COUNT(p.id) as petani_count')
|
||||
->where('k.is_utama', true)
|
||||
->groupBy('k.id', 'k.nama')
|
||||
->orderByDesc('petani_count')
|
||||
->get();
|
||||
|
||||
$totalPetani = (int) $komoditasCollection->sum('petani_count');
|
||||
$circumference = 2 * pi() * 46;
|
||||
|
||||
$komoditas = $komoditasCollection
|
||||
->map(function ($item, $index) use (
|
||||
$colors,
|
||||
$totalPetani,
|
||||
$circumference
|
||||
) {
|
||||
$color = $colors[$index % count($colors)];
|
||||
|
||||
$ratio = $totalPetani > 0
|
||||
? (int) $item->petani_count / $totalPetani
|
||||
: 0;
|
||||
|
||||
return [
|
||||
'label' => $item->nama,
|
||||
'total' => (int) $item->petani_count,
|
||||
'pct' => round($ratio * 100, 1),
|
||||
'arc' => $ratio * $circumference,
|
||||
'color' => $color['color'],
|
||||
];
|
||||
})
|
||||
->values();
|
||||
|
||||
// Progres pengisian data per petani
|
||||
|
||||
$progressPetani = Petani::query()
|
||||
->select([
|
||||
'id',
|
||||
'nama',
|
||||
])
|
||||
->withExists([
|
||||
'lahans as has_lahan',
|
||||
'praktikBudidaya as has_praktik_budidaya',
|
||||
'sosialEkonomi as has_sosial_ekonomi',
|
||||
'aksesPasar as has_akses_pasar',
|
||||
])
|
||||
->orderBy('nama')
|
||||
->get()
|
||||
->map(function ($petani) {
|
||||
$status = [
|
||||
'lahan' => [
|
||||
'label' => 'Lahan',
|
||||
'done' => (bool) $petani->has_lahan,
|
||||
],
|
||||
'praktik_budidaya' => [
|
||||
'label' => 'Praktik Budidaya',
|
||||
'done' => (bool) $petani->has_praktik_budidaya,
|
||||
],
|
||||
'sosial_ekonomi' => [
|
||||
'label' => 'Sosial Ekonomi',
|
||||
'done' => (bool) $petani->has_sosial_ekonomi,
|
||||
],
|
||||
'akses_pasar' => [
|
||||
'label' => 'Akses Pasar',
|
||||
'done' => (bool) $petani->has_akses_pasar,
|
||||
],
|
||||
];
|
||||
|
||||
$totalModul = count($status);
|
||||
|
||||
$modulSelesai = collect($status)
|
||||
->where('done', true)
|
||||
->count();
|
||||
|
||||
return [
|
||||
'id' => $petani->id,
|
||||
'name' => $petani->nama,
|
||||
'status' => $status,
|
||||
'done' => $modulSelesai,
|
||||
'total' => $totalModul,
|
||||
'percent' => $totalModul > 0
|
||||
? (int) round(($modulSelesai / $totalModul) * 100)
|
||||
: 0,
|
||||
];
|
||||
})
|
||||
->values();
|
||||
|
||||
// Ringkasan lahan
|
||||
|
||||
$totalLuasLahan = ((float) Lahan::query()
|
||||
->sum('luas_lahan')) / 10000;
|
||||
|
||||
// Jumlah tanaman berdasarkan komoditas petani
|
||||
|
||||
$tanamanTable = (new Tanaman())->getTable();
|
||||
|
||||
$tanamanPerKomoditasCollection = DB::table("{$tanamanTable} as t")
|
||||
->join("{$lahanTable} as l", 'l.id', '=', 't.lahan_id')
|
||||
->join("{$petaniTable} as p", 'p.id', '=', 'l.petani_id')
|
||||
->leftJoin("{$komoditasTable} as k", 'k.id', '=', 't.komoditas_id')
|
||||
->selectRaw("COALESCE(k.nama, 'Belum ditentukan') as label")
|
||||
->selectRaw('COUNT(t.id) as total')
|
||||
->where('k.is_utama', true)
|
||||
->whereNull('t.deleted_at')
|
||||
->whereNull('l.deleted_at')
|
||||
->whereNull('p.deleted_at')
|
||||
->groupBy('k.id', 'k.nama')
|
||||
->orderByDesc('total')
|
||||
->get();
|
||||
|
||||
$totalJumlahTanaman = (int) $tanamanPerKomoditasCollection->sum('total');
|
||||
|
||||
$tanamanPerKomoditas = $tanamanPerKomoditasCollection
|
||||
->map(function ($item, $index) use ($colors, $totalJumlahTanaman) {
|
||||
$color = $colors[$index % count($colors)];
|
||||
$total = (int) $item->total;
|
||||
|
||||
return [
|
||||
'label' => $item->label,
|
||||
'total' => $total,
|
||||
'pct' => $totalJumlahTanaman > 0
|
||||
? round(($total / $totalJumlahTanaman) * 100, 1)
|
||||
: 0,
|
||||
'color' => $color['color'],
|
||||
'bg' => $color['bg'],
|
||||
'tx' => $color['tx'],
|
||||
];
|
||||
})
|
||||
->values();
|
||||
|
||||
// Distribusi peserta pelatihan GAP
|
||||
|
||||
$gapOptions = collect($this->pelatihanGapOptions());
|
||||
|
||||
$knownGapOptions = $gapOptions->reject(function ($label, $value) {
|
||||
return $this->normalizeText((string) $value) === 'lainnya'
|
||||
|| $this->normalizeText((string) $label) === 'lainnya';
|
||||
});
|
||||
|
||||
$gapLookup = [];
|
||||
|
||||
foreach ($knownGapOptions as $value => $label) {
|
||||
$gapLookup[$this->normalizeText((string) $value)] = (string) $label;
|
||||
$gapLookup[$this->normalizeText((string) $label)] = (string) $label;
|
||||
}
|
||||
|
||||
$pelatihanPairs = SurveyPelatihan::query()
|
||||
->whereNotNull('petani_id')
|
||||
->whereNotNull('jenis_pelatihan')
|
||||
->where('jenis_pelatihan', '!=', '')
|
||||
->get([
|
||||
'petani_id',
|
||||
'jenis_pelatihan',
|
||||
])
|
||||
->map(function ($row) use ($gapLookup) {
|
||||
$normalized = $this->normalizeText((string) $row->jenis_pelatihan);
|
||||
|
||||
return [
|
||||
'petani_id' => $row->petani_id,
|
||||
'label' => $gapLookup[$normalized] ?? 'Lainnya',
|
||||
];
|
||||
})
|
||||
->unique(fn ($item) => $item['petani_id'] . '|' . $item['label'])
|
||||
->values();
|
||||
|
||||
$pelatihanCounts = $pelatihanPairs->countBy('label');
|
||||
|
||||
$pelatihanLabels = $knownGapOptions
|
||||
->values()
|
||||
->unique()
|
||||
->push('Lainnya')
|
||||
->values();
|
||||
|
||||
$pelatihanGap = $pelatihanLabels
|
||||
->map(function ($label, $index) use ($pelatihanCounts, $colors) {
|
||||
$color = $colors[$index % count($colors)];
|
||||
|
||||
return [
|
||||
'label' => $label,
|
||||
'total' => (int) $pelatihanCounts->get($label, 0),
|
||||
'color' => $color['color'],
|
||||
'bg' => $color['bg'],
|
||||
'tx' => $color['tx'],
|
||||
];
|
||||
})
|
||||
->values();
|
||||
|
||||
$totalPetaniPelatihan = $pelatihanPairs
|
||||
->pluck('petani_id')
|
||||
->unique()
|
||||
->count();
|
||||
|
||||
// Sertifikasi
|
||||
|
||||
$totalPetaniBersertifikat = SurveySertifikasi::query()
|
||||
->whereNotNull('petani_id')
|
||||
->distinct()
|
||||
->count('petani_id');
|
||||
|
||||
$totalPetaniSertifikatAktif = SurveySertifikasi::query()
|
||||
->whereNotNull('petani_id')
|
||||
->where('is_aktif', true)
|
||||
->distinct()
|
||||
->count('petani_id');
|
||||
|
||||
return view('dashboard.survey-petani', [
|
||||
'enumerators' => $enumerators,
|
||||
'komoditas' => $komoditas,
|
||||
'totalPetani' => $totalPetani,
|
||||
'circumference' => $circumference,
|
||||
'progressPetani' => $progressPetani,
|
||||
'totalLuasLahan' => $totalLuasLahan,
|
||||
'totalJumlahTanaman' => $totalJumlahTanaman,
|
||||
'tanamanPerKomoditas' => $tanamanPerKomoditas,
|
||||
'pelatihanGap' => $pelatihanGap,
|
||||
'totalPetaniPelatihan' => $totalPetaniPelatihan,
|
||||
'totalPetaniBersertifikat' => $totalPetaniBersertifikat,
|
||||
'totalPetaniSertifikatAktif' => $totalPetaniSertifikatAktif,
|
||||
]);
|
||||
}
|
||||
|
||||
private function pelatihanGapOptions(): array
|
||||
{
|
||||
$enumClass = self::GAP_ENUM_CLASS;
|
||||
|
||||
if (enum_exists($enumClass)) {
|
||||
if (method_exists($enumClass, 'options')) {
|
||||
return collect($enumClass::options())
|
||||
->mapWithKeys(function ($option, $key) {
|
||||
if (is_array($option)) {
|
||||
$value = (string) ($option['value'] ?? $key);
|
||||
$label = (string) (
|
||||
$option['label']
|
||||
?? $option['name']
|
||||
?? $option['value']
|
||||
?? $key
|
||||
);
|
||||
|
||||
return [$value => $label];
|
||||
}
|
||||
|
||||
return [(string) $key => (string) $option];
|
||||
})
|
||||
->all();
|
||||
}
|
||||
|
||||
return collect($enumClass::cases())
|
||||
->mapWithKeys(function ($case) {
|
||||
$value = $case instanceof BackedEnum
|
||||
? (string) $case->value
|
||||
: (string) $case->name;
|
||||
|
||||
$label = method_exists($case, 'label')
|
||||
? (string) $case->label()
|
||||
: Str::headline($case->name);
|
||||
|
||||
return [$value => $label];
|
||||
})
|
||||
->all();
|
||||
}
|
||||
|
||||
return [
|
||||
'pemangkasan_perawatan_tanaman'
|
||||
=> 'Pemangkasan/perawatan tanaman',
|
||||
'pemupukan_nutrisi_tanah'
|
||||
=> 'Pemupukan/nutrisi tanah',
|
||||
'pengendalian_hama_penyakit'
|
||||
=> 'Pengendalian hama & penyakit',
|
||||
'praktik_berkebun_baik_gap'
|
||||
=> 'Praktik Berkebun yang Baik (GAP)',
|
||||
'pengolahan_pascapanen'
|
||||
=> 'Pengolahan/pascapanen',
|
||||
'penyerbukan_manual_vanili'
|
||||
=> 'Penyerbukan manual (vanili)',
|
||||
'lainnya'
|
||||
=> 'Lainnya',
|
||||
];
|
||||
}
|
||||
|
||||
private function normalizeText(string $value): string
|
||||
{
|
||||
return Str::lower(Str::squish($value));
|
||||
}
|
||||
|
||||
private function colors(): array
|
||||
{
|
||||
return [
|
||||
[
|
||||
'color' => '#28a745',
|
||||
'bg' => 'rgba(40,167,69,.15)',
|
||||
'tx' => '#28a745',
|
||||
],
|
||||
[
|
||||
'color' => '#007bff',
|
||||
'bg' => 'rgba(0,123,255,.15)',
|
||||
'tx' => '#007bff',
|
||||
],
|
||||
[
|
||||
'color' => '#fd7e14',
|
||||
'bg' => 'rgba(253,126,20,.15)',
|
||||
'tx' => '#fd7e14',
|
||||
],
|
||||
[
|
||||
'color' => '#dc3545',
|
||||
'bg' => 'rgba(220,53,69,.15)',
|
||||
'tx' => '#dc3545',
|
||||
],
|
||||
[
|
||||
'color' => '#6f42c1',
|
||||
'bg' => 'rgba(111,66,193,.15)',
|
||||
'tx' => '#6f42c1',
|
||||
],
|
||||
[
|
||||
'color' => '#20c997',
|
||||
'bg' => 'rgba(32,201,151,.15)',
|
||||
'tx' => '#20c997',
|
||||
],
|
||||
];
|
||||
}
|
||||
}
|
||||
@@ -5,10 +5,11 @@ namespace App\Http\Controllers\Web\Konfigurasi;
|
||||
use App\Http\Controllers\Controller;
|
||||
use Illuminate\Http\Request;
|
||||
use App\Models\User;
|
||||
use Illuminate\Support\Str;
|
||||
use Illuminate\Support\Facades\Auth;
|
||||
use Illuminate\Support\Facades\Hash;
|
||||
use Illuminate\Support\Facades\Validator;
|
||||
use Illuminate\Validation\ValidationException;
|
||||
use App\Models\Profile;
|
||||
|
||||
class AuthController extends Controller
|
||||
{
|
||||
@@ -26,23 +27,49 @@ class AuthController extends Controller
|
||||
|
||||
public function createAccount(Request $request)
|
||||
{
|
||||
$validator = Validator::make($request->all(), [
|
||||
'name' => 'required|string|max:255',
|
||||
'email' => 'required|string|email|max:255|unique:users',
|
||||
$credentials = $request->validate([
|
||||
'username' => 'required|string|min:6|max:255|unique:users,username',
|
||||
'email' => 'required|string|email|max:255|unique:users,email',
|
||||
'password' => 'required|string|min:8|confirmed',
|
||||
], [
|
||||
'username.unique' => 'Nama pengguna sudah digunakan.',
|
||||
'username.min' => 'Nama pengguna minimal 6 karakter.',
|
||||
'email.unique' => 'Email sudah digunakan.',
|
||||
'password.confirmed' => 'Konfirmasi password tidak cocok.',
|
||||
'password.min' => 'Password minimal 8 karakter.',
|
||||
]);
|
||||
|
||||
User::create([
|
||||
'name' => $request->name,
|
||||
$user = User::create([
|
||||
'uid' => (string) Str::uuid(),
|
||||
'name' => $request->username,
|
||||
'username' => $request->username,
|
||||
'email' => $request->email,
|
||||
'password' => Hash::make($request->password),
|
||||
'password' => Hash::make($request->password),
|
||||
'status' => 'pending',
|
||||
'role' => null,
|
||||
'email_verified_at' => null,
|
||||
'created_by' => null,
|
||||
'updated_by' => null,
|
||||
'deleted_by' => null,
|
||||
]);
|
||||
$user->update([
|
||||
'created_by' => $user->id,
|
||||
'updated_by' => $user->id,
|
||||
]);
|
||||
|
||||
return redirect()->route('auth.login')->with('success', 'Account created successfully. Please login.');
|
||||
Profile::create([
|
||||
'user_id' => $user->id,
|
||||
'user_uid' => $user->uid,
|
||||
'role' => $request->role,
|
||||
'nama' => $request->username,
|
||||
'email' => $request->email,
|
||||
'telepon' => $request->telepon,
|
||||
'alamat' => $request->alamat,
|
||||
'kk' => $request->kk,
|
||||
'ktp' => $request->ktp,
|
||||
'desa_kelurahan_id' => $request->desa_kelurahan_id,
|
||||
'created_by' => $user->id,
|
||||
'updated_by' => $user->id,
|
||||
]);
|
||||
|
||||
return redirect()->route('login')->with('success', 'Account created successfully. Please login.');
|
||||
}
|
||||
|
||||
public function verify(User $user)
|
||||
@@ -68,6 +95,9 @@ class AuthController extends Controller
|
||||
$request->validate([
|
||||
'email_username' => 'required|string',
|
||||
'password' => 'required|string',
|
||||
], [
|
||||
'email_username.required' => 'Email atau username harus diisi.',
|
||||
'password.required' => 'Password harus diisi.',
|
||||
]);
|
||||
|
||||
$login = $request->input('email_username');
|
||||
|
||||
@@ -49,23 +49,42 @@ class UserController extends Controller
|
||||
return view('konfigurasi.user.index', compact('users', 'totalUsers', 'activeUsers', 'pendingUsers', 'roles', 'tab'));
|
||||
}
|
||||
|
||||
public function verify($id)
|
||||
public function verify(Request $request, $id)
|
||||
{
|
||||
$request->validate([
|
||||
'role' => ['required', 'string'],
|
||||
]);
|
||||
|
||||
try {
|
||||
$user = User::findOrFail($id);
|
||||
|
||||
$user->email_verified_at = now();
|
||||
$user->status = 'verified';
|
||||
$user->role = $request->role;
|
||||
$user->save();
|
||||
|
||||
return response()->json([
|
||||
'status' => 'success',
|
||||
'message' => 'User berhasil diverifikasi dan diaktifkan.'
|
||||
Profile::where('user_id', $user->id)->update([
|
||||
'role' => $request->role
|
||||
]);
|
||||
|
||||
if ($request->expectsJson()) {
|
||||
return response()->json([
|
||||
'status' => 'success',
|
||||
'message' => 'User ' . $user->name . ' berhasil diverifikasi sebagai ' . $request->role . '.'
|
||||
]);
|
||||
}
|
||||
|
||||
return redirect()->back()->with('success', 'User ' . $user->name . ' berhasil diverifikasi sebagai ' . $request->role . '.');
|
||||
|
||||
} catch (\Exception $e) {
|
||||
return response()->json([
|
||||
'status' => 'error',
|
||||
'message' => 'Gagal verifikasi user.'
|
||||
], 500);
|
||||
if ($request->expectsJson()) {
|
||||
return response()->json([
|
||||
'status' => 'error',
|
||||
'message' => 'Gagal verifikasi user: ' . $e->getMessage()
|
||||
], 500);
|
||||
}
|
||||
|
||||
return back()->with('error', 'Gagal verifikasi user: ' . $e->getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -80,18 +99,20 @@ class UserController extends Controller
|
||||
public function store(Request $request)
|
||||
{
|
||||
$validator = Validator::make($request->all(), [
|
||||
'username' => ['required', 'string', 'max:255', 'unique:users,username'],
|
||||
'username' => ['required', 'string', 'max:255', 'min:6', 'unique:users,username'],
|
||||
'nama' => ['required', 'string', 'max:255'],
|
||||
'email' => ['required', 'string', 'email', 'max:255', 'unique:users,email'],
|
||||
'password' => ['required', 'string', 'min:8', 'confirmed'],
|
||||
'role' => ['required', 'string'],
|
||||
'telepon' => ['required', 'max:13'],
|
||||
'desa_kelurahan_id' => ['required'],
|
||||
'desa_kelurahan_id' => ['nullable', 'exists:desa_kelurahan,id'],
|
||||
'ktp' => ['nullable', 'min:16', 'max:16'],
|
||||
'kk' => ['nullable', 'min:16', 'max:16'],
|
||||
'file_ktp' => ['nullable', 'file', 'mimes:jpeg,jpg,png,pdf', 'max:2048'],
|
||||
'file_kk' => ['nullable', 'file', 'mimes:jpeg,jpg,pdf,png', 'max:2048'],
|
||||
], [
|
||||
'username.unique' => 'Nama pengguna sudah digunakan.',
|
||||
'username.min' => 'Nama pengguna minimal 6 karakter.',
|
||||
'password.confirmed' => 'Konfirmasi password tidak cocok!',
|
||||
'password.min' => 'Password minimal 8 karakter!',
|
||||
'email.unique' => 'Email sudah terdaftar.',
|
||||
|
||||
@@ -28,9 +28,13 @@ class KomoditasController extends Controller
|
||||
public function store(Request $request)
|
||||
{
|
||||
$validator = Validator::make($request->all(), [
|
||||
'nama' => ['required', 'string', 'max:255', 'unique:master_komoditas,nama'], // Tambah unique biar nggak ada data kembar
|
||||
'nama' => ['required', 'string', 'max:255', 'unique:master_komoditas,nama'],
|
||||
'kode' => ['required', 'string', 'max:2', 'unique:master_komoditas,kode'],
|
||||
'is_utama' => ['nullable', 'boolean'],
|
||||
], [
|
||||
'nama.unique' => 'Nama komoditas ini sudah ada di database.'
|
||||
'nama.unique' => 'Nama komoditas ini sudah ada di database.',
|
||||
'kode.unique' => 'Kode komoditas ini sudah ada di database.',
|
||||
'kode.max' => 'Kode komoditas maksimal 2 Digit.'
|
||||
]);
|
||||
|
||||
if ($validator->fails()) {
|
||||
@@ -39,6 +43,8 @@ class KomoditasController extends Controller
|
||||
|
||||
Komoditas::create([
|
||||
'nama' => $request->nama,
|
||||
'kode' => $request->kode,
|
||||
'is_utama' => $request->is_utama,
|
||||
'created_by' => auth()->id(),
|
||||
'updated_by' => auth()->id(),
|
||||
]);
|
||||
@@ -55,9 +61,13 @@ class KomoditasController extends Controller
|
||||
public function update(Request $request, $id)
|
||||
{
|
||||
$validator = Validator::make($request->all(), [
|
||||
'nama' => ['required', 'string', 'max:255', 'unique:master_komoditas,nama,' . $id],
|
||||
'nama' => ['required', 'string', 'max:255', 'unique:master_komoditas,nama,' . $id],
|
||||
'kode' => ['required', 'string', 'max:2', 'unique:master_komoditas,kode,' . $id],
|
||||
'is_utama' => ['nullable', 'boolean'],
|
||||
], [
|
||||
'nama.unique' => 'Nama komoditas ini sudah digunakan.'
|
||||
'nama.unique' => 'Nama komoditas ini sudah ada di database.',
|
||||
'kode.unique' => 'Kode komoditas ini sudah ada di database.',
|
||||
'kode.max' => 'Kode komoditas maksimal 2 Digit.'
|
||||
]);
|
||||
|
||||
if ($validator->fails()) {
|
||||
@@ -66,8 +76,10 @@ class KomoditasController extends Controller
|
||||
|
||||
$komoditas = Komoditas::findOrFail($id);
|
||||
$komoditas->update([
|
||||
'nama' => $request->nama,
|
||||
'updated_by' => auth()->id(),
|
||||
'nama' => $request->nama,
|
||||
'kode' => $request->kode,
|
||||
'is_utama' => $request->is_utama,
|
||||
'updated_by' => auth()->id(),
|
||||
]);
|
||||
|
||||
return response()->json(['status' => 'success', 'message' => 'Komoditas berhasil diupdate.']);
|
||||
|
||||
@@ -7,51 +7,63 @@ use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use Illuminate\Support\Facades\Auth;
|
||||
use Illuminate\Support\Str;
|
||||
use Illuminate\Validation\Rule;
|
||||
use App\Models\Pertanian\Petani;
|
||||
use App\Models\Pertanian\AksesPasar;
|
||||
use App\Models\Pertanian\HargaJualPanen;
|
||||
|
||||
use App\Enums\AksesPasar\SkorPengalaman;
|
||||
use App\Enums\AksesPasar\SaluranTerdahulu;
|
||||
use App\Enums\AksesPasar\PraktikFermentasi;
|
||||
use App\Enums\AksesPasar\SkorKesadaranPremium;
|
||||
|
||||
class AksesPasarController extends Controller
|
||||
{
|
||||
public function index($petaniId)
|
||||
{
|
||||
$petani = Petani::findOrFail($petaniId);
|
||||
$petani = Petani::findOrFail($petaniId);
|
||||
|
||||
$aksesPasar = AksesPasar::where('petani_id', $petaniId)->first();
|
||||
$hargaJualPanen = HargaJualPanen::where('petani_id', $petaniId)->get();
|
||||
$hargaJualRows = collect([
|
||||
'Buah segar hasil petik',
|
||||
'Biji basah',
|
||||
'Biji kering/Biji Kupas',
|
||||
'Terfermentasi (Rp/kg)',
|
||||
])->map(function (string $bentuk, int $index) use ($hargaJualPanen) {
|
||||
$existingData = $hargaJualPanen->firstWhere('bentuk_produk', $bentuk);
|
||||
|
||||
return view('produktivitas.petani.akses-pasar.index', compact('petani', 'aksesPasar', 'hargaJualPanen'));
|
||||
return [
|
||||
'index' => $index,
|
||||
'bentuk' => $bentuk,
|
||||
'harga_panen_terakhir' => $this->currencyForDisplay($existingData?->harga_panen_terakhir),
|
||||
'harga_tahun_lalu' => $this->currencyForDisplay($existingData?->harga_tahun_lalu),
|
||||
'harga_dua_tahun_lalu' => $this->currencyForDisplay($existingData?->harga_dua_tahun_lalu),
|
||||
];
|
||||
});
|
||||
|
||||
return view('produktivitas.petani.akses-pasar.index', array_merge(
|
||||
compact('petani', 'aksesPasar', 'hargaJualPanen', 'hargaJualRows'),
|
||||
$this->aksesPasarOptions()
|
||||
));
|
||||
}
|
||||
|
||||
public function store(Request $request)
|
||||
{
|
||||
$request->validate([
|
||||
'petani_id' => 'required|exists:petani,id',
|
||||
]);
|
||||
$validated = $this->validateData($request);
|
||||
|
||||
DB::beginTransaction();
|
||||
|
||||
try {
|
||||
$aksesPasarData = $request->except(['_token', 'harga_jual']);
|
||||
$aksesPasarData['uid'] = Str::uuid();
|
||||
$aksesPasarData = $this->aksesPasarPayload($validated);
|
||||
$aksesPasarData['uid'] = 'AKP-' . Str::uuid();
|
||||
$aksesPasarData['created_by'] = Auth::id();
|
||||
$aksesPasarData['updated_by'] = Auth::id();
|
||||
|
||||
AksesPasar::create($aksesPasarData);
|
||||
$aksesPasar = AksesPasar::create($aksesPasarData);
|
||||
|
||||
if ($request->has('harga_jual')) {
|
||||
foreach ($request->harga_jual as $harga) {
|
||||
if (!empty($harga['bentuk_produk'])) {
|
||||
HargaJualPanen::create([
|
||||
'uid' => Str::uuid(),
|
||||
'petani_id' => $request->petani_id,
|
||||
'bentuk_produk' => $harga['bentuk_produk'],
|
||||
'harga_panen_terakhir' => $harga['harga_panen_terakhir'],
|
||||
'harga_tahun_lalu' => $harga['harga_tahun_lalu'],
|
||||
'harga_dua_tahun_lalu' => $harga['harga_dua_tahun_lalu'],
|
||||
'created_by' => Auth::id(),
|
||||
]);
|
||||
}
|
||||
}
|
||||
$this->syncHargaJual($request->petani_id, $validated['harga_jual'] ?? [], Auth::id());
|
||||
}
|
||||
|
||||
DB::commit();
|
||||
@@ -64,38 +76,22 @@ class AksesPasarController extends Controller
|
||||
}
|
||||
}
|
||||
|
||||
public function update(Request $request, $id)
|
||||
public function update(Request $request, $petaniId, $id)
|
||||
{
|
||||
$request->validate([
|
||||
'petani_id' => 'required|exists:petani,id',
|
||||
]);
|
||||
$validated = $this->validateData($request);
|
||||
|
||||
DB::beginTransaction();
|
||||
|
||||
try {
|
||||
$aksesPasar = AksesPasar::findOrFail($id);
|
||||
$updateData = $request->except(['_token', '_method', 'harga_jual']);
|
||||
|
||||
$updateData = $this->aksesPasarPayload($validated);
|
||||
$updateData['updated_by'] = Auth::id();
|
||||
|
||||
$aksesPasar->update($updateData);
|
||||
|
||||
HargaJualPanen::where('petani_id', $request->petani_id)->delete();
|
||||
|
||||
if ($request->has('harga_jual')) {
|
||||
foreach ($request->harga_jual as $harga) {
|
||||
if (!empty($harga['bentuk_produk'])) {
|
||||
HargaJualPanen::create([
|
||||
'uid' => Str::uuid(),
|
||||
'petani_id' => $request->petani_id,
|
||||
'bentuk_produk' => $harga['bentuk_produk'],
|
||||
'harga_panen_terakhir' => $harga['harga_panen_terakhir'],
|
||||
'harga_tahun_lalu' => $harga['harga_tahun_lalu'],
|
||||
'harga_dua_tahun_lalu' => $harga['harga_dua_tahun_lalu'],
|
||||
'created_by' => $aksesPasar->created_by,
|
||||
'updated_by' => Auth::id(),
|
||||
]);
|
||||
}
|
||||
}
|
||||
$this->syncHargaJual($request->petani_id, $validated['harga_jual'] ?? [], $aksesPasar->created_by, Auth::id());
|
||||
}
|
||||
|
||||
DB::commit();
|
||||
@@ -107,4 +103,175 @@ class AksesPasarController extends Controller
|
||||
return redirect()->back()->withErrors(['error' => 'Gagal memperbarui data: ' . $e->getMessage()])->withInput();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private function aksesPasarOptions(): array
|
||||
{
|
||||
return [
|
||||
'skorPengalamanOptions' => SkorPengalaman::options(),
|
||||
'saluranTerdahuluOptions' => SaluranTerdahulu::options(),
|
||||
'saluranLainnyaValue' => SaluranTerdahulu::LAINNYA->value,
|
||||
'praktikFermentasiOptions' => PraktikFermentasi::options(),
|
||||
'praktikBelumPernahValue' => PraktikFermentasi::BELUM_PERNAH->value,
|
||||
'skorKesadaranPremiumOptions' => SkorKesadaranPremium::options(),
|
||||
'skorPengalamanBerhentiValues' => [
|
||||
SkorPengalaman::PERNAH_BERHENTI_TIDAK_ADA_AKSES->value,
|
||||
SkorPengalaman::PERNAH_BERHENTI_MUNGKIN_KEMBALI->value
|
||||
]
|
||||
];
|
||||
}
|
||||
|
||||
private function validateData(Request $request): array
|
||||
{
|
||||
$this->normalizeCurrencyInput($request);
|
||||
|
||||
return $request->validate([
|
||||
'petani_id' => ['required', 'exists:petani,id'],
|
||||
'skor_pengalaman' => ['nullable', 'integer', Rule::in(SkorPengalaman::values())],
|
||||
'alasan_berhenti' => [
|
||||
Rule::requiredIf(fn () => in_array((int)$request->input('skor_pengalaman'), [
|
||||
SkorPengalaman::PERNAH_BERHENTI_TIDAK_ADA_AKSES->value,
|
||||
SkorPengalaman::PERNAH_BERHENTI_MUNGKIN_KEMBALI->value
|
||||
], true)),
|
||||
'nullable', 'string', 'max:255'
|
||||
],
|
||||
|
||||
'saluran_terdahulu' => ['nullable', 'array'],
|
||||
'saluran_terdahulu.*' => ['string', Rule::in(SaluranTerdahulu::values())],
|
||||
'saluran_terdahulu_lainnya' => [
|
||||
Rule::requiredIf(fn () => in_array(SaluranTerdahulu::LAINNYA->value, $request->input('saluran_terdahulu', []), true)),
|
||||
'nullable', 'string', 'max:255'
|
||||
],
|
||||
|
||||
'praktik_fermentasi' => ['nullable', 'string', Rule::in(PraktikFermentasi::values())],
|
||||
'proses_fermentasi' => [
|
||||
Rule::requiredIf(fn () => filled($request->input('praktik_fermentasi')) && $request->input('praktik_fermentasi') !== PraktikFermentasi::BELUM_PERNAH->value),
|
||||
'nullable', 'string'
|
||||
],
|
||||
'model_fermentasi_memungkinkan' => [
|
||||
Rule::requiredIf(fn () => filled($request->input('praktik_fermentasi')) && $request->input('praktik_fermentasi') !== PraktikFermentasi::BELUM_PERNAH->value),
|
||||
'nullable', 'string'
|
||||
],
|
||||
|
||||
'skor_kesadaran_premium' => ['nullable', 'integer', Rule::in(SkorKesadaranPremium::values())],
|
||||
'sumber_info_premium' => ['nullable', 'string', 'max:255'],
|
||||
|
||||
'harga_jual' => ['nullable', 'array'],
|
||||
'harga_jual.*.bentuk_produk' => ['nullable', 'string'],
|
||||
'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.',
|
||||
]);
|
||||
}
|
||||
|
||||
private function aksesPasarPayload(array $validated): array
|
||||
{
|
||||
$payload = collect($validated)->except(['harga_jual'])->all();
|
||||
|
||||
if (!in_array((int)($payload['skor_pengalaman'] ?? 0), [
|
||||
SkorPengalaman::PERNAH_BERHENTI_TIDAK_ADA_AKSES->value,
|
||||
SkorPengalaman::PERNAH_BERHENTI_MUNGKIN_KEMBALI->value
|
||||
], true)) {
|
||||
$payload['alasan_berhenti'] = null;
|
||||
}
|
||||
|
||||
if (!in_array(SaluranTerdahulu::LAINNYA->value, $payload['saluran_terdahulu'] ?? [], true)) {
|
||||
$payload['saluran_terdahulu_lainnya'] = null;
|
||||
}
|
||||
|
||||
if (($payload['praktik_fermentasi'] ?? null) === PraktikFermentasi::BELUM_PERNAH->value) {
|
||||
$payload['proses_fermentasi'] = null;
|
||||
$payload['model_fermentasi_memungkinkan'] = null;
|
||||
}
|
||||
|
||||
return $payload;
|
||||
}
|
||||
|
||||
|
||||
private function syncHargaJual($petaniId, array $hargaJualData, $createdBy, $updatedBy = null): void
|
||||
{
|
||||
HargaJualPanen::where('petani_id', $petaniId)->delete();
|
||||
|
||||
foreach ($hargaJualData as $harga) {
|
||||
if (!empty($harga['bentuk_produk'])) {
|
||||
HargaJualPanen::create([
|
||||
'uid' => 'HJP-' . Str::uuid(),
|
||||
'petani_id' => $petaniId,
|
||||
'bentuk_produk' => $harga['bentuk_produk'],
|
||||
'harga_panen_terakhir' => $harga['harga_panen_terakhir'] ?? null,
|
||||
'harga_tahun_lalu' => $harga['harga_tahun_lalu'] ?? null,
|
||||
'harga_dua_tahun_lalu' => $harga['harga_dua_tahun_lalu'] ?? null,
|
||||
'created_by' => $createdBy,
|
||||
'updated_by' => $updatedBy ?? $createdBy,
|
||||
]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private function normalizeCurrencyInput(Request $request): void
|
||||
{
|
||||
$data = $request->all();
|
||||
|
||||
if (isset($data['harga_jual']) && is_array($data['harga_jual'])) {
|
||||
foreach ($data['harga_jual'] as $index => $item) {
|
||||
if (is_array($item)) {
|
||||
if (array_key_exists('harga_panen_terakhir', $item)) {
|
||||
$data['harga_jual'][$index]['harga_panen_terakhir'] = $this->currencyDigits($item['harga_panen_terakhir']);
|
||||
}
|
||||
if (array_key_exists('harga_tahun_lalu', $item)) {
|
||||
$data['harga_jual'][$index]['harga_tahun_lalu'] = $this->currencyDigits($item['harga_tahun_lalu']);
|
||||
}
|
||||
if (array_key_exists('harga_dua_tahun_lalu', $item)) {
|
||||
$data['harga_jual'][$index]['harga_dua_tahun_lalu'] = $this->currencyDigits($item['harga_dua_tahun_lalu']);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
$request->merge($data);
|
||||
}
|
||||
|
||||
private function currencyDigits(mixed $value): ?string
|
||||
{
|
||||
if (is_null($value) || $value === '') return null;
|
||||
$digits = preg_replace('/\D/', '', (string) $value);
|
||||
return $digits === '' ? null : $digits;
|
||||
}
|
||||
|
||||
private function currencyForDisplay(mixed $value): string
|
||||
{
|
||||
$digits = $this->currencyDigits($value);
|
||||
|
||||
return is_null($digits) ? '' : number_format((int) $digits, 0, ',', '.');
|
||||
}
|
||||
}
|
||||
|
||||
@@ -5,20 +5,186 @@ namespace App\Http\Controllers\Web\Produktivitas;
|
||||
use App\Http\Controllers\Controller;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\Gate;
|
||||
use Illuminate\Support\Str;
|
||||
|
||||
use App\Models\Pertanian\Petani;
|
||||
use App\Models\Pertanian\SurveyPelatihan;
|
||||
use App\Models\Pertanian\SurveySertifikasi;
|
||||
|
||||
class PendidikanPelatihanController extends Controller
|
||||
{
|
||||
public function index($petaniId, Request $request)
|
||||
private function authorizeAccess(): void
|
||||
{
|
||||
if (!Gate::any(['super_admin', 'admin', 'fasilitator'])) {
|
||||
abort(403);
|
||||
}
|
||||
}
|
||||
|
||||
public function index(Petani $petani)
|
||||
{
|
||||
$this->authorizeAccess();
|
||||
|
||||
$title = 'Petani - Pendidikan dan Pelatihan';
|
||||
$petani = Petani::findOrFail($petaniId);
|
||||
|
||||
return view('produktivitas.petani.pendidikan-pelatihan.add', compact('title', 'petani'));
|
||||
|
||||
$petani->load([
|
||||
'surveyPelatihan',
|
||||
'surveySertifikasi',
|
||||
]);
|
||||
|
||||
return view('produktivitas.petani.pendidikan-pelatihan.index', compact(
|
||||
'title',
|
||||
'petani'
|
||||
));
|
||||
}
|
||||
|
||||
public function storePelatihan(Request $request, Petani $petani)
|
||||
{
|
||||
$this->authorizeAccess();
|
||||
|
||||
$validatedData = $request->validate([
|
||||
'riwayat_pelatihan' => ['nullable', 'array'],
|
||||
|
||||
'riwayat_pelatihan.*.jenis_pelatihan' => ['nullable', 'string', 'max:255'],
|
||||
'riwayat_pelatihan.*.penyelenggara' => ['nullable', 'string', 'max:255'],
|
||||
'riwayat_pelatihan.*.tahun' => ['nullable', 'integer', 'min:1900', 'max:' . date('Y')],
|
||||
], [
|
||||
'riwayat_pelatihan.*.tahun.integer' => 'Tahun pelatihan harus berupa angka.',
|
||||
'riwayat_pelatihan.*.tahun.min' => 'Tahun pelatihan tidak valid.',
|
||||
'riwayat_pelatihan.*.tahun.max' => 'Tahun pelatihan tidak boleh melebihi tahun saat ini.',
|
||||
], [
|
||||
'riwayat_pelatihan.*.jenis_pelatihan' => 'jenis pelatihan',
|
||||
'riwayat_pelatihan.*.penyelenggara' => 'penyelenggara',
|
||||
'riwayat_pelatihan.*.tahun' => 'tahun pelatihan',
|
||||
]);
|
||||
|
||||
foreach ($validatedData['riwayat_pelatihan'] ?? [] as $item) {
|
||||
if (
|
||||
empty($item['jenis_pelatihan']) &&
|
||||
empty($item['penyelenggara']) &&
|
||||
empty($item['tahun'])
|
||||
) {
|
||||
continue;
|
||||
}
|
||||
|
||||
$petani->surveyPelatihan()->create([
|
||||
'uid' => 'SPL-' . strtoupper(Str::random(10)),
|
||||
'petani_id' => $petani->id,
|
||||
'jenis_pelatihan' => $item['jenis_pelatihan'] ?? null,
|
||||
'penyelenggara' => $item['penyelenggara'] ?? null,
|
||||
'tahun_pelaksanaan' => $item['tahun'] ?? null,
|
||||
'created_by' => auth()->id(),
|
||||
'updated_by' => auth()->id(),
|
||||
]);
|
||||
}
|
||||
|
||||
return $this->redirectBackToFragment($request, 'section-sertifikasi')
|
||||
->with('success', 'Riwayat pelatihan berhasil disimpan.');
|
||||
}
|
||||
|
||||
public function destroyPelatihan(Request $request, Petani $petani, SurveyPelatihan $surveyPelatihan)
|
||||
{
|
||||
$this->authorizeAccess();
|
||||
|
||||
abort_unless($surveyPelatihan->petani_id === $petani->id, 404);
|
||||
|
||||
$surveyPelatihan->update([
|
||||
'deleted_by' => auth()->id(),
|
||||
]);
|
||||
|
||||
$surveyPelatihan->delete();
|
||||
|
||||
return $this->redirectBackToFragment($request, 'section-pelatihan')
|
||||
->with('success', 'Riwayat pelatihan berhasil dihapus.');
|
||||
}
|
||||
|
||||
public function storeSertifikasi(Request $request, Petani $petani)
|
||||
{
|
||||
$this->authorizeAccess();
|
||||
|
||||
$sertifikasi = $request->input('sertifikasi', []);
|
||||
|
||||
foreach ($sertifikasi as $index => $item) {
|
||||
$status = $item['status_berlaku_sertifikat'] ?? 0;
|
||||
|
||||
if (is_array($status)) {
|
||||
$status = in_array('1', $status, true) ? 1 : 0;
|
||||
} else {
|
||||
$status = $status == 1 ? 1 : 0;
|
||||
}
|
||||
$sertifikasi[$index]['status_berlaku_sertifikat'] = $status;
|
||||
}
|
||||
|
||||
$request->merge([
|
||||
'sertifikasi' => $sertifikasi,
|
||||
]);
|
||||
|
||||
$validatedData = $request->validate([
|
||||
'sertifikasi' => ['nullable', 'array'],
|
||||
|
||||
'sertifikasi.*.jenis_sertifikasi' => ['nullable', 'string', 'max:255'],
|
||||
'sertifikasi.*.lembaga_penerbit' => ['nullable', 'string', 'max:255'],
|
||||
'sertifikasi.*.tahun' => ['nullable', 'integer', 'min:1900', 'max:' . date('Y')],
|
||||
'sertifikasi.*.status_berlaku_sertifikat' => ['nullable', 'boolean'],
|
||||
], [
|
||||
'sertifikasi.*.tahun.integer' => 'Tahun sertifikasi harus berupa angka.',
|
||||
'sertifikasi.*.tahun.min' => 'Tahun sertifikasi tidak valid.',
|
||||
'sertifikasi.*.tahun.max' => 'Tahun sertifikasi tidak boleh melebihi tahun saat ini.',
|
||||
], [
|
||||
'sertifikasi.*.jenis_sertifikasi' => 'jenis sertifikasi',
|
||||
'sertifikasi.*.lembaga_penerbit' => 'lembaga penerbit',
|
||||
'sertifikasi.*.tahun' => 'tahun sertifikasi',
|
||||
'sertifikasi.*.status_berlaku_sertifikat' => 'status sertifikat',
|
||||
]);
|
||||
|
||||
foreach ($validatedData['sertifikasi'] ?? [] as $item) {
|
||||
if (
|
||||
empty($item['jenis_sertifikasi']) &&
|
||||
empty($item['lembaga_penerbit']) &&
|
||||
empty($item['tahun'])
|
||||
) {
|
||||
continue;
|
||||
}
|
||||
|
||||
$petani->surveySertifikasi()->create([
|
||||
'uid' => 'SPS-' . strtoupper(Str::random(10)),
|
||||
'petani_id' => $petani->id,
|
||||
'jenis_sertifikasi' => $item['jenis_sertifikasi'] ?? null,
|
||||
'lembaga_penerbit' => $item['lembaga_penerbit'] ?? null,
|
||||
'tahun_pelaksanaan' => $item['tahun'] ?? null,
|
||||
'is_aktif' => $item['status_berlaku_sertifikat'] ?? 0,
|
||||
'created_by' => auth()->id(),
|
||||
'updated_by' => auth()->id(),
|
||||
]);
|
||||
}
|
||||
|
||||
return $this->redirectBackToFragment($request, 'section-sertifikasi')
|
||||
->with('success', 'Sertifikasi berhasil disimpan.');
|
||||
}
|
||||
|
||||
public function destroySertifikasi(Request $request, Petani $petani, SurveySertifikasi $surveySertifikasi)
|
||||
{
|
||||
$this->authorizeAccess();
|
||||
|
||||
abort_unless($surveySertifikasi->petani_id === $petani->id, 404);
|
||||
|
||||
$surveySertifikasi->update([
|
||||
'deleted_by' => auth()->id(),
|
||||
]);
|
||||
|
||||
$surveySertifikasi->delete();
|
||||
|
||||
return $this->redirectBackToFragment($request, 'section-sertifikasi')
|
||||
->with('success', 'Sertifikasi berhasil dihapus.');
|
||||
}
|
||||
|
||||
private function redirectBackToFragment(Request $request, string $defaultFragment)
|
||||
{
|
||||
$fragment = $request->input('redirect_fragment', $defaultFragment);
|
||||
|
||||
if (!is_string($fragment) || !preg_match('/^[A-Za-z0-9_-]+$/', $fragment)) {
|
||||
$fragment = $defaultFragment;
|
||||
}
|
||||
|
||||
return redirect()->to(Str::before(url()->previous(), '#') . '#' . $fragment);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -14,6 +14,10 @@ use Illuminate\Support\Facades\Storage;
|
||||
use App\Models\Wilayah\Provinsi;
|
||||
use App\Models\Pertanian\Petani;
|
||||
use App\Models\Wilayah\DesaKelurahan;
|
||||
use App\Models\Pertanian\Komoditas;
|
||||
use App\Models\Pertanian\Tanaman;
|
||||
use App\Models\Pertanian\Lahan;
|
||||
use App\Models\Pertanian\SkorPetani;
|
||||
|
||||
use App\Enums\Pendidikan;
|
||||
use App\Enums\Pekerjaan;
|
||||
@@ -26,9 +30,20 @@ class PetaniController extends Controller
|
||||
*/
|
||||
public function index(Request $request)
|
||||
{
|
||||
$provinsi = Provinsi::orderBy('kode', 'asc')->get();
|
||||
if (!Gate::any(['super_admin', 'admin', 'fasilitator'])) {
|
||||
abort(403);
|
||||
}
|
||||
|
||||
$query = Petani::with('desakelurahan')
|
||||
$provinsi = Provinsi::select('id', 'kode', 'nama')->orderBy('kode', 'asc')->get();
|
||||
|
||||
$query = Petani::with([
|
||||
'desaKelurahan:id,nama,kecamatan_id',
|
||||
'desaKelurahan.kecamatan:id,nama,kabupaten_kota_id',
|
||||
'desaKelurahan.kecamatan.kabupatenKota:id,nama,provinsi_id',
|
||||
'desaKelurahan.kecamatan.kabupatenKota.provinsi:id,nama',
|
||||
'komoditas:id,nama',
|
||||
'skor:id,petani_id,skor_kesiapan_adopsi',
|
||||
])
|
||||
->orderBy('created_at', 'desc');
|
||||
|
||||
if ($request->search) {
|
||||
@@ -38,9 +53,35 @@ class PetaniController extends Controller
|
||||
});
|
||||
}
|
||||
|
||||
if (auth()->user()->role->value === 'fasilitator') {
|
||||
$query->where('created_by', auth()->user()->id);
|
||||
}
|
||||
|
||||
$summaryPetaniIds = (clone $query)->pluck('id');
|
||||
$petani = $query->paginate($request->per_page ?? 10);
|
||||
|
||||
return view('produktivitas.petani.index', compact('petani', 'provinsi'));
|
||||
$komoditas = Komoditas::select('id', 'nama')->where('is_utama', true)->get();
|
||||
$lahanQuery = Lahan::whereIn('petani_id', $summaryPetaniIds)
|
||||
->whereIn('komoditas_id', $komoditas->pluck('id'));
|
||||
$lahanIds = (clone $lahanQuery)->pluck('id');
|
||||
$totalLuasLahan = (clone $lahanQuery)->sum('luas_lahan');
|
||||
$totalTanaman = Tanaman::whereIn('lahan_id', $lahanIds)->count();
|
||||
|
||||
$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', $summaryPetaniIds)
|
||||
->groupByRaw($case)
|
||||
->get();
|
||||
|
||||
return view('produktivitas.petani.index', compact('petani', 'provinsi', 'komoditas', 'skor', 'totalLuasLahan', 'totalTanaman'));
|
||||
}
|
||||
|
||||
public function create()
|
||||
@@ -53,19 +94,17 @@ class PetaniController extends Controller
|
||||
$pekerjaan = Pekerjaan::options();
|
||||
$pernikahan = Pernikahan::options();
|
||||
|
||||
$komoditas = Komoditas::where('is_utama', true)->get();
|
||||
|
||||
$provinsi = Provinsi::orderBy('kode', 'asc')->get();
|
||||
|
||||
return view('produktivitas.petani.add', compact('pendidikan', 'pekerjaan',
|
||||
'pernikahan', 'provinsi'));
|
||||
'pernikahan', 'provinsi', 'komoditas'));
|
||||
}
|
||||
|
||||
public function store(Request $request)
|
||||
private function validatePetani(Request $request)
|
||||
{
|
||||
if (!Gate::any(['super_admin', 'admin', 'fasilitator'])) {
|
||||
abort(403);
|
||||
}
|
||||
|
||||
$validatedData = $request->validate([
|
||||
return $request->validate([
|
||||
'nama' => ['required','string','max:255'],
|
||||
'jenis_kelamin' => ['required','boolean'],
|
||||
'tempat_lahir' => ['required','string','max:255'],
|
||||
@@ -73,7 +112,7 @@ class PetaniController extends Controller
|
||||
'pendidikan_terakhir' => ['required', Rule::enum(Pendidikan::class)],
|
||||
'alamat' => ['required','string','max:500'],
|
||||
'desa_kelurahan_id' => ['required','exists:master_desa_kelurahan,id'],
|
||||
//'komoditas_id' => ['required','exists:master_komoditas,id'],
|
||||
'komoditas_id' => ['required','exists:master_komoditas,id'],
|
||||
'status_perkawinan' => ['required', Rule::enum(Pernikahan::class)],
|
||||
'ktp' => ['nullable', 'min:16', 'max:16'],
|
||||
'file_ktp' => ['nullable', 'image', 'mimes:jpeg,jpg,png', 'max:2048'],
|
||||
@@ -82,8 +121,48 @@ class PetaniController extends Controller
|
||||
'foto' => ['nullable', 'image', 'mimes:jpeg,jpg,png', 'max:2048'],
|
||||
'nomor_telepon' => ['nullable', 'digits_between:11,13'],
|
||||
], [
|
||||
'nama.required' => 'Nama harus diisi.',
|
||||
'nama.string' => 'Nama harus berupa string.',
|
||||
'nama.max' => 'Nama tidak boleh lebih dari 255 karakter.',
|
||||
'jenis_kelamin.required' => 'Jenis kelamin harus dipilih.',
|
||||
'tempat_lahir.required' => 'Tempat lahir harus diisi.',
|
||||
'tempat_lahir.string' => 'Tempat lahir harus berupa string.',
|
||||
'tempat_lahir.max' => 'Tempat lahir tidak boleh lebih dari 255 karakter.',
|
||||
'tanggal_lahir.required' => 'Tanggal lahir harus diisi.',
|
||||
'tanggal_lahir.date' => 'Tanggal lahir harus berupa tanggal.',
|
||||
'pendidikan_terakhir.required' => 'Pendidikan terakhir harus dipilih.',
|
||||
'alamat.required' => 'Alamat harus diisi.',
|
||||
'alamat.string' => 'Alamat harus berupa string.',
|
||||
'alamat.max' => 'Alamat tidak boleh lebih dari 500 karakter.',
|
||||
'desa_kelurahan_id.required' => 'Desa kelurahan harus dipilih.',
|
||||
'desa_kelurahan_id.exists' => 'Desa kelurahan tidak ditemukan.',
|
||||
'komoditas_id.required' => 'Komoditas harus dipilih.',
|
||||
'komoditas_id.exists' => 'Komoditas tidak ditemukan.',
|
||||
'status_perkawinan.required' => 'Status perkawinan harus dipilih.',
|
||||
'ktp.min' => 'KTP harus berupa 16 digit.',
|
||||
'ktp.max' => 'KTP harus berupa 16 digit.',
|
||||
'kk.min' => 'KK harus berupa 16 digit.',
|
||||
'kk.max' => 'KK harus berupa 16 digit.',
|
||||
'file_ktp.image' => 'File KTP harus berupa gambar.',
|
||||
'file_ktp.mimes' => 'File KTP harus berupa jpeg, jpg, atau png.',
|
||||
'file_ktp.max' => 'File KTP tidak boleh lebih dari 2MB.',
|
||||
'file_kk.image' => 'File KK harus berupa gambar.',
|
||||
'file_kk.mimes' => 'File KK harus berupa jpeg, jpg, atau png.',
|
||||
'file_kk.max' => 'File KK tidak boleh lebih dari 2MB.',
|
||||
'foto.image' => 'Foto harus berupa gambar.',
|
||||
'foto.mimes' => 'Foto harus berupa jpeg, jpg, atau png.',
|
||||
'foto.max' => 'Foto tidak boleh lebih dari 2MB.',
|
||||
'nomor_telepon.digits_between' => 'Nomor telepon harus berupa angka 11 sampai 13 digit.',
|
||||
]);
|
||||
}
|
||||
|
||||
public function store(Request $request)
|
||||
{
|
||||
if (!Gate::any(['super_admin', 'admin', 'fasilitator'])) {
|
||||
abort(403);
|
||||
}
|
||||
|
||||
$validatedData = $this->validatePetani($request);
|
||||
|
||||
if ($request->hasFile('file_ktp')) {
|
||||
$file_ktp = $request->file('file_ktp');
|
||||
@@ -100,12 +179,13 @@ class PetaniController extends Controller
|
||||
$validatedData['foto'] = $file_foto->store('petani/foto');
|
||||
}
|
||||
|
||||
Petani::create([...$validatedData,
|
||||
'uid' => 'PTN-'. strtoupper(Str::random(10)),
|
||||
$petaniUID = strtoupper(Str::random(10));
|
||||
$petani = Petani::create([...$validatedData,
|
||||
'uid' => 'PTN-'. $petaniUID,
|
||||
'created_by' => auth()->id(),
|
||||
'updated_by' => auth()->id()]);
|
||||
|
||||
return redirect()->route('petani.index')->with('success', 'Data petani berhasil ditambahkan.');
|
||||
return redirect()->route('petani.edit', $petani->id)->with('success', 'Data petani berhasil ditambahkan.');
|
||||
}
|
||||
|
||||
public function show(string $id)
|
||||
@@ -134,10 +214,10 @@ class PetaniController extends Controller
|
||||
|
||||
$provinsi = Provinsi::all();
|
||||
|
||||
$section = $request->section ?? 'budidaya';
|
||||
$komoditas = Komoditas::where('is_utama', true)->get();
|
||||
|
||||
return view('produktivitas.petani.edit', compact('petani', 'pendidikan', 'pekerjaan',
|
||||
'pernikahan', 'provinsi', 'section'));
|
||||
'pernikahan', 'provinsi', 'komoditas'));
|
||||
}
|
||||
|
||||
|
||||
@@ -149,25 +229,14 @@ class PetaniController extends Controller
|
||||
|
||||
$petani = Petani::findOrFail($id);
|
||||
|
||||
$validatedData = $request->validate([
|
||||
'nama' => ['required','string','max:255'],
|
||||
'jenis_kelamin' => ['required','boolean'],
|
||||
'tempat_lahir' => ['required','string','max:255'],
|
||||
'tanggal_lahir' => ['required','date'],
|
||||
'pendidikan_terakhir' => ['required', Rule::enum(Pendidikan::class)],
|
||||
'alamat' => ['required','string','max:500'],
|
||||
'desa_kelurahan_id' => ['required','exists:master_desa_kelurahan,id'],
|
||||
//'komoditas_id' => ['required','exists:master_komoditas,id'],
|
||||
'status_perkawinan' => ['required', Rule::enum(Pernikahan::class)],
|
||||
'ktp' => ['nullable', 'min:16', 'max:16'],
|
||||
'file_ktp' => ['nullable', 'file', 'mimes:jpeg,jpg,png,pdf', 'max:2048'],
|
||||
'kk' => ['nullable', 'min:16', 'max:16'],
|
||||
'file_kk' => ['nullable', 'file', 'mimes:jpeg,jpg,png,pdf', 'max:2048'],
|
||||
'foto' => ['nullable', 'file', 'mimes:jpeg,jpg,png', 'max:2048'],
|
||||
'nomor_telepon' => ['nullable', 'digits_between:11,13'],
|
||||
], [
|
||||
'nomor_telepon.digits_between' => 'Nomor telepon harus berupa angka 11 sampai 13 digit.',
|
||||
]);
|
||||
$validatedData = $this->validatePetani($request);
|
||||
|
||||
if ($request->input('hapus_foto') == '1') {
|
||||
if ($petani->foto && Storage::exists($petani->foto)) {
|
||||
Storage::delete($petani->foto);
|
||||
}
|
||||
$validatedData['foto'] = null;
|
||||
}
|
||||
|
||||
if ($request->hasFile('file_ktp')) {
|
||||
$file_ktp = $request->file('file_ktp');
|
||||
@@ -180,6 +249,10 @@ class PetaniController extends Controller
|
||||
$validatedData['file_kk'] = $file_kk->getClientOriginalName();
|
||||
}
|
||||
if ($request->hasFile('foto')) {
|
||||
|
||||
if ($petani->foto && Storage::exists($petani->foto)) {
|
||||
Storage::delete($petani->foto);
|
||||
}
|
||||
$file_foto = $request->file('foto');
|
||||
$validatedData['foto'] = $file_foto->store('petani/foto');
|
||||
}
|
||||
@@ -187,7 +260,7 @@ class PetaniController extends Controller
|
||||
$petani->update([...$validatedData,
|
||||
'updated_by' => auth()->id()]);
|
||||
|
||||
return redirect()->route('petani.index')->with('success', 'Data petani berhasil diupdate.');
|
||||
return redirect()->route('petani.edit', $petani->id)->with('success', 'Data petani berhasil diupdate.');
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -7,6 +7,7 @@ use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\Gate;
|
||||
use Illuminate\Support\Facades\Validator;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
use Illuminate\Support\Facades\Storage;
|
||||
use Illuminate\Support\Str;
|
||||
use Illuminate\Validation\Rules\Enum;
|
||||
@@ -17,7 +18,9 @@ use App\Models\Pertanian\Lahan;
|
||||
use App\Models\Wilayah\DesaKelurahan;
|
||||
use App\Models\Wilayah\Provinsi;
|
||||
use App\Models\Pertanian\Komoditas;
|
||||
use App\Models\Pertanian\PraktikBudidaya;
|
||||
use App\Models\Pertanian\Tanaman;
|
||||
use App\Models\Master\JenisTanaman;
|
||||
|
||||
use App\Enums\StatusLahan;
|
||||
use App\Enums\KondisiTanaman;
|
||||
@@ -62,8 +65,131 @@ class PetaniLahanController extends Controller
|
||||
$provinsi = Provinsi::orderBy('kode', 'asc')->get();
|
||||
|
||||
$komoditas = Komoditas::all();
|
||||
$tanamanPenaung = JenisTanaman::all();
|
||||
$autoPestDiseaseData = $this->autoPestDiseaseData($petaniId);
|
||||
$jenisHamaOtomatis = $autoPestDiseaseData['jenis_hama'];
|
||||
$jenisPenyakitOtomatis = $autoPestDiseaseData['jenis_penyakit'];
|
||||
|
||||
return view('produktivitas.petani.lahan.add', compact('petani', 'lahan', 'provinsi', 'komoditas'));
|
||||
return view('produktivitas.petani.lahan.add', compact('petani', 'lahan', 'provinsi', 'komoditas', 'tanamanPenaung', 'jenisHamaOtomatis', 'jenisPenyakitOtomatis'));
|
||||
}
|
||||
|
||||
private function autoPestDiseaseData(string|int $petaniId): array
|
||||
{
|
||||
$praktikBudidaya = PraktikBudidaya::where('petani_id', $petaniId)->latest()->first();
|
||||
|
||||
return [
|
||||
'jenis_hama' => $this->normalizeArrayValue($praktikBudidaya?->jenis_hama),
|
||||
'jenis_penyakit' => $this->normalizeArrayValue($praktikBudidaya?->jenis_penyakit),
|
||||
];
|
||||
}
|
||||
|
||||
private function normalizeArrayValue(mixed $value): array
|
||||
{
|
||||
if (is_array($value)) {
|
||||
return array_values(array_filter($value, fn ($item) => filled($item)));
|
||||
}
|
||||
|
||||
if (is_string($value) && $value !== '') {
|
||||
$decoded = json_decode($value, true);
|
||||
|
||||
if (is_array($decoded)) {
|
||||
return array_values(array_filter($decoded, fn ($item) => filled($item)));
|
||||
}
|
||||
|
||||
return [$value];
|
||||
}
|
||||
|
||||
return [];
|
||||
}
|
||||
|
||||
private function hasPestDiseaseColumns(string $table): bool
|
||||
{
|
||||
return Schema::hasColumn($table, 'jenis_hama')
|
||||
&& Schema::hasColumn($table, 'jenis_penyakit');
|
||||
}
|
||||
|
||||
private function validateLahan(Request $request)
|
||||
{
|
||||
return $request->validate([
|
||||
'nama' => ['nullable', 'string', 'max:255'],
|
||||
'status_kepemilikan' => ['nullable', 'string', 'max:255'],
|
||||
'profile_id' => ['nullable'],
|
||||
'petani_id' => ['nullable'],
|
||||
'keluarga_pengelola_id' => ['nullable'],
|
||||
'adat_pemilik_id' => ['nullable'],
|
||||
'desa_kelurahan_id' => ['nullable'],
|
||||
'luas_lahan' => ['required', 'numeric', 'min:0.01'],
|
||||
'path' => ['nullable', 'string'],
|
||||
'komoditas_id' => ['required', 'exists:master_komoditas,id'],
|
||||
'jenis_komoditas_id' => ['required', 'exists:jenis_komoditas,id'],
|
||||
'varietas_id' => ['nullable', 'exists:master_varietas,id'],
|
||||
'jumlah_tanaman' => ['nullable', 'numeric', 'min:0'],
|
||||
'umur_lahan' => ['nullable', 'numeric', 'min:1'],
|
||||
'umur_tanaman' => ['required', 'numeric', 'min:1'],
|
||||
'kondisi_tanaman' => ['required', 'string', new Enum(KondisiTanaman::class)],
|
||||
'serangan_hama' => ['nullable', 'string', new Enum(SeranganHama::class)],
|
||||
'penyakit_tanaman' => ['nullable', 'string', new Enum(PenyakitTanaman::class)],
|
||||
'keparahan_serangan' => ['nullable', 'string', new Enum(KeparahanSerangan::class)],
|
||||
'komoditas_lain' => ['nullable', 'array'],
|
||||
'komoditas_lain.*' => ['integer', 'exists:master_komoditas,id'],
|
||||
'tanaman_penaung' => ['nullable', 'array'],
|
||||
'tanaman_penaung.*' => ['string'],
|
||||
'foto' => ['nullable', 'array'],
|
||||
'foto.*' => ['image', 'mimes:jpeg,jpg,png', 'max:2048'],
|
||||
], [
|
||||
'nama.string' => 'Nama lahan diisi dengan huruf.',
|
||||
'nama.max' => 'Nama lahan maksimal 255 karakter.',
|
||||
'status_kepemilikan.string' => 'Status kepemilikan diisi dengan huruf.',
|
||||
'status_kepemilikan.max' => 'Status kepemilikan maksimal 255 karakter.',
|
||||
'luas_lahan.required' => 'Luas lahan wajib diisi.',
|
||||
'luas_lahan.numeric' => 'Luas lahan diisi dengan angka.',
|
||||
'luas_lahan.min' => 'Luas lahan minimal 0.01.',
|
||||
//'jumlah_tanaman.required' => 'Jumlah tanaman wajib diisi.',
|
||||
'jumlah_tanaman.numeric' => 'Jumlah tanaman diisi dengan angka.',
|
||||
'jumlah_tanaman.min' => 'Jumlah tanaman minimal 0.',
|
||||
//'umur_lahan.required' => 'Umur lahan wajib diisi.',
|
||||
'umur_lahan.numeric' => 'Umur lahan diisi dengan angka.',
|
||||
'umur_lahan.min' => 'Umur lahan minimal 1.',
|
||||
'umur_tanaman.required' => 'Umur tanaman wajib diisi.',
|
||||
'umur_tanaman.numeric' => 'Umur tanaman diisi dengan angka.',
|
||||
'umur_tanaman.min' => 'Umur tanaman minimal 1.',
|
||||
'kondisi_tanaman.required' => 'Kondisi tanaman wajib dipilih.',
|
||||
'kondisi_tanaman.string' => 'Kondisi tanaman diisi dengan huruf.',
|
||||
'serangan_hama.string' => 'Serangan hama diisi dengan huruf.',
|
||||
'penyakit_tanaman.string' => 'Penyakit tanaman diisi dengan huruf.',
|
||||
'keparahan_serangan.string' => 'Keparahan serangan diisi dengan huruf.',
|
||||
'komoditas_lain.array' => 'Komoditas lain diisi dengan array.',
|
||||
'komoditas_lain.*.exists' => 'Komoditas lain yang dipilih tidak valid.',
|
||||
'tanaman_penaung.array' => 'Tanaman penaung diisi dengan array.',
|
||||
//'tanaman_penaung.*.exists' => 'Tanaman penaung yang dipilih tidak valid.',
|
||||
'foto.array' => 'Foto diisi dengan array.',
|
||||
'foto.*.image' => 'Foto harus berupa gambar.',
|
||||
'foto.*.mimes' => 'Foto harus berupa gambar dengan ekstensi jpeg, jpg, atau png.',
|
||||
'foto.*.max' => 'Foto maksimal 2MB.',
|
||||
]);
|
||||
|
||||
}
|
||||
|
||||
private function syncTanamanPenaung(Request $request)
|
||||
{
|
||||
$existing = JenisTanaman::pluck('nama')->toArray();
|
||||
|
||||
$tanamanPenaung = collect($request->tanaman_penaung)
|
||||
->unique()
|
||||
->reject(fn ($nama) => in_array($nama, $existing))
|
||||
->map(fn ($nama) => [
|
||||
'nama' => Str::title($nama),
|
||||
'created_by' => auth()->id(),
|
||||
'updated_by' => auth()->id(),
|
||||
'created_at' => now(),
|
||||
'updated_at' => now(),
|
||||
])
|
||||
->values()
|
||||
->toArray();
|
||||
|
||||
if (!empty($tanamanPenaung)) {
|
||||
JenisTanaman::insert($tanamanPenaung);
|
||||
}
|
||||
}
|
||||
|
||||
public function store($petaniId, Request $request)
|
||||
@@ -74,34 +200,42 @@ class PetaniLahanController extends Controller
|
||||
|
||||
$petani = Petani::findOrFail($petaniId);
|
||||
|
||||
$validated = $request->validate([
|
||||
'nama' => ['nullable', 'string', 'max:255'],
|
||||
'status_kepemilikan' => ['nullable', 'string', 'max:255'],
|
||||
'profile_id' => ['nullable'],
|
||||
'petani_id' => ['nullable'],
|
||||
'keluarga_pengelola_id' => ['nullable'],
|
||||
'adat_pemilik_id' => ['nullable'],
|
||||
'desa_kelurahan_id' => ['nullable'],
|
||||
'luas_lahan' => ['required', 'numeric'],
|
||||
'path' => ['nullable', 'string'],
|
||||
'komoditas_id' => ['required', 'exists:master_komoditas,id'],
|
||||
'jenis_komoditas_id' => ['required', 'exists:jenis_komoditas,id'],
|
||||
'varietas_id' => ['nullable', 'exists:master_varietas,id'],
|
||||
'jumlah_tanaman' => ['required', 'numeric'],
|
||||
'umur_lahan' => ['required', 'numeric'],
|
||||
'umur_tanaman' => ['required', 'numeric'],
|
||||
'kondisi_tanaman' => ['required', 'string', new Enum(KondisiTanaman::class)],
|
||||
'serangan_hama' => ['nullable', 'string', new Enum(SeranganHama::class)],
|
||||
'penyakit_tanaman' => ['nullable', 'string', new Enum(PenyakitTanaman::class)],
|
||||
'keparahan_serangan' => ['nullable', 'string', new Enum(KeparahanSerangan::class)],
|
||||
]);
|
||||
$request->merge([
|
||||
'tanaman_penaung' => collect($request->tanaman_penaung)
|
||||
->map(fn ($nama) => Str::title($nama))
|
||||
->toArray()
|
||||
]);
|
||||
|
||||
$validated = $this->validateLahan($request);
|
||||
$autoPestDiseaseData = $this->autoPestDiseaseData($petaniId);
|
||||
$lahanHasPestDiseaseColumns = $this->hasPestDiseaseColumns((new Lahan)->getTable());
|
||||
$tanamanHasPestDiseaseColumns = $this->hasPestDiseaseColumns((new Tanaman)->getTable());
|
||||
|
||||
if ($lahanHasPestDiseaseColumns) {
|
||||
$validated = array_merge($validated, $autoPestDiseaseData);
|
||||
}
|
||||
|
||||
$komoditas = Komoditas::where('id', $request->komoditas_id)->first();
|
||||
$lahanCount = Lahan::where('petani_id', $petaniId)
|
||||
->count();
|
||||
|
||||
$lahanUid = strtoupper(Str::random(10));
|
||||
|
||||
$foto = null;
|
||||
if ($request->hasFile('foto')) {
|
||||
$foto = [];
|
||||
foreach ($request->file('foto') as $file) {
|
||||
$path = $file->store('lahan', 'public');
|
||||
$foto[] = [
|
||||
'path' => $path,
|
||||
'file' => $file->getClientOriginalName(),
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
$this->syncTanamanPenaung($request);
|
||||
|
||||
$lahan = Lahan::create([...$validated,
|
||||
'foto' => $foto && count($foto) > 0 ? json_encode($foto) : null,
|
||||
'nama' => 'Lahan ' . $komoditas->nama . ' #' . ($lahanCount + 1),
|
||||
'uid' => 'LHN-' . $petani->uid . '-' . $lahanUid,
|
||||
'petani_id' => $petaniId,
|
||||
@@ -109,9 +243,9 @@ class PetaniLahanController extends Controller
|
||||
'updated_by' => auth()->id()]
|
||||
);
|
||||
|
||||
if ($lahan) {
|
||||
$data = collect(range(1, $lahan->jumlah_tanaman))->map(function ($i) use ($lahan, $komoditas, $lahanUid) {
|
||||
return [
|
||||
if ($lahan && $lahan->jumlah_tanaman > 0) {
|
||||
$data = collect(range(1, $lahan->jumlah_tanaman))->map(function ($i) use ($lahan, $komoditas, $lahanUid, $autoPestDiseaseData, $tanamanHasPestDiseaseColumns) {
|
||||
$row = [
|
||||
'lahan_id' => $lahan->id,
|
||||
'uid' => 'TNM-' . $lahanUid . '-' . strtoupper(Str::random(10)),
|
||||
'komoditas_id' => $lahan->komoditas_id,
|
||||
@@ -129,14 +263,31 @@ class PetaniLahanController extends Controller
|
||||
'created_at' => now(),
|
||||
'updated_at' => now(),
|
||||
];
|
||||
|
||||
if ($tanamanHasPestDiseaseColumns) {
|
||||
$row['jenis_hama'] = json_encode($autoPestDiseaseData['jenis_hama'] ?? []);
|
||||
$row['jenis_penyakit'] = json_encode($autoPestDiseaseData['jenis_penyakit'] ?? []);
|
||||
}
|
||||
|
||||
return $row;
|
||||
});
|
||||
|
||||
$data->chunk(500)->each(function ($chunk) {
|
||||
Tanaman::insert($chunk->toArray());
|
||||
});
|
||||
|
||||
return redirect()->route('petani.lahan-tanaman.index', $petaniId)->with('success', 'Lahan berhasil ditambahkan.');
|
||||
if ($request->ajax()) {
|
||||
return response()->json([
|
||||
'success' => true,
|
||||
'redirect' => route('petani.lahan-tanaman.edit', [$petaniId, $lahan->id]),
|
||||
'message' => 'Lahan berhasil ditambahkan.'
|
||||
]);
|
||||
}
|
||||
|
||||
return redirect()->route('petani.lahan-tanaman.edit', [$petaniId, $lahan->id])->with('success', 'Lahan berhasil ditambahkan.');
|
||||
}
|
||||
|
||||
return redirect()->route('petani.lahan-tanaman.edit', [$petaniId, $lahan->id])->with('success', 'Lahan berhasil ditambahkan.');
|
||||
}
|
||||
|
||||
public function show(string $petaniId, string $id)
|
||||
@@ -167,14 +318,19 @@ class PetaniLahanController extends Controller
|
||||
$lahan = Lahan::where('petani_id', $petaniId)
|
||||
->orderBy('id', 'asc')
|
||||
->get();
|
||||
|
||||
|
||||
$lahanSelected = Lahan::where('petani_id', $petaniId)->findOrFail($id);
|
||||
|
||||
$komoditas = Komoditas::all();
|
||||
$tanamanPenaung = JenisTanaman::all();
|
||||
$autoPestDiseaseData = $this->autoPestDiseaseData($petaniId);
|
||||
$jenisHamaOtomatis = $autoPestDiseaseData['jenis_hama'];
|
||||
$jenisPenyakitOtomatis = $autoPestDiseaseData['jenis_penyakit'];
|
||||
|
||||
$provinsi = Provinsi::orderBy('kode', 'asc')->get();
|
||||
|
||||
return view('produktivitas.petani.lahan.edit', compact('lahan', 'lahanSelected', 'petani', 'komoditas', 'provinsi'));
|
||||
return view('produktivitas.petani.lahan.edit', compact('lahan', 'lahanSelected', 'petani', 'komoditas', 'provinsi', 'tanamanPenaung', 'jenisHamaOtomatis', 'jenisPenyakitOtomatis'));
|
||||
}
|
||||
|
||||
public function update(Request $request, string $petaniId, string $id)
|
||||
@@ -186,36 +342,62 @@ class PetaniLahanController extends Controller
|
||||
$petani = Petani::findOrFail($petaniId);
|
||||
$lahan = Lahan::where('petani_id', $petaniId)->findOrFail($id);
|
||||
|
||||
$validated = $request->validate([
|
||||
'nama' => ['nullable', 'string', 'max:255'],
|
||||
'status_kepemilikan' => ['nullable', 'string', 'max:255'],
|
||||
'profile_id' => ['nullable'],
|
||||
'petani_id' => ['nullable'],
|
||||
'keluarga_pengelola_id' => ['nullable'],
|
||||
'adat_pemilik_id' => ['nullable'],
|
||||
'desa_kelurahan_id' => ['nullable'],
|
||||
'luas_lahan' => ['required', 'numeric'],
|
||||
'path' => ['nullable', 'string'],
|
||||
'komoditas_id' => ['required', 'exists:master_komoditas,id'],
|
||||
'jenis_komoditas_id' => ['required', 'exists:jenis_komoditas,id'],
|
||||
'varietas_id' => ['nullable', 'exists:master_varietas,id'],
|
||||
'jumlah_tanaman' => ['required', 'numeric'],
|
||||
'umur_lahan' => ['required', 'numeric'],
|
||||
'umur_tanaman' => ['required', 'numeric'],
|
||||
'kondisi_tanaman' => ['required', 'string', new Enum(KondisiTanaman::class)],
|
||||
'serangan_hama' => ['nullable', 'string', new Enum(SeranganHama::class)],
|
||||
'penyakit_tanaman' => ['nullable', 'string', new Enum(PenyakitTanaman::class)],
|
||||
'keparahan_serangan' => ['nullable', 'string', new Enum(KeparahanSerangan::class)],
|
||||
]);
|
||||
$request->merge([
|
||||
'tanaman_penaung' => collect($request->tanaman_penaung)
|
||||
->map(fn ($nama) => Str::title($nama))
|
||||
->toArray()
|
||||
]);
|
||||
$validated = $this->validateLahan($request);
|
||||
$autoPestDiseaseData = $this->autoPestDiseaseData($petaniId);
|
||||
$lahanHasPestDiseaseColumns = $this->hasPestDiseaseColumns((new Lahan)->getTable());
|
||||
$tanamanHasPestDiseaseColumns = $this->hasPestDiseaseColumns((new Tanaman)->getTable());
|
||||
|
||||
if ($lahanHasPestDiseaseColumns) {
|
||||
$validated = array_merge($validated, $autoPestDiseaseData);
|
||||
}
|
||||
|
||||
$komoditas = Komoditas::where('id', $request->komoditas_id)->first();
|
||||
$tanamanCount = Tanaman::where('lahan_id', $lahan->id)->count();
|
||||
$lahanCount = Lahan::where('petani_id', $petaniId)->count();
|
||||
|
||||
$lahanCount = Lahan::where('petani_id', $petaniId)
|
||||
->count();
|
||||
$fotoLama = $lahan->foto ?? [];
|
||||
if (is_string($fotoLama)) {
|
||||
$fotoLama = json_decode($fotoLama, true);
|
||||
}
|
||||
if (!is_array($fotoLama)) {
|
||||
$fotoLama = [];
|
||||
}
|
||||
|
||||
if ($request->has('deleted_photos') && is_array($request->deleted_photos)) {
|
||||
foreach ($request->deleted_photos as $deletedPath) {
|
||||
|
||||
if (Storage::disk('public')->exists($deletedPath)) {
|
||||
Storage::disk('public')->delete($deletedPath);
|
||||
}
|
||||
|
||||
$fotoLama = array_filter($fotoLama, function($item) use ($deletedPath) {
|
||||
$currentPath = is_array($item) ? ($item['path'] ?? '') : $item;
|
||||
return $currentPath !== $deletedPath;
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
$fotoLama = array_values($fotoLama);
|
||||
|
||||
if ($request->hasFile('foto')) {
|
||||
foreach ($request->file('foto') as $file) {
|
||||
$path = $file->store('lahan', 'public');
|
||||
$fotoLama[] = [
|
||||
'path' => $path,
|
||||
'file' => $file->getClientOriginalName(),
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
unset($validated['foto']);
|
||||
|
||||
$lahan->update([...$validated,
|
||||
'nama' => 'Lahan ' . $komoditas->nama . ' #' . ($lahanCount + 1),
|
||||
'petani_id' => $petaniId,
|
||||
'foto' => count($fotoLama) > 0 ? json_encode($fotoLama) : null,
|
||||
'updated_by' => auth()->id()]
|
||||
);
|
||||
|
||||
@@ -223,9 +405,11 @@ class PetaniLahanController extends Controller
|
||||
$lahanUidParts = explode('LHN-', $lahanUid);
|
||||
$lahanUid = end($lahanUidParts);
|
||||
|
||||
if ($lahan) {
|
||||
$data = collect(range($lahanCount, $lahan->jumlah_tanaman))->map(function ($i) use ($lahan, $komoditas, $lahanUid) {
|
||||
return [
|
||||
$this->syncTanamanPenaung($request);
|
||||
|
||||
if ($lahan && $lahan->jumlah_tanaman > $tanamanCount) {
|
||||
$data = collect(range($tanamanCount + 1, $lahan->jumlah_tanaman))->map(function ($i) use ($lahan, $komoditas, $lahanUid, $autoPestDiseaseData, $tanamanHasPestDiseaseColumns) {
|
||||
$row = [
|
||||
'lahan_id' => $lahan->id,
|
||||
'komoditas_id' => $lahan->komoditas_id,
|
||||
'jenis_komoditas_id' => $lahan->jenis_komoditas_id,
|
||||
@@ -243,19 +427,56 @@ class PetaniLahanController extends Controller
|
||||
'created_at' => now(),
|
||||
'updated_at' => now(),
|
||||
];
|
||||
|
||||
if ($tanamanHasPestDiseaseColumns) {
|
||||
$row['jenis_hama'] = json_encode($autoPestDiseaseData['jenis_hama'] ?? []);
|
||||
$row['jenis_penyakit'] = json_encode($autoPestDiseaseData['jenis_penyakit'] ?? []);
|
||||
}
|
||||
|
||||
return $row;
|
||||
});
|
||||
|
||||
$data->chunk(500)->each(function ($chunk) {
|
||||
Tanaman::insert($chunk->toArray());
|
||||
});
|
||||
|
||||
return redirect()->route('petani.lahan-tanaman.index', $petaniId)->with('success', 'Lahan berhasil ditambahkan.');
|
||||
}
|
||||
|
||||
if ($tanamanHasPestDiseaseColumns) {
|
||||
$lahan->tanaman()->update([
|
||||
'jenis_hama' => json_encode($autoPestDiseaseData['jenis_hama'] ?? []),
|
||||
'jenis_penyakit' => json_encode($autoPestDiseaseData['jenis_penyakit'] ?? []),
|
||||
'updated_by' => auth()->id(),
|
||||
]);
|
||||
}
|
||||
|
||||
if ($request->ajax()) {
|
||||
return response()->json([
|
||||
'success' => true,
|
||||
'redirect' => route('petani.lahan-tanaman.edit', [$petaniId, $lahan->id]),
|
||||
'message' => 'Lahan berhasil diupdate.'
|
||||
]);
|
||||
}
|
||||
|
||||
return redirect()->route('petani.lahan-tanaman.edit', [$petaniId, $lahan->id])->with('success', 'Lahan berhasil diperbarui.');
|
||||
}
|
||||
|
||||
public function destroy(string $id)
|
||||
public function destroy(string $petaniId, string $id)
|
||||
{
|
||||
//
|
||||
if (!Gate::any(['super_admin', 'admin', 'fasilitator'])) {
|
||||
abort(403);
|
||||
}
|
||||
|
||||
$lahan = Lahan::findOrFail($id);
|
||||
$lahan->tanaman()->update([
|
||||
'deleted_by' => auth()->id()
|
||||
]);
|
||||
$lahan->tanaman()->delete();
|
||||
$lahan->update([
|
||||
'deleted_by' => auth()->id()
|
||||
]);
|
||||
$lahan->delete();
|
||||
|
||||
return redirect()->route('petani.lahan-tanaman.index', $petaniId)->with('success', 'Lahan berhasil dihapus.');
|
||||
}
|
||||
|
||||
public function summary(string $petaniId)
|
||||
|
||||
@@ -11,6 +11,9 @@ use Illuminate\Validation\Rules\Enum;
|
||||
|
||||
use App\Models\Pertanian\Petani;
|
||||
use App\Models\Pertanian\PraktikBudidaya;
|
||||
use App\Models\Pertanian\SurveyPanen;
|
||||
use App\Models\Pertanian\SurveyProduktivitas;
|
||||
use App\Models\Pertanian\Komoditas;
|
||||
|
||||
use App\Enums\PraktikBudidaya\TenagaKerja;
|
||||
use App\Enums\PraktikBudidaya\FrekuensiPemangkasanUtama;
|
||||
@@ -25,8 +28,15 @@ use App\Enums\PraktikBudidaya\FrekuensiSanitasiLahan;
|
||||
use App\Enums\PraktikBudidaya\PenangananSisaBuahRanting;
|
||||
use App\Enums\PraktikBudidaya\PenangananGulma;
|
||||
use App\Enums\PraktikBudidaya\KondisiPengelolaanAir;
|
||||
use App\Enums\PraktikBudidaya\KebutuhanAirPermusim;
|
||||
use App\Enums\PraktikBudidaya\KebutuhanAirPerMusim;
|
||||
use App\Enums\PraktikBudidaya\PemahamanManfaatKonservasi;
|
||||
use App\Enums\PraktikBudidaya\DasarPenentuanPanen;
|
||||
use App\Enums\PraktikBudidaya\Bulan;
|
||||
use App\Enums\PraktikBudidaya\PraktikSortasi;
|
||||
use App\Enums\PraktikBudidaya\CaraSortasi;
|
||||
use App\Enums\PraktikBudidaya\TingkatPanenReject;
|
||||
use App\Enums\PraktikBudidaya\TindakanPanenReject;
|
||||
use App\Enums\PraktikBudidaya\EstimasiKehilanganHasil;
|
||||
|
||||
class PraktikBudidayaController extends Controller
|
||||
{
|
||||
@@ -86,6 +96,11 @@ class PraktikBudidayaController extends Controller
|
||||
$title = 'Petani - Praktik Budidaya';
|
||||
$petani = Petani::findOrFail($petaniId);
|
||||
$praktikBudidaya = PraktikBudidaya::where('petani_id', $petaniId)->latest()->first();
|
||||
$surveyPanen = SurveyPanen:: where('petani_id', $petaniId)->latest()->first();
|
||||
|
||||
$komoditas = Komoditas::all();
|
||||
|
||||
$surveyProduktivitas = SurveyProduktivitas::where('petani_id', $petaniId)->get();
|
||||
|
||||
$teknikPemangkasan = $praktikBudidaya->teknik_pemangkasan ?? [];
|
||||
$teknikPemangkasanLainnya = collect($teknikPemangkasan)
|
||||
@@ -95,7 +110,7 @@ class PraktikBudidayaController extends Controller
|
||||
$alasanTidakPenyerbukanLainnya = collect(explode(', ', $alasanTidakPenyerbukan))
|
||||
->first(fn ($item) => !in_array($item, $defaultAlasanTidakPenyerbukan));
|
||||
|
||||
$frekuensiPemupukan = $praktikBudidaya->frekuensi_pemupukan ?? '';
|
||||
$frekuensiPemupukan = $praktikBudidaya->frekuensi_pemberian_pupuk ?? '';
|
||||
$frekuensiPemupukanLainnya = collect(explode(', ', $frekuensiPemupukan))
|
||||
->first(fn ($item) => !in_array($item, $defaultFrekuensiPemupukan));
|
||||
|
||||
@@ -107,8 +122,8 @@ class PraktikBudidayaController extends Controller
|
||||
$caraPemberianPupukLainnya = collect(explode(', ', $caraPemberianPupuk))
|
||||
->first(fn ($item) => !in_array($item, $defaultCaraPemberianPupuk));
|
||||
|
||||
$sumberAir = $praktikBudidaya->sumber_air ?? '';
|
||||
$sumberAirLainnya = collect(explode(', ', $sumberAir))
|
||||
$sumberAir = $praktikBudidaya->sumber_air ?? [];
|
||||
$sumberAirLainnya = collect($sumberAir)
|
||||
->first(fn ($item) => !in_array($item, $defaultSumberAir));
|
||||
|
||||
$sistemIrigasi = $praktikBudidaya->sistem_irigasi ?? '';
|
||||
@@ -116,7 +131,7 @@ class PraktikBudidayaController extends Controller
|
||||
->first(fn ($item) => !in_array($item, $defaultSistemIrigasi));
|
||||
|
||||
if (!empty($praktikBudidaya)) {
|
||||
return view('produktivitas.petani.praktik-budidaya.edit', compact('title', 'petani', 'praktikBudidaya', 'teknikPemangkasanLainnya', 'alasanTidakPenyerbukanLainnya', 'frekuensiPemupukanLainnya', 'waktuPemberianPupukLainnya', 'caraPemberianPupukLainnya', 'sumberAirLainnya', 'sistemIrigasiLainnya'));
|
||||
return view('produktivitas.petani.praktik-budidaya.edit', compact('title', 'petani', 'praktikBudidaya', 'surveyPanen', 'komoditas', 'surveyProduktivitas', 'teknikPemangkasanLainnya', 'alasanTidakPenyerbukanLainnya', 'frekuensiPemupukanLainnya', 'waktuPemberianPupukLainnya', 'caraPemberianPupukLainnya', 'sumberAirLainnya', 'sistemIrigasiLainnya'));
|
||||
}
|
||||
|
||||
return view('produktivitas.petani.praktik-budidaya.add', compact('title', 'petani', 'teknikPemangkasanLainnya', 'alasanTidakPenyerbukanLainnya', 'frekuensiPemupukanLainnya', 'waktuPemberianPupukLainnya', 'caraPemberianPupukLainnya'));
|
||||
@@ -163,9 +178,15 @@ class PraktikBudidayaController extends Controller
|
||||
|
||||
$teknik_pemangkasan = array_values($teknik_pemangkasan);
|
||||
|
||||
if ((int) ($validatedData['frekuensi_pemangkasan_komoditas_utama'] ?? 0) === FrekuensiPemangkasanUtama::TIDAK_PERNAH->value) {
|
||||
$teknik_pemangkasan = [];
|
||||
}
|
||||
|
||||
$petani = Petani::findOrFail($petaniId);
|
||||
|
||||
$praktikBudidaya = $petani->praktik_budidaya()->create([
|
||||
$pemupukanTidakPernah = (int) ($validatedData['pemberian_pupuk'] ?? 0) === PemberianPupuk::TIDAK_PERNAH->value;
|
||||
|
||||
$praktikBudidaya = $petani->praktikBudidaya()->create([
|
||||
'petani_id' => $petani->id,
|
||||
'uid' => 'PB-' . strtoupper(Str::random(10)),
|
||||
'tenaga_kerja' => $validatedData['tenaga_kerja'],
|
||||
@@ -178,12 +199,40 @@ class PraktikBudidayaController extends Controller
|
||||
'deskripsi_penyerbukan_manual' => $validatedData['alasan_tidak_penyerbukan'] ?? null,
|
||||
'tingkat_keberhasilan_penyerbukan' => $validatedData['tingkat_keberhasilan_penyerbukan'] ?? null,
|
||||
'pemberian_pupuk' => $validatedData['pemberian_pupuk'] ?? null,
|
||||
'jenis_pupuk' => $validatedData['jenis_pupuk'] ?? null,
|
||||
'frekuensi_pemberian_pupuk' => ($validatedData['frekuensi_pemupukan'] ?? null) === 'Lainnya' ? ($validatedData['frekuensi_pemupukan_lainnya'] ?? null) : ($validatedData['frekuensi_pemupukan'] ?? null),
|
||||
'estimasi_dosis_pupuk_organik' => $validatedData['estimasi_dosis_pupuk_organik'] ?? null,
|
||||
'estimasi_dosis_pupuk_anorganik' => $validatedData['estimasi_dosis_pupuk_anorganik'] ?? null,
|
||||
'waktu_pemberian_pupuk' => ($validatedData['waktu_pemberian_pupuk'] ?? null) === 'Lainnya' ? ($validatedData['waktu_pemberian_pupuk_lainnya'] ?? null) : ($validatedData['waktu_pemberian_pupuk'] ?? null),
|
||||
'cara_pemberian_pupuk' => ($validatedData['cara_pemberian_pupuk'] ?? null) === 'Lainnya' ? ($validatedData['cara_pemberian_pupuk_lainnya'] ?? null) : ($validatedData['cara_pemberian_pupuk'] ?? null),
|
||||
'jenis_pupuk' => $pemupukanTidakPernah ? null : ($validatedData['jenis_pupuk'] ?? null),
|
||||
'frekuensi_pemberian_pupuk' => $pemupukanTidakPernah ? null : (($validatedData['frekuensi_pemupukan'] ?? null) === 'Lainnya' ? ($validatedData['frekuensi_pemupukan_lainnya'] ?? null) : ($validatedData['frekuensi_pemupukan'] ?? null)),
|
||||
'estimasi_dosis_pupuk_organik' => $pemupukanTidakPernah ? null : ($validatedData['estimasi_dosis_pupuk_organik'] ?? null),
|
||||
'estimasi_dosis_pupuk_anorganik' => $pemupukanTidakPernah ? null : ($validatedData['estimasi_dosis_pupuk_anorganik'] ?? null),
|
||||
'waktu_pemberian_pupuk' => $pemupukanTidakPernah ? null : (($validatedData['waktu_pemberian_pupuk'] ?? null) === 'Lainnya' ? ($validatedData['waktu_pemberian_pupuk_lainnya'] ?? null) : ($validatedData['waktu_pemberian_pupuk'] ?? null)),
|
||||
'cara_pemberian_pupuk' => $pemupukanTidakPernah ? null : (($validatedData['cara_pemberian_pupuk'] ?? null) === 'Lainnya' ? ($validatedData['cara_pemberian_pupuk_lainnya'] ?? null) : ($validatedData['cara_pemberian_pupuk'] ?? null)),
|
||||
'created_by' => auth()->id(),
|
||||
'updated_by' => auth()->id(),
|
||||
], [
|
||||
'string' => ':attribute harus berupa teks.',
|
||||
'integer' => ':attribute harus berupa angka.',
|
||||
'array' => ':attribute harus berupa pilihan.',
|
||||
'enum' => 'Pilihan :attribute tidak valid.',
|
||||
], [
|
||||
'tenaga_kerja' => 'tenaga kerja',
|
||||
'frekuensi_pemangkasan_komoditas_utama' => 'frekuensi pemangkasan komoditas utama',
|
||||
'teknik_pemangkasan' => 'teknik pemangkasan',
|
||||
'teknik_pemangkasan_lainnya' => 'teknik pemangkasan lainnya',
|
||||
'frekuensi_pemangkasan_pohon_penaung' => 'frekuensi pemangkasan pohon penaung',
|
||||
|
||||
'penyerbukan_manual' => 'penyerbukan manual',
|
||||
'alasan_tidak_penyerbukan' => 'alasan tidak melakukan penyerbukan manual',
|
||||
'alasan_tidak_penyerbukan_lainnya' => 'alasan lainnya tidak melakukan penyerbukan manual',
|
||||
'tingkat_keberhasilan_penyerbukan' => 'tingkat keberhasilan penyerbukan',
|
||||
'pemberian_pupuk' => 'pemberian pupuk',
|
||||
'jenis_pupuk' => 'jenis pupuk',
|
||||
'frekuensi_pemupukan' => 'frekuensi pemupukan',
|
||||
'frekuensi_pemupukan_lainnya' => 'frekuensi pemupukan lainnya',
|
||||
'estimasi_dosis_pupuk_organik' => 'estimasi dosis pupuk organik',
|
||||
'estimasi_dosis_pupuk_anorganik' => 'estimasi dosis pupuk anorganik',
|
||||
'waktu_pemberian_pupuk' => 'waktu pemberian pupuk',
|
||||
'waktu_pemberian_pupuk_lainnya' => 'waktu pemberian pupuk lainnya',
|
||||
'cara_pemberian_pupuk' => 'cara pemberian pupuk',
|
||||
'cara_pemberian_pupuk_lainnya' => 'cara pemberian pupuk lainnya',
|
||||
]);
|
||||
|
||||
return redirect()->route('petani.praktik-budidaya.edit', [$petani->id , $praktikBudidaya->id])
|
||||
@@ -246,6 +295,11 @@ class PraktikBudidayaController extends Controller
|
||||
$title = 'Petani - Praktik Budidaya';
|
||||
$petani = Petani::findOrFail($petaniId);
|
||||
$praktikBudidaya = PraktikBudidaya::where('petani_id', $petaniId)->where('id', $praktikBudidayaId)->latest()->first();
|
||||
$surveyPanen = SurveyPanen:: where('petani_id', $petaniId)->latest()->first();
|
||||
|
||||
$komoditas = Komoditas::all();
|
||||
|
||||
$surveyProduktivitas = SurveyProduktivitas::where('petani_id', $petaniId)->get();
|
||||
|
||||
$teknikPemangkasan = $praktikBudidaya->teknik_pemangkasan ?? [];
|
||||
$teknikPemangkasanLainnya = collect($teknikPemangkasan)
|
||||
@@ -255,7 +309,7 @@ class PraktikBudidayaController extends Controller
|
||||
$alasanTidakPenyerbukanLainnya = collect(explode(', ', $alasanTidakPenyerbukan))
|
||||
->first(fn ($item) => !in_array($item, $defaultAlasanTidakPenyerbukan));
|
||||
|
||||
$frekuensiPemupukan = $praktikBudidaya->frekuensi_pemupukan ?? '';
|
||||
$frekuensiPemupukan = $praktikBudidaya->frekuensi_pemberian_pupuk ?? '';
|
||||
$frekuensiPemupukanLainnya = collect(explode(', ', $frekuensiPemupukan))
|
||||
->first(fn ($item) => !in_array($item, $defaultFrekuensiPemupukan));
|
||||
|
||||
@@ -268,14 +322,14 @@ class PraktikBudidayaController extends Controller
|
||||
->first(fn ($item) => !in_array($item, $defaultCaraPemberianPupuk));
|
||||
|
||||
$sumberAir = $praktikBudidaya->sumber_air ?? '';
|
||||
$sumberAirLainnya = collect(explode(', ', $sumberAir))
|
||||
$sumberAirLainnya = collect($sumberAir)
|
||||
->first(fn ($item) => !in_array($item, $defaultSumberAir));
|
||||
|
||||
$sistemIrigasi = $praktikBudidaya->sistem_irigasi ?? '';
|
||||
$sistemIrigasiLainnya = collect(explode(', ', $sistemIrigasi))
|
||||
->first(fn ($item) => !in_array($item, $defaultSistemIrigasi));
|
||||
|
||||
return view('produktivitas.petani.praktik-budidaya.edit', compact('title', 'petani', 'praktikBudidaya', 'teknikPemangkasanLainnya', 'alasanTidakPenyerbukanLainnya', 'frekuensiPemupukanLainnya', 'waktuPemberianPupukLainnya', 'caraPemberianPupukLainnya', 'sumberAirLainnya', 'sistemIrigasiLainnya'));
|
||||
return view('produktivitas.petani.praktik-budidaya.edit', compact('title', 'petani', 'praktikBudidaya', 'surveyPanen', 'komoditas', 'surveyProduktivitas', 'teknikPemangkasanLainnya', 'alasanTidakPenyerbukanLainnya', 'frekuensiPemupukanLainnya', 'waktuPemberianPupukLainnya', 'caraPemberianPupukLainnya', 'sumberAirLainnya', 'sistemIrigasiLainnya'));
|
||||
}
|
||||
|
||||
public function update($petaniId, $praktikBudidayaId, Request $request)
|
||||
@@ -284,8 +338,6 @@ class PraktikBudidayaController extends Controller
|
||||
abort(403);
|
||||
}
|
||||
|
||||
// dd($request->all());
|
||||
|
||||
$praktikBudidaya = PraktikBudidaya::where('petani_id', $petaniId)
|
||||
->where('id', $praktikBudidayaId)
|
||||
->firstOrFail();
|
||||
@@ -299,15 +351,15 @@ class PraktikBudidayaController extends Controller
|
||||
'teknik_pemangkasan' => ['nullable', 'array'],
|
||||
'teknik_pemangkasan.*' => ['string'],
|
||||
'teknik_pemangkasan_lainnya' => ['nullable', 'string'],
|
||||
'frekuensi_pemangkasan_pohon_penaung' => ['nullable', 'integer', new Enum(FrekuensiPemangkasanPendamping::class)],
|
||||
'penyerbukan_manual' => ['nullable', 'integer', new Enum(PenyerbukanManual::class)],
|
||||
'frekuensi_pemangkasan_pohon_penaung' => ['nullable', 'string', new Enum(FrekuensiPemangkasanPendamping::class)],
|
||||
'penyerbukan_manual' => ['nullable', 'string', new Enum(PenyerbukanManual::class)],
|
||||
'alasan_tidak_penyerbukan' => ['nullable', 'string'],
|
||||
'alasan_tidak_penyerbukan_lainnya' => ['nullable', 'string'],
|
||||
'tingkat_keberhasilan_penyerbukan' => ['nullable', 'string'],
|
||||
|
||||
// 2.4 Praktik Pemupukan
|
||||
'pemberian_pupuk' => ['nullable', 'integer', new Enum(PemberianPupuk::class)],
|
||||
'jenis_pupuk' => ['nullable', 'integer', new Enum(JenisPupuk::class)],
|
||||
'jenis_pupuk' => ['nullable', 'string', new Enum(JenisPupuk::class)],
|
||||
|
||||
'frekuensi_pemupukan' => ['nullable', 'string'],
|
||||
'frekuensi_pemupukan_lainnya' => ['nullable', 'string'],
|
||||
@@ -333,7 +385,8 @@ class PraktikBudidayaController extends Controller
|
||||
|
||||
'metode_paling_sering_dilakukan' => ['nullable', 'string'],
|
||||
|
||||
'volume_obat_obatan_permusim' => ['nullable', 'numeric'],
|
||||
'volume_obat_obatan_padat' => ['nullable', 'numeric'],
|
||||
'volume_obat_obatan_cair' => ['nullable', 'numeric'],
|
||||
|
||||
// 2.6 Sanitasi Kebun
|
||||
|
||||
@@ -346,21 +399,155 @@ class PraktikBudidayaController extends Controller
|
||||
|
||||
'kondisi_pengelolaan_air_irigasi' => ['nullable', 'integer', new Enum(KondisiPengelolaanAir::class)],
|
||||
|
||||
'sumber_air' => ['nullable', 'string'],
|
||||
'sumber_air' => ['nullable', 'array'],
|
||||
'sumber_air_lainnya' => ['nullable', 'string'],
|
||||
|
||||
'sistem_irigasi' => ['nullable', 'string'],
|
||||
'sistem_irigasi_lainnya' => ['nullable', 'string'],
|
||||
|
||||
'kebutuhan_air_permusim' => ['nullable', 'string', new Enum(KebutuhanAirPermusim::class)],
|
||||
'kebutuhan_air_permusim' => ['nullable', 'string', new Enum(KebutuhanAirPerMusim::class)],
|
||||
|
||||
'kebiasaan_konservasi_tanah' => ['nullable', 'array'],
|
||||
'kebiasaan_konservasi_tanah.*' => ['string'],
|
||||
|
||||
'pemahaman_manfaat_konservasi' => ['nullable', 'string', new Enum(PemahamanManfaatKonservasi::class)],
|
||||
]);
|
||||
|
||||
$data = [];
|
||||
'upah_tenaga_kerja' => ['nullable', 'numeric'],
|
||||
'biaya_bibit' => ['nullable', 'numeric'],
|
||||
'biaya_pupuk' => ['nullable', 'numeric'],
|
||||
'biaya_pestisida' => ['nullable', 'numeric'],
|
||||
'biaya_sewa_alat' => ['nullable', 'numeric'],
|
||||
'biaya_penyediaan_air' => ['nullable', 'numeric'],
|
||||
'biaya_lainnya' => ['nullable', 'numeric'],
|
||||
'total_estimasi_biaya_produksi' => ['nullable', 'numeric'],
|
||||
|
||||
'dasar_penentuan_panen' => ['nullable', 'integer', new Enum(DasarPenentuanPanen::class)],
|
||||
'frekuensi_panen_pertahun' => ['nullable', 'integer'],
|
||||
'bulan_panen_utama' => ['nullable', 'string', new Enum(Bulan::class)],
|
||||
'hasil_komoditas_utama_permusim' => ['nullable', 'numeric'],
|
||||
'hasil_komoditas_lainnya_permusim' => ['nullable', 'numeric'],
|
||||
'disimpan_untuk_sendiri' => ['nullable', 'boolean'],
|
||||
'hasil_panen_disimpan' => ['nullable', 'numeric'],
|
||||
'tujuan_disimpan' => ['nullable', 'string'],
|
||||
|
||||
'praktik_sortasi' => ['nullable', 'integer', new Enum(PraktikSortasi::class)],
|
||||
'bentuk_sortasi' => ['nullable', 'string', new Enum(CaraSortasi::class)],
|
||||
'tingkat_reject' => ['nullable', 'integer', new Enum(TingkatPanenReject::class)],
|
||||
'hasil_panen_reject' => ['nullable', 'numeric'],
|
||||
'tindakan_hasil_reject' => ['nullable', 'string', new Enum(TindakanPanenReject::class)],
|
||||
'upah_tenaga_panen' => ['nullable', 'numeric'],
|
||||
'biaya_pengangkutan' => ['nullable', 'numeric'],
|
||||
'biaya_wadah_kemasan' => ['nullable', 'numeric'],
|
||||
'biaya_sewa_alat_panen' => ['nullable', 'numeric'],
|
||||
'biaya_panen_lainnya' => ['nullable', 'numeric'],
|
||||
'total_estimasi_biaya_panen' => ['nullable', 'numeric'],
|
||||
|
||||
'estimasi_kehilangan_akibat_opt' => ['nullable', 'string', new Enum(EstimasiKehilanganHasil::class)],
|
||||
'estimasi_kehilangan_akibat_hama' => ['nullable', 'string', new Enum(EstimasiKehilanganHasil::class)],
|
||||
], [
|
||||
'string' => ':attribute harus berupa teks.',
|
||||
'integer' => ':attribute harus berupa angka.',
|
||||
'numeric' => ':attribute harus berupa angka.',
|
||||
'array' => ':attribute harus berupa daftar pilihan.',
|
||||
'boolean' => ':attribute harus bernilai ya atau tidak.',
|
||||
'enum' => 'Pilihan :attribute tidak valid.',
|
||||
|
||||
'teknik_pemangkasan.*.string' => 'Setiap pilihan teknik pemangkasan harus berupa teks.',
|
||||
'kebiasaan_konservasi_tanah.*.string' => 'Setiap pilihan kebiasaan konservasi tanah harus berupa teks.',
|
||||
], [
|
||||
// 2.2 Persiapan Lahan & Penanaman
|
||||
'tenaga_kerja' => 'tenaga kerja',
|
||||
|
||||
// 2.3 Praktik Pemangkasan & Penyerbukan
|
||||
'frekuensi_pemangkasan_komoditas_utama' => 'frekuensi pemangkasan komoditas utama',
|
||||
'teknik_pemangkasan' => 'teknik pemangkasan',
|
||||
'teknik_pemangkasan.*' => 'pilihan teknik pemangkasan',
|
||||
'teknik_pemangkasan_lainnya' => 'teknik pemangkasan lainnya',
|
||||
'frekuensi_pemangkasan_pohon_penaung' => 'frekuensi pemangkasan pohon penaung',
|
||||
'penyerbukan_manual' => 'penyerbukan manual',
|
||||
'alasan_tidak_penyerbukan' => 'alasan tidak melakukan penyerbukan manual',
|
||||
'alasan_tidak_penyerbukan_lainnya' => 'alasan lainnya tidak melakukan penyerbukan manual',
|
||||
'tingkat_keberhasilan_penyerbukan' => 'tingkat keberhasilan penyerbukan',
|
||||
|
||||
// 2.4 Praktik Pemupukan
|
||||
'pemberian_pupuk' => 'pemberian pupuk',
|
||||
'jenis_pupuk' => 'jenis pupuk',
|
||||
'frekuensi_pemupukan' => 'frekuensi pemupukan',
|
||||
'frekuensi_pemupukan_lainnya' => 'frekuensi pemupukan lainnya',
|
||||
'estimasi_dosis_pupuk_organik' => 'estimasi dosis pupuk organik',
|
||||
'estimasi_dosis_pupuk_anorganik' => 'estimasi dosis pupuk anorganik',
|
||||
'waktu_pemberian_pupuk' => 'waktu pemberian pupuk',
|
||||
'waktu_pemberian_pupuk_lainnya' => 'waktu pemberian pupuk lainnya',
|
||||
'cara_pemberian_pupuk' => 'cara pemberian pupuk',
|
||||
'cara_pemberian_pupuk_lainnya' => 'cara pemberian pupuk lainnya',
|
||||
|
||||
// 2.5 Pengendalian OPT
|
||||
'metode_penanganan_hama_penyakit' => 'metode penanganan hama dan penyakit',
|
||||
'jenis_hama' => 'jenis hama',
|
||||
'jenis_penyakit' => 'jenis penyakit',
|
||||
'intensitas_serangan' => 'intensitas serangan',
|
||||
'waktu_kemunculan_terparah' => 'waktu kemunculan terparah',
|
||||
'metode_paling_sering_dilakukan' => 'metode yang paling sering dilakukan',
|
||||
'volume_obat_obatan_padat' => 'volume obat-obatan padat per musim',
|
||||
'volume_obat_obatan_cair' => 'volume obat-obatan cair per musim',
|
||||
|
||||
// 2.6 Sanitasi Kebun
|
||||
'frekuensi_sanitasi_lahan' => 'frekuensi sanitasi lahan',
|
||||
'penanganan_sisa_buah_ranting' => 'penanganan sisa buah dan ranting',
|
||||
'penanganan_gulma' => 'penanganan gulma',
|
||||
|
||||
// 2.7 Pengelolaan Air & Irigasi
|
||||
'kondisi_pengelolaan_air_irigasi' => 'kondisi pengelolaan air dan irigasi',
|
||||
'sumber_air' => 'sumber air',
|
||||
'sumber_air_lainnya' => 'sumber air lainnya',
|
||||
'sistem_irigasi' => 'sistem irigasi',
|
||||
'sistem_irigasi_lainnya' => 'sistem irigasi lainnya',
|
||||
'kebutuhan_air_permusim' => 'kebutuhan air per musim',
|
||||
'kebiasaan_konservasi_tanah' => 'kebiasaan konservasi tanah',
|
||||
'kebiasaan_konservasi_tanah.*' => 'pilihan kebiasaan konservasi tanah',
|
||||
'pemahaman_manfaat_konservasi' => 'pemahaman manfaat konservasi',
|
||||
|
||||
// Biaya Produksi
|
||||
'upah_tenaga_kerja' => 'upah tenaga kerja',
|
||||
'biaya_bibit' => 'biaya bibit',
|
||||
'biaya_pupuk' => 'biaya pupuk',
|
||||
'biaya_pestisida' => 'biaya pestisida',
|
||||
'biaya_sewa_alat' => 'biaya sewa alat',
|
||||
'biaya_penyediaan_air' => 'biaya penyediaan air',
|
||||
'biaya_lainnya' => 'biaya lainnya',
|
||||
'total_estimasi_biaya_produksi' => 'total estimasi biaya produksi',
|
||||
|
||||
// Panen
|
||||
'dasar_penentuan_panen' => 'dasar penentuan panen',
|
||||
'frekuensi_panen_pertahun' => 'frekuensi panen per tahun',
|
||||
'bulan_panen_utama' => 'bulan panen utama',
|
||||
'hasil_komoditas_utama_permusim' => 'hasil komoditas utama per musim',
|
||||
'hasil_komoditas_lainnya_permusim' => 'hasil komoditas lainnya per musim',
|
||||
'disimpan_untuk_sendiri' => 'disimpan untuk sendiri',
|
||||
'hasil_panen_disimpan' => 'hasil panen yang disimpan',
|
||||
'tujuan_disimpan' => 'tujuan disimpan',
|
||||
|
||||
// Sortasi & Reject
|
||||
'praktik_sortasi' => 'praktik sortasi',
|
||||
'bentuk_sortasi' => 'bentuk sortasi',
|
||||
'tingkat_reject' => 'tingkat reject',
|
||||
'hasil_panen_reject' => 'hasil panen reject',
|
||||
'tindakan_hasil_reject' => 'tindakan terhadap hasil reject',
|
||||
|
||||
// Biaya Panen
|
||||
'upah_tenaga_panen' => 'upah tenaga panen',
|
||||
'biaya_pengangkutan' => 'biaya pengangkutan',
|
||||
'biaya_wadah_kemasan' => 'biaya wadah kemasan',
|
||||
'biaya_sewa_alat_panen' => 'biaya sewa alat panen',
|
||||
'biaya_panen_lainnya' => 'biaya panen lainnya',
|
||||
'total_estimasi_biaya_panen' => 'total estimasi biaya panen',
|
||||
|
||||
// Kehilangan Hasil
|
||||
'estimasi_kehilangan_akibat_opt' => 'estimasi kehilangan akibat OPT',
|
||||
'estimasi_kehilangan_akibat_hama' => 'estimasi kehilangan akibat hama',
|
||||
]);
|
||||
$dataPraktikBudidaya = [];
|
||||
$dataSurveyPanen = [];
|
||||
|
||||
$petani = Petani::findOrFail($petaniId);
|
||||
|
||||
@@ -372,40 +559,57 @@ class PraktikBudidayaController extends Controller
|
||||
$teknik_pemangkasan[] = $request->teknik_pemangkasan_lainnya;
|
||||
}
|
||||
}
|
||||
$data = [
|
||||
$teknikPemangkasan = array_values($teknik_pemangkasan);
|
||||
|
||||
if ((int) ($validatedData['frekuensi_pemangkasan_komoditas_utama'] ?? 0) === FrekuensiPemangkasanUtama::TIDAK_PERNAH->value) {
|
||||
$teknikPemangkasan = [];
|
||||
}
|
||||
|
||||
$pemupukanTidakPernah = (int) ($validatedData['pemberian_pupuk'] ?? 0) === PemberianPupuk::TIDAK_PERNAH->value;
|
||||
|
||||
$dataPraktikBudidaya = [
|
||||
'tenaga_kerja' => $validatedData['tenaga_kerja'],
|
||||
'frekuensi_pemangkasan_utama' => $validatedData['frekuensi_pemangkasan_komoditas_utama'],
|
||||
|
||||
'teknik_pemangkasan' => array_values($teknikPemangkasan),
|
||||
'teknik_pemangkasan' => $teknikPemangkasan,
|
||||
|
||||
'frekuensi_pemangkasan_penaung' => $validatedData['frekuensi_pemangkasan_pohon_penaung'],
|
||||
'penyerbukan_manual' => $validatedData['penyerbukan_manual'] ?? null,
|
||||
'deskripsi_penyerbukan_manual' => $validatedData['alasan_tidak_penyerbukan'] ?? null,
|
||||
'tingkat_keberhasilan_penyerbukan' => $validatedData['tingkat_keberhasilan_penyerbukan'] ?? null,
|
||||
'pemberian_pupuk' => $validatedData['pemberian_pupuk'] ?? null,
|
||||
'jenis_pupuk' => $validatedData['jenis_pupuk'] ?? null,
|
||||
'frekuensi_pemberian_pupuk' => ($validatedData['frekuensi_pemupukan'] ?? null) === 'Lainnya' ? ($validatedData['frekuensi_pemupukan_lainnya'] ?? null) : ($validatedData['frekuensi_pemupukan'] ?? null),
|
||||
'estimasi_dosis_pupuk_organik' => $validatedData['estimasi_dosis_pupuk_organik'] ?? null,
|
||||
'estimasi_dosis_pupuk_anorganik' => $validatedData['estimasi_dosis_pupuk_anorganik'] ?? null,
|
||||
'waktu_pemberian_pupuk' => ($validatedData['waktu_pemberian_pupuk'] ?? null) === 'Lainnya' ? ($validatedData['waktu_pemberian_pupuk_lainnya'] ?? null) : ($validatedData['waktu_pemberian_pupuk'] ?? null),
|
||||
'cara_pemberian_pupuk' => ($validatedData['cara_pemberian_pupuk'] ?? null) === 'Lainnya' ? ($validatedData['cara_pemberian_pupuk_lainnya'] ?? null) : ($validatedData['cara_pemberian_pupuk'] ?? null),
|
||||
'jenis_pupuk' => $pemupukanTidakPernah ? null : ($validatedData['jenis_pupuk'] ?? null),
|
||||
'frekuensi_pemberian_pupuk' => $pemupukanTidakPernah ? null : (($validatedData['frekuensi_pemupukan'] ?? null) === 'Lainnya' ? ($validatedData['frekuensi_pemupukan_lainnya'] ?? null) : ($validatedData['frekuensi_pemupukan'] ?? null)),
|
||||
'estimasi_dosis_pupuk_organik' => $pemupukanTidakPernah ? null : ($validatedData['estimasi_dosis_pupuk_organik'] ?? null),
|
||||
'estimasi_dosis_pupuk_anorganik' => $pemupukanTidakPernah ? null : ($validatedData['estimasi_dosis_pupuk_anorganik'] ?? null),
|
||||
'waktu_pemberian_pupuk' => $pemupukanTidakPernah ? null : (($validatedData['waktu_pemberian_pupuk'] ?? null) === 'Lainnya' ? ($validatedData['waktu_pemberian_pupuk_lainnya'] ?? null) : ($validatedData['waktu_pemberian_pupuk'] ?? null)),
|
||||
'cara_pemberian_pupuk' => $pemupukanTidakPernah ? null : (($validatedData['cara_pemberian_pupuk'] ?? null) === 'Lainnya' ? ($validatedData['cara_pemberian_pupuk_lainnya'] ?? null) : ($validatedData['cara_pemberian_pupuk'] ?? null)),
|
||||
];
|
||||
}
|
||||
|
||||
if ($request->has('metode_penanganan_hama_penyakit')) {
|
||||
$data = [
|
||||
$sumber_air = $request->sumber_air ?? [];
|
||||
if (($key = array_search('Lainnya', $sumber_air)) !== false) {
|
||||
unset($sumber_air[$key]);
|
||||
if (!empty($request->sumber_air_lainnya)) {
|
||||
$sumber_air[] = $request->sumber_air_lainnya;
|
||||
}
|
||||
}
|
||||
$sumberAir = array_values($sumber_air);
|
||||
$dataPraktikBudidaya = [
|
||||
'metode_penanganan_opt' => $validatedData['metode_penanganan_hama_penyakit'] ?? null,
|
||||
'jenis_hama' => $validatedData['jenis_hama'] ?? [],
|
||||
'jenis_penyakit' => $validatedData['jenis_penyakit'] ?? [],
|
||||
'intensitas_serangan' => $validatedData['intensitas_serangan'] ?? null,
|
||||
'waktu_kemunculan_terparah' => $validatedData['waktu_kemunculan_terparah'] ?? null,
|
||||
'metode_paling_sering_dilakukan' => $validatedData['metode_paling_sering_dilakukan'] ?? null,
|
||||
'volume_obat_obatan_permusim' => $validatedData['volume_obat_obatan_permusim'] ?? null,
|
||||
'volume_obat_obatan_padat_permusim' => $validatedData['volume_obat_obatan_padat'] ?? null,
|
||||
'volume_obat_obatan_cair_permusim' => $validatedData['volume_obat_obatan_cair'] ?? null,
|
||||
'frekuensi_sanitasi_lahan' => $validatedData['frekuensi_sanitasi_lahan'] ?? null,
|
||||
'penanganan_sisa_buah_ranting' => $validatedData['penanganan_sisa_buah_ranting'] ?? null,
|
||||
'penanganan_gulma' => $validatedData['penanganan_gulma'] ?? null,
|
||||
'kondisi_pengelolaan_air' => $validatedData['kondisi_pengelolaan_air_irigasi'] ?? null,
|
||||
'sumber_air' => ($validatedData['sumber_air'] ?? null) === 'Lainnya' ? ($validatedData['sumber_air_lainnya'] ?? null) : ($validatedData['sumber_air'] ?? null),
|
||||
'sumber_air' => $sumberAir,
|
||||
'sistem_irigasi' => ($validatedData['sistem_irigasi'] ?? null) === 'Lainnya' ? ($validatedData['sistem_irigasi_lainnya'] ?? null) : ($validatedData['sistem_irigasi'] ?? null),
|
||||
'kebutuhan_air_permusim' => $validatedData['kebutuhan_air_permusim'] ?? null,
|
||||
'kebiasaan_konservasi_tanah' => $validatedData['kebiasaan_konservasi_tanah'] ?? [],
|
||||
@@ -413,8 +617,87 @@ class PraktikBudidayaController extends Controller
|
||||
];
|
||||
}
|
||||
|
||||
$praktikBudidaya->update($data);
|
||||
if ($request->has('upah_tenaga_kerja')) {
|
||||
$dataPraktikBudidaya = [
|
||||
'upah_tenaga_kerja' => $validatedData['upah_tenaga_kerja'] ?? null,
|
||||
'biaya_bibit' => $validatedData['biaya_bibit'] ?? null,
|
||||
'biaya_pupuk' => $validatedData['biaya_pupuk'] ?? null,
|
||||
'biaya_obat_obatan' => $validatedData['biaya_pestisida'] ?? null,
|
||||
'biaya_sewa_alat_produksi' => $validatedData['biaya_sewa_alat'] ?? null,
|
||||
'biaya_penyediaan_air' => $validatedData['biaya_penyediaan_air'] ?? null,
|
||||
'biaya_produksi_lainnya' => $validatedData['biaya_lainnya'] ?? null,
|
||||
'total_estimasi_biaya_produksi' => $validatedData['total_estimasi_biaya_produksi'] ?? null,
|
||||
];
|
||||
}
|
||||
|
||||
return back()->with('success', 'Data berhasil diperbarui.');
|
||||
if ($request->has('dasar_penentuan_panen')) {
|
||||
$dataSurveyPanen = [
|
||||
'dasar_penentuan_panen' => $validatedData['dasar_penentuan_panen'] ?? null,
|
||||
'frekuensi_panen_pertahun' => $validatedData['frekuensi_panen_pertahun'] ?? null,
|
||||
'bulan_panen_utama' => $validatedData['bulan_panen_utama'] ?? null,
|
||||
'hasil_komoditas_utama_permusim' => $validatedData['hasil_komoditas_utama_permusim'] ?? null,
|
||||
'hasil_komoditas_lainnya_permusim' => $validatedData['hasil_komoditas_lainnya_permusim'] ?? null,
|
||||
'disimpan_untuk_sendiri' => $validatedData['disimpan_untuk_sendiri'] ?? false,
|
||||
'hasil_panen_disimpan' => $validatedData['hasil_panen_disimpan'] ?? null,
|
||||
'tujuan_disimpan' => $validatedData['tujuan_disimpan'] ?? null,
|
||||
];
|
||||
}
|
||||
|
||||
if ($request->has('praktik_sortasi')) {
|
||||
$dataSurveyPanen = [
|
||||
'praktik_sortasi' => $validatedData['praktik_sortasi'] ?? null,
|
||||
'bentuk_sortasi' => $validatedData['bentuk_sortasi'] ?? null,
|
||||
'hasil_panen_reject' => $validatedData['tingkat_reject'] ?? null,
|
||||
'jumlah_panen_reject' => $validatedData['hasil_panen_reject'] ?? null,
|
||||
'tindakan_panen_reject' => $validatedData['tindakan_hasil_reject'] ?? null,
|
||||
'upah_tenaga_panen' => $validatedData['upah_tenaga_panen'] ?? null,
|
||||
'biaya_pengangkutan_panen' => $validatedData['biaya_pengangkutan'] ?? null,
|
||||
'biaya_wadah_panen' => $validatedData['biaya_wadah_kemasan'] ?? null,
|
||||
'biaya_sewa_alat_panen' => $validatedData['biaya_sewa_alat_panen'] ?? null,
|
||||
'biaya_panen_lainnya' => $validatedData['biaya_panen_lainnya'] ?? null,
|
||||
'total_estimasi_biaya_panen' => $validatedData['total_estimasi_biaya_panen'] ?? null,
|
||||
];
|
||||
}
|
||||
|
||||
if ($request->has('estimasi_kehilangan_akibat_opt')) {
|
||||
$dataSurveyPanen = [
|
||||
'estimasi_kehilangan_akibat_opt' => $validatedData['estimasi_kehilangan_akibat_opt'] ?? null,
|
||||
'estimasi_kehilangan_akibat_hama_penyakit' => $validatedData['estimasi_kehilangan_akibat_hama'] ?? null,
|
||||
];
|
||||
}
|
||||
|
||||
if (!empty($dataPraktikBudidaya)) {
|
||||
$dataPraktikBudidaya['updated_by'] = auth()->id();
|
||||
$praktikBudidaya->update($dataPraktikBudidaya);
|
||||
}
|
||||
|
||||
if (!empty($dataSurveyPanen)) {
|
||||
$surveyPanen = SurveyPanen::where('petani_id', $petani->id)->first();
|
||||
|
||||
if ($surveyPanen) {
|
||||
$dataSurveyPanen['updated_by'] = auth()->id();
|
||||
$surveyPanen->update($dataSurveyPanen);
|
||||
} else {
|
||||
SurveyPanen::create(array_merge([
|
||||
'uid' => 'SP-' . strtoupper(Str::random(10)),
|
||||
'petani_id' => $petani->id,
|
||||
'created_by' => auth()->id(),
|
||||
'updated_by_by' => auth()->id()
|
||||
], $dataSurveyPanen));
|
||||
}
|
||||
}
|
||||
|
||||
return $this->redirectBackToFragment($request)->with('success', 'Data berhasil diperbarui.');
|
||||
}
|
||||
|
||||
private function redirectBackToFragment(Request $request)
|
||||
{
|
||||
$fragment = $request->input('redirect_fragment');
|
||||
|
||||
if (!is_string($fragment) || !preg_match('/^[A-Za-z0-9_-]+$/', $fragment)) {
|
||||
return back();
|
||||
}
|
||||
|
||||
return redirect()->to(Str::before(url()->previous(), '#') . '#' . $fragment);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -64,12 +64,26 @@ class ProfileController extends Controller
|
||||
$validator = Validator::make($request->all(), [
|
||||
'nama' => ['required', 'string', 'max:255'],
|
||||
'email' => ['required', 'email', 'max:255'],
|
||||
'telepon' => ['required', 'max:13'],
|
||||
'desa_kelurahan_id' => ['required'],
|
||||
'telepon' => ['nullable', 'max:13'],
|
||||
'desa_kelurahan_id' => ['nullable', 'exists:master_desa_kelurahan,id'],
|
||||
'ktp' => ['nullable', 'min:16', 'max:16'],
|
||||
'file_ktp' => ['nullable', 'file', 'mimes:jpeg,jpg,png,pdf', 'max:2048'],
|
||||
'kk' => ['nullable', 'min:16', 'max:16'],
|
||||
'file_kk' => ['nullable', 'file', 'mimes:jpeg,jpg,png,pdf', 'max:2048'],
|
||||
], [
|
||||
'nama.required' => 'Nama wajib diisi.',
|
||||
'email.required' => 'Email wajib diisi.',
|
||||
'email.email' => 'Format email tidak sesuai.',
|
||||
'telepon.max' => 'Nomor telepon tidak sesuai.',
|
||||
'desa_kelurahan_id.exists' => 'Desa kelurahan tidak ditemukan.',
|
||||
'ktp.min' => 'KTP harus terdiri dari 16 digit.',
|
||||
'ktp.max' => 'KTP harus terdiri dari 16 digit.',
|
||||
'kk.min' => 'KK harus terdiri dari 16 digit.',
|
||||
'kk.max' => 'KK harus terdiri dari 16 digit.',
|
||||
'file_ktp.mimes' => 'Format file harus dalam bentuk JPEG, JPG, PNG, atau PDF.',
|
||||
'file_kk.mimes' => 'Format file harus dalam bentuk JPEG, JPG, PNG, atau PDF.',
|
||||
'file_ktp.max' => 'Ukuran file maksimal 2MB.',
|
||||
'file_kk.max' => 'Ukuran file maksimal 2MB.',
|
||||
]);
|
||||
|
||||
if ($validator->fails()) {
|
||||
@@ -143,12 +157,31 @@ class ProfileController extends Controller
|
||||
$validator = Validator::make($request->all(), [
|
||||
'nama' => ['required', 'string', 'max:255'],
|
||||
'email' => ['required', 'email', 'max:255'],
|
||||
'telepon' => ['required', 'max:13'],
|
||||
'desa_kelurahan_id' => ['required'],
|
||||
'telepon' => ['nullable', 'max:13'],
|
||||
'desa_kelurahan_id' => ['nullable', 'exists:master_desa_kelurahan,id'],
|
||||
'ktp' => ['nullable', 'min:16', 'max:16'],
|
||||
'file_ktp' => ['nullable', 'file', 'mimes:jpeg,jpg,png,pdf', 'max:2048'],
|
||||
'kk' => ['nullable', 'min:16', 'max:16'],
|
||||
'file_kk' => ['nullable', 'file', 'mimes:jpeg,jpg,png,pdf', 'max:2048'],
|
||||
], [
|
||||
'nama.required' => 'Nama harus diisi.',
|
||||
'nama.string' => 'Nama harus berupa string.',
|
||||
'nama.max' => 'Nama tidak boleh lebih dari 255 karakter.',
|
||||
'email.required' => 'Email harus diisi.',
|
||||
'email.email' => 'Email harus berupa alamat email yang valid.',
|
||||
'email.max' => 'Email tidak boleh lebih dari 255 karakter.',
|
||||
'telepon.max' => 'Nomor telepon tidak boleh lebih dari 13 karakter.',
|
||||
'desa_kelurahan_id.exists' => 'Desa kelurahan tidak ditemukan.',
|
||||
'ktp.min' => 'Nomor KTP harus terdiri dari 16 karakter.',
|
||||
'ktp.max' => 'Nomor KTP harus terdiri dari 16 karakter.',
|
||||
'kk.min' => 'Nomor KK harus terdiri dari 16 karakter.',
|
||||
'kk.max' => 'Nomor KK harus terdiri dari 16 karakter.',
|
||||
'file_ktp.file' => 'File harus berupa file.',
|
||||
'file_ktp.mimes' => 'File harus berupa file dengan ekstensi jpeg, jpg, png, atau pdf.',
|
||||
'file_ktp.max' => 'Ukuran file tidak boleh lebih dari 2MB.',
|
||||
'file_kk.file' => 'File harus berupa file.',
|
||||
'file_kk.mimes' => 'File harus berupa file dengan ekstensi jpeg, jpg, png, atau pdf.',
|
||||
'file_kk.max' => 'Ukuran file tidak boleh lebih dari 2MB.',
|
||||
]);
|
||||
|
||||
if ($validator->fails()) {
|
||||
|
||||
@@ -0,0 +1,76 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers\Web\Produktivitas;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\Gate;
|
||||
|
||||
use App\Models\Pertanian\SkorPetani;
|
||||
use App\Models\Pertanian\Petani;
|
||||
|
||||
class SkorPetaniController extends Controller
|
||||
{
|
||||
/**
|
||||
* Display a listing of the resource.
|
||||
*/
|
||||
public function index(string $petaniId)
|
||||
{
|
||||
if (!Gate::any(['super_admin', 'admin', 'fasilitator'])) {
|
||||
abort(403);
|
||||
}
|
||||
|
||||
$petani = Petani::findOrFail($petaniId);
|
||||
$skor = $petani->skor;
|
||||
|
||||
return view('produktivitas.petani.skor.index', compact('petani', 'skor'));
|
||||
}
|
||||
|
||||
/**
|
||||
* Show the form for creating a new resource.
|
||||
*/
|
||||
public function create()
|
||||
{
|
||||
//
|
||||
}
|
||||
|
||||
/**
|
||||
* Store a newly created resource in storage.
|
||||
*/
|
||||
public function store(Request $request)
|
||||
{
|
||||
//
|
||||
}
|
||||
|
||||
/**
|
||||
* Display the specified resource.
|
||||
*/
|
||||
public function show(string $petaniId, string $id)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Show the form for editing the specified resource.
|
||||
*/
|
||||
public function edit(string $id)
|
||||
{
|
||||
//
|
||||
}
|
||||
|
||||
/**
|
||||
* Update the specified resource in storage.
|
||||
*/
|
||||
public function update(Request $request, string $id)
|
||||
{
|
||||
//
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove the specified resource from storage.
|
||||
*/
|
||||
public function destroy(string $id)
|
||||
{
|
||||
//
|
||||
}
|
||||
}
|
||||
@@ -3,15 +3,44 @@
|
||||
namespace App\Http\Controllers\Web\Produktivitas;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use App\Enums\KategoriPendapatanKomoditas;
|
||||
use App\Enums\PeriodePendapatan;
|
||||
use App\Enums\PihakMembantuKonflik;
|
||||
use App\Enums\SkorKecukupanPenghasilan;
|
||||
use App\Enums\SkorKejelasanStatusLahan;
|
||||
use App\Enums\SkorKemampuanMenabung;
|
||||
use App\Enums\SkorPeriodePaceklik;
|
||||
use App\Enums\StatusKepemilikanLahanSosialEkonomi;
|
||||
use App\Enums\StatusKonflik;
|
||||
use App\Enums\SosialEkonomi\AlasanKreditDitolak;
|
||||
use App\Enums\SosialEkonomi\BisaBeliPupukBersubsidi;
|
||||
use App\Enums\SosialEkonomi\JenisAsetProduktif;
|
||||
use App\Enums\SosialEkonomi\KategoriPendapatanKomoditas;
|
||||
use App\Enums\SosialEkonomi\KemauanIkutProgram;
|
||||
use App\Enums\SosialEkonomi\KemauanMencobaPraktikBaru;
|
||||
use App\Enums\SosialEkonomi\KeaktifanPertemuanKelompok;
|
||||
use App\Enums\SosialEkonomi\KedekatanSesamaAnggota;
|
||||
use App\Enums\SosialEkonomi\KebebasanMemilihPembeli;
|
||||
use App\Enums\SosialEkonomi\KeterikatanHutangPanen;
|
||||
use App\Enums\SosialEkonomi\KeterlibatanProgramKeuanganFormal;
|
||||
use App\Enums\SosialEkonomi\KondisiAsetProduktif;
|
||||
use App\Enums\SosialEkonomi\ManfaatKelompokTani;
|
||||
use App\Enums\SosialEkonomi\MinatPembeliHargaStabil;
|
||||
use App\Enums\SosialEkonomi\OrientasiRencanaJangkaPanjang;
|
||||
use App\Enums\SosialEkonomi\PanutanPetaniSukses;
|
||||
use App\Enums\SosialEkonomi\PemahamanMutuHarga;
|
||||
use App\Enums\SosialEkonomi\PengetahuanHargaHasilOlah;
|
||||
use App\Enums\SosialEkonomi\PengalamanKreditKebun;
|
||||
use App\Enums\SosialEkonomi\PeriodePendapatan;
|
||||
use App\Enums\SosialEkonomi\PeranDalamKelompok;
|
||||
use App\Enums\SosialEkonomi\PernahBantuanNgoPerusahaan;
|
||||
use App\Enums\SosialEkonomi\PernahJualHargaLebihTinggi;
|
||||
use App\Enums\SosialEkonomi\PinjamanTokohAdatPanen;
|
||||
use App\Enums\SosialEkonomi\PihakMembantuKonflik;
|
||||
use App\Enums\SosialEkonomi\PraktikIjon;
|
||||
use App\Enums\SosialEkonomi\SkorKecukupanPenghasilan;
|
||||
use App\Enums\SosialEkonomi\SkorKejelasanStatusLahan;
|
||||
use App\Enums\SosialEkonomi\SkorKemampuanMenabung;
|
||||
use App\Enums\SosialEkonomi\SkorPeriodePaceklik;
|
||||
use App\Enums\SosialEkonomi\StatusKartuTani;
|
||||
use App\Enums\SosialEkonomi\StatusKepemilikanLahanSosialEkonomi;
|
||||
use App\Enums\SosialEkonomi\StatusKonflik;
|
||||
use App\Enums\SosialEkonomi\StatusProgramKeuanganFormal;
|
||||
use App\Enums\SosialEkonomi\StatusRekeningTabungan;
|
||||
use App\Enums\SosialEkonomi\TekananJualSegera;
|
||||
use App\Enums\SosialEkonomi\TerdaftarKelompokTani;
|
||||
use App\Enums\SosialEkonomi\UsahaMutuTambahanHarga;
|
||||
use App\Models\Pertanian\Komoditas;
|
||||
use App\Models\Pertanian\Lahan;
|
||||
use App\Models\Pertanian\Petani;
|
||||
@@ -35,20 +64,14 @@ class SosialEkonomiController extends Controller
|
||||
->where('petani_id', $petaniId)
|
||||
->first();
|
||||
|
||||
$pendapatanKomoditas = $sosialEkonomi?->pendapatanKomoditas ?? collect();
|
||||
$pendapatanKomoditasUtama = $pendapatanKomoditas->where('kategori', 'utama')->values();
|
||||
$pendapatanKomoditasLainnya = $pendapatanKomoditas->where('kategori', 'lainnya')->values();
|
||||
$pendapatanLuarPertanian = $sosialEkonomi?->pendapatanLuarPertanian?->values() ?? collect();
|
||||
$komoditasPetani = $this->komoditasPetani($petani);
|
||||
|
||||
return view('produktivitas.petani.sosial-ekonomi.index', array_merge(compact(
|
||||
'petani',
|
||||
'sosialEkonomi',
|
||||
'pendapatanKomoditasUtama',
|
||||
'pendapatanKomoditasLainnya',
|
||||
'pendapatanLuarPertanian',
|
||||
'komoditasPetani'
|
||||
), $this->sosialEkonomiOptions()));
|
||||
return $this->formView(
|
||||
request(),
|
||||
$petani,
|
||||
$sosialEkonomi,
|
||||
$sosialEkonomi
|
||||
? 'produktivitas.petani.sosial-ekonomi.edit'
|
||||
: 'produktivitas.petani.sosial-ekonomi.index'
|
||||
);
|
||||
}
|
||||
|
||||
public function index(Request $request, Petani $petani)
|
||||
@@ -131,8 +154,7 @@ class SosialEkonomiController extends Controller
|
||||
});
|
||||
|
||||
if (!$request->expectsJson()) {
|
||||
return redirect()
|
||||
->route('petani.sosial-ekonomi.edit', [$sosialEkonomi->petani_id, $sosialEkonomi->id])
|
||||
return $this->redirectToEditSection($sosialEkonomi, $request)
|
||||
->with('success', 'Data sosial ekonomi berhasil disimpan.');
|
||||
}
|
||||
|
||||
@@ -163,7 +185,7 @@ class SosialEkonomiController extends Controller
|
||||
$validated = $this->validateData($request, $sosialEkonomi->id);
|
||||
|
||||
$sosialEkonomi = DB::transaction(function () use ($request, $validated, $sosialEkonomi) {
|
||||
$sosialEkonomi->update($this->sosialEkonomiPayload($validated) + [
|
||||
$sosialEkonomi->update($this->sosialEkonomiPayload($validated, $sosialEkonomi) + [
|
||||
'updated_by' => auth()->id(),
|
||||
]);
|
||||
|
||||
@@ -183,8 +205,7 @@ class SosialEkonomiController extends Controller
|
||||
});
|
||||
|
||||
if (!$request->expectsJson()) {
|
||||
return redirect()
|
||||
->route('petani.sosial-ekonomi.edit', [$sosialEkonomi->petani_id, $sosialEkonomi->id])
|
||||
return $this->redirectToEditSection($sosialEkonomi, $request)
|
||||
->with('success', 'Data sosial ekonomi berhasil diperbarui.');
|
||||
}
|
||||
|
||||
@@ -195,6 +216,18 @@ class SosialEkonomiController extends Controller
|
||||
]);
|
||||
}
|
||||
|
||||
private function redirectToEditSection(SosialEkonomi $sosialEkonomi, Request $request): RedirectResponse
|
||||
{
|
||||
$url = route('petani.sosial-ekonomi.edit', [$sosialEkonomi->petani_id, $sosialEkonomi->id]);
|
||||
$fragment = $request->input('redirect_fragment');
|
||||
|
||||
if (is_string($fragment) && preg_match('/^[A-Za-z0-9_-]+$/', $fragment)) {
|
||||
$url .= '#' . $fragment;
|
||||
}
|
||||
|
||||
return redirect()->to($url);
|
||||
}
|
||||
|
||||
public function destroy(string $id): JsonResponse
|
||||
{
|
||||
$sosialEkonomi = SosialEkonomi::findOrFail($id);
|
||||
@@ -212,14 +245,19 @@ class SosialEkonomiController extends Controller
|
||||
|
||||
private function validateData(Request $request, ?int $id = null): array
|
||||
{
|
||||
return $request->validate([
|
||||
$this->normalizeCurrencyInput($request);
|
||||
|
||||
$section = $request->input('form_section');
|
||||
|
||||
$rules = [
|
||||
'form_section' => ['required', 'string', Rule::in(['utama', 'sosial_budaya', 'keanggotaan_kelompok', 'akses_keuangan', 'keterikatan_hutang'])],
|
||||
'uid' => [
|
||||
'nullable',
|
||||
'string',
|
||||
'max:255',
|
||||
Rule::unique('sosial_ekonomi', 'uid')->ignore($id),
|
||||
],
|
||||
'petani_id' => ['nullable', 'exists:petani,id'],
|
||||
'petani_id' => ['required', 'exists:petani,id'],
|
||||
'jumlah_tanggungan' => ['nullable', 'integer', 'min:0'],
|
||||
'anak_masih_sekolah' => ['nullable', 'integer', 'min:0'],
|
||||
'yang_ikut_bekerja' => ['nullable', 'integer', 'min:0'],
|
||||
@@ -240,6 +278,67 @@ class SosialEkonomiController extends Controller
|
||||
'pihak_membantu_konflik_nama' => ['nullable', 'string', 'max:255'],
|
||||
'tahun_bantuan_konflik' => ['nullable', 'integer', 'digits:4'],
|
||||
'status_konflik' => ['nullable', 'string', Rule::in(StatusKonflik::values())],
|
||||
'kemauan_mencoba_praktik_baru' => ['nullable', 'integer', Rule::in(KemauanMencobaPraktikBaru::values())],
|
||||
'alasan_mencoba_praktik_baru' => ['nullable', 'string'],
|
||||
'hambatan_mengubah_cara_bertani' => ['nullable', 'string'],
|
||||
'pemahaman_mutu_harga' => ['nullable', 'integer', Rule::in(PemahamanMutuHarga::values())],
|
||||
'contoh_pemahaman_mutu_harga' => ['nullable', 'string'],
|
||||
'pengetahuan_harga_hasil_olah' => ['nullable', 'string', Rule::in(PengetahuanHargaHasilOlah::values())],
|
||||
'pernah_jual_harga_lebih_tinggi' => ['nullable', 'string', Rule::in(PernahJualHargaLebihTinggi::values())],
|
||||
'penyebab_harga_lebih_tinggi' => ['nullable', 'string'],
|
||||
'usaha_mutu_tambahan_harga' => ['nullable', 'string', Rule::in(UsahaMutuTambahanHarga::values())],
|
||||
'alasan_usaha_mutu_tambahan_harga' => ['nullable', 'string'],
|
||||
'panutan_petani_sukses' => ['nullable', 'integer', Rule::in(PanutanPetaniSukses::values())],
|
||||
'nama_lokasi_panutan' => ['nullable', 'string'],
|
||||
'kemauan_ikut_program' => ['nullable', 'integer', Rule::in(KemauanIkutProgram::values())],
|
||||
'harapan_program' => ['nullable', 'string'],
|
||||
'orientasi_rencana_jangka_panjang' => ['nullable', 'integer', Rule::in(OrientasiRencanaJangkaPanjang::values())],
|
||||
'rencana_jangka_panjang' => ['nullable', 'string'],
|
||||
'terdaftar_kelompok_tani' => ['nullable', 'string', Rule::in(TerdaftarKelompokTani::values())],
|
||||
'nama_kelompok_tani' => ['nullable', 'string', 'max:255'],
|
||||
'lama_bergabung_kelompok_tahun' => ['nullable', 'integer', 'min:0'],
|
||||
'kedekatan_sesama_anggota' => ['nullable', 'string', Rule::in(KedekatanSesamaAnggota::values())],
|
||||
'keaktifan_pertemuan_kelompok' => ['nullable', 'integer', Rule::in(KeaktifanPertemuanKelompok::values())],
|
||||
'topik_biasa_dibahas' => ['nullable', 'string'],
|
||||
'peran_dalam_kelompok' => ['nullable', 'integer', Rule::in(PeranDalamKelompok::values())],
|
||||
'manfaat_kelompok_tani' => ['nullable', 'integer', Rule::in(ManfaatKelompokTani::values())],
|
||||
'status_kartu_tani' => ['nullable', 'string', Rule::in(StatusKartuTani::values())],
|
||||
'bisa_beli_pupuk_bersubsidi' => ['nullable', 'string', Rule::in(BisaBeliPupukBersubsidi::values())],
|
||||
'manfaat_lain_kartu_tani' => ['nullable', 'string'],
|
||||
'status_rekening_tabungan' => ['nullable', 'integer', Rule::in(StatusRekeningTabungan::values())],
|
||||
'nama_bank' => ['nullable', 'string', 'max:255'],
|
||||
'pengalaman_kredit_kebun' => ['nullable', 'integer', Rule::in(PengalamanKreditKebun::values())],
|
||||
'alasan_kredit_ditolak' => ['nullable', 'array'],
|
||||
'alasan_kredit_ditolak.*' => ['string', Rule::in(AlasanKreditDitolak::values())],
|
||||
'alasan_kredit_ditolak_lainnya' => ['nullable', 'string', 'max:255'],
|
||||
'kondisi_aset_produktif' => ['nullable', 'integer', Rule::in(KondisiAsetProduktif::values())],
|
||||
'jenis_aset_produktif' => ['nullable', 'array'],
|
||||
'jenis_aset_produktif.*' => ['string', Rule::in(JenisAsetProduktif::values())],
|
||||
'jenis_aset_produktif_lainnya' => ['nullable', 'string', 'max:255'],
|
||||
'keterangan_kondisi_aset' => ['nullable', 'string'],
|
||||
'keterlibatan_program_keuangan_formal' => ['nullable', 'integer', Rule::in(KeterlibatanProgramKeuanganFormal::values())],
|
||||
'status_program_keuangan_formal' => ['nullable', 'array'],
|
||||
'status_program_keuangan_formal.*' => ['nullable', 'string', Rule::in(StatusProgramKeuanganFormal::values())],
|
||||
'program_keuangan_formal_lainnya_nama' => ['nullable', 'string', 'max:255'],
|
||||
'pernah_bantuan_ngo_perusahaan' => ['nullable', 'string', Rule::in(PernahBantuanNgoPerusahaan::values())],
|
||||
'detail_bantuan_ngo_perusahaan' => ['nullable', 'array'],
|
||||
'detail_bantuan_ngo_perusahaan.*.nama_lembaga' => ['nullable', 'string', 'max:255'],
|
||||
'detail_bantuan_ngo_perusahaan.*.bentuk_bantuan' => ['nullable', 'string', 'max:255'],
|
||||
'detail_bantuan_ngo_perusahaan.*.frekuensi' => ['nullable', 'integer', 'min:0'],
|
||||
'detail_bantuan_ngo_perusahaan.*.tahun_terakhir' => ['nullable', 'integer', 'digits:4'],
|
||||
'keterikatan_hutang_panen' => ['nullable', 'integer', Rule::in(KeterikatanHutangPanen::values())],
|
||||
'pinjaman_tokoh_adat_panen' => ['nullable', 'string', Rule::in(PinjamanTokohAdatPanen::values())],
|
||||
'keterangan_pinjaman_tokoh_adat' => ['nullable', 'string'],
|
||||
'total_hutang_rupiah' => ['nullable', 'integer', 'min:0'],
|
||||
'total_hutang_setara_kg_panen' => ['nullable', 'numeric', 'min:0'],
|
||||
'total_hutang_tidak_bersedia' => ['nullable', 'boolean'],
|
||||
'praktik_ijon' => ['nullable', 'integer', Rule::in(PraktikIjon::values())],
|
||||
'tekanan_jual_segera' => ['nullable', 'string', Rule::in(TekananJualSegera::values())],
|
||||
'penyebab_tekanan_jual_segera' => ['nullable', 'string'],
|
||||
'kebebasan_memilih_pembeli' => ['nullable', 'integer', Rule::in(KebebasanMemilihPembeli::values())],
|
||||
'alasan_tidak_bebas_memilih_pembeli' => ['nullable', 'string'],
|
||||
'minat_pembeli_harga_stabil' => ['nullable', 'string', Rule::in(MinatPembeliHargaStabil::values())],
|
||||
'alasan_minat_pembeli_harga_stabil' => ['nullable', 'string'],
|
||||
|
||||
'pendapatan_komoditas' => ['nullable', 'array'],
|
||||
'pendapatan_komoditas.*.kategori' => ['required_with:pendapatan_komoditas', 'string', Rule::in(KategoriPendapatanKomoditas::values())],
|
||||
@@ -250,28 +349,504 @@ class SosialEkonomiController extends Controller
|
||||
'pendapatan_luar_pertanian' => ['nullable', 'array'],
|
||||
'pendapatan_luar_pertanian.*.jenis_pekerjaan' => ['nullable', 'string', 'max:255'],
|
||||
'pendapatan_luar_pertanian.*.estimasi_per_bulan' => ['nullable', 'integer', 'min:0'],
|
||||
]);
|
||||
];
|
||||
|
||||
if ($section === 'utama') {
|
||||
$rules = array_merge($rules, [
|
||||
'jumlah_tanggungan' => ['required', 'integer', 'min:0'],
|
||||
'anak_masih_sekolah' => ['required', 'integer', 'min:0'],
|
||||
'yang_ikut_bekerja' => ['required', 'integer', 'min:0'],
|
||||
'skor_periode_paceklik' => ['required', 'integer', Rule::in(SkorPeriodePaceklik::values())],
|
||||
'bulan_paceklik' => ['required', 'string', 'max:255'],
|
||||
'sumber_penghasilan_paceklik' => ['required', 'string'],
|
||||
'total_estimasi_biaya_kebun_per_musim' => ['required', 'integer', 'min:0'],
|
||||
'skor_kemampuan_menabung' => ['required', 'integer', Rule::in(SkorKemampuanMenabung::values())],
|
||||
'estimasi_tabungan_per_bulan' => ['required', 'integer', 'min:0'],
|
||||
'skor_kecukupan_penghasilan' => ['required', 'integer', Rule::in(SkorKecukupanPenghasilan::values())],
|
||||
'alasan_kecukupan_penghasilan' => ['required', 'string'],
|
||||
'status_kepemilikan_lahan' => ['required', 'string', Rule::in(StatusKepemilikanLahanSosialEkonomi::values())],
|
||||
'skor_kejelasan_status_lahan' => ['required', 'integer', Rule::in(SkorKejelasanStatusLahan::values())],
|
||||
'ada_sertifikat_dokumen' => ['required', 'boolean'],
|
||||
'ada_sengketa' => ['required', 'boolean'],
|
||||
'keterangan_sengketa' => ['required_if:ada_sengketa,1', 'nullable', 'string'],
|
||||
'pihak_membantu_konflik' => ['required_if:ada_sengketa,1', 'nullable', 'string', Rule::in(PihakMembantuKonflik::values())],
|
||||
'pihak_membantu_konflik_nama' => ['required_if:pihak_membantu_konflik,' . PihakMembantuKonflik::ADA->value, 'nullable', 'string', 'max:255'],
|
||||
'tahun_bantuan_konflik' => ['required_if:pihak_membantu_konflik,' . PihakMembantuKonflik::ADA->value, 'nullable', 'integer', 'digits:4'],
|
||||
'status_konflik' => ['required_if:ada_sengketa,1', 'nullable', 'string', Rule::in(StatusKonflik::values())],
|
||||
]);
|
||||
}
|
||||
|
||||
if ($section === 'sosial_budaya') {
|
||||
$rules = array_merge($rules, [
|
||||
'kemauan_mencoba_praktik_baru' => ['required', 'integer', Rule::in(KemauanMencobaPraktikBaru::values())],
|
||||
'alasan_mencoba_praktik_baru' => ['required', 'string'],
|
||||
'hambatan_mengubah_cara_bertani' => ['required', 'string'],
|
||||
'pemahaman_mutu_harga' => ['required', 'integer', Rule::in(PemahamanMutuHarga::values())],
|
||||
'contoh_pemahaman_mutu_harga' => ['required', 'string'],
|
||||
'pengetahuan_harga_hasil_olah' => ['required', 'string', Rule::in(PengetahuanHargaHasilOlah::values())],
|
||||
'pernah_jual_harga_lebih_tinggi' => ['required', 'string', Rule::in(PernahJualHargaLebihTinggi::values())],
|
||||
'penyebab_harga_lebih_tinggi' => ['required_if:pernah_jual_harga_lebih_tinggi,' . PernahJualHargaLebihTinggi::PERNAH->value, 'nullable', 'string'],
|
||||
'usaha_mutu_tambahan_harga' => ['required', 'string', Rule::in(UsahaMutuTambahanHarga::values())],
|
||||
'alasan_usaha_mutu_tambahan_harga' => ['required_if:usaha_mutu_tambahan_harga,' . UsahaMutuTambahanHarga::TIDAK_SEBANDING_TERLALU_BANYAK_USAHA->value, 'nullable', 'string'],
|
||||
'panutan_petani_sukses' => ['required', 'integer', Rule::in(PanutanPetaniSukses::values())],
|
||||
'nama_lokasi_panutan' => ['required_unless:panutan_petani_sukses,' . PanutanPetaniSukses::TIDAK_ADA->value, 'nullable', 'string'],
|
||||
'kemauan_ikut_program' => ['required', 'integer', Rule::in(KemauanIkutProgram::values())],
|
||||
'harapan_program' => ['required', 'string'],
|
||||
'orientasi_rencana_jangka_panjang' => ['required', 'integer', Rule::in(OrientasiRencanaJangkaPanjang::values())],
|
||||
'rencana_jangka_panjang' => ['required', 'string'],
|
||||
]);
|
||||
}
|
||||
|
||||
if ($section === 'keanggotaan_kelompok') {
|
||||
$rules = array_merge($rules, [
|
||||
'terdaftar_kelompok_tani' => ['nullable', 'string', Rule::in(TerdaftarKelompokTani::values())],
|
||||
'nama_kelompok_tani' => ['required_if:terdaftar_kelompok_tani,' . TerdaftarKelompokTani::YA->value, 'nullable', 'string', 'max:255'],
|
||||
'lama_bergabung_kelompok_tahun' => ['required_if:terdaftar_kelompok_tani,' . TerdaftarKelompokTani::YA->value, 'nullable', 'integer', 'min:0'],
|
||||
'kedekatan_sesama_anggota' => ['required_if:terdaftar_kelompok_tani,' . TerdaftarKelompokTani::YA->value, 'nullable', 'string', Rule::in(KedekatanSesamaAnggota::values())],
|
||||
'keaktifan_pertemuan_kelompok' => ['required', 'integer', Rule::in(KeaktifanPertemuanKelompok::values())],
|
||||
'topik_biasa_dibahas' => ['required', 'string'],
|
||||
'peran_dalam_kelompok' => ['required', 'integer', Rule::in(PeranDalamKelompok::values())],
|
||||
'manfaat_kelompok_tani' => ['required', 'integer', Rule::in(ManfaatKelompokTani::values())],
|
||||
'status_kartu_tani' => ['nullable', 'string', Rule::in(StatusKartuTani::values())],
|
||||
'bisa_beli_pupuk_bersubsidi' => ['nullable', 'string', Rule::in(BisaBeliPupukBersubsidi::values())],
|
||||
'manfaat_lain_kartu_tani' => ['nullable', 'string'],
|
||||
]);
|
||||
}
|
||||
|
||||
if ($section === 'akses_keuangan') {
|
||||
$pengalamanKredit = (int) $request->input('pengalaman_kredit_kebun');
|
||||
$kondisiAset = (int) $request->input('kondisi_aset_produktif');
|
||||
$tidakPernahMenerimaProgram = (int) $request->input('keterlibatan_program_keuangan_formal') === KeterlibatanProgramKeuanganFormal::TIDAK_PERNAH_MENERIMA->value;
|
||||
|
||||
$rules = array_merge($rules, [
|
||||
'status_rekening_tabungan' => ['required', 'integer', Rule::in(StatusRekeningTabungan::values())],
|
||||
'nama_bank' => [
|
||||
Rule::requiredIf(fn () => (int) $request->input('status_rekening_tabungan') > StatusRekeningTabungan::TIDAK_PUNYA_REKENING->value),
|
||||
'nullable',
|
||||
'string',
|
||||
'max:255',
|
||||
],
|
||||
'pengalaman_kredit_kebun' => ['required', 'integer', Rule::in(PengalamanKreditKebun::values())],
|
||||
'alasan_kredit_ditolak' => [
|
||||
Rule::requiredIf(fn () => in_array($pengalamanKredit, [
|
||||
PengalamanKreditKebun::TIDAK_PERNAH_MENCOBA->value,
|
||||
PengalamanKreditKebun::PERNAH_COBA_DITOLAK->value,
|
||||
], true)),
|
||||
'nullable',
|
||||
'array',
|
||||
],
|
||||
'alasan_kredit_ditolak.*' => ['string', Rule::in(AlasanKreditDitolak::values())],
|
||||
'alasan_kredit_ditolak_lainnya' => [
|
||||
Rule::requiredIf(fn () => in_array(AlasanKreditDitolak::LAINNYA->value, $request->input('alasan_kredit_ditolak', []), true)),
|
||||
'nullable',
|
||||
'string',
|
||||
'max:255',
|
||||
],
|
||||
'kondisi_aset_produktif' => ['required', 'integer', Rule::in(KondisiAsetProduktif::values())],
|
||||
'jenis_aset_produktif' => [
|
||||
Rule::requiredIf(fn () => $kondisiAset > KondisiAsetProduktif::TIDAK_ADA->value),
|
||||
'nullable',
|
||||
'array',
|
||||
],
|
||||
'jenis_aset_produktif.*' => ['string', Rule::in(JenisAsetProduktif::values())],
|
||||
'jenis_aset_produktif_lainnya' => [
|
||||
Rule::requiredIf(fn () => in_array(JenisAsetProduktif::LAINNYA->value, $request->input('jenis_aset_produktif', []), true)),
|
||||
'nullable',
|
||||
'string',
|
||||
'max:255',
|
||||
],
|
||||
'keterangan_kondisi_aset' => [
|
||||
Rule::requiredIf(fn () => $kondisiAset > KondisiAsetProduktif::TIDAK_ADA->value),
|
||||
'nullable',
|
||||
'string',
|
||||
],
|
||||
'keterlibatan_program_keuangan_formal' => ['required', 'integer', Rule::in(KeterlibatanProgramKeuanganFormal::values())],
|
||||
'status_program_keuangan_formal' => [Rule::requiredIf(fn () => !$tidakPernahMenerimaProgram), 'nullable', 'array'],
|
||||
'status_program_keuangan_formal.pkh' => [Rule::requiredIf(fn () => !$tidakPernahMenerimaProgram), 'nullable', 'string', Rule::in(StatusProgramKeuanganFormal::values())],
|
||||
'status_program_keuangan_formal.blt' => [Rule::requiredIf(fn () => !$tidakPernahMenerimaProgram), 'nullable', 'string', Rule::in(StatusProgramKeuanganFormal::values())],
|
||||
'status_program_keuangan_formal.kur' => [Rule::requiredIf(fn () => !$tidakPernahMenerimaProgram), 'nullable', 'string', Rule::in(StatusProgramKeuanganFormal::values())],
|
||||
'status_program_keuangan_formal.kredit_koperasi_resmi' => [Rule::requiredIf(fn () => !$tidakPernahMenerimaProgram), 'nullable', 'string', Rule::in(StatusProgramKeuanganFormal::values())],
|
||||
'status_program_keuangan_formal.credit_union_cu' => [Rule::requiredIf(fn () => !$tidakPernahMenerimaProgram), 'nullable', 'string', Rule::in(StatusProgramKeuanganFormal::values())],
|
||||
'status_program_keuangan_formal.pinjaman_bumdes' => [Rule::requiredIf(fn () => !$tidakPernahMenerimaProgram), 'nullable', 'string', Rule::in(StatusProgramKeuanganFormal::values())],
|
||||
'status_program_keuangan_formal.modal_hibah_dinas_pertanian' => [Rule::requiredIf(fn () => !$tidakPernahMenerimaProgram), 'nullable', 'string', Rule::in(StatusProgramKeuanganFormal::values())],
|
||||
'status_program_keuangan_formal.lainnya' => ['nullable', 'string', Rule::in(StatusProgramKeuanganFormal::values())],
|
||||
'program_keuangan_formal_lainnya_nama' => [
|
||||
Rule::requiredIf(fn () => !$tidakPernahMenerimaProgram && filled($request->input('status_program_keuangan_formal.lainnya'))),
|
||||
'nullable',
|
||||
'string',
|
||||
'max:255',
|
||||
],
|
||||
'pernah_bantuan_ngo_perusahaan' => ['required', 'string', Rule::in(PernahBantuanNgoPerusahaan::values())],
|
||||
'detail_bantuan_ngo_perusahaan' => [
|
||||
Rule::requiredIf(fn () => $request->input('pernah_bantuan_ngo_perusahaan') === PernahBantuanNgoPerusahaan::PERNAH->value),
|
||||
'nullable',
|
||||
'array',
|
||||
],
|
||||
'detail_bantuan_ngo_perusahaan.0.nama_lembaga' => [
|
||||
Rule::requiredIf(fn () => $request->input('pernah_bantuan_ngo_perusahaan') === PernahBantuanNgoPerusahaan::PERNAH->value),
|
||||
'nullable',
|
||||
'string',
|
||||
'max:255',
|
||||
],
|
||||
'detail_bantuan_ngo_perusahaan.0.bentuk_bantuan' => [
|
||||
Rule::requiredIf(fn () => $request->input('pernah_bantuan_ngo_perusahaan') === PernahBantuanNgoPerusahaan::PERNAH->value),
|
||||
'nullable',
|
||||
'string',
|
||||
'max:255',
|
||||
],
|
||||
'detail_bantuan_ngo_perusahaan.0.frekuensi' => [
|
||||
Rule::requiredIf(fn () => $request->input('pernah_bantuan_ngo_perusahaan') === PernahBantuanNgoPerusahaan::PERNAH->value),
|
||||
'nullable',
|
||||
'integer',
|
||||
'min:0',
|
||||
],
|
||||
'detail_bantuan_ngo_perusahaan.0.tahun_terakhir' => [
|
||||
Rule::requiredIf(fn () => $request->input('pernah_bantuan_ngo_perusahaan') === PernahBantuanNgoPerusahaan::PERNAH->value),
|
||||
'nullable',
|
||||
'integer',
|
||||
'digits:4',
|
||||
],
|
||||
]);
|
||||
}
|
||||
|
||||
if ($section === 'keterikatan_hutang') {
|
||||
$totalHutangTidakBersedia = $request->boolean('total_hutang_tidak_bersedia');
|
||||
$kebebasanMemilihPembeli = (int) $request->input('kebebasan_memilih_pembeli');
|
||||
|
||||
$rules = array_merge($rules, [
|
||||
'keterikatan_hutang_panen' => ['required', 'integer', Rule::in(KeterikatanHutangPanen::values())],
|
||||
'pinjaman_tokoh_adat_panen' => ['required', 'string', Rule::in(PinjamanTokohAdatPanen::values())],
|
||||
'keterangan_pinjaman_tokoh_adat' => ['required_if:pinjaman_tokoh_adat_panen,' . PinjamanTokohAdatPanen::ADA->value, 'nullable', 'string'],
|
||||
'total_hutang_rupiah' => [
|
||||
Rule::requiredIf(fn () => !$totalHutangTidakBersedia && !filled($request->input('total_hutang_setara_kg_panen'))),
|
||||
'nullable',
|
||||
'integer',
|
||||
'min:0',
|
||||
],
|
||||
'total_hutang_setara_kg_panen' => ['nullable', 'numeric', 'min:0'],
|
||||
'total_hutang_tidak_bersedia' => ['nullable', 'boolean'],
|
||||
'praktik_ijon' => ['required', 'integer', Rule::in(PraktikIjon::values())],
|
||||
'tekanan_jual_segera' => ['required', 'string', Rule::in(TekananJualSegera::values())],
|
||||
'penyebab_tekanan_jual_segera' => ['required_if:tekanan_jual_segera,' . TekananJualSegera::ADA->value, 'nullable', 'string'],
|
||||
'kebebasan_memilih_pembeli' => ['required', 'integer', Rule::in(KebebasanMemilihPembeli::values())],
|
||||
'alasan_tidak_bebas_memilih_pembeli' => [
|
||||
Rule::requiredIf(fn () => $kebebasanMemilihPembeli > 0 && $kebebasanMemilihPembeli < KebebasanMemilihPembeli::CUKUP_BEBAS_SESEKALI_PINDAH->value),
|
||||
'nullable',
|
||||
'string',
|
||||
],
|
||||
'minat_pembeli_harga_stabil' => ['required', 'string', Rule::in(MinatPembeliHargaStabil::values())],
|
||||
'alasan_minat_pembeli_harga_stabil' => ['required', 'string'],
|
||||
]);
|
||||
}
|
||||
|
||||
return $request->validate($rules, $this->validationMessages(), $this->validationAttributes());
|
||||
}
|
||||
|
||||
private function sosialEkonomiPayload(array $validated): array
|
||||
private function normalizeCurrencyInput(Request $request): void
|
||||
{
|
||||
$data = $request->all();
|
||||
$currencyFields = [
|
||||
'total_estimasi_biaya_kebun_per_musim',
|
||||
'estimasi_tabungan_per_bulan',
|
||||
'total_hutang_rupiah',
|
||||
];
|
||||
|
||||
foreach ($currencyFields as $field) {
|
||||
if (array_key_exists($field, $data)) {
|
||||
$data[$field] = $this->currencyDigits($data[$field]);
|
||||
}
|
||||
}
|
||||
|
||||
if (isset($data['pendapatan_komoditas']) && is_array($data['pendapatan_komoditas'])) {
|
||||
foreach ($data['pendapatan_komoditas'] as $index => $item) {
|
||||
if (is_array($item) && array_key_exists('pendapatan', $item)) {
|
||||
$data['pendapatan_komoditas'][$index]['pendapatan'] = $this->currencyDigits($item['pendapatan']);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (isset($data['pendapatan_luar_pertanian']) && is_array($data['pendapatan_luar_pertanian'])) {
|
||||
foreach ($data['pendapatan_luar_pertanian'] as $index => $item) {
|
||||
if (is_array($item) && array_key_exists('estimasi_per_bulan', $item)) {
|
||||
$data['pendapatan_luar_pertanian'][$index]['estimasi_per_bulan'] = $this->currencyDigits($item['estimasi_per_bulan']);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$request->merge($data);
|
||||
}
|
||||
|
||||
private function currencyDigits(mixed $value): ?string
|
||||
{
|
||||
if (is_null($value) || $value === '') {
|
||||
return null;
|
||||
}
|
||||
|
||||
$digits = preg_replace('/\D/', '', (string) $value);
|
||||
|
||||
return $digits === '' ? null : $digits;
|
||||
}
|
||||
|
||||
private function sosialEkonomiPayload(array $validated, ?SosialEkonomi $sosialEkonomi = null): array
|
||||
{
|
||||
$payload = collect($validated)
|
||||
->except(['pendapatan_komoditas', 'pendapatan_luar_pertanian'])
|
||||
->merge([
|
||||
'uid' => $validated['uid'] ?? 'SEK-' . Str::uuid(),
|
||||
])
|
||||
->except(['form_section', 'pendapatan_komoditas', 'pendapatan_luar_pertanian'])
|
||||
->all();
|
||||
|
||||
if (!$sosialEkonomi && !array_key_exists('uid', $payload)) {
|
||||
$payload['uid'] = 'SEK-' . Str::uuid();
|
||||
}
|
||||
|
||||
$payload = $this->normalizeSkorPayload($payload);
|
||||
|
||||
if (array_key_exists('ada_sengketa', $payload) && !filter_var($payload['ada_sengketa'], FILTER_VALIDATE_BOOLEAN)) {
|
||||
$payload['keterangan_sengketa'] = null;
|
||||
$payload['pihak_membantu_konflik'] = null;
|
||||
$payload['pihak_membantu_konflik_nama'] = null;
|
||||
$payload['tahun_bantuan_konflik'] = null;
|
||||
$payload['status_konflik'] = null;
|
||||
}
|
||||
|
||||
if (($payload['pihak_membantu_konflik'] ?? null) === PihakMembantuKonflik::TIDAK_ADA_SELESAIKAN_SENDIRI->value) {
|
||||
$payload['pihak_membantu_konflik_nama'] = null;
|
||||
$payload['tahun_bantuan_konflik'] = null;
|
||||
}
|
||||
|
||||
if (
|
||||
array_key_exists('pernah_jual_harga_lebih_tinggi', $payload)
|
||||
&& ($payload['pernah_jual_harga_lebih_tinggi'] ?? null) !== PernahJualHargaLebihTinggi::PERNAH->value
|
||||
) {
|
||||
$payload['penyebab_harga_lebih_tinggi'] = null;
|
||||
}
|
||||
|
||||
if (
|
||||
array_key_exists('panutan_petani_sukses', $payload)
|
||||
&& (int) ($payload['panutan_petani_sukses'] ?? 0) === PanutanPetaniSukses::TIDAK_ADA->value
|
||||
) {
|
||||
$payload['nama_lokasi_panutan'] = null;
|
||||
}
|
||||
|
||||
if (
|
||||
array_key_exists('terdaftar_kelompok_tani', $payload)
|
||||
&& ($payload['terdaftar_kelompok_tani'] ?? null) === TerdaftarKelompokTani::TIDAK->value
|
||||
) {
|
||||
$payload['nama_kelompok_tani'] = null;
|
||||
$payload['lama_bergabung_kelompok_tahun'] = null;
|
||||
$payload['kedekatan_sesama_anggota'] = null;
|
||||
}
|
||||
|
||||
if (
|
||||
array_key_exists('status_rekening_tabungan', $payload)
|
||||
&& (int) ($payload['status_rekening_tabungan'] ?? 0) === StatusRekeningTabungan::TIDAK_PUNYA_REKENING->value
|
||||
) {
|
||||
$payload['nama_bank'] = null;
|
||||
}
|
||||
|
||||
if (
|
||||
array_key_exists('pengalaman_kredit_kebun', $payload)
|
||||
&& !in_array((int) ($payload['pengalaman_kredit_kebun'] ?? 0), [
|
||||
PengalamanKreditKebun::TIDAK_PERNAH_MENCOBA->value,
|
||||
PengalamanKreditKebun::PERNAH_COBA_DITOLAK->value,
|
||||
], true)
|
||||
) {
|
||||
$payload['alasan_kredit_ditolak'] = null;
|
||||
$payload['alasan_kredit_ditolak_lainnya'] = null;
|
||||
}
|
||||
|
||||
if (
|
||||
array_key_exists('alasan_kredit_ditolak', $payload)
|
||||
&& !in_array(AlasanKreditDitolak::LAINNYA->value, $payload['alasan_kredit_ditolak'] ?? [], true)
|
||||
) {
|
||||
$payload['alasan_kredit_ditolak_lainnya'] = null;
|
||||
}
|
||||
|
||||
if (
|
||||
array_key_exists('kondisi_aset_produktif', $payload)
|
||||
&& (int) ($payload['kondisi_aset_produktif'] ?? 0) === KondisiAsetProduktif::TIDAK_ADA->value
|
||||
) {
|
||||
$payload['jenis_aset_produktif'] = null;
|
||||
$payload['jenis_aset_produktif_lainnya'] = null;
|
||||
$payload['keterangan_kondisi_aset'] = null;
|
||||
}
|
||||
|
||||
if (
|
||||
array_key_exists('jenis_aset_produktif', $payload)
|
||||
&& !in_array(JenisAsetProduktif::LAINNYA->value, $payload['jenis_aset_produktif'] ?? [], true)
|
||||
) {
|
||||
$payload['jenis_aset_produktif_lainnya'] = null;
|
||||
}
|
||||
|
||||
if (
|
||||
array_key_exists('keterlibatan_program_keuangan_formal', $payload)
|
||||
&& (int) ($payload['keterlibatan_program_keuangan_formal'] ?? 0) === KeterlibatanProgramKeuanganFormal::TIDAK_PERNAH_MENERIMA->value
|
||||
) {
|
||||
$payload['status_program_keuangan_formal'] = null;
|
||||
$payload['program_keuangan_formal_lainnya_nama'] = null;
|
||||
}
|
||||
|
||||
if (!filled($payload['status_program_keuangan_formal']['lainnya'] ?? null)) {
|
||||
$payload['program_keuangan_formal_lainnya_nama'] = null;
|
||||
}
|
||||
|
||||
if (
|
||||
array_key_exists('pernah_bantuan_ngo_perusahaan', $payload)
|
||||
&& ($payload['pernah_bantuan_ngo_perusahaan'] ?? null) === PernahBantuanNgoPerusahaan::TIDAK_PERNAH->value
|
||||
) {
|
||||
$payload['detail_bantuan_ngo_perusahaan'] = null;
|
||||
}
|
||||
|
||||
if (array_key_exists('detail_bantuan_ngo_perusahaan', $payload) && is_array($payload['detail_bantuan_ngo_perusahaan'])) {
|
||||
$payload['detail_bantuan_ngo_perusahaan'] = collect($payload['detail_bantuan_ngo_perusahaan'])
|
||||
->filter(fn ($row) => collect($row)->filter(fn ($value) => filled($value))->isNotEmpty())
|
||||
->values()
|
||||
->all();
|
||||
}
|
||||
|
||||
if (
|
||||
array_key_exists('pinjaman_tokoh_adat_panen', $payload)
|
||||
&& ($payload['pinjaman_tokoh_adat_panen'] ?? null) !== PinjamanTokohAdatPanen::ADA->value
|
||||
) {
|
||||
$payload['keterangan_pinjaman_tokoh_adat'] = null;
|
||||
}
|
||||
|
||||
if (!empty($payload['total_hutang_tidak_bersedia'])) {
|
||||
$payload['total_hutang_rupiah'] = null;
|
||||
$payload['total_hutang_setara_kg_panen'] = null;
|
||||
}
|
||||
|
||||
if (
|
||||
array_key_exists('tekanan_jual_segera', $payload)
|
||||
&& ($payload['tekanan_jual_segera'] ?? null) !== TekananJualSegera::ADA->value
|
||||
) {
|
||||
$payload['penyebab_tekanan_jual_segera'] = null;
|
||||
}
|
||||
|
||||
if (
|
||||
array_key_exists('kebebasan_memilih_pembeli', $payload)
|
||||
&& (int) ($payload['kebebasan_memilih_pembeli'] ?? 0) >= KebebasanMemilihPembeli::CUKUP_BEBAS_SESEKALI_PINDAH->value
|
||||
) {
|
||||
$payload['alasan_tidak_bebas_memilih_pembeli'] = null;
|
||||
}
|
||||
|
||||
return $payload;
|
||||
}
|
||||
|
||||
private function validationMessages(): array
|
||||
{
|
||||
return [
|
||||
'required' => ':attribute wajib diisi.',
|
||||
'required_if' => ':attribute wajib diisi.',
|
||||
'required_unless' => ':attribute wajib diisi.',
|
||||
'required_with' => ':attribute wajib diisi.',
|
||||
'integer' => ':attribute harus berupa angka.',
|
||||
'numeric' => ':attribute harus berupa angka.',
|
||||
'boolean' => ':attribute harus dipilih.',
|
||||
'min' => ':attribute tidak boleh kurang dari :min.',
|
||||
'max' => ':attribute tidak boleh lebih dari :max karakter.',
|
||||
'digits' => ':attribute harus terdiri dari :digits digit.',
|
||||
'exists' => ':attribute tidak valid.',
|
||||
'in' => ':attribute tidak valid.',
|
||||
'array' => ':attribute harus berupa daftar data.',
|
||||
'string' => ':attribute harus berupa teks.',
|
||||
'unique' => ':attribute sudah digunakan.',
|
||||
];
|
||||
}
|
||||
|
||||
private function validationAttributes(): array
|
||||
{
|
||||
return [
|
||||
'form_section' => 'Bagian form',
|
||||
'petani_id' => 'Petani',
|
||||
'jumlah_tanggungan' => 'Jumlah tanggungan',
|
||||
'anak_masih_sekolah' => 'Anak masih sekolah',
|
||||
'yang_ikut_bekerja' => 'Yang ikut bekerja',
|
||||
'skor_periode_paceklik' => 'Periode paceklik',
|
||||
'bulan_paceklik' => 'Bulan paceklik biasanya',
|
||||
'sumber_penghasilan_paceklik' => 'Sumber penghasilan saat paceklik',
|
||||
'total_estimasi_biaya_kebun_per_musim' => 'Total estimasi biaya kebun per musim',
|
||||
'skor_kemampuan_menabung' => 'Kemampuan menabung',
|
||||
'estimasi_tabungan_per_bulan' => 'Estimasi tabungan per bulan',
|
||||
'skor_kecukupan_penghasilan' => 'Kecukupan penghasilan untuk keluarga',
|
||||
'alasan_kecukupan_penghasilan' => 'Alasan kecukupan penghasilan',
|
||||
'status_kepemilikan_lahan' => 'Status kepemilikan lahan',
|
||||
'skor_kejelasan_status_lahan' => 'Kejelasan status lahan',
|
||||
'ada_sertifikat_dokumen' => 'Ada sertifikat/dokumen',
|
||||
'ada_sengketa' => 'Ada sengketa',
|
||||
'keterangan_sengketa' => 'Keterangan sengketa',
|
||||
'pihak_membantu_konflik' => 'Pihak yang membantu',
|
||||
'pihak_membantu_konflik_nama' => 'Nama pihak',
|
||||
'tahun_bantuan_konflik' => 'Tahun bantuan',
|
||||
'status_konflik' => 'Status konflik',
|
||||
'kemauan_mencoba_praktik_baru' => 'Kemauan mencoba cara baru',
|
||||
'alasan_mencoba_praktik_baru' => 'Alasan mencoba praktik baru',
|
||||
'hambatan_mengubah_cara_bertani' => 'Hambatan utama mengubah cara berkebun',
|
||||
'pemahaman_mutu_harga' => 'Pemahaman mutu vs. harga jual',
|
||||
'contoh_pemahaman_mutu_harga' => 'Contoh/penjelasan petani',
|
||||
'pengetahuan_harga_hasil_olah' => 'Pengetahuan harga hasil olah',
|
||||
'pernah_jual_harga_lebih_tinggi' => 'Pengalaman jual dengan harga lebih tinggi',
|
||||
'penyebab_harga_lebih_tinggi' => 'Penyebab harga lebih tinggi',
|
||||
'usaha_mutu_tambahan_harga' => 'Usaha meningkatkan mutu vs. tambahan harga',
|
||||
'alasan_usaha_mutu_tambahan_harga' => 'Alasan usaha mutu tambahan harga',
|
||||
'panutan_petani_sukses' => 'Panutan di sekitar petani',
|
||||
'nama_lokasi_panutan' => 'Nama dan lokasi panutan',
|
||||
'kemauan_ikut_program' => 'Kemauan ikut program',
|
||||
'harapan_program' => 'Harapan dari program',
|
||||
'orientasi_rencana_jangka_panjang' => 'Orientasi rencana 3-5 tahun ke depan',
|
||||
'rencana_jangka_panjang' => 'Rencana yang akan dilakukan',
|
||||
'terdaftar_kelompok_tani' => 'Status terdaftar di kelompok tani',
|
||||
'nama_kelompok_tani' => 'Nama kelompok',
|
||||
'lama_bergabung_kelompok_tahun' => 'Lama bergabung',
|
||||
'kedekatan_sesama_anggota' => 'Kedekatan dengan sesama anggota',
|
||||
'keaktifan_pertemuan_kelompok' => 'Kehadiran dan keaktifan di pertemuan',
|
||||
'topik_biasa_dibahas' => 'Topik yang biasa dibahas',
|
||||
'peran_dalam_kelompok' => 'Jabatan atau peran di kelompok',
|
||||
'manfaat_kelompok_tani' => 'Manfaat dari kelompok tani',
|
||||
'status_kartu_tani' => 'Status Kartu Tani',
|
||||
'bisa_beli_pupuk_bersubsidi' => 'Kemampuan menggunakan Kartu Tani untuk membeli pupuk bersubsidi',
|
||||
'manfaat_lain_kartu_tani' => 'Manfaat lain setelah daftar Kartu Tani',
|
||||
'status_rekening_tabungan' => 'Status rekening atau tabungan',
|
||||
'nama_bank' => 'Nama bank',
|
||||
'pengalaman_kredit_kebun' => 'Pengalaman kredit untuk kebun',
|
||||
'alasan_kredit_ditolak' => 'Alasan kredit ditolak atau tidak jadi',
|
||||
'alasan_kredit_ditolak.*' => 'Alasan kredit ditolak atau tidak jadi',
|
||||
'alasan_kredit_ditolak_lainnya' => 'Alasan kredit lainnya',
|
||||
'kondisi_aset_produktif' => 'Kondisi aset produktif selain lahan',
|
||||
'jenis_aset_produktif' => 'Jenis aset',
|
||||
'jenis_aset_produktif.*' => 'Jenis aset',
|
||||
'jenis_aset_produktif_lainnya' => 'Jenis aset lainnya',
|
||||
'keterangan_kondisi_aset' => 'Keterangan kondisi aset',
|
||||
'keterlibatan_program_keuangan_formal' => 'Keterlibatan dalam program bantuan',
|
||||
'status_program_keuangan_formal' => 'Status per program',
|
||||
'status_program_keuangan_formal.*' => 'Status per program',
|
||||
'program_keuangan_formal_lainnya_nama' => 'Nama program lainnya',
|
||||
'pernah_bantuan_ngo_perusahaan' => 'Status bantuan NGO atau perusahaan',
|
||||
'detail_bantuan_ngo_perusahaan' => 'Detail bantuan NGO atau perusahaan',
|
||||
'detail_bantuan_ngo_perusahaan.*.nama_lembaga' => 'Nama lembaga',
|
||||
'detail_bantuan_ngo_perusahaan.*.bentuk_bantuan' => 'Bentuk bantuan',
|
||||
'detail_bantuan_ngo_perusahaan.*.frekuensi' => 'Frekuensi bantuan',
|
||||
'detail_bantuan_ngo_perusahaan.*.tahun_terakhir' => 'Tahun terakhir bantuan',
|
||||
'keterikatan_hutang_panen' => 'Hutang yang dikaitkan dengan hasil panen',
|
||||
'pinjaman_tokoh_adat_panen' => 'Pinjaman dari tokoh adat atau mosalaki terkait panen',
|
||||
'keterangan_pinjaman_tokoh_adat' => 'Keterangan pinjaman dari tokoh adat atau mosalaki',
|
||||
'total_hutang_rupiah' => 'Total hutang saat ini',
|
||||
'total_hutang_setara_kg_panen' => 'Total hutang setara hasil panen',
|
||||
'total_hutang_tidak_bersedia' => 'Status tidak bersedia menjawab total hutang',
|
||||
'praktik_ijon' => 'Praktik ijon',
|
||||
'tekanan_jual_segera' => 'Tekanan jual segera meski harga rendah',
|
||||
'penyebab_tekanan_jual_segera' => 'Penyebab tekanan jual segera',
|
||||
'kebebasan_memilih_pembeli' => 'Kebebasan memilih pembeli',
|
||||
'alasan_tidak_bebas_memilih_pembeli' => 'Alasan jika tidak bebas',
|
||||
'minat_pembeli_harga_stabil' => 'Minat ke pembeli harga stabil jangka panjang',
|
||||
'alasan_minat_pembeli_harga_stabil' => 'Alasan minat ke pembeli harga stabil',
|
||||
'pendapatan_komoditas.*.kategori' => 'Kategori pendapatan komoditas',
|
||||
'pendapatan_komoditas.*.komoditas' => 'Komoditas',
|
||||
'pendapatan_komoditas.*.pendapatan' => 'Pendapatan',
|
||||
'pendapatan_komoditas.*.periode' => 'Periode',
|
||||
'pendapatan_luar_pertanian.*.jenis_pekerjaan' => 'Jenis pekerjaan',
|
||||
'pendapatan_luar_pertanian.*.estimasi_per_bulan' => 'Estimasi per bulan',
|
||||
];
|
||||
}
|
||||
|
||||
private function normalizeSkorPayload(array $payload): array
|
||||
{
|
||||
foreach ([
|
||||
@@ -279,6 +854,21 @@ class SosialEkonomiController extends Controller
|
||||
'skor_kemampuan_menabung',
|
||||
'skor_kecukupan_penghasilan',
|
||||
'skor_kejelasan_status_lahan',
|
||||
'kemauan_mencoba_praktik_baru',
|
||||
'pemahaman_mutu_harga',
|
||||
'panutan_petani_sukses',
|
||||
'kemauan_ikut_program',
|
||||
'orientasi_rencana_jangka_panjang',
|
||||
'keaktifan_pertemuan_kelompok',
|
||||
'peran_dalam_kelompok',
|
||||
'manfaat_kelompok_tani',
|
||||
'status_rekening_tabungan',
|
||||
'pengalaman_kredit_kebun',
|
||||
'kondisi_aset_produktif',
|
||||
'keterlibatan_program_keuangan_formal',
|
||||
'keterikatan_hutang_panen',
|
||||
'praktik_ijon',
|
||||
'kebebasan_memilih_pembeli',
|
||||
] as $field) {
|
||||
if (array_key_exists($field, $payload) && !is_null($payload[$field]) && $payload[$field] !== '') {
|
||||
$payload[$field] = (int) $payload[$field];
|
||||
@@ -371,6 +961,62 @@ class SosialEkonomiController extends Controller
|
||||
'pihakMembantuKonflikOptions' => PihakMembantuKonflik::options(),
|
||||
'pihakMembantuTanpaBantuanValue' => PihakMembantuKonflik::TIDAK_ADA_SELESAIKAN_SENDIRI->value,
|
||||
'statusKonflikOptions' => StatusKonflik::options(),
|
||||
'kemauanMencobaPraktikBaruOptions' => KemauanMencobaPraktikBaru::options(),
|
||||
'pemahamanMutuHargaOptions' => PemahamanMutuHarga::options(),
|
||||
'pengetahuanHargaHasilOlahOptions' => PengetahuanHargaHasilOlah::options(),
|
||||
'pernahJualHargaLebihTinggiOptions' => PernahJualHargaLebihTinggi::options(),
|
||||
'pernahJualHargaLebihTinggiPernahValue' => PernahJualHargaLebihTinggi::PERNAH->value,
|
||||
'usahaMutuTambahanHargaOptions' => UsahaMutuTambahanHarga::options(),
|
||||
'panutanPetaniSuksesOptions' => PanutanPetaniSukses::options(),
|
||||
'panutanPetaniSuksesTidakAdaValue' => PanutanPetaniSukses::TIDAK_ADA->value,
|
||||
'kemauanIkutProgramOptions' => KemauanIkutProgram::options(),
|
||||
'orientasiRencanaJangkaPanjangOptions' => OrientasiRencanaJangkaPanjang::options(),
|
||||
'terdaftarKelompokTaniOptions' => TerdaftarKelompokTani::options(),
|
||||
'terdaftarKelompokTaniYaValue' => TerdaftarKelompokTani::YA->value,
|
||||
'terdaftarKelompokTaniTidakValue' => TerdaftarKelompokTani::TIDAK->value,
|
||||
'kedekatanSesamaAnggotaOptions' => KedekatanSesamaAnggota::options(),
|
||||
'keaktifanPertemuanKelompokOptions' => KeaktifanPertemuanKelompok::options(),
|
||||
'peranDalamKelompokOptions' => PeranDalamKelompok::options(),
|
||||
'manfaatKelompokTaniOptions' => ManfaatKelompokTani::options(),
|
||||
'statusKartuTaniOptions' => StatusKartuTani::options(),
|
||||
'bisaBeliPupukBersubsidiOptions' => BisaBeliPupukBersubsidi::options(),
|
||||
'statusRekeningTabunganOptions' => StatusRekeningTabungan::options(),
|
||||
'statusRekeningTidakPunyaValue' => StatusRekeningTabungan::TIDAK_PUNYA_REKENING->value,
|
||||
'pengalamanKreditKebunOptions' => PengalamanKreditKebun::options(),
|
||||
'pengalamanKreditPerluAlasanValues' => [
|
||||
PengalamanKreditKebun::TIDAK_PERNAH_MENCOBA->value,
|
||||
PengalamanKreditKebun::PERNAH_COBA_DITOLAK->value,
|
||||
],
|
||||
'alasanKreditDitolakOptions' => AlasanKreditDitolak::options(),
|
||||
'alasanKreditLainnyaValue' => AlasanKreditDitolak::LAINNYA->value,
|
||||
'kondisiAsetProduktifOptions' => KondisiAsetProduktif::options(),
|
||||
'kondisiAsetTidakAdaValue' => KondisiAsetProduktif::TIDAK_ADA->value,
|
||||
'jenisAsetProduktifOptions' => JenisAsetProduktif::options(),
|
||||
'jenisAsetLainnyaValue' => JenisAsetProduktif::LAINNYA->value,
|
||||
'keterlibatanProgramKeuanganFormalOptions' => KeterlibatanProgramKeuanganFormal::options(),
|
||||
'keterlibatanProgramKeuanganFormalTidakPernahValue' => KeterlibatanProgramKeuanganFormal::TIDAK_PERNAH_MENERIMA->value,
|
||||
'statusProgramKeuanganFormalOptions' => StatusProgramKeuanganFormal::options(),
|
||||
'programKeuanganFormalRows' => [
|
||||
'pkh' => 'PKH',
|
||||
'blt' => 'BLT',
|
||||
'kur' => 'KUR',
|
||||
'kredit_koperasi_resmi' => 'Kredit koperasi resmi',
|
||||
'credit_union_cu' => 'Credit Union (CU)',
|
||||
'pinjaman_bumdes' => 'Pinjaman BUMDes',
|
||||
'modal_hibah_dinas_pertanian' => 'Modal-hibah dinas pertanian',
|
||||
'lainnya' => 'Lainnya',
|
||||
],
|
||||
'pernahBantuanNgoPerusahaanOptions' => PernahBantuanNgoPerusahaan::options(),
|
||||
'pernahBantuanNgoPerusahaanPernahValue' => PernahBantuanNgoPerusahaan::PERNAH->value,
|
||||
'keterikatanHutangPanenOptions' => KeterikatanHutangPanen::options(),
|
||||
'pinjamanTokohAdatPanenOptions' => PinjamanTokohAdatPanen::options(),
|
||||
'pinjamanTokohAdatAdaValue' => PinjamanTokohAdatPanen::ADA->value,
|
||||
'praktikIjonOptions' => PraktikIjon::options(),
|
||||
'tekananJualSegeraOptions' => TekananJualSegera::options(),
|
||||
'tekananJualSegeraAdaValue' => TekananJualSegera::ADA->value,
|
||||
'kebebasanMemilihPembeliOptions' => KebebasanMemilihPembeli::options(),
|
||||
'kebebasanMemilihPembeliCukupBebasValue' => KebebasanMemilihPembeli::CUKUP_BEBAS_SESEKALI_PINDAH->value,
|
||||
'minatPembeliHargaStabilOptions' => MinatPembeliHargaStabil::options(),
|
||||
];
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,77 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers\Web\Produktivitas;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use App\Models\Pertanian\Petani;
|
||||
use App\Models\Pertanian\SurveyProduktivitas;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\Validator;
|
||||
use Illuminate\Support\Str;
|
||||
|
||||
class SurveyProduktivitasController extends Controller
|
||||
{
|
||||
public function store($petaniId, Request $request)
|
||||
{
|
||||
$petani = Petani::findOrFail($petaniId);
|
||||
|
||||
$validator = Validator::make($request->all(), [
|
||||
'produktivitas_komoditas' => ['required', 'array', 'min:1'],
|
||||
'produktivitas_komoditas.*.komoditas_id' => ['required', 'exists:master_komoditas,id'],
|
||||
'produktivitas_komoditas.*.hasil_panen_3_musim' => ['required', 'numeric', 'min:0'],
|
||||
'produktivitas_komoditas.*.satuan' => ['required', 'in:ha_tahun,pohon_tahun'],
|
||||
], [
|
||||
'produktivitas_komoditas.required' => 'Minimal satu data produktivitas harus diisi.',
|
||||
'produktivitas_komoditas.*.komoditas_id.required' => 'Komoditas wajib dipilih.',
|
||||
'produktivitas_komoditas.*.komoditas_id.exists' => 'Komoditas yang dipilih tidak valid.',
|
||||
'produktivitas_komoditas.*.hasil_panen_3_musim.required' => 'Hasil panen wajib diisi.',
|
||||
'produktivitas_komoditas.*.hasil_panen_3_musim.numeric' => 'Hasil panen harus berupa angka.',
|
||||
'produktivitas_komoditas.*.hasil_panen_3_musim.min' => 'Hasil panen tidak boleh kurang dari 0.',
|
||||
'produktivitas_komoditas.*.satuan.required' => 'Satuan wajib dipilih.',
|
||||
'produktivitas_komoditas.*.satuan.in' => 'Satuan yang dipilih tidak valid.',
|
||||
]);
|
||||
|
||||
if ($validator->fails()) {
|
||||
return $this->redirectBackToFragment($request)->withErrors($validator)->withInput();
|
||||
}
|
||||
|
||||
$validated = $validator->validated();
|
||||
|
||||
foreach ($validated['produktivitas_komoditas'] as $row) {
|
||||
SurveyProduktivitas::create([
|
||||
'uid' => 'SPV-'.strtoupper(Str::random(10)),
|
||||
'petani_id' => $petani->id,
|
||||
'komoditas_id' => $row['komoditas_id'],
|
||||
'kuantitas' => $row['hasil_panen_3_musim'],
|
||||
'satuan' => $row['satuan'],
|
||||
'created_by' => auth()->id(),
|
||||
'updated_by' => auth()->id(),
|
||||
]);
|
||||
}
|
||||
|
||||
return $this->redirectBackToFragment($request)->with('success', 'Data produktivitas berhasil disimpan.');
|
||||
}
|
||||
|
||||
public function destroy($petaniId, $surveyProduktivitasId, Request $request)
|
||||
{
|
||||
$surveyProduktivitas = SurveyProduktivitas::where('petani_id', $petaniId)
|
||||
->where('id', $surveyProduktivitasId)
|
||||
->firstOrFail();
|
||||
$surveyProduktivitas->deleted_by = auth()->id();
|
||||
$surveyProduktivitas->save();
|
||||
$surveyProduktivitas->delete();
|
||||
|
||||
return $this->redirectBackToFragment($request)->with('success', 'Data produktivitas berhasil dihapus.');
|
||||
}
|
||||
|
||||
private function redirectBackToFragment(Request $request)
|
||||
{
|
||||
$fragment = $request->input('redirect_fragment');
|
||||
|
||||
if (! is_string($fragment) || ! preg_match('/^[A-Za-z0-9_-]+$/', $fragment)) {
|
||||
return back();
|
||||
}
|
||||
|
||||
return redirect()->to(Str::before(url()->previous(), '#').'#'.$fragment);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,21 @@
|
||||
<?php
|
||||
|
||||
namespace App\Models\Master;
|
||||
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
use Illuminate\Database\Eloquent\SoftDeletes;
|
||||
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
||||
|
||||
class JenisTanaman extends Model
|
||||
{
|
||||
use HasFactory, SoftDeletes;
|
||||
|
||||
protected $table = 'master_jenis_tanaman';
|
||||
|
||||
protected $fillable = [
|
||||
'nama',
|
||||
'created_by',
|
||||
'updated_by',
|
||||
'deleted_by',
|
||||
];
|
||||
}
|
||||
@@ -4,8 +4,14 @@ namespace App\Models\Pertanian;
|
||||
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
use Illuminate\Database\Eloquent\SoftDeletes;
|
||||
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
|
||||
{
|
||||
@@ -38,6 +44,31 @@ class AksesPasar extends Model
|
||||
protected $casts = [
|
||||
'saluran_terdahulu' => 'array',
|
||||
];
|
||||
|
||||
protected static function booted(): void
|
||||
{
|
||||
static::saved(function (AksesPasar $aksesPasar) {
|
||||
|
||||
$petani = Petani::find($aksesPasar->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_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
|
||||
]);
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
public function petani()
|
||||
|
||||
@@ -5,8 +5,10 @@ namespace App\Models\Pertanian;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
use Illuminate\Database\Eloquent\SoftDeletes;
|
||||
use Illuminate\Database\Eloquent\Builder;
|
||||
use Illuminate\Database\Eloquent\Relations\HasMany;
|
||||
use App\Models\Master\JenisKomoditas;
|
||||
use App\Models\Master\Varietas;
|
||||
use App\Models\Pertanian\Petani;
|
||||
|
||||
class Komoditas extends Model
|
||||
{
|
||||
@@ -14,11 +16,17 @@ class Komoditas extends Model
|
||||
|
||||
protected $table = 'master_komoditas';
|
||||
|
||||
protected $casts = [
|
||||
'is_utama' => 'boolean',
|
||||
];
|
||||
|
||||
protected $fillable = [
|
||||
'nama',
|
||||
'kode',
|
||||
'created_by',
|
||||
'updated_by',
|
||||
'deleted_by',
|
||||
'is_utama',
|
||||
];
|
||||
|
||||
protected static function booted()
|
||||
@@ -42,4 +50,9 @@ class Komoditas extends Model
|
||||
{
|
||||
return $this->hasMany(Varietas::class, 'komoditas_id');
|
||||
}
|
||||
|
||||
public function petani(): HasMany
|
||||
{
|
||||
return $this->hasMany(Petani::class, 'komoditas_id');
|
||||
}
|
||||
}
|
||||
|
||||
@@ -14,6 +14,10 @@ use Illuminate\Database\Eloquent\Relations\HasMany;
|
||||
use App\Models\Pertanian\Komoditas;
|
||||
use App\Models\Master\JenisKomoditas;
|
||||
use App\Models\Master\Varietas;
|
||||
use App\Enums\KondisiTanaman;
|
||||
use App\Enums\SeranganHama;
|
||||
use App\Enums\PenyakitTanaman;
|
||||
use App\Enums\KeparahanSerangan;
|
||||
|
||||
class Lahan extends Model
|
||||
{
|
||||
@@ -48,11 +52,28 @@ class Lahan extends Model
|
||||
'created_by',
|
||||
'updated_by',
|
||||
'deleted_by',
|
||||
|
||||
'komoditas_lain',
|
||||
'tanaman_penaung',
|
||||
|
||||
'foto',
|
||||
|
||||
'jenis_hama',
|
||||
'jenis_penyakit',
|
||||
];
|
||||
|
||||
protected $casts = [
|
||||
'status_kepemilikan' => StatusLahan::class,
|
||||
'path' => 'array',
|
||||
'komoditas_lain' => 'array',
|
||||
'tanaman_penaung' => 'array',
|
||||
'kondisi_tanaman' => KondisiTanaman::class,
|
||||
'serangan_hama' => SeranganHama::class,
|
||||
'penyakit_tanaman' => PenyakitTanaman::class,
|
||||
'keparahan_serangan' => KeparahanSerangan::class,
|
||||
'foto' => 'array',
|
||||
'jenis_hama' => 'array',
|
||||
'jenis_penyakit' => 'array'
|
||||
];
|
||||
|
||||
public function profile(): BelongsTo
|
||||
|
||||
+334
-16
@@ -2,20 +2,33 @@
|
||||
|
||||
namespace App\Models\Pertanian;
|
||||
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
use Illuminate\Database\Eloquent\SoftDeletes;
|
||||
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
||||
use Illuminate\Database\Eloquent\Relations\BelongsTo;
|
||||
use Illuminate\Database\Eloquent\Relations\HasOne;
|
||||
use Carbon\Carbon;
|
||||
|
||||
use App\Models\Wilayah\DesaKelurahan;
|
||||
use App\Enums\Pendidikan;
|
||||
use App\Enums\Pernikahan;
|
||||
use App\Models\User;
|
||||
use App\Models\Wilayah\DesaKelurahan;
|
||||
use App\Models\Pertanian\Lahan;
|
||||
use App\Models\Pertanian\Komoditas;
|
||||
use App\Models\Pertanian\PraktikBudidaya;
|
||||
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;
|
||||
use Illuminate\Database\Eloquent\Relations\BelongsTo;
|
||||
use Illuminate\Database\Eloquent\Relations\HasMany;
|
||||
use Illuminate\Database\Eloquent\Relations\HasOne;
|
||||
use Illuminate\Database\Eloquent\SoftDeletes;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
use Illuminate\Support\Str;
|
||||
|
||||
class Petani extends Model
|
||||
{
|
||||
use SoftDeletes;
|
||||
use SoftDeletes;
|
||||
|
||||
protected $table = 'petani';
|
||||
|
||||
@@ -25,28 +38,30 @@ class Petani extends Model
|
||||
|
||||
'nomor_telepon',
|
||||
'alamat',
|
||||
|
||||
|
||||
'kk',
|
||||
'ktp',
|
||||
'uid',
|
||||
'desa_kelurahan_id',
|
||||
|
||||
'foto',
|
||||
|
||||
|
||||
'path_kk',
|
||||
'file_kk',
|
||||
'path_ktp',
|
||||
'file_ktp',
|
||||
|
||||
|
||||
'jenis_kelamin',
|
||||
'tempat_lahir',
|
||||
'tanggal_lahir',
|
||||
'pendidikan_terakhir',
|
||||
'status_perkawinan',
|
||||
|
||||
'komoditas_id',
|
||||
|
||||
'created_by',
|
||||
'updated_by',
|
||||
'deleted_by'
|
||||
'deleted_by',
|
||||
];
|
||||
|
||||
protected $casts = [
|
||||
@@ -59,7 +74,7 @@ class Petani extends Model
|
||||
|
||||
public function getUmurAttribute(): ?int
|
||||
{
|
||||
if (!$this->tanggal_lahir) {
|
||||
if (! $this->tanggal_lahir) {
|
||||
return null;
|
||||
}
|
||||
|
||||
@@ -76,8 +91,311 @@ class Petani extends Model
|
||||
return $this->belongsTo(User::class, 'user_id');
|
||||
}
|
||||
|
||||
public function praktik_budidaya(): HasOne
|
||||
protected static function booted(): void
|
||||
{
|
||||
return $this->hasOne(PraktikBudidaya::class, 'petani_id');
|
||||
static::saved(function (Petani $petani) {
|
||||
|
||||
$skor = SkorPetani::where('petani_id')->orderBy('id')->first();
|
||||
if (! $skor) {
|
||||
$petaniUid = $petani->uid;
|
||||
$part = explode('-', $petaniUid);
|
||||
$skor = SkorPetani::create([
|
||||
'uid' => 'SKR-'.$part[1].'-'.strtoupper(Str::random(10)),
|
||||
'created_by' => $petani->created_by,
|
||||
'updated_by' => $petani->updated_by,
|
||||
]);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public function komoditas(): BelongsTo
|
||||
{
|
||||
return $this->belongsTo(Komoditas::class, 'komoditas_id');
|
||||
}
|
||||
|
||||
public function skor(): HasOne
|
||||
{
|
||||
return $this->hasOne(SkorPetani::class, 'petani_id');
|
||||
}
|
||||
|
||||
public function praktikBudidaya(): HasOne
|
||||
{
|
||||
return $this->hasOne(PraktikBudidaya::class, 'petani_id')->latestOfMany();
|
||||
}
|
||||
|
||||
public function surveyPanen(): HasOne
|
||||
{
|
||||
return $this->hasOne(SurveyPanen::class, 'petani_id')->latestOfMany();
|
||||
}
|
||||
|
||||
public function surveyPelatihan(): HasMany
|
||||
{
|
||||
return $this->hasMany(SurveyPelatihan::class, 'petani_id');
|
||||
}
|
||||
|
||||
public function surveySertifikasi(): HasMany
|
||||
{
|
||||
return $this->hasMany(SurveySertifikasi::class, 'petani_id');
|
||||
}
|
||||
|
||||
public function surveyProduktivitas(): HasMany
|
||||
{
|
||||
return $this->hasMany(SurveyProduktivitas::class, 'petani_id');
|
||||
}
|
||||
|
||||
public function lahans(): HasMany
|
||||
{
|
||||
return $this->hasMany(Lahan::class, 'petani_id');
|
||||
}
|
||||
|
||||
public function sosialEkonomi(): HasOne
|
||||
{
|
||||
return $this->hasOne(SosialEkonomi::class, 'petani_id');
|
||||
}
|
||||
|
||||
public function aksesPasar(): HasOne
|
||||
{
|
||||
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')) {
|
||||
return null;
|
||||
}
|
||||
|
||||
$lahan = $this->lahans()->get();
|
||||
|
||||
if ($lahan->isEmpty()) {
|
||||
return null;
|
||||
}
|
||||
|
||||
$nilaiKondisi = $lahan
|
||||
->map(fn ($item) => match ($this->enumValue($item->kondisi_tanaman)) {
|
||||
'baik' => 5,
|
||||
'sedang' => 3,
|
||||
'buruk' => 1,
|
||||
'mati' => 0,
|
||||
default => null,
|
||||
})
|
||||
->filter(fn ($value) => ! is_null($value));
|
||||
|
||||
if ($nilaiKondisi->isEmpty()) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return round($nilaiKondisi->avg() * 0.1, 1);
|
||||
}
|
||||
|
||||
public function skorPraktikBudidaya(): ?float
|
||||
{
|
||||
if (! Schema::hasTable('praktik_budidaya')) {
|
||||
return null;
|
||||
}
|
||||
|
||||
$praktikBudidaya = $this->praktikBudidaya()->first();
|
||||
|
||||
if (! $praktikBudidaya) {
|
||||
return null;
|
||||
}
|
||||
|
||||
$nilai = collect([
|
||||
$praktikBudidaya->frekuensi_pemangkasan_utama,
|
||||
$praktikBudidaya->pemberian_pupuk,
|
||||
$praktikBudidaya->metode_penanganan_opt,
|
||||
$praktikBudidaya->frekuensi_sanitasi_lahan,
|
||||
$praktikBudidaya->penanganan_gulma,
|
||||
$praktikBudidaya->kondisi_pengelolaan_air,
|
||||
$praktikBudidaya->nilai_konservasi_tanah,
|
||||
])->filter(fn ($value) => ! is_null($value) && $value !== '');
|
||||
|
||||
if ($nilai->isEmpty()) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return round($nilai->sum(fn ($value) => (int) $value) * 0.2, 1);
|
||||
}
|
||||
|
||||
public function skorPendidikan(): ?float
|
||||
{
|
||||
if (! $this->pendidikan_terakhir) {
|
||||
return null;
|
||||
}
|
||||
|
||||
$nilai = match ($this->enumValue($this->pendidikan_terakhir)) {
|
||||
Pendidikan::TIDAK_SEKOLAH->value => 1,
|
||||
Pendidikan::SD->value => 2,
|
||||
Pendidikan::SMP->value => 3,
|
||||
Pendidikan::SMA->value,
|
||||
Pendidikan::PESANTREN->value,
|
||||
Pendidikan::LAINNYA->value => 4,
|
||||
Pendidikan::DIPLOMA->value,
|
||||
Pendidikan::SARJANA->value,
|
||||
Pendidikan::MAGISTER->value,
|
||||
Pendidikan::DOKTOR->value => 5,
|
||||
default => null,
|
||||
};
|
||||
|
||||
return is_null($nilai) ? null : round($nilai * 0.1, 1);
|
||||
}
|
||||
|
||||
public function skorSosialEkonomi(): ?float
|
||||
{
|
||||
if (! Schema::hasTable('sosial_ekonomi')) {
|
||||
return null;
|
||||
}
|
||||
|
||||
$sosialEkonomi = $this->sosialEkonomi()->first();
|
||||
|
||||
if (! $sosialEkonomi) {
|
||||
return null;
|
||||
}
|
||||
|
||||
$nilai = collect([
|
||||
$this->enumValue($sosialEkonomi->skor_periode_paceklik),
|
||||
$this->enumValue($sosialEkonomi->skor_kemampuan_menabung),
|
||||
$this->enumValue($sosialEkonomi->skor_kecukupan_penghasilan),
|
||||
$this->enumValue($sosialEkonomi->skor_kejelasan_status_lahan),
|
||||
$this->enumValue($sosialEkonomi->kemauan_mencoba_praktik_baru),
|
||||
$this->enumValue($sosialEkonomi->pemahaman_mutu_harga),
|
||||
$this->enumValue($sosialEkonomi->panutan_petani_sukses),
|
||||
$this->enumValue($sosialEkonomi->kemauan_ikut_program),
|
||||
$this->enumValue($sosialEkonomi->orientasi_rencana_jangka_panjang),
|
||||
$this->enumValue($sosialEkonomi->keaktifan_pertemuan_kelompok),
|
||||
$this->enumValue($sosialEkonomi->peran_dalam_kelompok),
|
||||
$this->enumValue($sosialEkonomi->manfaat_kelompok_tani),
|
||||
$this->enumValue($sosialEkonomi->status_rekening_tabungan),
|
||||
$this->enumValue($sosialEkonomi->pengalaman_kredit_kebun),
|
||||
$this->enumValue($sosialEkonomi->kondisi_aset_produktif),
|
||||
$this->enumValue($sosialEkonomi->keterlibatan_program_keuangan_formal),
|
||||
$this->enumValue($sosialEkonomi->keterikatan_hutang_panen),
|
||||
$this->enumValue($sosialEkonomi->praktik_ijon),
|
||||
$this->enumValue($sosialEkonomi->kebebasan_memilih_pembeli),
|
||||
])->filter(fn ($value) => ! is_null($value) && $value !== '' && (int) $value > 0);
|
||||
|
||||
if ($nilai->isEmpty()) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return round($nilai->sum(fn ($value) => (int) $value) * 0.2, 1);
|
||||
}
|
||||
|
||||
public function skorAksesPasar(): ?float
|
||||
{
|
||||
if (! Schema::hasTable('akses_pasar')) {
|
||||
return null;
|
||||
}
|
||||
|
||||
$aksesPasar = $this->aksesPasar()->first();
|
||||
|
||||
if (! $aksesPasar) {
|
||||
return null;
|
||||
}
|
||||
|
||||
$nilai = collect(Schema::getColumnListing($aksesPasar->getTable()))
|
||||
->filter(fn ($field) => str_starts_with($field, 'skor_'))
|
||||
->map(fn ($field) => $aksesPasar->getAttribute($field))
|
||||
->filter(fn ($value) => ! is_null($value) && $value !== '');
|
||||
|
||||
if ($nilai->isEmpty()) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return round($nilai->sum(fn ($value) => (int) $value) * 0.1, 1);
|
||||
}
|
||||
|
||||
public function skorSegmenPetani(): ?float
|
||||
{
|
||||
$nilai = collect([
|
||||
$this->skorLahanTanaman(),
|
||||
$this->skorPraktikBudidaya(),
|
||||
$this->skorPendidikan(),
|
||||
$this->skorSosialEkonomi(),
|
||||
$this->skorAksesPasar(),
|
||||
])->filter(fn ($value) => ! is_null($value));
|
||||
|
||||
if ($nilai->isEmpty()) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return round($nilai->sum(), 1);
|
||||
}
|
||||
|
||||
public function segmenPetani(): ?string
|
||||
{
|
||||
$skor = $this->skorSegmenPetani();
|
||||
|
||||
if (is_null($skor)) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return match (true) {
|
||||
$skor >= 4.0 => 'Penggerak',
|
||||
$skor >= 3.0 => 'Perintis',
|
||||
$skor >= 2.0 => 'Pemerhati',
|
||||
$skor >= 1.0 => 'Pemula',
|
||||
default => 'Belum tersegmentasi',
|
||||
};
|
||||
}
|
||||
|
||||
private function enumValue(mixed $value): mixed
|
||||
{
|
||||
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';
|
||||
}
|
||||
|
||||
public function keteranganSegmen(): ?string
|
||||
{
|
||||
$skor = $this->skor;
|
||||
|
||||
if (!$skor) {
|
||||
return null;
|
||||
}
|
||||
|
||||
if ($skor->skor_kesiapan_adopsi >= 4.0) {
|
||||
return 'Siap menjadi peserta agrolab utama dan panutan bagi petani lain';
|
||||
} elseif ($skor->skor_kesiapan_adopsi >= 3.0) {
|
||||
return 'Berpotensi berkembang menjadi Penggerak dengan dukungan yang tepat';
|
||||
} elseif ($skor->skor_kesiapan_adopsi >= 2.0) {
|
||||
return 'Perlu melihat bukti hasil nyata dari Penggerak sebelum mau bergerak';
|
||||
} elseif ($skor->skor_kesiapan_adopsi >= 1.0) {
|
||||
return 'Butuh penanganan hambatan dasar terlebih dahulu sebelum intervensi teknis';
|
||||
} else {
|
||||
return 'Belum tersegmentasi, data belum lengkap';
|
||||
}
|
||||
|
||||
return 'Belum tersegmentasi, data belum lengkap';
|
||||
}
|
||||
|
||||
public function creator(): BelongsTo
|
||||
{
|
||||
return $this->belongsTo(User::class, 'created_by');
|
||||
}
|
||||
}
|
||||
|
||||
@@ -5,9 +5,16 @@ namespace App\Models\Pertanian;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
use Illuminate\Database\Eloquent\SoftDeletes;
|
||||
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
||||
use Illuminate\Database\Eloquent\Relations\BelongsTo;
|
||||
use Illuminate\Database\Eloquent\Relations\BelongsTo;
|
||||
use Illuminate\Database\Eloquent\Relations\HasMany;
|
||||
use Illuminate\Database\Eloquent\Relations\HasOne;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
use Illuminate\Support\Str;
|
||||
|
||||
use App\Models\Pertanian\Petani;
|
||||
use App\Models\Pertanian\SkorPetani;
|
||||
use App\Models\Pertanian\Tanaman;
|
||||
use App\Models\Pertanian\Lahan;
|
||||
|
||||
class PraktikBudidaya extends Model
|
||||
{
|
||||
@@ -19,7 +26,8 @@ class PraktikBudidaya extends Model
|
||||
'teknik_pemangkasan' => 'array',
|
||||
'jenis_hama' => 'array',
|
||||
'jenis_penyakit' => 'array',
|
||||
'kebiasaan_konservasi_tanah' => 'array'
|
||||
'sumber_air' => 'array',
|
||||
'kebiasaan_konservasi_tanah' => 'array',
|
||||
];
|
||||
|
||||
protected $fillable = [
|
||||
@@ -45,7 +53,8 @@ class PraktikBudidaya extends Model
|
||||
'intensitas_serangan',
|
||||
'waktu_kemunculan_terparah',
|
||||
'metode_paling_sering_dilakukan',
|
||||
'volume_obat_obatan_permusim',
|
||||
'volume_obat_obatan_padat_permusim',
|
||||
'volume_obat_obatan_cair_permusim',
|
||||
'satuan_volume_obat_obatan',
|
||||
'frekuensi_sanitasi_lahan',
|
||||
'penanganan_sisa_buah_ranting',
|
||||
@@ -53,15 +62,92 @@ class PraktikBudidaya extends Model
|
||||
'kondisi_pengelolaan_air',
|
||||
'sumber_air',
|
||||
'sistem_irigasi',
|
||||
'kebutuan_air_permusim',
|
||||
'kebutuhan_air_permusim',
|
||||
'kebiasaan_konservasi_tanah',
|
||||
'pemahaman_manfaat_konservasi_tanah',
|
||||
// 'nilai_konservasi_tanah',
|
||||
// 'upah_tenaga_kerja'
|
||||
'upah_tenaga_kerja',
|
||||
'biaya_bibit',
|
||||
'biaya_pupuk',
|
||||
'biaya_obat_obatan',
|
||||
'biaya_sewa_alat_produksi',
|
||||
'biaya_penyediaan_air',
|
||||
'biaya_produksi_lainnya',
|
||||
'total_estimasi_biaya_produksi',
|
||||
'created_by',
|
||||
'updated_by',
|
||||
'deleted_by',
|
||||
];
|
||||
|
||||
protected static function booted(): void
|
||||
{
|
||||
static::saved(function (PraktikBudidaya $praktikBudidaya) {
|
||||
|
||||
$petani = Petani::find($praktikBudidaya->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
|
||||
]);
|
||||
}
|
||||
|
||||
$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;
|
||||
$jenisHama = $praktikBudidaya->jenis_hama ?? [];
|
||||
$jenisPenyakit = $praktikBudidaya->jenis_penyakit ?? [];
|
||||
|
||||
if (Schema::hasColumn((new Lahan)->getTable(), 'jenis_hama')
|
||||
&& Schema::hasColumn((new Lahan)->getTable(), 'jenis_penyakit')) {
|
||||
Lahan::where('petani_id', $praktikBudidaya->petani_id)->get()->each(function (Lahan $lahan) use ($jenisHama, $jenisPenyakit, $praktikBudidaya) {
|
||||
$lahan->update([
|
||||
'jenis_hama' => $jenisHama,
|
||||
'jenis_penyakit' => $jenisPenyakit,
|
||||
'updated_by' => $praktikBudidaya->updated_by,
|
||||
]);
|
||||
});
|
||||
}
|
||||
|
||||
if (Schema::hasColumn((new Tanaman)->getTable(), 'jenis_hama')
|
||||
&& Schema::hasColumn((new Tanaman)->getTable(), 'jenis_penyakit')) {
|
||||
Tanaman::where('petani_id', $praktikBudidaya->petani_id)->get()->each(function (Tanaman $tanaman) use ($jenisHama, $jenisPenyakit, $praktikBudidaya) {
|
||||
$tanaman->update([
|
||||
'jenis_hama' => $jenisHama,
|
||||
'jenis_penyakit' => $jenisPenyakit,
|
||||
'updated_by' => $praktikBudidaya->updated_by,
|
||||
]);
|
||||
});
|
||||
}
|
||||
|
||||
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_5_pengendalian_opt' => $praktikBudidaya->metode_penanganan_opt,
|
||||
'skor_d2_k2_6_sanitasi_kebun' => $praktikBudidaya->frekuensi_sanitasi_lahan,
|
||||
'skor_d2_k2_6b_pengelolaan_gulma' => $praktikBudidaya->penanganan_gulma,
|
||||
'skor_d2_k2_7_penglolaan_air_irigasi' => $praktikBudidaya->kondisi_pengelolaan_air,
|
||||
'skor_d2_k2_8_praktik_konservasi_tanah' => $skor_konservasi_tanah,
|
||||
]);
|
||||
});
|
||||
}
|
||||
|
||||
public function petani(): BelongsTo
|
||||
{
|
||||
return $this->belongsTo(Petani::class, 'petani_id');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,142 @@
|
||||
<?php
|
||||
|
||||
namespace App\Models\Pertanian;
|
||||
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
use Illuminate\Database\Eloquent\SoftDeletes;
|
||||
|
||||
class SkorPetani extends Model
|
||||
{
|
||||
use SoftDeletes;
|
||||
|
||||
protected $table = 'petani_skor';
|
||||
|
||||
protected $fillable = [
|
||||
'petani_id',
|
||||
'uid',
|
||||
'skor_kesiapan_adopsi',
|
||||
'skor_d2_sistem_praktik_budidaya',
|
||||
'skor_d4_sosial_ekonomi',
|
||||
'skor_d6_rantai_nilai_akses_pasar',
|
||||
'skor_komp_1_d4_k3_motivasi_kapasitas_adopsi',
|
||||
'skor_komp_2_d4_k2_ekonomi_rumah_tangga',
|
||||
'skor_komp_3_d2_praktik_budidaya_gap',
|
||||
'skor_komp_4_d4_k4_keterlibatan_kelembagaan',
|
||||
'skor_komp_5_d4_k5_k6_akses_kebebasan_keuangan',
|
||||
'skor_komp_6_d6_k1_k4_k5_rantai_nilai_akses_pasar',
|
||||
'skor_d4_k3_1_praktik_baru',
|
||||
'skor_d4_k3_4_pemahaman_mutu_harga',
|
||||
'skor_d4_k3_5_role_model',
|
||||
'skor_d4_k3_6_kemampuan_keterlibatan_program',
|
||||
'skor_d4_k3_7_orientasi_jangka_panjang',
|
||||
'skor_d4_k2_5_stabilitas_penghasilan',
|
||||
'skor_d4_k2_8_kemampuan_menabung',
|
||||
'skor_d4_k2_9_kecukupan_penghasilan',
|
||||
'skor_d4_k2_3_k2_7_rasio_biaya_produksi_pendapatan',
|
||||
'skor_d4_k2_11_hak_kelola_lahan',
|
||||
'skor_d2_k2_3_praktik_pemangkasan',
|
||||
'skor_d2_k2_4_praktik_pemupukan',
|
||||
'skor_d2_k2_5_pengendalian_opt',
|
||||
'skor_d2_k2_6_sanitasi_kebun',
|
||||
'skor_d2_k2_6b_pengelolaan_gulma',
|
||||
'skor_d2_k2_7_penglolaan_air_irigasi',
|
||||
'skor_d2_k2_8_praktik_konservasi_tanah',
|
||||
'skor_d2_k3_1_penentuan_pematangan',
|
||||
'skor_d2_k3_5_sortasi_awal_pemisahan_kualitas',
|
||||
'skor_d4_k4_2_keaktifan_pertemuan',
|
||||
'skor_d4_k4_3_peran_dalam_kelompok',
|
||||
'skor_d4_k4_4_manfaat_dirasakan',
|
||||
'skor_d4_k5_1_kepemilikan_rekening',
|
||||
'skor_d4_k5_2_pengalaman_kredit_formal',
|
||||
'skor_d4_k5_3_kepemilikan_aset_produktif',
|
||||
'skor_d4_k5_4_kepemilikan_aset_tidak_produktif',
|
||||
'skor_d4_k5_4_akses_program_bantuan',
|
||||
'skor_d4_k6_3_keberadaan_hutang_terkait_panen',
|
||||
'skor_d4_k6_5a_praktik_ijon',
|
||||
'skor_d4_k6_5b_kebebasan_memilih_pembeli',
|
||||
'skor_d6_k1_6_pengalaman_menjual_ke_saluran_berbeda',
|
||||
'skor_d6_k4_1_kesadaran_akses_pasar_premium',
|
||||
'skor_d6_k5_1_hambatan_mutu',
|
||||
|
||||
'created_by',
|
||||
'updated_by',
|
||||
'deleted_by',
|
||||
];
|
||||
|
||||
protected static function booted(): void
|
||||
{
|
||||
static::saving(function (SkorPetani $skorPetani) {
|
||||
|
||||
$skorPetani->skor_komp_1_d4_k3_motivasi_kapasitas_adopsi = (
|
||||
$skorPetani->skor_d4_k3_1_praktik_baru +
|
||||
$skorPetani->skor_d4_k3_4_pemahaman_mutu_harga +
|
||||
$skorPetani->skor_d4_k3_5_role_model +
|
||||
$skorPetani->skor_d4_k3_6_kemampuan_keterlibatan_program +
|
||||
$skorPetani->skor_d4_k3_7_orientasi_jangka_panjang
|
||||
) / 5;
|
||||
$skorPetani->skor_komp_2_d4_k2_ekonomi_rumah_tangga = (
|
||||
$skorPetani->skor_d4_k2_5_stabilitas_penghasilan +
|
||||
$skorPetani->skor_d4_k2_8_kemampuan_menabung +
|
||||
$skorPetani->skor_d4_k2_9_kecukupan_penghasilan +
|
||||
$skorPetani->skor_d4_k2_3_k2_7_rasio_biaya_produksi_pendapatan +
|
||||
$skorPetani->skor_d4_k2_11_hak_kelola_lahan
|
||||
) / 5;
|
||||
$skorPetani->skor_komp_3_d2_praktik_budidaya_gap = (
|
||||
$skorPetani->skor_d2_k2_3_praktik_pemangkasan +
|
||||
$skorPetani->skor_d2_k2_4_praktik_pemupukan +
|
||||
$skorPetani->skor_d2_k2_5_pengendalian_opt +
|
||||
$skorPetani->skor_d2_k2_6_sanitasi_kebun +
|
||||
$skorPetani->skor_d2_k2_6b_pengelolaan_gulma +
|
||||
$skorPetani->skor_d2_k2_7_penglolaan_air_irigasi +
|
||||
$skorPetani->skor_d2_k2_8_praktik_konservasi_tanah +
|
||||
$skorPetani->skor_d2_k3_1_penentuan_pematangan +
|
||||
$skorPetani->skor_d2_k3_5_sortasi_awal_pemisahan_kualitas
|
||||
) / 9;
|
||||
$skorPetani->skor_komp_4_d4_k4_keterlibatan_kelembagaan = (
|
||||
$skorPetani->skor_d4_k4_2_keaktifan_pertemuan +
|
||||
$skorPetani->skor_d4_k4_3_peran_dalam_kelompok +
|
||||
$skorPetani->skor_d4_k4_4_manfaat_dirasakan
|
||||
) / 3;
|
||||
$skorPetani->skor_komp_5_d4_k5_k6_akses_kebebasan_keuangan = (
|
||||
(
|
||||
$skorPetani->skor_d4_k5_1_kepemilikan_rekening +
|
||||
$skorPetani->skor_d4_k5_2_pengalaman_kredit_formal +
|
||||
$skorPetani->skor_d4_k5_3_kepemilikan_aset_produktif +
|
||||
$skorPetani->skor_d4_k5_4_5_akses_program_bantuan
|
||||
) / 4 +
|
||||
(
|
||||
$skorPetani->skor_d4_k6_3_keberadaan_hutang_terkait_panen +
|
||||
$skorPetani->skor_d4_k6_5a_praktik_ijon +
|
||||
$skorPetani->skor_d4_k6_5b_kebebasan_memilih_pembeli
|
||||
) / 3
|
||||
) / 2;
|
||||
$skorPetani->skor_komp_6_d6_k1_k4_k5_rantai_nilai_akses_pasar = (
|
||||
$skorPetani->skor_d6_k1_6_pengalaman_menjual_ke_saluran_berbeda +
|
||||
$skorPetani->skor_d6_k4_1_kesadaran_akses_pasar_premium +
|
||||
$skorPetani->skor_d6_k5_1_hambatan_mutu
|
||||
) / 3;
|
||||
|
||||
$skorPetani->skor_d2_sistem_praktik_budidaya = (
|
||||
$skorPetani->skor_komp_3_d2_praktik_budidaya_gap
|
||||
);
|
||||
$skorPetani->skor_d4_sosial_ekonomi = (
|
||||
$skorPetani->skor_komp_1_d4_k3_motivasi_kapasitas_adopsi
|
||||
);
|
||||
$skorPetani->skor_d6_rantai_nilai_akses_pasar = (
|
||||
$skorPetani->skor_komp_6_d6_k1_k4_k5_rantai_nilai_akses_pasar * 0.25 +
|
||||
$skorPetani->skor_komp_2_d4_k2_ekonomi_rumah_tangga * 0.20 +
|
||||
$skorPetani->skor_komp_4_d4_k4_keterlibatan_kelembagaan * 0.15 +
|
||||
$skorPetani->skor_komp_5_d4_k5_k6_akses_kebebasan_keuangan * 0.10
|
||||
) / 0.70;
|
||||
|
||||
$skorPetani->skor_kesiapan_adopsi = (
|
||||
$skorPetani->skor_komp_6_d6_k1_k4_k5_rantai_nilai_akses_pasar * 0.25 +
|
||||
$skorPetani->skor_komp_2_d4_k2_ekonomi_rumah_tangga * 0.20 +
|
||||
$skorPetani->skor_komp_3_d2_praktik_budidaya_gap * 0.20 +
|
||||
$skorPetani->skor_komp_4_d4_k4_keterlibatan_kelembagaan * 0.15 +
|
||||
$skorPetani->skor_komp_5_d4_k5_k6_akses_kebebasan_keuangan * 0.10 +
|
||||
$skorPetani->skor_komp_1_d4_k3_motivasi_kapasitas_adopsi * 0.10
|
||||
);
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -2,17 +2,52 @@
|
||||
|
||||
namespace App\Models\Pertanian;
|
||||
|
||||
use App\Enums\PihakMembantuKonflik;
|
||||
use App\Enums\SkorKecukupanPenghasilan;
|
||||
use App\Enums\SkorKejelasanStatusLahan;
|
||||
use App\Enums\SkorKemampuanMenabung;
|
||||
use App\Enums\SkorPeriodePaceklik;
|
||||
use App\Enums\StatusKepemilikanLahanSosialEkonomi;
|
||||
use App\Enums\StatusKonflik;
|
||||
use App\Enums\SosialEkonomi\AlasanKreditDitolak;
|
||||
use App\Enums\SosialEkonomi\BisaBeliPupukBersubsidi;
|
||||
use App\Enums\SosialEkonomi\JenisAsetProduktif;
|
||||
use App\Enums\SosialEkonomi\KemauanIkutProgram;
|
||||
use App\Enums\SosialEkonomi\KemauanMencobaPraktikBaru;
|
||||
use App\Enums\SosialEkonomi\KeaktifanPertemuanKelompok;
|
||||
use App\Enums\SosialEkonomi\KedekatanSesamaAnggota;
|
||||
use App\Enums\SosialEkonomi\KebebasanMemilihPembeli;
|
||||
use App\Enums\SosialEkonomi\KeterikatanHutangPanen;
|
||||
use App\Enums\SosialEkonomi\KeterlibatanProgramKeuanganFormal;
|
||||
use App\Enums\SosialEkonomi\KondisiAsetProduktif;
|
||||
use App\Enums\SosialEkonomi\ManfaatKelompokTani;
|
||||
use App\Enums\SosialEkonomi\MinatPembeliHargaStabil;
|
||||
use App\Enums\SosialEkonomi\OrientasiRencanaJangkaPanjang;
|
||||
use App\Enums\SosialEkonomi\PanutanPetaniSukses;
|
||||
use App\Enums\SosialEkonomi\PemahamanMutuHarga;
|
||||
use App\Enums\SosialEkonomi\PengetahuanHargaHasilOlah;
|
||||
use App\Enums\SosialEkonomi\PengalamanKreditKebun;
|
||||
use App\Enums\SosialEkonomi\PeranDalamKelompok;
|
||||
use App\Enums\SosialEkonomi\PernahBantuanNgoPerusahaan;
|
||||
use App\Enums\SosialEkonomi\PernahJualHargaLebihTinggi;
|
||||
use App\Enums\SosialEkonomi\PinjamanTokohAdatPanen;
|
||||
use App\Enums\SosialEkonomi\PihakMembantuKonflik;
|
||||
use App\Enums\SosialEkonomi\PraktikIjon;
|
||||
use App\Enums\SosialEkonomi\SkorKecukupanPenghasilan;
|
||||
use App\Enums\SosialEkonomi\SkorKejelasanStatusLahan;
|
||||
use App\Enums\SosialEkonomi\SkorKemampuanMenabung;
|
||||
use App\Enums\SosialEkonomi\SkorPeriodePaceklik;
|
||||
use App\Enums\SosialEkonomi\StatusKartuTani;
|
||||
use App\Enums\SosialEkonomi\StatusKepemilikanLahanSosialEkonomi;
|
||||
use App\Enums\SosialEkonomi\StatusKonflik;
|
||||
use App\Enums\SosialEkonomi\StatusProgramKeuanganFormal;
|
||||
use App\Enums\SosialEkonomi\StatusRekeningTabungan;
|
||||
use App\Enums\SosialEkonomi\TekananJualSegera;
|
||||
use App\Enums\SosialEkonomi\TerdaftarKelompokTani;
|
||||
use App\Enums\SosialEkonomi\UsahaMutuTambahanHarga;
|
||||
|
||||
use App\Models\Pertanian\Petani;
|
||||
use App\Models\Pertanian\SkorPetani;
|
||||
use App\Models\Pertanian\PraktikBudidaya;
|
||||
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
use Illuminate\Database\Eloquent\Relations\BelongsTo;
|
||||
use Illuminate\Database\Eloquent\Relations\HasMany;
|
||||
use Illuminate\Database\Eloquent\SoftDeletes;
|
||||
use Illuminate\Support\Str;
|
||||
|
||||
class SosialEkonomi extends Model
|
||||
{
|
||||
@@ -43,6 +78,60 @@ class SosialEkonomi extends Model
|
||||
'pihak_membantu_konflik_nama',
|
||||
'tahun_bantuan_konflik',
|
||||
'status_konflik',
|
||||
'kemauan_mencoba_praktik_baru',
|
||||
'alasan_mencoba_praktik_baru',
|
||||
'hambatan_mengubah_cara_bertani',
|
||||
'pemahaman_mutu_harga',
|
||||
'contoh_pemahaman_mutu_harga',
|
||||
'pengetahuan_harga_hasil_olah',
|
||||
'pernah_jual_harga_lebih_tinggi',
|
||||
'penyebab_harga_lebih_tinggi',
|
||||
'usaha_mutu_tambahan_harga',
|
||||
'alasan_usaha_mutu_tambahan_harga',
|
||||
'panutan_petani_sukses',
|
||||
'nama_lokasi_panutan',
|
||||
'kemauan_ikut_program',
|
||||
'harapan_program',
|
||||
'orientasi_rencana_jangka_panjang',
|
||||
'rencana_jangka_panjang',
|
||||
'terdaftar_kelompok_tani',
|
||||
'nama_kelompok_tani',
|
||||
'lama_bergabung_kelompok_tahun',
|
||||
'kedekatan_sesama_anggota',
|
||||
'keaktifan_pertemuan_kelompok',
|
||||
'topik_biasa_dibahas',
|
||||
'peran_dalam_kelompok',
|
||||
'manfaat_kelompok_tani',
|
||||
'status_kartu_tani',
|
||||
'bisa_beli_pupuk_bersubsidi',
|
||||
'manfaat_lain_kartu_tani',
|
||||
'status_rekening_tabungan',
|
||||
'nama_bank',
|
||||
'pengalaman_kredit_kebun',
|
||||
'alasan_kredit_ditolak',
|
||||
'alasan_kredit_ditolak_lainnya',
|
||||
'kondisi_aset_produktif',
|
||||
'jenis_aset_produktif',
|
||||
'jenis_aset_produktif_lainnya',
|
||||
'keterangan_kondisi_aset',
|
||||
'keterlibatan_program_keuangan_formal',
|
||||
'status_program_keuangan_formal',
|
||||
'program_keuangan_formal_lainnya_nama',
|
||||
'pernah_bantuan_ngo_perusahaan',
|
||||
'detail_bantuan_ngo_perusahaan',
|
||||
'keterikatan_hutang_panen',
|
||||
'pinjaman_tokoh_adat_panen',
|
||||
'keterangan_pinjaman_tokoh_adat',
|
||||
'total_hutang_rupiah',
|
||||
'total_hutang_setara_kg_panen',
|
||||
'total_hutang_tidak_bersedia',
|
||||
'praktik_ijon',
|
||||
'tekanan_jual_segera',
|
||||
'penyebab_tekanan_jual_segera',
|
||||
'kebebasan_memilih_pembeli',
|
||||
'alasan_tidak_bebas_memilih_pembeli',
|
||||
'minat_pembeli_harga_stabil',
|
||||
'alasan_minat_pembeli_harga_stabil',
|
||||
'created_by',
|
||||
'updated_by',
|
||||
'deleted_by',
|
||||
@@ -64,8 +153,106 @@ class SosialEkonomi extends Model
|
||||
'pihak_membantu_konflik' => PihakMembantuKonflik::class,
|
||||
'tahun_bantuan_konflik' => 'integer',
|
||||
'status_konflik' => StatusKonflik::class,
|
||||
'kemauan_mencoba_praktik_baru' => KemauanMencobaPraktikBaru::class,
|
||||
'pemahaman_mutu_harga' => PemahamanMutuHarga::class,
|
||||
'pengetahuan_harga_hasil_olah' => PengetahuanHargaHasilOlah::class,
|
||||
'pernah_jual_harga_lebih_tinggi' => PernahJualHargaLebihTinggi::class,
|
||||
'usaha_mutu_tambahan_harga' => UsahaMutuTambahanHarga::class,
|
||||
'panutan_petani_sukses' => PanutanPetaniSukses::class,
|
||||
'kemauan_ikut_program' => KemauanIkutProgram::class,
|
||||
'orientasi_rencana_jangka_panjang' => OrientasiRencanaJangkaPanjang::class,
|
||||
'terdaftar_kelompok_tani' => TerdaftarKelompokTani::class,
|
||||
'lama_bergabung_kelompok_tahun' => 'integer',
|
||||
'kedekatan_sesama_anggota' => KedekatanSesamaAnggota::class,
|
||||
'keaktifan_pertemuan_kelompok' => KeaktifanPertemuanKelompok::class,
|
||||
'peran_dalam_kelompok' => PeranDalamKelompok::class,
|
||||
'manfaat_kelompok_tani' => ManfaatKelompokTani::class,
|
||||
'status_kartu_tani' => StatusKartuTani::class,
|
||||
'bisa_beli_pupuk_bersubsidi' => BisaBeliPupukBersubsidi::class,
|
||||
'status_rekening_tabungan' => StatusRekeningTabungan::class,
|
||||
'pengalaman_kredit_kebun' => PengalamanKreditKebun::class,
|
||||
'alasan_kredit_ditolak' => 'array',
|
||||
'kondisi_aset_produktif' => KondisiAsetProduktif::class,
|
||||
'jenis_aset_produktif' => 'array',
|
||||
'keterlibatan_program_keuangan_formal' => KeterlibatanProgramKeuanganFormal::class,
|
||||
'status_program_keuangan_formal' => 'array',
|
||||
'pernah_bantuan_ngo_perusahaan' => PernahBantuanNgoPerusahaan::class,
|
||||
'detail_bantuan_ngo_perusahaan' => 'array',
|
||||
'keterikatan_hutang_panen' => KeterikatanHutangPanen::class,
|
||||
'pinjaman_tokoh_adat_panen' => PinjamanTokohAdatPanen::class,
|
||||
'total_hutang_rupiah' => 'integer',
|
||||
'total_hutang_setara_kg_panen' => 'float',
|
||||
'total_hutang_tidak_bersedia' => 'boolean',
|
||||
'praktik_ijon' => PraktikIjon::class,
|
||||
'tekanan_jual_segera' => TekananJualSegera::class,
|
||||
'kebebasan_memilih_pembeli' => KebebasanMemilihPembeli::class,
|
||||
'minat_pembeli_harga_stabil' => MinatPembeliHargaStabil::class,
|
||||
];
|
||||
|
||||
protected static function booted(): void
|
||||
{
|
||||
static::saved(function (SosialEkonomi $sosialEkonomi) {
|
||||
|
||||
$petani = Petani::find($sosialEkonomi->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
|
||||
]);
|
||||
}
|
||||
$praktik = PraktikBudidaya::where('petani_id', $petani->id)->orderBy('id')->first();
|
||||
$pendapatan = PendapatanKomoditas::where('sosial_ekonomi_id', $sosialEkonomi->id)->get();
|
||||
|
||||
$rasio = 0;
|
||||
if ($praktik && ($pendapatan && $pendapatan->count() > 0 && $pendapatan->sum('pendapatan') > 0)) {
|
||||
$rasio = $praktik->total_estimasi_biaya_produksi / $pendapatan->sum('pendapatan');
|
||||
}
|
||||
if ($rasio >= 0.8) {
|
||||
$skorRasio = 1;
|
||||
} else if ($rasio >= 0.6) {
|
||||
$skorRasio = 2;
|
||||
} else if ($rasio >= 0.45) {
|
||||
$skorRasio = 3;
|
||||
} else if ($rasio >= 0.3) {
|
||||
$skorRasio = 4;
|
||||
} else {
|
||||
$skorRasio = 5;
|
||||
}
|
||||
|
||||
$skor->update([
|
||||
'skor_d4_k3_1_praktik_baru' => $sosialEkonomi->kemauan_mencoba_praktik_baru?->value,
|
||||
'skor_d4_k3_4_pemahaman_mutu_harga' => $sosialEkonomi->pemahaman_mutu_harga?->value,
|
||||
'skor_d4_k3_5_role_model' => $sosialEkonomi->panutan_petani_sukses?->value,
|
||||
'skor_d4_k3_6_kemampuan_keterlibatan_program' => $sosialEkonomi->kemauan_ikut_program?->value,
|
||||
'skor_d4_k3_7_orientasi_jangka_panjang' => $sosialEkonomi->orientasi_rencana_jangka_panjang?->value,
|
||||
|
||||
'skor_d4_k2_5_stabilitas_penghasilan' => $sosialEkonomi->skor_periode_paceklik?->value,
|
||||
'skor_d4_k2_8_kemampuan_menabung' => $sosialEkonomi->skor_kemampuan_menabung?->value,
|
||||
'skor_d4_k2_9_kecukupan_penghasilan' => $sosialEkonomi->skor_kecukupan_penghasilan?->value,
|
||||
'skor_d4_k2_3_k2_7_rasio_biaya_produksi_pendapatan' => $skorRasio,
|
||||
'skor_d4_k2_11_hak_kelola_lahan' => $sosialEkonomi->skor_kejelasan_status_lahan?->value,
|
||||
|
||||
'skor_d4_k4_2_keaktifan_pertemuan' => $sosialEkonomi->keaktifan_pertemuan_kelompok?->value,
|
||||
'skor_d4_k4_3_peran_dalam_kelompok' => $sosialEkonomi->peran_dalam_kelompok?->value,
|
||||
'skor_d4_k4_4_manfaat_dirasakan' => $sosialEkonomi->manfaat_kelompok_tani?->value,
|
||||
|
||||
'skor_d4_k5_1_kepemilikan_rekening' => $sosialEkonomi->status_rekening_tabungan?->value,
|
||||
'skor_d4_k5_2_pengalaman_kredit_formal' => $sosialEkonomi->pengalaman_kredit_kebun?->value,
|
||||
'skor_d4_k5_3_kepemilikan_aset_produktif' => $sosialEkonomi->kondisi_aset_produktif?->value,
|
||||
'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,
|
||||
]);
|
||||
});
|
||||
}
|
||||
|
||||
public function petani(): BelongsTo
|
||||
{
|
||||
return $this->belongsTo(Petani::class, 'petani_id');
|
||||
|
||||
@@ -0,0 +1,75 @@
|
||||
<?php
|
||||
|
||||
namespace App\Models\Pertanian;
|
||||
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
use Illuminate\Database\Eloquent\SoftDeletes;
|
||||
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
||||
use Illuminate\Database\Eloquent\Relations\BelongsTo;
|
||||
|
||||
use App\Models\Pertanian\Petani;
|
||||
|
||||
class SurveyPanen extends Model
|
||||
{
|
||||
use SoftDeletes;
|
||||
|
||||
protected $table = 'survey_panen';
|
||||
|
||||
protected $fillable = [
|
||||
'uid',
|
||||
'petani_id',
|
||||
'dasar_penentuan_panen',
|
||||
'frekuensi_panen_pertahun',
|
||||
'bulan_panen_utama',
|
||||
'hasil_komoditas_utama_permusim',
|
||||
'hasil_komoditas_lainnya_permusim',
|
||||
'disimpan_untuk_sendiri',
|
||||
'hasil_panen_disimpan',
|
||||
'tujuan_disimpan',
|
||||
'praktik_sortasi',
|
||||
'bentuk_sortasi',
|
||||
'hasil_panen_reject',
|
||||
'jumlah_panen_reject',
|
||||
'tindakan_panen_reject',
|
||||
'upah_tenaga_panen',
|
||||
'biaya_pengangkutan_panen',
|
||||
'biaya_wadah_panen',
|
||||
'biaya_sewa_alat_panen',
|
||||
'biaya_panen_lainnya',
|
||||
'total_estimasi_biaya_panen',
|
||||
'estimasi_kehilangan_akibat_opt',
|
||||
'estimasi_kehilangan_akibat_hama_penyakit',
|
||||
'created_by',
|
||||
'updated_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
|
||||
{
|
||||
return $this->belongsTo(Petani::class, 'petani_id');
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,33 @@
|
||||
<?php
|
||||
|
||||
namespace App\Models\Pertanian;
|
||||
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
||||
use Illuminate\Database\Eloquent\SoftDeletes;
|
||||
use Illuminate\Database\Eloquent\Relations\BelongsTo;
|
||||
|
||||
use App\Models\Pertanian\Petani;
|
||||
|
||||
class SurveyPelatihan extends Model
|
||||
{
|
||||
use HasFactory, SoftDeletes;
|
||||
|
||||
protected $table = 'survey_pelatihan';
|
||||
|
||||
protected $fillable = [
|
||||
'uid',
|
||||
'petani_id',
|
||||
'jenis_pelatihan',
|
||||
'penyelenggara',
|
||||
'tahun_pelaksanaan',
|
||||
'created_by',
|
||||
'updated_by',
|
||||
'deleted_by',
|
||||
];
|
||||
|
||||
public function petani(): BelongsTo
|
||||
{
|
||||
return $this->belongsTo(Petani::class, 'petani_id');
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,31 @@
|
||||
<?php
|
||||
|
||||
namespace App\Models\Pertanian;
|
||||
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
use Illuminate\Database\Eloquent\SoftDeletes;
|
||||
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
||||
use Illuminate\Database\Eloquent\Relations\BelongsTo;
|
||||
|
||||
class SurveyProduktivitas extends Model
|
||||
{
|
||||
use SoftDeletes;
|
||||
|
||||
protected $table = 'survey_produktivitas';
|
||||
|
||||
protected $fillable = [
|
||||
'uid',
|
||||
'petani_id',
|
||||
'komoditas_id',
|
||||
'kuantitas',
|
||||
'satuan',
|
||||
'created_by',
|
||||
'updated_by',
|
||||
'deleted_by',
|
||||
];
|
||||
|
||||
public function petani(): BelongsTo
|
||||
{
|
||||
return $this->belongsTo(Petani::class, 'petani_id');
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,32 @@
|
||||
<?php
|
||||
|
||||
namespace App\Models\Pertanian;
|
||||
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
||||
use Illuminate\Database\Eloquent\SoftDeletes;
|
||||
use Illuminate\Database\Eloquent\Relations\BelongsTo;
|
||||
|
||||
class SurveySertifikasi extends Model
|
||||
{
|
||||
use HasFactory, SoftDeletes;
|
||||
|
||||
protected $table = 'survey_sertifikasi';
|
||||
|
||||
protected $fillable = [
|
||||
'uid',
|
||||
'petani_id',
|
||||
'jenis_sertifikasi',
|
||||
'lembaga_penerbit',
|
||||
'tahun_pelaksanaan',
|
||||
'is_aktif',
|
||||
'created_by',
|
||||
'updated_by',
|
||||
'deleted_by',
|
||||
];
|
||||
|
||||
public function petani()
|
||||
{
|
||||
return $this->belongsTo(Petani::class, 'petani_id');
|
||||
}
|
||||
}
|
||||
@@ -42,6 +42,9 @@ class Tanaman extends Model
|
||||
'serangan_hama',
|
||||
'penyakit_tanaman',
|
||||
'keparahan_serangan',
|
||||
|
||||
'jenis_hama',
|
||||
'jenis_penyakit',
|
||||
];
|
||||
|
||||
protected $casts = [
|
||||
@@ -49,6 +52,8 @@ class Tanaman extends Model
|
||||
'serangan_hama' => SeranganHama::class,
|
||||
'penyakit_tanaman' => PenyakitTanaman::class,
|
||||
'keparahan_serangan' => KeparahanSerangan::class,
|
||||
'jenis_hama' => 'array',
|
||||
'jenis_penyakit' => 'array'
|
||||
];
|
||||
|
||||
public function komoditas()
|
||||
|
||||
+10
-1
@@ -9,8 +9,11 @@ use App\Enums\Role;
|
||||
use Illuminate\Notifications\Notifiable;
|
||||
use Illuminate\Database\Eloquent\SoftDeletes;
|
||||
use Illuminate\Database\Eloquent\Relations\HasOne;
|
||||
use Illuminate\Database\Eloquent\Relations\HasMany;
|
||||
use Laravel\Sanctum\HasApiTokens;
|
||||
|
||||
use App\Models\Pertanian\Petani;
|
||||
|
||||
class User extends Authenticatable
|
||||
{
|
||||
use HasFactory, Notifiable, HasApiTokens, SoftDeletes;
|
||||
@@ -22,7 +25,8 @@ class User extends Authenticatable
|
||||
'email_verified_at',
|
||||
'role',
|
||||
'username',
|
||||
'uid'
|
||||
'uid',
|
||||
'status'
|
||||
];
|
||||
|
||||
protected $hidden = [
|
||||
@@ -43,4 +47,9 @@ class User extends Authenticatable
|
||||
{
|
||||
return $this->hasOne(\App\Models\Profile::class);
|
||||
}
|
||||
|
||||
public function petaniDibuat(): HasMany
|
||||
{
|
||||
return $this->hasMany(Petani::class, 'created_by');
|
||||
}
|
||||
}
|
||||
|
||||
@@ -124,4 +124,6 @@ return [
|
||||
],
|
||||
|
||||
'force_https' => env('FORCE_HTTPS', false),
|
||||
|
||||
'desc' => env('APP_DESC', 'Laravel'),
|
||||
];
|
||||
|
||||
@@ -35,42 +35,37 @@ return new class extends Migration
|
||||
$table->string('cara_pemberian_pupuk')->nullable();
|
||||
// 2.5 Pengendalian Organisme Pengganggu Tumbuhan (OPT)
|
||||
$table->integer('metode_penanganan_opt')->nullable();
|
||||
$table->string('jenis_hama')->nullable();
|
||||
$table->string('jenis_penyakit')->nullable();
|
||||
$table->jsonb('jenis_hama')->nullable();
|
||||
$table->jsonb('jenis_penyakit')->nullable();
|
||||
$table->string('intensitas_serangan')->nullable();
|
||||
$table->string('waktu_kemunculan_terparah')->nullable();
|
||||
$table->string('metode_paling_sering_dilakukan')->nullable();
|
||||
$table->integer('volume_obat_obatan_permusim')->nullable();
|
||||
$table->string('satuan_volume_obat_obatan')->nullable();
|
||||
$table->decimal('volume_obat_obatan_padat_permusim', 10, 2)->nullable();
|
||||
$table->decimal('volume_obat_obatan_cair_permusim', 10, 2)->nullable();
|
||||
// 2.6 Sanitasi Kebun
|
||||
$table->integer('frekuensi_sanitasi_lahan')->nullable();
|
||||
$table->string('penanganan_sisa_buah_ranting')->nullable();
|
||||
$table->integer('penanganan_gulma')->nullable();
|
||||
// 2.7 Pengelolaan Air & irigasi
|
||||
$table->integer('kondisi_pengelolaan_air')->nullable();
|
||||
$table->string('sumber_air')->nullable();
|
||||
$table->jsonb('sumber_air')->nullable();
|
||||
$table->string('sistem_irigasi')->nullable();
|
||||
$table->string('kebutuhan_air_permusim')->nullable();
|
||||
|
||||
// 2.8 Praktik konservasi tanah
|
||||
$table->string('praktik_konservasi_tanah')->nullable();
|
||||
$table->jsonb('kebiasaan_konservasi_tanah')->nullable();
|
||||
$table->string('pemahaman_manfaat_konservasi_tanah')->nullable();
|
||||
$table->integer('nilai_konservasi_tanah')->nullable();
|
||||
|
||||
// 2.9 Struktur Biaya Produksi Per Musim
|
||||
$table->decimal('upah_tenaga_kerja', 10, 2)->nullable();
|
||||
$table->decimal('biaya_bibit', 10, 2)->nullable();
|
||||
$table->decimal('biaya_pupuk', 10, 2)->nullable();
|
||||
$table->decimal('biaya_obat_obatan', 10, 2)->nullable();
|
||||
$table->decimal('biaya_sewa_alat', 10, 2)->nullable();
|
||||
$table->decimal('biaya_penyediaan_air', 10, 2)->nullable();
|
||||
$table->decimal('biaya_lainnya', 10, 2)->nullable();
|
||||
$table->decimal('total_estimasi_biaya', 10, 2)->nullable();
|
||||
|
||||
// K4 Produktivitas
|
||||
// 4.3 Kehilangan Akibat OPT
|
||||
$table->string('estimasi_kehilangan_akibat_opt')->nullable();
|
||||
$table->string('estimasi_kehilangan_akibat_hama_penyakit')->nullable();
|
||||
$table->decimal('upah_tenaga_kerja', 13, 2)->nullable();
|
||||
$table->decimal('biaya_bibit', 13, 2)->nullable();
|
||||
$table->decimal('biaya_pupuk', 13, 2)->nullable();
|
||||
$table->decimal('biaya_obat_obatan', 13, 2)->nullable();
|
||||
$table->decimal('biaya_sewa_alat_produksi', 13, 2)->nullable();
|
||||
$table->decimal('biaya_penyediaan_air', 13, 2)->nullable();
|
||||
$table->decimal('biaya_produksi_lainnya', 13, 2)->nullable();
|
||||
$table->decimal('total_estimasi_biaya_produksi', 13, 2)->nullable();
|
||||
|
||||
$table->foreignId('created_by')->nullable()->constrained('users')->onDelete('set null');
|
||||
$table->foreignId('updated_by')->nullable()->constrained('users')->onDelete('set null');
|
||||
@@ -79,35 +74,36 @@ return new class extends Migration
|
||||
$table->softDeletes();
|
||||
});
|
||||
|
||||
Schema::create('panen', function (Blueprint $table) {
|
||||
Schema::create('survey_panen', function (Blueprint $table) {
|
||||
$table->id();
|
||||
$table->string('uid')->unique();
|
||||
$table->foreignId('petani_id')->nullable()->constrained('petani')->onDelete('set null');
|
||||
|
||||
// K3 PANEN & PENANGANAN AWAL
|
||||
// 3.1 Cara Menetukan Kematangan
|
||||
$table->integer('cara_menetukan_kematangan')->nullable();
|
||||
$table->integer('dasar_penentuan_panen')->nullable();
|
||||
// 3.2 Frekuensi Panen
|
||||
$table->integer('frekuensi_panen_pertahun')->nullable();
|
||||
$table->string('bulan_panen_utama')->nullable();
|
||||
// 3.4 Hasil Panen Aktual
|
||||
$table->decimal('hasil_komoditas_utama_permusim_kg', 10, 2)->nullable();
|
||||
$table->decimal('hasil_komoditas_lainnya_permusim_kg', 10, 2)->nullable();
|
||||
$table->string('tujuan_panen')->nullable();
|
||||
$table->decimal('hasil_komoditas_utama_permusim', 10, 2)->nullable();
|
||||
$table->decimal('hasil_komoditas_lainnya_permusim', 10, 2)->nullable();
|
||||
$table->boolean('disimpan_untuk_sendiri')->nullable();
|
||||
$table->decimal('hasil_panen_disimpan', 10, 2)->nullable();
|
||||
$table->string('tujuan_disimpan')->nullable();
|
||||
// 3.5 Penanganan Awal Setelah Panen
|
||||
$table->integer('praktik_sortasi')->nullable();
|
||||
$table->string('bentuk_sortasi')->nullable();
|
||||
// 3.8 Hasil Panen Reject & Estimasi Biaya Panen
|
||||
$table->integer('hasil_panen_reject')->nullable();
|
||||
$table->string('jumlah_panen_reject')->nullable();
|
||||
$table->string('tindakan_terhadap_panen_reject')->nullable();
|
||||
$table->decimal('estimasi_biaya_panen', 10, 2)->nullable();
|
||||
$table->decimal('upah_tenaga_panen', 10, 2)->nullable();
|
||||
$table->decimal('biaya_pengangkutan', 10, 2)->nullable();
|
||||
$table->decimal('biaya_wadah', 10, 2)->nullable();
|
||||
$table->decimal('biaya_sewa_alat', 10, 2)->nullable();
|
||||
$table->decimal('biaya_lainnya', 10, 2)->nullable();
|
||||
$table->decimal('total_estimasi_biaya_panen', 10, 2)->nullable();
|
||||
$table->string('tindakan_panen_reject')->nullable();
|
||||
$table->decimal('upah_tenaga_panen', 13, 2)->nullable();
|
||||
$table->decimal('biaya_pengangkutan_panen', 13, 2)->nullable();
|
||||
$table->decimal('biaya_wadah_Panen', 13, 2)->nullable();
|
||||
$table->decimal('biaya_sewa_alat_panen', 13, 2)->nullable();
|
||||
$table->decimal('biaya_panen_lainnya', 13, 2)->nullable();
|
||||
$table->decimal('total_estimasi_biaya_panen', 13, 2)->nullable();
|
||||
// K4 Produktivitas
|
||||
// 4.3 Kehilangan Akibat OPT
|
||||
$table->string('estimasi_kehilangan_akibat_opt')->nullable();
|
||||
@@ -120,43 +116,13 @@ return new class extends Migration
|
||||
$table->softDeletes();
|
||||
});
|
||||
|
||||
Schema::create('produktivitas', function (Blueprint $table) {
|
||||
Schema::create('survey_produktivitas', function (Blueprint $table) {
|
||||
$table->id();
|
||||
$table->string('uid')->unique();
|
||||
$table->foreignId('petani_id')->nullable()->constrained('petani')->onDelete('set null');
|
||||
$table->foreignId('komoditas_id')->nullable()->constrained('master_komoditas')->onDelete('set null');
|
||||
$table->foreignId('jenis_komoditas_id')->nullable()->constrained('jenis_komoditas')->onDelete('set null');
|
||||
$table->foreignId('varietas_id')->nullable()->constrained('master_varietas')->onDelete('set null');
|
||||
$table->decimal('kuantitas_pertahun', 10, 2)->nullable();
|
||||
$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');
|
||||
$table->timestamps();
|
||||
$table->softDeletes();
|
||||
});
|
||||
|
||||
Schema::create('pelatihan', function (Blueprint $table) {
|
||||
$table->id();
|
||||
$table->string('uid')->unique();
|
||||
$table->foreignId('petani_id')->nullable()->constrained('petani')->onDelete('set null');
|
||||
$table->string('jenis_pelatihan');
|
||||
$table->string('penyelenggara');
|
||||
$table->date('tahun_pelaksanaan');
|
||||
$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');
|
||||
$table->timestamps();
|
||||
$table->softDeletes();
|
||||
});
|
||||
|
||||
Schema::create('sertifikasi', function (Blueprint $table) {
|
||||
$table->id();
|
||||
$table->string('uid')->unique();
|
||||
$table->foreignId('petani_id')->nullable()->constrained('petani')->onDelete('set null');
|
||||
$table->string('jenis_sertifikasi');
|
||||
$table->string('lembaga_penerbit');
|
||||
$table->date('tahun_pelaksanaan');
|
||||
$table->boolean('is_aktif')->default(false);
|
||||
$table->decimal('kuantitas')->nullable();
|
||||
$table->string('satuan')->nullable();
|
||||
$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');
|
||||
@@ -171,8 +137,7 @@ return new class extends Migration
|
||||
public function down(): void
|
||||
{
|
||||
Schema::dropIfExists('praktik_budidaya');
|
||||
Schema::dropIfExists('pelatihan');
|
||||
Schema::dropIfExists('sertifikasi');
|
||||
Schema::dropIfExists('survey_panen');
|
||||
Schema::dropIfExists('produktivitas');
|
||||
}
|
||||
};
|
||||
|
||||
@@ -0,0 +1,91 @@
|
||||
<?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::create('petani_skor', function (Blueprint $table) {
|
||||
|
||||
$table->id();
|
||||
$table->string('uid')->nullable()->unique();
|
||||
|
||||
$table->foreignId('petani_id')->nullable()->constrained('petani')->onDelete('cascade');
|
||||
|
||||
$table->float('skor_kesiapan_adopsi', 10)->nullable();
|
||||
|
||||
$table->float('skor_d2_sistem_praktik_budidaya', 10)->nullable();
|
||||
$table->float('skor_d4_sosial_ekonomi', 10)->nullable();
|
||||
$table->float('skor_d6_rantai_nilai_akses_pasar', 10)->nullable();
|
||||
|
||||
$table->float('skor_komp_1_d4_k3_motivasi_kapasitas_adopsi', 10)->nullable();
|
||||
$table->float('skor_komp_2_d4_k2_ekonomi_rumah_tangga', 10)->nullable();
|
||||
$table->float('skor_komp_3_d2_praktik_budidaya_gap', 10)->nullable();
|
||||
$table->float('skor_komp_4_d4_k4_keterlibatan_kelembagaan', 10)->nullable();
|
||||
$table->float('skor_komp_5_d4_k5_k6_akses_kebebasan_keuangan', 10)->nullable();
|
||||
$table->float('skor_komp_6_d6_k1_k4_k5_rantai_nilai_akses_pasar', 10)->nullable();
|
||||
|
||||
$table->float('skor_d4_k3_1_praktik_baru', 10)->nullable();
|
||||
$table->float('skor_d4_k3_4_pemahaman_mutu_harga', 10)->nullable();
|
||||
$table->float('skor_d4_k3_5_role_model', 10)->nullable();
|
||||
$table->float('skor_d4_k3_6_kemampuan_keterlibatan_program', 10)->nullable();
|
||||
$table->float('skor_d4_k3_7_orientasi_jangka_panjang', 10)->nullable();
|
||||
|
||||
$table->float('skor_d4_k2_5_stabilitas_penghasilan', 10)->nullable();
|
||||
$table->float('skor_d4_k2_8_kemampuan_menabung', 10)->nullable();
|
||||
$table->float('skor_d4_k2_9_kecukupan_penghasilan', 10)->nullable();
|
||||
$table->float('skor_d4_k2_3_k2_7_rasio_biaya_produksi_pendapatan', 10)->nullable();
|
||||
$table->float('skor_d4_k2_11_hak_kelola_lahan', 10)->nullable();
|
||||
|
||||
$table->float('skor_d2_k2_3_praktik_pemangkasan', 10)->nullable();
|
||||
$table->float('skor_d2_k2_4_praktik_pemupukan', 10)->nullable();
|
||||
$table->float('skor_d2_k2_5_pengendalian_opt', 10)->nullable();
|
||||
$table->float('skor_d2_k2_6_sanitasi_kebun', 10)->nullable();
|
||||
$table->float('skor_d2_k2_6b_pengelolaan_gulma', 10)->nullable();
|
||||
$table->float('skor_d2_k2_7_penglolaan_air_irigasi', 10)->nullable();
|
||||
$table->float('skor_d2_k2_8_praktik_konservasi_tanah', 10)->nullable();
|
||||
$table->float('skor_d2_k3_1_penentuan_pematangan', 10)->nullable();
|
||||
$table->float('skor_d2_k3_5_sortasi_awal_pemisahan_kualitas', 10)->nullable();
|
||||
|
||||
$table->float('skor_d4_k4_2_keaktifan_pertemuan', 10)->nullable();
|
||||
$table->float('skor_d4_k4_3_peran_dalam_kelompok', 10)->nullable();
|
||||
$table->float('skor_d4_k4_4_manfaat_dirasakan', 10)->nullable();
|
||||
|
||||
$table->float('skor_d4_k5_1_kepemilikan_rekening', 10)->nullable();
|
||||
$table->float('skor_d4_k5_2_pengalaman_kredit_formal', 10)->nullable();
|
||||
$table->float('skor_d4_k5_3_kepemilikan_aset_produktif', 10)->nullable();
|
||||
//$table->float('skor_d4_k5_4_kepemilikan_aset_tidak_produktif', 10)->nullable();
|
||||
//$table->float('skor_d4_k5_4_akses_program_bantuan_formal', 10)->nullable();
|
||||
$table->float('skor_d4_k5_4_akses_program_bantuan', 10)->nullable();
|
||||
|
||||
$table->float('skor_d4_k6_3_keberadaan_hutang_terkait_panen', 10)->nullable();
|
||||
$table->float('skor_d4_k6_5a_praktik_ijon', 10)->nullable();
|
||||
$table->float('skor_d4_k6_5b_kebebasan_memilih_pembeli', 10)->nullable();
|
||||
|
||||
$table->float('skor_d6_k1_6_pengalaman_menjual_ke_saluran_berbeda', 10)->nullable();
|
||||
$table->float('skor_d6_k4_1_kesadaran_akses_pasar_premium', 10)->nullable();
|
||||
$table->float('skor_d6_k5_1_hambatan_mutu', 10)->nullable();
|
||||
|
||||
$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');
|
||||
|
||||
$table->timestamps();
|
||||
$table->softDeletes();
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Reverse the migrations.
|
||||
*/
|
||||
public function down(): void
|
||||
{
|
||||
Schema::dropIfExists('petani_skor');
|
||||
}
|
||||
};
|
||||
@@ -0,0 +1,33 @@
|
||||
<?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('petani', function (Blueprint $table) {
|
||||
$table->foreignId('komoditas_id')->nullable()->constrained('master_komoditas')->onDelete('set null');
|
||||
|
||||
});
|
||||
|
||||
Schema::table('map_lahan', function (Blueprint $table) {
|
||||
$table->json('komoditas_lain')->nullable();
|
||||
$table->json('tanaman_penaung')->nullable();
|
||||
|
||||
$table->json('foto')->nullable();
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Reverse the migrations.
|
||||
*/
|
||||
public function down(): void
|
||||
{
|
||||
}
|
||||
};
|
||||
@@ -0,0 +1,52 @@
|
||||
<?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::create('survey_pelatihan', function (Blueprint $table) {
|
||||
$table->id();
|
||||
$table->string('uid')->unique();
|
||||
$table->foreignId('petani_id')->nullable()->constrained('petani')->onDelete('set null');
|
||||
$table->string('jenis_pelatihan');
|
||||
$table->string('penyelenggara');
|
||||
$table->integer('tahun_pelaksanaan');
|
||||
$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');
|
||||
$table->timestamps();
|
||||
$table->softDeletes();
|
||||
});
|
||||
|
||||
Schema::create('survey_sertifikasi', function (Blueprint $table) {
|
||||
$table->id();
|
||||
$table->string('uid')->unique();
|
||||
$table->foreignId('petani_id')->nullable()->constrained('petani')->onDelete('set null');
|
||||
$table->string('jenis_sertifikasi');
|
||||
$table->string('lembaga_penerbit');
|
||||
$table->integer('tahun_pelaksanaan');
|
||||
$table->boolean('is_aktif')->default(false);
|
||||
$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');
|
||||
$table->timestamps();
|
||||
$table->softDeletes();
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Reverse the migrations.
|
||||
*/
|
||||
public function down(): void
|
||||
{
|
||||
Schema::dropIfExists('pelatihan');
|
||||
Schema::dropIfExists('sertifikasi');
|
||||
}
|
||||
};
|
||||
@@ -0,0 +1,153 @@
|
||||
<?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('sosial_ekonomi', function (Blueprint $table) {
|
||||
// Sosial Budaya Fields
|
||||
$table->tinyInteger('kemauan_mencoba_praktik_baru')->nullable()->after('status_konflik');
|
||||
$table->text('alasan_mencoba_praktik_baru')->nullable()->after('kemauan_mencoba_praktik_baru');
|
||||
$table->text('hambatan_mengubah_cara_bertani')->nullable()->after('alasan_mencoba_praktik_baru');
|
||||
|
||||
$table->tinyInteger('pemahaman_mutu_harga')->nullable()->after('hambatan_mengubah_cara_bertani');
|
||||
$table->text('contoh_pemahaman_mutu_harga')->nullable()->after('pemahaman_mutu_harga');
|
||||
$table->string('pengetahuan_harga_hasil_olah')->nullable()->after('contoh_pemahaman_mutu_harga');
|
||||
$table->string('pernah_jual_harga_lebih_tinggi')->nullable()->after('pengetahuan_harga_hasil_olah');
|
||||
$table->text('penyebab_harga_lebih_tinggi')->nullable()->after('pernah_jual_harga_lebih_tinggi');
|
||||
$table->string('usaha_mutu_tambahan_harga')->nullable()->after('penyebab_harga_lebih_tinggi');
|
||||
$table->text('alasan_usaha_mutu_tambahan_harga')->nullable()->after('usaha_mutu_tambahan_harga');
|
||||
|
||||
$table->tinyInteger('panutan_petani_sukses')->nullable()->after('alasan_usaha_mutu_tambahan_harga');
|
||||
$table->text('nama_lokasi_panutan')->nullable()->after('panutan_petani_sukses');
|
||||
|
||||
$table->tinyInteger('kemauan_ikut_program')->nullable()->after('nama_lokasi_panutan');
|
||||
$table->text('harapan_program')->nullable()->after('kemauan_ikut_program');
|
||||
|
||||
$table->tinyInteger('orientasi_rencana_jangka_panjang')->nullable()->after('harapan_program');
|
||||
$table->text('rencana_jangka_panjang')->nullable()->after('orientasi_rencana_jangka_panjang');
|
||||
|
||||
// Keanggotaan Kelompok Fields
|
||||
$table->string('terdaftar_kelompok_tani')->nullable()->after('rencana_jangka_panjang');
|
||||
$table->string('nama_kelompok_tani')->nullable()->after('terdaftar_kelompok_tani');
|
||||
$table->unsignedInteger('lama_bergabung_kelompok_tahun')->nullable()->after('nama_kelompok_tani');
|
||||
$table->string('kedekatan_sesama_anggota')->nullable()->after('lama_bergabung_kelompok_tahun');
|
||||
|
||||
$table->tinyInteger('keaktifan_pertemuan_kelompok')->nullable()->after('kedekatan_sesama_anggota');
|
||||
$table->text('topik_biasa_dibahas')->nullable()->after('keaktifan_pertemuan_kelompok');
|
||||
|
||||
$table->tinyInteger('peran_dalam_kelompok')->nullable()->after('topik_biasa_dibahas');
|
||||
$table->tinyInteger('manfaat_kelompok_tani')->nullable()->after('peran_dalam_kelompok');
|
||||
|
||||
$table->string('status_kartu_tani')->nullable()->after('manfaat_kelompok_tani');
|
||||
$table->string('bisa_beli_pupuk_bersubsidi')->nullable()->after('status_kartu_tani');
|
||||
$table->text('manfaat_lain_kartu_tani')->nullable()->after('bisa_beli_pupuk_bersubsidi');
|
||||
|
||||
// Akses Keuangan Fields
|
||||
$table->tinyInteger('status_rekening_tabungan')->nullable()->after('manfaat_lain_kartu_tani');
|
||||
$table->string('nama_bank')->nullable()->after('status_rekening_tabungan');
|
||||
|
||||
$table->tinyInteger('pengalaman_kredit_kebun')->nullable()->after('nama_bank');
|
||||
$table->json('alasan_kredit_ditolak')->nullable()->after('pengalaman_kredit_kebun');
|
||||
$table->string('alasan_kredit_ditolak_lainnya')->nullable()->after('alasan_kredit_ditolak');
|
||||
|
||||
$table->tinyInteger('kondisi_aset_produktif')->nullable()->after('alasan_kredit_ditolak_lainnya');
|
||||
$table->json('jenis_aset_produktif')->nullable()->after('kondisi_aset_produktif');
|
||||
$table->string('jenis_aset_produktif_lainnya')->nullable()->after('jenis_aset_produktif');
|
||||
$table->text('keterangan_kondisi_aset')->nullable()->after('jenis_aset_produktif_lainnya');
|
||||
|
||||
$table->tinyInteger('keterlibatan_program_keuangan_formal')->nullable()->after('keterangan_kondisi_aset');
|
||||
$table->json('status_program_keuangan_formal')->nullable()->after('keterlibatan_program_keuangan_formal');
|
||||
$table->string('program_keuangan_formal_lainnya_nama')->nullable()->after('status_program_keuangan_formal');
|
||||
|
||||
$table->string('pernah_bantuan_ngo_perusahaan')->nullable()->after('program_keuangan_formal_lainnya_nama');
|
||||
$table->json('detail_bantuan_ngo_perusahaan')->nullable()->after('pernah_bantuan_ngo_perusahaan');
|
||||
|
||||
// Keterikatan Hutang Fields
|
||||
$table->tinyInteger('keterikatan_hutang_panen')->nullable()->after('detail_bantuan_ngo_perusahaan');
|
||||
$table->string('pinjaman_tokoh_adat_panen')->nullable()->after('keterikatan_hutang_panen');
|
||||
$table->text('keterangan_pinjaman_tokoh_adat')->nullable()->after('pinjaman_tokoh_adat_panen');
|
||||
$table->unsignedBigInteger('total_hutang_rupiah')->nullable()->after('keterangan_pinjaman_tokoh_adat');
|
||||
$table->decimal('total_hutang_setara_kg_panen', 12, 2)->nullable()->after('total_hutang_rupiah');
|
||||
$table->boolean('total_hutang_tidak_bersedia')->nullable()->after('total_hutang_setara_kg_panen');
|
||||
$table->tinyInteger('praktik_ijon')->nullable()->after('total_hutang_tidak_bersedia');
|
||||
$table->string('tekanan_jual_segera')->nullable()->after('praktik_ijon');
|
||||
$table->text('penyebab_tekanan_jual_segera')->nullable()->after('tekanan_jual_segera');
|
||||
|
||||
$table->tinyInteger('kebebasan_memilih_pembeli')->nullable()->after('penyebab_tekanan_jual_segera');
|
||||
$table->text('alasan_tidak_bebas_memilih_pembeli')->nullable()->after('kebebasan_memilih_pembeli');
|
||||
$table->string('minat_pembeli_harga_stabil')->nullable()->after('alasan_tidak_bebas_memilih_pembeli');
|
||||
$table->text('alasan_minat_pembeli_harga_stabil')->nullable()->after('minat_pembeli_harga_stabil');
|
||||
});
|
||||
}
|
||||
|
||||
public function down(): void
|
||||
{
|
||||
Schema::table('sosial_ekonomi', function (Blueprint $table) {
|
||||
$table->dropColumn([
|
||||
// Sosial Budaya
|
||||
'kemauan_mencoba_praktik_baru',
|
||||
'alasan_mencoba_praktik_baru',
|
||||
'hambatan_mengubah_cara_bertani',
|
||||
'pemahaman_mutu_harga',
|
||||
'contoh_pemahaman_mutu_harga',
|
||||
'pengetahuan_harga_hasil_olah',
|
||||
'pernah_jual_harga_lebih_tinggi',
|
||||
'penyebab_harga_lebih_tinggi',
|
||||
'usaha_mutu_tambahan_harga',
|
||||
'alasan_usaha_mutu_tambahan_harga',
|
||||
'panutan_petani_sukses',
|
||||
'nama_lokasi_panutan',
|
||||
'kemauan_ikut_program',
|
||||
'harapan_program',
|
||||
'orientasi_rencana_jangka_panjang',
|
||||
'rencana_jangka_panjang',
|
||||
// Keanggotaan Kelompok
|
||||
'terdaftar_kelompok_tani',
|
||||
'nama_kelompok_tani',
|
||||
'lama_bergabung_kelompok_tahun',
|
||||
'kedekatan_sesama_anggota',
|
||||
'keaktifan_pertemuan_kelompok',
|
||||
'topik_biasa_dibahas',
|
||||
'peran_dalam_kelompok',
|
||||
'manfaat_kelompok_tani',
|
||||
'status_kartu_tani',
|
||||
'bisa_beli_pupuk_bersubsidi',
|
||||
'manfaat_lain_kartu_tani',
|
||||
// Akses Keuangan
|
||||
'status_rekening_tabungan',
|
||||
'nama_bank',
|
||||
'pengalaman_kredit_kebun',
|
||||
'alasan_kredit_ditolak',
|
||||
'alasan_kredit_ditolak_lainnya',
|
||||
'kondisi_aset_produktif',
|
||||
'jenis_aset_produktif',
|
||||
'jenis_aset_produktif_lainnya',
|
||||
'keterangan_kondisi_aset',
|
||||
'keterlibatan_program_keuangan_formal',
|
||||
'status_program_keuangan_formal',
|
||||
'program_keuangan_formal_lainnya_nama',
|
||||
'pernah_bantuan_ngo_perusahaan',
|
||||
'detail_bantuan_ngo_perusahaan',
|
||||
// Keterikatan Hutang
|
||||
'keterikatan_hutang_panen',
|
||||
'pinjaman_tokoh_adat_panen',
|
||||
'keterangan_pinjaman_tokoh_adat',
|
||||
'total_hutang_rupiah',
|
||||
'total_hutang_setara_kg_panen',
|
||||
'total_hutang_tidak_bersedia',
|
||||
'praktik_ijon',
|
||||
'tekanan_jual_segera',
|
||||
'penyebab_tekanan_jual_segera',
|
||||
'kebebasan_memilih_pembeli',
|
||||
'alasan_tidak_bebas_memilih_pembeli',
|
||||
'minat_pembeli_harga_stabil',
|
||||
'alasan_minat_pembeli_harga_stabil',
|
||||
]);
|
||||
});
|
||||
}
|
||||
};
|
||||
@@ -0,0 +1,30 @@
|
||||
<?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('users', function (Blueprint $table) {
|
||||
$table->string('status')->default('pending')->after('password');
|
||||
|
||||
if (!Schema::hasColumn('users', 'role')) {
|
||||
$table->string('role')->nullable()->after('status');
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public function down(): void
|
||||
{
|
||||
Schema::table('users', function (Blueprint $table) {
|
||||
$table->dropColumn('status');
|
||||
$table->dropColumn('role');
|
||||
});
|
||||
}
|
||||
};
|
||||
@@ -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');
|
||||
});
|
||||
}
|
||||
};
|
||||
@@ -0,0 +1,34 @@
|
||||
<?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::create('master_jenis_tanaman', function (Blueprint $table) {
|
||||
$table->id();
|
||||
$table->string('nama');
|
||||
|
||||
$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');
|
||||
|
||||
$table->timestamps();
|
||||
$table->softDeletes();
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Reverse the migrations.
|
||||
*/
|
||||
public function down(): void
|
||||
{
|
||||
Schema::dropIfExists('jenis_tanamen');
|
||||
}
|
||||
};
|
||||
@@ -0,0 +1,57 @@
|
||||
<?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('map_lahan', function (Blueprint $table) {
|
||||
if (! Schema::hasColumn('map_lahan', 'jenis_hama')) {
|
||||
$table->jsonb('jenis_hama')->nullable();
|
||||
}
|
||||
|
||||
if (! Schema::hasColumn('map_lahan', 'jenis_penyakit')) {
|
||||
$table->jsonb('jenis_penyakit')->nullable();
|
||||
}
|
||||
});
|
||||
|
||||
Schema::table('map_tanaman', function (Blueprint $table) {
|
||||
if (! Schema::hasColumn('map_tanaman', 'jenis_hama')) {
|
||||
$table->jsonb('jenis_hama')->nullable();
|
||||
}
|
||||
|
||||
if (! Schema::hasColumn('map_tanaman', 'jenis_penyakit')) {
|
||||
$table->jsonb('jenis_penyakit')->nullable();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public function down(): void
|
||||
{
|
||||
Schema::table('map_lahan', function (Blueprint $table) {
|
||||
if (Schema::hasColumn('map_lahan', 'jenis_hama')) {
|
||||
$table->dropColumn('jenis_hama');
|
||||
}
|
||||
|
||||
if (Schema::hasColumn('map_lahan', 'jenis_penyakit')) {
|
||||
$table->dropColumn('jenis_penyakit');
|
||||
}
|
||||
});
|
||||
|
||||
Schema::table('map_tanaman', function (Blueprint $table) {
|
||||
if (Schema::hasColumn('map_tanaman', 'jenis_hama')) {
|
||||
$table->dropColumn('jenis_hama');
|
||||
}
|
||||
|
||||
if (Schema::hasColumn('map_tanaman', 'jenis_penyakit')) {
|
||||
$table->dropColumn('jenis_penyakit');
|
||||
}
|
||||
});
|
||||
}
|
||||
};
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 5.4 KiB |
@@ -14,21 +14,21 @@ document.addEventListener('DOMContentLoaded', function () {
|
||||
username: {
|
||||
validators: {
|
||||
notEmpty: {
|
||||
message: 'Please enter username'
|
||||
message: 'Silakan masukkan username'
|
||||
},
|
||||
stringLength: {
|
||||
min: 6,
|
||||
message: 'Username must be more than 6 characters'
|
||||
message: 'Username harus terdiri dari minimal 6 karakter'
|
||||
}
|
||||
}
|
||||
},
|
||||
email: {
|
||||
validators: {
|
||||
notEmpty: {
|
||||
message: 'Please enter your email'
|
||||
message: 'Silakan masukkan email Anda'
|
||||
},
|
||||
emailAddress: {
|
||||
message: 'Please enter a valid email address'
|
||||
message: 'Silakan masukkan email yang valid'
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -57,22 +57,22 @@ document.addEventListener('DOMContentLoaded', function () {
|
||||
'confirm-password': {
|
||||
validators: {
|
||||
notEmpty: {
|
||||
message: 'Please confirm password'
|
||||
message: 'Silakan konfirmasi password Anda'
|
||||
},
|
||||
identical: {
|
||||
compare: () => formAuthentication.querySelector('[name="password"]').value,
|
||||
message: 'The password and its confirmation do not match'
|
||||
message: 'Password tidak cocok dengan konfirmasi password'
|
||||
},
|
||||
stringLength: {
|
||||
min: 6,
|
||||
message: 'Password must be more than 6 characters'
|
||||
message: 'Password harus terdiri dari minimal 6 karakter'
|
||||
}
|
||||
}
|
||||
},
|
||||
terms: {
|
||||
validators: {
|
||||
notEmpty: {
|
||||
message: 'Please agree to terms & conditions'
|
||||
message: 'Silakan terima syarat dan ketentuan kami'
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
File diff suppressed because one or more lines are too long
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user