Merge branch 'main' of https://git.probindo.com/Probindo/database-pertani-web
This commit is contained in:
@@ -74,6 +74,63 @@ class ProfilPetaniController extends Controller
|
||||
->groupBy('petani.komoditas_id')
|
||||
->groupByRaw($case)
|
||||
->get();
|
||||
|
||||
|
||||
$skorAverage = SkorPetani::query()
|
||||
->join('petani', 'petani_skor.petani_id', '=', 'petani.id')
|
||||
->whereIn('petani_id', $petani)
|
||||
->whereIn('petani.komoditas_id', $komoditas->pluck('id'))
|
||||
->avg('skor_kesiapan_adopsi');
|
||||
if ($skorAverage >= 4.0) {
|
||||
$segmenAverage = 'Penggerak';
|
||||
} elseif ($skorAverage >= 3.0) {
|
||||
$segmenAverage = 'Perintis';
|
||||
} elseif ($skorAverage >= 2.0) {
|
||||
$segmenAverage = 'Pemerhati';
|
||||
} elseif ($skorAverage >= 1.0) {
|
||||
$segmenAverage = 'Pemula';
|
||||
} else {
|
||||
$segmenAverage = 'Belum Lengkap';
|
||||
}
|
||||
|
||||
$skorDimensi = SkorPetani::query()
|
||||
->join('petani', 'petani_skor.petani_id', '=', 'petani.id')
|
||||
->whereIn('petani_id', $petani)
|
||||
->whereIn('petani.komoditas_id', $komoditas->pluck('id'))
|
||||
->selectRaw("
|
||||
avg(skor_d2_sistem_praktik_budidaya) as skor_d2_sistem_praktik_budidaya,
|
||||
avg(skor_d4_sosial_ekonomi) as skor_d4_sosial_ekonomi,
|
||||
avg(skor_d6_rantai_nilai_akses_pasar) as skor_d6_rantai_nilai_akses_pasar")
|
||||
->first();
|
||||
|
||||
$skorKomponen = SkorPetani::query()
|
||||
->join('petani', 'petani_skor.petani_id', '=', 'petani.id')
|
||||
->whereIn('petani_id', $petani)
|
||||
->whereIn('petani.komoditas_id', $komoditas->pluck('id'))
|
||||
->selectRaw("avg(skor_komp_1_d4_k3_motivasi_kapasitas_adopsi) as skor_komp_1_d4_k3_motivasi_kapasitas_adopsi,
|
||||
avg(skor_komp_2_d4_k2_ekonomi_rumah_tangga) as skor_komp_2_d4_k2_ekonomi_rumah_tangga,
|
||||
avg(skor_komp_3_d2_praktik_budidaya_gap) as skor_komp_3_d2_praktik_budidaya_gap,
|
||||
avg(skor_komp_4_d4_k4_keterlibatan_kelembagaan) as skor_komp_4_d4_k4_keterlibatan_kelembagaan,
|
||||
avg(skor_komp_5_d4_k5_k6_akses_kebebasan_keuangan) as skor_komp_5_d4_k5_k6_akses_kebebasan_keuanga,
|
||||
avg(skor_komp_6_d6_k1_k4_k5_rantai_nilai_akses_pasar) as skor_komp_6_d6_k1_k4_k5_rantai_nilai_akses_pasar")
|
||||
->first();
|
||||
|
||||
$skorMultiDimensi = SkorPetani::query()
|
||||
->join('petani', 'petani_skor.petani_id', '=', 'petani.id')
|
||||
->whereIn('petani_id', $petani)
|
||||
->whereIn('petani.komoditas_id', $komoditas->pluck('id'))
|
||||
->selectRaw("$case AS segmen,
|
||||
avg(skor_kesiapan_adopsi) as skor_kesiapan_adopsi,
|
||||
avg(skor_d2_sistem_praktik_budidaya) as skor_d2_sistem_praktik_budidaya,
|
||||
avg(skor_d4_sosial_ekonomi) as skor_d4_sosial_ekonomi,
|
||||
avg(skor_d6_rantai_nilai_akses_pasar) as skor_d6_rantai_nilai_akses_pasar")
|
||||
->groupByRaw($case)
|
||||
->get();
|
||||
|
||||
$petani = Petani::with(['skor'])
|
||||
->whereIn('id', $petani)
|
||||
->whereIn('komoditas_id', $komoditas->pluck('id'))
|
||||
->get();
|
||||
|
||||
return view('dashboard.petani', compact('title',
|
||||
'komoditas',
|
||||
@@ -81,7 +138,13 @@ class ProfilPetaniController extends Controller
|
||||
'lahanSummary',
|
||||
'tanamanSummary',
|
||||
'skorSummary',
|
||||
'skorKomoditasSummary'
|
||||
'skorKomoditasSummary',
|
||||
'segmenAverage',
|
||||
'skorAverage',
|
||||
'skorDimensi',
|
||||
'skorKomponen',
|
||||
'skorMultiDimensi',
|
||||
'petani',
|
||||
));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -28,9 +28,15 @@ class AuthController extends Controller
|
||||
public function createAccount(Request $request)
|
||||
{
|
||||
$credentials = $request->validate([
|
||||
'username' => 'required|string|max:255|unique:users,username',
|
||||
'username' => 'required|string|min:6|max:255|unique:users,username',
|
||||
'email' => 'required|string|email|max:255|unique:users,email',
|
||||
'password' => 'required|string|min:8|confirmed',
|
||||
], [
|
||||
'username.unique' => 'Nama pengguna sudah digunakan.',
|
||||
'username.min' => 'Nama pengguna minimal 6 karakter.',
|
||||
'email.unique' => 'Email sudah digunakan.',
|
||||
'password.confirmed' => 'Konfirmasi password tidak cocok.',
|
||||
'password.min' => 'Password minimal 8 karakter.',
|
||||
]);
|
||||
|
||||
$user = User::create([
|
||||
@@ -89,6 +95,9 @@ class AuthController extends Controller
|
||||
$request->validate([
|
||||
'email_username' => 'required|string',
|
||||
'password' => 'required|string',
|
||||
], [
|
||||
'email_username.required' => 'Email atau username harus diisi.',
|
||||
'password.required' => 'Password harus diisi.',
|
||||
]);
|
||||
|
||||
$login = $request->input('email_username');
|
||||
|
||||
@@ -99,18 +99,20 @@ class UserController extends Controller
|
||||
public function store(Request $request)
|
||||
{
|
||||
$validator = Validator::make($request->all(), [
|
||||
'username' => ['required', 'string', 'max:255', 'unique:users,username'],
|
||||
'username' => ['required', 'string', 'max:255', 'min:6', 'unique:users,username'],
|
||||
'nama' => ['required', 'string', 'max:255'],
|
||||
'email' => ['required', 'string', 'email', 'max:255', 'unique:users,email'],
|
||||
'password' => ['required', 'string', 'min:8', 'confirmed'],
|
||||
'role' => ['required', 'string'],
|
||||
'telepon' => ['required', 'max:13'],
|
||||
'desa_kelurahan_id' => ['required'],
|
||||
'desa_kelurahan_id' => ['nullable', 'exists:desa_kelurahan,id'],
|
||||
'ktp' => ['nullable', 'min:16', 'max:16'],
|
||||
'kk' => ['nullable', 'min:16', 'max:16'],
|
||||
'file_ktp' => ['nullable', 'file', 'mimes:jpeg,jpg,png,pdf', 'max:2048'],
|
||||
'file_kk' => ['nullable', 'file', 'mimes:jpeg,jpg,pdf,png', 'max:2048'],
|
||||
], [
|
||||
'username.unique' => 'Nama pengguna sudah digunakan.',
|
||||
'username.min' => 'Nama pengguna minimal 6 karakter.',
|
||||
'password.confirmed' => 'Konfirmasi password tidak cocok!',
|
||||
'password.min' => 'Password minimal 8 karakter!',
|
||||
'email.unique' => 'Email sudah terdaftar.',
|
||||
|
||||
@@ -18,6 +18,7 @@ use App\Models\Wilayah\DesaKelurahan;
|
||||
use App\Models\Wilayah\Provinsi;
|
||||
use App\Models\Pertanian\Komoditas;
|
||||
use App\Models\Pertanian\Tanaman;
|
||||
use App\Models\Master\JenisTanaman;
|
||||
|
||||
use App\Enums\StatusLahan;
|
||||
use App\Enums\KondisiTanaman;
|
||||
@@ -62,8 +63,9 @@ class PetaniLahanController extends Controller
|
||||
$provinsi = Provinsi::orderBy('kode', 'asc')->get();
|
||||
|
||||
$komoditas = Komoditas::all();
|
||||
$tanamanPenaung = JenisTanaman::all();
|
||||
|
||||
return view('produktivitas.petani.lahan.add', compact('petani', 'lahan', 'provinsi', 'komoditas'));
|
||||
return view('produktivitas.petani.lahan.add', compact('petani', 'lahan', 'provinsi', 'komoditas', 'tanamanPenaung'));
|
||||
}
|
||||
|
||||
private function validateLahan(Request $request)
|
||||
@@ -81,7 +83,7 @@ class PetaniLahanController extends Controller
|
||||
'komoditas_id' => ['required', 'exists:master_komoditas,id'],
|
||||
'jenis_komoditas_id' => ['required', 'exists:jenis_komoditas,id'],
|
||||
'varietas_id' => ['nullable', 'exists:master_varietas,id'],
|
||||
'jumlah_tanaman' => ['required', 'numeric', 'min:0'],
|
||||
'jumlah_tanaman' => ['nullable', 'numeric', 'min:0'],
|
||||
'umur_lahan' => ['nullable', 'numeric', 'min:1'],
|
||||
'umur_tanaman' => ['required', 'numeric', 'min:1'],
|
||||
'kondisi_tanaman' => ['required', 'string', new Enum(KondisiTanaman::class)],
|
||||
@@ -91,7 +93,7 @@ class PetaniLahanController extends Controller
|
||||
'komoditas_lain' => ['nullable', 'array'],
|
||||
'komoditas_lain.*' => ['integer', 'exists:master_komoditas,id'],
|
||||
'tanaman_penaung' => ['nullable', 'array'],
|
||||
'tanaman_penaung.*' => ['integer', 'exists:master_komoditas,id'],
|
||||
'tanaman_penaung.*' => ['string'],
|
||||
'foto' => ['nullable', 'array'],
|
||||
'foto.*' => ['image', 'mimes:jpeg,jpg,png', 'max:2048'],
|
||||
], [
|
||||
@@ -102,7 +104,7 @@ class PetaniLahanController extends Controller
|
||||
'luas_lahan.required' => 'Luas lahan wajib diisi.',
|
||||
'luas_lahan.numeric' => 'Luas lahan diisi dengan angka.',
|
||||
'luas_lahan.min' => 'Luas lahan minimal 0.01.',
|
||||
'jumlah_tanaman.required' => 'Jumlah tanaman wajib diisi.',
|
||||
//'jumlah_tanaman.required' => 'Jumlah tanaman wajib diisi.',
|
||||
'jumlah_tanaman.numeric' => 'Jumlah tanaman diisi dengan angka.',
|
||||
'jumlah_tanaman.min' => 'Jumlah tanaman minimal 0.',
|
||||
//'umur_lahan.required' => 'Umur lahan wajib diisi.',
|
||||
@@ -119,7 +121,7 @@ class PetaniLahanController extends Controller
|
||||
'komoditas_lain.array' => 'Komoditas lain diisi dengan array.',
|
||||
'komoditas_lain.*.exists' => 'Komoditas lain yang dipilih tidak valid.',
|
||||
'tanaman_penaung.array' => 'Tanaman penaung diisi dengan array.',
|
||||
'tanaman_penaung.*.exists' => 'Tanaman penaung yang dipilih tidak valid.',
|
||||
//'tanaman_penaung.*.exists' => 'Tanaman penaung yang dipilih tidak valid.',
|
||||
'foto.array' => 'Foto diisi dengan array.',
|
||||
'foto.*.image' => 'Foto harus berupa gambar.',
|
||||
'foto.*.mimes' => 'Foto harus berupa gambar dengan ekstensi jpeg, jpg, atau png.',
|
||||
@@ -128,6 +130,28 @@ class PetaniLahanController extends Controller
|
||||
|
||||
}
|
||||
|
||||
private function syncTanamanPenaung(Request $request)
|
||||
{
|
||||
$existing = JenisTanaman::pluck('nama')->toArray();
|
||||
|
||||
$tanamanPenaung = collect($request->tanaman_penaung)
|
||||
->unique()
|
||||
->reject(fn ($nama) => in_array($nama, $existing))
|
||||
->map(fn ($nama) => [
|
||||
'nama' => Str::title($nama),
|
||||
'created_by' => auth()->id(),
|
||||
'updated_by' => auth()->id(),
|
||||
'created_at' => now(),
|
||||
'updated_at' => now(),
|
||||
])
|
||||
->values()
|
||||
->toArray();
|
||||
|
||||
if (!empty($tanamanPenaung)) {
|
||||
JenisTanaman::insert($tanamanPenaung);
|
||||
}
|
||||
}
|
||||
|
||||
public function store($petaniId, Request $request)
|
||||
{
|
||||
if (!Gate::any(['super_admin', 'admin', 'fasilitator'])) {
|
||||
@@ -136,6 +160,12 @@ class PetaniLahanController extends Controller
|
||||
|
||||
$petani = Petani::findOrFail($petaniId);
|
||||
|
||||
$request->merge([
|
||||
'tanaman_penaung' => collect($request->tanaman_penaung)
|
||||
->map(fn ($nama) => Str::title($nama))
|
||||
->toArray()
|
||||
]);
|
||||
|
||||
$validated = $this->validateLahan($request);
|
||||
$komoditas = Komoditas::where('id', $request->komoditas_id)->first();
|
||||
$lahanCount = Lahan::where('petani_id', $petaniId)
|
||||
@@ -154,6 +184,8 @@ class PetaniLahanController extends Controller
|
||||
}
|
||||
}
|
||||
|
||||
$this->syncTanamanPenaung($request);
|
||||
|
||||
$lahan = Lahan::create([...$validated,
|
||||
'foto' => $foto && count($foto) > 0 ? json_encode($foto) : null,
|
||||
'nama' => 'Lahan ' . $komoditas->nama . ' #' . ($lahanCount + 1),
|
||||
@@ -236,10 +268,11 @@ class PetaniLahanController extends Controller
|
||||
$lahanSelected = Lahan::where('petani_id', $petaniId)->findOrFail($id);
|
||||
|
||||
$komoditas = Komoditas::all();
|
||||
$tanamanPenaung = JenisTanaman::all();
|
||||
|
||||
$provinsi = Provinsi::orderBy('kode', 'asc')->get();
|
||||
|
||||
return view('produktivitas.petani.lahan.edit', compact('lahan', 'lahanSelected', 'petani', 'komoditas', 'provinsi'));
|
||||
return view('produktivitas.petani.lahan.edit', compact('lahan', 'lahanSelected', 'petani', 'komoditas', 'provinsi', 'tanamanPenaung'));
|
||||
}
|
||||
|
||||
public function update(Request $request, string $petaniId, string $id)
|
||||
@@ -251,6 +284,11 @@ class PetaniLahanController extends Controller
|
||||
$petani = Petani::findOrFail($petaniId);
|
||||
$lahan = Lahan::where('petani_id', $petaniId)->findOrFail($id);
|
||||
|
||||
$request->merge([
|
||||
'tanaman_penaung' => collect($request->tanaman_penaung)
|
||||
->map(fn ($nama) => Str::title($nama))
|
||||
->toArray()
|
||||
]);
|
||||
$validated = $this->validateLahan($request);
|
||||
$komoditas = Komoditas::where('id', $request->komoditas_id)->first();
|
||||
$tanamanCount = Tanaman::where('lahan_id', $lahan->id)->count();
|
||||
@@ -285,6 +323,8 @@ class PetaniLahanController extends Controller
|
||||
$lahanUidParts = explode('LHN-', $lahanUid);
|
||||
$lahanUid = end($lahanUidParts);
|
||||
|
||||
$this->syncTanamanPenaung($request);
|
||||
|
||||
if ($lahan && $lahan->jumlah_tanaman > $tanamanCount) {
|
||||
$data = collect(range($tanamanCount + 1, $lahan->jumlah_tanaman))->map(function ($i) use ($lahan, $komoditas, $lahanUid) {
|
||||
return [
|
||||
|
||||
@@ -64,12 +64,26 @@ class ProfileController extends Controller
|
||||
$validator = Validator::make($request->all(), [
|
||||
'nama' => ['required', 'string', 'max:255'],
|
||||
'email' => ['required', 'email', 'max:255'],
|
||||
'telepon' => ['required', 'max:13'],
|
||||
'desa_kelurahan_id' => ['required'],
|
||||
'telepon' => ['nullable', 'max:13'],
|
||||
'desa_kelurahan_id' => ['nullable', 'exists:master_desa_kelurahan,id'],
|
||||
'ktp' => ['nullable', 'min:16', 'max:16'],
|
||||
'file_ktp' => ['nullable', 'file', 'mimes:jpeg,jpg,png,pdf', 'max:2048'],
|
||||
'kk' => ['nullable', 'min:16', 'max:16'],
|
||||
'file_kk' => ['nullable', 'file', 'mimes:jpeg,jpg,png,pdf', 'max:2048'],
|
||||
], [
|
||||
'nama.required' => 'Nama wajib diisi.',
|
||||
'email.required' => 'Email wajib diisi.',
|
||||
'email.email' => 'Format email tidak sesuai.',
|
||||
'telepon.max' => 'Nomor telepon tidak sesuai.',
|
||||
'desa_kelurahan_id.exists' => 'Desa kelurahan tidak ditemukan.',
|
||||
'ktp.min' => 'KTP harus terdiri dari 16 digit.',
|
||||
'ktp.max' => 'KTP harus terdiri dari 16 digit.',
|
||||
'kk.min' => 'KK harus terdiri dari 16 digit.',
|
||||
'kk.max' => 'KK harus terdiri dari 16 digit.',
|
||||
'file_ktp.mimes' => 'Format file harus dalam bentuk JPEG, JPG, PNG, atau PDF.',
|
||||
'file_kk.mimes' => 'Format file harus dalam bentuk JPEG, JPG, PNG, atau PDF.',
|
||||
'file_ktp.max' => 'Ukuran file maksimal 2MB.',
|
||||
'file_kk.max' => 'Ukuran file maksimal 2MB.',
|
||||
]);
|
||||
|
||||
if ($validator->fails()) {
|
||||
@@ -143,12 +157,31 @@ class ProfileController extends Controller
|
||||
$validator = Validator::make($request->all(), [
|
||||
'nama' => ['required', 'string', 'max:255'],
|
||||
'email' => ['required', 'email', 'max:255'],
|
||||
'telepon' => ['required', 'max:13'],
|
||||
'desa_kelurahan_id' => ['required'],
|
||||
'telepon' => ['nullable', 'max:13'],
|
||||
'desa_kelurahan_id' => ['nullable', 'exists:master_desa_kelurahan,id'],
|
||||
'ktp' => ['nullable', 'min:16', 'max:16'],
|
||||
'file_ktp' => ['nullable', 'file', 'mimes:jpeg,jpg,png,pdf', 'max:2048'],
|
||||
'kk' => ['nullable', 'min:16', 'max:16'],
|
||||
'file_kk' => ['nullable', 'file', 'mimes:jpeg,jpg,png,pdf', 'max:2048'],
|
||||
], [
|
||||
'nama.required' => 'Nama harus diisi.',
|
||||
'nama.string' => 'Nama harus berupa string.',
|
||||
'nama.max' => 'Nama tidak boleh lebih dari 255 karakter.',
|
||||
'email.required' => 'Email harus diisi.',
|
||||
'email.email' => 'Email harus berupa alamat email yang valid.',
|
||||
'email.max' => 'Email tidak boleh lebih dari 255 karakter.',
|
||||
'telepon.max' => 'Nomor telepon tidak boleh lebih dari 13 karakter.',
|
||||
'desa_kelurahan_id.exists' => 'Desa kelurahan tidak ditemukan.',
|
||||
'ktp.min' => 'Nomor KTP harus terdiri dari 16 karakter.',
|
||||
'ktp.max' => 'Nomor KTP harus terdiri dari 16 karakter.',
|
||||
'kk.min' => 'Nomor KK harus terdiri dari 16 karakter.',
|
||||
'kk.max' => 'Nomor KK harus terdiri dari 16 karakter.',
|
||||
'file_ktp.file' => 'File harus berupa file.',
|
||||
'file_ktp.mimes' => 'File harus berupa file dengan ekstensi jpeg, jpg, png, atau pdf.',
|
||||
'file_ktp.max' => 'Ukuran file tidak boleh lebih dari 2MB.',
|
||||
'file_kk.file' => 'File harus berupa file.',
|
||||
'file_kk.mimes' => 'File harus berupa file dengan ekstensi jpeg, jpg, png, atau pdf.',
|
||||
'file_kk.max' => 'Ukuran file tidak boleh lebih dari 2MB.',
|
||||
]);
|
||||
|
||||
if ($validator->fails()) {
|
||||
|
||||
Reference in New Issue
Block a user