322 Commits
Author SHA1 Message Date
Syaharani 013cb7b728 dashboard pasar 2026-10-21 10:14:49 +07:00
Althaf 4ab745cfe5 sumber informasi harga 2026-10-19 10:03:05 +07:00
Althaf c66eed56e2 Merge branch 'main' of https://git.probindo.com/Probindo/database-pertani-web 2026-10-16 15:11:49 +07:00
Syaharani 8be0906a2e Update profil petani 2026-10-16 15:48:42 +07:00
afriadirahman fcd79b7cfe Update dashboard Profil Detail Petani 2026-10-16 15:25:21 +07:00
Althaf bea9be8a39 resolve aksespasar 2026-10-16 15:11:39 +07:00
afriadirahman 5220b10de7 Update Config js 2026-10-16 10:38:30 +07:00
Syaharani 24725e3df1 update chart dashboard 2026-10-16 10:29:42 +07:00
Syaharani 60d32a88e9 update dashboard produksi 2026-10-16 10:04:56 +07:00
Althaf 4370d3c3d0 Merge branch 'main' of https://git.probindo.com/Probindo/database-pertani-web 2026-10-15 15:14:57 +07:00
Althaf 7699430301 new field akses pasar 2026-10-15 15:10:18 +07:00
fir2be df2b5a1312 hover and scroll on map 2026-10-15 14:12:03 +07:00
fir2be 2e8271d27a cars 2026-10-15 14:05:01 +07:00
fir2be 9b5c0a7309 perubahan query 2026-10-15 13:02:42 +07:00
fir2be 9d56b67998 sroll untuk 2026-10-15 11:31:57 +07:00
fir2be f95f43999a peta sebaran dan praktek budaya 2026-10-15 11:25:38 +07:00
Syaharani 3e172cf915 card dashboard produksi 2026-10-14 20:18:15 +07:00
Syaharani 3a9b3dbd7b dashboard produksi 2026-10-14 19:43:39 +07:00
Syaharani 80f0056efe dashboard produksi & ganti warna chart 2026-10-13 15:55:18 +07:00
afriadirahman aef27704f2 Update Karakteristik Petani 2026-10-12 10:22:01 +07:00
Syaharani f49bb0c2db dashboard produksi 2026-10-09 13:22:51 +07:00
afriadirahman 8a2c0292ac Update Header 2026-10-08 09:58:56 +07:00
afriadirahman 9ea324e553 Update Dashboard & Sidebar 2026-10-08 09:48:00 +07:00
afriadirahman 94c3288ea7 Update Dashboard Karakteristik Petani 2026-10-07 13:53:55 +07:00
Syaharani 8539bdcec4 update profil petani 2026-10-07 12:03:02 +07:00
Syaharani 77de648ded dashboard karakteristik petani 2026-10-07 10:20:20 +07:00
Syaharani 393cf0d0d1 karakteristik petani 2026-10-06 17:52:34 +07:00
Syaharani 7fdf9b400d solve jumlah lahan dan tanaman 2026-09-23 17:01:19 +07:00
Syaharani be4d46004e solve jumlah lahan dan tanaman 2026-09-23 16:36:14 +07:00
Syaharani fef5358402 solve filter jumlah lahan dan tanaman 2026-09-23 14:52:30 +07:00
Syaharani 02eed6da34 solve jumlah lahan dan tanaman 2026-09-23 14:37:08 +07:00
Syaharani 94d3f2a582 lower filter profil petani 2026-09-23 10:19:30 +07:00
Syaharani 471ca5ac0e filter profil petani 2026-09-23 10:13:13 +07:00
Althaf 8ec8f0c9d6 Merge branch 'main' of https://git.probindo.com/Probindo/database-pertani-web 2026-09-22 15:21:25 +07:00
Althaf 4d7d16e9f6 add migration riwayat petani 2026-09-22 15:20:45 +07:00
afriadirahman 1155b9b95b Update Header Pertanian 2026-09-22 15:12:32 +07:00
Syaharani 607533a327 Merge remote-tracking branch 'origin/main'
# Conflicts:
#	app/Http/Controllers/Web/Produktivitas/PetaniController.php
2026-09-22 11:02:02 +07:00
Syaharani 6b25bff2c4 Merge branch 'main' of https://git.probindo.com/Probindo/database-pertani-web 2026-09-22 10:59:55 +07:00
Syaharani 71b4d42ea2 Merge branch 'main' of https://git.probindo.com/Probindo/database-pertani-web 2026-09-22 10:58:41 +07:00
Syaharani c42a2571f5 solve profil petani 2026-09-22 10:57:21 +07:00
Althaf 16903b21e3 Merge branch 'main' of https://git.probindo.com/Probindo/database-pertani-web 2026-09-18 16:22:57 +07:00
Althaf 1d4a44b8ac update destroy 2026-09-18 16:22:48 +07:00
Syaharani 539239b507 bumdes 2026-09-16 11:09:08 +07:00
afriadirahman a76b014056 Update Kelompok Tani & APP AGERA 2026-09-06 19:09:37 +07:00
Althaf d50c292cf7 instrumen koperasi 2026-09-03 13:17:16 +07:00
Althaf dacaec7a86 Merge branch 'main' of https://git.probindo.com/Probindo/database-pertani-web 2026-08-27 11:48:55 +07:00
Althaf 6967eafe98 add instrumen koperasi 2026-08-27 11:48:42 +07:00
Syaharani 118cda625a filter dashboard indikator pertanian 2026-08-20 17:24:31 +07:00
irwan.l.cahyono a3f7cb4669 filter segmen 2026-08-20 01:52:05 +07:00
irwan.l.cahyono ec009a2c55 indeks petani dan ajax 2026-08-20 01:10:56 +07:00
afriadirahman b63dafdaee Update Profile Petani 2026-08-20 01:01:27 +07:00
Althaf b97f682cd3 Merge branch 'main' of https://git.probindo.com/Probindo/database-pertani-web 2026-08-19 16:42:31 +07:00
Althaf 404019bab6 Added Score 2026-08-19 16:42:03 +07:00
Syaharani 609919ba30 solve dashboard survey petani 2026-08-19 16:21:42 +07:00
irwan.l.cahyono 047cb4a779 link ke profil 2026-08-19 10:37:17 +07:00
irwan.l.cahyono 530c297b53 revisi jumlahpetani 2026-08-19 01:57:52 +07:00
Syaharani 8fbf68e6ef solve keanggotaan kelompok tani 2026-08-18 14:05:46 +07:00
Syaharani ac8b370248 update dashboard indikator pertanian 2026-08-18 14:04:44 +07:00
Syaharani 88762f7afb update dashboard indikator pertanian 2026-08-13 17:00:00 +07:00
Syaharani b96de514e3 solve dashboard indikator pertanian 2026-08-13 16:31:11 +07:00
Syaharani 6830142a82 solve dashboard indikator pertanian 2026-08-13 16:07:55 +07:00
afriadirahman 4b26e82afb Optimize Demografi & Update Profil Petani 2026-08-13 15:31:04 +07:00
Syaharani b855a857b2 solve dashboard indikator pertanian 2026-08-13 13:07:03 +07:00
afriadirahman ba7520a23c Update Demografi Petani 2026-08-12 17:49:24 +07:00
afriadirahman 0b333ab4e9 Update Profil Detail Petani 2026-08-12 17:33:53 +07:00
Althaf 3b1f15d5b3 fixed aksespasar 2026-08-11 16:19:10 +07:00
Althaf 605506bba8 Merge branch 'main' of https://git.probindo.com/Probindo/database-pertani-web 2026-08-11 15:40:27 +07:00
afriadirahman c960ba14b1 Update Demografi Petani 2026-08-11 15:13:28 +07:00
Syaharani a4f38998d5 dashboard indikator pertanian 2026-08-07 16:09:24 +07:00
Syaharani 0d9f6c0b64 indikator pertanian 2026-08-07 15:56:37 +07:00
irwan.l.cahyono 81775b0c13 Merge branch 'main' of https://git.probindo.com/Probindo/database-pertani-web 2026-08-07 15:00:32 +07:00
irwan.l.cahyono ba1a318d09 soft deleted petani 2026-08-07 15:00:30 +07:00
afriadirahman 0761d64254 Merge branch 'main' of https://git.probindo.com/Probindo/database-pertani-web 2026-08-07 14:32:48 +07:00
afriadirahman 67c3c6c809 Update demografi dashboard 2026-08-07 14:32:40 +07:00
irwan.l.cahyono 04387268cd indeks petani 2026-08-07 14:31:16 +07:00
irwan.l.cahyono 946fabb9a5 lahan skor has petani 2026-08-07 14:17:06 +07:00
irwan.l.cahyono 0a0c86d648 Merge branch 'main' of https://git.probindo.com/Probindo/database-pertani-web 2026-08-07 12:59:26 +07:00
irwan.l.cahyono 8b21fab8b8 dashboard indeks petani 2026-08-07 12:59:25 +07:00
afriadirahman 16a0a3c56c Update Icon Demografi Dashboard 2026-08-07 11:33:08 +07:00
afriadirahman d4c6b64ba6 Update Sidebar Demografi Petani 2026-08-07 11:20:05 +07:00
afriadirahman b4089d72b3 Update Dashboard Demografi Petani 2026-08-07 11:17:53 +07:00
afriadirahman 01990ccec1 Merge branch 'main' of https://git.probindo.com/Probindo/database-pertani-web 2026-08-06 13:29:42 +07:00
irwan.l.cahyono 8aed88a31f dashboard indeks petani 2026-08-05 01:20:19 +07:00
irwan.l.cahyono 4aa0780802 dashboard profil petani komp 4 2026-08-03 13:08:01 +07:00
afriadirahman 4e41246382 Update Profile Petani Dashboard 2026-08-03 12:53:20 +07:00
Althaf 43fe9e5f7f Merge branch 'main' of https://git.probindo.com/Probindo/database-pertani-web 2026-08-03 09:22:47 +07:00
irwan.l.cahyono c8d1994d3b dashboard profil petani 2026-07-30 15:23:34 +07:00
Althaf cf0f4b47b4 update akses pasar 2026-07-30 11:14:31 +07:00
irwan.l.cahyono 24a8016710 petani booted skor 2026-07-29 16:52:51 +07:00
irwan.l.cahyono 20e1eee6ff skor petani domain komponen hitung 2026-07-29 16:27:33 +07:00
afriadirahman c0432cd5f8 Update Sidebar Filter Fasilitator 2026-07-29 16:12:31 +07:00
irwan.l.cahyono 0ce0936a80 skor petani update 2026-07-29 16:05:43 +07:00
Syaharani 502c932f21 Merge branch 'main' of https://git.probindo.com/Probindo/database-pertani-web 2026-07-28 16:54:37 +07:00
Syaharani e60a66eeb7 bumdes: profil & add pengurus bumdes 2026-07-28 16:54:27 +07:00
afriadirahman 4475cd0098 Update Logo Sidebar 2026-07-28 16:18:41 +07:00
afriadirahman 67c111a2b3 Update Logo Agromonev & Agropro 2026-07-28 16:10:47 +07:00
Syaharani 3bcaa3ea50 solve survey produktivitas 2026-07-27 10:14:36 +07:00
Syaharani bed9a6f620 solve 2026-07-23 18:26:24 +07:00
Althaf 712b10e405 Merge branches 'main' and 'main' of https://git.probindo.com/Probindo/database-pertani-web 2026-07-22 17:06:45 +07:00
Althaf 6cfcf46ba6 use assets avatars 2026-07-22 17:06:31 +07:00
Syaharani b1b9828514 update jumlah tanaman 2026-07-22 16:54:57 +07:00
Syaharani 7af7e1bdaf update jumlah lahan 2026-07-22 16:40:24 +07:00
Syaharani bd05fc7f0f update hama dan penyakit 2026-07-22 16:23:32 +07:00
Syaharani 17b5687db8 update user profile 2026-07-22 15:55:07 +07:00
Syaharani e7f48b6500 solve lahan & tanaman 2026-07-22 15:49:25 +07:00
Syaharani a5884d0f8c solve akses pasar 2026-07-22 15:22:56 +07:00
Syaharani 9576c6295e solve sosial ekonomi 2026-07-22 14:41:05 +07:00
irwan.l.cahyono 079e300d5d Merge branch 'main' of https://git.probindo.com/Probindo/database-pertani-web 2026-07-22 14:39:10 +07:00
irwan.l.cahyono 2c94316439 petani lahan hapus 2026-07-22 14:38:10 +07:00
Syaharani 690b53e5a2 Merge origin/main 2026-07-22 14:08:34 +07:00
irwan.l.cahyono 50c9adfdc7 Merge branch 'main' of https://git.probindo.com/Probindo/database-pertani-web 2026-07-22 13:56:56 +07:00
irwan.l.cahyono 696c7dede8 hama dan penyakit lahan 2026-07-22 13:56:55 +07:00
Syaharani 5967e7d6f3 solve pendidikan & pelatihan 2026-07-22 13:28:58 +07:00
Syaharani 4c66d72dc5 solve praktik budidaya 2026-07-22 13:27:35 +07:00
Althaf c43483a9f8 default profile-iconize & fixed overlapping tab 2026-07-22 13:24:39 +07:00
Syaharani e02a34a527 solve lahan & tanaman 2026-07-22 11:58:51 +07:00
Althaf 713355ce0a add text-heading to adjust icon color theme 2026-07-22 10:35:36 +07:00
Althaf 12f8d0bbda integrate image cropper for avatar upload/delete option/retouch 2026-07-22 10:10:06 +07:00
Althaf 8afe7f9b38 solve view-controller dropzone 2026-07-21 11:49:32 +07:00
Althaf fbf84eb4cb enhance UX alerts 2026-07-20 16:45:00 +07:00
Althaf e04093ad3f Merge branch 'main' of https://git.probindo.com/Probindo/database-pertani-web 2026-07-20 16:36:29 +07:00
Althaf 3e1d3a33ee fix: resolve existing photos preview in Dropzone Lahan&Tanaman 2026-07-20 16:36:12 +07:00
irwan.l.cahyono e316d064ef auth dan user profile 2026-07-17 11:19:09 +07:00
irwan.l.cahyono 0c289ec244 dashboard indeks 2026-07-17 01:19:12 +07:00
irwan.l.cahyono 089f1b515d tanaman penaung di lahan 2026-07-16 15:22:42 +07:00
irwan.l.cahyono 4c647ea8ce Merge branch 'main' of https://git.probindo.com/Probindo/database-pertani-web 2026-07-16 13:46:45 +07:00
irwan.l.cahyono 419404e273 null jumlah tanaman 2026-07-16 13:46:43 +07:00
Althaf 837e542851 Merge branch 'main' of https://git.probindo.com/Probindo/database-pertani-web 2026-07-16 11:42:40 +07:00
Althaf 9378d15d71 edit foto tambah lahan 2026-07-16 11:41:35 +07:00
irwan.l.cahyono 0381e9bf0e Merge branch 'main' of https://git.probindo.com/Probindo/database-pertani-web 2026-07-15 15:00:14 +07:00
irwan.l.cahyono 3a70445e9a petani lahan required not 2026-07-15 15:00:13 +07:00
afriadirahman d2ed2c58fd Merge branch 'main' of https://git.probindo.com/Probindo/database-pertani-web 2026-07-15 14:37:48 +07:00
afriadirahman 9b201efa06 update Praktik budidaya migration 2026-07-15 14:37:39 +07:00
irwan.l.cahyono 2b3a0b7c58 tanggal jqueryvalidation 2026-07-15 14:05:25 +07:00
irwan.l.cahyono a187fb1095 Merge branch 'main' of https://git.probindo.com/Probindo/database-pertani-web 2026-07-15 11:44:39 +07:00
irwan.l.cahyono 6b44c11181 header dan index 2026-07-15 11:44:38 +07:00
afriadirahman 090153e53a Merge branch 'main' of https://git.probindo.com/Probindo/database-pertani-web 2026-07-15 11:30:37 +07:00
afriadirahman a79a93d291 Update komoditas Utama 2026-07-15 11:30:10 +07:00
irwan.l.cahyono 62f0f1bdbc tgl lahir edit 2026-07-15 10:55:11 +07:00
irwan.l.cahyono f0acd8c7ed dashboard komoditas 2026-07-15 10:41:27 +07:00
irwan.l.cahyono 3908b0be71 komoditas utama 2026-07-15 10:37:38 +07:00
irwan.l.cahyono 05cc3be9d3 enum pendidikan 2026-07-15 01:34:47 +07:00
irwan.l.cahyono f4c83d348a filter fasil 2026-07-15 01:19:12 +07:00
irwan.l.cahyono 61bd8dc388 redirect web 2026-07-15 01:11:19 +07:00
irwan.l.cahyono 002d6044b4 profil petani dashboard 2026-07-15 01:06:10 +07:00
irwan.l.cahyono 30196278d7 Merge branch 'main' of https://git.probindo.com/Probindo/database-pertani-web 2026-07-15 00:18:55 +07:00
irwan.l.cahyono 08c19c0714 skor petani 2026-07-15 00:18:00 +07:00
afriadirahman d6c036e19a Update Header Survey Petani 2026-07-14 23:35:15 +07:00
afriadirahman 981bc0d494 Update Master Komoditas 2026-07-14 23:05:16 +07:00
afriadirahman 857da1e900 Update Master Komoditas & Varietas 2026-07-14 22:34:38 +07:00
irwan.l.cahyono 66fc7227e6 Merge branch 'main' of https://git.probindo.com/Probindo/database-pertani-web 2026-07-14 17:13:55 +07:00
irwan.l.cahyono 3edfc57ba7 skor petani praktik budidaya 2026-07-14 17:13:52 +07:00
Althaf 4a560ebc4e Merge branch 'main' of https://git.probindo.com/Probindo/database-pertani-web 2026-07-14 15:41:40 +07:00
Althaf d4eb27e583 foto tambah lahan 2026-07-14 15:41:16 +07:00
irwan.l.cahyono d1c0f90afd sidebar 2026-07-14 15:39:22 +07:00
irwan.l.cahyono a1dadd1b1b petani lahan tanaman edit 2026-07-14 14:50:33 +07:00
irwan.l.cahyono 2c28bb06db asset avatar 2026-07-14 11:15:23 +07:00
irwan.l.cahyono 96a53c8754 Merge branch 'main' of https://git.probindo.com/Probindo/database-pertani-web 2026-07-14 10:49:08 +07:00
irwan.l.cahyono fcc5d7dcc5 header skor 2026-07-14 10:44:35 +07:00
afriadirahman e383aacbeb Update Dashboard Survey Petani 2026-07-14 10:34:46 +07:00
irwan.l.cahyono 5b776b2ae8 header 2026-07-14 09:20:46 +07:00
irwan.l.cahyono c4e3e460b1 hidden show 2026-07-13 16:45:23 +07:00
irwan.l.cahyono a7dc1dc58b dashboard survey 2026-07-13 16:43:27 +07:00
irwan.l.cahyono d01c737364 web fasil 2026-07-13 16:39:46 +07:00
irwan.l.cahyono 8d50757b51 foto petani 2026-07-13 16:29:00 +07:00
irwan.l.cahyono f146cb2608 sideba petani profil 2026-07-13 16:22:00 +07:00
irwan.l.cahyono 095d84ec7f sidebar env 2026-07-13 16:13:54 +07:00
irwan.l.cahyono f259c6728a register 2026-07-13 15:53:50 +07:00
irwan.l.cahyono a241a62136 Merge branch 'main' of https://git.probindo.com/Probindo/database-pertani-web 2026-07-13 14:03:24 +07:00
irwan.l.cahyono 4755c8a482 dashboard profil petani 2026-07-13 14:03:19 +07:00
afriadirahman 7672877299 update Model Petani 2026-07-13 10:19:04 +07:00
irwan.l.cahyono 92e8efb247 skor petani 2026-07-13 10:18:32 +07:00
irwan.l.cahyono 599269410b foto lahan 2026-07-13 01:04:55 +07:00
irwan.l.cahyono c5b5721b31 Merge branch 'main' of https://git.probindo.com/Probindo/database-pertani-web 2026-07-12 23:37:37 +07:00
irwan.l.cahyono 2bf2a68a3a perbaikan petani dan lahan 2026-07-12 23:37:36 +07:00
afriadirahman b445392e9f Update Pendidikan & Pelatihan 2026-07-12 23:00:58 +07:00
afriadirahman bcc15d5240 Update Create User Register 2026-07-12 22:51:23 +07:00
afriadirahman d33bc8a42b Update Pendidikan Pelatihan 2026-07-11 15:19:44 +07:00
Syaharani df5bfeb67f update user profile 2026-07-10 17:53:28 +07:00
Syaharani b0e1f3f131 update menu fasilitator 2026-07-10 17:47:59 +07:00
irwan.l.cahyono a19871366a skorpetani 2026-07-10 14:18:55 +07:00
afriadirahman b4b851c7a9 Update enums kebutuhan Air 2026-07-10 13:53:40 +07:00
afriadirahman e6f6257434 Merge branch 'main' of https://git.probindo.com/Probindo/database-pertani-web 2026-07-10 13:49:24 +07:00
afriadirahman 469e57ba28 Kebutuhan air Permusim enums 2026-07-10 13:49:09 +07:00
Syaharani d06da22ae5 update kondisi tanaman 2026-07-10 13:43:29 +07:00
Syaharani 350df6adcf update kondisi tanaman 2026-07-10 13:39:28 +07:00
irwan.l.cahyono 1788efaed5 skor petani 2026-07-10 09:47:13 +07:00
irwan.l.cahyono d49bd4953c petani lahan dan skor 2026-07-10 08:47:48 +07:00
afriadirahman 26f6e83328 Update Praktik Budidaya 2026-07-10 02:48:23 +07:00
Althaf 79f6426125 bring to final akses pasar 2026-07-09 22:30:31 +07:00
Althaf 9557d1ec64 Merge branch 'main' of https://git.probindo.com/Probindo/database-pertani-web 2026-07-09 18:15:19 +07:00
Althaf 7bab43df71 resolve user create 2026-07-09 18:15:12 +07:00
Syaharani 316b256ae0 update login & register 2026-07-09 18:14:12 +07:00
Syaharani bfabab96c5 update field sosial ekonomi 2026-07-09 18:13:53 +07:00
Althaf bd9b0873a3 refinement registrasi-verifikasi role & rbac 2026-07-09 17:42:55 +07:00
Syaharani 3464a802e2 update skoring 2026-07-09 17:30:19 +07:00
afriadirahman 6c95c462cb Update Praktik Budidaya 2026-07-09 16:29:18 +07:00
Syaharani 626fdba065 update sosial ekonomi 2026-07-09 14:37:53 +07:00
afriadirahman 2152079b26 Update Praktik Budidaya 2026-07-08 22:24:23 +07:00
afriadirahman 6559a97f43 Update add Praktik Budidaya 2026-07-08 21:10:50 +07:00
afriadirahman 05c2e53378 Update Migration Input Update Praktik Budidaya 2026-07-08 20:57:27 +07:00
Syaharani 3df381a66c register fasilitator 2026-07-08 17:00:50 +07:00
Syaharani 6fac76127d skoring prtani 2026-07-08 17:00:34 +07:00
irwan.l.cahyono a1d9b34d93 Merge branch 'main' of https://git.probindo.com/Probindo/database-pertani-web 2026-07-08 01:37:17 +07:00
irwan.l.cahyono c01ba6a906 perbaikan add header conflict 2026-07-08 01:37:15 +07:00
afriadirahman 4976948bc6 Merge branch 'main' of https://git.probindo.com/Probindo/database-pertani-web 2026-07-07 23:24:54 +07:00
afriadirahman 734c3fba65 Update Praktik Budidaya 2026-07-07 23:24:48 +07:00
irwan.l.cahyono 457288b325 Merge branch 'main' of https://git.probindo.com/Probindo/database-pertani-web 2026-07-07 21:35:59 +07:00
Althaf 9220cf23c2 Restore UI akses pasar dan header 2026-07-07 16:52:35 +07:00
Althaf 884b911767 Selesai merge data 2026-07-07 16:35:29 +07:00
Althaf e1fde05ba0 Resolve merge conflict di controller dan routes 2026-07-07 16:16:53 +07:00
Syaharani 74572fe586 Merge branch 'main' of https://git.probindo.com/Probindo/database-pertani-web 2026-07-07 15:41:21 +07:00
Syaharani 2eb40f8a1a enums sosial ekonomi 2026-07-07 15:41:02 +07:00
afriadirahman ff3f930939 Update Praktik Budidaya & Pendidikan Pelatihan 2026-07-07 14:39:25 +07:00
Syaharani b3d805fe98 update field sosial ekonomi 2026-07-07 13:37:47 +07:00
Syaharani e2c778a934 add data petani 2026-07-07 13:37:12 +07:00
irwan.l.cahyono 34865b34be Merge branch 'main' of https://git.probindo.com/Probindo/database-pertani-web 2026-07-07 05:17:42 +07:00
Syaharani 11d836713a sosial ekonomi controller & view edit 2026-07-06 17:29:46 +07:00
irwan.l.cahyono f448257980 header summary 2026-07-06 16:07:20 +07:00
irwan.l.cahyono f9f507a115 Merge branch 'main' of https://git.probindo.com/Probindo/database-pertani-web 2026-07-06 15:45:56 +07:00
Syaharani 6ddf978ba7 Merge branch 'main' of https://git.probindo.com/Probindo/database-pertani-web 2026-07-06 15:44:14 +07:00
Althaf 1fd47b517b akses pasar 2026-07-06 14:42:22 +07:00
Syaharani 13c71d2612 sosial ekonomi update 2026-07-06 13:29:25 +07:00
irwan.l.cahyono d0e41dc1d2 lahan tanaman edit delete 2026-07-06 11:46:02 +07:00
irwan.l.cahyono 21679486ea petani dan lahan 2026-07-06 01:28:06 +07:00
Althaf 7cd32b1116 fix: sosial-ekonomi nested route & controller view 2026-07-03 16:26:34 +07:00
Althaf e9e598616e Merge branch 'main' of https://git.probindo.com/Probindo/database-pertani-web 2026-07-03 15:08:02 +07:00
Althaf bd40cd9357 re-structre actions & lang 2026-07-03 15:07:50 +07:00
Syaharani eea9f4dec8 update view sosial ekonomi 2026-07-03 11:24:39 +07:00
afriadirahman 27e084bc9e Update Praktik Budidaya 2026-07-02 14:40:15 +07:00
Syaharani 3b1a0f52dd update field sosial ekonomi 2026-07-02 14:36:25 +07:00
Syaharani 5cee65f8df update field sosial ekonomi 2026-07-02 14:24:44 +07:00
Syaharani 5c1fe22fa0 sosial ekonomi 2026-07-02 13:08:54 +07:00
afriadirahman 8886629e02 Update dashboard survey 2026-07-02 12:58:14 +07:00
afriadirahman e1979b51dd update enums kondisi tanaman 2026-07-02 12:55:35 +07:00
afriadirahman 55598fbf1d Update Produktivitas Dashboard 2026-07-02 12:54:29 +07:00
afriadirahman 90f13438db Update Model Profile 2026-07-02 12:46:04 +07:00
afriadirahman c454a0b453 Update Route dan Sidebar 2026-07-02 12:38:48 +07:00
irwan.l.cahyono a4a81447ab Merge branch 'main' of https://git.probindo.com/Probindo/database-pertani-web 2026-07-01 15:38:17 +07:00
irwan.l.cahyono c4ff20facd petani lahan tanaman update 2026-07-01 15:38:15 +07:00
Syaharani 8710176b2c migration sosial ekonomi 2026-07-01 11:33:53 +07:00
Althaf 10df07b473 modified view 2026-07-01 11:15:57 +07:00
Althaf cc6a732de7 migrations akses pasar 2026-07-01 11:11:12 +07:00
irwan.l.cahyono 839e9aa572 petani lahan 2026-06-29 16:30:07 +07:00
irwan.l.cahyono 280f76510e petani 2026-06-29 14:02:59 +07:00
irwan.l.cahyono 02890ae9ae model petani 2026-06-29 09:46:44 +07:00
afriadirahman 1517dd38cf Update Dasboard utama dan Survey 2026-06-26 14:15:56 +07:00
fir2be 871b015ce2 distribusi 2026-06-25 14:50:27 +07:00
fir2be 7d40bcfb53 Model and Migration files 2026-06-25 11:07:59 +07:00
fir2be aecca02269 disini validasi 2026-06-18 16:27:35 +07:00
fir2be d5f1a5f625 sdacdsvsaacsd 2026-06-18 16:25:07 +07:00
fir2be cdbfff4424 qwdqdwwqdqwdqwdwqwdqwd 2026-06-18 15:52:36 +07:00
fir2be e640cba74f cek spasi longitude 2026-06-18 15:48:43 +07:00
fir2be 18bdb3abca zcssasca 2026-06-18 15:25:39 +07:00
fir2be 8cba4118bf validate on lahan_id with id 2026-06-18 15:20:14 +07:00
fir2be f8304f8f84 tanaman validate 2026-06-18 13:33:37 +07:00
Althaf 8ead70787c jenis komoditas 2026-06-17 16:06:21 +07:00
Syaharani d7e2cd7692 update daftar pengguna 2026-06-15 12:05:03 +07:00
fir2be 9d3b64a54d validatation 2026-06-08 13:56:01 +07:00
fir2be 35b50cba36 null default 2026-06-08 13:40:25 +07:00
fir2be b6c94ddb07 request name 2026-06-08 13:39:07 +07:00
fir2be bf1fe7fcfe panen controller namwapace 2026-06-08 13:29:23 +07:00
irwan.l.cahyono f270c1f0b6 Merge branch 'main' of https://git.probindo.com/Probindo/database-pertani-web 2026-06-08 13:25:41 +07:00
irwan.l.cahyono 482c3fc474 relasi wilayah ekosistem 2026-06-08 13:25:33 +07:00
Syaharani d509a79576 upadate produksi 2026-06-08 12:01:21 +07:00
fir2be a355a1d1d8 Panen and include all support 2026-06-08 11:23:33 +07:00
Syaharani f11be9d288 update link profile 2026-06-08 10:47:48 +07:00
Syaharani dca09168c9 Merge branch 'main' of https://git.probindo.com/Probindo/database-pertani-web 2026-06-08 10:09:54 +07:00
Syaharani af170284c8 update profile & produktivitas 2026-06-08 09:53:46 +07:00
irwan.l.cahyono f7cdeca2e6 api master 2026-06-08 09:05:48 +07:00
Althaf 316a98dc15 refoldering API Controllers 2026-06-05 14:38:20 +07:00
irwan.l.cahyono 7a4199e3f0 validasi 2026-06-05 10:03:12 +07:00
irwan.l.cahyono 381a9662ea eko value enum null 2026-06-04 16:38:40 +07:00
fir2be b15504e009 jenis_komoditas model,api controller dan resources 2026-06-03 15:05:52 +07:00
Althaf 7cc3e0e8f1 Merge branch 'main' of https://git.probindo.com/Probindo/database-pertani-web 2026-06-03 13:54:48 +07:00
Althaf 4021010618 restructure API Controllers (Master) 2026-06-03 13:52:59 +07:00
fir2be 58bb2951f7 tanaman conteoller 2026-06-03 13:09:04 +07:00
afriadirahman 17d384acf9 Update Map Tanaman & User 2026-06-03 09:53:16 +07:00
fir2be 751f14cb02 s 2026-06-02 17:08:51 +07:00
fir2be 0db7ca1fa9 tanaman controller to save uid 2026-06-02 17:07:06 +07:00
fir2be 7ec111274f resource uid 2026-06-02 16:57:29 +07:00
fir2be d13069cd78 tanaman uid 2026-06-02 16:52:32 +07:00
Althaf 8e83413d34 fix: resolve enum_opsi mismatch and json validation parsing 2026-06-02 16:42:04 +07:00
Althaf a48d6d75b6 Merge branch 'main' of https://git.probindo.com/Probindo/database-pertani-web 2026-06-02 16:34:29 +07:00
Althaf 1d37da0edc update: sanity check 2026-06-02 16:32:20 +07:00
fir2be 02037ff0be condition profile id 2026-06-02 16:24:00 +07:00
fir2be 7bf92ea619 farmer or others 2026-06-02 16:17:52 +07:00
irwan.l.cahyono 3ce013c754 program select2 2026-05-29 10:15:38 +07:00
irwan.l.cahyono 6ff0ef011c program short name 2026-05-29 09:50:10 +07:00
irwan.l.cahyono c4e4f396d2 summary realisasi capaian 2026-05-28 14:27:40 +07:00
irwan.l.cahyono fd42bf37fe realisasi float dan boolean 2026-05-28 10:50:29 +07:00
irwan.l.cahyono b702659215 realisasi verifikasi 2026-05-28 09:59:36 +07:00
irwan.l.cahyono 7681984d89 tabel ekosistem 2026-05-26 16:32:25 +07:00
afriadirahman e194658c28 Merge branch 'main' of https://git.probindo.com/Probindo/database-pertani-web 2026-05-26 14:30:59 +07:00
afriadirahman 17c4c96693 Penambahan Form Varietas 2026-05-26 14:30:43 +07:00
irwan.l.cahyono 05967cce75 test value 2026-05-26 13:01:57 +07:00
irwan.l.cahyono fa90501455 Merge branch 'main' of https://git.probindo.com/Probindo/database-pertani-web 2026-05-26 12:25:19 +07:00
irwan.l.cahyono a274f84fe2 RedirectResponse 2026-05-26 12:25:18 +07:00
afriadirahman 12f0686965 Update Jenis Komoditas 2026-05-26 11:30:24 +07:00
afriadirahman e4f7d675a1 Update Migration & Seeder 2026-05-26 09:38:38 +07:00
irwan.l.cahyono 9231f25e5d Program api 2026-05-26 00:55:51 +07:00
irwan.l.cahyono 037c482649 ekosistem dan framework 2026-05-26 00:09:55 +07:00
fir2be 3f37dcb51e catch map lahan 2026-05-25 15:49:10 +07:00
fir2be b08df8f6fa convert profile id 2026-05-25 15:34:47 +07:00
fir2be 6341199fd5 username on model 2026-05-25 15:11:00 +07:00
fir2be 60063b86ba username 2026-05-25 15:01:25 +07:00
fir2be 7e8ad932a4 user id profile 2026-05-25 10:58:39 +07:00
Althaf 7669511220 Merge branch 'main' of https://git.probindo.com/Probindo/database-pertani-web 2026-05-19 16:39:00 +07:00
Althaf 5f6dbb4d1e feat(ui): update administrative summary widgets 2026-05-19 16:38:47 +07:00
afriadirahman 9e748fc8cd Update master Varietas 2026-05-19 13:24:38 +07:00
Syaharani 1ca9d96779 update kolompok belajar 2026-05-19 11:10:53 +07:00
fir2be 6c0c47751c add column uid lahan profile 2026-05-18 14:41:31 +07:00
fir2be 75d679f492 update resources 2026-05-18 12:17:23 +07:00
irwan.l.cahyono e9abd33d85 rename tgl migrate 2026-05-15 15:47:10 +07:00
irwan.l.cahyono e0ab4bdace form tabel 2026-05-15 15:31:19 +07:00
fir2be 34d09d03bb kl 2026-05-15 13:23:03 +07:00
fir2be 36258344da komoditas object 2026-05-15 13:19:14 +07:00
fir2be 066b50ab9c profile dan user uid 2026-05-13 14:32:35 +07:00
Althaf 4333e16626 hide sev card 2026-05-13 14:18:48 +07:00
Althaf d6e25dd60a Merge branch 'main' of https://git.probindo.com/Probindo/database-pertani-web 2026-05-13 14:01:56 +07:00
Althaf 23566681c1 feat: add data completeness indicator badge to province table 2026-05-13 14:01:38 +07:00
fir2be ed39f7544c user UID 2026-05-12 10:12:51 +07:00
428 changed files with 64929 additions and 2794 deletions
@@ -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');
}
}
+28
View File
@@ -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');
}
}
+28
View File
@@ -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');
}
}
@@ -0,0 +1,26 @@
<?php
namespace App\Enums\AksesPasar;
enum TingkatKepercayaanPembeli: int
{
case SANGAT_PERCAYA = 1;
case CUKUP_PERCAYA = 2;
case RAGU_RAGU = 3;
case TIDAK_PERCAYA = 4;
public static function options(): array
{
return [
['value' => self::SANGAT_PERCAYA->value, 'label' => 'Sangat percaya, berani langsung coba'],
['value' => self::CUKUP_PERCAYA->value, 'label' => 'Cukup percaya, tapi hati hati'],
['value' => self::RAGU_RAGU->value, 'label' => 'Ragu ragu'],
['value' => self::TIDAK_PERCAYA->value, 'label' => 'Tidak percaya, enggan mencoba'],
];
}
public static function values(): array
{
return array_column(self::cases(), 'value');
}
}
+46
View File
@@ -0,0 +1,46 @@
<?php
namespace App\Enums\Bumdes;
enum JabatanBumdes: string
{
case DIREKTUR = 'direktur';
case DIREKTUR_KETUA = 'direktur_ketua';
case SEKRETARIS = 'sekretaris';
case BENDAHARA = 'bendahara';
case KEPALA_UNIT_USAHA = 'kepala_unit_usaha';
case PENGAWAS = 'pengawas';
case PENASIHAT = 'penasihat';
case ANGGOTA = 'anggota';
case STAF_OPERASIONAL = 'staf_operasional';
case LAINNYA = 'lainnya';
public function label(): string
{
return match ($this) {
self::DIREKTUR => 'Direktur/Ketua',
self::DIREKTUR_KETUA => 'Direktur/Ketua',
self::SEKRETARIS => 'Sekretaris',
self::BENDAHARA => 'Bendahara',
self::KEPALA_UNIT_USAHA => 'Kepala Unit Usaha',
self::PENGAWAS => 'Pengawas',
self::PENASIHAT => 'Penasihat',
self::ANGGOTA => 'Anggota',
self::STAF_OPERASIONAL => 'Staf Operasional',
self::LAINNYA => 'Lainnya',
};
}
public static function options(): array
{
return collect([
self::DIREKTUR_KETUA,
self::SEKRETARIS,
self::BENDAHARA,
self::LAINNYA,
])->map(fn ($case) => [
'value' => $case->value,
'label' => $case->label(),
])->toArray();
}
}
+27
View File
@@ -0,0 +1,27 @@
<?php
namespace App\Enums;
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();
}
}
+23 -5
View File
@@ -4,9 +4,27 @@ namespace App\Enums;
enum KondisiTanaman: string
{
case PRODUKTIF = 'productive';
case KURANG_PRODUKTIF = 'less_productive';
case TIDAK_PRODUKTIF = 'not_productive';
case SAKIT = 'sick';
case MATI = 'dead';
case BAIK = 'baik';
case SEDANG = 'sedang';
case BURUK = 'buruk';
//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();
}
}
+10
View File
@@ -0,0 +1,10 @@
<?php
namespace App\Enums\Koperasi;
enum PosisiKoperasi: string
{
case PENGURUS = 'Pengurus koperasi';
case ANGGOTA = 'Anggota koperasi';
case PENDAMPING = 'Pendamping koperasi';
}
+31
View File
@@ -0,0 +1,31 @@
<?php
namespace App\Enums;
enum LayoutForm: string
{
case ROW = 'form-row';
case COLUMN = 'form-column';
case VALUE = 'form-value';
case SECTION = 'form-section';
case HR_LINE = 'form-hr-line';
public function label(): string
{
return match($this) {
self::ROW => 'Row',
self::COLUMN => 'Column',
self::VALUE => 'Value',
self::SECTION => 'Section',
self::HR_LINE => 'HR Line',
};
}
public static function options(): array
{
return collect(self::cases())->map(fn ($case) => [
'value' => $case->value,
'label' => $case->label(),
])->toArray();
}
}
+6 -6
View File
@@ -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();
}
}
+29
View File
@@ -0,0 +1,29 @@
<?php
namespace App\Enums;
enum PenyakitTanaman: string
{
case BUSUK_BUAH = 'busuk_buah';
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();
}
}
+32
View File
@@ -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();
}
}
+31
View File
@@ -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();
}
}
@@ -0,0 +1,31 @@
<?php
namespace App\Enums\PraktikBudidaya;
enum FrekuensiPemangkasanPendamping: string
{
case TIDAK_PERNAH = 'Tidak pernah memangkas sama sekali';
case TIDAK_RUTIN = 'Memangkas, tapi tidak rutin dan tidak tahu tekniknya';
case SATU_KALI_TAHUN = 'Memangkas 1 kali/tahun, tahu jenis tekniknya';
case DUA_KALI_TAHUN = 'Memangkas 2 kali/tahun, tahu jenis tekniknya';
case LEBIH_DUA_KALI_TAHUN = 'Memangkas lebih dari 2 kali/tahun dengan teknik yang tepat, dan pohon penaung juga dipangkas rutin';
public function label(): string
{
return match($this) {
self::TIDAK_PERNAH => 'Tidak pernah memangkas sama sekali',
self::TIDAK_RUTIN => 'Memangkas, tapi tidak rutin dan tidak tahu tekniknya',
self::SATU_KALI_TAHUN => 'Memangkas 1 kali/tahun, tahu jenis tekniknya',
self::DUA_KALI_TAHUN => 'Memangkas 2 kali/tahun, tahu jenis tekniknya',
self::LEBIH_DUA_KALI_TAHUN => 'Memangkas lebih dari 2 kali/tahun dengan teknik yang tepat, dan pohon penaung juga dipangkas rutin',
};
}
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 FrekuensiPemangkasanUtama: int
{
case TIDAK_PERNAH = 1;
case TIDAK_RUTIN = 2;
case SATU_KALI_TAHUN = 3;
case DUA_KALI_TAHUN = 4;
case LEBIH_DUA_KALI_TAHUN = 5;
public function label(): string
{
return match($this) {
self::TIDAK_PERNAH => 'Tidak pernah memangkas sama sekali',
self::TIDAK_RUTIN => 'Memangkas, tapi tidak rutin dan tidak tahu tekniknya',
self::SATU_KALI_TAHUN => 'Memangkas 1 kali/tahun, tahu jenis tekniknya',
self::DUA_KALI_TAHUN => 'Memangkas 2 kali/tahun, tahu jenis tekniknya',
self::LEBIH_DUA_KALI_TAHUN => 'Memangkas lebih dari 2 kali/tahun dengan teknik yang tepat, dan pohon penaung juga dipangkas rutin',
};
}
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 FrekuensiSanitasiLahan: int
{
case TIDAK_PERNAH = 1;
case SESEKALI = 2;
case SETIAP_PANEN = 3;
case RUTIN_TIDAK_TERJADWAL = 4;
case RUTIN_TERJADWAL = 5;
public function label(): string
{
return match($this) {
self::TIDAK_PERNAH => 'Tidak pernah',
self::SESEKALI => 'Sesekali, tidak terjadwal',
self::SETIAP_PANEN => 'Setiap panen, tapi tidak menyeluruh',
self::RUTIN_TIDAK_TERJADWAL => 'Rutin, tapi tanpa jadwal yang jelas',
self::RUTIN_TERJADWAL => 'Rutin terjadwal dan menyeluruh',
};
}
public static function options(): array
{
return collect(self::cases())->map(fn ($case) => [
'value' => $case->value,
'label' => $case->label(),
])->toArray();
}
}
@@ -0,0 +1,34 @@
<?php
namespace App\Enums\PraktikBudidaya;
enum IntensitasSeranganHamaPenyakit: string
{
case RINGAN = 'Ringan - hanya beberapa tanaman terdampak';
case SEDANG = 'Sedang - sebagian tanaman terdampak';
case PARAH = 'Parah - sebagian besar tanaman terdampak';
case BERVARIASI = 'Bervariasi - tergantung musim';
public function label(): string
{
return match($this) {
self::RINGAN => 'Ringan - hanya beberapa tanaman terdampak',
self::SEDANG => 'Sedang - sebagian tanaman terdampak',
self::PARAH => 'Parah - sebagian besar tanaman terdampak',
self::BERVARIASI => 'Bervariasi - tergantung musim',
};
}
public static function values(): array
{
return collect(self::cases())->map(fn ($case) => $case->value)->toArray();
}
public static function options(): array
{
return collect(self::cases())->map(fn ($case) => [
'value' => $case->value,
'label' => $case->label(),
])->toArray();
}
}
+29
View File
@@ -0,0 +1,29 @@
<?php
namespace App\Enums\PraktikBudidaya;
enum JenisPupuk: string
{
case TIDAK_MEMBERI = 'Tidak memberi pupuk';
case ORGANIK = 'Pupuk organik (kompos/kandang)';
case KIMIA = 'Pupuk kimia';
case KEDUANYA = 'Keduanya';
public function label(): string
{
return match($this) {
self::TIDAK_MEMBERI => 'Tidak memberi pupuk',
self::ORGANIK => 'Pupuk organik (kompos/kandang)',
self::KIMIA => 'Pupuk kimia',
self::KEDUANYA => 'Keduanya',
};
}
public static function options(): array
{
return collect(self::cases())->map(fn ($case) => [
'value' => $case->value,
'label' => $case->label(),
])->toArray();
}
}
@@ -0,0 +1,27 @@
<?php
namespace App\Enums\PraktikBudidaya;
enum KebutuhanAirPerMusim: string
{
case TIDAK_BUTUH = 'Tidak butuh, hujan cukup';
case KURANG = 'Kurang, sering kekurangan air';
case CUKUP = 'Cukup terpenuhi';
public function label(): string
{
return match($this) {
self::TIDAK_BUTUH => 'Tidak butuh, hujan cukup',
self::KURANG => 'Kurang, sering kekurangan air',
self::CUKUP => 'Cukup terpenuhi',
};
}
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 KondisiPengelolaanAir: int
{
case KURANG_TIDAK_ADA_UPAYA = 1;
case KURANG_TIDAK_SUDAH_BERUPAYA = 2;
case CUKUP_DARI_HUJAN = 3;
case CUKUP_IRIGASI_PINJAM = 4;
case CUKUP_IRIGASI_SENDIRI = 5;
public function label(): string
{
return match($this) {
self::KURANG_TIDAK_ADA_UPAYA => 'Kebutuhan air kurang terpenuhi, sering kekurangan air, tidak ada upaya mengatasinya',
self::KURANG_TIDAK_SUDAH_BERUPAYA => 'Kebutuhan air kurang terpenuhi, sering kekurangan air, tapi sudah mencoba mengandalkan sumber lain (sumur/sungai) walau belum cukup',
self::CUKUP_DARI_HUJAN => 'Kebutuhan air cukup terpenuhi hanya dari hujan, tanpa sistem irigasi tambahan',
self::CUKUP_IRIGASI_PINJAM => 'Kebutuhan air cukup terpenuhi, ada sistem irigasi tambahan (sungai/mata air/sumur) tapi pinjam',
self::CUKUP_IRIGASI_SENDIRI => 'Kebutuhan air cukup terpenuhi, punya akses irigasi sendiri (sungai/mata air/sumur) yang dikelola baik',
};
}
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\PraktikBudidaya;
enum MetodePenangananHamaPenyakit: int
{
case TIDAK_ADA = 1;
case CARA_TRADISIONAL = 2;
case PESTISIDA_SANITASI = 3;
case KOMBINASI = 4;
case PHT = 5;
public function label(): string
{
return match($this) {
self::TIDAK_ADA => 'Tidak ada penanganan',
self::CARA_TRADISIONAL => 'Cara tradisional (doa/ritual)',
self::PESTISIDA_SANITASI => 'Pestisida atau sanitasi',
self::KOMBINASI => 'Kombinasi pestisida dan sanitasi',
self::PHT => 'Pengendalian hama terpadu (PHT)',
};
}
public static function values(): array
{
return collect(self::cases())->map(fn ($case) => $case->value)->toArray();
}
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 PemahamanManfaatKonservasi: string
{
case YA_PAHAM = 'Ya, tahu manfaatnya';
case TIDAK_PAHAM = 'Dilakukan tapi tidak tahu manfaatnya, kebiasaan turun-temurun';
public function label(): string
{
return match($this) {
self::YA_PAHAM => 'Ya, tahu manfaatnya',
self::TIDAK_PAHAM => 'Dilakukan tapi tidak tahu manfaatnya, kebiasaan turun-temurun',
};
}
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 PemberianPupuk: int
{
case TIDAK_PERNAH = 1;
case JENIS_DOSIS_WAKTU_TIDAK_MENENTU = 2;
case JENIS_SESUAI_DOSIS_TIDAK_MENENTU = 3;
case JENIS_DOSIS_SESUAI_WAKTU_CUKUP_TEPAT = 4;
case JENIS_DOSIS_SESUAI_WAKTU_TEPAT = 5;
public function label(): string
{
return match($this) {
self::TIDAK_PERNAH => 'Tidak pernah memberi pupuk',
self::JENIS_DOSIS_WAKTU_TIDAK_MENENTU => 'Memberi pupuk, tapi jenis/dosis tidak menentu, waktu sembarangan',
self::JENIS_SESUAI_DOSIS_TIDAK_MENENTU => 'Memberi pupuk dengan jenis yang sesuai (organik/kimia/keduanya), tapi dosis atau waktu belum tepat',
self::JENIS_DOSIS_SESUAI_WAKTU_CUKUP_TEPAT => 'Memberi pupuk dengan jenis dan dosis yang sesuai, waktu cukup tepat',
self::JENIS_DOSIS_SESUAI_WAKTU_TEPAT => 'Memberi pupuk rutin dengan jenis tepat, dosis tepat, dan waktu tepat sesuai kebutuhan tanaman',
};
}
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 PenangananGulma: int
{
case DIBIARKAN = 1;
case DICABUT = 2;
case DISEMPROT = 3;
case RUTIN_DICABUT_TANPA_JADWAL = 4;
case RUTIN_TERJADWAL = 5;
public function label(): string
{
return match($this) {
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)',
};
}
public static function options(): array
{
return collect(self::cases())->map(fn ($case) => [
'value' => $case->value,
'label' => $case->label(),
])->toArray();
}
}
@@ -0,0 +1,27 @@
<?php
namespace App\Enums\PraktikBudidaya;
enum PenangananSisaBuahRanting: string
{
case DIBIARKAN = 'Dibiarkan di kebun';
case DIKUMPULKAN = 'Dikumpulkan dan dibuang';
case KOMPOS = 'Dijadikan kompos';
public function label(): string
{
return match($this) {
self::DIBIARKAN => 'Dibiarkan di kebun',
self::DIKUMPULKAN => 'Dikumpulkan dan dibuang',
self::KOMPOS => 'Dijadikan kompos',
};
}
public static function options(): array
{
return collect(self::cases())->map(fn ($case) => [
'value' => $case->value,
'label' => $case->label(),
])->toArray();
}
}
@@ -0,0 +1,27 @@
<?php
namespace App\Enums\PraktikBudidaya;
enum PenyerbukanManual: string
{
case SELALU = 'Selalu, setiap musim berbunga';
case KADANG_KADANG = 'Kadang-kadang, tergantung kondisi';
case TIDAK_PERNAH = 'Tidak pernah';
public function label(): string
{
return match($this) {
self::SELALU => 'Selalu, setiap musim berbunga',
self::KADANG_KADANG => 'Kadang-kadang, tergantung kondisi',
self::TIDAK_PERNAH => 'Tidak pernah',
};
}
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 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();
}
}
+34
View File
@@ -0,0 +1,34 @@
<?php
namespace App\Enums\PraktikBudidaya;
enum TenagaKerja: string
{
case DIKERJAKAN_SENDIRI = 'Dikerjakan Sendiri';
case DIBANTU_ANGGOTA_KELUARGA = 'Dibantu Anggota Keluarga';
case UPAH_TENAGA_KERJA = 'Upah Tenaga Kerja';
case GOTONG_ROYONG = 'Gotong Royong/Swadaya Komunitas';
public function label(): string
{
return match($this) {
self::DIKERJAKAN_SENDIRI => 'Dikerjakan Sendiri',
self::DIBANTU_ANGGOTA_KELUARGA => 'Dibantu Anggota Keluarga',
self::UPAH_TENAGA_KERJA => 'Upah Tenaga Kerja',
self::GOTONG_ROYONG => 'Gotong Royong/Swadaya Komunitas',
};
}
public static function values(): array
{
return collect(self::cases())->map(fn ($case) => $case->value)->toArray();
}
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();
}
}
@@ -0,0 +1,34 @@
<?php
namespace App\Enums\PraktikBudidaya;
enum WaktuKemunculanTerparahHamaPenyakit: string
{
case HUJAN = 'Musim hujan';
case KEMARAU = 'Musim kemarau';
case SEPANJANG_TAHUN = 'Sepanjang tahun';
case TIDAK_TENTU = 'Tidak tentu';
public function label(): string
{
return match($this) {
self::HUJAN => 'Musim hujan',
self::KEMARAU => 'Musim kemarau',
self::SEPANJANG_TAHUN => 'Sepanjang tahun',
self::TIDAK_TENTU => 'Tidak tentu',
};
}
public static function values(): array
{
return collect(self::cases())->map(fn ($case) => $case->value)->toArray();
}
public static function options(): array
{
return collect(self::cases())->map(fn ($case) => [
'value' => $case->value,
'label' => $case->label(),
])->toArray();
}
}
+27
View File
@@ -0,0 +1,27 @@
<?php
namespace App\Enums;
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');
}
}
@@ -0,0 +1,14 @@
<?php
namespace App\Enums\SosialEkonomi;
enum KategoriPendapatanKomoditas: string
{
case UTAMA = 'utama';
case LAINNYA = 'lainnya';
public static function values(): array
{
return array_column(self::cases(), 'value');
}
}
@@ -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');
}
}
@@ -0,0 +1,14 @@
<?php
namespace App\Enums\SosialEkonomi;
enum PeriodePendapatan: string
{
case MUSIM = 'musim';
case TAHUN = 'tahun';
public static function values(): array
{
return array_column(self::cases(), 'value');
}
}
@@ -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');
}
}
@@ -0,0 +1,27 @@
<?php
namespace App\Enums\SosialEkonomi;
enum PihakMembantuKonflik: string
{
case TIDAK_ADA_SELESAIKAN_SENDIRI = 'Tidak ada-selesaikan sendiri';
case ADA = 'Ada';
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();
}
public static function values(): array
{
return array_column(self::cases(), 'value');
}
}
@@ -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');
}
}
+38
View File
@@ -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');
}
}
@@ -0,0 +1,36 @@
<?php
namespace App\Enums\SosialEkonomi;
enum SkorKecukupanPenghasilan: int
{
case SANGAT_TIDAK_CUKUP = 1;
case KURANG_SERING_BERHUTANG = 2;
case CUKUP_PAS_PASAN = 3;
case CUKUP_ADA_SISA = 4;
case LEBIH_DARI_CUKUP = 5;
public function label(): string
{
return match ($this) {
self::SANGAT_TIDAK_CUKUP => 'Sangat tidak cukup',
self::KURANG_SERING_BERHUTANG => 'Kurang, sering berhutang',
self::CUKUP_PAS_PASAN => 'Cukup pas-pasan',
self::CUKUP_ADA_SISA => 'Cukup, kadang ada sisa',
self::LEBIH_DARI_CUKUP => 'Lebih dari cukup',
};
}
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 SkorKejelasanStatusLahan: int
{
case TIDAK_ADA_DOKUMEN_ADA_SENGKETA = 1;
case ADA_DOKUMEN_MASIH_SENGKETA = 2;
case PERNAH_SENGKETA_SELESAI = 3;
case LAHAN_ADAT_TANPA_SENGKETA = 4;
case BERSERTIFIKAT_TANPA_SENGKETA = 5;
public function label(): string
{
return match ($this) {
self::TIDAK_ADA_DOKUMEN_ADA_SENGKETA => 'Tidak ada dokumen & ada sengketa',
self::ADA_DOKUMEN_MASIH_SENGKETA => 'Ada dokumen tapi masih sengketa',
self::PERNAH_SENGKETA_SELESAI => 'Pernah sengketa, sudah selesai',
self::LAHAN_ADAT_TANPA_SENGKETA => 'Lahan adat/keluarga/perhutanan sosial tanpa sengketa',
self::BERSERTIFIKAT_TANPA_SENGKETA => 'Bersertifikat & tidak ada sengketa',
};
}
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 SkorKemampuanMenabung: int
{
case TIDAK_BISA = 1;
case PERNAH_TERPAKAI = 2;
case KADANG_KADANG = 3;
case BISA_TIDAK_TETAP = 4;
case RUTIN_TETAP = 5;
public function label(): string
{
return match ($this) {
self::TIDAK_BISA => 'Tidak bisa sama sekali',
self::PERNAH_TERPAKAI => 'Pernah tapi selalu terpakai',
self::KADANG_KADANG => 'Kadang-kadang',
self::BISA_TIDAK_TETAP => 'Bisa tapi tidak tetap',
self::RUTIN_TETAP => 'Rutin & jumlah tetap',
};
}
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 SkorPeriodePaceklik: int
{
case LEBIH_DARI_EMPAT_BULAN = 1;
case TIGA_SAMPAI_EMPAT_BULAN = 2;
case SATU_SAMPAI_DUA_BULAN = 3;
case SEBENTAR_TIDAK_MENENTU = 4;
case TIDAK_ADA_STABIL = 5;
public function label(): string
{
return match ($this) {
self::LEBIH_DARI_EMPAT_BULAN => '>4 bulan',
self::TIGA_SAMPAI_EMPAT_BULAN => '3-4 bulan',
self::SATU_SAMPAI_DUA_BULAN => '1-2 bulan',
self::SEBENTAR_TIDAK_MENENTU => 'Sebentar & tidak menentu',
self::TIDAK_ADA_STABIL => 'Tidak ada, stabil',
};
}
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 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');
}
}
@@ -0,0 +1,30 @@
<?php
namespace App\Enums\SosialEkonomi;
enum StatusKepemilikanLahanSosialEkonomi: string
{
case MILIK_PRIBADI = 'Milik pribadi';
case MILIK_ORANG_TUA_KELUARGA = 'Milik orang tua-keluarga';
case SEWA_BAGI_HASIL = 'Sewa-bagi hasil';
case LAHAN_ADAT = 'Lahan adat';
case PERHUTANAN_SOSIAL = 'Perhutanan sosial';
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();
}
public static function values(): array
{
return array_column(self::cases(), 'value');
}
}
+27
View File
@@ -0,0 +1,27 @@
<?php
namespace App\Enums\SosialEkonomi;
enum StatusKonflik: string
{
case SUDAH_SELESAI = 'Sudah selesai';
case BELUM_MASIH_BERLANJUT = 'Belum, masih berlanjut';
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();
}
public static function values(): array
{
return array_column(self::cases(), 'value');
}
}
@@ -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');
}
}
@@ -0,0 +1,59 @@
<?php
namespace App\Http\Controllers\Api\Core;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Illuminate\Http\Resources\Json\AnonymousResourceCollection;
use App\Models\Core\Program;
use App\Http\Resources\Core\ProgramResource;
class ProgramController extends Controller
{
/**
* Display a listing of the resource.
*/
public function index(Request $request): AnonymousResourceCollection
{
$perPage = $request->query('per_page', 10);
$search = $request->query('search', '');
$program = Program::where('nama', 'like', "%$search%")
->paginate($perPage);
return ProgramResource::collection($program);
}
/**
* Store a newly created resource in storage.
*/
public function store(Request $request)
{
//
}
/**
* Display the specified resource.
*/
public function show(string $id): ProgramResource
{
$program = Program::findOrFail($id);
return new ProgramResource($program);
}
/**
* Update the specified resource in storage.
*/
public function update(Request $request, string $id)
{
//
}
/**
* Remove the specified resource from storage.
*/
public function destroy(string $id)
{
//
}
}
@@ -0,0 +1,140 @@
<?php
namespace App\Http\Controllers\Api\Ekosistem;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Illuminate\Http\JsonResponse;
use Illuminate\Support\Facades\Gate;
use Illuminate\Support\Facades\DB;
use App\Models\Ekosistem\TabelBasisData;
use App\Models\Ekosistem\KolomBasisData;
use App\Models\Core\Program;
class FormBasisDataController extends Controller
{
/**
* Display a listing of the resource.
*/
public function index(Request $request, string $tabelId): JsonResponse
{
if (!Gate::any(['super_admin', 'admin', 'fasilitator'])) {
abort(403);
}
$tabel = TabelBasisData::with('kolom')
->whereHas('kolom', function ($query) {
$query->where('is_active', true);
})->find($tabelId);
if (!$tabel) {
abort(404, 'Data tabel tidak ditemukan.');
}
$kolom = KolomBasisData::where('tabel_id', $tabelId)
->where('is_active', true)->get();
if ($kolom->isEmpty()) {
abort(404, 'Data kolom tidak ditemukan untuk tabel ini.');
}
$program = null;
if (app()->has('SystemProgram')) {
$program = app('SystemProgram');
} else {
if ($request->has('program_id') && $request->query('program_id')) {
$programId = $request->query('program_id');
$program = Program::find($programId);
}
}
if (!$program) {
abort(400, 'Program tidak ditemukan.');
}
$method = $request->query('method', 'add');
$list_relasi = null;
if ($method == 'add' || $method == 'edit') {
$list_relasi = [];
foreach ($kolom as $k) {
if ($k->tipe == 'foreign_key') {
$relasi['kolom_id'] = $k->id;
try {
$options_kolom = DB::table($k->relasi_tabel)->selectRaw($k->relasi_kolom_label . ' as label, ' . $k->relasi_kolom_id . ' as value')->whereNull('deleted_at');
$relasi['options'] = $options_kolom->get();
$relasi['sql'] = $options_kolom->toSql();
} catch (\Throwable $th) {
$relasi['options'] = [];
}
$list_relasi[] = $relasi;
}
}
$list_relasi = collect($list_relasi);
} elseif ($method == 'view') {
$id = $request->query('value_id');
if (!$id) {
abort(400, 'value_id query parameter diperlukan untuk view method.');
}
$values = ValueBasisData::query()
->where('tabel_id', $tabelId)
->where('value_id', $id)
->where('program_id', $program->id)
->get();
if ($values->isEmpty()) {
abort(404, 'Data tidak ditemukan.');
}
foreach ($values as $v) {
$k = $kolom->where('id', $v->kolom_id)->first();
if ($k->tipe == 'foreign_key') {
$v->value_relasi_label = DB::table($k->relasi_tabel)->where($k->relasi_kolom_id, $v->value_relasi)->value($k->relasi_kolom_label);
} else if ($k->tipe == 'enum') {
$opsi = collect($k->enum_opsi);
$found = $opsi->first(function ($item) use ($v) {
return (string) $item['value'] === (string) $v->value_enum;
});
$v->value_enum_label = $found['label'] ?? null;
}
}
$value_id = $id;
}
$errors = $request->query('errors', null);
return response()->json($tabel->renderHtml($method, $errors, $list_relasi));
}
/**
* Store a newly created resource in storage.
*/
public function store(Request $request)
{
//
}
/**
* Display the specified resource.
*/
public function show(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)
{
//
}
}
@@ -0,0 +1,78 @@
<?php
namespace App\Http\Controllers\Api\Ekosistem;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Gate;
use Illuminate\Http\Resources\Json\AnonymousResourceCollection;
use Illuminate\Http\JsonResponse;
use App\Models\Ekosistem\TabelBasisData;
use App\Http\Resources\Ekosistem\TabelBasisDataResource;
class TabelBasisDataController extends Controller
{
/**
* Display a listing of the resource.
*/
public function index(Request $request): AnonymousResourceCollection
{
if (!Gate::any(['super_admin', 'admin', 'fasilitator'])) {
abort(403);
}
$perPage = $request->query('per_page', 10);
$search = strtolower($request->query('search', ''));
$tabel = TabelBasisData::with('kolom')
->whereHas('kolom', function ($query) {
$query->where('is_active', true);
})
->whereRaw('lower(tabel) LIKE ?', ["%$search%"])
->paginate($perPage);
return TabelBasisDataResource::collection($tabel);
}
/**
* Store a newly created resource in storage.
*/
public function store(Request $request)
{
//
}
/**
* Display the specified resource.
*/
public function show(Request $request, string $id): JsonResponse
{
if (!Gate::any(['super_admin', 'admin', 'fasilitator'])) {
abort(403);
}
$tabel = TabelBasisData::with('kolom', 'form', 'form.form', 'form.form.form', 'form.form.form.kolom')->findOrFail($id);
return (new TabelBasisDataResource($tabel))
->response();
}
/**
* Update the specified resource in storage.
*/
public function update(Request $request, string $id)
{
//
}
/**
* Remove the specified resource from storage.
*/
public function destroy(string $id)
{
//
}
}
@@ -0,0 +1,402 @@
<?php
namespace App\Http\Controllers\Api\Ekosistem;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Illuminate\Http\Resources\Json\AnonymousResourceCollection;
use Illuminate\Http\JsonResponse;
use Illuminate\Support\Facades\Gate;
use Illuminate\Support\Facades\DB;
use App\Models\Ekosistem\TabelBasisData;
use App\Models\Ekosistem\KolomBasisData;
use App\Models\Ekosistem\ValueBasisData;
use App\Models\Core\Program;
class ValueBasisDataController extends Controller
{
public function index(Request $request, string $tabelId): JsonResponse
{
if (!Gate::any(['super_admin', 'admin', 'fasilitator'])) {
abort(403);
}
$perPage = $request->query('per_page', 10);
$search = strtolower($request->query('search', ''));
$program = null;
$programList = Program::get();
if (app()->has('SystemProgram')) {
$program = app('SystemProgram');
} else {
if ($request->has('program_id') && $request->query('program_id')) {
$programId = $request->query('program_id');
$program = Program::find($programId);
if (!$program) {
abort(400, 'Program tidak ditemukan.');
}
}
}
$tabel = TabelBasisData::with('kolom')
->whereHas('kolom', function ($query) {
$query->where('is_active', true);
})
->find($tabelId);
if (!$tabel) {
abort(404, 'Data tabel tidak ditemukan.');
}
$kolom = KolomBasisData::where('tabel_id', $tabelId)
->where('is_active', true)
->when('is_browse', function ($q) {
$q->where('is_browse', true);
})
->orderBy('urutan', 'asc')
->get();
if ($kolom->isEmpty()) {
abort(404, 'Data kolom tidak ditemukan untuk tabel ini.');
}
$selects = [];
foreach ($kolom as $k) {
if ($k->tipe == 'boolean') {
$selects[] = "
MAX(
CASE
WHEN kolom_id = {$k->id}
THEN CASE
WHEN value_boolean = true THEN 'Ya'
WHEN value_boolean = false THEN 'Tidak'
ELSE NULL
END
ELSE NULL
END
) AS \"{$k->kolom}\"
";
} elseif ($k->tipe == 'foreign_key') {
$selects[] = "
MAX(
CASE
WHEN kolom_id = {$k->id}
THEN (select {$k->relasi_kolom_label} from {$k->relasi_tabel} where {$k->relasi_kolom_id} = value_relasi)
ELSE NULL
END
) AS \"{$k->kolom}\"
";
} elseif ($k->tipe == 'enum') {
$selects[] = "
MAX(
CASE
WHEN kolom_id = {$k->id}
AND value_enum IS NOT NULL
THEN (
SELECT elem->>'label'
FROM ekosistem_basis_data_kolom k,
jsonb_array_elements(k.enum_opsi::jsonb) AS elem
WHERE k.id = kolom_id
AND elem->>'value' = value_enum
LIMIT 1
)
ELSE NULL
END
) AS \"{$k->kolom}\"
";
} else {
$selects[] = "
MAX(
CASE
WHEN kolom_id = {$k->id}
THEN value_{$k->tipe}
ELSE NULL
END
) AS \"{$k->kolom}\"
";
}
}
$base = ValueBasisData::query()
->join('core_program', 'core_program.id', '=', 'ekosistem_basis_data_value.program_id')
->where('tabel_id', $tabelId)
->when($program, function ($query) use ($program) {
$query->where('program_id', $program->id);
})
->selectRaw("
core_program.id AS program_id,
core_program.nama AS program_nama,
tabel_id,
value_id,
" . implode(",\n", $selects) . "
")
->groupBy('core_program.id', 'core_program.nama', 'tabel_id', 'value_id')
->orderBy('value_id', 'asc');
$values = DB::query()->fromSub($base, 'pivot')
->when($search, function ($query) use ($search, $kolom) {
$query->where(function ($q) use ($search, $kolom) {
foreach ($kolom as $k) {
if ($k->tipe == 'text' || $k->tipe == 'varchar') {
$q->orWhereRaw("lower({$k->kolom}) LIKE ?", ["%$search%"]);
}
}
});
})
->paginate($perPage);
return response()->json($values);
}
private function prepareValidationRules($kolom)
{
$rules = [];
foreach ($kolom as $k) {
if ($k->validasi && is_array($k->validasi)) {
$rules[$k->kolom] = $k->validasi;
if (!in_array('required', $k->validasi) && !in_array('nullable', $k->validasi)) {
$rules[$k->kolom][] = 'nullable';
}
if (!in_array('string', $k->validasi) && ($k->tipe == 'varchar' || $k->tipe == 'text')) {
$rules[$k->kolom][] = 'string';
}
if (!in_array('max', $k->validasi) && ($k->tipe == 'varchar')) {
$rules[$k->kolom][] = 'max:255';
}
if (!in_array('integer', $k->validasi) && $k->tipe == 'integer') {
$rules[$k->kolom][] = 'integer';
}
if (!in_array('boolean', $k->validasi) && $k->tipe == 'boolean') {
$rules[$k->kolom][] = 'boolean';
}
if (!in_array('date', $k->validasi) && ($k->tipe == 'date' || $k->tipe == 'datetime')) {
$rules[$k->kolom][] = 'date';
}
if ($k->tipe == 'foreign_key') {
$rules[$k->kolom][] = 'exists:' . $k->relasi_tabel . ',' . $k->relasi_kolom_id;
}
if ($k->tipe == 'enum') {
$enumValues = collect($k->enum_opsi)->pluck('value')->toArray();
$rules[$k->kolom][] = Rule::in($enumValues);
}
} else {
$rules[$k->kolom] = ['nullable'];
if ($k->tipe == 'varchar' || $k->tipe == 'text') {
$rules[$k->kolom][] = 'string';
}
if ($k->tipe == 'varchar') {
$rules[$k->kolom][] = 'max:255';
}
if ($k->tipe == 'integer') {
$rules[$k->kolom][] = 'integer';
}
if ($k->tipe == 'boolean') {
$rules[$k->kolom][] = 'boolean';
}
if ($k->tipe == 'date' || $k->tipe == 'datetime') {
$rules[$k->kolom][] = 'date';
}
if ($k->tipe == 'foreign_key') {
$rules[$k->kolom][] = 'exists:' . $k->relasi_tabel . ',' . $k->relasi_kolom_id;
}
if ($k->tipe == 'enum') {
$enumValues = collect($k->enum_opsi)->pluck('value')->toArray();
$rules[$k->kolom][] = Rule::in($enumValues);
}
}
}
return $rules;
}
public function store(Request $request, string $tabelId): JsonResponse
{
if (!Gate::any(['super_admin', 'admin', 'fasilitator'])) {
abort(403);
}
$tabel = TabelBasisData::whereHas('kolom', function ($query) {
$query->where('is_active', true);
})->find($tabelId);
if (!$tabel) {
abort(404, 'Data tabel tidak ditemukan.');
}
$kolom = KolomBasisData::where('tabel_id', $tabelId)
->where('is_active', true)->get();
if ($kolom->isEmpty()) {
abort(404, 'Data kolom tidak ditemukan untuk tabel ini.');
}
if (app()->has('SystemProgram')) {
$program = app('SystemProgram');
} else {
if ($request->has('program_id') && $request->query('program_id')) {
$programId = $request->query('program_id');
$program = Program::find($programId);
if (!$program) {
abort(400, 'Program tidak ditemukan.');
}
} else {
abort(400, 'Program tidak ditemukan.');
}
}
$validated = $request->validate($this->prepareValidationRules($kolom));
DB::transaction(function () use ($program, $tabelId, $validated, $kolom) {
$maxId = ValueBasisData::where('tabel_id', $tabelId)
->where('program_id', $program->id)
->whereNotNull('value_id')
->max('value_id');
foreach ($kolom as $k) {
$values = [
'program_id' => $program->id,
'tabel_id' => (int)$tabelId,
'kolom_id' => $k->id,
'value_id' => ($maxId ?? 0) + 1,
'created_by' => auth()->id(),
'updated_by' => auth()->id(),
];
if ($k->tipe == 'foreign_key') {
$values['value_relasi'] = $validated[$k->kolom] ?? null;
} else {
$values['value_' . $k->tipe] = $validated[$k->kolom] ?? null;
}
ValueBasisData::create($values);
}
});
return response()->json(['message' => 'Data berhasil disimpan.']);
}
public function show(string $id)
{
//
}
public function update(Request $request, string $tabelId, string $id): JsonResponse
{
if (!Gate::any(['super_admin', 'admin', 'fasilitator'])) {
abort(403);
}
$tabel = TabelBasisData::whereHas('kolom', function ($query) {
$query->where('is_active', true);
})->find($tabelId);
if (!$tabel) {
abort(404, 'Data tabel tidak ditemukan.');
}
$kolom = KolomBasisData::where('tabel_id', $tabelId)
->where('is_active', true)->get();
if ($kolom->isEmpty()) {
abort(404, 'Data kolom tidak ditemukan untuk tabel ini.');
}
if (app()->has('SystemProgram')) {
$program = app('SystemProgram');
} else {
if ($request->has('program_id') && $request->query('program_id')) {
$programId = $request->query('program_id');
$program = Program::find($programId);
if (!$program) {
abort(400, 'Program tidak ditemukan.');
}
} else {
abort(400, 'Program tidak ditemukan.');
}
}
$values = ValueBasisData::query()
->where('tabel_id', $tabelId)
->where('value_id', $id)
->where('program_id', $program->id)
->get();
if ($values->isEmpty()) {
abort(404, 'Data tidak ditemukan.');
}
$validated = $request->validate($this->prepareValidationRules($kolom));
DB::transaction(function () use ($program, $tabelId, $validated, $kolom, $id, $values) {
foreach ($validated as $kol => $val) {
$k = $kolom->where('kolom', $kol)->first();
if (!$k) {
continue;
}
$v = $values->where('kolom_id', $k->id)->first();
if (!$v) {
$vals = [
'program_id' => $program->id,
'tabel_id' => (int)$tabelId,
'kolom_id' => $k->id,
'value_id' => $id,
'created_by' => auth()->id(),
'updated_by' => auth()->id(),
];
if ($k->tipe == 'foreign_key') {
$vals['value_relasi'] = $validated[$k->kolom] ?? null;
} else {
$vals['value_' . $k->tipe] = $validated[$k->kolom] ?? null;
}
ValueBasisData::create($vals);
} else {
$v->update([
'value_' . ($k->tipe == 'foreign_key' ? 'relasi' : $k->tipe) => $val,
'updated_by' => auth()->id(),
]);
}
}
});
return response()->json(['message' => 'Data berhasil diperbarui.']);
}
public function destroy(Request $request, string $tabelId, string $id): JsonResponse
{
if (!Gate::any(['super_admin', 'admin', 'fasilitator'])) {
abort(403);
}
$tabel = TabelBasisData::whereHas('kolom', function ($query) {
$query->where('is_active', true);
})->find($tabelId);
if (!$tabel) {
abort(404, 'Data tabel tidak ditemukan.');
}
$kolom = KolomBasisData::where('tabel_id', $tabelId)->get();
if ($kolom->isEmpty()) {
abort(404, 'Data kolom tidak ditemukan untuk tabel ini.');
}
if (app()->has('SystemProgram')) {
$program = app('SystemProgram');
} else {
if ($request->has('program_id') && $request->query('program_id')) {
$programId = $request->query('program_id');
$program = Program::find($programId);
if (!$program) {
abort(400, 'Program tidak ditemukan.');
}
} else {
abort(400, 'Program tidak ditemukan.');
}
}
$values = ValueBasisData::query()
->where('tabel_id', $tabelId)
->where('value_id', $id)
->where('program_id', $program->id)
->get();
if ($values->isEmpty()) {
abort(404, 'Data tidak ditemukan.');
}
ValueBasisData::query()
->where('tabel_id', $tabelId)
->where('value_id', $id)
->where('program_id', $program->id)
->delete();
return response()->json(['message' => 'Data berhasil dihapus.']);
}
}
@@ -1,21 +1,19 @@
<?php
namespace App\Http\Controllers\Api;
namespace App\Http\Controllers\Api\Konfigurasi;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Http\JsonResponse;
use Illuminate\Support\Facades\Hash;
use App\Models\User;
use App\Models\Profile;
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'],
@@ -29,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;
@@ -39,46 +44,42 @@ 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'],
'role' => ['string'],
'username' => ['required', 'string', 'max:255'],
'uid' => ['required','string', 'unique:users'],
]);
$user = User::create([
'name' => $credentials['name'],
'email' => $credentials['email'],
'password' => Hash::make($credentials['password']),
'role' => $credentials['role'],
'username' => $credentials['username'],
'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
@@ -1,6 +1,6 @@
<?php
namespace App\Http\Controllers\Api;
namespace App\Http\Controllers\Api\Master;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
@@ -1,6 +1,6 @@
<?php
namespace App\Http\Controllers\Api;
namespace App\Http\Controllers\Api\Master;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
@@ -0,0 +1,141 @@
<?php
namespace App\Http\Controllers\Api\Master;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Illuminate\Http\JsonResponse;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Gate;
use Illuminate\Http\Resources\Json\AnonymousResourceCollection;
use Illuminate\Validation\Rule;
use App\Http\Resources\Pertanian\JenisKomoditasResource;
use App\Models\Pertanian\JenisKomoditas;
class JenisKomoditasController extends Controller
{
/**
* Display a listing of the resource.
*/
public function index(Request $request): AnonymousResourceCollection
{
if (!Gate::any(['petani', 'fasilitator', 'super_admin'])) {
abort(403);
}
$size = $request->integer('size') ?: 10;
$jenisKomoditasList = JenisKomoditas::when($request->search, function ($q, $search) {
$search = strtolower($search);
$q->whereRaw('lower(nama) like ?', ["%{$search}%"]);
})
->when($request->kode, fn($q, $v) => $q->where('kode', $v));
if ($request->filled('sort')) {
$dir = str_starts_with($request->sort, '-') ? 'desc' : 'asc';
$column = ltrim($request->sort, '-');
$allowed = ['id', 'nama', 'kode'];
if (in_array($column, $allowed)) {
$jenisKomoditasList->orderBy($column, $dir);
}
} else {
$jenisKomoditasList->orderBy('nama', 'asc');
}
$jenisKomoditasList = $jenisKomoditasList->paginate($size);
return JenisKomoditasResource::collection($jenisKomoditasList);
}
/**
* Show the form for creating a new resource.
*/
public function create()
{
//
}
/**
* Store a newly created resource in storage.
*/
public function store(Request $request): JsonResponse
{
if (!Gate::any(['petani', 'fasilitator', 'super_admin'])) {
abort(403);
}
$validated = $request->validate([
'nama' => ['required', 'string', 'max:255'],
'kode' => ['required', 'string', 'max:50', 'unique:jenis_komoditas,kode'],
'keterangan' => ['nullable', 'string'],
]);
$jenisKomoditas = JenisKomoditas::create($validated);
return (new JenisKomoditasResource($jenisKomoditas))
->response()
->setStatusCode(201);
}
/**
* Display the specified resource.
*/
public function show(string $id): JsonResponse
{
if (!Gate::any(['petani', 'fasilitator', 'super_admin'])) {
abort(403);
}
$jenisKomoditas = JenisKomoditas::findOrFail($id);
return (new JenisKomoditasResource($jenisKomoditas))->response();
}
/**
* 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): JsonResponse
{
if (!Gate::any(['petani', 'fasilitator', 'super_admin'])) {
abort(403);
}
$jenisKomoditas = JenisKomoditas::findOrFail($id);
$validated = $request->validate([
'nama' => ['required', 'string', 'max:255'],
'kode' => ['required', 'string', 'max:50', Rule::unique('jenis_komoditas', 'kode')->ignore($jenisKomoditas->id)],
'keterangan' => ['nullable', 'string'],
]);
$jenisKomoditas->update($validated);
return (new JenisKomoditasResource($jenisKomoditas))->response();
}
/**
* Remove the specified resource from storage.
*/
public function destroy(string $id): JsonResponse
{
if (!Gate::any(['petani', 'fasilitator', 'super_admin'])) {
abort(403);
}
$jenisKomoditas = JenisKomoditas::findOrFail($id);
$jenisKomoditas->delete();
return response()->json(null, 204);
}
}
@@ -1,6 +1,6 @@
<?php
namespace App\Http\Controllers\Api;
namespace App\Http\Controllers\Api\Master;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
@@ -1,6 +1,6 @@
<?php
namespace App\Http\Controllers\Api;
namespace App\Http\Controllers\Api\Master;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
@@ -1,6 +1,6 @@
<?php
namespace App\Http\Controllers\Api;
namespace App\Http\Controllers\Api\Master;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
@@ -1,6 +1,6 @@
<?php
namespace App\Http\Controllers\Api;
namespace App\Http\Controllers\Api\Master;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
@@ -0,0 +1,143 @@
<?php
namespace App\Http\Controllers\Api;
use App\Models\Map\PanenTanaman;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Validator;
use Exception;
class PanenTanamanController extends Controller
{
/**
* Display a listing of the resource.
*/
public function index()
{
try {
$panenTanaman = PanenTanaman::latest()->get();
return response()->json([
'success' => true,
'message' => 'Daftar data panen tanaman berhasil diambil.',
'data' => $panenTanaman
], 200);
} catch (Exception $e) {
return response()->json([
'success' => false,
'message' => 'Terjadi kesalahan saat mengambil data.',
'error' => $e->getMessage()
], 500);
}
}
/**
* Store a newly created resource in storage.
*/
public function store(Request $request)
{
$validator = Validator::make($request->all(), [
'panen_id' => 'required|integer',
'tanaman_id' => 'required|integer',
'commodity_name' => 'required|string|max:255',
'sync_status' => 'nullable|string|max:50',
'weight_kg' => 'required|numeric|min:0',
]);
if ($validator->fails()) {
return response()->json([
'success' => false,
'message' => 'Validasi gagal.',
'errors' => $validator->errors()
], 422);
}
try {
$panenTanaman = PanenTanaman::create($request->all());
return response()->json([
'success' => true,
'message' => 'Data panen tanaman berhasil disimpan.',
'data' => $panenTanaman
], 201);
} catch (Exception $e) {
return response()->json([
'success' => false,
'message' => 'Gagal menyimpan data.',
'error' => $e->getMessage()
], 500);
}
}
/**
* Display the specified resource.
*/
public function show(PanenTanaman $panenTanaman)
{
return response()->json([
'success' => true,
'message' => 'Detail data panen tanaman ditemukan.',
'data' => $panenTanaman
], 200);
}
/**
* Update the specified resource in storage.
*/
public function update(Request $request, PanenTanaman $panenTanaman)
{
$validator = Validator::make($request->all(), [
'panen_id' => 'sometimes|required|integer',
'tanaman_id' => 'sometimes|required|integer',
'commodity_name' => 'sometimes|required|string|max:255',
'sync_status' => 'nullable|string|max:50',
'weight_kg' => 'sometimes|required|numeric|min:0',
]);
if ($validator->fails()) {
return response()->json([
'success' => false,
'message' => 'Validasi gagal.',
'errors' => $validator->errors()
], 422);
}
try {
$panenTanaman->update($request->all());
return response()->json([
'success' => true,
'message' => 'Data panen tanaman berhasil diperbarui.',
'data' => $panenTanaman
], 200);
} catch (Exception $e) {
return response()->json([
'success' => false,
'message' => 'Gagal memperbarui data.',
'error' => $e->getMessage()
], 500);
}
}
/**
* Remove the specified resource from storage.
*/
public function destroy(PanenTanaman $panenTanaman)
{
try {
$panenTanaman->delete(); // Karena pakai SoftDeletes, data tidak terhapus permanen di DB
return response()->json([
'success' => true,
'message' => 'Data panen tanaman berhasil dihapus (soft delete).'
], 200);
} catch (Exception $e) {
return response()->json([
'success' => false,
'message' => 'Gagal menghapus data.',
'error' => $e->getMessage()
], 500);
}
}
}
@@ -1,6 +1,6 @@
<?php
namespace App\Http\Controllers\Api;
namespace App\Http\Controllers\Api\Produktivitas;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
@@ -1,6 +1,6 @@
<?php
namespace App\Http\Controllers\Api;
namespace App\Http\Controllers\Api\Produktivitas;
use App\Http\Controllers\Controller;
use App\Models\Map\InsLahan;
@@ -1,5 +1,5 @@
<?php
namespace App\Http\Controllers\Api;
namespace App\Http\Controllers\Api\Produktivitas;
use App\Http\Controllers\Controller;
use App\Models\Map\Inspeksi;
@@ -1,6 +1,6 @@
<?php
namespace App\Http\Controllers\Api;
namespace App\Http\Controllers\Api\Produktivitas;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
@@ -16,7 +16,7 @@ use App\Enums\StatusLahan;
class LahanController extends Controller
{
/**
/**
* Display a listing of the resource.
*/
public function index(Request $request): AnonymousResourceCollection
@@ -87,17 +87,22 @@ class LahanController extends Controller
if (!$profile) {
abort(404, 'Profile tidak ditemukan');
}
if ($request->has('profile_id')) {
$request->merge(['profile_id' => (int) $request->profile_id]);
}
$profileRule = $user->role === 'fasilitator' ? ['required', 'numeric', 'exists:profiles,id'] : ['nullable'];
$validated = $request->validate([
'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'
@@ -116,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))
@@ -149,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);
@@ -169,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();
}
@@ -1,6 +1,6 @@
<?php
namespace App\Http\Controllers\Api;
namespace App\Http\Controllers\Api\Produktivitas;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
@@ -0,0 +1,165 @@
<?php
namespace App\Http\Controllers\Api\Produktivitas;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Illuminate\Http\JsonResponse;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Gate;
use Illuminate\Support\Facades\DB;
use App\Models\Map\Panen;
class PanenController extends Controller
{
public function index(Request $request): JsonResponse
{
if (!Gate::any(['petani', 'fasilitator','super_admin'])) {
abort(403);
}
$user = Auth::user();
$profile = $user->profile;
$profileId = $user->role === 'petani' ? $profile->id : $request->id;
$listPanen = Panen::when($profileId, fn($q,$v) => $q->where('farmer_id',$user->id))->get();
return response()->json($listPanen);
}
public function store(Request $request): JsonResponse
{
if (!Gate::any(['petani', 'fasilitator', 'super_admin'])) {
abort(403);
}
$validated = $request->validate([
'uid' => ['required', 'string'],
'title' => ['required', 'string'],
'land_id' => ['required', 'integer'],
'farmer_id' => ['required', 'integer'],
'land_description' => ['nullable', 'string'],
'harvest_date' => ['required', 'date'],
'commodities' => ['required', 'array', 'min:1'],
'commodities.*.tanaman_id' => ['nullable', 'integer'],
'commodities.*.commodity_name' => ['required', 'string'],
'commodities.*.weight_kg' => ['required', 'numeric'],
'notes' => ['nullable', 'string'],
]);
try {
$panen = DB::transaction(function () use ($validated) {
$panenData = collect($validated)->except('commodities')->toArray();
$panen = Panen::create($panenData);
foreach ($validated['commodities'] as $commodity) {
\App\Models\Map\PanenTanaman::create([
'panen_id' => $panen->id,
'tanaman_id' => $commodity['tanaman_id'] ?? null,
'commodity_name' => $commodity['commodity_name'],
'weight_kg' => $commodity['weight_kg'],
'sync_status' => 'synced',
]);
}
return $panen;
});
$panen->load('panenTanaman');
return response()->json([
'success' => true,
'message' => 'Data panen dan detail tanaman berhasil disimpan.',
'data' => $panen
], 201);
} catch (\Exception $e) {
return response()->json([
'success' => false,
'message' => 'Gagal menyimpan data ke database.',
'error' => $e->getMessage()
], 500);
}
}
public function show(string $id): JsonResponse
{
if (!Gate::any(['petani', 'fasilitator','super_admin'])) {
abort(403);
}
$panen = Panen::findOrFail($id);
return response()->json($panen);
}
public function update(Request $request, string $id): JsonResponse
{
if (!Gate::any(['petani', 'fasilitator','super_admin'])) {
abort(403);
}
$panen = Panen::findOrFail($id);
$validated = $request->validate([
'commodity_name' => ['string', 'max:255'],
'weight_kg' => ['numeric'],
'harvest_date' => ['date'],
'notes' => ['nullable', 'string'],
]);
$panen->update($validated);
return response()->json($panen);
}
public function destroy(string $id): JsonResponse
{
Gate::authorize(['petani', 'fasilitator']);
Panen::findOrFail($id)->delete();
return response()->json(null, 204);
}
/**
* Digunakan untuk sinkronisasi massal dari data lokal (offline)
*/
public function batchUpsert(Request $request): JsonResponse
{
if (Gate::authorize(['petani', 'fasilitator','super_admin'])) {
abort(403);
}
$profileId = Auth::user()->profile->id;
$validated = $request->validate([
'panens' => ['required', 'array'],
'panens.*.id' => ['nullable', 'integer'],
'panens.*.land_id' => ['required', 'integer'],
'panens.*.plant_id' => ['required', 'integer'],
'panens.*.commodity_name' => ['required', 'string'],
'panens.*.weight_kg' => ['required', 'numeric'],
'panens.*.harvest_date' => ['required', 'date'],
]);
$dataUpsert = [];
foreach ($validated['panens'] as $item) {
$dataUpsert[] = [
'id' => $item['id'] ?? null,
'land_id' => $item['land_id'],
'plant_id' => $item['plant_id'],
'farmer_id' => $profileId,
'commodity_name' => $item['commodity_name'],
'weight_kg' => $item['weight_kg'],
'harvest_date' => $item['harvest_date'],
'sync_status' => 'synced',
'created_at' => now(),
'updated_at' => now(),
];
}
// Melakukan upsert berdasarkan ID
Panen::upsert($dataUpsert, ['id'], [
'weight_kg', 'commodity_name', 'harvest_date', 'sync_status', 'updated_at'
]);
return response()->json(['status' => 'success'], 200);
}
}
@@ -1,6 +1,6 @@
<?php
namespace App\Http\Controllers\Api;
namespace App\Http\Controllers\Api\Produktivitas;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
@@ -10,7 +10,7 @@ use Illuminate\Support\Facades\Gate;
use App\Models\Map\Panen;
class PanenController extends Controller
class PanenController01 extends Controller
{
public function index(Request $request): JsonResponse
{
@@ -1,6 +1,6 @@
<?php
namespace App\Http\Controllers\Api;
namespace App\Http\Controllers\Api\Produktivitas;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
@@ -0,0 +1,210 @@
<?php
namespace App\Http\Controllers\Api\Produktivitas;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Illuminate\Http\JsonResponse;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Gate;
use Illuminate\Http\Resources\Json\AnonymousResourceCollection;
use Illuminate\Validation\Rules\Enum;
use Illuminate\Validation\Rule;
use App\Http\Resources\Pertanian\TanamanResource;
use App\Models\Pertanian\Tanaman;
use App\Enums\KondisiTanaman;
class TanamanController extends Controller
{
/**
* Display a listing of the resource.
*/
public function index(Request $request): AnonymousResourceCollection
{
if (!Gate::any(['petani', 'fasilitator','super_admin'])) {
abort(403);
}
$user = Auth::user();
$profile = $user->profile;
$profileId = $user->role === 'petani' ? $profile->id : $request->profile_id;
$size = $request->integer('size') ?: 10;
$tanamanList = Tanaman::when($request->search, function ($q, $search) {
$search = strtolower($search);
$q->whereRaw('lower(nama) like ?', ["%{$search}%"]);
})
->when($profileId, fn($q,$v) => $q->where('profile_id',$v))
->when($request->status_kepemilikan, fn($q,$v) => $q->where('status_kepemilikan',$v))
->when($request->lahan_id, fn($q,$v) => $q->where('lahan_id',$v))
->when($request->komoditas_id, fn($q,$v) => $q->where('komoditas_id',$v))
->when($request->desa_kelurahan_id, fn($q,$v) =>
$q->whereHas('lahan', fn($k)
=> $k->where('desa_kelurahan_id',$v)
)
)
->when($request->kecamatan_id, fn ($q, $v) =>
$q->whereHas('lahan.desaKelurahan', fn ($k) =>
$k->where('kecamatan_id', $v)
)
)
->when($request->kabupaten_kota_id, fn ($q, $v) =>
$q->whereHas('lahan.desaKelurahan.kecamatan', fn ($k) =>
$k->where('kabupaten_kota_id', $v)
)
)
->when($request->provinsi_id, fn ($q, $v) =>
$q->whereHas('lahan.desaKelurahan.kecamatan.kabupatenkota', fn ($k) =>
$k->where('provinsi_id', $v)
)
);
if ($request->filled('sort')) {
$dir = str_starts_with($request->sort, '-') ? 'desc' : 'asc';
$column = ltrim($request->sort, '-');
$allowed = ['id', 'nama'];
if (in_array($column, $allowed)) {
$tanamanList->orderBy($column, $dir);
}
} else {
$tanamanList->orderBy('nama', 'asc');
}
$tanamanList = $tanamanList->paginate($size);
return TanamanResource::collection($tanamanList);
}
/**
* Show the form for creating a new resource.
*/
public function create()
{
//
}
/**
* Store a newly created resource in storage.
*/
public function store(Request $request): JsonResponse
{
if (!Gate::any(['petani', 'fasilitator','super_admin'])) {
abort(403);
}
$user = Auth::user();
$profile = $user->profile;
$profileId = $user->role === 'petani' ? $profile->id : $request->profile_id;
$request->merge([
'komoditas_id' => $request->input('komoditas.id') ?? $request->input('komoditas_id'),
'lahan_id' => $request->input('lahan.id') ?? $request->input('lahan_id'),
'profile_id' => $profileId,
]);
$validated = $request->validate([
'nama' => ['required', 'string', 'max:255'],
'komoditas_id' => ['required', 'exists:master_komoditas,id'],
'lahan_id' => [
'required',
Rule::exists('map_lahan', 'id')->where(function ($query) use ($profileId) {
$query->where('profile_id', $profileId)
->whereNull('deleted_at');
}),
],
'latitude' => ['nullable', 'numeric', 'between:-90,90', 'required_with:longitude'],
'longitude' => ['nullable', 'numeric', 'between:-180,180', 'required_with:latitude'],
'kondisi_tanaman' => ['nullable', 'string', new Enum(KondisiTanaman::class)],
]);
$tanaman = Tanaman::create([
...$validated,
'profile_id' => $profile->id,
]);
return (new TanamanResource($tanaman))
->response()
->setStatusCode(201);
}
/**
* Display the specified resource.
*/
public function show(string $id): JsonResponse
{
if (!Gate::any(['petani', 'fasilitator','super_admin'])) {
abort(403);
}
$tanaman = Tanaman::findOrFail($id);
if ($tanaman->profile_id !== Auth::user()->profile->id) {
return response()->json(['message' => 'Unauthorized'], 403);
}
return (new TanamanResource($tanaman))->response();
}
/**
* 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): JsonResponse
{
if (!Gate::any(['petani', 'fasilitator','super_admin'])) {
abort(403);
}
$tanaman = Tanaman::findOrFail($id);
if ($tanaman->profile_id !== Auth::user()->profile->id) {
return response()->json(['message' => 'Unauthorized'], 403);
}
$profile = Auth::user()->profile;
$validated = $request->validate([
'nama' => ['required', 'string', 'max:255'],
'komoditas_id' => ['required', 'exists:master_komoditas,id'],
'lahan_id' => [
'required',
Rule::exists('map_lahan', 'id')->where(function ($query) use ($profile) {
$query->where('profile_id', $profile->id)
->whereNull('deleted_at');
}),
],
'latitude' => ['nullable', 'numeric', 'between:-90,90', 'required_with:longitude'],
'longitude' => ['nullable', 'numeric', 'between:-180,180', 'required_with:latitude'],
'kondisi_tanaman' => ['nullable', 'string', new Enum(KondisiTanaman::class)],
]);
$tanaman->update($validated);
return (new TanamanResource($tanaman))->response();
}
/**
* Remove the specified resource from storage.
*/
public function destroy(string $id): JsonResponse
{
if (!Gate::any(['petani', 'fasilitator','super_admin'])) {
abort(403);
}
$tanaman = Tanaman::findOrFail($id);
if ($tanaman->profile_id !== Auth::user()->profile->id) {
return response()->json(['message' => 'Unauthorized'], 403);
}
$tanaman->delete();
return response()->json(null, 204);
}
}
+31 -16
View File
@@ -94,26 +94,41 @@ class TanamanController extends Controller
if (!Gate::any(['petani', 'fasilitator','super_admin'])) {
abort(403);
}
$profile = Auth::user()->profile;
$validated = $request->validate([
'nama' => ['required', 'string', 'max:255'],
'komoditas_id' => ['required', 'exists:master_komoditas,id'],
'lahan_id' => [
'required',
Rule::exists('map_lahan', 'id')->where(function ($query) use ($profile) {
$query->where('profile_id', $profile->id)
->whereNull('deleted_at');
}),
],
'latitude' => ['nullable', 'numeric', 'between:-90,90', 'required_with:longitude'],
'longitude' => ['nullable', 'numeric', 'between:-180,180', 'required_with:latitude'],
'kondisi_tanaman' => ['nullable', 'string', new Enum(KondisiTanaman::class)],
$user = Auth::user();
$profileId = $user->role === 'petani' ? $user->profile->id : $request->profile_id;
$lahanId = $request->input('lahan_id') ?? $request->input('land_id') ?? $request->input('lahan.id');
$request->merge([
'komoditas_id' => $request->input('komoditas.id') ?? $request->input('komoditas_id'),
'lahan_id' => $lahanId,
'profile_id' => $profileId,
'uid' => $request->input('uid'),
'created_by' => $user->id,
]);
$validated = $request->validate([
'nama' => ['required', 'string', 'max:255'],
'komoditas_id' => ['required', 'exists:master_komoditas,id'],
'lahan_id' => ['required', 'exists:map_lahan,id'],
'profile_id' => ['required', 'exists:profiles,id'],
'latitude' => ['nullable', 'numeric', 'between:-90,90', 'required_with:longitude'],
'longitude' => ['nullable', 'numeric', 'between:-180,180', 'required_with:latitude'],
'kondisi_tanaman' => ['nullable', 'string', new Enum(KondisiTanaman::class)],
'uid' => ['required', 'string'],
'jenis_komoditas_id' => ['nullable', 'exists:jenis_komoditas,id'],
'komoditas_kode' => ['nullable', 'string', 'max:255'],
'varietas_id' => ['nullable', 'numeric'],
'metode_pengumpulan' => ['nullable', 'string'],
'deskripsi' => ['nullable', 'string'],
'created_by' => ['nullable', 'numeric'],
]);
$tanaman = Tanaman::create([
...$validated,
'profile_id' => $profile->id,
// 'profile_id' => $profileId,
// 'uid' => $validated['uid'],
// 'komoditas_kode' => $validated['komoditas_kode'] ?? null,
// 'jenis_komoditas_id' => $validated['jenis_komoditas_id'] ?? null,
]);
return (new TanamanResource($tanaman))
@@ -0,0 +1,580 @@
<?php
namespace App\Http\Controllers\Web\Bumdes;
use App\Enums\Bumdes\JabatanBumdes;
use App\Enums\Pendidikan;
use App\Http\Controllers\Controller;
use App\Models\Bumdes\KelembagaanAktorBumdes;
use App\Models\Bumdes\PengurusBumdes;
use App\Models\Wilayah\Provinsi;
use Carbon\Carbon;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Gate;
use Illuminate\Support\Str;
use Illuminate\Validation\Rule;
class PengurusBumdesController extends Controller
{
public function index(Request $request)
{
if (! Gate::any(['super_admin', 'admin', 'fasilitator'])) {
abort(403);
}
$query = PengurusBumdes::with([
...$this->wilayahRelationsWithoutProgramScope(),
'creator:id,name',
])
->orderBy('created_at', 'desc');
if ($request->search) {
$query->where(function ($query) use ($request) {
$query->where('nama', 'like', '%' . $request->search . '%')
->orWhere('jabatan', 'like', '%' . $request->search . '%')
->orWhere('jabatan_lainnya', 'like', '%' . $request->search . '%');
});
}
if (auth()->user()->role->value === 'fasilitator') {
$query->where('created_by', auth()->id());
}
$summaryQuery = clone $query;
$totalPengurus = (clone $summaryQuery)->count();
$totalLakiLaki = (clone $summaryQuery)->where('jenis_kelamin', true)->count();
$totalPerempuan = (clone $summaryQuery)->where('jenis_kelamin', false)->count();
$totalDesaKelurahan = (clone $summaryQuery)->distinct('desa_kelurahan_id')->count('desa_kelurahan_id');
$totalJabatan = (clone $summaryQuery)->distinct('jabatan')->count('jabatan');
$pengurus = $query->paginate($request->per_page ?? 10);
$userRole = auth()->user()->role->value;
$showEnumerator = in_array($userRole, ['super_admin', 'admin']);
return view('bumdes.profil.index', compact(
'pengurus',
'totalPengurus',
'totalLakiLaki',
'totalPerempuan',
'totalDesaKelurahan',
'totalJabatan',
'showEnumerator'
));
}
public function create()
{
if (! Gate::any(['super_admin', 'admin', 'fasilitator'])) {
abort(403);
}
$provinsi = $this->provinsiOptions();
$jabatan = JabatanBumdes::options();
$pendidikan = Pendidikan::options();
return view('bumdes.profil.add', compact('provinsi', 'jabatan', 'pendidikan'));
}
public function store(Request $request)
{
if (! Gate::any(['super_admin', 'admin', 'fasilitator'])) {
abort(403);
}
$validatedData = $this->validatedData($request);
$pengurus = PengurusBumdes::create([
...$this->formatData($validatedData),
'uid' => 'BMD-' . strtoupper(Str::random(10)),
'created_by' => auth()->id(),
'updated_by' => auth()->id(),
]);
return redirect()->route('bumdes.edit', $pengurus->id)->with('success', 'Data pengurus BUMDes berhasil ditambahkan.');
}
public function show(string $id)
{
return redirect()->route('bumdes.edit', $id);
}
public function edit(string $id)
{
if (! Gate::any(['super_admin', 'admin', 'fasilitator'])) {
abort(403);
}
$pengurus = $this->pengurusQuery()
->with($this->wilayahRelationsWithoutProgramScope())
->findOrFail($id);
$provinsi = $this->provinsiOptions();
$jabatan = JabatanBumdes::options();
$pendidikan = Pendidikan::options();
return view('bumdes.profil.edit', compact('pengurus', 'provinsi', 'jabatan', 'pendidikan'));
}
public function update(Request $request, string $id)
{
if (! Gate::any(['super_admin', 'admin', 'fasilitator'])) {
abort(403);
}
$pengurus = $this->pengurusQuery()->findOrFail($id);
$validatedData = $this->validatedData($request);
$pengurus->update([
...$this->formatData($validatedData),
'updated_by' => auth()->id(),
]);
return redirect()->route('bumdes.edit', $pengurus->id)->with('success', 'Data pengurus BUMDes berhasil diupdate.');
}
public function destroy(string $id)
{
if (! Gate::any(['super_admin', 'admin', 'fasilitator'])) {
abort(403);
}
$pengurus = $this->pengurusQuery()->findOrFail($id);
$pengurus->update(['deleted_by' => auth()->id()]);
$pengurus->delete();
return response()->json(['message' => 'Data pengurus BUMDes berhasil dihapus.']);
}
public function kelembagaanAktor(string $id)
{
if (! Gate::any(['super_admin', 'admin', 'fasilitator'])) {
abort(403);
}
$pengurus = $this->pengurusQuery()
->with([
...$this->wilayahRelationsWithoutProgramScope(),
'kelembagaanAktor',
])
->findOrFail($id);
$kelembagaanAktor = $pengurus->kelembagaanAktor;
return view('bumdes.kelembagaan-aktor.index', array_merge(
compact('pengurus', 'kelembagaanAktor'),
$this->kelembagaanAktorOptions()
));
}
public function storeKelembagaanAktor(Request $request, string $id)
{
if (! Gate::any(['super_admin', 'admin', 'fasilitator'])) {
abort(403);
}
$pengurus = $this->pengurusQuery()->findOrFail($id);
$validatedData = $this->validatedKelembagaanAktorData($request);
KelembagaanAktorBumdes::updateOrCreate(
['pengurus_bumdes_id' => $pengurus->id],
[
...$this->formatKelembagaanAktorData($validatedData),
'created_by' => $pengurus->kelembagaanAktor?->created_by ?? auth()->id(),
'updated_by' => auth()->id(),
]
);
return redirect()
->route('bumdes.kelembagaan-aktor.index', $pengurus->id)
->with('success', 'Data kelembagaan dan aktor BUMDes berhasil disimpan.');
}
private function pengurusQuery()
{
$query = PengurusBumdes::query();
if (auth()->user()->role->value === 'fasilitator') {
$query->where('created_by', auth()->id());
}
return $query;
}
private function provinsiOptions()
{
return Provinsi::withoutGlobalScope('program')
->select('id', 'kode', 'nama')
->orderBy('kode', 'asc')
->get();
}
private function wilayahRelationsWithoutProgramScope(): array
{
return [
'desaKelurahan' => fn ($query) => $query->withoutGlobalScope('program')->select('id', 'nama', 'kecamatan_id'),
'desaKelurahan.kecamatan' => fn ($query) => $query->withoutGlobalScope('program')->select('id', 'nama', 'kabupaten_kota_id'),
'desaKelurahan.kecamatan.kabupatenKota' => fn ($query) => $query->withoutGlobalScope('program')->select('id', 'nama', 'provinsi_id'),
'desaKelurahan.kecamatan.kabupatenKota.provinsi' => fn ($query) => $query->withoutGlobalScope('program')->select('id', 'nama'),
];
}
private function validatedData(Request $request): array
{
return $request->validate([
'nama' => ['required', 'string', 'max:255'],
'jenis_kelamin' => ['required', 'boolean'],
'tempat_lahir' => ['required', 'string', 'max:255'],
'tanggal_lahir' => ['required', 'date_format:d-m-Y'],
'pendidikan_terakhir' => ['required', Rule::enum(Pendidikan::class)],
'alamat' => ['required', 'string', 'max:500'],
'desa_kelurahan_id' => ['required', 'exists:master_desa_kelurahan,id'],
'nomor_telepon' => ['nullable', 'digits_between:11,13'],
'jabatan' => ['required', Rule::enum(JabatanBumdes::class)],
'jabatan_lainnya' => ['nullable', 'required_if:jabatan,' . JabatanBumdes::LAINNYA->value, 'string', 'max:255'],
'lama_menjabat_tahun' => ['required', 'integer', 'min:0', 'max:80'],
], [
'nama.required' => 'Nama harus diisi.',
'jenis_kelamin.required' => 'Jenis kelamin harus dipilih.',
'tempat_lahir.required' => 'Tempat lahir harus diisi.',
'tanggal_lahir.required' => 'Tanggal lahir harus diisi.',
'tanggal_lahir.date_format' => 'Tanggal lahir harus menggunakan format tanggal yang valid.',
'pendidikan_terakhir.required' => 'Pendidikan terakhir harus dipilih.',
'alamat.required' => 'Alamat harus diisi.',
'desa_kelurahan_id.required' => 'Desa kelurahan harus dipilih.',
'desa_kelurahan_id.exists' => 'Desa kelurahan tidak ditemukan.',
'nomor_telepon.digits_between' => 'Nomor telepon harus berupa angka 11 sampai 13 digit.',
'jabatan.required' => 'Jabatan/peran harus dipilih.',
'jabatan_lainnya.required_if' => 'Jabatan lainnya harus diisi.',
'lama_menjabat_tahun.required' => 'Lama menjabat harus diisi.',
'lama_menjabat_tahun.integer' => 'Lama menjabat harus berupa angka tahun.',
]);
}
private function formatData(array $data): array
{
$data['tanggal_lahir'] = Carbon::createFromFormat('d-m-Y', $data['tanggal_lahir'])->format('Y-m-d');
$data['tanggal_mulai_menjabat'] = Carbon::now()
->subYears((int) $data['lama_menjabat_tahun'])
->format('Y-m-d');
if (($data['jabatan'] ?? null) !== JabatanBumdes::LAINNYA->value) {
$data['jabatan_lainnya'] = null;
}
return $data;
}
private function validatedKelembagaanAktorData(Request $request): array
{
$this->normalizeKelembagaanAktorInput($request);
$maxYear = now()->year + 1;
return $request->validate([
'status_badan_hukum' => ['nullable', Rule::in(array_keys($this->statusBadanHukumOptions()))],
'nomor_dasar_hukum' => ['nullable', 'string', 'max:255'],
'tahun_dasar_hukum' => ['nullable', 'integer', 'digits:4', 'min:1900', 'max:' . $maxYear],
'status_keaktifan' => ['nullable', Rule::in(array_keys($this->statusKeaktifanOptions()))],
'alasan_tidak_aktif' => ['nullable', 'string'],
'unit_usaha' => ['nullable', 'array'],
'unit_usaha.*' => ['string', Rule::in(array_keys($this->unitUsahaOptions()))],
'unit_usaha_jasa_lainnya' => ['nullable', 'string', 'max:255'],
'status_unit_komoditas' => ['nullable', Rule::in(array_keys($this->statusUnitKomoditasOptions()))],
'nama_unit_komoditas' => ['nullable', 'string', 'max:255'],
'status_ad_art' => ['nullable', Rule::in(array_keys($this->statusAdArtOptions()))],
'tahun_ad_art' => ['nullable', 'integer', 'digits:4', 'min:1900', 'max:' . $maxYear],
'pengurus_inti' => ['nullable', 'array'],
'pengurus_inti.*.jabatan' => ['nullable', 'string', 'max:255'],
'pengurus_inti.*.nama' => ['nullable', 'string', 'max:255'],
'pengurus_inti.*.aktif' => ['nullable', 'boolean'],
'memiliki_staf' => ['nullable', 'boolean'],
'jumlah_staf' => ['nullable', 'integer', 'min:0'],
'unit_usaha_staf' => ['nullable', 'string'],
'modal_awal' => ['nullable', 'integer', 'min:0'],
'tahun_modal_awal' => ['nullable', 'integer', 'digits:4', 'min:1900', 'max:' . $maxYear],
'pernah_penambahan_modal' => ['nullable', 'boolean'],
'penambahan_modal' => ['nullable', 'array'],
'penambahan_modal.*.tahun' => ['nullable', 'integer', 'digits:4', 'min:1900', 'max:' . $maxYear],
'penambahan_modal.*.jumlah' => ['nullable', 'integer', 'min:0'],
'aset_produktif' => ['nullable', 'array'],
'aset_produktif.*.aset' => ['nullable', 'string', 'max:255'],
'aset_produktif.*.dipilih' => ['nullable', 'boolean'],
'aset_produktif.*.jumlah' => ['nullable', 'string', 'max:255'],
'aset_produktif.*.kondisi' => ['nullable', 'string', 'max:255'],
'aset_produktif_lainnya' => ['nullable', 'string', 'max:255'],
'status_kepemilikan_aset' => ['nullable', Rule::in(array_keys($this->statusKepemilikanAsetOptions()))],
'infrastruktur_pascapanen' => ['nullable', 'array'],
'infrastruktur_pascapanen.*.infrastruktur' => ['nullable', 'string', 'max:255'],
'infrastruktur_pascapanen.*.dipilih' => ['nullable', 'boolean'],
'infrastruktur_pascapanen.*.jumlah' => ['nullable', 'string', 'max:255'],
'infrastruktur_pascapanen.*.kondisi' => ['nullable', Rule::in(array_keys($this->kondisiInfrastrukturOptions()))],
'infrastruktur_pascapanen_lainnya' => ['nullable', 'string', 'max:255'],
], $this->kelembagaanAktorValidationMessages(), $this->kelembagaanAktorValidationAttributes());
}
private function normalizeKelembagaanAktorInput(Request $request): void
{
foreach (['modal_awal'] as $field) {
if ($request->has($field)) {
$request->merge([$field => preg_replace('/\D/', '', (string) $request->input($field))]);
}
}
$penambahanModal = collect($request->input('penambahan_modal', []))
->map(function ($row) {
if (isset($row['jumlah'])) {
$row['jumlah'] = preg_replace('/\D/', '', (string) $row['jumlah']);
}
return $row;
})
->all();
if ($request->has('penambahan_modal')) {
$request->merge(['penambahan_modal' => $penambahanModal]);
}
}
private function formatKelembagaanAktorData(array $data): array
{
$payload = array_merge([
'status_badan_hukum' => null,
'nomor_dasar_hukum' => null,
'tahun_dasar_hukum' => null,
'status_keaktifan' => null,
'alasan_tidak_aktif' => null,
'unit_usaha' => [],
'unit_usaha_jasa_lainnya' => null,
'status_unit_komoditas' => null,
'nama_unit_komoditas' => null,
'status_ad_art' => null,
'tahun_ad_art' => null,
'pengurus_inti' => [],
'memiliki_staf' => null,
'jumlah_staf' => null,
'unit_usaha_staf' => null,
'modal_awal' => null,
'tahun_modal_awal' => null,
'pernah_penambahan_modal' => null,
'penambahan_modal' => [],
'aset_produktif' => [],
'aset_produktif_lainnya' => null,
'status_kepemilikan_aset' => null,
'infrastruktur_pascapanen' => [],
'infrastruktur_pascapanen_lainnya' => null,
], $data);
$payload['unit_usaha'] = array_values($payload['unit_usaha'] ?? []);
$payload['pengurus_inti'] = $this->filterRows($payload['pengurus_inti'] ?? [], ['nama', 'aktif']);
$payload['penambahan_modal'] = $this->filterRows($payload['penambahan_modal'] ?? [], ['tahun', 'jumlah']);
$payload['aset_produktif'] = $this->filterRows($payload['aset_produktif'] ?? [], ['dipilih', 'jumlah', 'kondisi']);
$payload['infrastruktur_pascapanen'] = $this->filterRows($payload['infrastruktur_pascapanen'] ?? [], ['dipilih', 'jumlah', 'kondisi']);
if (($payload['status_keaktifan'] ?? null) !== 'tidak_aktif_vakum') {
$payload['alasan_tidak_aktif'] = null;
}
if (! in_array('jasa_lainnya', $payload['unit_usaha'], true)) {
$payload['unit_usaha_jasa_lainnya'] = null;
}
if (($payload['status_unit_komoditas'] ?? null) !== 'ya') {
$payload['nama_unit_komoditas'] = null;
}
if (($payload['status_ad_art'] ?? null) !== 'ada_lengkap') {
$payload['tahun_ad_art'] = null;
}
if (! (bool) ($payload['memiliki_staf'] ?? false)) {
$payload['jumlah_staf'] = null;
$payload['unit_usaha_staf'] = null;
}
if (! (bool) ($payload['pernah_penambahan_modal'] ?? false)) {
$payload['penambahan_modal'] = null;
}
if (! collect($payload['aset_produktif'] ?? [])->contains(fn ($row) => ($row['aset'] ?? null) === 'lainnya')) {
$payload['aset_produktif_lainnya'] = null;
}
if (! collect($payload['infrastruktur_pascapanen'] ?? [])->contains(fn ($row) => ($row['infrastruktur'] ?? null) === 'lainnya')) {
$payload['infrastruktur_pascapanen_lainnya'] = null;
}
return $payload;
}
private function filterRows(array $rows, array $valueKeys): array
{
return collect($rows)
->map(function ($row) {
return collect($row)
->map(fn ($value) => $value === '' ? null : $value)
->all();
})
->filter(function ($row) use ($valueKeys) {
foreach ($valueKeys as $key) {
if (filled($row[$key] ?? null)) {
return true;
}
}
return false;
})
->values()
->all();
}
private function kelembagaanAktorOptions(): array
{
return [
'statusBadanHukumOptions' => $this->statusBadanHukumOptions(),
'statusKeaktifanOptions' => $this->statusKeaktifanOptions(),
'unitUsahaOptions' => $this->unitUsahaOptions(),
'statusUnitKomoditasOptions' => $this->statusUnitKomoditasOptions(),
'statusAdArtOptions' => $this->statusAdArtOptions(),
'pengurusIntiRows' => $this->pengurusIntiRows(),
'asetProduktifRows' => $this->asetProduktifRows(),
'statusKepemilikanAsetOptions' => $this->statusKepemilikanAsetOptions(),
'infrastrukturPascapanenRows' => $this->infrastrukturPascapanenRows(),
'kondisiInfrastrukturOptions' => $this->kondisiInfrastrukturOptions(),
];
}
private function statusBadanHukumOptions(): array
{
return [
'sudah_berbadan_hukum' => 'Sudah berbadan hukum (terdaftar Kemenkumham)',
'proses_pendaftaran' => 'Proses pendaftaran',
'belum_berbadan_hukum' => 'Belum berbadan hukum',
'tidak_tahu' => 'Tidak tahu',
];
}
private function statusKeaktifanOptions(): array
{
return [
'aktif_penuh' => 'Aktif beroperasi penuh',
'aktif_terbatas' => 'Aktif tapi terbatas (sebagian unit usaha berjalan)',
'tidak_aktif_vakum' => 'Tidak aktif/vakum',
'berdiri_belum_beroperasi' => 'Sudah berdiri tapi belum pernah beroperasi',
];
}
private function unitUsahaOptions(): array
{
return [
'simpan_pinjam' => 'Simpan pinjam',
'perdagangan_toko_desa' => 'Perdagangan/toko desa',
'pengelolaan_air_bersih' => 'Pengelolaan air bersih',
'wisata_desa_agrowisata' => 'Wisata desa/agrowisata',
'pengelolaan_hasil_pertanian_komoditas' => 'Pengelolaan hasil pertanian/komoditas',
'penyewaan_alat_aset' => 'Penyewaan alat/aset',
'jasa_lainnya' => 'Jasa lainnya',
];
}
private function statusUnitKomoditasOptions(): array
{
return [
'ya' => 'Ya, ada unit khusus',
'ditangani_pengurus_inti' => 'Tidak ada unit khusus, ditangani langsung pengurus inti',
'direncanakan' => 'Belum ada, masih direncanakan',
];
}
private function statusAdArtOptions(): array
{
return [
'ada_lengkap' => 'Ada, lengkap',
'ada_tidak_lengkap' => 'Ada tapi tidak lengkap',
'tidak_ada' => 'Tidak ada',
'tidak_tahu' => 'Tidak tahu',
];
}
private function pengurusIntiRows(): array
{
return [
'penasihat_kepala_desa' => 'Penasihat (Kepala Desa)',
'ketua_pengawas' => 'Ketua Pengawas',
'direktur_ketua_bumdes' => 'Direktur/Ketua BUMDes',
'sekretaris' => 'Sekretaris',
'bendahara' => 'Bendahara',
'kepala_unit_usaha_komoditas' => 'Kepala Unit Usaha Komoditas',
'lainnya' => 'Lainnya',
];
}
private function asetProduktifRows(): array
{
return [
'bangunan_kantor' => 'Bangunan / kantor',
'gudang_penyimpanan' => 'Gudang penyimpanan',
'kendaraan_operasional_angkut' => 'Kendaraan operasional/angkut',
'lahan_usaha' => 'Lahan usaha',
'alat_pengolahan_komoditas' => 'Alat pengolahan komoditas',
'lainnya' => 'Lainnya',
];
}
private function statusKepemilikanAsetOptions(): array
{
return [
'milik_bumdes_sendiri' => 'Milik BUMDes sendiri',
'milik_desa_dipinjamkan_dikelola' => 'Milik desa (dipinjamkan/dikelola)',
'sewa_pinjam_pihak_lain' => 'Sewa/pinjam pihak lain',
];
}
private function infrastrukturPascapanenRows(): array
{
return [
'gudang_penyimpanan_hasil_panen' => 'Gudang penyimpanan hasil panen',
'alat_mesin_pengering' => 'Alat/mesin pengering',
'mesin_pulper_huller' => 'Mesin pulper/huller',
'timbangan' => 'Timbangan',
'alat_sortasi' => 'Alat sortasi',
'lainnya' => 'Lainnya',
];
}
private function kondisiInfrastrukturOptions(): array
{
return [
'baik_berfungsi' => 'Baik dan berfungsi',
'rusak_tidak_terpakai' => 'Rusak/tidak terpakai',
];
}
private function kelembagaanAktorValidationMessages(): array
{
return [
'integer' => ':attribute harus berupa angka.',
'digits' => ':attribute harus terdiri dari :digits digit.',
'min' => ':attribute tidak boleh kurang dari :min.',
'max' => ':attribute tidak valid.',
'in' => ':attribute tidak valid.',
'array' => ':attribute harus berupa daftar data.',
'boolean' => ':attribute harus dipilih.',
];
}
private function kelembagaanAktorValidationAttributes(): array
{
return [
'status_badan_hukum' => 'Status badan hukum',
'nomor_dasar_hukum' => 'Nomor dasar hukum',
'tahun_dasar_hukum' => 'Tahun dasar hukum',
'status_keaktifan' => 'Status keaktifan',
'unit_usaha' => 'Unit usaha',
'status_unit_komoditas' => 'Unit usaha komoditas',
'status_ad_art' => 'Dokumen AD/ART',
'memiliki_staf' => 'Status staf/karyawan',
'jumlah_staf' => 'Jumlah staf',
'modal_awal' => 'Modal awal',
'tahun_modal_awal' => 'Tahun modal awal',
'pernah_penambahan_modal' => 'Status penambahan modal',
'status_kepemilikan_aset' => 'Status kepemilikan aset',
];
}
}
@@ -0,0 +1,509 @@
<?php
namespace App\Http\Controllers\Web\Dashboard;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Gate;
use App\Models\Pertanian\Petani;
use App\Models\Pertanian\Komoditas;
use App\Models\Pertanian\Lahan;
use App\Models\Pertanian\PendapatanKomoditas;
use App\Models\Pertanian\SosialEkonomi;
class DemografiPetaniController extends Controller
{
public function index(Request $request)
{
if (!Gate::any(['super_admin', 'admin', 'fasilitator'])) {
abort(403);
}
return redirect()->route('dashboard.karakteristik-petani', array_merge($request->query(), [
'tab' => 'demografi-petani',
]));
}
public function karakteristik(Request $request)
{
if (!Gate::any(['super_admin', 'admin', 'fasilitator'])) {
abort(403);
}
$activeTab = $request->query('tab') === 'indeks-petani'
? 'indeks-petani'
: 'demografi-petani';
$demografiData = $this->contentData($request);
$indeksData = app(IndeksPetaniController::class)->contentData($request);
$tableFilters = [
'gender' => ['Gender', ['1' => 'Laki-laki', '0' => 'Perempuan']],
'umur' => ['Kelompok Umur', ['kurang_30' => '< 30 tahun', '30_39' => '30–39 tahun', '40_49' => '40–49 tahun', '50_59' => '50–59 tahun', '60_keatas' => '≥ 60 tahun']],
'pendidikan' => ['Pendidikan', ['tidak_sekolah' => 'Tidak Sekolah', 'sd' => 'SD', 'smp' => 'SMP', 'sma' => 'SMA', 'diploma' => 'Diploma', 's1_keatas' => 'Sarjana ke atas']],
'jumlah_tanggungan' => ['Jumlah Tanggungan', ['0' => '0 orang', '1_2' => '1–2 orang', '3_4' => '3–4 orang', '5_keatas' => '≥ 5 orang']],
'kelompok_tani' => ['Keanggotaan Kelompok Tani', ['terdaftar' => 'Terdaftar', 'tidak_terdaftar' => 'Tidak Terdaftar', 'belum_terisi' => 'Belum Terisi']],
'komoditas' => ['Komoditas', $indeksData['komoditas']->pluck('nama', 'id')->all()],
'luas_lahan' => ['Luas Lahan', ['kurang_05' => '< 0,5 ha', '05_1' => '0,5–1 ha', '1_2' => '> 1–2 ha', 'lebih_2' => '> 2 ha']],
'status_kepemilikan_lahan' => ['Status Kepemilikan Lahan', ['sendiri' => 'Milik Pribadi', 'sewa' => 'Sewa', 'adat' => 'Tanah Adat']],
'penghasilan' => ['Rentang Pendapatan', ['kurang_1' => '< Rp1 juta', '1_3' => 'Rp1–3 juta', '3_5' => '> Rp3–5 juta', '5_10' => '> Rp5–10 juta', 'lebih_10' => '> Rp10 juta']],
];
return view('dashboard.karakteristik-petani', [
'activeTab' => $activeTab,
'tableFilters' => $tableFilters,
'dashboardFilters' => $request->only([
'provinsi_id',
'kabupatenKota_id',
'kecamatan_id',
'desaKelurahan_id',
'komoditas_id',
'segmen',
]),
'indeksFilterAction' => route('dashboard.karakteristik-petani'),
] + $demografiData + $indeksData);
}
public function contentData(Request $request): array
{
$filteredPetaniIds = $this->filteredPetaniIdsQuery($request);
$petaniCounts = Petani::whereIn('petani.id', clone $filteredPetaniIds)->selectRaw("
COUNT(*) as total,
COUNT(*) FILTER (WHERE jenis_kelamin = true) as laki,
COUNT(*) FILTER (WHERE jenis_kelamin = false) as perempuan
")->first();
$totalPetani = $petaniCounts->total;
$petaniLakilaki = $petaniCounts->laki;
$petaniPerempuan = $petaniCounts->perempuan;
$totalKomoditas = Komoditas::query()
->where('is_utama', true)
->whereHas('petani', fn ($query) => $query->whereIn('petani.id', clone $filteredPetaniIds))
->count();
$totalLuasLahan = Lahan::has('petani')
->whereIn('petani_id', clone $filteredPetaniIds)
->sum('luas_lahan');
$ratarataLuasLahan = $totalLuasLahan && $totalPetani ? $totalLuasLahan / $totalPetani : 0;
$umurCounts = Petani::whereIn('petani.id', clone $filteredPetaniIds)
->whereNotNull('tanggal_lahir')->selectRaw("
COUNT(*) FILTER (WHERE EXTRACT(YEAR FROM AGE(CURRENT_DATE, tanggal_lahir)) < 30) as kurang_30,
COUNT(*) FILTER (WHERE EXTRACT(YEAR FROM AGE(CURRENT_DATE, tanggal_lahir)) BETWEEN 30 AND 39) as umur_30_39,
COUNT(*) FILTER (WHERE EXTRACT(YEAR FROM AGE(CURRENT_DATE, tanggal_lahir)) BETWEEN 40 AND 49) as umur_40_49,
COUNT(*) FILTER (WHERE EXTRACT(YEAR FROM AGE(CURRENT_DATE, tanggal_lahir)) BETWEEN 50 AND 59) as umur_50_59,
COUNT(*) FILTER (WHERE EXTRACT(YEAR FROM AGE(CURRENT_DATE, tanggal_lahir)) >= 60) as umur_60_keatas
")->first();
$pendidikanCounts = Petani::whereIn('petani.id', clone $filteredPetaniIds)
->whereNotNull('pendidikan_terakhir')
->select('pendidikan_terakhir', DB::raw('COUNT(*) as total'))
->groupBy('pendidikan_terakhir')
->pluck('total', 'pendidikan_terakhir');
$pendidikan = [
'tidak_sekolah' => (int) ($pendidikanCounts['01_tidak_sekolah'] ?? 0),
'sd' => (int) ($pendidikanCounts['02_sd'] ?? 0),
'smp' => (int) ($pendidikanCounts['03_smp'] ?? 0),
'sma' => (int) ($pendidikanCounts['04_sma'] ?? 0),
'diploma' => (int) ($pendidikanCounts['05_diploma'] ?? 0),
's1_keatas' => (int) ($pendidikanCounts['06_sarjana'] ?? 0) + (int) ($pendidikanCounts['07_magister'] ?? 0),
];
$jumlahTanggunganBuckets = SosialEkonomi::query()
->whereIn('petani_id', clone $filteredPetaniIds)
->whereNotNull('jumlah_tanggungan')
->selectRaw("
COUNT(DISTINCT petani_id) FILTER (WHERE jumlah_tanggungan = 0) as tanggungan_0,
COUNT(DISTINCT petani_id) FILTER (WHERE jumlah_tanggungan BETWEEN 1 AND 2) as tanggungan_1_2,
COUNT(DISTINCT petani_id) FILTER (WHERE jumlah_tanggungan BETWEEN 3 AND 4) as tanggungan_3_4,
COUNT(DISTINCT petani_id) FILTER (WHERE jumlah_tanggungan >= 5) as tanggungan_5_keatas
")
->first();
$jumlahTanggungan = [
'0' => (int) ($jumlahTanggunganBuckets->tanggungan_0 ?? 0),
'1_2' => (int) ($jumlahTanggunganBuckets->tanggungan_1_2 ?? 0),
'3_4' => (int) ($jumlahTanggunganBuckets->tanggungan_3_4 ?? 0),
'5_keatas' => (int) ($jumlahTanggunganBuckets->tanggungan_5_keatas ?? 0),
];
$kelompokTaniBuckets = Petani::query()
->whereIn('petani.id', clone $filteredPetaniIds)
->leftJoin('sosial_ekonomi', function ($join) {
$join->on('sosial_ekonomi.petani_id', '=', 'petani.id')
->whereNull('sosial_ekonomi.deleted_at');
})
->selectRaw("
COUNT(DISTINCT petani.id) FILTER (WHERE sosial_ekonomi.terdaftar_kelompok_tani = 'ya') as terdaftar,
COUNT(DISTINCT petani.id) FILTER (WHERE sosial_ekonomi.terdaftar_kelompok_tani = 'tidak') as tidak_terdaftar,
COUNT(DISTINCT petani.id) FILTER (WHERE sosial_ekonomi.terdaftar_kelompok_tani IS NULL OR sosial_ekonomi.terdaftar_kelompok_tani NOT IN ('ya', 'tidak')) as belum_terisi
")
->first();
$kelompokTani = [
'terdaftar' => (int) ($kelompokTaniBuckets->terdaftar ?? 0),
'tidak_terdaftar' => (int) ($kelompokTaniBuckets->tidak_terdaftar ?? 0),
'belum_terisi' => (int) ($kelompokTaniBuckets->belum_terisi ?? 0),
];
$desaSasaranRows = Petani::query()
->leftJoin('master_desa_kelurahan as desa', 'petani.desa_kelurahan_id', '=', 'desa.id')
->whereIn('petani.id', clone $filteredPetaniIds)
->selectRaw('petani.desa_kelurahan_id as desa_id')
->selectRaw("COALESCE(desa.nama, 'Tidak diketahui') as desa")
->selectRaw('COUNT(*) as total')
->groupBy('petani.desa_kelurahan_id', 'desa.nama')
->orderByDesc('total')
->orderBy('desa')
->get();
$komoditasUtama = Komoditas::query()
->whereHas('petani', fn ($query) => $query->whereIn('petani.id', clone $filteredPetaniIds))
->withCount(['petani' => fn ($query) => $query->whereIn('petani.id', clone $filteredPetaniIds)])
->orderByDesc('petani_count')
->get(['id', 'nama']);
$luasLahanBuckets = DB::query()->fromSub(
Lahan::query()
->whereIn('petani_id', clone $filteredPetaniIds)
->select('petani_id')
->selectRaw('luas_lahan'),
'agg'
)->selectRaw("
COUNT(DISTINCT petani_id) FILTER (WHERE luas_lahan < 0.5) as kurang_05,
COUNT(DISTINCT petani_id) FILTER (WHERE luas_lahan >= 0.5 AND luas_lahan <= 1) as luas_05_1,
COUNT(DISTINCT petani_id) FILTER (WHERE luas_lahan > 1 AND luas_lahan <= 2) as luas_1_2,
COUNT(DISTINCT petani_id) FILTER (WHERE luas_lahan > 2) as lebih_2
")->first();
$luasLahan = [
'kurang_05' => $luasLahanBuckets->kurang_05,
'05_1' => $luasLahanBuckets->luas_05_1,
'1_2' => $luasLahanBuckets->luas_1_2,
'lebih_2' => $luasLahanBuckets->lebih_2,
];
$statusKepemilikanLahanRows = Lahan::query()
->whereIn('petani_id', clone $filteredPetaniIds)
->whereNotNull('status_kepemilikan')
->selectRaw('status_kepemilikan as status')
->selectRaw('COUNT(DISTINCT petani_id) as total')
->groupBy('status_kepemilikan')
->orderByDesc('total')
->get();
$pendapatanPerPetaniQuery = PendapatanKomoditas::query()
->join('sosial_ekonomi', 'sosial_ekonomi.id', '=', 'pendapatan_komoditas.sosial_ekonomi_id')
->whereNotNull('sosial_ekonomi.petani_id')
->whereIn('sosial_ekonomi.petani_id', clone $filteredPetaniIds)
->groupBy('sosial_ekonomi.petani_id')
->selectRaw('SUM(pendapatan_komoditas.pendapatan) as total_pendapatan');
$penghasilanBuckets = DB::query()->fromSub(
clone $pendapatanPerPetaniQuery,
'agg'
)->selectRaw("
AVG(total_pendapatan) as rata_rata,
COUNT(*) FILTER (WHERE total_pendapatan < 1000000) as kurang_1,
COUNT(*) FILTER (WHERE total_pendapatan >= 1000000 AND total_pendapatan <= 3000000) as p1_3,
COUNT(*) FILTER (WHERE total_pendapatan > 3000000 AND total_pendapatan <= 5000000) as p3_5,
COUNT(*) FILTER (WHERE total_pendapatan > 5000000 AND total_pendapatan <= 10000000) as p5_10,
COUNT(*) FILTER (WHERE total_pendapatan > 10000000) as lebih_10
")->first();
$ratarataPenghasilan = (float) ($penghasilanBuckets->rata_rata ?? 0);
$penghasilan = [
'kurang_1' => $penghasilanBuckets->kurang_1,
'1_3' => $penghasilanBuckets->p1_3,
'3_5' => $penghasilanBuckets->p3_5,
'5_10' => $penghasilanBuckets->p5_10,
'lebih_10' => $penghasilanBuckets->lebih_10,
];
$data = [
'total_petani' => $totalPetani,
'petani_lakilaki' => $petaniLakilaki,
'petani_perempuan' => $petaniPerempuan,
'total_komoditas' => $totalKomoditas,
'total_luas_lahan' => $totalLuasLahan,
'ratarata_luas_lahan' => $ratarataLuasLahan,
'ratarata_penghasilan' => $ratarataPenghasilan,
'kelompok_umur' => [
'kurang_30' => $umurCounts->kurang_30,
'30_39' => $umurCounts->umur_30_39,
'40_49' => $umurCounts->umur_40_49,
'50_59' => $umurCounts->umur_50_59,
'60_keatas' => $umurCounts->umur_60_keatas,
],
'pendidikan' => $pendidikan,
'jumlah_tanggungan' => $jumlahTanggungan,
'kelompok_tani' => $kelompokTani,
'desa_sasaran' => [
'total' => $desaSasaranRows->count(),
'ids' => $desaSasaranRows->pluck('desa_id')->values(),
'labels' => $desaSasaranRows->pluck('desa')->values(),
'series' => $desaSasaranRows->pluck('total')->map(fn ($v) => (int) $v)->values(),
],
'komoditas_utama' => [
'ids' => $komoditasUtama->pluck('id')->values(),
'labels' => $komoditasUtama->pluck('nama')->values(),
'series' => $komoditasUtama->pluck('petani_count')->map(fn ($v) => (int) $v)->values(),
],
'luas_lahan' => $luasLahan,
'status_kepemilikan_lahan' => [
'keys' => $statusKepemilikanLahanRows->pluck('status')->values(),
'labels' => $statusKepemilikanLahanRows
->pluck('status')
->map(fn ($status) => $this->statusLahanLabel((string) $status))
->values(),
'series' => $statusKepemilikanLahanRows->pluck('total')->map(fn ($v) => (int) $v)->values(),
],
'penghasilan' => $penghasilan,
];
return compact('data');
}
private function filteredPetaniIdsQuery(Request $request)
{
$query = Petani::query()
->leftJoin('master_desa_kelurahan as desa', 'petani.desa_kelurahan_id', '=', 'desa.id')
->leftJoin('master_kecamatan as kecamatan', 'desa.kecamatan_id', '=', 'kecamatan.id')
->leftJoin('master_kabupaten_kota as kabupaten', 'kecamatan.kabupaten_kota_id', '=', 'kabupaten.id')
->when($request->filled('provinsi_id'), fn ($query) => $query->where('kabupaten.provinsi_id', $request->provinsi_id))
->when($request->filled('kabupatenKota_id'), fn ($query) => $query->where('kecamatan.kabupaten_kota_id', $request->kabupatenKota_id))
->when($request->filled('kecamatan_id'), fn ($query) => $query->where('desa.kecamatan_id', $request->kecamatan_id))
->when($request->filled('desaKelurahan_id'), fn ($query) => $query->where('petani.desa_kelurahan_id', $request->desaKelurahan_id))
->when($request->filled('komoditas_id'), fn ($query) => $query->where('petani.komoditas_id', $request->komoditas_id));
if ($request->filled('segmen')) {
$query->whereHas('skor', function ($query) use ($request) {
match ($request->segmen) {
'Penggerak' => $query->where('skor_kesiapan_adopsi', '>=', 4),
'Perintis' => $query->where('skor_kesiapan_adopsi', '>=', 3)
->where('skor_kesiapan_adopsi', '<', 4),
'Pemerhati' => $query->where('skor_kesiapan_adopsi', '>=', 2)
->where('skor_kesiapan_adopsi', '<', 3),
'Pemula' => $query->where('skor_kesiapan_adopsi', '>=', 1)
->where('skor_kesiapan_adopsi', '<', 2),
'Belum Lengkap' => $query->where(function ($query) {
$query->whereNull('skor_kesiapan_adopsi')
->orWhere('skor_kesiapan_adopsi', '<', 1);
}),
default => null,
};
});
}
return $query->select('petani.id');
}
private function statusLahanLabel(string $status): string
{
return match ($status) {
'sendiri' => 'Milik Pribadi',
'sewa' => 'Sewa',
'adat' => 'Tanah Adat',
default => ucwords(str_replace('_', ' ', $status)),
};
}
public function data(Request $request)
{
$filteredPetaniIds = $this->filteredPetaniIdsQuery($request);
$pendapatanSub = PendapatanKomoditas::query()
->join('sosial_ekonomi', 'sosial_ekonomi.id', '=', 'pendapatan_komoditas.sosial_ekonomi_id')
->whereColumn('sosial_ekonomi.petani_id', 'petani.id')
->selectRaw('SUM(pendapatan_komoditas.pendapatan)');
$query = Petani::with('komoditas')
->whereIn('petani.id', clone $filteredPetaniIds)
->withSum('lahans as total_luas_lahan', 'luas_lahan')
->addSelect(['total_pendapatan' => $pendapatanSub]);
if ($request->filled('search')) {
$query->where('nama', 'ILIKE', "%{$request->search}%");
}
if ($request->has('gender') && $request->gender !== '') {
$query->where('jenis_kelamin', $request->gender);
}
if ($request->filled('umur')) {
match ($request->umur) {
'kurang_30' => $query->whereNotNull('tanggal_lahir')
->whereRaw("EXTRACT(YEAR FROM AGE(CURRENT_DATE, tanggal_lahir)) < 30"),
'30_39' => $query->whereNotNull('tanggal_lahir')
->whereRaw("EXTRACT(YEAR FROM AGE(CURRENT_DATE, tanggal_lahir)) BETWEEN 30 AND 39"),
'40_49' => $query->whereNotNull('tanggal_lahir')
->whereRaw("EXTRACT(YEAR FROM AGE(CURRENT_DATE, tanggal_lahir)) BETWEEN 40 AND 49"),
'50_59' => $query->whereNotNull('tanggal_lahir')
->whereRaw("EXTRACT(YEAR FROM AGE(CURRENT_DATE, tanggal_lahir)) BETWEEN 50 AND 59"),
'60_keatas' => $query->whereNotNull('tanggal_lahir')
->whereRaw("EXTRACT(YEAR FROM AGE(CURRENT_DATE, tanggal_lahir)) >= 60"),
default => null,
};
}
if ($request->filled('pendidikan')) {
$pendidikanMap = [
'tidak_sekolah' => ['01_tidak_sekolah'],
'sd' => ['02_sd'],
'smp' => ['03_smp'],
'sma' => ['04_sma'],
'diploma' => ['05_diploma'],
's1_keatas' => ['06_sarjana', '07_magister'],
];
if (isset($pendidikanMap[$request->pendidikan])) {
$query->whereIn('pendidikan_terakhir', $pendidikanMap[$request->pendidikan]);
}
}
if ($request->filled('jumlah_tanggungan')) {
$tanggunganQuery = SosialEkonomi::query()
->whereIn('petani_id', clone $filteredPetaniIds)
->whereNotNull('jumlah_tanggungan')
->select('petani_id')
->distinct();
match ($request->jumlah_tanggungan) {
'0' => $tanggunganQuery->where('jumlah_tanggungan', 0),
'1_2' => $tanggunganQuery->whereBetween('jumlah_tanggungan', [1, 2]),
'3_4' => $tanggunganQuery->whereBetween('jumlah_tanggungan', [3, 4]),
'5_keatas' => $tanggunganQuery->where('jumlah_tanggungan', '>=', 5),
default => null,
};
$query->whereIn('petani.id', $tanggunganQuery);
}
if ($request->filled('kelompok_tani')) {
match ($request->kelompok_tani) {
'terdaftar' => $query->whereIn('petani.id', SosialEkonomi::query()
->whereIn('petani_id', clone $filteredPetaniIds)
->where('terdaftar_kelompok_tani', 'ya')
->select('petani_id')
->distinct()),
'tidak_terdaftar' => $query->whereIn('petani.id', SosialEkonomi::query()
->whereIn('petani_id', clone $filteredPetaniIds)
->where('terdaftar_kelompok_tani', 'tidak')
->select('petani_id')
->distinct()),
'belum_terisi' => $query->whereNotIn('petani.id', SosialEkonomi::query()
->whereIn('petani_id', clone $filteredPetaniIds)
->whereIn('terdaftar_kelompok_tani', ['ya', 'tidak'])
->select('petani_id')
->distinct()),
default => null,
};
}
if ($request->filled('komoditas')) {
$query->where('komoditas_id', $request->komoditas);
}
if ($request->filled('penghasilan')) {
[$min, $max] = match ($request->penghasilan) {
'kurang_1' => [null, 999999],
'1_3' => [1000000, 3000000],
'3_5' => [3000001, 5000000],
'5_10' => [5000001, 10000000],
'lebih_10' => [10000001, null],
default => [null, null],
};
$query->whereIn('id', function ($sub) use ($min, $max) {
$sub->from('pendapatan_komoditas')
->join('sosial_ekonomi', 'sosial_ekonomi.id', '=', 'pendapatan_komoditas.sosial_ekonomi_id')
->whereNotNull('sosial_ekonomi.petani_id')
->groupBy('sosial_ekonomi.petani_id')
->select('sosial_ekonomi.petani_id')
->when($min !== null, fn ($q) => $q->havingRaw('SUM(pendapatan_komoditas.pendapatan) >= ?', [$min]))
->when($max !== null, fn ($q) => $q->havingRaw('SUM(pendapatan_komoditas.pendapatan) <= ?', [$max]));
});
}
if ($request->filled('luas_lahan')) {
$lahanQuery = Lahan::query()
->whereIn('petani_id', clone $filteredPetaniIds)
->select('petani_id')
->distinct();
match ($request->luas_lahan) {
'kurang_05' => $lahanQuery->where('luas_lahan', '<', 0.5),
'05_1' => $lahanQuery->whereBetween('luas_lahan', [0.5, 1]),
'1_2' => $lahanQuery->where('luas_lahan', '>', 1)->where('luas_lahan', '<=', 2),
'lebih_2' => $lahanQuery->where('luas_lahan', '>', 2),
default => null,
};
$query->whereIn('petani.id', $lahanQuery);
}
if ($request->filled('status_kepemilikan_lahan')) {
$query->whereIn('petani.id', Lahan::query()
->whereIn('petani_id', clone $filteredPetaniIds)
->where('status_kepemilikan', $request->status_kepemilikan_lahan)
->select('petani_id')
->distinct());
}
$daftarPetani = $query->orderBy('id')->paginate(10);
$pendidikanLabels = [
'01_tidak_sekolah' => 'Tidak Sekolah',
'02_sd' => 'SD',
'03_smp' => 'SMP',
'04_sma' => 'SMA',
'05_diploma' => 'Diploma',
'06_sarjana' => 'Sarjana',
'07_magister' => 'Magister',
];
$rows = collect($daftarPetani->items())->map(function ($petani) use ($pendidikanLabels) {
$umur = $petani->tanggal_lahir ? \Carbon\Carbon::parse($petani->tanggal_lahir)->age : null;
$pendidikanRaw = $petani->getRawOriginal('pendidikan_terakhir');
$pendapatan = $petani->total_pendapatan;
$rentangPenghasilan = match (true) {
$pendapatan === null => '-',
$pendapatan < 1000000 => '< Rp1 juta',
$pendapatan <= 3000000 => 'Rp1 - 3 juta',
$pendapatan <= 5000000 => 'Rp3 - 5 juta',
$pendapatan <= 10000000 => 'Rp5 - 10 juta',
default => '> Rp10 juta',
};
return [
'id' => $petani->id,
'nama' => $petani->nama ?? '-',
'jenis_kelamin' => $petani->jenis_kelamin,
'gender' => $petani->jenis_kelamin == 1 ? 'Laki-laki' : 'Perempuan',
'umur' => $umur,
'komoditas' => $petani->komoditas?->nama ?? '-',
'luas_lahan' => (float) ($petani->total_luas_lahan ?? 0),
'pendidikan' => $pendidikanLabels[$pendidikanRaw] ?? '-',
'rentang_penghasilan' => $rentangPenghasilan,
];
});
return response()->json([
'data' => $rows,
'pagination' => [
'current_page' => $daftarPetani->currentPage(),
'last_page' => $daftarPetani->lastPage(),
'per_page' => $daftarPetani->perPage(),
'total' => $daftarPetani->total(),
'from' => $daftarPetani->firstItem(),
'to' => $daftarPetani->lastItem(),
],
]);
}
}
@@ -0,0 +1,20 @@
<?php
namespace App\Http\Controllers\Web\Dashboard;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Gate;
class DistribusiController extends Controller
{
public function index()
{
if (!Gate::allows('super_admin') && !Gate::allows('admin')) {
abort(403);
}
$title = 'Distribusi Dashboard';
return view('dashboard.distribusi', compact('title'));
}
}

Some files were not shown because too many files have changed in this diff Show More