Compare commits
56
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
712b10e405 | ||
|
|
6cfcf46ba6 | ||
|
|
b1b9828514 | ||
|
|
7af7e1bdaf | ||
|
|
bd05fc7f0f | ||
|
|
17b5687db8 | ||
|
|
e7f48b6500 | ||
|
|
a5884d0f8c | ||
|
|
9576c6295e | ||
|
|
079e300d5d | ||
|
|
2c94316439 | ||
|
|
690b53e5a2 | ||
|
|
50c9adfdc7 | ||
|
|
696c7dede8 | ||
|
|
5967e7d6f3 | ||
|
|
4c66d72dc5 | ||
|
|
c43483a9f8 | ||
|
|
e02a34a527 | ||
|
|
713355ce0a | ||
|
|
12f8d0bbda | ||
|
|
8afe7f9b38 | ||
|
|
fbf84eb4cb | ||
|
|
e04093ad3f | ||
|
|
3e1d3a33ee | ||
|
|
e316d064ef | ||
|
|
0c289ec244 | ||
|
|
089f1b515d | ||
|
|
4c647ea8ce | ||
|
|
419404e273 | ||
|
|
837e542851 | ||
|
|
9378d15d71 | ||
|
|
0381e9bf0e | ||
|
|
3a70445e9a | ||
|
|
d2ed2c58fd | ||
|
|
9b201efa06 | ||
|
|
2b3a0b7c58 | ||
|
|
a187fb1095 | ||
|
|
6b44c11181 | ||
|
|
090153e53a | ||
|
|
a79a93d291 | ||
|
|
62f0f1bdbc | ||
|
|
f0acd8c7ed | ||
|
|
3908b0be71 | ||
|
|
05cc3be9d3 | ||
|
|
f4c83d348a | ||
|
|
61bd8dc388 | ||
|
|
002d6044b4 | ||
|
|
30196278d7 | ||
|
|
08c19c0714 | ||
|
|
d6c036e19a | ||
|
|
981bc0d494 | ||
|
|
857da1e900 | ||
|
|
66fc7227e6 | ||
|
|
3edfc57ba7 | ||
|
|
4a560ebc4e | ||
|
|
d4eb27e583 |
@@ -11,9 +11,9 @@ enum KeparahanSerangan: string
|
|||||||
public function label(): string
|
public function label(): string
|
||||||
{
|
{
|
||||||
return match($this) {
|
return match($this) {
|
||||||
self::RINGAN => 'Ringan',
|
self::RINGAN => 'Ringan, hanya beberapa tanaman',
|
||||||
self::SEDANG => 'Sedang',
|
self::SEDANG => 'Sedang, sebagian tanaman terdampak',
|
||||||
self::BERAT => 'Berat',
|
self::BERAT => 'Parah, sebagian besar tanaman terdampak',
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -13,10 +13,10 @@ enum KondisiTanaman: string
|
|||||||
public function label(): string
|
public function label(): string
|
||||||
{
|
{
|
||||||
return match($this) {
|
return match($this) {
|
||||||
self::BAIK => 'Baik',
|
self::BAIK => 'Baik, tumbuh lebat, banyak buah',
|
||||||
self::SEDANG => 'Sedang',
|
self::SEDANG => 'Sedang, cukup tumbuh, ada masalah',
|
||||||
self::BURUK => 'Buruk',
|
self::BURUK => 'Buruk, banyak tanaman tua dan lemah/tidak berbuah',
|
||||||
self::MATI => 'Mati',
|
self::MATI => 'Mati, tanaman telah mati, tidak dapat tumbuh maupun berbuah',
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -19,13 +19,13 @@ enum Pendidikan: string
|
|||||||
{
|
{
|
||||||
return match($this) {
|
return match($this) {
|
||||||
self::TIDAK_SEKOLAH => 'Tidak Sekolah',
|
self::TIDAK_SEKOLAH => 'Tidak Sekolah',
|
||||||
self::SD => 'SD atau Sederajat',
|
self::SD => 'SD',
|
||||||
self::SMP => 'SMP atau Sederajat',
|
self::SMP => 'SMP',
|
||||||
self::SMA => 'SMA atau Sederajat',
|
self::SMA => 'SMA/SMK',
|
||||||
self::DIPLOMA => 'Diploma 1-3 (D1-D3)',
|
self::DIPLOMA => 'Diploma 1-3 (D1-D3)',
|
||||||
self::SARJANA => 'Sarjana (S1) atau sederajat',
|
self::SARJANA => 'Sarjana (S1)',
|
||||||
self::MAGISTER => 'Magister (S2) atau sederajat',
|
self::MAGISTER => 'Magister (S2)',
|
||||||
self::DOKTOR => 'Doktor (S3) atau sederajat',
|
self::DOKTOR => 'Doktor (S3)',
|
||||||
self::PESANTREN => 'Pesantren, Semiari, Wihara, atau Pendidikan Keagamaan Formal',
|
self::PESANTREN => 'Pesantren, Semiari, Wihara, atau Pendidikan Keagamaan Formal',
|
||||||
self::LAINNYA => 'Lainnya',
|
self::LAINNYA => 'Lainnya',
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ use App\Enums\StatusLahan;
|
|||||||
|
|
||||||
class LahanController extends Controller
|
class LahanController extends Controller
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
* Display a listing of the resource.
|
* Display a listing of the resource.
|
||||||
*/
|
*/
|
||||||
public function index(Request $request): AnonymousResourceCollection
|
public function index(Request $request): AnonymousResourceCollection
|
||||||
@@ -97,11 +97,12 @@ class LahanController extends Controller
|
|||||||
'nama' => ['required', 'string', 'max:255'],
|
'nama' => ['required', 'string', 'max:255'],
|
||||||
'status_kepemilikan' => ['required', new Enum(StatusLahan::class)],
|
'status_kepemilikan' => ['required', new Enum(StatusLahan::class)],
|
||||||
'desa_kelurahan_id' => ['nullable', 'numeric', 'exists:master_desa_kelurahan,id'],
|
'desa_kelurahan_id' => ['nullable', 'numeric', 'exists:master_desa_kelurahan,id'],
|
||||||
'path' => ['nullable', 'array'],
|
'path' => ['nullable', 'string'],
|
||||||
'path.*' => ['array'],
|
|
||||||
'luas_lahan' => ['nullable', 'numeric'],
|
'luas_lahan' => ['nullable', 'numeric'],
|
||||||
'uid' => ['required', 'string'],
|
'uid' => ['required', 'string'],
|
||||||
'profile_id' => $profileRule,
|
'profile_id' => $profileRule,
|
||||||
|
'foto' => ['nullable', 'array'],
|
||||||
|
'foto.*' => ['image', 'mimes:jpeg,png,jpg', 'max:5120'], // Max 5MB
|
||||||
]);
|
]);
|
||||||
|
|
||||||
$targetProfileId = $user->role === 'fasilitator'
|
$targetProfileId = $user->role === 'fasilitator'
|
||||||
@@ -120,10 +121,22 @@ class LahanController extends Controller
|
|||||||
? $profile->desa_kelurahan_id
|
? $profile->desa_kelurahan_id
|
||||||
: ($validated['desa_kelurahan_id'] ?? $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([
|
$lahan = Lahan::create([
|
||||||
...$validated,
|
'nama' => $validated['nama'],
|
||||||
'profile_id' => $profile->id,
|
'status_kepemilikan' => $validated['status_kepemilikan'],
|
||||||
'desa_kelurahan_id' => $desaKelurahanId,
|
'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))
|
return (new LahanResource($lahan))
|
||||||
@@ -153,7 +166,7 @@ class LahanController extends Controller
|
|||||||
/**
|
/**
|
||||||
* Update the specified resource in storage.
|
* 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'])) {
|
if (!Gate::any(['petani', 'fasilitator','super_admin'])) {
|
||||||
abort(403);
|
abort(403);
|
||||||
@@ -173,9 +186,26 @@ class LahanController extends Controller
|
|||||||
'path' => ['nullable', 'array'],
|
'path' => ['nullable', 'array'],
|
||||||
'path.*' => ['array'],
|
'path.*' => ['array'],
|
||||||
'luas_lahan' => ['nullable', 'numeric'],
|
'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();
|
return (new LahanResource($lahan))->response();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -17,12 +17,12 @@ class ProfilPetaniController extends Controller
|
|||||||
{
|
{
|
||||||
public function index()
|
public function index()
|
||||||
{
|
{
|
||||||
if (!Gate::allows('super_admin') && !Gate::allows('admin')) {
|
if (!Gate::any(['super_admin', 'admin', 'fasilitator'])) {
|
||||||
abort(403);
|
abort(403);
|
||||||
}
|
}
|
||||||
$title = 'Dashboard Profil Petani';
|
$title = 'Dashboard Profil Petani';
|
||||||
|
|
||||||
$komoditas = Komoditas::all();
|
$komoditas = Komoditas::where('is_utama', true)->get();
|
||||||
|
|
||||||
$petani = Petani::pluck('id');
|
$petani = Petani::pluck('id');
|
||||||
$lahan = Lahan::whereIn('petani_id', $petani)->get();
|
$lahan = Lahan::whereIn('petani_id', $petani)->get();
|
||||||
@@ -35,8 +35,8 @@ class ProfilPetaniController extends Controller
|
|||||||
->get();
|
->get();
|
||||||
$lahanSummary = Lahan::select(
|
$lahanSummary = Lahan::select(
|
||||||
'komoditas_id',
|
'komoditas_id',
|
||||||
DB::raw('COUNT(*) as total',
|
DB::raw('COUNT(*) as total'),
|
||||||
DB::raw('SUM(luas_lahan) as luas_lahan'))
|
DB::raw('SUM(luas_lahan) as luas_lahan')
|
||||||
)
|
)
|
||||||
->whereIn('petani_id', $petani)
|
->whereIn('petani_id', $petani)
|
||||||
->groupBy('komoditas_id')
|
->groupBy('komoditas_id')
|
||||||
@@ -74,6 +74,63 @@ class ProfilPetaniController extends Controller
|
|||||||
->groupBy('petani.komoditas_id')
|
->groupBy('petani.komoditas_id')
|
||||||
->groupByRaw($case)
|
->groupByRaw($case)
|
||||||
->get();
|
->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',
|
return view('dashboard.petani', compact('title',
|
||||||
'komoditas',
|
'komoditas',
|
||||||
@@ -81,7 +138,13 @@ class ProfilPetaniController extends Controller
|
|||||||
'lahanSummary',
|
'lahanSummary',
|
||||||
'tanamanSummary',
|
'tanamanSummary',
|
||||||
'skorSummary',
|
'skorSummary',
|
||||||
'skorKomoditasSummary'
|
'skorKomoditasSummary',
|
||||||
|
'segmenAverage',
|
||||||
|
'skorAverage',
|
||||||
|
'skorDimensi',
|
||||||
|
'skorKomponen',
|
||||||
|
'skorMultiDimensi',
|
||||||
|
'petani',
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ use App\Models\User;
|
|||||||
use App\Models\Pertanian\Petani;
|
use App\Models\Pertanian\Petani;
|
||||||
use App\Models\Pertanian\Komoditas;
|
use App\Models\Pertanian\Komoditas;
|
||||||
use App\Models\Pertanian\Lahan;
|
use App\Models\Pertanian\Lahan;
|
||||||
|
use App\Models\Pertanian\Tanaman;
|
||||||
use App\Models\Pertanian\SurveyPelatihan;
|
use App\Models\Pertanian\SurveyPelatihan;
|
||||||
use App\Models\Pertanian\SurveySertifikasi;
|
use App\Models\Pertanian\SurveySertifikasi;
|
||||||
|
|
||||||
@@ -57,6 +58,7 @@ class SurveyPetaniController extends Controller
|
|||||||
->leftJoin("{$komoditasTable} as k", 'k.id', '=', 'p.komoditas_id')
|
->leftJoin("{$komoditasTable} as k", 'k.id', '=', 'p.komoditas_id')
|
||||||
->selectRaw("COALESCE(k.nama, 'Belum ditentukan') as nama")
|
->selectRaw("COALESCE(k.nama, 'Belum ditentukan') as nama")
|
||||||
->selectRaw('COUNT(p.id) as petani_count')
|
->selectRaw('COUNT(p.id) as petani_count')
|
||||||
|
->where('k.is_utama', true)
|
||||||
->groupBy('k.id', 'k.nama')
|
->groupBy('k.id', 'k.nama')
|
||||||
->orderByDesc('petani_count')
|
->orderByDesc('petani_count')
|
||||||
->get();
|
->get();
|
||||||
@@ -142,23 +144,29 @@ class SurveyPetaniController extends Controller
|
|||||||
|
|
||||||
// Ringkasan lahan
|
// Ringkasan lahan
|
||||||
|
|
||||||
$totalLuasLahan = (float) Lahan::query()
|
$totalLuasLahan = ((float) Lahan::query()
|
||||||
->sum('luas_lahan');
|
->sum('luas_lahan')) / 10000;
|
||||||
|
|
||||||
$totalJumlahTanaman = (int) Lahan::query()
|
|
||||||
->sum('jumlah_tanaman');
|
|
||||||
|
|
||||||
// Jumlah tanaman berdasarkan komoditas petani
|
// Jumlah tanaman berdasarkan komoditas petani
|
||||||
|
|
||||||
$tanamanPerKomoditasCollection = DB::table("{$lahanTable} as l")
|
$tanamanTable = (new Tanaman())->getTable();
|
||||||
|
|
||||||
|
$tanamanPerKomoditasCollection = DB::table("{$tanamanTable} as t")
|
||||||
|
->join("{$lahanTable} as l", 'l.id', '=', 't.lahan_id')
|
||||||
->join("{$petaniTable} as p", 'p.id', '=', 'l.petani_id')
|
->join("{$petaniTable} as p", 'p.id', '=', 'l.petani_id')
|
||||||
->leftJoin("{$komoditasTable} as k", 'k.id', '=', 'p.komoditas_id')
|
->leftJoin("{$komoditasTable} as k", 'k.id', '=', 't.komoditas_id')
|
||||||
->selectRaw("COALESCE(k.nama, 'Belum ditentukan') as label")
|
->selectRaw("COALESCE(k.nama, 'Belum ditentukan') as label")
|
||||||
->selectRaw('COALESCE(SUM(l.jumlah_tanaman), 0) as total')
|
->selectRaw('COUNT(t.id) as total')
|
||||||
|
->where('k.is_utama', true)
|
||||||
|
->whereNull('t.deleted_at')
|
||||||
|
->whereNull('l.deleted_at')
|
||||||
|
->whereNull('p.deleted_at')
|
||||||
->groupBy('k.id', 'k.nama')
|
->groupBy('k.id', 'k.nama')
|
||||||
->orderByDesc('total')
|
->orderByDesc('total')
|
||||||
->get();
|
->get();
|
||||||
|
|
||||||
|
$totalJumlahTanaman = (int) $tanamanPerKomoditasCollection->sum('total');
|
||||||
|
|
||||||
$tanamanPerKomoditas = $tanamanPerKomoditasCollection
|
$tanamanPerKomoditas = $tanamanPerKomoditasCollection
|
||||||
->map(function ($item, $index) use ($colors, $totalJumlahTanaman) {
|
->map(function ($item, $index) use ($colors, $totalJumlahTanaman) {
|
||||||
$color = $colors[$index % count($colors)];
|
$color = $colors[$index % count($colors)];
|
||||||
|
|||||||
@@ -28,9 +28,15 @@ class AuthController extends Controller
|
|||||||
public function createAccount(Request $request)
|
public function createAccount(Request $request)
|
||||||
{
|
{
|
||||||
$credentials = $request->validate([
|
$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',
|
'email' => 'required|string|email|max:255|unique:users,email',
|
||||||
'password' => 'required|string|min:8|confirmed',
|
'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([
|
$user = User::create([
|
||||||
@@ -89,6 +95,9 @@ class AuthController extends Controller
|
|||||||
$request->validate([
|
$request->validate([
|
||||||
'email_username' => 'required|string',
|
'email_username' => 'required|string',
|
||||||
'password' => 'required|string',
|
'password' => 'required|string',
|
||||||
|
], [
|
||||||
|
'email_username.required' => 'Email atau username harus diisi.',
|
||||||
|
'password.required' => 'Password harus diisi.',
|
||||||
]);
|
]);
|
||||||
|
|
||||||
$login = $request->input('email_username');
|
$login = $request->input('email_username');
|
||||||
|
|||||||
@@ -99,18 +99,20 @@ class UserController extends Controller
|
|||||||
public function store(Request $request)
|
public function store(Request $request)
|
||||||
{
|
{
|
||||||
$validator = Validator::make($request->all(), [
|
$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'],
|
'nama' => ['required', 'string', 'max:255'],
|
||||||
'email' => ['required', 'string', 'email', 'max:255', 'unique:users,email'],
|
'email' => ['required', 'string', 'email', 'max:255', 'unique:users,email'],
|
||||||
'password' => ['required', 'string', 'min:8', 'confirmed'],
|
'password' => ['required', 'string', 'min:8', 'confirmed'],
|
||||||
'role' => ['required', 'string'],
|
'role' => ['required', 'string'],
|
||||||
'telepon' => ['required', 'max:13'],
|
'telepon' => ['required', 'max:13'],
|
||||||
'desa_kelurahan_id' => ['required'],
|
'desa_kelurahan_id' => ['nullable', 'exists:desa_kelurahan,id'],
|
||||||
'ktp' => ['nullable', 'min:16', 'max:16'],
|
'ktp' => ['nullable', 'min:16', 'max:16'],
|
||||||
'kk' => ['nullable', 'min:16', 'max:16'],
|
'kk' => ['nullable', 'min:16', 'max:16'],
|
||||||
'file_ktp' => ['nullable', 'file', 'mimes:jpeg,jpg,png,pdf', 'max:2048'],
|
'file_ktp' => ['nullable', 'file', 'mimes:jpeg,jpg,png,pdf', 'max:2048'],
|
||||||
'file_kk' => ['nullable', 'file', 'mimes:jpeg,jpg,pdf,png', '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.confirmed' => 'Konfirmasi password tidak cocok!',
|
||||||
'password.min' => 'Password minimal 8 karakter!',
|
'password.min' => 'Password minimal 8 karakter!',
|
||||||
'email.unique' => 'Email sudah terdaftar.',
|
'email.unique' => 'Email sudah terdaftar.',
|
||||||
|
|||||||
@@ -28,9 +28,13 @@ class KomoditasController extends Controller
|
|||||||
public function store(Request $request)
|
public function store(Request $request)
|
||||||
{
|
{
|
||||||
$validator = Validator::make($request->all(), [
|
$validator = Validator::make($request->all(), [
|
||||||
'nama' => ['required', 'string', 'max:255', 'unique:master_komoditas,nama'], // Tambah unique biar nggak ada data kembar
|
'nama' => ['required', 'string', 'max:255', 'unique:master_komoditas,nama'],
|
||||||
|
'kode' => ['required', 'string', 'max:2', 'unique:master_komoditas,kode'],
|
||||||
|
'is_utama' => ['nullable', 'boolean'],
|
||||||
], [
|
], [
|
||||||
'nama.unique' => 'Nama komoditas ini sudah ada di database.'
|
'nama.unique' => 'Nama komoditas ini sudah ada di database.',
|
||||||
|
'kode.unique' => 'Kode komoditas ini sudah ada di database.',
|
||||||
|
'kode.max' => 'Kode komoditas maksimal 2 Digit.'
|
||||||
]);
|
]);
|
||||||
|
|
||||||
if ($validator->fails()) {
|
if ($validator->fails()) {
|
||||||
@@ -39,6 +43,8 @@ class KomoditasController extends Controller
|
|||||||
|
|
||||||
Komoditas::create([
|
Komoditas::create([
|
||||||
'nama' => $request->nama,
|
'nama' => $request->nama,
|
||||||
|
'kode' => $request->kode,
|
||||||
|
'is_utama' => $request->is_utama,
|
||||||
'created_by' => auth()->id(),
|
'created_by' => auth()->id(),
|
||||||
'updated_by' => auth()->id(),
|
'updated_by' => auth()->id(),
|
||||||
]);
|
]);
|
||||||
@@ -55,9 +61,13 @@ class KomoditasController extends Controller
|
|||||||
public function update(Request $request, $id)
|
public function update(Request $request, $id)
|
||||||
{
|
{
|
||||||
$validator = Validator::make($request->all(), [
|
$validator = Validator::make($request->all(), [
|
||||||
'nama' => ['required', 'string', 'max:255', 'unique:master_komoditas,nama,' . $id],
|
'nama' => ['required', 'string', 'max:255', 'unique:master_komoditas,nama,' . $id],
|
||||||
|
'kode' => ['required', 'string', 'max:2', 'unique:master_komoditas,kode,' . $id],
|
||||||
|
'is_utama' => ['nullable', 'boolean'],
|
||||||
], [
|
], [
|
||||||
'nama.unique' => 'Nama komoditas ini sudah digunakan.'
|
'nama.unique' => 'Nama komoditas ini sudah ada di database.',
|
||||||
|
'kode.unique' => 'Kode komoditas ini sudah ada di database.',
|
||||||
|
'kode.max' => 'Kode komoditas maksimal 2 Digit.'
|
||||||
]);
|
]);
|
||||||
|
|
||||||
if ($validator->fails()) {
|
if ($validator->fails()) {
|
||||||
@@ -66,8 +76,10 @@ class KomoditasController extends Controller
|
|||||||
|
|
||||||
$komoditas = Komoditas::findOrFail($id);
|
$komoditas = Komoditas::findOrFail($id);
|
||||||
$komoditas->update([
|
$komoditas->update([
|
||||||
'nama' => $request->nama,
|
'nama' => $request->nama,
|
||||||
'updated_by' => auth()->id(),
|
'kode' => $request->kode,
|
||||||
|
'is_utama' => $request->is_utama,
|
||||||
|
'updated_by' => auth()->id(),
|
||||||
]);
|
]);
|
||||||
|
|
||||||
return response()->json(['status' => 'success', 'message' => 'Komoditas berhasil diupdate.']);
|
return response()->json(['status' => 'success', 'message' => 'Komoditas berhasil diupdate.']);
|
||||||
|
|||||||
@@ -25,9 +25,25 @@ class AksesPasarController extends Controller
|
|||||||
|
|
||||||
$aksesPasar = AksesPasar::where('petani_id', $petaniId)->first();
|
$aksesPasar = AksesPasar::where('petani_id', $petaniId)->first();
|
||||||
$hargaJualPanen = HargaJualPanen::where('petani_id', $petaniId)->get();
|
$hargaJualPanen = HargaJualPanen::where('petani_id', $petaniId)->get();
|
||||||
|
$hargaJualRows = collect([
|
||||||
|
'Buah segar hasil petik',
|
||||||
|
'Biji basah',
|
||||||
|
'Biji kering/Biji Kupas',
|
||||||
|
'Terfermentasi (Rp/kg)',
|
||||||
|
])->map(function (string $bentuk, int $index) use ($hargaJualPanen) {
|
||||||
|
$existingData = $hargaJualPanen->firstWhere('bentuk_produk', $bentuk);
|
||||||
|
|
||||||
|
return [
|
||||||
|
'index' => $index,
|
||||||
|
'bentuk' => $bentuk,
|
||||||
|
'harga_panen_terakhir' => $this->currencyForDisplay($existingData?->harga_panen_terakhir),
|
||||||
|
'harga_tahun_lalu' => $this->currencyForDisplay($existingData?->harga_tahun_lalu),
|
||||||
|
'harga_dua_tahun_lalu' => $this->currencyForDisplay($existingData?->harga_dua_tahun_lalu),
|
||||||
|
];
|
||||||
|
});
|
||||||
|
|
||||||
return view('produktivitas.petani.akses-pasar.index', array_merge(
|
return view('produktivitas.petani.akses-pasar.index', array_merge(
|
||||||
compact('petani', 'aksesPasar', 'hargaJualPanen'),
|
compact('petani', 'aksesPasar', 'hargaJualPanen', 'hargaJualRows'),
|
||||||
$this->aksesPasarOptions()
|
$this->aksesPasarOptions()
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
@@ -251,4 +267,11 @@ class AksesPasarController extends Controller
|
|||||||
$digits = preg_replace('/\D/', '', (string) $value);
|
$digits = preg_replace('/\D/', '', (string) $value);
|
||||||
return $digits === '' ? null : $digits;
|
return $digits === '' ? null : $digits;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
private function currencyForDisplay(mixed $value): string
|
||||||
|
{
|
||||||
|
$digits = $this->currencyDigits($value);
|
||||||
|
|
||||||
|
return is_null($digits) ? '' : number_format((int) $digits, 0, ',', '.');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -77,10 +77,11 @@ class PendidikanPelatihanController extends Controller
|
|||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
return back()->with('success', 'Riwayat pelatihan berhasil disimpan.');
|
return $this->redirectBackToFragment($request, 'section-sertifikasi')
|
||||||
|
->with('success', 'Riwayat pelatihan berhasil disimpan.');
|
||||||
}
|
}
|
||||||
|
|
||||||
public function destroyPelatihan(Petani $petani, SurveyPelatihan $surveyPelatihan)
|
public function destroyPelatihan(Request $request, Petani $petani, SurveyPelatihan $surveyPelatihan)
|
||||||
{
|
{
|
||||||
$this->authorizeAccess();
|
$this->authorizeAccess();
|
||||||
|
|
||||||
@@ -92,7 +93,8 @@ class PendidikanPelatihanController extends Controller
|
|||||||
|
|
||||||
$surveyPelatihan->delete();
|
$surveyPelatihan->delete();
|
||||||
|
|
||||||
return back()->with('success', 'Riwayat pelatihan berhasil dihapus.');
|
return $this->redirectBackToFragment($request, 'section-pelatihan')
|
||||||
|
->with('success', 'Riwayat pelatihan berhasil dihapus.');
|
||||||
}
|
}
|
||||||
|
|
||||||
public function storeSertifikasi(Request $request, Petani $petani)
|
public function storeSertifikasi(Request $request, Petani $petani)
|
||||||
@@ -155,10 +157,11 @@ class PendidikanPelatihanController extends Controller
|
|||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
return back()->with('success', 'Sertifikasi berhasil disimpan.');
|
return $this->redirectBackToFragment($request, 'section-sertifikasi')
|
||||||
|
->with('success', 'Sertifikasi berhasil disimpan.');
|
||||||
}
|
}
|
||||||
|
|
||||||
public function destroySertifikasi(Petani $petani, SurveySertifikasi $surveySertifikasi)
|
public function destroySertifikasi(Request $request, Petani $petani, SurveySertifikasi $surveySertifikasi)
|
||||||
{
|
{
|
||||||
$this->authorizeAccess();
|
$this->authorizeAccess();
|
||||||
|
|
||||||
@@ -170,6 +173,18 @@ class PendidikanPelatihanController extends Controller
|
|||||||
|
|
||||||
$surveySertifikasi->delete();
|
$surveySertifikasi->delete();
|
||||||
|
|
||||||
return back()->with('success', 'Sertifikasi berhasil dihapus.');
|
return $this->redirectBackToFragment($request, 'section-sertifikasi')
|
||||||
|
->with('success', 'Sertifikasi berhasil dihapus.');
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
private function redirectBackToFragment(Request $request, string $defaultFragment)
|
||||||
|
{
|
||||||
|
$fragment = $request->input('redirect_fragment', $defaultFragment);
|
||||||
|
|
||||||
|
if (!is_string($fragment) || !preg_match('/^[A-Za-z0-9_-]+$/', $fragment)) {
|
||||||
|
$fragment = $defaultFragment;
|
||||||
|
}
|
||||||
|
|
||||||
|
return redirect()->to(Str::before(url()->previous(), '#') . '#' . $fragment);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -15,6 +15,9 @@ use App\Models\Wilayah\Provinsi;
|
|||||||
use App\Models\Pertanian\Petani;
|
use App\Models\Pertanian\Petani;
|
||||||
use App\Models\Wilayah\DesaKelurahan;
|
use App\Models\Wilayah\DesaKelurahan;
|
||||||
use App\Models\Pertanian\Komoditas;
|
use App\Models\Pertanian\Komoditas;
|
||||||
|
use App\Models\Pertanian\Tanaman;
|
||||||
|
use App\Models\Pertanian\Lahan;
|
||||||
|
use App\Models\Pertanian\SkorPetani;
|
||||||
|
|
||||||
use App\Enums\Pendidikan;
|
use App\Enums\Pendidikan;
|
||||||
use App\Enums\Pekerjaan;
|
use App\Enums\Pekerjaan;
|
||||||
@@ -27,6 +30,10 @@ class PetaniController extends Controller
|
|||||||
*/
|
*/
|
||||||
public function index(Request $request)
|
public function index(Request $request)
|
||||||
{
|
{
|
||||||
|
if (!Gate::any(['super_admin', 'admin', 'fasilitator'])) {
|
||||||
|
abort(403);
|
||||||
|
}
|
||||||
|
|
||||||
$provinsi = Provinsi::orderBy('kode', 'asc')->get();
|
$provinsi = Provinsi::orderBy('kode', 'asc')->get();
|
||||||
|
|
||||||
$query = Petani::with('desakelurahan')
|
$query = Petani::with('desakelurahan')
|
||||||
@@ -39,9 +46,35 @@ class PetaniController extends Controller
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (auth()->user()->role->value === 'fasilitator') {
|
||||||
|
$query->where('created_by', auth()->user()->id);
|
||||||
|
}
|
||||||
|
|
||||||
|
$summaryPetaniIds = (clone $query)->pluck('id');
|
||||||
$petani = $query->paginate($request->per_page ?? 10);
|
$petani = $query->paginate($request->per_page ?? 10);
|
||||||
|
|
||||||
return view('produktivitas.petani.index', compact('petani', 'provinsi'));
|
$komoditas = Komoditas::where('is_utama', true)->get();
|
||||||
|
$lahan = Lahan::whereIn('petani_id', $summaryPetaniIds)
|
||||||
|
->whereIn('komoditas_id', $komoditas->pluck('id'))
|
||||||
|
->get();
|
||||||
|
$tanaman = Tanaman::whereIn('lahan_id', $lahan->pluck('id'))
|
||||||
|
->get();
|
||||||
|
|
||||||
|
$case = "
|
||||||
|
CASE
|
||||||
|
WHEN skor_kesiapan_adopsi >= 4.0 THEN 'Penggerak'
|
||||||
|
WHEN skor_kesiapan_adopsi >= 3.0 THEN 'Perintis'
|
||||||
|
WHEN skor_kesiapan_adopsi >= 2.0 THEN 'Pemerhati'
|
||||||
|
WHEN skor_kesiapan_adopsi >= 1.0 THEN 'Pemula'
|
||||||
|
ELSE 'Belum Lengkap'
|
||||||
|
END
|
||||||
|
";
|
||||||
|
$skor = SkorPetani::selectRaw("$case AS segmen, COUNT(*) AS total")
|
||||||
|
->whereIn('petani_id', $summaryPetaniIds)
|
||||||
|
->groupByRaw($case)
|
||||||
|
->get();
|
||||||
|
|
||||||
|
return view('produktivitas.petani.index', compact('petani', 'provinsi', 'lahan', 'komoditas', 'tanaman', 'skor'));
|
||||||
}
|
}
|
||||||
|
|
||||||
public function create()
|
public function create()
|
||||||
@@ -54,7 +87,7 @@ class PetaniController extends Controller
|
|||||||
$pekerjaan = Pekerjaan::options();
|
$pekerjaan = Pekerjaan::options();
|
||||||
$pernikahan = Pernikahan::options();
|
$pernikahan = Pernikahan::options();
|
||||||
|
|
||||||
$komoditas = Komoditas::all();
|
$komoditas = Komoditas::where('is_utama', true)->get();
|
||||||
|
|
||||||
$provinsi = Provinsi::orderBy('kode', 'asc')->get();
|
$provinsi = Provinsi::orderBy('kode', 'asc')->get();
|
||||||
|
|
||||||
@@ -145,7 +178,7 @@ class PetaniController extends Controller
|
|||||||
'created_by' => auth()->id(),
|
'created_by' => auth()->id(),
|
||||||
'updated_by' => auth()->id()]);
|
'updated_by' => auth()->id()]);
|
||||||
|
|
||||||
return redirect()->route('petani.index')->with('success', 'Data petani berhasil ditambahkan.');
|
return redirect()->route('petani.edit', $petani->id)->with('success', 'Data petani berhasil ditambahkan.');
|
||||||
}
|
}
|
||||||
|
|
||||||
public function show(string $id)
|
public function show(string $id)
|
||||||
@@ -174,7 +207,7 @@ class PetaniController extends Controller
|
|||||||
|
|
||||||
$provinsi = Provinsi::all();
|
$provinsi = Provinsi::all();
|
||||||
|
|
||||||
$komoditas = Komoditas::all();
|
$komoditas = Komoditas::where('is_utama', true)->get();
|
||||||
|
|
||||||
return view('produktivitas.petani.edit', compact('petani', 'pendidikan', 'pekerjaan',
|
return view('produktivitas.petani.edit', compact('petani', 'pendidikan', 'pekerjaan',
|
||||||
'pernikahan', 'provinsi', 'komoditas'));
|
'pernikahan', 'provinsi', 'komoditas'));
|
||||||
@@ -191,6 +224,13 @@ class PetaniController extends Controller
|
|||||||
|
|
||||||
$validatedData = $this->validatePetani($request);
|
$validatedData = $this->validatePetani($request);
|
||||||
|
|
||||||
|
if ($request->input('hapus_foto') == '1') {
|
||||||
|
if ($petani->foto && Storage::exists($petani->foto)) {
|
||||||
|
Storage::delete($petani->foto);
|
||||||
|
}
|
||||||
|
$validatedData['foto'] = null;
|
||||||
|
}
|
||||||
|
|
||||||
if ($request->hasFile('file_ktp')) {
|
if ($request->hasFile('file_ktp')) {
|
||||||
$file_ktp = $request->file('file_ktp');
|
$file_ktp = $request->file('file_ktp');
|
||||||
$validatedData['path_ktp'] = $file_ktp->store('petani/ktp');
|
$validatedData['path_ktp'] = $file_ktp->store('petani/ktp');
|
||||||
@@ -202,6 +242,10 @@ class PetaniController extends Controller
|
|||||||
$validatedData['file_kk'] = $file_kk->getClientOriginalName();
|
$validatedData['file_kk'] = $file_kk->getClientOriginalName();
|
||||||
}
|
}
|
||||||
if ($request->hasFile('foto')) {
|
if ($request->hasFile('foto')) {
|
||||||
|
|
||||||
|
if ($petani->foto && Storage::exists($petani->foto)) {
|
||||||
|
Storage::delete($petani->foto);
|
||||||
|
}
|
||||||
$file_foto = $request->file('foto');
|
$file_foto = $request->file('foto');
|
||||||
$validatedData['foto'] = $file_foto->store('petani/foto');
|
$validatedData['foto'] = $file_foto->store('petani/foto');
|
||||||
}
|
}
|
||||||
@@ -209,7 +253,7 @@ class PetaniController extends Controller
|
|||||||
$petani->update([...$validatedData,
|
$petani->update([...$validatedData,
|
||||||
'updated_by' => auth()->id()]);
|
'updated_by' => auth()->id()]);
|
||||||
|
|
||||||
return redirect()->route('petani.index')->with('success', 'Data petani berhasil diupdate.');
|
return redirect()->route('petani.edit', $petani->id)->with('success', 'Data petani berhasil diupdate.');
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ use Illuminate\Http\Request;
|
|||||||
use Illuminate\Support\Facades\Gate;
|
use Illuminate\Support\Facades\Gate;
|
||||||
use Illuminate\Support\Facades\Validator;
|
use Illuminate\Support\Facades\Validator;
|
||||||
use Illuminate\Support\Facades\DB;
|
use Illuminate\Support\Facades\DB;
|
||||||
|
use Illuminate\Support\Facades\Schema;
|
||||||
use Illuminate\Support\Facades\Storage;
|
use Illuminate\Support\Facades\Storage;
|
||||||
use Illuminate\Support\Str;
|
use Illuminate\Support\Str;
|
||||||
use Illuminate\Validation\Rules\Enum;
|
use Illuminate\Validation\Rules\Enum;
|
||||||
@@ -17,7 +18,9 @@ use App\Models\Pertanian\Lahan;
|
|||||||
use App\Models\Wilayah\DesaKelurahan;
|
use App\Models\Wilayah\DesaKelurahan;
|
||||||
use App\Models\Wilayah\Provinsi;
|
use App\Models\Wilayah\Provinsi;
|
||||||
use App\Models\Pertanian\Komoditas;
|
use App\Models\Pertanian\Komoditas;
|
||||||
|
use App\Models\Pertanian\PraktikBudidaya;
|
||||||
use App\Models\Pertanian\Tanaman;
|
use App\Models\Pertanian\Tanaman;
|
||||||
|
use App\Models\Master\JenisTanaman;
|
||||||
|
|
||||||
use App\Enums\StatusLahan;
|
use App\Enums\StatusLahan;
|
||||||
use App\Enums\KondisiTanaman;
|
use App\Enums\KondisiTanaman;
|
||||||
@@ -62,8 +65,47 @@ class PetaniLahanController extends Controller
|
|||||||
$provinsi = Provinsi::orderBy('kode', 'asc')->get();
|
$provinsi = Provinsi::orderBy('kode', 'asc')->get();
|
||||||
|
|
||||||
$komoditas = Komoditas::all();
|
$komoditas = Komoditas::all();
|
||||||
|
$tanamanPenaung = JenisTanaman::all();
|
||||||
|
$autoPestDiseaseData = $this->autoPestDiseaseData($petaniId);
|
||||||
|
$jenisHamaOtomatis = $autoPestDiseaseData['jenis_hama'];
|
||||||
|
$jenisPenyakitOtomatis = $autoPestDiseaseData['jenis_penyakit'];
|
||||||
|
|
||||||
return view('produktivitas.petani.lahan.add', compact('petani', 'lahan', 'provinsi', 'komoditas'));
|
return view('produktivitas.petani.lahan.add', compact('petani', 'lahan', 'provinsi', 'komoditas', 'tanamanPenaung', 'jenisHamaOtomatis', 'jenisPenyakitOtomatis'));
|
||||||
|
}
|
||||||
|
|
||||||
|
private function autoPestDiseaseData(string|int $petaniId): array
|
||||||
|
{
|
||||||
|
$praktikBudidaya = PraktikBudidaya::where('petani_id', $petaniId)->latest()->first();
|
||||||
|
|
||||||
|
return [
|
||||||
|
'jenis_hama' => $this->normalizeArrayValue($praktikBudidaya?->jenis_hama),
|
||||||
|
'jenis_penyakit' => $this->normalizeArrayValue($praktikBudidaya?->jenis_penyakit),
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
private function normalizeArrayValue(mixed $value): array
|
||||||
|
{
|
||||||
|
if (is_array($value)) {
|
||||||
|
return array_values(array_filter($value, fn ($item) => filled($item)));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (is_string($value) && $value !== '') {
|
||||||
|
$decoded = json_decode($value, true);
|
||||||
|
|
||||||
|
if (is_array($decoded)) {
|
||||||
|
return array_values(array_filter($decoded, fn ($item) => filled($item)));
|
||||||
|
}
|
||||||
|
|
||||||
|
return [$value];
|
||||||
|
}
|
||||||
|
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
|
||||||
|
private function hasPestDiseaseColumns(string $table): bool
|
||||||
|
{
|
||||||
|
return Schema::hasColumn($table, 'jenis_hama')
|
||||||
|
&& Schema::hasColumn($table, 'jenis_penyakit');
|
||||||
}
|
}
|
||||||
|
|
||||||
private function validateLahan(Request $request)
|
private function validateLahan(Request $request)
|
||||||
@@ -81,8 +123,8 @@ class PetaniLahanController extends Controller
|
|||||||
'komoditas_id' => ['required', 'exists:master_komoditas,id'],
|
'komoditas_id' => ['required', 'exists:master_komoditas,id'],
|
||||||
'jenis_komoditas_id' => ['required', 'exists:jenis_komoditas,id'],
|
'jenis_komoditas_id' => ['required', 'exists:jenis_komoditas,id'],
|
||||||
'varietas_id' => ['nullable', 'exists:master_varietas,id'],
|
'varietas_id' => ['nullable', 'exists:master_varietas,id'],
|
||||||
'jumlah_tanaman' => ['required', 'numeric', 'min:1'],
|
'jumlah_tanaman' => ['nullable', 'numeric', 'min:0'],
|
||||||
'umur_lahan' => ['required', 'numeric', 'min:1'],
|
'umur_lahan' => ['nullable', 'numeric', 'min:1'],
|
||||||
'umur_tanaman' => ['required', 'numeric', 'min:1'],
|
'umur_tanaman' => ['required', 'numeric', 'min:1'],
|
||||||
'kondisi_tanaman' => ['required', 'string', new Enum(KondisiTanaman::class)],
|
'kondisi_tanaman' => ['required', 'string', new Enum(KondisiTanaman::class)],
|
||||||
'serangan_hama' => ['nullable', 'string', new Enum(SeranganHama::class)],
|
'serangan_hama' => ['nullable', 'string', new Enum(SeranganHama::class)],
|
||||||
@@ -91,7 +133,7 @@ class PetaniLahanController extends Controller
|
|||||||
'komoditas_lain' => ['nullable', 'array'],
|
'komoditas_lain' => ['nullable', 'array'],
|
||||||
'komoditas_lain.*' => ['integer', 'exists:master_komoditas,id'],
|
'komoditas_lain.*' => ['integer', 'exists:master_komoditas,id'],
|
||||||
'tanaman_penaung' => ['nullable', 'array'],
|
'tanaman_penaung' => ['nullable', 'array'],
|
||||||
'tanaman_penaung.*' => ['integer', 'exists:master_komoditas,id'],
|
'tanaman_penaung.*' => ['string'],
|
||||||
'foto' => ['nullable', 'array'],
|
'foto' => ['nullable', 'array'],
|
||||||
'foto.*' => ['image', 'mimes:jpeg,jpg,png', 'max:2048'],
|
'foto.*' => ['image', 'mimes:jpeg,jpg,png', 'max:2048'],
|
||||||
], [
|
], [
|
||||||
@@ -102,10 +144,10 @@ class PetaniLahanController extends Controller
|
|||||||
'luas_lahan.required' => 'Luas lahan wajib diisi.',
|
'luas_lahan.required' => 'Luas lahan wajib diisi.',
|
||||||
'luas_lahan.numeric' => 'Luas lahan diisi dengan angka.',
|
'luas_lahan.numeric' => 'Luas lahan diisi dengan angka.',
|
||||||
'luas_lahan.min' => 'Luas lahan minimal 0.01.',
|
'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.numeric' => 'Jumlah tanaman diisi dengan angka.',
|
||||||
'jumlah_tanaman.min' => 'Jumlah tanaman minimal 1.',
|
'jumlah_tanaman.min' => 'Jumlah tanaman minimal 0.',
|
||||||
'umur_lahan.required' => 'Umur lahan wajib diisi.',
|
//'umur_lahan.required' => 'Umur lahan wajib diisi.',
|
||||||
'umur_lahan.numeric' => 'Umur lahan diisi dengan angka.',
|
'umur_lahan.numeric' => 'Umur lahan diisi dengan angka.',
|
||||||
'umur_lahan.min' => 'Umur lahan minimal 1.',
|
'umur_lahan.min' => 'Umur lahan minimal 1.',
|
||||||
'umur_tanaman.required' => 'Umur tanaman wajib diisi.',
|
'umur_tanaman.required' => 'Umur tanaman wajib diisi.',
|
||||||
@@ -119,7 +161,7 @@ class PetaniLahanController extends Controller
|
|||||||
'komoditas_lain.array' => 'Komoditas lain diisi dengan array.',
|
'komoditas_lain.array' => 'Komoditas lain diisi dengan array.',
|
||||||
'komoditas_lain.*.exists' => 'Komoditas lain yang dipilih tidak valid.',
|
'komoditas_lain.*.exists' => 'Komoditas lain yang dipilih tidak valid.',
|
||||||
'tanaman_penaung.array' => 'Tanaman penaung diisi dengan array.',
|
'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.array' => 'Foto diisi dengan array.',
|
||||||
'foto.*.image' => 'Foto harus berupa gambar.',
|
'foto.*.image' => 'Foto harus berupa gambar.',
|
||||||
'foto.*.mimes' => 'Foto harus berupa gambar dengan ekstensi jpeg, jpg, atau png.',
|
'foto.*.mimes' => 'Foto harus berupa gambar dengan ekstensi jpeg, jpg, atau png.',
|
||||||
@@ -128,6 +170,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)
|
public function store($petaniId, Request $request)
|
||||||
{
|
{
|
||||||
if (!Gate::any(['super_admin', 'admin', 'fasilitator'])) {
|
if (!Gate::any(['super_admin', 'admin', 'fasilitator'])) {
|
||||||
@@ -136,7 +200,21 @@ class PetaniLahanController extends Controller
|
|||||||
|
|
||||||
$petani = Petani::findOrFail($petaniId);
|
$petani = Petani::findOrFail($petaniId);
|
||||||
|
|
||||||
|
$request->merge([
|
||||||
|
'tanaman_penaung' => collect($request->tanaman_penaung)
|
||||||
|
->map(fn ($nama) => Str::title($nama))
|
||||||
|
->toArray()
|
||||||
|
]);
|
||||||
|
|
||||||
$validated = $this->validateLahan($request);
|
$validated = $this->validateLahan($request);
|
||||||
|
$autoPestDiseaseData = $this->autoPestDiseaseData($petaniId);
|
||||||
|
$lahanHasPestDiseaseColumns = $this->hasPestDiseaseColumns((new Lahan)->getTable());
|
||||||
|
$tanamanHasPestDiseaseColumns = $this->hasPestDiseaseColumns((new Tanaman)->getTable());
|
||||||
|
|
||||||
|
if ($lahanHasPestDiseaseColumns) {
|
||||||
|
$validated = array_merge($validated, $autoPestDiseaseData);
|
||||||
|
}
|
||||||
|
|
||||||
$komoditas = Komoditas::where('id', $request->komoditas_id)->first();
|
$komoditas = Komoditas::where('id', $request->komoditas_id)->first();
|
||||||
$lahanCount = Lahan::where('petani_id', $petaniId)
|
$lahanCount = Lahan::where('petani_id', $petaniId)
|
||||||
->count();
|
->count();
|
||||||
@@ -154,6 +232,8 @@ class PetaniLahanController extends Controller
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$this->syncTanamanPenaung($request);
|
||||||
|
|
||||||
$lahan = Lahan::create([...$validated,
|
$lahan = Lahan::create([...$validated,
|
||||||
'foto' => $foto && count($foto) > 0 ? json_encode($foto) : null,
|
'foto' => $foto && count($foto) > 0 ? json_encode($foto) : null,
|
||||||
'nama' => 'Lahan ' . $komoditas->nama . ' #' . ($lahanCount + 1),
|
'nama' => 'Lahan ' . $komoditas->nama . ' #' . ($lahanCount + 1),
|
||||||
@@ -163,9 +243,9 @@ class PetaniLahanController extends Controller
|
|||||||
'updated_by' => auth()->id()]
|
'updated_by' => auth()->id()]
|
||||||
);
|
);
|
||||||
|
|
||||||
if ($lahan) {
|
if ($lahan && $lahan->jumlah_tanaman > 0) {
|
||||||
$data = collect(range(1, $lahan->jumlah_tanaman))->map(function ($i) use ($lahan, $komoditas, $lahanUid) {
|
$data = collect(range(1, $lahan->jumlah_tanaman))->map(function ($i) use ($lahan, $komoditas, $lahanUid, $autoPestDiseaseData, $tanamanHasPestDiseaseColumns) {
|
||||||
return [
|
$row = [
|
||||||
'lahan_id' => $lahan->id,
|
'lahan_id' => $lahan->id,
|
||||||
'uid' => 'TNM-' . $lahanUid . '-' . strtoupper(Str::random(10)),
|
'uid' => 'TNM-' . $lahanUid . '-' . strtoupper(Str::random(10)),
|
||||||
'komoditas_id' => $lahan->komoditas_id,
|
'komoditas_id' => $lahan->komoditas_id,
|
||||||
@@ -183,6 +263,13 @@ class PetaniLahanController extends Controller
|
|||||||
'created_at' => now(),
|
'created_at' => now(),
|
||||||
'updated_at' => now(),
|
'updated_at' => now(),
|
||||||
];
|
];
|
||||||
|
|
||||||
|
if ($tanamanHasPestDiseaseColumns) {
|
||||||
|
$row['jenis_hama'] = json_encode($autoPestDiseaseData['jenis_hama'] ?? []);
|
||||||
|
$row['jenis_penyakit'] = json_encode($autoPestDiseaseData['jenis_penyakit'] ?? []);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $row;
|
||||||
});
|
});
|
||||||
|
|
||||||
$data->chunk(500)->each(function ($chunk) {
|
$data->chunk(500)->each(function ($chunk) {
|
||||||
@@ -192,13 +279,15 @@ class PetaniLahanController extends Controller
|
|||||||
if ($request->ajax()) {
|
if ($request->ajax()) {
|
||||||
return response()->json([
|
return response()->json([
|
||||||
'success' => true,
|
'success' => true,
|
||||||
'redirect' => route('petani.lahan-tanaman.index', $petaniId),
|
'redirect' => route('petani.lahan-tanaman.edit', [$petaniId, $lahan->id]),
|
||||||
'message' => 'Lahan berhasil ditambahkan.'
|
'message' => 'Lahan berhasil ditambahkan.'
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
return redirect()->route('petani.lahan-tanaman.index', $petaniId)->with('success', 'Lahan berhasil ditambahkan.');
|
return redirect()->route('petani.lahan-tanaman.edit', [$petaniId, $lahan->id])->with('success', 'Lahan berhasil ditambahkan.');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return redirect()->route('petani.lahan-tanaman.edit', [$petaniId, $lahan->id])->with('success', 'Lahan berhasil ditambahkan.');
|
||||||
}
|
}
|
||||||
|
|
||||||
public function show(string $petaniId, string $id)
|
public function show(string $petaniId, string $id)
|
||||||
@@ -234,10 +323,14 @@ class PetaniLahanController extends Controller
|
|||||||
$lahanSelected = Lahan::where('petani_id', $petaniId)->findOrFail($id);
|
$lahanSelected = Lahan::where('petani_id', $petaniId)->findOrFail($id);
|
||||||
|
|
||||||
$komoditas = Komoditas::all();
|
$komoditas = Komoditas::all();
|
||||||
|
$tanamanPenaung = JenisTanaman::all();
|
||||||
|
$autoPestDiseaseData = $this->autoPestDiseaseData($petaniId);
|
||||||
|
$jenisHamaOtomatis = $autoPestDiseaseData['jenis_hama'];
|
||||||
|
$jenisPenyakitOtomatis = $autoPestDiseaseData['jenis_penyakit'];
|
||||||
|
|
||||||
$provinsi = Provinsi::orderBy('kode', 'asc')->get();
|
$provinsi = Provinsi::orderBy('kode', 'asc')->get();
|
||||||
|
|
||||||
return view('produktivitas.petani.lahan.edit', compact('lahan', 'lahanSelected', 'petani', 'komoditas', 'provinsi'));
|
return view('produktivitas.petani.lahan.edit', compact('lahan', 'lahanSelected', 'petani', 'komoditas', 'provinsi', 'tanamanPenaung', 'jenisHamaOtomatis', 'jenisPenyakitOtomatis'));
|
||||||
}
|
}
|
||||||
|
|
||||||
public function update(Request $request, string $petaniId, string $id)
|
public function update(Request $request, string $petaniId, string $id)
|
||||||
@@ -249,14 +342,62 @@ class PetaniLahanController extends Controller
|
|||||||
$petani = Petani::findOrFail($petaniId);
|
$petani = Petani::findOrFail($petaniId);
|
||||||
$lahan = Lahan::where('petani_id', $petaniId)->findOrFail($id);
|
$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);
|
$validated = $this->validateLahan($request);
|
||||||
|
$autoPestDiseaseData = $this->autoPestDiseaseData($petaniId);
|
||||||
|
$lahanHasPestDiseaseColumns = $this->hasPestDiseaseColumns((new Lahan)->getTable());
|
||||||
|
$tanamanHasPestDiseaseColumns = $this->hasPestDiseaseColumns((new Tanaman)->getTable());
|
||||||
|
|
||||||
|
if ($lahanHasPestDiseaseColumns) {
|
||||||
|
$validated = array_merge($validated, $autoPestDiseaseData);
|
||||||
|
}
|
||||||
|
|
||||||
$komoditas = Komoditas::where('id', $request->komoditas_id)->first();
|
$komoditas = Komoditas::where('id', $request->komoditas_id)->first();
|
||||||
$tanamanCount = Tanaman::where('lahan_id', $lahan->id)->count();
|
$tanamanCount = Tanaman::where('lahan_id', $lahan->id)->count();
|
||||||
$lahanCount = Lahan::where('petani_id', $petaniId)->count();
|
$lahanCount = Lahan::where('petani_id', $petaniId)->count();
|
||||||
|
|
||||||
|
$fotoLama = $lahan->foto ?? [];
|
||||||
|
if (is_string($fotoLama)) {
|
||||||
|
$fotoLama = json_decode($fotoLama, true);
|
||||||
|
}
|
||||||
|
if (!is_array($fotoLama)) {
|
||||||
|
$fotoLama = [];
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($request->has('deleted_photos') && is_array($request->deleted_photos)) {
|
||||||
|
foreach ($request->deleted_photos as $deletedPath) {
|
||||||
|
|
||||||
|
if (Storage::disk('public')->exists($deletedPath)) {
|
||||||
|
Storage::disk('public')->delete($deletedPath);
|
||||||
|
}
|
||||||
|
|
||||||
|
$fotoLama = array_filter($fotoLama, function($item) use ($deletedPath) {
|
||||||
|
$currentPath = is_array($item) ? ($item['path'] ?? '') : $item;
|
||||||
|
return $currentPath !== $deletedPath;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$fotoLama = array_values($fotoLama);
|
||||||
|
|
||||||
|
if ($request->hasFile('foto')) {
|
||||||
|
foreach ($request->file('foto') as $file) {
|
||||||
|
$path = $file->store('lahan', 'public');
|
||||||
|
$fotoLama[] = [
|
||||||
|
'path' => $path,
|
||||||
|
'file' => $file->getClientOriginalName(),
|
||||||
|
];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
unset($validated['foto']);
|
||||||
|
|
||||||
$lahan->update([...$validated,
|
$lahan->update([...$validated,
|
||||||
//'nama' => 'Lahan ' . $komoditas->nama . ' #' . ($lahanCount + 1),
|
'foto' => count($fotoLama) > 0 ? json_encode($fotoLama) : null,
|
||||||
//'petani_id' => $petaniId,
|
|
||||||
'updated_by' => auth()->id()]
|
'updated_by' => auth()->id()]
|
||||||
);
|
);
|
||||||
|
|
||||||
@@ -264,9 +405,11 @@ class PetaniLahanController extends Controller
|
|||||||
$lahanUidParts = explode('LHN-', $lahanUid);
|
$lahanUidParts = explode('LHN-', $lahanUid);
|
||||||
$lahanUid = end($lahanUidParts);
|
$lahanUid = end($lahanUidParts);
|
||||||
|
|
||||||
|
$this->syncTanamanPenaung($request);
|
||||||
|
|
||||||
if ($lahan && $lahan->jumlah_tanaman > $tanamanCount) {
|
if ($lahan && $lahan->jumlah_tanaman > $tanamanCount) {
|
||||||
$data = collect(range($tanamanCount + 1, $lahan->jumlah_tanaman))->map(function ($i) use ($lahan, $komoditas, $lahanUid) {
|
$data = collect(range($tanamanCount + 1, $lahan->jumlah_tanaman))->map(function ($i) use ($lahan, $komoditas, $lahanUid, $autoPestDiseaseData, $tanamanHasPestDiseaseColumns) {
|
||||||
return [
|
$row = [
|
||||||
'lahan_id' => $lahan->id,
|
'lahan_id' => $lahan->id,
|
||||||
'komoditas_id' => $lahan->komoditas_id,
|
'komoditas_id' => $lahan->komoditas_id,
|
||||||
'jenis_komoditas_id' => $lahan->jenis_komoditas_id,
|
'jenis_komoditas_id' => $lahan->jenis_komoditas_id,
|
||||||
@@ -284,6 +427,13 @@ class PetaniLahanController extends Controller
|
|||||||
'created_at' => now(),
|
'created_at' => now(),
|
||||||
'updated_at' => now(),
|
'updated_at' => now(),
|
||||||
];
|
];
|
||||||
|
|
||||||
|
if ($tanamanHasPestDiseaseColumns) {
|
||||||
|
$row['jenis_hama'] = json_encode($autoPestDiseaseData['jenis_hama'] ?? []);
|
||||||
|
$row['jenis_penyakit'] = json_encode($autoPestDiseaseData['jenis_penyakit'] ?? []);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $row;
|
||||||
});
|
});
|
||||||
|
|
||||||
$data->chunk(500)->each(function ($chunk) {
|
$data->chunk(500)->each(function ($chunk) {
|
||||||
@@ -291,12 +441,42 @@ class PetaniLahanController extends Controller
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
return redirect()->route('petani.lahan-tanaman.index', $petaniId)->with('success', 'Lahan berhasil ditambahkan.');
|
if ($tanamanHasPestDiseaseColumns) {
|
||||||
|
$lahan->tanaman()->update([
|
||||||
|
'jenis_hama' => json_encode($autoPestDiseaseData['jenis_hama'] ?? []),
|
||||||
|
'jenis_penyakit' => json_encode($autoPestDiseaseData['jenis_penyakit'] ?? []),
|
||||||
|
'updated_by' => auth()->id(),
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($request->ajax()) {
|
||||||
|
return response()->json([
|
||||||
|
'success' => true,
|
||||||
|
'redirect' => route('petani.lahan-tanaman.edit', [$petaniId, $lahan->id]),
|
||||||
|
'message' => 'Lahan berhasil diupdate.'
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
return redirect()->route('petani.lahan-tanaman.edit', [$petaniId, $lahan->id])->with('success', 'Lahan berhasil diperbarui.');
|
||||||
}
|
}
|
||||||
|
|
||||||
public function destroy(string $id)
|
public function destroy(string $petaniId, string $id)
|
||||||
{
|
{
|
||||||
//
|
if (!Gate::any(['super_admin', 'admin', 'fasilitator'])) {
|
||||||
|
abort(403);
|
||||||
|
}
|
||||||
|
|
||||||
|
$lahan = Lahan::findOrFail($id);
|
||||||
|
$lahan->tanaman()->update([
|
||||||
|
'deleted_by' => auth()->id()
|
||||||
|
]);
|
||||||
|
$lahan->tanaman()->delete();
|
||||||
|
$lahan->update([
|
||||||
|
'deleted_by' => auth()->id()
|
||||||
|
]);
|
||||||
|
$lahan->delete();
|
||||||
|
|
||||||
|
return redirect()->route('petani.lahan-tanaman.index', $petaniId)->with('success', 'Lahan berhasil dihapus.');
|
||||||
}
|
}
|
||||||
|
|
||||||
public function summary(string $petaniId)
|
public function summary(string $petaniId)
|
||||||
|
|||||||
@@ -178,8 +178,14 @@ class PraktikBudidayaController extends Controller
|
|||||||
|
|
||||||
$teknik_pemangkasan = array_values($teknik_pemangkasan);
|
$teknik_pemangkasan = array_values($teknik_pemangkasan);
|
||||||
|
|
||||||
|
if ((int) ($validatedData['frekuensi_pemangkasan_komoditas_utama'] ?? 0) === FrekuensiPemangkasanUtama::TIDAK_PERNAH->value) {
|
||||||
|
$teknik_pemangkasan = [];
|
||||||
|
}
|
||||||
|
|
||||||
$petani = Petani::findOrFail($petaniId);
|
$petani = Petani::findOrFail($petaniId);
|
||||||
|
|
||||||
|
$pemupukanTidakPernah = (int) ($validatedData['pemberian_pupuk'] ?? 0) === PemberianPupuk::TIDAK_PERNAH->value;
|
||||||
|
|
||||||
$praktikBudidaya = $petani->praktikBudidaya()->create([
|
$praktikBudidaya = $petani->praktikBudidaya()->create([
|
||||||
'petani_id' => $petani->id,
|
'petani_id' => $petani->id,
|
||||||
'uid' => 'PB-' . strtoupper(Str::random(10)),
|
'uid' => 'PB-' . strtoupper(Str::random(10)),
|
||||||
@@ -193,12 +199,12 @@ class PraktikBudidayaController extends Controller
|
|||||||
'deskripsi_penyerbukan_manual' => $validatedData['alasan_tidak_penyerbukan'] ?? null,
|
'deskripsi_penyerbukan_manual' => $validatedData['alasan_tidak_penyerbukan'] ?? null,
|
||||||
'tingkat_keberhasilan_penyerbukan' => $validatedData['tingkat_keberhasilan_penyerbukan'] ?? null,
|
'tingkat_keberhasilan_penyerbukan' => $validatedData['tingkat_keberhasilan_penyerbukan'] ?? null,
|
||||||
'pemberian_pupuk' => $validatedData['pemberian_pupuk'] ?? null,
|
'pemberian_pupuk' => $validatedData['pemberian_pupuk'] ?? null,
|
||||||
'jenis_pupuk' => $validatedData['jenis_pupuk'] ?? null,
|
'jenis_pupuk' => $pemupukanTidakPernah ? null : ($validatedData['jenis_pupuk'] ?? null),
|
||||||
'frekuensi_pemberian_pupuk' => ($validatedData['frekuensi_pemupukan'] ?? null) === 'Lainnya' ? ($validatedData['frekuensi_pemupukan_lainnya'] ?? null) : ($validatedData['frekuensi_pemupukan'] ?? null),
|
'frekuensi_pemberian_pupuk' => $pemupukanTidakPernah ? null : (($validatedData['frekuensi_pemupukan'] ?? null) === 'Lainnya' ? ($validatedData['frekuensi_pemupukan_lainnya'] ?? null) : ($validatedData['frekuensi_pemupukan'] ?? null)),
|
||||||
'estimasi_dosis_pupuk_organik' => $validatedData['estimasi_dosis_pupuk_organik'] ?? null,
|
'estimasi_dosis_pupuk_organik' => $pemupukanTidakPernah ? null : ($validatedData['estimasi_dosis_pupuk_organik'] ?? null),
|
||||||
'estimasi_dosis_pupuk_anorganik' => $validatedData['estimasi_dosis_pupuk_anorganik'] ?? null,
|
'estimasi_dosis_pupuk_anorganik' => $pemupukanTidakPernah ? null : ($validatedData['estimasi_dosis_pupuk_anorganik'] ?? null),
|
||||||
'waktu_pemberian_pupuk' => ($validatedData['waktu_pemberian_pupuk'] ?? null) === 'Lainnya' ? ($validatedData['waktu_pemberian_pupuk_lainnya'] ?? null) : ($validatedData['waktu_pemberian_pupuk'] ?? null),
|
'waktu_pemberian_pupuk' => $pemupukanTidakPernah ? null : (($validatedData['waktu_pemberian_pupuk'] ?? null) === 'Lainnya' ? ($validatedData['waktu_pemberian_pupuk_lainnya'] ?? null) : ($validatedData['waktu_pemberian_pupuk'] ?? null)),
|
||||||
'cara_pemberian_pupuk' => ($validatedData['cara_pemberian_pupuk'] ?? null) === 'Lainnya' ? ($validatedData['cara_pemberian_pupuk_lainnya'] ?? null) : ($validatedData['cara_pemberian_pupuk'] ?? null),
|
'cara_pemberian_pupuk' => $pemupukanTidakPernah ? null : (($validatedData['cara_pemberian_pupuk'] ?? null) === 'Lainnya' ? ($validatedData['cara_pemberian_pupuk_lainnya'] ?? null) : ($validatedData['cara_pemberian_pupuk'] ?? null)),
|
||||||
'created_by' => auth()->id(),
|
'created_by' => auth()->id(),
|
||||||
'updated_by' => auth()->id(),
|
'updated_by' => auth()->id(),
|
||||||
], [
|
], [
|
||||||
@@ -554,6 +560,12 @@ class PraktikBudidayaController extends Controller
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
$teknikPemangkasan = array_values($teknik_pemangkasan);
|
$teknikPemangkasan = array_values($teknik_pemangkasan);
|
||||||
|
|
||||||
|
if ((int) ($validatedData['frekuensi_pemangkasan_komoditas_utama'] ?? 0) === FrekuensiPemangkasanUtama::TIDAK_PERNAH->value) {
|
||||||
|
$teknikPemangkasan = [];
|
||||||
|
}
|
||||||
|
|
||||||
|
$pemupukanTidakPernah = (int) ($validatedData['pemberian_pupuk'] ?? 0) === PemberianPupuk::TIDAK_PERNAH->value;
|
||||||
|
|
||||||
$dataPraktikBudidaya = [
|
$dataPraktikBudidaya = [
|
||||||
'tenaga_kerja' => $validatedData['tenaga_kerja'],
|
'tenaga_kerja' => $validatedData['tenaga_kerja'],
|
||||||
@@ -566,12 +578,12 @@ class PraktikBudidayaController extends Controller
|
|||||||
'deskripsi_penyerbukan_manual' => $validatedData['alasan_tidak_penyerbukan'] ?? null,
|
'deskripsi_penyerbukan_manual' => $validatedData['alasan_tidak_penyerbukan'] ?? null,
|
||||||
'tingkat_keberhasilan_penyerbukan' => $validatedData['tingkat_keberhasilan_penyerbukan'] ?? null,
|
'tingkat_keberhasilan_penyerbukan' => $validatedData['tingkat_keberhasilan_penyerbukan'] ?? null,
|
||||||
'pemberian_pupuk' => $validatedData['pemberian_pupuk'] ?? null,
|
'pemberian_pupuk' => $validatedData['pemberian_pupuk'] ?? null,
|
||||||
'jenis_pupuk' => $validatedData['jenis_pupuk'] ?? null,
|
'jenis_pupuk' => $pemupukanTidakPernah ? null : ($validatedData['jenis_pupuk'] ?? null),
|
||||||
'frekuensi_pemberian_pupuk' => ($validatedData['frekuensi_pemupukan'] ?? null) === 'Lainnya' ? ($validatedData['frekuensi_pemupukan_lainnya'] ?? null) : ($validatedData['frekuensi_pemupukan'] ?? null),
|
'frekuensi_pemberian_pupuk' => $pemupukanTidakPernah ? null : (($validatedData['frekuensi_pemupukan'] ?? null) === 'Lainnya' ? ($validatedData['frekuensi_pemupukan_lainnya'] ?? null) : ($validatedData['frekuensi_pemupukan'] ?? null)),
|
||||||
'estimasi_dosis_pupuk_organik' => $validatedData['estimasi_dosis_pupuk_organik'] ?? null,
|
'estimasi_dosis_pupuk_organik' => $pemupukanTidakPernah ? null : ($validatedData['estimasi_dosis_pupuk_organik'] ?? null),
|
||||||
'estimasi_dosis_pupuk_anorganik' => $validatedData['estimasi_dosis_pupuk_anorganik'] ?? null,
|
'estimasi_dosis_pupuk_anorganik' => $pemupukanTidakPernah ? null : ($validatedData['estimasi_dosis_pupuk_anorganik'] ?? null),
|
||||||
'waktu_pemberian_pupuk' => ($validatedData['waktu_pemberian_pupuk'] ?? null) === 'Lainnya' ? ($validatedData['waktu_pemberian_pupuk_lainnya'] ?? null) : ($validatedData['waktu_pemberian_pupuk'] ?? null),
|
'waktu_pemberian_pupuk' => $pemupukanTidakPernah ? null : (($validatedData['waktu_pemberian_pupuk'] ?? null) === 'Lainnya' ? ($validatedData['waktu_pemberian_pupuk_lainnya'] ?? null) : ($validatedData['waktu_pemberian_pupuk'] ?? null)),
|
||||||
'cara_pemberian_pupuk' => ($validatedData['cara_pemberian_pupuk'] ?? null) === 'Lainnya' ? ($validatedData['cara_pemberian_pupuk_lainnya'] ?? null) : ($validatedData['cara_pemberian_pupuk'] ?? null),
|
'cara_pemberian_pupuk' => $pemupukanTidakPernah ? null : (($validatedData['cara_pemberian_pupuk'] ?? null) === 'Lainnya' ? ($validatedData['cara_pemberian_pupuk_lainnya'] ?? null) : ($validatedData['cara_pemberian_pupuk'] ?? null)),
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -675,6 +687,17 @@ class PraktikBudidayaController extends Controller
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return back()->with('success', 'Data berhasil diperbarui.');
|
return $this->redirectBackToFragment($request)->with('success', 'Data berhasil diperbarui.');
|
||||||
|
}
|
||||||
|
|
||||||
|
private function redirectBackToFragment(Request $request)
|
||||||
|
{
|
||||||
|
$fragment = $request->input('redirect_fragment');
|
||||||
|
|
||||||
|
if (!is_string($fragment) || !preg_match('/^[A-Za-z0-9_-]+$/', $fragment)) {
|
||||||
|
return back();
|
||||||
|
}
|
||||||
|
|
||||||
|
return redirect()->to(Str::before(url()->previous(), '#') . '#' . $fragment);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -64,12 +64,26 @@ class ProfileController extends Controller
|
|||||||
$validator = Validator::make($request->all(), [
|
$validator = Validator::make($request->all(), [
|
||||||
'nama' => ['required', 'string', 'max:255'],
|
'nama' => ['required', 'string', 'max:255'],
|
||||||
'email' => ['required', 'email', 'max:255'],
|
'email' => ['required', 'email', 'max:255'],
|
||||||
'telepon' => ['required', 'max:13'],
|
'telepon' => ['nullable', 'max:13'],
|
||||||
'desa_kelurahan_id' => ['required'],
|
'desa_kelurahan_id' => ['nullable', 'exists:master_desa_kelurahan,id'],
|
||||||
'ktp' => ['nullable', 'min:16', 'max:16'],
|
'ktp' => ['nullable', 'min:16', 'max:16'],
|
||||||
'file_ktp' => ['nullable', 'file', 'mimes:jpeg,jpg,png,pdf', 'max:2048'],
|
'file_ktp' => ['nullable', 'file', 'mimes:jpeg,jpg,png,pdf', 'max:2048'],
|
||||||
'kk' => ['nullable', 'min:16', 'max:16'],
|
'kk' => ['nullable', 'min:16', 'max:16'],
|
||||||
'file_kk' => ['nullable', 'file', 'mimes:jpeg,jpg,png,pdf', 'max:2048'],
|
'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()) {
|
if ($validator->fails()) {
|
||||||
@@ -143,12 +157,31 @@ class ProfileController extends Controller
|
|||||||
$validator = Validator::make($request->all(), [
|
$validator = Validator::make($request->all(), [
|
||||||
'nama' => ['required', 'string', 'max:255'],
|
'nama' => ['required', 'string', 'max:255'],
|
||||||
'email' => ['required', 'email', 'max:255'],
|
'email' => ['required', 'email', 'max:255'],
|
||||||
'telepon' => ['required', 'max:13'],
|
'telepon' => ['nullable', 'max:13'],
|
||||||
'desa_kelurahan_id' => ['required'],
|
'desa_kelurahan_id' => ['nullable', 'exists:master_desa_kelurahan,id'],
|
||||||
'ktp' => ['nullable', 'min:16', 'max:16'],
|
'ktp' => ['nullable', 'min:16', 'max:16'],
|
||||||
'file_ktp' => ['nullable', 'file', 'mimes:jpeg,jpg,png,pdf', 'max:2048'],
|
'file_ktp' => ['nullable', 'file', 'mimes:jpeg,jpg,png,pdf', 'max:2048'],
|
||||||
'kk' => ['nullable', 'min:16', 'max:16'],
|
'kk' => ['nullable', 'min:16', 'max:16'],
|
||||||
'file_kk' => ['nullable', 'file', 'mimes:jpeg,jpg,png,pdf', 'max:2048'],
|
'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()) {
|
if ($validator->fails()) {
|
||||||
|
|||||||
@@ -154,8 +154,7 @@ class SosialEkonomiController extends Controller
|
|||||||
});
|
});
|
||||||
|
|
||||||
if (!$request->expectsJson()) {
|
if (!$request->expectsJson()) {
|
||||||
return redirect()
|
return $this->redirectToEditSection($sosialEkonomi, $request)
|
||||||
->route('petani.sosial-ekonomi.edit', [$sosialEkonomi->petani_id, $sosialEkonomi->id])
|
|
||||||
->with('success', 'Data sosial ekonomi berhasil disimpan.');
|
->with('success', 'Data sosial ekonomi berhasil disimpan.');
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -206,8 +205,7 @@ class SosialEkonomiController extends Controller
|
|||||||
});
|
});
|
||||||
|
|
||||||
if (!$request->expectsJson()) {
|
if (!$request->expectsJson()) {
|
||||||
return redirect()
|
return $this->redirectToEditSection($sosialEkonomi, $request)
|
||||||
->route('petani.sosial-ekonomi.edit', [$sosialEkonomi->petani_id, $sosialEkonomi->id])
|
|
||||||
->with('success', 'Data sosial ekonomi berhasil diperbarui.');
|
->with('success', 'Data sosial ekonomi berhasil diperbarui.');
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -218,6 +216,18 @@ class SosialEkonomiController extends Controller
|
|||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private function redirectToEditSection(SosialEkonomi $sosialEkonomi, Request $request): RedirectResponse
|
||||||
|
{
|
||||||
|
$url = route('petani.sosial-ekonomi.edit', [$sosialEkonomi->petani_id, $sosialEkonomi->id]);
|
||||||
|
$fragment = $request->input('redirect_fragment');
|
||||||
|
|
||||||
|
if (is_string($fragment) && preg_match('/^[A-Za-z0-9_-]+$/', $fragment)) {
|
||||||
|
$url .= '#' . $fragment;
|
||||||
|
}
|
||||||
|
|
||||||
|
return redirect()->to($url);
|
||||||
|
}
|
||||||
|
|
||||||
public function destroy(string $id): JsonResponse
|
public function destroy(string $id): JsonResponse
|
||||||
{
|
{
|
||||||
$sosialEkonomi = SosialEkonomi::findOrFail($id);
|
$sosialEkonomi = SosialEkonomi::findOrFail($id);
|
||||||
@@ -589,6 +599,14 @@ class SosialEkonomiController extends Controller
|
|||||||
|
|
||||||
$payload = $this->normalizeSkorPayload($payload);
|
$payload = $this->normalizeSkorPayload($payload);
|
||||||
|
|
||||||
|
if (array_key_exists('ada_sengketa', $payload) && !filter_var($payload['ada_sengketa'], FILTER_VALIDATE_BOOLEAN)) {
|
||||||
|
$payload['keterangan_sengketa'] = null;
|
||||||
|
$payload['pihak_membantu_konflik'] = null;
|
||||||
|
$payload['pihak_membantu_konflik_nama'] = null;
|
||||||
|
$payload['tahun_bantuan_konflik'] = null;
|
||||||
|
$payload['status_konflik'] = null;
|
||||||
|
}
|
||||||
|
|
||||||
if (($payload['pihak_membantu_konflik'] ?? null) === PihakMembantuKonflik::TIDAK_ADA_SELESAIKAN_SENDIRI->value) {
|
if (($payload['pihak_membantu_konflik'] ?? null) === PihakMembantuKonflik::TIDAK_ADA_SELESAIKAN_SENDIRI->value) {
|
||||||
$payload['pihak_membantu_konflik_nama'] = null;
|
$payload['pihak_membantu_konflik_nama'] = null;
|
||||||
$payload['tahun_bantuan_konflik'] = null;
|
$payload['tahun_bantuan_konflik'] = null;
|
||||||
|
|||||||
@@ -32,10 +32,10 @@ class SurveyProduktivitasController extends Controller
|
|||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
return back()->with('success', 'Data produktivitas berhasil disimpan.');
|
return $this->redirectBackToFragment($request)->with('success', 'Data produktivitas berhasil disimpan.');
|
||||||
}
|
}
|
||||||
|
|
||||||
public function destroy($petaniId, $surveyProduktivitasId)
|
public function destroy($petaniId, $surveyProduktivitasId, Request $request)
|
||||||
{
|
{
|
||||||
$surveyProduktivitas = SurveyProduktivitas::where('petani_id', $petaniId)
|
$surveyProduktivitas = SurveyProduktivitas::where('petani_id', $petaniId)
|
||||||
->where('id', $surveyProduktivitasId)
|
->where('id', $surveyProduktivitasId)
|
||||||
@@ -44,6 +44,17 @@ class SurveyProduktivitasController extends Controller
|
|||||||
$surveyProduktivitas->save();
|
$surveyProduktivitas->save();
|
||||||
$surveyProduktivitas->delete();
|
$surveyProduktivitas->delete();
|
||||||
|
|
||||||
return back()->with('success', 'Data produktivitas berhasil dihapus.');
|
return $this->redirectBackToFragment($request)->with('success', 'Data produktivitas berhasil dihapus.');
|
||||||
|
}
|
||||||
|
|
||||||
|
private function redirectBackToFragment(Request $request)
|
||||||
|
{
|
||||||
|
$fragment = $request->input('redirect_fragment');
|
||||||
|
|
||||||
|
if (!is_string($fragment) || !preg_match('/^[A-Za-z0-9_-]+$/', $fragment)) {
|
||||||
|
return back();
|
||||||
|
}
|
||||||
|
|
||||||
|
return redirect()->to(Str::before(url()->previous(), '#') . '#' . $fragment);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,21 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Models\Master;
|
||||||
|
|
||||||
|
use Illuminate\Database\Eloquent\Model;
|
||||||
|
use Illuminate\Database\Eloquent\SoftDeletes;
|
||||||
|
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
||||||
|
|
||||||
|
class JenisTanaman extends Model
|
||||||
|
{
|
||||||
|
use HasFactory, SoftDeletes;
|
||||||
|
|
||||||
|
protected $table = 'master_jenis_tanaman';
|
||||||
|
|
||||||
|
protected $fillable = [
|
||||||
|
'nama',
|
||||||
|
'created_by',
|
||||||
|
'updated_by',
|
||||||
|
'deleted_by',
|
||||||
|
];
|
||||||
|
}
|
||||||
@@ -50,7 +50,7 @@ class AksesPasar extends Model
|
|||||||
static::saved(function (AksesPasar $aksesPasar) {
|
static::saved(function (AksesPasar $aksesPasar) {
|
||||||
|
|
||||||
$petani = Petani::find($aksesPasar->petani_id);
|
$petani = Petani::find($aksesPasar->petani_id);
|
||||||
$skor = SkorPetani::where('petani_id')->orderBy('id')->first();
|
$skor = SkorPetani::where('petani_id', $petani->id)->orderBy('id')->first();
|
||||||
if (!$skor) {
|
if (!$skor) {
|
||||||
$petaniUid = $petani->uid;
|
$petaniUid = $petani->uid;
|
||||||
$part = explode('-', $petaniUid);
|
$part = explode('-', $petaniUid);
|
||||||
@@ -61,6 +61,7 @@ class AksesPasar extends Model
|
|||||||
'updated_by' => $petani->updated_by
|
'updated_by' => $petani->updated_by
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
$skor->update([
|
$skor->update([
|
||||||
'skor_d6_k1_6_pengalaman_menjual_ke_saluran_berbeda' => $aksesPasar->skor_pengalaman,
|
'skor_d6_k1_6_pengalaman_menjual_ke_saluran_berbeda' => $aksesPasar->skor_pengalaman,
|
||||||
'skor_d6_k4_1_kesadaran_akses_pasar_premium' => $aksesPasar->skor_kesadaran_premium,
|
'skor_d6_k4_1_kesadaran_akses_pasar_premium' => $aksesPasar->skor_kesadaran_premium,
|
||||||
|
|||||||
@@ -16,11 +16,17 @@ class Komoditas extends Model
|
|||||||
|
|
||||||
protected $table = 'master_komoditas';
|
protected $table = 'master_komoditas';
|
||||||
|
|
||||||
|
protected $casts = [
|
||||||
|
'is_utama' => 'boolean',
|
||||||
|
];
|
||||||
|
|
||||||
protected $fillable = [
|
protected $fillable = [
|
||||||
'nama',
|
'nama',
|
||||||
|
'kode',
|
||||||
'created_by',
|
'created_by',
|
||||||
'updated_by',
|
'updated_by',
|
||||||
'deleted_by',
|
'deleted_by',
|
||||||
|
'is_utama',
|
||||||
];
|
];
|
||||||
|
|
||||||
protected static function booted()
|
protected static function booted()
|
||||||
|
|||||||
@@ -56,7 +56,10 @@ class Lahan extends Model
|
|||||||
'komoditas_lain',
|
'komoditas_lain',
|
||||||
'tanaman_penaung',
|
'tanaman_penaung',
|
||||||
|
|
||||||
'foto'
|
'foto',
|
||||||
|
|
||||||
|
'jenis_hama',
|
||||||
|
'jenis_penyakit',
|
||||||
];
|
];
|
||||||
|
|
||||||
protected $casts = [
|
protected $casts = [
|
||||||
@@ -68,7 +71,9 @@ class Lahan extends Model
|
|||||||
'serangan_hama' => SeranganHama::class,
|
'serangan_hama' => SeranganHama::class,
|
||||||
'penyakit_tanaman' => PenyakitTanaman::class,
|
'penyakit_tanaman' => PenyakitTanaman::class,
|
||||||
'keparahan_serangan' => KeparahanSerangan::class,
|
'keparahan_serangan' => KeparahanSerangan::class,
|
||||||
'foto' => 'array'
|
'foto' => 'array',
|
||||||
|
'jenis_hama' => 'array',
|
||||||
|
'jenis_penyakit' => 'array'
|
||||||
];
|
];
|
||||||
|
|
||||||
public function profile(): BelongsTo
|
public function profile(): BelongsTo
|
||||||
|
|||||||
@@ -138,9 +138,9 @@ class Petani extends Model
|
|||||||
return $this->hasMany(SurveySertifikasi::class, 'petani_id');
|
return $this->hasMany(SurveySertifikasi::class, 'petani_id');
|
||||||
}
|
}
|
||||||
|
|
||||||
public function surveyProduktivitas(): HasOne
|
public function surveyProduktivitas(): HasMany
|
||||||
{
|
{
|
||||||
return $this->hasOne(SurveyProduktivitas::class, 'petani_id')->latestOfMany();
|
return $this->hasMany(SurveyProduktivitas::class, 'petani_id');
|
||||||
}
|
}
|
||||||
|
|
||||||
public function lahans(): HasMany
|
public function lahans(): HasMany
|
||||||
|
|||||||
@@ -8,10 +8,13 @@ use Illuminate\Database\Eloquent\Factories\HasFactory;
|
|||||||
use Illuminate\Database\Eloquent\Relations\BelongsTo;
|
use Illuminate\Database\Eloquent\Relations\BelongsTo;
|
||||||
use Illuminate\Database\Eloquent\Relations\HasMany;
|
use Illuminate\Database\Eloquent\Relations\HasMany;
|
||||||
use Illuminate\Database\Eloquent\Relations\HasOne;
|
use Illuminate\Database\Eloquent\Relations\HasOne;
|
||||||
|
use Illuminate\Support\Facades\Schema;
|
||||||
use Illuminate\Support\Str;
|
use Illuminate\Support\Str;
|
||||||
|
|
||||||
use App\Models\Pertanian\Petani;
|
use App\Models\Pertanian\Petani;
|
||||||
use App\Models\Pertanian\SkorPetani;
|
use App\Models\Pertanian\SkorPetani;
|
||||||
|
use App\Models\Pertanian\Tanaman;
|
||||||
|
use App\Models\Pertanian\Lahan;
|
||||||
|
|
||||||
class PraktikBudidaya extends Model
|
class PraktikBudidaya extends Model
|
||||||
{
|
{
|
||||||
@@ -91,16 +94,54 @@ class PraktikBudidaya extends Model
|
|||||||
'updated_by' => $petani->updated_by
|
'updated_by' => $petani->updated_by
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$kebiasaan = $praktikBudidaya->kebiasaan_konservasi_tanah ? count($praktikBudidaya->kebiasaan_konservasi_tanah) : 0;
|
||||||
|
$pemahaman = $praktikBudidaya->pemahaman_manfaat_konservasi_tanah == 'Ya, tahu manfaatnya' ? 1 : 0;
|
||||||
|
$skor_konservasi_tanah = 0;
|
||||||
|
$jenisHama = $praktikBudidaya->jenis_hama ?? [];
|
||||||
|
$jenisPenyakit = $praktikBudidaya->jenis_penyakit ?? [];
|
||||||
|
|
||||||
|
if (Schema::hasColumn((new Lahan)->getTable(), 'jenis_hama')
|
||||||
|
&& Schema::hasColumn((new Lahan)->getTable(), 'jenis_penyakit')) {
|
||||||
|
Lahan::where('petani_id', $praktikBudidaya->petani_id)->get()->each(function (Lahan $lahan) use ($jenisHama, $jenisPenyakit, $praktikBudidaya) {
|
||||||
|
$lahan->update([
|
||||||
|
'jenis_hama' => $jenisHama,
|
||||||
|
'jenis_penyakit' => $jenisPenyakit,
|
||||||
|
'updated_by' => $praktikBudidaya->updated_by,
|
||||||
|
]);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Schema::hasColumn((new Tanaman)->getTable(), 'jenis_hama')
|
||||||
|
&& Schema::hasColumn((new Tanaman)->getTable(), 'jenis_penyakit')) {
|
||||||
|
Tanaman::where('petani_id', $praktikBudidaya->petani_id)->get()->each(function (Tanaman $tanaman) use ($jenisHama, $jenisPenyakit, $praktikBudidaya) {
|
||||||
|
$tanaman->update([
|
||||||
|
'jenis_hama' => $jenisHama,
|
||||||
|
'jenis_penyakit' => $jenisPenyakit,
|
||||||
|
'updated_by' => $praktikBudidaya->updated_by,
|
||||||
|
]);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($kebiasaan == 0) {
|
||||||
|
$skor_konservasi_tanah = 1;
|
||||||
|
} elseif ($kebiasaan == 1 && $pemahaman == 0) {
|
||||||
|
$skor_konservasi_tanah = 2;
|
||||||
|
} elseif ($kebiasaan == 1 && $pemahaman == 1) {
|
||||||
|
$skor_konservasi_tanah = 3;
|
||||||
|
} elseif ($kebiasaan > 1 && $pemahaman == 0) {
|
||||||
|
$skor_konservasi_tanah = 4;
|
||||||
|
} elseif ($kebiasaan > 1 && $pemahaman == 1) {
|
||||||
|
$skor_konservasi_tanah = 5;
|
||||||
|
}
|
||||||
$skor->update([
|
$skor->update([
|
||||||
|
'skor_d2_k2_3_praktik_pemangkasan' => $praktikBudidaya->frekuensi_pemangkasan_utama,
|
||||||
'skor_d2_k2_3_praktik_pemangkasan' => $praktikBudidaya->frekuensi_pemangkasan_komoditas_utama,
|
|
||||||
'skor_d2_k2_4_praktik_pemupukan' => $praktikBudidaya->pemberian_pupuk,
|
'skor_d2_k2_4_praktik_pemupukan' => $praktikBudidaya->pemberian_pupuk,
|
||||||
'skor_d2_k2_5_pengendalian_opt' => $praktikBudidaya->metode_penanganan_hama_penyakit,
|
'skor_d2_k2_5_pengendalian_opt' => $praktikBudidaya->metode_penanganan_opt,
|
||||||
'skor_d2_k2_6_sanitasi_kebun' => $praktikBudidaya->frekuensi_sanitasi_lahan,
|
'skor_d2_k2_6_sanitasi_kebun' => $praktikBudidaya->frekuensi_sanitasi_lahan,
|
||||||
'skor_d2_k2_6b_pengelolaan_gulma' => $praktikBudidaya->penanganan_gulma,
|
'skor_d2_k2_6b_pengelolaan_gulma' => $praktikBudidaya->penanganan_gulma,
|
||||||
'skor_d2_k2_7_penglolaan_air_irigasi' => $praktikBudidaya->kondisi_pengelolaan_air_irigasi,
|
'skor_d2_k2_7_penglolaan_air_irigasi' => $praktikBudidaya->kondisi_pengelolaan_air,
|
||||||
//'skor_d2_k2_8_praktik_konservasi_tanah' => $praktikBudidaya->kebiasaan_konservasi_tanah,
|
'skor_d2_k2_8_praktik_konservasi_tanah' => $skor_konservasi_tanah,
|
||||||
//'skor_d2_k3_1_penentuan_pematangan' => $praktikBudidaya->
|
|
||||||
]);
|
]);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -109,4 +150,4 @@ class PraktikBudidaya extends Model
|
|||||||
{
|
{
|
||||||
return $this->belongsTo(Petani::class, 'petani_id');
|
return $this->belongsTo(Petani::class, 'petani_id');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -50,7 +50,7 @@ class SkorPetani extends Model
|
|||||||
'skor_d4_k5_2_pengalaman_kredit_formal',
|
'skor_d4_k5_2_pengalaman_kredit_formal',
|
||||||
'skor_d4_k5_3_kepemilikan_aset_produktif',
|
'skor_d4_k5_3_kepemilikan_aset_produktif',
|
||||||
'skor_d4_k5_4_kepemilikan_aset_tidak_produktif',
|
'skor_d4_k5_4_kepemilikan_aset_tidak_produktif',
|
||||||
'skor_d4_k5_4_5_akses_program_bantuan',
|
'skor_d4_k5_4_akses_program_bantuan',
|
||||||
'skor_d4_k6_3_keberadaan_hutang_terkait_panen',
|
'skor_d4_k6_3_keberadaan_hutang_terkait_panen',
|
||||||
'skor_d4_k6_5a_praktik_ijon',
|
'skor_d4_k6_5a_praktik_ijon',
|
||||||
'skor_d4_k6_5b_kebebasan_memilih_pembeli',
|
'skor_d4_k6_5b_kebebasan_memilih_pembeli',
|
||||||
|
|||||||
@@ -41,6 +41,7 @@ use App\Enums\SosialEkonomi\UsahaMutuTambahanHarga;
|
|||||||
|
|
||||||
use App\Models\Pertanian\Petani;
|
use App\Models\Pertanian\Petani;
|
||||||
use App\Models\Pertanian\SkorPetani;
|
use App\Models\Pertanian\SkorPetani;
|
||||||
|
use App\Models\Pertanian\PraktikBudidaya;
|
||||||
|
|
||||||
use Illuminate\Database\Eloquent\Model;
|
use Illuminate\Database\Eloquent\Model;
|
||||||
use Illuminate\Database\Eloquent\Relations\BelongsTo;
|
use Illuminate\Database\Eloquent\Relations\BelongsTo;
|
||||||
@@ -204,7 +205,42 @@ class SosialEkonomi extends Model
|
|||||||
'updated_by' => $petani->updated_by
|
'updated_by' => $petani->updated_by
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
$praktik = PraktikBudidaya::where('petani_id', $petani->id)->orderBy('id')->first();
|
||||||
|
$pendapatan = PendapatanKomoditas::where('sosial_ekonomi_id', $sosialEkonomi->id)->get();
|
||||||
|
|
||||||
|
$rasio = 0;
|
||||||
|
if ($praktik && ($pendapatan && $pendapatan->count() > 0 && $pendapatan->sum('pendapatan') > 0)) {
|
||||||
|
$rasio = $praktik->total_estimasi_biaya_produksi / $pendapatan->sum('pendapatan');
|
||||||
|
}
|
||||||
|
if ($rasio >= 0.8) {
|
||||||
|
$skorRasio = 1;
|
||||||
|
} else if ($rasio >= 0.6) {
|
||||||
|
$skorRasio = 2;
|
||||||
|
} else if ($rasio >= 0.45) {
|
||||||
|
$skorRasio = 3;
|
||||||
|
} else if ($rasio >= 0.3) {
|
||||||
|
$skorRasio = 4;
|
||||||
|
} else {
|
||||||
|
$skorRasio = 5;
|
||||||
|
}
|
||||||
|
|
||||||
$skor->update([
|
$skor->update([
|
||||||
|
'skor_d4_k3_1_praktik_baru' => $sosialEkonomi->kemauan_mencoba_praktik_baru?->value,
|
||||||
|
'skor_d4_k3_4_pemahaman_mutu_harga' => $sosialEkonomi->pemahaman_mutu_harga?->value,
|
||||||
|
'skor_d4_k3_5_role_model' => $sosialEkonomi->panutan_petani_sukses?->value,
|
||||||
|
'skor_d4_k3_6_kemampuan_keterlibatan_program' => $sosialEkonomi->kemauan_ikut_program?->value,
|
||||||
|
'skor_d4_k3_7_orientasi_jangka_panjang' => $sosialEkonomi->orientasi_rencana_jangka_panjang?->value,
|
||||||
|
|
||||||
|
'skor_d4_k2_5_stabilitas_penghasilan' => $sosialEkonomi->skor_periode_paceklik?->value,
|
||||||
|
'skor_d4_k2_8_kemampuan_menabung' => $sosialEkonomi->skor_kemampuan_menabung?->value,
|
||||||
|
'skor_d4_k2_9_kecukupan_penghasilan' => $sosialEkonomi->skor_kecukupan_penghasilan?->value,
|
||||||
|
'skor_d4_k2_3_k2_7_rasio_biaya_produksi_pendapatan' => $skorRasio,
|
||||||
|
'skor_d4_k2_11_hak_kelola_lahan' => $sosialEkonomi->skor_kejelasan_status_lahan?->value,
|
||||||
|
|
||||||
|
'skor_d4_k4_2_keaktifan_pertemuan' => $sosialEkonomi->keaktifan_pertemuan_kelompok?->value,
|
||||||
|
'skor_d4_k4_3_peran_dalam_kelompok' => $sosialEkonomi->peran_dalam_kelompok?->value,
|
||||||
|
'skor_d4_k4_4_manfaat_dirasakan' => $sosialEkonomi->manfaat_kelompok_tani?->value,
|
||||||
|
|
||||||
'skor_d4_k5_1_kepemilikan_rekening' => $sosialEkonomi->status_rekening_tabungan?->value,
|
'skor_d4_k5_1_kepemilikan_rekening' => $sosialEkonomi->status_rekening_tabungan?->value,
|
||||||
'skor_d4_k5_2_pengalaman_kredit_formal' => $sosialEkonomi->pengalaman_kredit_kebun?->value,
|
'skor_d4_k5_2_pengalaman_kredit_formal' => $sosialEkonomi->pengalaman_kredit_kebun?->value,
|
||||||
'skor_d4_k5_3_kepemilikan_aset_produktif' => $sosialEkonomi->kondisi_aset_produktif?->value,
|
'skor_d4_k5_3_kepemilikan_aset_produktif' => $sosialEkonomi->kondisi_aset_produktif?->value,
|
||||||
|
|||||||
@@ -44,6 +44,30 @@ class SurveyPanen extends Model
|
|||||||
'deleted_by',
|
'deleted_by',
|
||||||
];
|
];
|
||||||
|
|
||||||
|
protected static function booted(): void
|
||||||
|
{
|
||||||
|
static::saved(function (SurveyPanen $survey) {
|
||||||
|
|
||||||
|
$petani = Petani::find($survey->petani_id);
|
||||||
|
$skor = SkorPetani::where('petani_id', $petani->id)->orderBy('id')->first();
|
||||||
|
if (!$skor) {
|
||||||
|
$petaniUid = $petani->uid;
|
||||||
|
$part = explode('-', $petaniUid);
|
||||||
|
$skor = SkorPetani::create([
|
||||||
|
'petani_id' => $petani->id,
|
||||||
|
'uid' => 'SKR-' . $part[1] . '-' . strtoupper(Str::random(10)),
|
||||||
|
'created_by' => $petani->created_by,
|
||||||
|
'updated_by' => $petani->updated_by
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
$skor->update([
|
||||||
|
'skor_d2_k3_1_penentuan_pematangan' => $survey->dasar_penentuan_panen,
|
||||||
|
'skor_d2_k3_5_sortasi_awal_pemisahan_kualitas' => $survey->praktik_sortasi,
|
||||||
|
]);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
public function petani(): BelongsTo
|
public function petani(): BelongsTo
|
||||||
{
|
{
|
||||||
return $this->belongsTo(Petani::class, 'petani_id');
|
return $this->belongsTo(Petani::class, 'petani_id');
|
||||||
|
|||||||
@@ -42,6 +42,9 @@ class Tanaman extends Model
|
|||||||
'serangan_hama',
|
'serangan_hama',
|
||||||
'penyakit_tanaman',
|
'penyakit_tanaman',
|
||||||
'keparahan_serangan',
|
'keparahan_serangan',
|
||||||
|
|
||||||
|
'jenis_hama',
|
||||||
|
'jenis_penyakit',
|
||||||
];
|
];
|
||||||
|
|
||||||
protected $casts = [
|
protected $casts = [
|
||||||
@@ -49,6 +52,8 @@ class Tanaman extends Model
|
|||||||
'serangan_hama' => SeranganHama::class,
|
'serangan_hama' => SeranganHama::class,
|
||||||
'penyakit_tanaman' => PenyakitTanaman::class,
|
'penyakit_tanaman' => PenyakitTanaman::class,
|
||||||
'keparahan_serangan' => KeparahanSerangan::class,
|
'keparahan_serangan' => KeparahanSerangan::class,
|
||||||
|
'jenis_hama' => 'array',
|
||||||
|
'jenis_penyakit' => 'array'
|
||||||
];
|
];
|
||||||
|
|
||||||
public function komoditas()
|
public function komoditas()
|
||||||
|
|||||||
@@ -35,24 +35,25 @@ return new class extends Migration
|
|||||||
$table->string('cara_pemberian_pupuk')->nullable();
|
$table->string('cara_pemberian_pupuk')->nullable();
|
||||||
// 2.5 Pengendalian Organisme Pengganggu Tumbuhan (OPT)
|
// 2.5 Pengendalian Organisme Pengganggu Tumbuhan (OPT)
|
||||||
$table->integer('metode_penanganan_opt')->nullable();
|
$table->integer('metode_penanganan_opt')->nullable();
|
||||||
$table->string('jenis_hama')->nullable();
|
$table->jsonb('jenis_hama')->nullable();
|
||||||
$table->string('jenis_penyakit')->nullable();
|
$table->jsonb('jenis_penyakit')->nullable();
|
||||||
$table->string('intensitas_serangan')->nullable();
|
$table->string('intensitas_serangan')->nullable();
|
||||||
$table->string('waktu_kemunculan_terparah')->nullable();
|
$table->string('waktu_kemunculan_terparah')->nullable();
|
||||||
$table->string('metode_paling_sering_dilakukan')->nullable();
|
$table->string('metode_paling_sering_dilakukan')->nullable();
|
||||||
$table->integer('volume_obat_obatan_permusim')->nullable();
|
$table->decimal('volume_obat_obatan_padat_permusim', 10, 2)->nullable();
|
||||||
|
$table->decimal('volume_obat_obatan_cair_permusim', 10, 2)->nullable();
|
||||||
// 2.6 Sanitasi Kebun
|
// 2.6 Sanitasi Kebun
|
||||||
$table->integer('frekuensi_sanitasi_lahan')->nullable();
|
$table->integer('frekuensi_sanitasi_lahan')->nullable();
|
||||||
$table->string('penanganan_sisa_buah_ranting')->nullable();
|
$table->string('penanganan_sisa_buah_ranting')->nullable();
|
||||||
$table->integer('penanganan_gulma')->nullable();
|
$table->integer('penanganan_gulma')->nullable();
|
||||||
// 2.7 Pengelolaan Air & irigasi
|
// 2.7 Pengelolaan Air & irigasi
|
||||||
$table->integer('kondisi_pengelolaan_air')->nullable();
|
$table->integer('kondisi_pengelolaan_air')->nullable();
|
||||||
$table->string('sumber_air')->nullable();
|
$table->jsonb('sumber_air')->nullable();
|
||||||
$table->string('sistem_irigasi')->nullable();
|
$table->string('sistem_irigasi')->nullable();
|
||||||
$table->string('kebutuhan_air_permusim')->nullable();
|
$table->string('kebutuhan_air_permusim')->nullable();
|
||||||
|
|
||||||
// 2.8 Praktik konservasi tanah
|
// 2.8 Praktik konservasi tanah
|
||||||
$table->string('kebiasaan_konservasi_tanah')->nullable();
|
$table->jsonb('kebiasaan_konservasi_tanah')->nullable();
|
||||||
$table->string('pemahaman_manfaat_konservasi_tanah')->nullable();
|
$table->string('pemahaman_manfaat_konservasi_tanah')->nullable();
|
||||||
$table->integer('nilai_konservasi_tanah')->nullable();
|
$table->integer('nilai_konservasi_tanah')->nullable();
|
||||||
|
|
||||||
@@ -99,7 +100,7 @@ return new class extends Migration
|
|||||||
$table->string('tindakan_panen_reject')->nullable();
|
$table->string('tindakan_panen_reject')->nullable();
|
||||||
$table->decimal('upah_tenaga_panen', 13, 2)->nullable();
|
$table->decimal('upah_tenaga_panen', 13, 2)->nullable();
|
||||||
$table->decimal('biaya_pengangkutan_panen', 13, 2)->nullable();
|
$table->decimal('biaya_pengangkutan_panen', 13, 2)->nullable();
|
||||||
$table->decimal('biaya_wadah-Panen', 13, 2)->nullable();
|
$table->decimal('biaya_wadah_Panen', 13, 2)->nullable();
|
||||||
$table->decimal('biaya_sewa_alat_panen', 13, 2)->nullable();
|
$table->decimal('biaya_sewa_alat_panen', 13, 2)->nullable();
|
||||||
$table->decimal('biaya_panen_lainnya', 13, 2)->nullable();
|
$table->decimal('biaya_panen_lainnya', 13, 2)->nullable();
|
||||||
$table->decimal('total_estimasi_biaya_panen', 13, 2)->nullable();
|
$table->decimal('total_estimasi_biaya_panen', 13, 2)->nullable();
|
||||||
|
|||||||
@@ -0,0 +1,25 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
use Illuminate\Database\Migrations\Migration;
|
||||||
|
use Illuminate\Database\Schema\Blueprint;
|
||||||
|
use Illuminate\Support\Facades\Schema;
|
||||||
|
|
||||||
|
return new class extends Migration
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Run the migrations.
|
||||||
|
*/
|
||||||
|
public function up(): void
|
||||||
|
{
|
||||||
|
Schema::table('master_komoditas', function (Blueprint $table) {
|
||||||
|
$table->boolean('is_utama')->default(false);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
public function down(): void
|
||||||
|
{
|
||||||
|
Schema::table('master_komoditas', function (Blueprint $table) {
|
||||||
|
$table->dropColumn('is_utama');
|
||||||
|
});
|
||||||
|
}
|
||||||
|
};
|
||||||
@@ -0,0 +1,34 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
use Illuminate\Database\Migrations\Migration;
|
||||||
|
use Illuminate\Database\Schema\Blueprint;
|
||||||
|
use Illuminate\Support\Facades\Schema;
|
||||||
|
|
||||||
|
return new class extends Migration
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Run the migrations.
|
||||||
|
*/
|
||||||
|
public function up(): void
|
||||||
|
{
|
||||||
|
Schema::create('master_jenis_tanaman', function (Blueprint $table) {
|
||||||
|
$table->id();
|
||||||
|
$table->string('nama');
|
||||||
|
|
||||||
|
$table->foreignId('created_by')->nullable()->constrained('users')->onDelete('set null');
|
||||||
|
$table->foreignId('updated_by')->nullable()->constrained('users')->onDelete('set null');
|
||||||
|
$table->foreignId('deleted_by')->nullable()->constrained('users')->onDelete('set null');
|
||||||
|
|
||||||
|
$table->timestamps();
|
||||||
|
$table->softDeletes();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reverse the migrations.
|
||||||
|
*/
|
||||||
|
public function down(): void
|
||||||
|
{
|
||||||
|
Schema::dropIfExists('jenis_tanamen');
|
||||||
|
}
|
||||||
|
};
|
||||||
@@ -0,0 +1,57 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
use Illuminate\Database\Migrations\Migration;
|
||||||
|
use Illuminate\Database\Schema\Blueprint;
|
||||||
|
use Illuminate\Support\Facades\Schema;
|
||||||
|
|
||||||
|
return new class extends Migration
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Run the migrations.
|
||||||
|
*/
|
||||||
|
public function up(): void
|
||||||
|
{
|
||||||
|
Schema::table('map_lahan', function (Blueprint $table) {
|
||||||
|
if (! Schema::hasColumn('map_lahan', 'jenis_hama')) {
|
||||||
|
$table->jsonb('jenis_hama')->nullable();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (! Schema::hasColumn('map_lahan', 'jenis_penyakit')) {
|
||||||
|
$table->jsonb('jenis_penyakit')->nullable();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
Schema::table('map_tanaman', function (Blueprint $table) {
|
||||||
|
if (! Schema::hasColumn('map_tanaman', 'jenis_hama')) {
|
||||||
|
$table->jsonb('jenis_hama')->nullable();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (! Schema::hasColumn('map_tanaman', 'jenis_penyakit')) {
|
||||||
|
$table->jsonb('jenis_penyakit')->nullable();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
public function down(): void
|
||||||
|
{
|
||||||
|
Schema::table('map_lahan', function (Blueprint $table) {
|
||||||
|
if (Schema::hasColumn('map_lahan', 'jenis_hama')) {
|
||||||
|
$table->dropColumn('jenis_hama');
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Schema::hasColumn('map_lahan', 'jenis_penyakit')) {
|
||||||
|
$table->dropColumn('jenis_penyakit');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
Schema::table('map_tanaman', function (Blueprint $table) {
|
||||||
|
if (Schema::hasColumn('map_tanaman', 'jenis_hama')) {
|
||||||
|
$table->dropColumn('jenis_hama');
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Schema::hasColumn('map_tanaman', 'jenis_penyakit')) {
|
||||||
|
$table->dropColumn('jenis_penyakit');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
};
|
||||||
Binary file not shown.
|
After Width: | Height: | Size: 5.4 KiB |
@@ -14,21 +14,21 @@ document.addEventListener('DOMContentLoaded', function () {
|
|||||||
username: {
|
username: {
|
||||||
validators: {
|
validators: {
|
||||||
notEmpty: {
|
notEmpty: {
|
||||||
message: 'Please enter username'
|
message: 'Silakan masukkan username'
|
||||||
},
|
},
|
||||||
stringLength: {
|
stringLength: {
|
||||||
min: 6,
|
min: 6,
|
||||||
message: 'Username must be more than 6 characters'
|
message: 'Username harus terdiri dari minimal 6 karakter'
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
email: {
|
email: {
|
||||||
validators: {
|
validators: {
|
||||||
notEmpty: {
|
notEmpty: {
|
||||||
message: 'Please enter your email'
|
message: 'Silakan masukkan email Anda'
|
||||||
},
|
},
|
||||||
emailAddress: {
|
emailAddress: {
|
||||||
message: 'Please enter a valid email address'
|
message: 'Silakan masukkan email yang valid'
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -57,22 +57,22 @@ document.addEventListener('DOMContentLoaded', function () {
|
|||||||
'confirm-password': {
|
'confirm-password': {
|
||||||
validators: {
|
validators: {
|
||||||
notEmpty: {
|
notEmpty: {
|
||||||
message: 'Please confirm password'
|
message: 'Silakan konfirmasi password Anda'
|
||||||
},
|
},
|
||||||
identical: {
|
identical: {
|
||||||
compare: () => formAuthentication.querySelector('[name="password"]').value,
|
compare: () => formAuthentication.querySelector('[name="password"]').value,
|
||||||
message: 'The password and its confirmation do not match'
|
message: 'Password tidak cocok dengan konfirmasi password'
|
||||||
},
|
},
|
||||||
stringLength: {
|
stringLength: {
|
||||||
min: 6,
|
min: 6,
|
||||||
message: 'Password must be more than 6 characters'
|
message: 'Password harus terdiri dari minimal 6 karakter'
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
terms: {
|
terms: {
|
||||||
validators: {
|
validators: {
|
||||||
notEmpty: {
|
notEmpty: {
|
||||||
message: 'Please agree to terms & conditions'
|
message: 'Silakan terima syarat dan ketentuan kami'
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -111,15 +111,20 @@
|
|||||||
<!-- endbuild -->
|
<!-- endbuild -->
|
||||||
|
|
||||||
<!-- Vendors JS -->
|
<!-- Vendors JS -->
|
||||||
<script src="{{ asset('assets/vendor/libs/@form-validation/popular.js') }}"></script>
|
<!-- <script src="{{ asset('assets/vendor/libs/@form-validation/popular.js') }}"></script>
|
||||||
<script src="{{ asset('assets/vendor/libs/@form-validation/bootstrap5.js') }}"></script>
|
<script src="{{ asset('assets/vendor/libs/@form-validation/bootstrap5.js') }}"></script>
|
||||||
<script src="{{ asset('assets/vendor/libs/@form-validation/auto-focus.js') }}"></script>
|
<script src="{{ asset('assets/vendor/libs/@form-validation/auto-focus.js') }}"></script> -->
|
||||||
|
|
||||||
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-validate/1.19.5/jquery.validate.min.js"></script>
|
||||||
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-validate/1.19.5/additional-methods.min.js"></script>
|
||||||
|
|
||||||
<!-- Main JS -->
|
<!-- Main JS -->
|
||||||
|
|
||||||
<script src="{{ asset('assets/js/main.js') }}"></script>
|
<script src="{{ asset('assets/js/main.js') }}"></script>
|
||||||
|
|
||||||
<!-- Page JS -->
|
<!-- Page JS -->
|
||||||
<script src="{{ asset('assets/js/pages-auth.js') }}"></script>
|
<!-- <script src="{{ asset('assets/js/pages-auth.js') }}"></script> -->
|
||||||
|
|
||||||
|
@stack('scripts')
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
@@ -87,3 +87,44 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@endsection
|
@endsection
|
||||||
|
|
||||||
|
@push('scripts')
|
||||||
|
<script>
|
||||||
|
$(document).ready(function () {
|
||||||
|
$('#formAuthentication').validate({
|
||||||
|
rules: {
|
||||||
|
email_username: {
|
||||||
|
required: true,
|
||||||
|
minlength: 6,
|
||||||
|
},
|
||||||
|
password: {
|
||||||
|
required: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
messages: {
|
||||||
|
email_username: {
|
||||||
|
required: 'Email atau Nama Pengguna wajib diisi',
|
||||||
|
minlength: 'Email atau Nama Pengguna minimal 6 karakter',
|
||||||
|
},
|
||||||
|
password: {
|
||||||
|
required: 'Password wajib diisi',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
errorElement: 'div',
|
||||||
|
errorPlacement: function (error, element) {
|
||||||
|
error.addClass('invalid-feedback');
|
||||||
|
element.closest('.mb-6, .form-control-validation').append(error);
|
||||||
|
},
|
||||||
|
highlight: function (element) {
|
||||||
|
$(element).addClass('is-invalid');
|
||||||
|
},
|
||||||
|
unhighlight: function (element) {
|
||||||
|
$(element).removeClass('is-invalid');
|
||||||
|
},
|
||||||
|
submitHandler: function (form) {
|
||||||
|
form.submit();
|
||||||
|
}
|
||||||
|
})
|
||||||
|
})
|
||||||
|
</script>
|
||||||
|
@endpush
|
||||||
@@ -113,7 +113,7 @@
|
|||||||
</a>
|
</a>
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<div class="divider my-6">
|
<!-- <div class="divider my-6">
|
||||||
<div class="divider-text">atau</div>
|
<div class="divider-text">atau</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -133,7 +133,72 @@
|
|||||||
<a href="javascript:;" class="btn btn-icon rounded-circle btn-text-google-plus">
|
<a href="javascript:;" class="btn btn-icon rounded-circle btn-text-google-plus">
|
||||||
<i class="icon-base ti tabler-brand-google-filled icon-20px"></i>
|
<i class="icon-base ti tabler-brand-google-filled icon-20px"></i>
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div> -->
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@endsection
|
@endsection
|
||||||
|
|
||||||
|
@push('scripts')
|
||||||
|
<script>
|
||||||
|
$(document).ready(function () {
|
||||||
|
$('#formAuthentication').validate({
|
||||||
|
rules: {
|
||||||
|
username: {
|
||||||
|
required: true,
|
||||||
|
minlength: 6,
|
||||||
|
},
|
||||||
|
email: {
|
||||||
|
required: true,
|
||||||
|
email: true,
|
||||||
|
},
|
||||||
|
password: {
|
||||||
|
required: true,
|
||||||
|
minlength: 8,
|
||||||
|
},
|
||||||
|
password_confirmation: {
|
||||||
|
required: true,
|
||||||
|
equalTo: '#password',
|
||||||
|
},
|
||||||
|
terms: {
|
||||||
|
required: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
messages: {
|
||||||
|
username: {
|
||||||
|
required: 'Username wajib diisi',
|
||||||
|
minlength: 'Username minimal 6 karakter',
|
||||||
|
},
|
||||||
|
email: {
|
||||||
|
required: 'Email wajib diisi',
|
||||||
|
email: 'Format email tidak sesuai',
|
||||||
|
},
|
||||||
|
password: {
|
||||||
|
required: 'Kata Sandi wajib diisi',
|
||||||
|
},
|
||||||
|
password_confirmation: {
|
||||||
|
required: 'Konfirmasi Kata Sandi wajib diisi',
|
||||||
|
equalTo: 'Konfirmasi Kata Sandi tidak sesuai',
|
||||||
|
minlength: 'Password minimal 8 karakter',
|
||||||
|
},
|
||||||
|
terms: {
|
||||||
|
required: 'Anda harus menyetujui ketentuan layanan',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
errorElement: 'div',
|
||||||
|
errorPlacement: function (error, element) {
|
||||||
|
error.addClass('invalid-feedback');
|
||||||
|
element.closest('.mb-6, .form-control-validation').append(error);
|
||||||
|
},
|
||||||
|
highlight: function (element) {
|
||||||
|
$(element).addClass('is-invalid');
|
||||||
|
},
|
||||||
|
unhighlight: function (element) {
|
||||||
|
$(element).removeClass('is-invalid');
|
||||||
|
},
|
||||||
|
submitHandler: function (form) {
|
||||||
|
form.submit();
|
||||||
|
}
|
||||||
|
})
|
||||||
|
})
|
||||||
|
</script>
|
||||||
|
@endpush
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
<div class="card-body d-flex justify-content-between align-items-center">
|
<div class="card-body d-flex justify-content-between align-items-center">
|
||||||
<div>
|
<div>
|
||||||
<p class="text-muted fw-medium mb-1">{{ $title }}</p>
|
<p class="text-muted fw-medium mb-1">{{ $title }}</p>
|
||||||
<h3 class="text-dark fw-bold mb-1">{{ $count }}</h3>
|
<h3 class="text-dark fw-bold mb-1">{!! $count !!}</h3>
|
||||||
<small class="text-muted">{{ $subtitle }}</small>
|
<small class="text-muted">{{ $subtitle }}</small>
|
||||||
</div>
|
</div>
|
||||||
<div class="badge bg-label-{{ $color }} p-2 rounded">
|
<div class="badge bg-label-{{ $color }} p-2 rounded">
|
||||||
|
|||||||
@@ -31,7 +31,7 @@
|
|||||||
<i class="icon-base ti tabler-trees icon-28px"></i>
|
<i class="icon-base ti tabler-trees icon-28px"></i>
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
<h4 class="mb-0">{{ $lahanSummary->sum('luas_lahan') }}m<sup>2</sup></h4>
|
<h4 class="mb-0">{{ number_format($lahanSummary->sum('luas_lahan') / 10000, 2, ',', '.') }} ha</h4>
|
||||||
</div>
|
</div>
|
||||||
<p class="mb-1">Lahan</p>
|
<p class="mb-1">Lahan</p>
|
||||||
<p class="mb-0">
|
<p class="mb-0">
|
||||||
@@ -41,7 +41,7 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-lg-6 col-sm-12">
|
<!-- <div class="col-lg-6 col-sm-12">
|
||||||
<div class="card card-border-shadow-danger h-100">
|
<div class="card card-border-shadow-danger h-100">
|
||||||
<div class="card-body">
|
<div class="card-body">
|
||||||
<div class="d-flex align-items-center mb-2">
|
<div class="d-flex align-items-center mb-2">
|
||||||
@@ -63,6 +63,25 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
</div> -->
|
||||||
|
<div class="col-lg-3 col-sm-6">
|
||||||
|
<div class="card card-border-shadow-info h-100">
|
||||||
|
<div class="card-body">
|
||||||
|
<div class="d-flex align-items-center mb-2">
|
||||||
|
<div class="avatar me-4">
|
||||||
|
<span class="avatar-initial rounded bg-label-warning">
|
||||||
|
<i class="icon-base ti tabler-star icon-28px"></i>
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
<h4 class="mb-0">{{ number_format($skorAverage, 2, ',', '.') }}</h4>
|
||||||
|
</div>
|
||||||
|
<p class="mb-1">Rata-rata Indeks Kesiapan Adopsi</p>
|
||||||
|
<p class="mb-0">
|
||||||
|
<span class="text-heading fw-medium me-2">{{ $segmenAverage }}</span>
|
||||||
|
<small class="text-body-info">komoditas utama</small>
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -78,6 +97,11 @@
|
|||||||
<div class="card-body">
|
<div class="card-body">
|
||||||
<table class="table card-table table-border-top-0 table-border-bottom-0">
|
<table class="table card-table table-border-top-0 table-border-bottom-0">
|
||||||
<tbody>
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<td class="w-60 ps-0"></td>
|
||||||
|
<td class="text-end pe-0">Petani</td>
|
||||||
|
<td class="text-end pe-0">%</td>
|
||||||
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td class="w-60 ps-0">
|
<td class="w-60 ps-0">
|
||||||
<div class="d-flex justify-content-start align-items-center">
|
<div class="d-flex justify-content-start align-items-center">
|
||||||
@@ -91,10 +115,10 @@
|
|||||||
</div>
|
</div>
|
||||||
</td>
|
</td>
|
||||||
<td class="text-end pe-0">
|
<td class="text-end pe-0">
|
||||||
<span>{{ $skorSummary->where('segmentasi', 'Penggerak')->sum('total') }} petani</span>
|
<span>{{ $skorSummary->where('segmen', 'Penggerak')->sum('total') }} petani</span>
|
||||||
</td>
|
</td>
|
||||||
<td class="text-end pe-0">
|
<td class="text-end pe-0">
|
||||||
<span>{{ number_format(($skorSummary->where('segmentasi', 'Penggerak')->sum('total') / $petaniSummary->sum('total')) * 100, 2) }}%</span>
|
<span>{{ number_format(($skorSummary->where('segmen', 'Penggerak')->sum('total') / $petaniSummary->sum('total')) * 100, 2) }}%</span>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
@@ -110,10 +134,10 @@
|
|||||||
</div>
|
</div>
|
||||||
</td>
|
</td>
|
||||||
<td class="text-end pe-0">
|
<td class="text-end pe-0">
|
||||||
<span>{{ $skorSummary->where('segmentasi', 'Perintis')->sum('total') }} petani</span>
|
<span>{{ $skorSummary->where('segmen', 'Perintis')->sum('total') }} petani</span>
|
||||||
</td>
|
</td>
|
||||||
<td class="text-end pe-0">
|
<td class="text-end pe-0">
|
||||||
<span>{{ number_format(($skorSummary->where('segmentasi', 'Perintis')->sum('total') / $petaniSummary->sum('total')) * 100, 2) }}%</span>
|
<span>{{ number_format(($skorSummary->where('segmen', 'Perintis')->sum('total') / $petaniSummary->sum('total')) * 100, 2) }}%</span>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
@@ -129,10 +153,10 @@
|
|||||||
</div>
|
</div>
|
||||||
</td>
|
</td>
|
||||||
<td class="text-end pe-0">
|
<td class="text-end pe-0">
|
||||||
<span>{{ $skorSummary->where('segmentasi', 'Pemerhati')->sum('total') }} petani</span>
|
<span>{{ $skorSummary->where('segmen', 'Pemerhati')->sum('total') }} petani</span>
|
||||||
</td>
|
</td>
|
||||||
<td class="text-end pe-0">
|
<td class="text-end pe-0">
|
||||||
<span>{{ number_format(($skorSummary->where('segmentasi', 'Pemerhati')->sum('total') / $petaniSummary->sum('total')) * 100, 2) }}%</span>
|
<span>{{ number_format(($skorSummary->where('segmen', 'Pemerhati')->sum('total') / $petaniSummary->sum('total')) * 100, 2) }}%</span>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
@@ -148,10 +172,10 @@
|
|||||||
</div>
|
</div>
|
||||||
</td>
|
</td>
|
||||||
<td class="text-end pe-0">
|
<td class="text-end pe-0">
|
||||||
<span>{{ $skorSummary->where('segmentasi', 'Pemula')->sum('total') }} petani</span>
|
<span>{{ $skorSummary->where('segmen', 'Pemula')->sum('total') }} petani</span>
|
||||||
</td>
|
</td>
|
||||||
<td class="text-end pe-0">
|
<td class="text-end pe-0">
|
||||||
<span>{{ number_format(($skorSummary->where('segmentasi', 'Pemula')->sum('total') / $petaniSummary->sum('total')) * 100, 2) }}%</span>
|
<span>{{ number_format(($skorSummary->where('segmen', 'Pemula')->sum('total') / $petaniSummary->sum('total')) * 100, 2) }}%</span>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
@@ -159,7 +183,7 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-lg-6 col-sm-12">
|
<!-- <div class="col-lg-6 col-sm-12">
|
||||||
<div class="card h-100">
|
<div class="card h-100">
|
||||||
<div class="card-header d-flex justify-content-between align-items-center">
|
<div class="card-header d-flex justify-content-between align-items-center">
|
||||||
<div class="card-title mb-0">
|
<div class="card-title mb-0">
|
||||||
@@ -173,6 +197,7 @@
|
|||||||
@foreach ($komoditas as $k)
|
@foreach ($komoditas as $k)
|
||||||
<?php
|
<?php
|
||||||
$max = $skorKomoditasSummary->where('komoditas_id', $k->id)
|
$max = $skorKomoditasSummary->where('komoditas_id', $k->id)
|
||||||
|
->whereIn('segmen', ['Penggerak', 'Perintis', 'Pemerhati', 'Pemula'])
|
||||||
->sortByDesc('total')
|
->sortByDesc('total')
|
||||||
->first();
|
->first();
|
||||||
?>
|
?>
|
||||||
@@ -182,19 +207,19 @@
|
|||||||
</td>
|
</td>
|
||||||
<td class="pe-0">
|
<td class="pe-0">
|
||||||
@if(isset($max))
|
@if(isset($max))
|
||||||
@if($max->segmentasi == 'Penggerak')
|
@if($max->segmen == 'Penggerak')
|
||||||
<span class="text-success">Petani Penggerak</span>
|
<span class="text-success">Petani Penggerak</span>
|
||||||
@elseif($max->segmentasi == 'Perintis')
|
@elseif($max->segmen == 'Perintis')
|
||||||
<span class="text-info">Petani Perintis</span>
|
<span class="text-info">Petani Perintis</span>
|
||||||
@elseif($max->segmentasi == 'Pemerhati')
|
@elseif($max->segmen == 'Pemerhati')
|
||||||
<span class="text-warning">Petani Pemerhati</span>
|
<span class="text-warning">Petani Pemerhati</span>
|
||||||
@elseif($max->segmentasi == 'Pemula')
|
@elseif($max->segmen == 'Pemula')
|
||||||
<span class="text-danger">Petani Pemula</span>
|
<span class="text-danger">Petani Pemula</span>
|
||||||
@else
|
@else
|
||||||
<span>Belum Lengkap</span>
|
<span>Belum Lengkap</span>
|
||||||
@endif
|
@endif
|
||||||
@else
|
@else
|
||||||
<span>Belum Ada</span>
|
<span>Belum Tersegmentasi</span>
|
||||||
@endif
|
@endif
|
||||||
</td>
|
</td>
|
||||||
<td class="text-end pe-0">
|
<td class="text-end pe-0">
|
||||||
@@ -209,7 +234,471 @@
|
|||||||
</table>
|
</table>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
</div> -->
|
||||||
|
<div class="col-lg-6 col-sm-12">
|
||||||
|
<div class="card h-100">
|
||||||
|
<div class="card-header d-flex justify-content-between align-items-center">
|
||||||
|
<div class="card-title mb-0">
|
||||||
|
<h5 class="m-0 me-2">Segmentasi Multi Dimensi Petani</h5>
|
||||||
|
<p class="card-subtitle">untuk semua komoditas</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="card-body">
|
||||||
|
<table class="table card-table table-border-top-0 table-border-bottom-0">
|
||||||
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<td class="w-60 ps-0"></td>
|
||||||
|
<td class="text-end pe-0">Indeks</td>
|
||||||
|
<td class="text-end pe-0">D1</td>
|
||||||
|
<td class="text-end pe-0">D2</td>
|
||||||
|
<td class="text-end pe-0">D3</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td class="w-60 ps-0">
|
||||||
|
<div class="d-flex justify-content-start align-items-center">
|
||||||
|
<div class="me-2">
|
||||||
|
<i class="icon-base ti tabler-crown icon-lg text-heading"></i>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<h6 class="mb-0 fw-normal text-success">Penggerak (4.0 - 5.0)</h6>
|
||||||
|
<!-- <small class="text-body-secondary text-wrap">Siap menjadi peserta agrolab utama dan panutan bagi petani lain</small> -->
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</td>
|
||||||
|
<td class="text-end pe-0">
|
||||||
|
<span>{{ number_format($skorMultiDimensi->where('segmen', 'Penggerak')->value('skor_kesiapan_adopsi'), 2, '.', ',') }}</span>
|
||||||
|
</td>
|
||||||
|
<td class="text-end pe-0">
|
||||||
|
<span>{{ number_format($skorMultiDimensi->where('segmen', 'Penggerak')->value('skor_d2_sistem_praktik_budidaya'), 2, '.', ',') }}</span>
|
||||||
|
</td>
|
||||||
|
<td class="text-end pe-0">
|
||||||
|
<span>{{ number_format($skorMultiDimensi->where('segmen', 'Penggerak')->value('skor_d4_sosial_ekonomi'), 2, '.', ',') }}</span>
|
||||||
|
</td>
|
||||||
|
<td class="text-end pe-0">
|
||||||
|
<span>{{ number_format($skorMultiDimensi->where('segmen', 'Penggerak')->value('skor_d6_rantai_nilai_akses_pasar'), 2, '.', ',') }}</span>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td class="w-60 ps-0">
|
||||||
|
<div class="d-flex justify-content-start align-items-center">
|
||||||
|
<div class="me-2">
|
||||||
|
<i class="icon-base ti tabler-flag icon-lg text-heading"></i>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<h6 class="mb-0 fw-normal text-info">Perintis (3.0 - 3.9)</h6>
|
||||||
|
<!-- <small class="text-body-secondary text-wrap">Berpotensi berkembang menjadi Penggerak dengan dukungan yang tepat</small> -->
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</td>
|
||||||
|
<td class="text-end pe-0">
|
||||||
|
<span>{{ number_format($skorMultiDimensi->where('segmen', 'Perintis')->value('skor_kesiapan_adopsi'), 2, '.', ',') }}</span>
|
||||||
|
</td>
|
||||||
|
<td class="text-end pe-0">
|
||||||
|
<span>{{ number_format($skorMultiDimensi->where('segmen', 'Perintis')->value('skor_d2_sistem_praktik_budidaya'), 2, '.', ',') }}</span>
|
||||||
|
</td>
|
||||||
|
<td class="text-end pe-0">
|
||||||
|
<span>{{ number_format($skorMultiDimensi->where('segmen', 'Perintis')->value('skor_d4_sosial_ekonomi'), 2, '.', ',') }}</span>
|
||||||
|
</td>
|
||||||
|
<td class="text-end pe-0">
|
||||||
|
<span>{{ number_format($skorMultiDimensi->where('segmen', 'Perintis')->value('skor_d6_rantai_nilai_akses_pasar'), 2, '.', ',') }}</span>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td class="w-60 ps-0">
|
||||||
|
<div class="d-flex justify-content-start align-items-center">
|
||||||
|
<div class="me-2">
|
||||||
|
<i class="icon-base ti tabler-eye icon-lg text-heading text-success"></i>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<h6 class="mb-0 fw-normal text-warning">Pemerhati (2.0 - 2.9)</h6>
|
||||||
|
<!-- <small class="text-body-secondary text-wrap">Perlu melihat bukti hasil nyata dari Penggerak sebelum mau bergerak</small> -->
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</td>
|
||||||
|
<td class="text-end pe-0">
|
||||||
|
<span>{{ number_format($skorMultiDimensi->where('segmen', 'Pemerhati')->value('skor_kesiapan_adopsi'), 2, '.', ',') }}</span>
|
||||||
|
</td>
|
||||||
|
<td class="text-end pe-0">
|
||||||
|
<span>{{ number_format($skorMultiDimensi->where('segmen', 'Pemerhati')->value('skor_d2_sistem_praktik_budidaya'), 2, '.', ',') }}</span>
|
||||||
|
</td>
|
||||||
|
<td class="text-end pe-0">
|
||||||
|
<span>{{ number_format($skorMultiDimensi->where('segmen', 'Pemerhati')->value('skor_d4_sosial_ekonomi'), 2, '.', ',') }}</span>
|
||||||
|
</td>
|
||||||
|
<td class="text-end pe-0">
|
||||||
|
<span>{{ number_format($skorMultiDimensi->where('segmen', 'Pemerhati')->value('skor_d6_rantai_nilai_akses_pasar'), 2, '.', ',') }}</span>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td class="w-60 ps-0">
|
||||||
|
<div class="d-flex justify-content-start align-items-center">
|
||||||
|
<div class="me-2">
|
||||||
|
<i class="icon-base ti tabler-seedling icon-lg text-heading"></i>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<h6 class="mb-0 fw-normal text-danger">Pemula (1.0 - 1.9)</h6>
|
||||||
|
<!-- <small class="text-body-secondary text-wrap">Butuh penanganan hambatan dasar terlebih dahulu sebelum intervensi langsung</small> -->
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</td>
|
||||||
|
<td class="text-end pe-0">
|
||||||
|
<span>{{ number_format($skorMultiDimensi->where('segmen', 'Pemula')->value('skor_kesiapan_adopsi'), 2, '.', ',') }}</span>
|
||||||
|
</td>
|
||||||
|
<td class="text-end pe-0">
|
||||||
|
<span>{{ number_format($skorMultiDimensi->where('segmen', 'Pemula')->value('skor_d2_sistem_praktik_budidaya'), 2, '.', ',') }}</span>
|
||||||
|
</td>
|
||||||
|
<td class="text-end pe-0">
|
||||||
|
<span>{{ number_format($skorMultiDimensi->where('segmen', 'Pemula')->value('skor_d4_sosial_ekonomi'), 2, '.', ',') }}</span>
|
||||||
|
</td>
|
||||||
|
<td class="text-end pe-0">
|
||||||
|
<span>{{ number_format($skorMultiDimensi->where('segmen', 'Pemula')->value('skor_d6_rantai_nilai_akses_pasar'), 2, '.', ',') }}</span>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="row g-6 py-4">
|
||||||
|
<div class="col-lg-6 col-sm-12">
|
||||||
|
<div class="card h-100">
|
||||||
|
<div class="card-header d-flex justify-content-between align-items-center">
|
||||||
|
<div class="card-title mb-0">
|
||||||
|
<h5 class="m-0 me-2">Rata-rata Dimensi Kesiapan Adopsi</h5>
|
||||||
|
<p class="card-subtitle">untuk semua komoditas</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="card-body">
|
||||||
|
<div id="chart-dimensi"></div>
|
||||||
|
<div class="d-flex flex-wrap gap-3 mt-3 small justify-content-center">
|
||||||
|
<div>
|
||||||
|
<span class="badge bg-label-primary">D1</span> Sistem & Praktik Budidaya
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<span class="badge bg-label-primary">D2</span> Sosial Ekonomi Rumah Tangga
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<span class="badge bg-label-primary">D3</span> Rantai Nilai & Akses Pasar
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col-lg-6 col-sm-12">
|
||||||
|
<div class="card h-100">
|
||||||
|
<div class="card-header d-flex justify-content-between align-items-center">
|
||||||
|
<div class="card-title mb-0">
|
||||||
|
<h5 class="m-0 me-2">Rata-rata Komponen Kesiapan Adopsi</h5>
|
||||||
|
<p class="card-subtitle">untuk semua komoditas</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="card-body">
|
||||||
|
<div id="chart-komponen"></div>
|
||||||
|
<div class="d-flex flex-wrap gap-3 mt-3 small justify-content-center">
|
||||||
|
<div>
|
||||||
|
<span class="badge bg-label-primary">K1</span> Motivasi & Kapasitas Adopsi
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<span class="badge bg-label-primary">K2</span> Kondisi Ekonomi Rumah Tangga
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<span class="badge bg-label-primary">K3</span> Praktik Budidaya & GAP
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<span class="badge bg-label-primary">K4</span> Keterlibatan Kelembagaan
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<span class="badge bg-label-primary">K5</span> Akses & Kebebasan Keuangan
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<span class="badge bg-label-primary">K6</span> Rantai Nilai & Akses Pasar
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="row g-6 py-4">
|
||||||
|
<div class="col-lg-12 col-sm-12">
|
||||||
|
<div class="card h-100">
|
||||||
|
<div class="card-header d-flex justify-content-between align-items-center">
|
||||||
|
<div class="card-title mb-0">
|
||||||
|
<h5 class="m-0 me-2">Segmentasi Petani</h5>
|
||||||
|
<p class="card-subtitle">untuk semua komoditas</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="card-body">
|
||||||
|
<div class="table-responsive text-nowrap">
|
||||||
|
<table class="table card-table table-border-top-0 table-border-bottom-0" id="tabel-petani">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th>Petani</th>
|
||||||
|
<th>Jenis Kelamin</th>
|
||||||
|
<th>Usia</th>
|
||||||
|
<th>Komoditas Utama</th>
|
||||||
|
<th>Segmentasi</th>
|
||||||
|
<th>Indeks</th>
|
||||||
|
<th>D2</th>
|
||||||
|
<th>D4</th>
|
||||||
|
<th>D6</th>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
@foreach ($petani as $item)
|
||||||
|
<tr>
|
||||||
|
<td><span class="text-heading">{{ $item->nama }}</span></td>
|
||||||
|
<td>{{ $item->jenis_kelamin ? 'Laki-laki' : 'Perempuan' }}</td>
|
||||||
|
<td>{{ $item->umur }} tahun</td>
|
||||||
|
<td>{{ $item->komoditas?->nama }}</td>
|
||||||
|
<td>
|
||||||
|
@if($item->segmen() == 'Penggerak')
|
||||||
|
<span class="badge bg-label-success">Penggerak</span>
|
||||||
|
@elseif($item->segmen() == 'Perintis')
|
||||||
|
<span class="badge bg-label-info">Perintis</span>
|
||||||
|
@elseif($item->segmen() == 'Pemerhati')
|
||||||
|
<span class="badge bg-label-warning">Pemerhati</span>
|
||||||
|
@elseif($item->segmen() == 'Pemula')
|
||||||
|
<span class="badge bg-label-danger">Pemula</span>
|
||||||
|
@endif
|
||||||
|
</td>
|
||||||
|
<td>{{ number_format($item->skor?->skor_kesiapan_adopsi, 2, '.', ',') }}</td>
|
||||||
|
<td>{{ number_format($item->skor?->skor_d2_sistem_praktik_budidaya, 2, '.', ',') }}</td>
|
||||||
|
<td>{{ number_format($item->skor?->skor_d4_sosial_ekonomi, 2, '.', ',') }}</td>
|
||||||
|
<td>{{ number_format($item->skor?->skor_d6_rantai_nilai_akses_pasar, 2, '.', ',') }}</td>
|
||||||
|
</tr>
|
||||||
|
@endforeach
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@endsection
|
@endsection
|
||||||
|
|
||||||
|
@push('scripts')
|
||||||
|
<script src="https://cdn.jsdelivr.net/npm/apexcharts"></script>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
$(document).ready(function() {
|
||||||
|
|
||||||
|
$("#tabel-petani").DataTable({
|
||||||
|
"paging": true,
|
||||||
|
"lengthChange": true,
|
||||||
|
"searching": true,
|
||||||
|
"ordering": false,
|
||||||
|
"info": true,
|
||||||
|
"autoWidth": false,
|
||||||
|
"responsive": true,
|
||||||
|
})
|
||||||
|
|
||||||
|
|
||||||
|
let cardColor, labelColor, fontFamily, headingColor, shadeColor, legendColor, borderColor, barBgColor;
|
||||||
|
if (isDarkStyle) {
|
||||||
|
barBgColor = '#3d4157';
|
||||||
|
shadeColor = 'dark';
|
||||||
|
} else {
|
||||||
|
barBgColor = '#efeef0';
|
||||||
|
shadeColor = '';
|
||||||
|
}
|
||||||
|
cardColor = config.colors.cardColor;
|
||||||
|
labelColor = config.colors.textMuted;
|
||||||
|
legendColor = config.colors.bodyColor;
|
||||||
|
borderColor = config.colors.borderColor;
|
||||||
|
headingColor = config.colors.headingColor;
|
||||||
|
|
||||||
|
var radarDimensi = new ApexCharts($("#chart-dimensi")[0],
|
||||||
|
options = {
|
||||||
|
chart: {
|
||||||
|
height: 340,
|
||||||
|
type: 'radar',
|
||||||
|
toolbar: {
|
||||||
|
show: false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
series: [
|
||||||
|
{
|
||||||
|
name: "Rata-rata Dimensi Kesiapan Adopsi",
|
||||||
|
data: [{{ round($skorDimensi->skor_d2_sistem_praktik_budidaya, 2) }},
|
||||||
|
{{ round($skorDimensi->skor_d4_sosial_ekonomi, 2) }},
|
||||||
|
{{ round($skorDimensi->skor_d6_rantai_nilai_akses_pasar, 2) }}]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
labels: ['Sistem & Praktik Budidaya', 'Sosial Ekonomi Rumah Tangga', 'Rantai Nilai & Akses Pasar'],
|
||||||
|
plotOptions: {
|
||||||
|
radar: {
|
||||||
|
polygons: {
|
||||||
|
strokeColors: borderColor,
|
||||||
|
connectorColors: borderColor
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
stroke: {
|
||||||
|
width: 2
|
||||||
|
},
|
||||||
|
legend: {
|
||||||
|
show: true,
|
||||||
|
fontSize: '13px',
|
||||||
|
position: 'bottom',
|
||||||
|
labels: {
|
||||||
|
colors: legendColor,
|
||||||
|
useSeriesColors: false
|
||||||
|
},
|
||||||
|
markers: {
|
||||||
|
height: 12,
|
||||||
|
width: 12
|
||||||
|
},
|
||||||
|
itemMargin: {
|
||||||
|
horizontal: 10
|
||||||
|
},
|
||||||
|
onItemHover: {
|
||||||
|
highlightDataSeries: false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
colors: [config.colors.primary, config.colors.info],
|
||||||
|
fill: {
|
||||||
|
opacity: 0.85
|
||||||
|
},
|
||||||
|
markers: {
|
||||||
|
show: true,
|
||||||
|
width: 1,
|
||||||
|
},
|
||||||
|
grid: {
|
||||||
|
show: false,
|
||||||
|
padding: {
|
||||||
|
top: -25,
|
||||||
|
bottom: -5
|
||||||
|
}
|
||||||
|
},
|
||||||
|
xaxis: {
|
||||||
|
categories: ['D1', 'D2', 'D3'],
|
||||||
|
labels: {
|
||||||
|
show: true,
|
||||||
|
style: {
|
||||||
|
colors: [labelColor, labelColor, labelColor, labelColor, labelColor, labelColor],
|
||||||
|
fontSize: '13px',
|
||||||
|
fontFamily: fontFamily
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
yaxis: {
|
||||||
|
show: true,
|
||||||
|
min: 0,
|
||||||
|
max: 5,
|
||||||
|
tickAmount: 5
|
||||||
|
},
|
||||||
|
responsive: [
|
||||||
|
{
|
||||||
|
breakpoint: 769,
|
||||||
|
options: {
|
||||||
|
chart: {
|
||||||
|
height: 400
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
});
|
||||||
|
radarDimensi.render();
|
||||||
|
|
||||||
|
|
||||||
|
var radarKomponen = new ApexCharts($("#chart-komponen")[0],
|
||||||
|
options = {
|
||||||
|
chart: {
|
||||||
|
height: 340,
|
||||||
|
type: 'radar',
|
||||||
|
toolbar: {
|
||||||
|
show: false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
series: [
|
||||||
|
{
|
||||||
|
name: "Rata-rata Komponen Kesiapan Adopsi",
|
||||||
|
data: [
|
||||||
|
{{ round($skorKomponen->skor_komp_1_d4_k3_motivasi_kapasitas_adopsi, 2) }},
|
||||||
|
{{ round($skorKomponen->skor_komp_2_d4_k2_ekonomi_rumah_tangga, 2) }},
|
||||||
|
{{ round($skorKomponen->skor_komp_3_d2_praktik_budidaya_gap, 2) }},
|
||||||
|
{{ round($skorKomponen->skor_komp_4_d4_k4_keterlibatan_kelembagaan, 2) }},
|
||||||
|
{{ round($skorKomponen->skor_komp_5_d4_k5_k6_akses_kebebasan_keuangan, 2) }},
|
||||||
|
{{ round($skorKomponen->skor_komp_6_d6_k1_k4_k5_rantai_nilai_akses_pasar, 2) }}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
lotOptions: {
|
||||||
|
radar: {
|
||||||
|
polygons: {
|
||||||
|
strokeColors: borderColor,
|
||||||
|
connectorColors: borderColor
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
stroke: {
|
||||||
|
width: 2
|
||||||
|
},
|
||||||
|
legend: {
|
||||||
|
show: true,
|
||||||
|
fontSize: '13px',
|
||||||
|
position: 'bottom',
|
||||||
|
labels: {
|
||||||
|
colors: legendColor,
|
||||||
|
useSeriesColors: false
|
||||||
|
},
|
||||||
|
markers: {
|
||||||
|
height: 12,
|
||||||
|
width: 12
|
||||||
|
},
|
||||||
|
itemMargin: {
|
||||||
|
horizontal: 10
|
||||||
|
},
|
||||||
|
onItemHover: {
|
||||||
|
highlightDataSeries: false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
colors: [config.colors.primary, config.colors.info],
|
||||||
|
fill: {
|
||||||
|
opacity: 0.85
|
||||||
|
},
|
||||||
|
markers: {
|
||||||
|
show: true,
|
||||||
|
width: 1,
|
||||||
|
},
|
||||||
|
grid: {
|
||||||
|
show: false,
|
||||||
|
padding: {
|
||||||
|
top: -25,
|
||||||
|
bottom: -5
|
||||||
|
}
|
||||||
|
},
|
||||||
|
xaxis: {
|
||||||
|
categories: ['K1', 'K2', 'K3', 'K4', 'K5', 'K6'],
|
||||||
|
labels: {
|
||||||
|
show: true,
|
||||||
|
style: {
|
||||||
|
colors: [labelColor, labelColor, labelColor, labelColor, labelColor, labelColor],
|
||||||
|
fontSize: '13px',
|
||||||
|
fontFamily: fontFamily
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
yaxis: {
|
||||||
|
show: true,
|
||||||
|
min: 0,
|
||||||
|
max: 5,
|
||||||
|
tickAmount: 5
|
||||||
|
},
|
||||||
|
responsive: [
|
||||||
|
{
|
||||||
|
breakpoint: 769,
|
||||||
|
options: {
|
||||||
|
chart: {
|
||||||
|
height: 400
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
});
|
||||||
|
radarKomponen.render();
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
@endpush
|
||||||
|
|||||||
@@ -88,12 +88,13 @@
|
|||||||
@if($profile)
|
@if($profile)
|
||||||
<button
|
<button
|
||||||
type="button"
|
type="button"
|
||||||
class="btn btn-sm btn-icon btn-text-secondary rounded-pill"
|
class="btn btn-sm btn-outline-primary d-inline-flex align-items-center gap-1 px-3"
|
||||||
data-bs-toggle="offcanvas"
|
data-bs-toggle="offcanvas"
|
||||||
data-bs-target="#editProfileOffcanvas"
|
data-bs-target="#editProfileOffcanvas"
|
||||||
aria-controls="editProfileOffcanvas"
|
aria-controls="editProfileOffcanvas"
|
||||||
title="Edit profil">
|
title="Edit profil">
|
||||||
<i class="icon-base ti tabler-edit icon-lg"></i>
|
<i class="icon-base ti tabler-edit icon-sm"></i>
|
||||||
|
<span>Edit</span>
|
||||||
</button>
|
</button>
|
||||||
@endif
|
@endif
|
||||||
</div>
|
</div>
|
||||||
@@ -106,6 +107,7 @@
|
|||||||
<i class="icon-base ti tabler-circles icon-lg"></i><span class="fw-medium mx-2">Role:</span>
|
<i class="icon-base ti tabler-circles icon-lg"></i><span class="fw-medium mx-2">Role:</span>
|
||||||
<span>{{ $profile->role ?? 'N/A' }}</span>
|
<span>{{ $profile->role ?? 'N/A' }}</span>
|
||||||
</li>
|
</li>
|
||||||
|
@if(auth()->user()->role === \App\Enums\Role::PETANI)
|
||||||
<li class="d-flex align-items-start mb-4">
|
<li class="d-flex align-items-start mb-4">
|
||||||
<i class="icon-base ti tabler-id icon-lg"></i><span class="fw-medium mx-2">No KTP:</span>
|
<i class="icon-base ti tabler-id icon-lg"></i><span class="fw-medium mx-2">No KTP:</span>
|
||||||
<span>{{ $profile->ktp ?? 'N/A' }}</span>
|
<span>{{ $profile->ktp ?? 'N/A' }}</span>
|
||||||
@@ -114,6 +116,7 @@
|
|||||||
<i class="icon-base ti tabler-users icon-lg"></i><span class="fw-medium mx-2">No KK:</span>
|
<i class="icon-base ti tabler-users icon-lg"></i><span class="fw-medium mx-2">No KK:</span>
|
||||||
<span>{{ $profile->kk ?? 'N/A' }}</span>
|
<span>{{ $profile->kk ?? 'N/A' }}</span>
|
||||||
</li>
|
</li>
|
||||||
|
@endif
|
||||||
<li class="d-flex align-items-start mb-0">
|
<li class="d-flex align-items-start mb-0">
|
||||||
<i class="icon-base ti tabler-map-pin icon-lg flex-shrink-0"></i><span class="fw-medium mx-2">Alamat:</span>
|
<i class="icon-base ti tabler-map-pin icon-lg flex-shrink-0"></i><span class="fw-medium mx-2">Alamat:</span>
|
||||||
<span>{{ $alamatLengkap ?? 'N/A' }}</span>
|
<span>{{ $alamatLengkap ?? 'N/A' }}</span>
|
||||||
@@ -268,16 +271,18 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="mb-4">
|
<div class="mb-4">
|
||||||
<label class="form-label" for="quick-profile-telepon">Telepon</label>
|
<label class="form-label" for="quick-profile-telepon">Telepon</label>
|
||||||
<input type="text" class="form-control" id="quick-profile-telepon" name="telepon" value="{{ $profile->telepon }}" maxlength="13" required>
|
<input type="text" class="form-control" id="quick-profile-telepon" name="telepon" value="{{ $profile->telepon }}" maxlength="13">
|
||||||
</div>
|
</div>
|
||||||
|
@if($profile->role === \App\Enums\Role::PETANI->value)
|
||||||
<div class="mb-4">
|
<div class="mb-4">
|
||||||
<label class="form-label" for="quick-profile-ktp">No KTP</label>
|
<label class="form-label" for="quick-profile-ktp">No KTP</label>
|
||||||
<input type="text" class="form-control" id="quick-profile-ktp" name="ktp" value="{{ $profile->ktp }}" maxlength="16">
|
<input type="text" class="form-control" id="quick-profile-ktp" name="ktp" value="{{ $profile->ktp }}" maxlength="16">
|
||||||
</div>
|
</div>
|
||||||
<div class="mb-4">
|
<div class="mb-4">
|
||||||
<label class="form-label" for="quick-profile-kk">No KK</label>
|
<label class="form-label" for="quick-profile-kk">No KK</label>
|
||||||
<input type="text" class="form-control" id="quick-profile-kk" name="kk" value="{{ $profile->kk }}" maxlength="16">
|
<input type="text" class="form-control" id="quick-profile-kk" name="kk" value="{{ $profile->kk }}" maxlength="16">
|
||||||
</div>
|
</div>
|
||||||
|
@endif
|
||||||
<div class="mb-4">
|
<div class="mb-4">
|
||||||
<label class="form-label" for="quick-profile-alamat">Alamat</label>
|
<label class="form-label" for="quick-profile-alamat">Alamat</label>
|
||||||
<textarea class="form-control" id="quick-profile-alamat" name="alamat" rows="4">{{ $profile->alamat }}</textarea>
|
<textarea class="form-control" id="quick-profile-alamat" name="alamat" rows="4">{{ $profile->alamat }}</textarea>
|
||||||
|
|||||||
@@ -80,6 +80,7 @@
|
|||||||
<script src="{{ asset('assets/js/dashboards-analytics.js') }}"></script>
|
<script src="{{ asset('assets/js/dashboards-analytics.js') }}"></script>
|
||||||
|
|
||||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-validate/1.19.5/jquery.validate.min.js"></script>
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-validate/1.19.5/jquery.validate.min.js"></script>
|
||||||
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-validate/1.19.5/additional-methods.min.js"></script>
|
||||||
|
|
||||||
<script src="https://cdn.jsdelivr.net/npm/sweetalert2@11"></script>
|
<script src="https://cdn.jsdelivr.net/npm/sweetalert2@11"></script>
|
||||||
|
|
||||||
|
|||||||
@@ -338,7 +338,7 @@
|
|||||||
href="javascript:void(0);"
|
href="javascript:void(0);"
|
||||||
data-bs-toggle="dropdown">
|
data-bs-toggle="dropdown">
|
||||||
<div class="avatar avatar-online">
|
<div class="avatar avatar-online">
|
||||||
<img src="../../assets/img/avatars/1.png" alt class="rounded-circle" />
|
<img src="{{ asset('assets/img/avatars/3.jpg') }}" alt="Avatar" class="rounded-circle" />
|
||||||
</div>
|
</div>
|
||||||
</a>
|
</a>
|
||||||
<ul class="dropdown-menu dropdown-menu-end">
|
<ul class="dropdown-menu dropdown-menu-end">
|
||||||
@@ -347,7 +347,7 @@
|
|||||||
<div class="d-flex align-items-center">
|
<div class="d-flex align-items-center">
|
||||||
<div class="flex-shrink-0 me-2">
|
<div class="flex-shrink-0 me-2">
|
||||||
<div class="avatar avatar-online">
|
<div class="avatar avatar-online">
|
||||||
<img src="../../assets/img/avatars/1.png" alt class="rounded-circle" />
|
<img src="{{ asset('assets/img/avatars/3.jpg') }}" alt="Avatar" class="rounded-circle" />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="flex-grow-1">
|
<div class="flex-grow-1">
|
||||||
|
|||||||
@@ -8,7 +8,38 @@
|
|||||||
@csrf
|
@csrf
|
||||||
<div class="mb-4 form-control-validation">
|
<div class="mb-4 form-control-validation">
|
||||||
<label class="form-label" for="add-nama">Nama Komoditas<span class="text-danger">*</span></label>
|
<label class="form-label" for="add-nama">Nama Komoditas<span class="text-danger">*</span></label>
|
||||||
<input type="text" class="form-control" id="add-nama" name="nama" placeholder="Cth: Padi Sabrang" />
|
<input type="text" class="form-control" id="add-nama" name="nama" placeholder="Cth: Kopi" />
|
||||||
|
</div>
|
||||||
|
<div class="mb-4 form-control-validation">
|
||||||
|
<label class="form-label" for="add-kode">Kode Komoditas<span class="text-danger">*</span></label>
|
||||||
|
<input type="text" class="form-control" id="add-kode" name="kode" placeholder="Cth: KP" />
|
||||||
|
</div>
|
||||||
|
<div class="mb-4 form-control-validation">
|
||||||
|
<label class="form-label d-block">Komoditas Utama <span class="text-danger">*</span></label>
|
||||||
|
<input type="hidden" name="is_utama" value="0">
|
||||||
|
|
||||||
|
<label class="switch switch-lg"><input type="checkbox" class="switch-input" id="add-is-utama" name="is_utama" value="1" @checked(old('is_utama', false))>
|
||||||
|
|
||||||
|
<span class="switch-toggle-slider">
|
||||||
|
<span class="switch-on">
|
||||||
|
<i class="icon-base ti tabler-check"></i>
|
||||||
|
</span>
|
||||||
|
|
||||||
|
<span class="switch-off">
|
||||||
|
<i class="icon-base ti tabler-x"></i>
|
||||||
|
</span>
|
||||||
|
</span>
|
||||||
|
|
||||||
|
<span class="switch-label" id="add-is-utama-label">
|
||||||
|
{{ old('is_utama', false) ? 'Komoditas Utama' : 'Tidak Termasuk' }}
|
||||||
|
</span>
|
||||||
|
</label>
|
||||||
|
|
||||||
|
@error('is_utama')
|
||||||
|
<div class="invalid-feedback d-block">
|
||||||
|
{{ $message }}
|
||||||
|
</div>
|
||||||
|
@enderror
|
||||||
</div>
|
</div>
|
||||||
<div class="mt-4">
|
<div class="mt-4">
|
||||||
<button type="submit" class="btn btn-primary me-sm-3 me-1 data-submit">Simpan</button>
|
<button type="submit" class="btn btn-primary me-sm-3 me-1 data-submit">Simpan</button>
|
||||||
|
|||||||
@@ -6,6 +6,7 @@
|
|||||||
<div class="offcanvas-body mx-0 flex-grow-0 p-6 h-100">
|
<div class="offcanvas-body mx-0 flex-grow-0 p-6 h-100">
|
||||||
<form id="editKomoditasForm" class="pt-0" method="POST">
|
<form id="editKomoditasForm" class="pt-0" method="POST">
|
||||||
@csrf
|
@csrf
|
||||||
|
@method('PUT')
|
||||||
<input type="hidden" name="_method" value="PUT">
|
<input type="hidden" name="_method" value="PUT">
|
||||||
<input type="hidden" id="edit-id" name="id">
|
<input type="hidden" id="edit-id" name="id">
|
||||||
|
|
||||||
@@ -13,6 +14,39 @@
|
|||||||
<label class="form-label" for="edit-nama">Nama Komoditas<span class="text-danger">*</span></label>
|
<label class="form-label" for="edit-nama">Nama Komoditas<span class="text-danger">*</span></label>
|
||||||
<input type="text" class="form-control" id="edit-nama" name="nama" />
|
<input type="text" class="form-control" id="edit-nama" name="nama" />
|
||||||
</div>
|
</div>
|
||||||
|
<div class="mb-4 form-control-validation">
|
||||||
|
<label class="form-label" for="edit-kode">Kode Komoditas<span class="text-danger">*</span></label>
|
||||||
|
<input type="text" class="form-control" id="edit-kode" name="kode" />
|
||||||
|
</div>
|
||||||
|
<div class="mb-4 form-control-validation">
|
||||||
|
<label class="form-label d-block" for="edit-is-utama">Komoditas Utama <span class="text-danger">*</span></label>
|
||||||
|
|
||||||
|
<input type="hidden" name="is_utama" value="0">
|
||||||
|
|
||||||
|
<label class="switch switch-lg">
|
||||||
|
<input
|
||||||
|
type="checkbox"
|
||||||
|
class="switch-input"
|
||||||
|
id="edit-is-utama"
|
||||||
|
name="is_utama"
|
||||||
|
value="1"
|
||||||
|
>
|
||||||
|
|
||||||
|
<span class="switch-toggle-slider">
|
||||||
|
<span class="switch-on">
|
||||||
|
<i class="icon-base ti tabler-check"></i>
|
||||||
|
</span>
|
||||||
|
|
||||||
|
<span class="switch-off">
|
||||||
|
<i class="icon-base ti tabler-x"></i>
|
||||||
|
</span>
|
||||||
|
</span>
|
||||||
|
|
||||||
|
<span class="switch-label" id="edit-is-utama-label">
|
||||||
|
Tidak Termasuk
|
||||||
|
</span>
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
<div class="mt-4">
|
<div class="mt-4">
|
||||||
<button type="submit" class="btn btn-primary me-sm-3 me-1 data-submit">Update</button>
|
<button type="submit" class="btn btn-primary me-sm-3 me-1 data-submit">Update</button>
|
||||||
<button type="reset" class="btn btn-label-secondary" data-bs-dismiss="offcanvas">Batal</button>
|
<button type="reset" class="btn btn-label-secondary" data-bs-dismiss="offcanvas">Batal</button>
|
||||||
|
|||||||
@@ -49,6 +49,7 @@
|
|||||||
<tr>
|
<tr>
|
||||||
<th>No</th>
|
<th>No</th>
|
||||||
<th>Nama Komoditas</th>
|
<th>Nama Komoditas</th>
|
||||||
|
<th>Kode Komoditas</th>
|
||||||
<th>Aksi</th>
|
<th>Aksi</th>
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
@@ -57,6 +58,7 @@
|
|||||||
<tr>
|
<tr>
|
||||||
<td>{{ $komoditas->firstItem() + $index }}</td>
|
<td>{{ $komoditas->firstItem() + $index }}</td>
|
||||||
<td><span class="text-heading fw-medium">{{ $item->nama }}</span></td>
|
<td><span class="text-heading fw-medium">{{ $item->nama }}</span></td>
|
||||||
|
<td><span class="text-heading fw-medium">{{ $item->kode }}</span></td>
|
||||||
<td>
|
<td>
|
||||||
<div class="d-flex align-items-center">
|
<div class="d-flex align-items-center">
|
||||||
<a href="javascript:;" class="btn btn-icon btn-text-secondary rounded-pill view-record" data-id="{{ $item->id }}"><i class="ti tabler-eye ti-md"></i></a>
|
<a href="javascript:;" class="btn btn-icon btn-text-secondary rounded-pill view-record" data-id="{{ $item->id }}"><i class="ti tabler-eye ti-md"></i></a>
|
||||||
@@ -144,6 +146,19 @@
|
|||||||
if (res.status === 'success') {
|
if (res.status === 'success') {
|
||||||
$('#edit-id').val(res.data.id);
|
$('#edit-id').val(res.data.id);
|
||||||
$('#edit-nama').val(res.data.nama);
|
$('#edit-nama').val(res.data.nama);
|
||||||
|
$('#edit-kode').val(res.data.kode);
|
||||||
|
|
||||||
|
const isUtama =
|
||||||
|
res.data.is_utama === true ||
|
||||||
|
res.data.is_utama === 1 ||
|
||||||
|
res.data.is_utama === '1';
|
||||||
|
|
||||||
|
$('#edit-is-utama').prop('checked', isUtama);
|
||||||
|
|
||||||
|
$('#edit-is-utama-label').text(
|
||||||
|
isUtama ? 'Komoditas Utama' : 'Tidak Termasuk'
|
||||||
|
);
|
||||||
|
|
||||||
if (typeof fvEdit !== 'undefined') fvEdit.resetForm();
|
if (typeof fvEdit !== 'undefined') fvEdit.resetForm();
|
||||||
offcanvasEdit.show();
|
offcanvasEdit.show();
|
||||||
}
|
}
|
||||||
@@ -166,6 +181,15 @@
|
|||||||
$btn.removeClass('disabled');
|
$btn.removeClass('disabled');
|
||||||
if (res.status === 'success') {
|
if (res.status === 'success') {
|
||||||
$('#view-nama').val(res.data.nama);
|
$('#view-nama').val(res.data.nama);
|
||||||
|
$('#view-kode').val(res.data.kode);
|
||||||
|
const isUtama =
|
||||||
|
res.data.is_utama === true ||
|
||||||
|
res.data.is_utama === 1 ||
|
||||||
|
res.data.is_utama === '1';
|
||||||
|
|
||||||
|
$('#view-is-utama').val(
|
||||||
|
isUtama ? 'Komoditas Utama' : 'Tidak Termasuk'
|
||||||
|
);
|
||||||
offcanvasView.show();
|
offcanvasView.show();
|
||||||
}
|
}
|
||||||
}).fail((xhr) => {
|
}).fail((xhr) => {
|
||||||
@@ -177,7 +201,9 @@
|
|||||||
|
|
||||||
const editForm = document.getElementById('editKomoditasForm');
|
const editForm = document.getElementById('editKomoditasForm');
|
||||||
let fvEdit = FormValidation.formValidation(editForm, {
|
let fvEdit = FormValidation.formValidation(editForm, {
|
||||||
fields: { nama: { validators: { notEmpty: { message: 'Nama komoditas wajib diisi' } } } },
|
fields: { nama: { validators: { notEmpty: { message: 'Nama komoditas wajib diisi' } } } ,
|
||||||
|
kode: {validators: { notEmpty: { message: 'Kode komoditas wajib diisi' } } }
|
||||||
|
},
|
||||||
plugins: {
|
plugins: {
|
||||||
trigger: new FormValidation.plugins.Trigger(),
|
trigger: new FormValidation.plugins.Trigger(),
|
||||||
bootstrap5: new FormValidation.plugins.Bootstrap5({ eleValidClass: '', rowSelector: '.form-control-validation' }),
|
bootstrap5: new FormValidation.plugins.Bootstrap5({ eleValidClass: '', rowSelector: '.form-control-validation' }),
|
||||||
@@ -245,5 +271,20 @@
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
document.addEventListener('DOMContentLoaded', function () {
|
||||||
|
const switchInput = document.getElementById('add-is-utama');
|
||||||
|
const switchLabel = document.getElementById('add-is-utama-label');
|
||||||
|
|
||||||
|
function updateKomoditasLabel() {
|
||||||
|
switchLabel.textContent = switchInput.checked
|
||||||
|
? 'Komoditas Utama'
|
||||||
|
: 'Tidak Termasuk';
|
||||||
|
}
|
||||||
|
|
||||||
|
switchInput.addEventListener('change', updateKomoditasLabel);
|
||||||
|
|
||||||
|
updateKomoditasLabel();
|
||||||
|
});
|
||||||
</script>
|
</script>
|
||||||
@endpush
|
@endpush
|
||||||
@@ -9,6 +9,14 @@
|
|||||||
<label class="form-label" for="view-nama">Nama Komoditas</label>
|
<label class="form-label" for="view-nama">Nama Komoditas</label>
|
||||||
<input type="text" class="form-control bg-lighter" id="view-nama" readonly />
|
<input type="text" class="form-control bg-lighter" id="view-nama" readonly />
|
||||||
</div>
|
</div>
|
||||||
|
<div class="mb-4">
|
||||||
|
<label class="form-label" for="view-kode">Kode Komoditas</label>
|
||||||
|
<input type="text" class="form-control bg-lighter" id="view-kode" readonly />
|
||||||
|
</div>
|
||||||
|
<div class="mb-4">
|
||||||
|
<label class="form-label" for="view-is-utama">Komoditas Utama</label>
|
||||||
|
<input type="text" class="form-control bg-lighter" id="view-is-utama" readonly>
|
||||||
|
</div>
|
||||||
<div class="mt-4">
|
<div class="mt-4">
|
||||||
<button type="button" class="btn btn-label-secondary d-grid w-100" data-bs-dismiss="offcanvas">Tutup</button>
|
<button type="button" class="btn btn-label-secondary d-grid w-100" data-bs-dismiss="offcanvas">Tutup</button>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -27,7 +27,7 @@
|
|||||||
|
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-md-6 mb-4 form-control-validation">
|
<div class="col-md-6 mb-4 form-control-validation">
|
||||||
<label class="form-label" for="edit-profile-telepon">No. Telepon<span class="text-danger">*</span></label>
|
<label class="form-label" for="edit-profile-telepon">No. Telepon</label>
|
||||||
<input type="text" class="form-control" id="edit-profile-telepon" name="telepon" value="{{ $profile->telepon }}" />
|
<input type="text" class="form-control" id="edit-profile-telepon" name="telepon" value="{{ $profile->telepon }}" />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -47,27 +47,6 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="col-sm-6 col-md-4 col-xl-3">
|
|
||||||
<div class="card shadow-sm border-0 h-100">
|
|
||||||
<div class="card-body p-4">
|
|
||||||
<div class="d-flex justify-content-between">
|
|
||||||
<div>
|
|
||||||
<span class="text-muted d-block mb-2">Titik Penanaman</span>
|
|
||||||
<h2 class="mb-0 fw-bold text-dark" style="font-size: 2.5rem;">
|
|
||||||
{{ number_format($totalTitikTanam, 0, ',', '.') }}
|
|
||||||
</h2>
|
|
||||||
</div>
|
|
||||||
<div>
|
|
||||||
<div class="d-flex align-items-center justify-content-center bg-label-warning text-warning" style="width: 56px; height: 56px; border-radius: 12px;">
|
|
||||||
<i class="ti tabler-map-pin" style="font-size: 1.8rem;"></i>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<small class="text-muted d-block mt-3">Distribusi lahan aktif</small>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="card">
|
<div class="card">
|
||||||
|
|||||||
@@ -1,3 +1,17 @@
|
|||||||
|
@push('style')
|
||||||
|
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/croppie/2.6.5/croppie.min.css" />
|
||||||
|
|
||||||
|
<style>
|
||||||
|
#croppie-container {
|
||||||
|
width: 100%;
|
||||||
|
height: 350px;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
@endpush
|
||||||
|
|
||||||
|
@push('scripts')
|
||||||
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/croppie/2.6.5/croppie.min.js"></script>
|
||||||
|
|
||||||
@extends('layout.main')
|
@extends('layout.main')
|
||||||
|
|
||||||
@section('content')
|
@section('content')
|
||||||
@@ -29,7 +43,7 @@
|
|||||||
<div class=" d-flex align-items-center flex-column">
|
<div class=" d-flex align-items-center flex-column">
|
||||||
<img id="fotoPreview"
|
<img id="fotoPreview"
|
||||||
class="img-fluid rounded mb-4"
|
class="img-fluid rounded mb-4"
|
||||||
src="{{ isset($petani) && $petani?->foto ? asset('storage/' . $petani->foto) : asset('assets/img/avatars/1.png') }}"
|
src="{{ isset($petani) && $petani?->foto ? asset('storage/' . $petani->foto) : asset('assets/img/avatars/3.jpg') }}"
|
||||||
height="120" width="120"
|
height="120" width="120"
|
||||||
alt="Foto profil petani"
|
alt="Foto profil petani"
|
||||||
data-bs-toggle="tooltip" data-bs-placement="top"
|
data-bs-toggle="tooltip" data-bs-placement="top"
|
||||||
@@ -230,6 +244,24 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div class="modal fade" id="cropModal" tabindex="-1" aria-labelledby="cropModalLabel" aria-hidden="true" data-bs-backdrop="static" data-bs-keyboard="false">
|
||||||
|
<div class="modal-dialog modal-dialog-centered">
|
||||||
|
<div class="modal-content">
|
||||||
|
<div class="modal-header">
|
||||||
|
<h5 class="modal-title" id="cropModalLabel">Sesuaikan Foto Profil</h5>
|
||||||
|
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
|
||||||
|
</div>
|
||||||
|
<div class="modal-body">
|
||||||
|
<div id="croppie-container"></div>
|
||||||
|
</div>
|
||||||
|
<div class="modal-footer">
|
||||||
|
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Batal</button>
|
||||||
|
<button type="button" class="btn btn-primary" id="cropImageBtn">Potong & Simpan</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
@endsection
|
@endsection
|
||||||
|
|
||||||
@push('scripts')
|
@push('scripts')
|
||||||
@@ -300,24 +332,74 @@
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
$('#add-petani-desa').select2();
|
$('#add-petani-desa').select2();
|
||||||
|
|
||||||
|
let croppieInstance = null;
|
||||||
|
|
||||||
$('#fotoPreview').on('click', function () {
|
$('#fotoPreview').on('click', function () {
|
||||||
|
$('#foto').val('');
|
||||||
$('#foto').click();
|
$('#foto').click();
|
||||||
});
|
});
|
||||||
|
|
||||||
$('#foto').on('change', function (e) {
|
$('#foto').on('change', function (e) {
|
||||||
|
|
||||||
const file = e.target.files[0];
|
const file = e.target.files[0];
|
||||||
if (!file) return;
|
if (!file) return;
|
||||||
|
|
||||||
|
if(!file.type.match(/^image\/(png|jpeg|jpg)$/)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
const reader = new FileReader();
|
const reader = new FileReader();
|
||||||
reader.onload = function (event) {
|
reader.onload = function (event) {
|
||||||
$('#fotoPreview').attr('src', event.target.result);
|
$('#cropModal').modal('show');
|
||||||
|
|
||||||
|
if (!croppieInstance) {
|
||||||
|
const el = document.getElementById('croppie-container');
|
||||||
|
croppieInstance = new Croppie(el, {
|
||||||
|
viewport: { width: 200, height: 200,},
|
||||||
|
boundary: { width: 300, height: 300 },
|
||||||
|
showZoomer: true,
|
||||||
|
enableOrientation: true
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
setTimeout(function() {
|
||||||
|
croppieInstance.bind({
|
||||||
|
url: event.target.result
|
||||||
|
});
|
||||||
|
}, 200);
|
||||||
};
|
};
|
||||||
|
|
||||||
reader.readAsDataURL(file);
|
reader.readAsDataURL(file);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
$('#cropImageBtn').on('click', function() {
|
||||||
|
croppieInstance.result({
|
||||||
|
type: 'base64',
|
||||||
|
format: 'png',
|
||||||
|
size: 'viewport'
|
||||||
|
}).then(function(base64) {
|
||||||
|
|
||||||
|
$('#fotoPreview').attr('src', base64);
|
||||||
|
|
||||||
|
function dataURLtoFile(dataurl, filename) {
|
||||||
|
let arr = dataurl.split(','), mime = arr[0].match(/:(.*?);/)[1],
|
||||||
|
bstr = atob(arr[1]), n = bstr.length, u8arr = new Uint8Array(n);
|
||||||
|
while(n--){
|
||||||
|
u8arr[n] = bstr.charCodeAt(n);
|
||||||
|
}
|
||||||
|
return new File([u8arr], filename, {type: mime});
|
||||||
|
}
|
||||||
|
|
||||||
|
let croppedFile = dataURLtoFile(base64, 'foto_profil_crop.png');
|
||||||
|
|
||||||
|
let dataTransfer = new DataTransfer();
|
||||||
|
dataTransfer.items.add(croppedFile);
|
||||||
|
document.getElementById('foto').files = dataTransfer.files;
|
||||||
|
|
||||||
|
$('#cropModal').modal('hide');
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
// 1 MB = 1048576 bytes
|
// 1 MB = 1048576 bytes
|
||||||
$.validator.addMethod('maxfilesize', function (value, element, param) {
|
$.validator.addMethod('maxfilesize', function (value, element, param) {
|
||||||
return this.optional(element) || (element.files[0] && element.files[0].size <= param);
|
return this.optional(element) || (element.files[0] && element.files[0].size <= param);
|
||||||
@@ -329,7 +411,7 @@
|
|||||||
ktp: { required: true, digits: true, minlength: 16, maxlength: 16 },
|
ktp: { required: true, digits: true, minlength: 16, maxlength: 16 },
|
||||||
kk: { required: true, digits: true, minlength: 16, maxlength: 16 },
|
kk: { required: true, digits: true, minlength: 16, maxlength: 16 },
|
||||||
tempat_lahir: { required: true },
|
tempat_lahir: { required: true },
|
||||||
tanggal_lahir: { required: true, date: true },
|
tanggal_lahir: { required: true },
|
||||||
jenis_kelamin: { required: true },
|
jenis_kelamin: { required: true },
|
||||||
pendidikan_terakhir: { required: true },
|
pendidikan_terakhir: { required: true },
|
||||||
komoditas_id: { required: true },
|
komoditas_id: { required: true },
|
||||||
@@ -349,7 +431,7 @@
|
|||||||
ktp: { required: "NIK wajib diisi", digits: "NIK harus berupa angka", minlength: "NIK harus 16 digit", maxlength: "NIK harus 16 digit" },
|
ktp: { required: "NIK wajib diisi", digits: "NIK harus berupa angka", minlength: "NIK harus 16 digit", maxlength: "NIK harus 16 digit" },
|
||||||
kk: { digits: "No. KK harus berupa angka", minlength: "No. KK harus 16 digit", maxlength: "No. KK harus 16 digit" },
|
kk: { digits: "No. KK harus berupa angka", minlength: "No. KK harus 16 digit", maxlength: "No. KK harus 16 digit" },
|
||||||
tempat_lahir: { required: "Tempat lahir wajib diisi" },
|
tempat_lahir: { required: "Tempat lahir wajib diisi" },
|
||||||
tanggal_lahir: { required: "Tanggal lahir wajib diisi", date: "Format tanggal salah" },
|
tanggal_lahir: { required: "Tanggal lahir wajib diisi" },
|
||||||
jenis_kelamin: { required: "Jenis kelamin wajib diisi" },
|
jenis_kelamin: { required: "Jenis kelamin wajib diisi" },
|
||||||
pendidikan_terakhir: { required: "Pendidikan terakhir wajib diisi" },
|
pendidikan_terakhir: { required: "Pendidikan terakhir wajib diisi" },
|
||||||
komoditas_id: { required: "Komoditas wajib diisi" },
|
komoditas_id: { required: "Komoditas wajib diisi" },
|
||||||
|
|||||||
@@ -93,34 +93,30 @@
|
|||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
<tbody>
|
<tbody>
|
||||||
@php($listBentukProduk = ['Buah segar hasil petik', 'Biji basah', 'Biji kering/Biji Kupas', 'Terfermentasi (Rp/kg)'])
|
@foreach ($hargaJualRows as $row)
|
||||||
@php($hargaJualPanen = $hargaJualPanen ?? collect())
|
|
||||||
|
|
||||||
@foreach ($listBentukProduk as $index => $bentuk)
|
|
||||||
@php($existingData = $hargaJualPanen->firstWhere('bentuk_produk', $bentuk))
|
|
||||||
<tr>
|
<tr>
|
||||||
<td>
|
<td>
|
||||||
<input type="hidden" name="harga_jual[{{ $index }}][bentuk_produk]" value="{{ $bentuk }}">
|
<input type="hidden" name="harga_jual[{{ $row['index'] }}][bentuk_produk]" value="{{ $row['bentuk'] }}">
|
||||||
<strong>{{ $bentuk }}:</strong>
|
<strong>{{ $row['bentuk'] }}:</strong>
|
||||||
</td>
|
</td>
|
||||||
<td>
|
<td>
|
||||||
<div class="input-group">
|
<div class="input-group">
|
||||||
<span class="input-group-text">Rp</span>
|
<span class="input-group-text">Rp</span>
|
||||||
<input type="number" min="0" class="form-control" name="harga_jual[{{ $index }}][harga_panen_terakhir]" value="{{ old('harga_jual.' . $index . '.harga_panen_terakhir', $existingData?->harga_panen_terakhir) }}">
|
<input type="text" inputmode="numeric" class="form-control rupiah-input" name="harga_jual[{{ $row['index'] }}][harga_panen_terakhir]" value="{{ old('harga_jual.' . $row['index'] . '.harga_panen_terakhir', $row['harga_panen_terakhir']) }}" placeholder="Contoh: 12.000">
|
||||||
<span class="input-group-text">/kg</span>
|
<span class="input-group-text">/kg</span>
|
||||||
</div>
|
</div>
|
||||||
</td>
|
</td>
|
||||||
<td>
|
<td>
|
||||||
<div class="input-group">
|
<div class="input-group">
|
||||||
<span class="input-group-text">Rp</span>
|
<span class="input-group-text">Rp</span>
|
||||||
<input type="number" min="0" class="form-control" name="harga_jual[{{ $index }}][harga_tahun_lalu]" value="{{ old('harga_jual.' . $index . '.harga_tahun_lalu', $existingData?->harga_tahun_lalu) }}">
|
<input type="text" inputmode="numeric" class="form-control rupiah-input" name="harga_jual[{{ $row['index'] }}][harga_tahun_lalu]" value="{{ old('harga_jual.' . $row['index'] . '.harga_tahun_lalu', $row['harga_tahun_lalu']) }}" placeholder="Contoh: 10.000">
|
||||||
<span class="input-group-text">/kg</span>
|
<span class="input-group-text">/kg</span>
|
||||||
</div>
|
</div>
|
||||||
</td>
|
</td>
|
||||||
<td>
|
<td>
|
||||||
<div class="input-group">
|
<div class="input-group">
|
||||||
<span class="input-group-text">Rp</span>
|
<span class="input-group-text">Rp</span>
|
||||||
<input type="number" min="0" class="form-control" name="harga_jual[{{ $index }}][harga_dua_tahun_lalu]" value="{{ old('harga_jual.' . $index . '.harga_dua_tahun_lalu', $existingData?->harga_dua_tahun_lalu) }}">
|
<input type="text" inputmode="numeric" class="form-control rupiah-input" name="harga_jual[{{ $row['index'] }}][harga_dua_tahun_lalu]" value="{{ old('harga_jual.' . $row['index'] . '.harga_dua_tahun_lalu', $row['harga_dua_tahun_lalu']) }}" placeholder="Contoh: 8.000">
|
||||||
<span class="input-group-text">/kg</span>
|
<span class="input-group-text">/kg</span>
|
||||||
</div>
|
</div>
|
||||||
</td>
|
</td>
|
||||||
@@ -232,6 +228,16 @@
|
|||||||
const praktikBelumPernahValue = String(@json($praktikBelumPernahValue));
|
const praktikBelumPernahValue = String(@json($praktikBelumPernahValue));
|
||||||
const skorPengalamanBerhentiValues = @json($skorPengalamanBerhentiValues ?? [2,3]).map(Number);
|
const skorPengalamanBerhentiValues = @json($skorPengalamanBerhentiValues ?? [2,3]).map(Number);
|
||||||
|
|
||||||
|
function onlyDigits(value) {
|
||||||
|
return String(value || '').replace(/\D/g, '');
|
||||||
|
}
|
||||||
|
|
||||||
|
function formatRupiah(value) {
|
||||||
|
const digits = onlyDigits(value);
|
||||||
|
|
||||||
|
return digits.replace(/\B(?=(\d{3})+(?!\d))/g, '.');
|
||||||
|
}
|
||||||
|
|
||||||
function syncAlasanBerhenti() {
|
function syncAlasanBerhenti() {
|
||||||
const val = Number($('input[name="skor_pengalaman"]:checked').val());
|
const val = Number($('input[name="skor_pengalaman"]:checked').val());
|
||||||
const isBerhenti = skorPengalamanBerhentiValues.includes(val);
|
const isBerhenti = skorPengalamanBerhentiValues.includes(val);
|
||||||
@@ -256,10 +262,21 @@
|
|||||||
$('input[name="skor_pengalaman"]').on('change', syncAlasanBerhenti);
|
$('input[name="skor_pengalaman"]').on('change', syncAlasanBerhenti);
|
||||||
$('input[name="saluran_terdahulu[]"]').on('change', syncSaluranLainnya);
|
$('input[name="saluran_terdahulu[]"]').on('change', syncSaluranLainnya);
|
||||||
$('input[name="praktik_fermentasi"]').on('change', syncPraktikFermentasi);
|
$('input[name="praktik_fermentasi"]').on('change', syncPraktikFermentasi);
|
||||||
|
$(document).on('input', '.rupiah-input', function () {
|
||||||
|
const cursorAtEnd = this.selectionStart === this.value.length;
|
||||||
|
this.value = formatRupiah(this.value);
|
||||||
|
|
||||||
|
if (cursorAtEnd) {
|
||||||
|
this.setSelectionRange(this.value.length, this.value.length);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
$('.rupiah-input').each(function () {
|
||||||
|
this.value = formatRupiah(this.value);
|
||||||
|
});
|
||||||
|
|
||||||
syncAlasanBerhenti();
|
syncAlasanBerhenti();
|
||||||
syncSaluranLainnya();
|
syncSaluranLainnya();
|
||||||
syncPraktikFermentasi();
|
syncPraktikFermentasi();
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
@endpush
|
@endpush
|
||||||
|
|||||||
@@ -1,5 +1,19 @@
|
|||||||
@extends('layout.main')
|
@extends('layout.main')
|
||||||
|
|
||||||
|
@push('style')
|
||||||
|
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/croppie/2.6.5/croppie.min.css" />
|
||||||
|
|
||||||
|
<style>
|
||||||
|
#croppie-container {
|
||||||
|
width: 100%;
|
||||||
|
height: 350px;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
@endpush
|
||||||
|
|
||||||
|
@push('scripts')
|
||||||
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/croppie/2.6.5/croppie.min.js"></script>
|
||||||
|
|
||||||
@section('content')
|
@section('content')
|
||||||
<div class="container-xxl flex-grow-1 container-p-y">
|
<div class="container-xxl flex-grow-1 container-p-y">
|
||||||
@if ($errors->any())
|
@if ($errors->any())
|
||||||
@@ -23,20 +37,24 @@
|
|||||||
<form id="editPetaniForm" action="{{ route('petani.update', $petani->id) }}" method="POST" enctype="multipart/form-data">
|
<form id="editPetaniForm" action="{{ route('petani.update', $petani->id) }}" method="POST" enctype="multipart/form-data">
|
||||||
@csrf
|
@csrf
|
||||||
@method('PUT')
|
@method('PUT')
|
||||||
|
<input type="hidden" name="hapus_foto" id="hapus_foto" value="0">
|
||||||
<input type="file" id="foto" name="foto" accept="image/png,image/jpeg,image/jpg" hidden>
|
<input type="file" id="foto" name="foto" accept="image/png,image/jpeg,image/jpg" hidden>
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-md-3">
|
<div class="col-md-3">
|
||||||
<div class="user-avatar-section">
|
<div class="user-avatar-section">
|
||||||
<div class=" d-flex align-items-center flex-column">
|
<div class=" d-flex align-items-center flex-column">
|
||||||
<img id="fotoPreview"
|
<img id="fotoPreview"
|
||||||
class="img-fluid rounded mb-4"
|
class="mb-3 shadow-sm rounded-3"
|
||||||
src="{{ $petani->foto ? route('petani.show-image', ['id' => $petani->id, 'field' => 'foto']) : asset('assets/img/avatars/1.png') }}"
|
src="{{ $petani->foto ? route('petani.show-image', ['id' => $petani->id, 'field' => 'foto']) : asset('assets/img/avatars/3.jpg') }}"
|
||||||
height="120" width="120"
|
|
||||||
alt="Foto profil petani"
|
alt="Foto profil petani"
|
||||||
data-bs-toggle="tooltip" data-bs-placement="top"
|
data-bs-toggle="tooltip" data-bs-placement="top"
|
||||||
data-bs-original-title="Klik untuk mengganti foto profil petani"
|
data-bs-original-title="Klik untuk mengganti foto profil petani"
|
||||||
style="cursor:pointer; object-fit:cover;" />
|
style="width: 120px !important; height: 120px !important; cursor:pointer; object-fit:cover; display:block; margin: 0 auto;" />
|
||||||
<div class="user-info text-center">
|
|
||||||
|
<button type="button" id="btnHapusFoto" class="btn btn-sm btn-outline-danger mb-4" style="display: {{ $petani->foto ? 'block' : 'none' }};">
|
||||||
|
Hapus Foto
|
||||||
|
</button>
|
||||||
|
<div class="user-info text-center">
|
||||||
<h5><i>{{ $petani->nama }}</i></h5>
|
<h5><i>{{ $petani->nama }}</i></h5>
|
||||||
<span class="badge bg-label-secondary">Petani {{ $petani->komoditas?->nama }}</span>
|
<span class="badge bg-label-secondary">Petani {{ $petani->komoditas?->nama }}</span>
|
||||||
</div>
|
</div>
|
||||||
@@ -83,9 +101,9 @@
|
|||||||
@error('tempat_lahir')<div class="error invalid-feedback">{{ $message }}</div>@enderror
|
@error('tempat_lahir')<div class="error invalid-feedback">{{ $message }}</div>@enderror
|
||||||
</div>
|
</div>
|
||||||
<div class="col-md-3 mb-4 form-control-validation">
|
<div class="col-md-3 mb-4 form-control-validation">
|
||||||
<label class="form-label" for="edit-petani-tanggal-lahir">Tanggal Lahir {{ $petani->tanggal_lahir?->format('Y-m-d') }}</label>
|
<label class="form-label" for="edit-petani-tanggal-lahir">Tanggal Lahir</label>
|
||||||
<input type="date" class="form-control @error('tanggal_lahir') is-invalid @enderror" id="edit-petani-tanggal-lahir" name="tanggal_lahir"
|
<input type="text" class="form-control @error('tanggal_lahir') is-invalid @enderror" id="edit-petani-tanggal-lahir" name="tanggal_lahir"
|
||||||
value="{{ old('tanggal_lahir', $petani->tanggal_lahir?->format('Y-m-d')) }}" />
|
value="{{ old('tanggal_lahir', $petani->tanggal_lahir?->format('d-m-Y')) }}" />
|
||||||
@error('tanggal_lahir')<div class="error invalid-feedback">{{ $message }}</div>@enderror
|
@error('tanggal_lahir')<div class="error invalid-feedback">{{ $message }}</div>@enderror
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -234,6 +252,24 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div class="modal fade" id="cropModal" tabindex="-1" aria-labelledby="cropModalLabel" aria-hidden="true" data-bs-backdrop="static" data-bs-keyboard="false">
|
||||||
|
<div class="modal-dialog modal-dialog-centered">
|
||||||
|
<div class="modal-content">
|
||||||
|
<div class="modal-header">
|
||||||
|
<h5 class="modal-title" id="cropModalLabel">Sesuaikan Foto Profil</h5>
|
||||||
|
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
|
||||||
|
</div>
|
||||||
|
<div class="modal-body">
|
||||||
|
<div id="croppie-container"></div>
|
||||||
|
</div>
|
||||||
|
<div class="modal-footer">
|
||||||
|
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Batal</button>
|
||||||
|
<button type="button" class="btn btn-primary" id="cropImageBtn">Potong & Simpan</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
@endsection
|
@endsection
|
||||||
|
|
||||||
@push('scripts')
|
@push('scripts')
|
||||||
@@ -306,24 +342,86 @@
|
|||||||
});
|
});
|
||||||
$('#edit-petani-desa').select2();
|
$('#edit-petani-desa').select2();
|
||||||
|
|
||||||
|
let croppieInstance = null;
|
||||||
|
|
||||||
$('#fotoPreview').on('click', function () {
|
$('#fotoPreview').on('click', function () {
|
||||||
|
$('#foto').val('');
|
||||||
$('#foto').click();
|
$('#foto').click();
|
||||||
});
|
});
|
||||||
|
|
||||||
$('#foto').on('change', function (e) {
|
$('#foto').on('change', function (e) {
|
||||||
|
|
||||||
const file = e.target.files[0];
|
const file = e.target.files[0];
|
||||||
if (!file) return;
|
if (!file) return;
|
||||||
|
|
||||||
|
if(!file.type.match(/^image\/(png|jpeg|jpg)$/)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
const reader = new FileReader();
|
const reader = new FileReader();
|
||||||
reader.onload = function (event) {
|
reader.onload = function (event) {
|
||||||
$('#fotoPreview').attr('src', event.target.result);
|
$('#cropModal').modal('show');
|
||||||
|
|
||||||
|
if (!croppieInstance) {
|
||||||
|
const el = document.getElementById('croppie-container');
|
||||||
|
croppieInstance = new Croppie(el, {
|
||||||
|
viewport: { width: 200, height: 200 },
|
||||||
|
boundary: { width: '100%', height: 280 },
|
||||||
|
showZoomer: true,
|
||||||
|
enableOrientation: true
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
setTimeout(function() {
|
||||||
|
croppieInstance.bind({
|
||||||
|
url: event.target.result
|
||||||
|
});
|
||||||
|
}, 200);
|
||||||
};
|
};
|
||||||
|
|
||||||
reader.readAsDataURL(file);
|
reader.readAsDataURL(file);
|
||||||
});
|
});
|
||||||
|
|
||||||
// 1 MB = 1048576 bytes
|
// 1 MB = 1048576 bytes
|
||||||
|
|
||||||
|
$('#cropImageBtn').on('click', function() {
|
||||||
|
croppieInstance.result({
|
||||||
|
type: 'base64',
|
||||||
|
format: 'png',
|
||||||
|
size: 'viewport',
|
||||||
|
}).then(function(base64) {
|
||||||
|
|
||||||
|
$('#fotoPreview').attr('src', base64);
|
||||||
|
|
||||||
|
$('#hapus_foto').val('0');
|
||||||
|
$('#btnHapusFoto').show();
|
||||||
|
|
||||||
|
function dataURLtoFile(dataurl, filename) {
|
||||||
|
let arr = dataurl.split(','), mime = arr[0].match(/:(.*?);/)[1],
|
||||||
|
bstr = atob(arr[1]), n = bstr.length, u8arr = new Uint8Array(n);
|
||||||
|
while(n--){
|
||||||
|
u8arr[n] = bstr.charCodeAt(n);
|
||||||
|
}
|
||||||
|
return new File([u8arr], filename, {type: mime});
|
||||||
|
}
|
||||||
|
|
||||||
|
let croppedFile = dataURLtoFile(base64, 'foto_profil_crop.png');
|
||||||
|
|
||||||
|
let dataTransfer = new DataTransfer();
|
||||||
|
dataTransfer.items.add(croppedFile);
|
||||||
|
document.getElementById('foto').files = dataTransfer.files;
|
||||||
|
|
||||||
|
$('#cropModal').modal('hide');
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
$('#btnHapusFoto').on('click', function() {
|
||||||
|
$('#hapus_foto').val('1');
|
||||||
|
|
||||||
|
$('#foto').val('');
|
||||||
|
|
||||||
|
$('#fotoPreview').attr('src', "{{ asset('assets/img/avatars/3.jpg') }}");
|
||||||
|
|
||||||
|
$(this).hide();
|
||||||
|
});
|
||||||
$.validator.addMethod('maxfilesize', function (value, element, param) {
|
$.validator.addMethod('maxfilesize', function (value, element, param) {
|
||||||
return this.optional(element) || (element.files[0] && element.files[0].size <= param);
|
return this.optional(element) || (element.files[0] && element.files[0].size <= param);
|
||||||
}, 'File size must be less than {0} bytes.');
|
}, 'File size must be less than {0} bytes.');
|
||||||
@@ -334,7 +432,7 @@
|
|||||||
ktp: { required: true, digits: true, minlength: 16, maxlength: 16 },
|
ktp: { required: true, digits: true, minlength: 16, maxlength: 16 },
|
||||||
kk: { required: true, digits: true, minlength: 16, maxlength: 16 },
|
kk: { required: true, digits: true, minlength: 16, maxlength: 16 },
|
||||||
tempat_lahir: { required: true },
|
tempat_lahir: { required: true },
|
||||||
tanggal_lahir: { required: true, date: true },
|
tanggal_lahir: { required: true },
|
||||||
jenis_kelamin: { required: true },
|
jenis_kelamin: { required: true },
|
||||||
pendidikan_terakhir: { required: true },
|
pendidikan_terakhir: { required: true },
|
||||||
komoditas_id: { required: true },
|
komoditas_id: { required: true },
|
||||||
@@ -354,7 +452,7 @@
|
|||||||
ktp: { required: "NIK wajib diisi", digits: "NIK harus berupa angka", minlength: "NIK harus 16 digit", maxlength: "NIK harus 16 digit" },
|
ktp: { required: "NIK wajib diisi", digits: "NIK harus berupa angka", minlength: "NIK harus 16 digit", maxlength: "NIK harus 16 digit" },
|
||||||
kk: { required: "No. KK wajib diisi", digits: "No. KK harus berupa angka", minlength: "No. KK harus 16 digit", maxlength: "No. KK harus 16 digit" },
|
kk: { required: "No. KK wajib diisi", digits: "No. KK harus berupa angka", minlength: "No. KK harus 16 digit", maxlength: "No. KK harus 16 digit" },
|
||||||
tempat_lahir: { required: "Tempat lahir wajib diisi" },
|
tempat_lahir: { required: "Tempat lahir wajib diisi" },
|
||||||
tanggal_lahir: { required: "Tanggal lahir wajib diisi", date: "Format tanggal salah" },
|
tanggal_lahir: { required: "Tanggal lahir wajib diisi" },
|
||||||
jenis_kelamin: { required: "Jenis kelamin wajib diisi" },
|
jenis_kelamin: { required: "Jenis kelamin wajib diisi" },
|
||||||
pendidikan_terakhir: { required: "Pendidikan terakhir wajib diisi" },
|
pendidikan_terakhir: { required: "Pendidikan terakhir wajib diisi" },
|
||||||
alamat: { required: "Alamat wajib diisi" },
|
alamat: { required: "Alamat wajib diisi" },
|
||||||
|
|||||||
@@ -1,3 +1,39 @@
|
|||||||
|
<style>
|
||||||
|
@media (min-width: 768px) {
|
||||||
|
.nav-pills-custom-spacing {
|
||||||
|
display: flex;
|
||||||
|
width: 100%;
|
||||||
|
gap: 0.5rem;
|
||||||
|
flex-wrap: nowrap !important;
|
||||||
|
overflow-x: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.nav-pills-custom-spacing::-webkit-scrollbar {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.nav-pills-custom-spacing .nav-item {
|
||||||
|
margin-right: 0 !important;
|
||||||
|
flex: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
.nav-pills-custom-spacing .nav-link {
|
||||||
|
display: flex;
|
||||||
|
justify-content: center;
|
||||||
|
align-items: center;
|
||||||
|
padding-left: 0.5rem !important;
|
||||||
|
padding-right: 0.5rem !important;
|
||||||
|
width: 100%;
|
||||||
|
white-space: nowrap;
|
||||||
|
font-size: 0.9375rem !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.nav-pills-custom-spacing .nav-link i {
|
||||||
|
margin-right: 0.4rem !important;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
||||||
<div class="row mb-4">
|
<div class="row mb-4">
|
||||||
|
|
||||||
<div class="col-md-4 mb-2 mb-md-0">
|
<div class="col-md-4 mb-2 mb-md-0">
|
||||||
@@ -7,10 +43,10 @@
|
|||||||
<div class="d-flex justify-content-start align-items-center mb-3">
|
<div class="d-flex justify-content-start align-items-center mb-3">
|
||||||
<div class="avatar me-2">
|
<div class="avatar me-2">
|
||||||
@if (!isset($petani))
|
@if (!isset($petani))
|
||||||
<img src="{{ asset('assets/img/avatars/1.png') }}" alt="Foto Petani" class="rounded-circle" />
|
<img src="{{ asset('assets/img/avatars/3.jpg') }}" alt="Foto Petani"/>
|
||||||
@else
|
@else
|
||||||
<img class="rounded-circle" alt="Foto Petani"
|
<img alt="Foto Petani"
|
||||||
src="{{ $petani->foto ? route('petani.show-image', ['id' => $petani->id, 'field' => 'foto']) : asset('assets/img/avatars/1.png') }}" />
|
src="{{ $petani->foto ? route('petani.show-image', ['id' => $petani->id, 'field' => 'foto']) : asset('assets/img/avatars/3.jpg') }}" class="rounded-3"/>
|
||||||
@endif
|
@endif
|
||||||
</div>
|
</div>
|
||||||
<div class="d-flex flex-column">
|
<div class="d-flex flex-column">
|
||||||
@@ -56,7 +92,13 @@
|
|||||||
? $petani->lahans()->get()
|
? $petani->lahans()->get()
|
||||||
: collect();
|
: collect();
|
||||||
$totalLuasLahan = $petani ? $lahanPetani->where('komoditas_id', $petani->komoditas_id)->sum('luas_lahan') : 0;
|
$totalLuasLahan = $petani ? $lahanPetani->where('komoditas_id', $petani->komoditas_id)->sum('luas_lahan') : 0;
|
||||||
$totalTanaman = $petani ? $lahanPetani->where('komoditas_id', $petani->komoditas_id)->sum('jumlah_tanaman') : 0;
|
$totalLuasLahanHa = $totalLuasLahan / 10000;
|
||||||
|
$lahanKomoditasUtamaIds = $petani
|
||||||
|
? $lahanPetani->where('komoditas_id', $petani->komoditas_id)->pluck('id')
|
||||||
|
: collect();
|
||||||
|
$totalTanaman = $petani && \Illuminate\Support\Facades\Schema::hasTable('map_tanaman')
|
||||||
|
? \App\Models\Pertanian\Tanaman::whereIn('lahan_id', $lahanKomoditasUtamaIds)->count()
|
||||||
|
: 0;
|
||||||
$pendidikanLabel = isset($petani) ? $petani->pendidikan_terakhir?->label() : null;
|
$pendidikanLabel = isset($petani) ? $petani->pendidikan_terakhir?->label() : null;
|
||||||
|
|
||||||
@endphp
|
@endphp
|
||||||
@@ -79,7 +121,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<span class="avatar">
|
<span class="avatar">
|
||||||
<span class="avatar-initial rounded">
|
<span class="avatar-initial rounded">
|
||||||
<i class="icon-base ti tabler-user-star icon-22px"></i>
|
<i class="icon-base ti tabler-user-star icon-22px text-heading"></i>
|
||||||
</span>
|
</span>
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
@@ -90,7 +132,7 @@
|
|||||||
<p class="mb-0 text-muted" style="font-size: 0.75rem;">Lahan & Tanaman</p>
|
<p class="mb-0 text-muted" style="font-size: 0.75rem;">Lahan & Tanaman</p>
|
||||||
<h5 class="mb-0">
|
<h5 class="mb-0">
|
||||||
@if($lahanPetani->isNotEmpty())
|
@if($lahanPetani->isNotEmpty())
|
||||||
{{ number_format($totalLuasLahan, 0, ',', '.') }} m<sup>2</sup>
|
{{ number_format($totalLuasLahanHa, 2, ',', '.') }} ha
|
||||||
@else
|
@else
|
||||||
-
|
-
|
||||||
@endif
|
@endif
|
||||||
@@ -105,7 +147,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<span class="avatar">
|
<span class="avatar">
|
||||||
<span class="avatar-initial rounded">
|
<span class="avatar-initial rounded">
|
||||||
<i class="icon-base ti tabler-trees icon-22px"></i>
|
<i class="icon-base ti tabler-trees icon-22px text-heading"></i>
|
||||||
</span>
|
</span>
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
@@ -127,7 +169,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<span class="avatar">
|
<span class="avatar">
|
||||||
<span class="avatar-initial rounded">
|
<span class="avatar-initial rounded">
|
||||||
<i class="icon-base ti tabler-seedling icon-22px"></i>
|
<i class="icon-base ti tabler-books icon-22px text-heading"></i>
|
||||||
</span>
|
</span>
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
@@ -158,7 +200,7 @@
|
|||||||
@php
|
@php
|
||||||
$produktivitas = isset($petani?->surveyProduktivitas) ? $petani?->surveyProduktivitas : null;
|
$produktivitas = isset($petani?->surveyProduktivitas) ? $petani?->surveyProduktivitas : null;
|
||||||
if (!is_null($produktivitas)) {
|
if (!is_null($produktivitas)) {
|
||||||
$produktivitas = $produktivitas->get()->where('komoditas_id', $petani->komoditas_id);
|
$produktivitas = $produktivitas->where('komoditas_id', $petani->komoditas_id);
|
||||||
}
|
}
|
||||||
@endphp
|
@endphp
|
||||||
<div>
|
<div>
|
||||||
@@ -175,13 +217,13 @@
|
|||||||
@if(!is_null($skorPraktik))
|
@if(!is_null($skorPraktik))
|
||||||
<span class="me-1">{{ $praktik }}</span>
|
<span class="me-1">{{ $praktik }}</span>
|
||||||
@else
|
@else
|
||||||
<span class="me-1">Belum isi</span>
|
<span class="me-1">Belum terisi</span>
|
||||||
@endif
|
@endif
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
<span class="avatar">
|
<span class="avatar">
|
||||||
<span class="avatar-initial rounded">
|
<span class="avatar-initial rounded">
|
||||||
<i class="icon-base ti tabler-books icon-22px"></i>
|
<i class="icon-base ti tabler-seedling icon-22px text-heading"></i>
|
||||||
</span>
|
</span>
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
@@ -232,7 +274,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<span class="avatar">
|
<span class="avatar">
|
||||||
<span class="avatar-initial rounded">
|
<span class="avatar-initial rounded">
|
||||||
<i class="icon-base ti tabler-social icon-22px"></i>
|
<i class="icon-base ti tabler-social icon-22px text-heading"></i>
|
||||||
</span>
|
</span>
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
@@ -285,13 +327,13 @@
|
|||||||
@if(!is_null($aksesPasar?->skor_pengalaman) && !is_null($aksesPasar->skor_kesadaran_premium))
|
@if(!is_null($aksesPasar?->skor_pengalaman) && !is_null($aksesPasar->skor_kesadaran_premium))
|
||||||
<span class="me-1">{{ $pengalaman }}</span>
|
<span class="me-1">{{ $pengalaman }}</span>
|
||||||
@else
|
@else
|
||||||
<span class="me-1">Belum isi</span>
|
<span class="me-1">Belum terisi</span>
|
||||||
@endif
|
@endif
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
<span class="avatar">
|
<span class="avatar">
|
||||||
<span class="avatar-initial rounded">
|
<span class="avatar-initial rounded">
|
||||||
<i class="icon-base ti tabler-building-store icon-22px"></i>
|
<i class="icon-base ti tabler-building-store icon-22px text-heading"></i>
|
||||||
</span>
|
</span>
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
@@ -306,7 +348,7 @@
|
|||||||
|
|
||||||
<div class="nav-align-top">
|
<div class="nav-align-top">
|
||||||
@if(!$petani)
|
@if(!$petani)
|
||||||
<ul class="nav nav-pills flex-column flex-md-row mb-6 row-gap-2">
|
<ul class="nav nav-pills flex-column flex-md-row mb-6 row-gap-2 nav-pills-custom-spacing">
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a class="nav-link active" href="{{ route('petani.create') }}">
|
<a class="nav-link active" href="{{ route('petani.create') }}">
|
||||||
<i class="icon-base ti tabler-user-check me-1_5 icon-sm"></i>Profil
|
<i class="icon-base ti tabler-user-check me-1_5 icon-sm"></i>Profil
|
||||||
@@ -314,22 +356,22 @@
|
|||||||
</li>
|
</li>
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a class="nav-link" href="#" disabled data-bs-original-title="Lahan & Tanaman, isi profil terlebih dahulu" data-bs-toggle="tooltip" data-bs-placement="top">
|
<a class="nav-link" href="#" disabled data-bs-original-title="Lahan & Tanaman, isi profil terlebih dahulu" data-bs-toggle="tooltip" data-bs-placement="top">
|
||||||
<i class="icon-base ti tabler-trees me-1_5 icon-sm"></i>Lahan & Tanaman
|
<i class="icon-base ti tabler-trees me-1_5 icon-sm"></i>Lahan & Tanaman
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a class="nav-link" href="#" disabled data-bs-original-title="Praktik Budidaya, isi profil terlebih dahulu" data-bs-toggle="tooltip" data-bs-placement="top">
|
<a class="nav-link" href="#" disabled data-bs-original-title="Praktik Budidaya, isi profil terlebih dahulu" data-bs-toggle="tooltip" data-bs-placement="top">
|
||||||
<i class="icon-base ti tabler-seedling me-1_5 icon-sm"></i>Praktik Budidaya
|
<i class="icon-base ti tabler-seedling me-1_5 icon-sm"></i>Praktik Budidaya
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a class="nav-link" href="#" disabled data-bs-original-title="Pendidikan & Pelatihan, isi profil terlebih dahulu" data-bs-toggle="tooltip" data-bs-placement="top">
|
<a class="nav-link" href="#" disabled data-bs-original-title="Pendidikan & Pelatihan, isi profil terlebih dahulu" data-bs-toggle="tooltip" data-bs-placement="top">
|
||||||
<i class="icon-base ti tabler-books me-1_5 icon-sm"></i>Pendidikan & Pelatihan
|
<i class="icon-base ti tabler-books me-1_5 icon-sm"></i>Pendidikan & Pelatihan
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a class="nav-link" href="#" disabled data-bs-original-title="Sosial Ekonomi, isi profil terlebih dahulu" data-bs-toggle="tooltip" data-bs-placement="top">
|
<a class="nav-link" href="#" disabled data-bs-original-title="Sosial Ekonomi, isi profil terlebih dahulu" data-bs-toggle="tooltip" data-bs-placement="top">
|
||||||
<i class="icon-base ti tabler-social me-1_5 icon-sm"></i>Sosial Ekonomi
|
<i class="icon-base ti tabler-social me-1_5 icon-sm"></i>Sosial Ekonomi
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
@@ -344,42 +386,42 @@
|
|||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
@else
|
@else
|
||||||
<ul class="nav nav-pills flex-column flex-md-row mb-6 row-gap-2">
|
<ul class="nav nav-pills flex-column flex-md-row mb-6 row-gap-2 nav-pills-custom-spacing">
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a class="nav-link {{ request()->routeIs('petani.edit') ? 'active' : '' }}" href="{{ route('petani.edit', $petani->id) }}">
|
<a class="nav-link {{ request()->routeIs('petani.edit') ? 'active' : '' }}" href="{{ route('petani.edit', $petani->id) }}">
|
||||||
<i class="icon-base ti tabler-user-check me-1_5 icon-sm"></i>Profil
|
<i class="icon-base ti tabler-user-check icon-sm"></i>Profil
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a class="nav-link {{ request()->routeIs('petani.lahan-tanaman.*') ? 'active' : '' }}" href="{{ route('petani.lahan-tanaman.index', $petani->id) }}">
|
<a class="nav-link {{ request()->routeIs('petani.lahan-tanaman.*') ? 'active' : '' }}" href="{{ route('petani.lahan-tanaman.index', $petani->id) }}">
|
||||||
<i class="icon-base ti tabler-trees me-1_5 icon-sm"></i>Lahan & Tanaman
|
<i class="icon-base ti tabler-trees icon-sm"></i>Lahan & Tanaman
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a class="nav-link {{ request()->routeIs('petani.praktik-budidaya.*') ? 'active' : '' }}" href="{{ route('petani.praktik-budidaya.index', $petani->id) }}">
|
<a class="nav-link {{ request()->routeIs('petani.praktik-budidaya.*') ? 'active' : '' }}" href="{{ route('petani.praktik-budidaya.index', $petani->id) }}">
|
||||||
<i class="icon-base ti tabler-seedling me-1_5 icon-sm"></i>Praktik Budidaya
|
<i class="icon-base ti tabler-seedling icon-sm"></i>Praktik Budidaya
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a class="nav-link {{ request()->routeIs('petani.pendidikan-pelatihan.*') ? 'active' : '' }}" href="{{ route('petani.pendidikan-pelatihan.index', $petani->id) }}">
|
<a class="nav-link {{ request()->routeIs('petani.pendidikan-pelatihan.*') ? 'active' : '' }}" href="{{ route('petani.pendidikan-pelatihan.index', $petani->id) }}">
|
||||||
<i class="icon-base ti tabler-books me-1_5 icon-sm"></i>Pendidikan & Pelatihan
|
<i class="icon-base ti tabler-books icon-sm"></i>Pendidikan & Pelatihan
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a class="nav-link {{ request()->routeIs('petani.sosial-ekonomi.*') ? 'active' : '' }}" href="{{ route('petani.sosial-ekonomi.index', $petani->id) }}">
|
<a class="nav-link {{ request()->routeIs('petani.sosial-ekonomi.*') ? 'active' : '' }}" href="{{ route('petani.sosial-ekonomi.index', $petani->id) }}">
|
||||||
<i class="icon-base ti tabler-social me-1_5 icon-sm"></i>Sosial Ekonomi
|
<i class="icon-base ti tabler-social icon-sm"></i>Sosial Ekonomi
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a class="nav-link {{ request()->routeIs('petani.akses-pasar.*') ? 'active' : '' }}" href="{{ route('petani.akses-pasar.index', $petani->id) }}">
|
<a class="nav-link {{ request()->routeIs('petani.akses-pasar.*') ? 'active' : '' }}" href="{{ route('petani.akses-pasar.index', $petani->id) }}">
|
||||||
<i class="icon-base ti tabler-building-store me-1_5 icon-sm"></i>Akses Pasar
|
<i class="icon-base ti tabler-building-store icon-sm"></i>Akses Pasar
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a class="nav-link {{ request()->routeIs('petani.skor.*') ? 'active' : '' }}" href="{{ route('petani.skor.index', $petani->id) }}">
|
<a class="nav-link {{ request()->routeIs('petani.skor.*') ? 'active' : '' }}" href="{{ route('petani.skor.index', $petani->id) }}">
|
||||||
<i class="icon-base ti tabler-star me-1_5 icon-sm"></i>Kesiapan Adopsi
|
<i class="icon-base ti tabler-star icon-sm"></i>Kesiapan Adopsi
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
@endif
|
@endif
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -2,6 +2,36 @@
|
|||||||
|
|
||||||
@section('content')
|
@section('content')
|
||||||
<div class="container-xxl flex-grow-1 container-p-y">
|
<div class="container-xxl flex-grow-1 container-p-y">
|
||||||
|
<div class="d-flex flex-row gap-3 mb-4">
|
||||||
|
<div class="w-25">
|
||||||
|
<x-summary-card
|
||||||
|
title="Petani"
|
||||||
|
count="{{ $petani->count() }}"
|
||||||
|
subtitle="{{ $petani->where('jenis_kelamin', 1)->count() }} Laki-laki, {{ $petani->where('jenis_kelamin', 0)->count() }} Perempuan"
|
||||||
|
icon="user-check"
|
||||||
|
color="primary"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
<div class="w-25">
|
||||||
|
<x-summary-card
|
||||||
|
title="Lahan & Tanaman"
|
||||||
|
count="{{ number_format(($lahan?->sum('luas_lahan') ?? 0) / 10000, 2, ',', '.') }} ha"
|
||||||
|
subtitle="{{ $tanaman?->count() }} tanaman dari {{ $komoditas?->count() }} komoditas utama"
|
||||||
|
icon="trees"
|
||||||
|
color="success"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
<div class="w-25">
|
||||||
|
<x-summary-card
|
||||||
|
title="Segmentasi"
|
||||||
|
count="{{ $skor->where('segmen', 'Penggerak')->count() }} Penggerak"
|
||||||
|
subtitle="{{ $skor->where('segmen', 'Perintis')->count() }} Perintis, {{ $skor->where('segmen', 'Pemerhati')->count() }} Pemerhati, {{ $skor->where('segmen', 'Pemula')->count() }} Pemula"
|
||||||
|
icon="star"
|
||||||
|
color="info"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
<div class="card">
|
<div class="card">
|
||||||
<div class="card-header border-bottom">
|
<div class="card-header border-bottom">
|
||||||
<h5 class="card-title mb-0">Data Petani</h5>
|
<h5 class="card-title mb-0">Data Petani</h5>
|
||||||
@@ -40,6 +70,8 @@
|
|||||||
<th>Jenis Kelamin</th>
|
<th>Jenis Kelamin</th>
|
||||||
<th>Usia</th>
|
<th>Usia</th>
|
||||||
<th>Desa/Kelurahan</th>
|
<th>Desa/Kelurahan</th>
|
||||||
|
<th>Komoditas Utama</th>
|
||||||
|
<th>Segmentasi</th>
|
||||||
<th>Aksi</th>
|
<th>Aksi</th>
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
@@ -51,7 +83,18 @@
|
|||||||
<td><span class="text-muted">{{ $item->jenis_kelamin ? 'Laki-laki' : 'Perempuan' }}</span></td>
|
<td><span class="text-muted">{{ $item->jenis_kelamin ? 'Laki-laki' : 'Perempuan' }}</span></td>
|
||||||
<td><span class="text-muted">{{ $item->umur }} tahun</span></td>
|
<td><span class="text-muted">{{ $item->umur }} tahun</span></td>
|
||||||
<td><span class="text-muted">{{ $item->desaKelurahan?->nama }}, {{ $item->desaKelurahan?->kecamatan?->nama }}, {{ $item->desaKelurahan?->kecamatan?->kabupatenKota?->nama }}, {{ $item->desaKelurahan?->kecamatan?->kabupatenKota?->provinsi?->nama }}</span></td>
|
<td><span class="text-muted">{{ $item->desaKelurahan?->nama }}, {{ $item->desaKelurahan?->kecamatan?->nama }}, {{ $item->desaKelurahan?->kecamatan?->kabupatenKota?->nama }}, {{ $item->desaKelurahan?->kecamatan?->kabupatenKota?->provinsi?->nama }}</span></td>
|
||||||
|
<td>{{ $item->komoditas?->nama }}</td>
|
||||||
|
<td>
|
||||||
|
@if($item->segmen() == 'Penggerak')
|
||||||
|
<span class="badge bg-label-success">Penggerak</span>
|
||||||
|
@elseif($item->segmen() == 'Perintis')
|
||||||
|
<span class="badge bg-label-info">Perintis</span>
|
||||||
|
@elseif($item->segmen() == 'Pemerhati')
|
||||||
|
<span class="badge bg-label-warning">Pemerhati</span>
|
||||||
|
@elseif($item->segmen() == 'Pemula')
|
||||||
|
<span class="badge bg-label-danger">Pemula</span>
|
||||||
|
@endif
|
||||||
|
</td>
|
||||||
<td>
|
<td>
|
||||||
<div class="d-flex align-items-center">
|
<div class="d-flex align-items-center">
|
||||||
<!-- <a href="{{ route('petani.show', $item->id) }}" class="btn btn-icon btn-text-secondary rounded-pill view-record"><i class="ti tabler-eye ti-md"></i></a> -->
|
<!-- <a href="{{ route('petani.show', $item->id) }}" class="btn btn-icon btn-text-secondary rounded-pill view-record"><i class="ti tabler-eye ti-md"></i></a> -->
|
||||||
|
|||||||
@@ -12,6 +12,161 @@
|
|||||||
background-color: #f8f9fa;
|
background-color: #f8f9fa;
|
||||||
z-index: 1;
|
z-index: 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.dropzone-custom-container {
|
||||||
|
display: flex;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
gap: 15px;
|
||||||
|
padding: 15px;
|
||||||
|
border: 2px dashed #ced4da;
|
||||||
|
border-radius: 12px;
|
||||||
|
background-color: #f8f9fa;
|
||||||
|
min-height: 160px;
|
||||||
|
align-items: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.btn-tambah-foto {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
width: 140px;
|
||||||
|
height: 160px;
|
||||||
|
border: 2px dashed #a8b1ba;
|
||||||
|
border-radius: 12px;
|
||||||
|
background: #fff;
|
||||||
|
color: #6c757d;
|
||||||
|
cursor: pointer;
|
||||||
|
transition: 0.2s;
|
||||||
|
order: 999;
|
||||||
|
}
|
||||||
|
.btn-tambah-foto:hover {
|
||||||
|
background: #e9ecef;
|
||||||
|
border-color: #6c757d;
|
||||||
|
color: #495057;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dropzone-custom-container .dz-preview {
|
||||||
|
position: relative;
|
||||||
|
background: #fff;
|
||||||
|
border-radius: 12px;
|
||||||
|
box-shadow: 0 4px 10px rgba(0,0,0,0.08);
|
||||||
|
border: 1px solid #e2e8f0;
|
||||||
|
width: 140px;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dropzone-custom-container .dz-image {
|
||||||
|
width: 100%;
|
||||||
|
height: 110px;
|
||||||
|
background: #f1f5f9;
|
||||||
|
cursor: zoom-in;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
border-radius: 12px 12px 0 0;
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dropzone-custom-container .dz-image img {
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
object-fit: cover;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dropzone-custom-container .dz-details {
|
||||||
|
padding: 8px;
|
||||||
|
text-align: center;
|
||||||
|
background: #fff;
|
||||||
|
border-radius: 0 0 12px 12px;
|
||||||
|
border-top: 1px solid #e2e8f0;
|
||||||
|
}
|
||||||
|
.dropzone-custom-container .dz-filename {
|
||||||
|
font-size: 11px;
|
||||||
|
font-weight: 600;
|
||||||
|
white-space: nowrap;
|
||||||
|
overflow: hidden;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
color: #495057;
|
||||||
|
}
|
||||||
|
.dropzone-custom-container .dz-size {
|
||||||
|
font-size: 10px;
|
||||||
|
color: #adb5bd;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dropzone-custom-container .dz-control-panel {
|
||||||
|
position: absolute;
|
||||||
|
top: -8px;
|
||||||
|
right: -8px;
|
||||||
|
display: flex;
|
||||||
|
gap: 5px;
|
||||||
|
z-index: 20;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dropzone-custom-container .dz-btn-action {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
width: 26px;
|
||||||
|
height: 26px;
|
||||||
|
border-radius: 50%;
|
||||||
|
color: #fff !important;
|
||||||
|
text-decoration: none !important;
|
||||||
|
box-shadow: 0 2px 5px rgba(0,0,0,0.2);
|
||||||
|
cursor: pointer;
|
||||||
|
font-size: 14px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dropzone-custom-container .btn-edit { background: #ffc107; color: #000 !important; }
|
||||||
|
.dropzone-custom-container .btn-edit:hover { background: #7367f0; }
|
||||||
|
.dropzone-custom-container .btn-delete { background: #dc3545; }
|
||||||
|
.dropzone-custom-container .btn-delete:hover { background: #c82333; }
|
||||||
|
|
||||||
|
.dropzone-custom-container .dz-error-message,
|
||||||
|
.dropzone-custom-container .dz-success-mark,
|
||||||
|
.dropzone-custom-container .dz-error-mark,
|
||||||
|
.dropzone-custom-container .progress { display: none !important; }
|
||||||
|
|
||||||
|
.foto-lightbox {
|
||||||
|
display: none;
|
||||||
|
position: fixed !important;
|
||||||
|
top: 0 !important;
|
||||||
|
left: 0 !important;
|
||||||
|
width: 100vw !important;
|
||||||
|
height: 100vh !important;
|
||||||
|
background: rgba(0, 0, 0, 0.85) !important;
|
||||||
|
z-index: 99999 !important;
|
||||||
|
align-items: center !important;
|
||||||
|
justify-content: center !important;
|
||||||
|
padding: 30px !important;
|
||||||
|
box-sizing: border-box !important;
|
||||||
|
}
|
||||||
|
.foto-lightbox.active {
|
||||||
|
display: flex !important;
|
||||||
|
}
|
||||||
|
.foto-lightbox img {
|
||||||
|
max-width: 90vw !important;
|
||||||
|
max-height: 85vh !important;
|
||||||
|
object-fit: contain !important;
|
||||||
|
border-radius: 8px !important;
|
||||||
|
box-shadow: 0 10px 40px rgba(0,0,0,0.5) !important;
|
||||||
|
}
|
||||||
|
.foto-lightbox-close {
|
||||||
|
position: absolute !important;
|
||||||
|
top: 20px !important;
|
||||||
|
right: 30px !important;
|
||||||
|
color: #fff !important;
|
||||||
|
font-size: 40px !important;
|
||||||
|
font-weight: bold !important;
|
||||||
|
cursor: pointer !important;
|
||||||
|
z-index: 100000 !important;
|
||||||
|
}
|
||||||
|
.foto-lightbox-close:hover { color: #dc3545 !important; }
|
||||||
|
.auto-pest-disease-field .form-check-label,
|
||||||
|
.auto-pest-disease-field .text-muted {
|
||||||
|
font-size: 0.875rem;
|
||||||
|
}
|
||||||
</style>
|
</style>
|
||||||
@endpush
|
@endpush
|
||||||
|
|
||||||
@@ -52,18 +207,18 @@
|
|||||||
|
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-md-3 mb-3 form-control-validation">
|
<div class="col-md-3 mb-3 form-control-validation">
|
||||||
<label class="form-label">Luas Lahan (m2) <span class="text-danger">*</span></label>
|
<label class="form-label">Luas Lahan (ha) <span class="text-danger">*</span></label>
|
||||||
<input type="number" step="0.01" id="luas_lahan" name="luas_lahan" class="form-control @error('luas_lahan') is-invalid @enderror" placeholder="Contoh: 1.5" required />
|
<input type="number" id="luas_lahan" name="luas_lahan" class="form-control @error('luas_lahan') is-invalid @enderror" placeholder="Contoh: 1.5" required />
|
||||||
@error('luas_lahan')<div class="error invalid-feedback">{{ $message }}</div>@enderror
|
@error('luas_lahan')<div class="error invalid-feedback">{{ $message }}</div>@enderror
|
||||||
</div>
|
</div>
|
||||||
<div class="col-md-3 mb-3 form-control-validation">
|
<div class="col-md-3 mb-3 form-control-validation">
|
||||||
<label class="form-label">Umur Lahan (tahun) <span class="text-danger">*</span></label>
|
<label class="form-label">Umur Lahan (tahun)</label>
|
||||||
<input type="number" name="umur_lahan" class="form-control @error('umur_lahan') is-invalid @enderror" placeholder="Contoh: 1" />
|
<input type="number" name="umur_lahan" class="form-control @error('umur_lahan') is-invalid @enderror" placeholder="Contoh: 1" />
|
||||||
@error('umur_lahan')<div class="error invalid-feedback">{{ $message }}</div>@enderror
|
@error('umur_lahan')<div class="error invalid-feedback">{{ $message }}</div>@enderror
|
||||||
</div>
|
</div>
|
||||||
<div class="col-md-3 mb-3 form-control-validation">
|
<div class="col-md-3 mb-3 form-control-validation">
|
||||||
<label class="form-label">Jumlah Tanaman <span class="text-danger">*</span></label>
|
<label class="form-label">Jumlah Tanaman</label>
|
||||||
<input type="number" name="jumlah_tanaman" class="form-control @error('jumlah_tanaman') is-invalid @enderror" placeholder="Contoh: 1" required />
|
<input type="number" name="jumlah_tanaman" class="form-control @error('jumlah_tanaman') is-invalid @enderror" placeholder="Contoh: 1 (min 0)" />
|
||||||
@error('jumlah_tanaman')<div class="error invalid-feedback">{{ $message }}</div>@enderror
|
@error('jumlah_tanaman')<div class="error invalid-feedback">{{ $message }}</div>@enderror
|
||||||
</div>
|
</div>
|
||||||
<div class="col-md-3 mb-3 form-control-validation">
|
<div class="col-md-3 mb-3 form-control-validation">
|
||||||
@@ -77,7 +232,7 @@
|
|||||||
<label class="form-label">Komoditas Utama <span class="text-danger">*</span></label>
|
<label class="form-label">Komoditas Utama <span class="text-danger">*</span></label>
|
||||||
<select id="komoditas_id" name="komoditas_id" class="form-select @error('komoditas_id') is-invalid @enderror">
|
<select id="komoditas_id" name="komoditas_id" class="form-select @error('komoditas_id') is-invalid @enderror">
|
||||||
<option value="">Pilih Komoditas</option>
|
<option value="">Pilih Komoditas</option>
|
||||||
@foreach($komoditas as $k)
|
@foreach($komoditas->where('is_utama', '1') as $k)
|
||||||
<option value="{{ $k->id }}">{{ $k->nama }}</option>
|
<option value="{{ $k->id }}">{{ $k->nama }}</option>
|
||||||
@endforeach
|
@endforeach
|
||||||
</select>
|
</select>
|
||||||
@@ -96,17 +251,134 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-md-3 mb-3 form-control-validation">
|
<div class="col-md-6 mb-3 form-control-validation">
|
||||||
<label class="form-label">Kondisi Umum Tanaman <span class="text-danger">*</span></label>
|
<label class="form-label">Kondisi Umum Tanaman <span class="text-danger">*</span></label>
|
||||||
<select id="kondisi_tanaman" name="kondisi_tanaman" class="form-select @error('kondisi_tanaman') is-invalid @enderror">
|
<select id="kondisi_tanaman" name="kondisi_tanaman" class="form-select @error('kondisi_tanaman') is-invalid @enderror">
|
||||||
<option value="">Pilih Kondisi Tanaman</option>
|
<option value="">Pilih Kondisi Tanaman</option>
|
||||||
<option value="{{ \App\Enums\KondisiTanaman::BAIK }}" {{ old('kondisi_tanaman') == \App\Enums\KondisiTanaman::BAIK ? 'selected' : '' }}>Baik</option>
|
<option value="{{ \App\Enums\KondisiTanaman::BAIK }}" {{ old('kondisi_tanaman') == \App\Enums\KondisiTanaman::BAIK ? 'selected' : '' }}>{{ \App\Enums\KondisiTanaman::BAIK->label() }}</option>
|
||||||
<option value="{{ \App\Enums\KondisiTanaman::SEDANG }}" {{ old('kondisi_tanaman') == \App\Enums\KondisiTanaman::SEDANG ? 'selected' : '' }}>Sedang</option>
|
<option value="{{ \App\Enums\KondisiTanaman::SEDANG }}" {{ old('kondisi_tanaman') == \App\Enums\KondisiTanaman::SEDANG ? 'selected' : '' }}>{{ \App\Enums\KondisiTanaman::SEDANG->label() }}</option>
|
||||||
<option value="{{ \App\Enums\KondisiTanaman::BURUK }}" {{ old('kondisi_tanaman') == \App\Enums\KondisiTanaman::BURUK ? 'selected' : '' }}>Buruk</option>
|
<option value="{{ \App\Enums\KondisiTanaman::BURUK }}" {{ old('kondisi_tanaman') == \App\Enums\KondisiTanaman::BURUK ? 'selected' : '' }}>{{ \App\Enums\KondisiTanaman::BURUK->label() }}</option>
|
||||||
</select>
|
</select>
|
||||||
@error('kondisi_tanaman')<div class="error invalid-feedback">{{ $message }}</div>@enderror
|
@error('kondisi_tanaman')<div class="error invalid-feedback">{{ $message }}</div>@enderror
|
||||||
</div>
|
</div>
|
||||||
<div class="col-md-3 mb-3 form-control-validation">
|
</div>
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-md-3 mb-4 form-control-validation auto-pest-disease-field">
|
||||||
|
<label class="form-label">Jenis Hama</label>
|
||||||
|
|
||||||
|
<div class="form-check mt-2">
|
||||||
|
<input class="form-check-input @error('jenis_hama') is-invalid @enderror" disabled
|
||||||
|
type="checkbox"
|
||||||
|
name="jenis_hama[]"
|
||||||
|
value="Penggerek buah"
|
||||||
|
id="jenis-hama-penggerek-buah"
|
||||||
|
{{ in_array('Penggerek buah', $jenisHamaOtomatis ?? [], true) ? 'checked' : '' }}>
|
||||||
|
<label class="form-check-label" for="jenis-hama-bentuk">Penggerek buah</label>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="form-check mt-2">
|
||||||
|
<input class="form-check-input @error('jenis_hama') is-invalid @enderror" disabled
|
||||||
|
type="checkbox"
|
||||||
|
name="jenis_hama[]"
|
||||||
|
value="Penggerek batang"
|
||||||
|
id="jenis-hama-penggerek-batang"
|
||||||
|
{{ in_array('Penggerek batang', $jenisHamaOtomatis ?? [], true) ? 'checked' : '' }}>
|
||||||
|
<label class="form-check-label" for="jenis-hama-bentuk">Penggerek batang</label>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="form-check mt-2">
|
||||||
|
<input class="form-check-input @error('jenis_hama') is-invalid @enderror" disabled
|
||||||
|
type="checkbox"
|
||||||
|
name="jenis_hama[]"
|
||||||
|
value="Kutu putih/kutu sisik"
|
||||||
|
id="jenis-hama-kutu"
|
||||||
|
{{ in_array('Kutu putih/kutu sisik', $jenisHamaOtomatis ?? [], true) ? 'checked' : '' }}>
|
||||||
|
<label class="form-check-label" for="jenis-hama-bentuk">Kutu putih/kutu sisik</label>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="form-check mt-2">
|
||||||
|
<input class="form-check-input @error('jenis_hama') is-invalid @enderror" disabled
|
||||||
|
type="checkbox"
|
||||||
|
name="jenis_hama[]"
|
||||||
|
value="Ulat pemakan daun"
|
||||||
|
id="jenis-hama-ulat"
|
||||||
|
{{ in_array('Ulat pemakan daun', $jenisHamaOtomatis ?? [], true) ? 'checked' : '' }}>
|
||||||
|
<label class="form-check-label" for="jenis-hama-bentuk">Ulat pemakan daun</label>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="form-check mt-2">
|
||||||
|
<input class="form-check-input @error('jenis_hama') is-invalid @enderror" disabled
|
||||||
|
type="checkbox"
|
||||||
|
name="jenis_hama[]"
|
||||||
|
value="Tikus"
|
||||||
|
id="jenis-hama-tikus"
|
||||||
|
{{ in_array('Tikus', $jenisHamaOtomatis ?? [], true) ? 'checked' : '' }}>
|
||||||
|
<label class="form-check-label" for="jenis-hama-bentuk">Tikus</label>
|
||||||
|
</div>
|
||||||
|
<small class="text-muted text-secondary">* Tidak diisi, terisi otomatis di Praktik Budidaya</small>
|
||||||
|
@error('jenis_hama')
|
||||||
|
<div class="error invalid-feedback d-block">{{ $message }}</div>
|
||||||
|
@enderror
|
||||||
|
</div>
|
||||||
|
<div class="col-md-3 mb-4 form-control-validation auto-pest-disease-field">
|
||||||
|
<label class="form-label">Jenis Penyakit</label>
|
||||||
|
|
||||||
|
<div class="form-check mt-2">
|
||||||
|
<input class="form-check-input @error('jenis_penyakit') is-invalid @enderror" disabled
|
||||||
|
type="checkbox"
|
||||||
|
name="jenis_penyakit[]"
|
||||||
|
value="Karat daun"
|
||||||
|
id="jenis-penyakit-karat-daun"
|
||||||
|
{{ in_array('Karat daun', $jenisPenyakitOtomatis ?? [], true) ? 'checked' : '' }}>
|
||||||
|
<label class="form-check-label" for="jenis-penyakit-bentuk">Karat daun</label>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="form-check mt-2">
|
||||||
|
<input class="form-check-input @error('jenis_penyakit') is-invalid @enderror" disabled
|
||||||
|
type="checkbox"
|
||||||
|
name="jenis_penyakit[]"
|
||||||
|
value="Busuk buah/antraknosa"
|
||||||
|
id="jenis-penyakit-busuk-buah"
|
||||||
|
{{ in_array('Busuk buah/antraknosa', $jenisPenyakitOtomatis ?? [], true) ? 'checked' : '' }}>
|
||||||
|
<label class="form-check-label" for="jenis-penyakit-bentuk">Busuk buah/antraknosa</label>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="form-check mt-2">
|
||||||
|
<input class="form-check-input @error('jenis_penyakit') is-invalid @enderror" disabled
|
||||||
|
type="checkbox"
|
||||||
|
name="jenis_penyakit[]"
|
||||||
|
value="Busuk akar"
|
||||||
|
id="jenis-penyakit-busuk-akar"
|
||||||
|
{{ in_array('Busuk akar', $jenisPenyakitOtomatis ?? [], true) ? 'checked' : '' }}>
|
||||||
|
<label class="form-check-label" for="jenis-penyakit-bentuk">Busuk akar</label>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="form-check mt-2">
|
||||||
|
<input class="form-check-input @error('jenis_penyakit') is-invalid @enderror" disabled
|
||||||
|
type="checkbox"
|
||||||
|
name="jenis_penyakit[]"
|
||||||
|
value="Bercak daun"
|
||||||
|
id="jenis-penyakit-bercak-daun"
|
||||||
|
{{ in_array('Bercak daun', $jenisPenyakitOtomatis ?? [], true) ? 'checked' : '' }}>
|
||||||
|
<label class="form-check-label" for="jenis-penyakit-bentuk">Bercak daun</label>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="form-check mt-2">
|
||||||
|
<input class="form-check-input @error('jenis_penyakit') is-invalid @enderror" disabled
|
||||||
|
type="checkbox"
|
||||||
|
name="jenis_penyakit[]"
|
||||||
|
value="Layu fusarium"
|
||||||
|
id="jenis-penyakit-layu-fusarium"
|
||||||
|
{{ in_array('Layu fusarium', $jenisPenyakitOtomatis ?? [], true) ? 'checked' : '' }}>
|
||||||
|
<label class="form-check-label" for="jenis-penyakit-bentuk">Layu fusarium</label>
|
||||||
|
</div>
|
||||||
|
<small class="text-muted text-secondary">* Tidak diisi, terisi otomatis di praktik budidaya</small>
|
||||||
|
|
||||||
|
@error('jenis_penyakit')
|
||||||
|
<div class="error invalid-feedback d-block">{{ $message }}</div>
|
||||||
|
@enderror
|
||||||
|
</div>
|
||||||
|
<!-- <div class="col-md-3 mb-3 form-control-validation">
|
||||||
<label class="form-label">Serangan Hama</label>
|
<label class="form-label">Serangan Hama</label>
|
||||||
<select id="serangan_hama" name="serangan_hama" class="form-select @error('serangan_hama') is-invalid @enderror">
|
<select id="serangan_hama" name="serangan_hama" class="form-select @error('serangan_hama') is-invalid @enderror">
|
||||||
<option value="">Pilih Serangan Hama</option>
|
<option value="">Pilih Serangan Hama</option>
|
||||||
@@ -125,14 +397,14 @@
|
|||||||
<option value="{{ \App\Enums\PenyakitTanaman::DAUN_BERCAK }}" {{ old('penyakit_tanaman') == \App\Enums\PenyakitTanaman::DAUN_BERCAK ? 'selected' : '' }}>Daun Bercak</option>
|
<option value="{{ \App\Enums\PenyakitTanaman::DAUN_BERCAK }}" {{ old('penyakit_tanaman') == \App\Enums\PenyakitTanaman::DAUN_BERCAK ? 'selected' : '' }}>Daun Bercak</option>
|
||||||
<option value="{{ \App\Enums\PenyakitTanaman::TANAMAN_LAYU }}" {{ old('penyakit_tanaman') == \App\Enums\PenyakitTanaman::TANAMAN_LAYU ? 'selected' : '' }}>Tanaman Layu</option>
|
<option value="{{ \App\Enums\PenyakitTanaman::TANAMAN_LAYU }}" {{ old('penyakit_tanaman') == \App\Enums\PenyakitTanaman::TANAMAN_LAYU ? 'selected' : '' }}>Tanaman Layu</option>
|
||||||
</select>
|
</select>
|
||||||
</div>
|
</div> -->
|
||||||
<div class="col-md-3 mb-3 form-control-validation">
|
<div class="col-md-6 mb-3 form-control-validation">
|
||||||
<label class="form-label">Keparahan Serangan Hama/Penyakit</label>
|
<label class="form-label">Keparahan Serangan Hama/Penyakit</label>
|
||||||
<select id="keparahan_serangan" name="keparahan_serangan" class="form-select @error('keparahan_serangan') is-invalid @enderror">
|
<select id="keparahan_serangan" name="keparahan_serangan" class="form-select @error('keparahan_serangan') is-invalid @enderror">
|
||||||
<option value="">Pilih Keparahan Serangan</option>
|
<option value="">Pilih Keparahan Serangan</option>
|
||||||
<option value="{{ \App\Enums\KeparahanSerangan::RINGAN }}" {{ old('keparahan_serangan') == \App\Enums\KeparahanSerangan::RINGAN ? 'selected' : '' }}>Ringan</option>
|
<option value="{{ \App\Enums\KeparahanSerangan::RINGAN }}" {{ old('keparahan_serangan') == \App\Enums\KeparahanSerangan::RINGAN ? 'selected' : '' }}>{{ \App\Enums\KeparahanSerangan::RINGAN->label() }}</option>
|
||||||
<option value="{{ \App\Enums\KeparahanSerangan::SEDANG }}" {{ old('keparahan_serangan') == \App\Enums\KeparahanSerangan::SEDANG ? 'selected' : '' }}>Sedang</option>
|
<option value="{{ \App\Enums\KeparahanSerangan::SEDANG }}" {{ old('keparahan_serangan') == \App\Enums\KeparahanSerangan::SEDANG ? 'selected' : '' }}>{{ \App\Enums\KeparahanSerangan::SEDANG->label() }}</option>
|
||||||
<option value="{{ \App\Enums\KeparahanSerangan::BERAT }}" {{ old('keparahan_serangan') == \App\Enums\KeparahanSerangan::BERAT ? 'selected' : '' }}>Berat</option>
|
<option value="{{ \App\Enums\KeparahanSerangan::BERAT }}" {{ old('keparahan_serangan') == \App\Enums\KeparahanSerangan::BERAT ? 'selected' : '' }}>{{ \App\Enums\KeparahanSerangan::BERAT->label() }}</option>
|
||||||
</select>
|
</select>
|
||||||
@error('keparahan_serangan')<div class="error invalid-feedback">{{ $message }}</div>@enderror
|
@error('keparahan_serangan')<div class="error invalid-feedback">{{ $message }}</div>@enderror
|
||||||
</div>
|
</div>
|
||||||
@@ -151,9 +423,9 @@
|
|||||||
<div class="col-md-6 mb-3 form-control-validation">
|
<div class="col-md-6 mb-3 form-control-validation">
|
||||||
<label class="form-label">Tanaman Penaung</label>
|
<label class="form-label">Tanaman Penaung</label>
|
||||||
<select id="tanaman_penaung" name="tanaman_penaung[]" class="form-select @error('tanaman_penaung[]') is-invalid @enderror" multiple>
|
<select id="tanaman_penaung" name="tanaman_penaung[]" class="form-select @error('tanaman_penaung[]') is-invalid @enderror" multiple>
|
||||||
<option value="">Pilih Komoditas</option>
|
<option value="">Pilih Tanaman atau ketik jika tidak ada</option>
|
||||||
@foreach($komoditas as $k)
|
@foreach($tanamanPenaung as $k)
|
||||||
<option value="{{ $k->id }}">{{ $k->nama }}</option>
|
<option value="{{ $k->nama }}">{{ $k->nama }}</option>
|
||||||
@endforeach
|
@endforeach
|
||||||
</select>
|
</select>
|
||||||
@error('tanaman_penaung[]')<div class="error invalid-feedback">{{ $message }}</div>@enderror
|
@error('tanaman_penaung[]')<div class="error invalid-feedback">{{ $message }}</div>@enderror
|
||||||
@@ -227,20 +499,19 @@
|
|||||||
|
|
||||||
<hr class="my-4">
|
<hr class="my-4">
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-12 mb-4">
|
<div class="col-md-12 mb-3 form-control-validation">
|
||||||
<h6 class="mb-0">Foto</h6>
|
<h6 class="mb-5">Foto</h6>
|
||||||
|
<div id="dropzone-container" class="dropzone-custom-container">
|
||||||
<div class="row">
|
|
||||||
<div class="col-md-12 mb-3 form-control-validation">
|
<div id="btn-tambah-foto" class="btn-tambah-foto">
|
||||||
<div id="dropzone-foto" class="needsclick">
|
<i class="ti tabler-plus" style="font-size: 32px; margin-bottom: 8px;"></i>
|
||||||
<div class="dz-message needsclick">
|
<span style="font-size: 13px; font-weight: 600;">Tambah Foto</span>
|
||||||
Drop foto di sini atau klik untuk memilih
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<input type="file" id="foto-input" name="foto[]" multiple hidden>
|
|
||||||
@error('file')<div class="error invalid-feedback">{{ $message }}</div>@enderror
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<input type="file" id="foto-input" multiple hidden>
|
||||||
|
@error('file')<div class="error invalid-feedback">{{ $message }}</div>@enderror
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -258,6 +529,11 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div id="foto-lightbox" class="foto-lightbox">
|
||||||
|
<span class="foto-lightbox-close">×</span>
|
||||||
|
<img id="foto-lightbox-img" src="" alt="Preview Foto Besar">
|
||||||
|
</div>
|
||||||
@endsection
|
@endsection
|
||||||
|
|
||||||
@push('scripts')
|
@push('scripts')
|
||||||
@@ -274,7 +550,9 @@
|
|||||||
$('#penyakit_tanaman').select2();
|
$('#penyakit_tanaman').select2();
|
||||||
$('#keparahan_serangan').select2();
|
$('#keparahan_serangan').select2();
|
||||||
$('#komoditas_lain').select2();
|
$('#komoditas_lain').select2();
|
||||||
$('#tanaman_penaung').select2();
|
$('#tanaman_penaung').select2({
|
||||||
|
tags: true
|
||||||
|
});
|
||||||
|
|
||||||
$('#provinsi_id').select2().change(function(e) {
|
$('#provinsi_id').select2().change(function(e) {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
@@ -500,41 +778,110 @@
|
|||||||
|
|
||||||
let area = L.GeometryUtil.geodesicArea(latlngs);
|
let area = L.GeometryUtil.geodesicArea(latlngs);
|
||||||
|
|
||||||
console.log(area);
|
let areaHa = area / 10000;
|
||||||
|
|
||||||
$('#luas_lahan').val(area.toFixed(2));
|
$('#luas_lahan').val(areaHa.toFixed(4));
|
||||||
}
|
}
|
||||||
|
|
||||||
// DROPZONE
|
const previewTemplate = `
|
||||||
const previewTemplate = `<div class="dz-preview dz-file-preview">
|
<div class="dz-preview dz-file-preview">
|
||||||
<div class="dz-details">
|
<div class="dz-control-panel">
|
||||||
<div class="dz-thumbnail">
|
<a href="javascript:void(0);" class="dz-btn-action btn-edit" title="Ganti Foto">
|
||||||
<img data-dz-thumbnail>
|
<i class="ti tabler-pencil"></i>
|
||||||
<span class="dz-nopreview">No preview</span>
|
</a>
|
||||||
<div class="dz-success-mark"></div>
|
<a href="javascript:void(0);" class="dz-btn-action btn-delete" data-dz-remove title="Hapus Foto">
|
||||||
<div class="dz-error-mark"></div>
|
<i class="ti tabler-x"></i>
|
||||||
<div class="dz-error-message"><span data-dz-errormessage></span></div>
|
</a>
|
||||||
<div class="progress">
|
</div>
|
||||||
<div class="progress-bar progress-bar-primary" role="progressbar" aria-valuemin="0" aria-valuemax="100" data-dz-uploadprogress></div>
|
<div class="dz-image"><img data-dz-thumbnail /></div>
|
||||||
</div>
|
<div class="dz-details">
|
||||||
</div>
|
<div class="dz-filename"><span data-dz-name></span></div>
|
||||||
<div class="dz-filename" data-dz-name></div>
|
<div class="dz-size"><span data-dz-size></span></div>
|
||||||
<div class="dz-size" data-dz-size></div>
|
</div>
|
||||||
</div>
|
</div>`;
|
||||||
</div>`;
|
|
||||||
|
|
||||||
|
|
||||||
Dropzone.autoDiscover = false;
|
Dropzone.autoDiscover = false;
|
||||||
const dropzoneFoto = $("#dropzone-foto").addClass("dropzone").dropzone({
|
|
||||||
url: "/",
|
let myDropzone = null;
|
||||||
previewTemplate: previewTemplate,
|
const dropzoneElement = document.querySelector("#dropzone-container");
|
||||||
parallelUploads: 1,
|
|
||||||
maxFilesize: 5,
|
if (dropzoneElement) {
|
||||||
addRemoveLinks: true,
|
myDropzone = new Dropzone(dropzoneElement, {
|
||||||
acceptedFiles: "image/jpeg,image/jpg,image/png",
|
url: "/",
|
||||||
|
autoProcessQueue: false,
|
||||||
|
previewTemplate: previewTemplate,
|
||||||
|
clickable: "#btn-tambah-foto",
|
||||||
|
previewsContainer: "#dropzone-container",
|
||||||
|
parallelUploads: 10,
|
||||||
|
maxFilesize: 5,
|
||||||
|
addRemoveLinks: false,
|
||||||
|
acceptedFiles: "image/jpeg,image/jpg,image/png",
|
||||||
|
thumbnailWidth: null,
|
||||||
|
thumbnailHeight: null,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
$(document).on('click', '.btn-edit', function(e) {
|
||||||
|
e.preventDefault();
|
||||||
|
e.stopPropagation();
|
||||||
|
|
||||||
|
let previewElement = $(this).closest('.dz-preview')[0];
|
||||||
|
let dz = myDropzone;
|
||||||
|
let fileToReplace = dz.files.find(f => f.previewElement === previewElement);
|
||||||
|
|
||||||
|
if (fileToReplace) {
|
||||||
|
let tempInput = document.createElement('input');
|
||||||
|
tempInput.type = 'file';
|
||||||
|
tempInput.accept = 'image/jpeg,image/jpg,image/png';
|
||||||
|
|
||||||
|
tempInput.onchange = function(event) {
|
||||||
|
let newFile = event.target.files[0];
|
||||||
|
if (newFile) {
|
||||||
|
dz.removeFile(fileToReplace);
|
||||||
|
dz.addFile(newFile);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
tempInput.click();
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
// FORM
|
$(document).on('click', '#dropzone-container .dz-image img', function (e) {
|
||||||
|
e.stopPropagation();
|
||||||
|
$('#foto-lightbox-img').attr('src', this.src);
|
||||||
|
$('#foto-lightbox').addClass('active');
|
||||||
|
});
|
||||||
|
|
||||||
|
$('#foto-lightbox').on('click', function (e) {
|
||||||
|
if (e.target === this || $(e.target).hasClass('foto-lightbox-close')) {
|
||||||
|
$(this).removeClass('active');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
$(document).on('click', '.dz-edit', function(e) {
|
||||||
|
e.preventDefault();
|
||||||
|
e.stopPropagation();
|
||||||
|
|
||||||
|
let previewElement = $(this).closest('.dz-preview')[0];
|
||||||
|
|
||||||
|
let dz = $("#dropzone-foto")[0].dropzone;
|
||||||
|
|
||||||
|
let fileToReplace = dz.files.find(f => f.previewElement === previewElement);
|
||||||
|
|
||||||
|
if (fileToReplace) {
|
||||||
|
let tempInput = document.createElement('input');
|
||||||
|
tempInput.type = 'file';
|
||||||
|
tempInput.accept = 'image/jpeg,image/jpg,image/png';
|
||||||
|
|
||||||
|
tempInput.onchange = function(event) {
|
||||||
|
let newFile = event.target.files[0];
|
||||||
|
if (newFile) {
|
||||||
|
dz.removeFile(fileToReplace);
|
||||||
|
dz.addFile(newFile);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
tempInput.click();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
$('#petani-lahan-tanaman').validate({
|
$('#petani-lahan-tanaman').validate({
|
||||||
rules: {
|
rules: {
|
||||||
@@ -546,8 +893,8 @@
|
|||||||
kabupatenkota_id: { required: true },
|
kabupatenkota_id: { required: true },
|
||||||
kecamatan_id: { required: true },
|
kecamatan_id: { required: true },
|
||||||
desa_kelurahan_id: { required: true },
|
desa_kelurahan_id: { required: true },
|
||||||
jumlah_tanaman: { required: true },
|
jumlah_tanaman: { number: true, min: 0 },
|
||||||
umur_lahan: { required: true, number: true, min: 1 },
|
umur_lahan: { number: true, min: 1 },
|
||||||
umur_tanaman: { required: true, number: true, min: 1 },
|
umur_tanaman: { required: true, number: true, min: 1 },
|
||||||
kondisi_tanaman: { required: true },
|
kondisi_tanaman: { required: true },
|
||||||
},
|
},
|
||||||
@@ -560,8 +907,8 @@
|
|||||||
kabupatenkota_id: { required: "Kabupaten/Kota wajib diisi" },
|
kabupatenkota_id: { required: "Kabupaten/Kota wajib diisi" },
|
||||||
kecamatan_id: { required: "Kecamatan wajib diisi" },
|
kecamatan_id: { required: "Kecamatan wajib diisi" },
|
||||||
desa_kelurahan_id: { required: "Desa/Kelurahan wajib diisi" },
|
desa_kelurahan_id: { required: "Desa/Kelurahan wajib diisi" },
|
||||||
jumlah_tanaman: { required: "Jumlah tanaman wajib diisi" },
|
jumlah_tanaman: { number: "Jumlah tanaman harus berupa angka", min: "Jumlah tanaman minimal 0" },
|
||||||
umur_lahan: { required: "Umur lahan wajib diisi", number: "Umur lahan harus berupa angka", min: "Umur lahan minimal 1 tahun" },
|
umur_lahan: { number: "Umur lahan harus berupa angka", min: "Umur lahan minimal 1 tahun" },
|
||||||
umur_tanaman: { required: "Umur tanaman wajib diisi", number: "Umur tanaman harus berupa angka", min: "Umur tanaman minimal 1 tahun" },
|
umur_tanaman: { required: "Umur tanaman wajib diisi", number: "Umur tanaman harus berupa angka", min: "Umur tanaman minimal 1 tahun" },
|
||||||
kondisi_tanaman: { required: "Kondisi tanaman wajib diisi" },
|
kondisi_tanaman: { required: "Kondisi tanaman wajib diisi" },
|
||||||
},
|
},
|
||||||
@@ -579,28 +926,69 @@
|
|||||||
submitHandler: function (form) {
|
submitHandler: function (form) {
|
||||||
const formData = new FormData(form);
|
const formData = new FormData(form);
|
||||||
|
|
||||||
const dz = $("#dropzone-foto")[0].dropzone;
|
if (myDropzone) {
|
||||||
|
myDropzone.files.forEach(function(file) {
|
||||||
|
formData.append("foto[]", file);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
dz.getAcceptedFiles().forEach(function(file) {
|
let submitBtn = $(form).find('button[type="submit"]');
|
||||||
formData.append("foto[]", file);
|
let originalText = submitBtn.html();
|
||||||
});
|
submitBtn.prop('disabled', true).html('<i class="ti tabler-loader fa-spin me-2"></i> Menyimpan...');
|
||||||
|
|
||||||
$.ajax({
|
$.ajax({
|
||||||
url: form.action,
|
url: $(form).attr('action'),
|
||||||
type: "POST",
|
type: "POST",
|
||||||
data: formData,
|
data: formData,
|
||||||
processData: false,
|
processData: false,
|
||||||
contentType: false,
|
contentType: false,
|
||||||
|
headers: {
|
||||||
|
'X-CSRF-TOKEN': $('input[name="_token"]').val(),
|
||||||
|
'Accept': 'application/json'
|
||||||
|
},
|
||||||
success: function(res) {
|
success: function(res) {
|
||||||
if (res.redirect) {
|
Swal.fire({
|
||||||
window.location.href = res.redirect;
|
icon: 'success',
|
||||||
|
title: 'Berhasil!',
|
||||||
|
text: 'Data lahan berhasil ditambahkan.',
|
||||||
|
showConfirmButton: false,
|
||||||
|
timer: 1500
|
||||||
|
}).then(() => {
|
||||||
|
window.location.href = res.redirect || window.location.href;
|
||||||
|
});
|
||||||
|
},
|
||||||
|
error: function(xhr) {
|
||||||
|
submitBtn.prop('disabled', false).html(originalText);
|
||||||
|
|
||||||
|
if (xhr.status === 422) {
|
||||||
|
let errors = xhr.responseJSON.errors;
|
||||||
|
let errorMsg = "";
|
||||||
|
$.each(errors, function(key, val) {
|
||||||
|
errorMsg += val[0] + "\n";
|
||||||
|
});
|
||||||
|
|
||||||
|
Swal.fire({
|
||||||
|
icon: 'warning',
|
||||||
|
title: 'Penyimpanan Gagal',
|
||||||
|
text: errorMsg,
|
||||||
|
confirmButtonColor: '#dc3545'
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
let errorDetail = xhr.responseJSON && xhr.responseJSON.message ? xhr.responseJSON.message : xhr.statusText;
|
||||||
|
|
||||||
|
Swal.fire({
|
||||||
|
icon: 'error',
|
||||||
|
title: 'Terjadi Kesalahan',
|
||||||
|
text: "Error " + xhr.status + ": " + errorDetail,
|
||||||
|
confirmButtonColor: '#dc3545'
|
||||||
|
});
|
||||||
|
console.error(xhr.responseText);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
@endpush
|
@endpush
|
||||||
|
|||||||
@@ -3,6 +3,7 @@
|
|||||||
@push('style')
|
@push('style')
|
||||||
<link rel="stylesheet" href="https://unpkg.com/leaflet@1.9.4/dist/leaflet.css" />
|
<link rel="stylesheet" href="https://unpkg.com/leaflet@1.9.4/dist/leaflet.css" />
|
||||||
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/leaflet.draw/1.0.4/leaflet.draw.css" />
|
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/leaflet.draw/1.0.4/leaflet.draw.css" />
|
||||||
|
<link rel="stylesheet" href="https://unpkg.com/dropzone@5/dist/min/dropzone.min.css" type="text/css" />
|
||||||
|
|
||||||
<style>
|
<style>
|
||||||
#map {
|
#map {
|
||||||
@@ -11,6 +12,32 @@
|
|||||||
background-color: #f8f9fa;
|
background-color: #f8f9fa;
|
||||||
z-index: 1;
|
z-index: 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.dropzone-custom-container { display: flex; flex-wrap: wrap; gap: 15px; padding: 15px; border: 2px dashed #ced4da; border-radius: 12px; background-color: #f8f9fa; min-height: 160px; align-items: center; }
|
||||||
|
.btn-tambah-foto { display: flex; flex-direction: column; align-items: center; justify-content: center; width: 140px; height: 160px; border: 2px dashed #a8b1ba; border-radius: 12px; background: #fff; color: #6c757d; cursor: pointer; transition: 0.2s; order: 999; }
|
||||||
|
.btn-tambah-foto:hover { background: #e9ecef; border-color: #6c757d; color: #495057; }
|
||||||
|
.dropzone-custom-container .dz-preview { position: relative; background: #fff; border-radius: 12px; box-shadow: 0 4px 10px rgba(0,0,0,0.08); border: 1px solid #e2e8f0; width: 140px; display: flex; flex-direction: column; }
|
||||||
|
.dropzone-custom-container .dz-image { width: 100%; height: 110px; background: #f1f5f9; cursor: zoom-in; display: flex; align-items: center; justify-content: center; border-radius: 12px 12px 0 0; overflow: hidden; }
|
||||||
|
.dropzone-custom-container .dz-image img { width: 100%; height: 100%; object-fit: cover; }
|
||||||
|
.dropzone-custom-container .dz-details { padding: 8px; text-align: center; background: #fff; border-radius: 0 0 12px 12px; border-top: 1px solid #e2e8f0; }
|
||||||
|
.dropzone-custom-container .dz-filename { font-size: 11px; font-weight: 600; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; color: #495057; }
|
||||||
|
.dropzone-custom-container .dz-size { font-size: 10px; color: #adb5bd; }
|
||||||
|
.dropzone-custom-container .dz-control-panel { position: absolute; top: -8px; right: -8px; display: flex; gap: 5px; z-index: 20; }
|
||||||
|
.dropzone-custom-container .dz-btn-action { display: flex; align-items: center; justify-content: center; width: 26px; height: 26px; border-radius: 50%; color: #fff !important; text-decoration: none !important; box-shadow: 0 2px 5px rgba(0,0,0,0.2); cursor: pointer; font-size: 14px; }
|
||||||
|
.dropzone-custom-container .btn-edit { background: #ffc107; color: #000 !important; }
|
||||||
|
.dropzone-custom-container .btn-edit:hover { background: #7367f0; }
|
||||||
|
.dropzone-custom-container .btn-delete { background: #dc3545; }
|
||||||
|
.dropzone-custom-container .btn-delete:hover { background: #c82333; }
|
||||||
|
.dropzone-custom-container .dz-error-message, .dropzone-custom-container .dz-success-mark, .dropzone-custom-container .dz-error-mark, .dropzone-custom-container .progress { display: none !important; }
|
||||||
|
.foto-lightbox { display: none; position: fixed !important; top: 0 !important; left: 0 !important; width: 100vw !important; height: 100vh !important; background: rgba(0, 0, 0, 0.85) !important; z-index: 99999 !important; align-items: center !important; justify-content: center !important; padding: 30px !important; box-sizing: border-box !important; }
|
||||||
|
.foto-lightbox.active { display: flex !important; }
|
||||||
|
.foto-lightbox img { max-width: 90vw !important; max-height: 85vh !important; object-fit: contain !important; border-radius: 8px !important; box-shadow: 0 10px 40px rgba(0,0,0,0.5) !important; }
|
||||||
|
.foto-lightbox-close { position: absolute !important; top: 20px !important; right: 30px !important; color: #fff !important; font-size: 40px !important; font-weight: bold !important; cursor: pointer !important; z-index: 100000 !important; }
|
||||||
|
.foto-lightbox-close:hover { color: #dc3545 !important; }
|
||||||
|
.auto-pest-disease-field .form-check-label,
|
||||||
|
.auto-pest-disease-field .text-muted {
|
||||||
|
font-size: 0.875rem;
|
||||||
|
}
|
||||||
</style>
|
</style>
|
||||||
@endpush
|
@endpush
|
||||||
|
|
||||||
@@ -50,7 +77,7 @@
|
|||||||
|
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-md-3 mb-3 form-control-validation">
|
<div class="col-md-3 mb-3 form-control-validation">
|
||||||
<label class="form-label">Luas Lahan (m2) <span class="text-danger">*</span></label>
|
<label class="form-label">Luas Lahan (ha) <span class="text-danger">*</span></label>
|
||||||
<input type="number" step="0.01" id="luas_lahan" name="luas_lahan" class="form-control @error('luas_lahan') is-invalid @enderror" placeholder="Contoh: 1.5" required
|
<input type="number" step="0.01" id="luas_lahan" name="luas_lahan" class="form-control @error('luas_lahan') is-invalid @enderror" placeholder="Contoh: 1.5" required
|
||||||
value="{{ old('luas_lahan', $lahanSelected->luas_lahan) }}" />
|
value="{{ old('luas_lahan', $lahanSelected->luas_lahan) }}" />
|
||||||
@error('luas_lahan')<div class="error invalid-feedback">{{ $message }}</div>@enderror
|
@error('luas_lahan')<div class="error invalid-feedback">{{ $message }}</div>@enderror
|
||||||
@@ -62,8 +89,8 @@
|
|||||||
@error('umur_lahan')<div class="error invalid-feedback">{{ $message }}</div>@enderror
|
@error('umur_lahan')<div class="error invalid-feedback">{{ $message }}</div>@enderror
|
||||||
</div>
|
</div>
|
||||||
<div class="col-md-3 mb-3 form-control-validation">
|
<div class="col-md-3 mb-3 form-control-validation">
|
||||||
<label class="form-label">Jumlah Tanaman <span class="text-danger">*</span></label>
|
<label class="form-label">Jumlah Tanaman</label>
|
||||||
<input type="number" name="jumlah_tanaman" class="form-control @error('jumlah_tanaman') is-invalid @enderror" placeholder="Contoh: 1" required
|
<input type="number" name="jumlah_tanaman" class="form-control @error('jumlah_tanaman') is-invalid @enderror" placeholder="Contoh: 1 (min 0)"
|
||||||
value="{{ old('jumlah_tanaman', $lahanSelected->jumlah_tanaman) }}" />
|
value="{{ old('jumlah_tanaman', $lahanSelected->jumlah_tanaman) }}" />
|
||||||
@error('jumlah_tanaman')<div class="error invalid-feedback">{{ $message }}</div>@enderror
|
@error('jumlah_tanaman')<div class="error invalid-feedback">{{ $message }}</div>@enderror
|
||||||
</div>
|
</div>
|
||||||
@@ -79,7 +106,7 @@
|
|||||||
<label class="form-label">Komoditas Utama <span class="text-danger">*</span></label>
|
<label class="form-label">Komoditas Utama <span class="text-danger">*</span></label>
|
||||||
<select id="komoditas_id" name="komoditas_id" class="form-select @error('komoditas_id') is-invalid @enderror">
|
<select id="komoditas_id" name="komoditas_id" class="form-select @error('komoditas_id') is-invalid @enderror">
|
||||||
<option value="">Pilih Komoditas</option>
|
<option value="">Pilih Komoditas</option>
|
||||||
@foreach($komoditas as $k)
|
@foreach($komoditas->where('is_utama', '1') as $k)
|
||||||
<option value="{{ $k->id }}" {{ old('komoditas_id', $lahanSelected->komoditas_id) == $k->id ? 'selected' : '' }}>{{ $k->nama }}</option>
|
<option value="{{ $k->id }}" {{ old('komoditas_id', $lahanSelected->komoditas_id) == $k->id ? 'selected' : '' }}>{{ $k->nama }}</option>
|
||||||
@endforeach
|
@endforeach
|
||||||
</select>
|
</select>
|
||||||
@@ -106,17 +133,19 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-md-3 mb-3 form-control-validation">
|
<div class="col-md-6 mb-3 form-control-validation">
|
||||||
<label class="form-label">Kondisi Umum Tanaman</label>
|
<label class="form-label">Kondisi Umum Tanaman</label>
|
||||||
<select id="kondisi_tanaman" name="kondisi_tanaman" class="form-select @error('kondisi_tanaman') is-invalid @enderror">
|
<select id="kondisi_tanaman" name="kondisi_tanaman" class="form-select @error('kondisi_tanaman') is-invalid @enderror">
|
||||||
<option value="">Pilih Kondisi Tanaman</option>
|
<option value="">Pilih Kondisi Tanaman</option>
|
||||||
<option value="{{ \App\Enums\KondisiTanaman::BAIK }}" {{ old('kondisi_tanaman', $lahanSelected->kondisi_tanaman) == \App\Enums\KondisiTanaman::BAIK ? 'selected' : '' }}>Baik</option>
|
<option value="{{ \App\Enums\KondisiTanaman::BAIK }}" {{ old('kondisi_tanaman', $lahanSelected->kondisi_tanaman) == \App\Enums\KondisiTanaman::BAIK ? 'selected' : '' }}>{{ \App\Enums\KondisiTanaman::BAIK->label() }}</option>
|
||||||
<option value="{{ \App\Enums\KondisiTanaman::SEDANG }}" {{ old('kondisi_tanaman', $lahanSelected->kondisi_tanaman) == \App\Enums\KondisiTanaman::SEDANG ? 'selected' : '' }}>Sedang</option>
|
<option value="{{ \App\Enums\KondisiTanaman::SEDANG }}" {{ old('kondisi_tanaman', $lahanSelected->kondisi_tanaman) == \App\Enums\KondisiTanaman::SEDANG ? 'selected' : '' }}>{{ \App\Enums\KondisiTanaman::SEDANG->label() }}</option>
|
||||||
<option value="{{ \App\Enums\KondisiTanaman::BURUK }}" {{ old('kondisi_tanaman', $lahanSelected->kondisi_tanaman) == \App\Enums\KondisiTanaman::BURUK ? 'selected' : '' }}>Buruk</option>
|
<option value="{{ \App\Enums\KondisiTanaman::BURUK }}" {{ old('kondisi_tanaman', $lahanSelected->kondisi_tanaman) == \App\Enums\KondisiTanaman::BURUK ? 'selected' : '' }}>{{ \App\Enums\KondisiTanaman::BURUK->label() }}</option>
|
||||||
</select>
|
</select>
|
||||||
@error('kondisi_tanaman')<div class="error invalid-feedback">{{ $message }}</div>@enderror
|
@error('kondisi_tanaman')<div class="error invalid-feedback">{{ $message }}</div>@enderror
|
||||||
</div>
|
</div>
|
||||||
<div class="col-md-3 mb-3 form-control-validation">
|
</div>
|
||||||
|
<div class="row">
|
||||||
|
<!-- <div class="col-md-3 mb-3 form-control-validation">
|
||||||
<label class="form-label">Serangan Hama</label>
|
<label class="form-label">Serangan Hama</label>
|
||||||
<select id="serangan_hama" name="serangan_hama" class="form-select @error('serangan_hama') is-invalid @enderror">
|
<select id="serangan_hama" name="serangan_hama" class="form-select @error('serangan_hama') is-invalid @enderror">
|
||||||
<option value="">Pilih Serangan Hama</option>
|
<option value="">Pilih Serangan Hama</option>
|
||||||
@@ -135,14 +164,129 @@
|
|||||||
<option value="{{ \App\Enums\PenyakitTanaman::DAUN_BERCAK }}" {{ old('penyakit_tanaman', $lahanSelected->penyakit_tanaman) == \App\Enums\PenyakitTanaman::DAUN_BERCAK ? 'selected' : '' }}>Daun Bercak</option>
|
<option value="{{ \App\Enums\PenyakitTanaman::DAUN_BERCAK }}" {{ old('penyakit_tanaman', $lahanSelected->penyakit_tanaman) == \App\Enums\PenyakitTanaman::DAUN_BERCAK ? 'selected' : '' }}>Daun Bercak</option>
|
||||||
<option value="{{ \App\Enums\PenyakitTanaman::TANAMAN_LAYU }}" {{ old('penyakit_tanaman', $lahanSelected->penyakit_tanaman) == \App\Enums\PenyakitTanaman::TANAMAN_LAYU ? 'selected' : '' }}>Tanaman Layu</option>
|
<option value="{{ \App\Enums\PenyakitTanaman::TANAMAN_LAYU }}" {{ old('penyakit_tanaman', $lahanSelected->penyakit_tanaman) == \App\Enums\PenyakitTanaman::TANAMAN_LAYU ? 'selected' : '' }}>Tanaman Layu</option>
|
||||||
</select>
|
</select>
|
||||||
|
</div> -->
|
||||||
|
<div class="col-md-3 mb-4 form-control-validation auto-pest-disease-field">
|
||||||
|
<label class="form-label">Jenis Hama</label>
|
||||||
|
|
||||||
|
<div class="form-check mt-2">
|
||||||
|
<input class="form-check-input @error('jenis_hama') is-invalid @enderror" disabled
|
||||||
|
type="checkbox"
|
||||||
|
name="jenis_hama[]"
|
||||||
|
value="Penggerek buah"
|
||||||
|
id="jenis-hama-penggerek-buah"
|
||||||
|
{{ in_array('Penggerek buah', $jenisHamaOtomatis ?? [], true) ? 'checked' : '' }}>
|
||||||
|
<label class="form-check-label" for="jenis-hama-bentuk">Penggerek buah</label>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="form-check mt-2">
|
||||||
|
<input class="form-check-input @error('jenis_hama') is-invalid @enderror" disabled
|
||||||
|
type="checkbox"
|
||||||
|
name="jenis_hama[]"
|
||||||
|
value="Penggerek batang"
|
||||||
|
id="jenis-hama-penggerek-batang"
|
||||||
|
{{ in_array('Penggerek batang', $jenisHamaOtomatis ?? [], true) ? 'checked' : '' }}>
|
||||||
|
<label class="form-check-label" for="jenis-hama-bentuk">Penggerek batang</label>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="form-check mt-2">
|
||||||
|
<input class="form-check-input @error('jenis_hama') is-invalid @enderror" disabled
|
||||||
|
type="checkbox"
|
||||||
|
name="jenis_hama[]"
|
||||||
|
value="Kutu putih/kutu sisik"
|
||||||
|
id="jenis-hama-kutu"
|
||||||
|
{{ in_array('Kutu putih/kutu sisik', $jenisHamaOtomatis ?? [], true) ? 'checked' : '' }}>
|
||||||
|
<label class="form-check-label" for="jenis-hama-bentuk">Kutu putih/kutu sisik</label>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="form-check mt-2">
|
||||||
|
<input class="form-check-input @error('jenis_hama') is-invalid @enderror" disabled
|
||||||
|
type="checkbox"
|
||||||
|
name="jenis_hama[]"
|
||||||
|
value="Ulat pemakan daun"
|
||||||
|
id="jenis-hama-ulat"
|
||||||
|
{{ in_array('Ulat pemakan daun', $jenisHamaOtomatis ?? [], true) ? 'checked' : '' }}>
|
||||||
|
<label class="form-check-label" for="jenis-hama-bentuk">Ulat pemakan daun</label>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="form-check mt-2">
|
||||||
|
<input class="form-check-input @error('jenis_hama') is-invalid @enderror" disabled
|
||||||
|
type="checkbox"
|
||||||
|
name="jenis_hama[]"
|
||||||
|
value="Tikus"
|
||||||
|
id="jenis-hama-tikus"
|
||||||
|
{{ in_array('Tikus', $jenisHamaOtomatis ?? [], true) ? 'checked' : '' }}>
|
||||||
|
<label class="form-check-label" for="jenis-hama-bentuk">Tikus</label>
|
||||||
|
</div>
|
||||||
|
<small class="text-muted text-secondary">* Tidak diisi, terisi otomatis di praktik budidaya</small>
|
||||||
|
@error('jenis_hama')
|
||||||
|
<div class="error invalid-feedback d-block">{{ $message }}</div>
|
||||||
|
@enderror
|
||||||
</div>
|
</div>
|
||||||
<div class="col-md-3 mb-3 form-control-validation">
|
<div class="col-md-3 mb-4 form-control-validation auto-pest-disease-field">
|
||||||
|
<label class="form-label">Jenis Penyakit</label>
|
||||||
|
|
||||||
|
<div class="form-check mt-2">
|
||||||
|
<input class="form-check-input @error('jenis_penyakit') is-invalid @enderror" disabled
|
||||||
|
type="checkbox"
|
||||||
|
name="jenis_penyakit[]"
|
||||||
|
value="Karat daun"
|
||||||
|
id="jenis-penyakit-karat-daun"
|
||||||
|
{{ in_array('Karat daun', $jenisPenyakitOtomatis ?? [], true) ? 'checked' : '' }}>
|
||||||
|
<label class="form-check-label" for="jenis-penyakit-bentuk">Karat daun</label>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="form-check mt-2">
|
||||||
|
<input class="form-check-input @error('jenis_penyakit') is-invalid @enderror" disabled
|
||||||
|
type="checkbox"
|
||||||
|
name="jenis_penyakit[]"
|
||||||
|
value="Busuk buah/antraknosa"
|
||||||
|
id="jenis-penyakit-busuk-buah"
|
||||||
|
{{ in_array('Busuk buah/antraknosa', $jenisPenyakitOtomatis ?? [], true) ? 'checked' : '' }}>
|
||||||
|
<label class="form-check-label" for="jenis-penyakit-bentuk">Busuk buah/antraknosa</label>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="form-check mt-2">
|
||||||
|
<input class="form-check-input @error('jenis_penyakit') is-invalid @enderror" disabled
|
||||||
|
type="checkbox"
|
||||||
|
name="jenis_penyakit[]"
|
||||||
|
value="Busuk akar"
|
||||||
|
id="jenis-penyakit-busuk-akar"
|
||||||
|
{{ in_array('Busuk akar', $jenisPenyakitOtomatis ?? [], true) ? 'checked' : '' }}>
|
||||||
|
<label class="form-check-label" for="jenis-penyakit-bentuk">Busuk akar</label>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="form-check mt-2">
|
||||||
|
<input class="form-check-input @error('jenis_penyakit') is-invalid @enderror" disabled
|
||||||
|
type="checkbox"
|
||||||
|
name="jenis_penyakit[]"
|
||||||
|
value="Bercak daun"
|
||||||
|
id="jenis-penyakit-bercak-daun"
|
||||||
|
{{ in_array('Bercak daun', $jenisPenyakitOtomatis ?? [], true) ? 'checked' : '' }}>
|
||||||
|
<label class="form-check-label" for="jenis-penyakit-bentuk">Bercak daun</label>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="form-check mt-2">
|
||||||
|
<input class="form-check-input @error('jenis_penyakit') is-invalid @enderror" disabled
|
||||||
|
type="checkbox"
|
||||||
|
name="jenis_penyakit[]"
|
||||||
|
value="Layu fusarium"
|
||||||
|
id="jenis-penyakit-layu-fusarium"
|
||||||
|
{{ in_array('Layu fusarium', $jenisPenyakitOtomatis ?? [], true) ? 'checked' : '' }}>
|
||||||
|
<label class="form-check-label" for="jenis-penyakit-bentuk">Layu fusarium</label>
|
||||||
|
</div>
|
||||||
|
<small class="text-muted text-secondary">* Tidak diisi, terisi otomatis di Praktik Budidaya</small>
|
||||||
|
|
||||||
|
@error('jenis_penyakit')
|
||||||
|
<div class="error invalid-feedback d-block">{{ $message }}</div>
|
||||||
|
@enderror
|
||||||
|
</div>
|
||||||
|
<div class="col-md-6 mb-3 form-control-validation">
|
||||||
<label class="form-label">Keparahan Serangan Hama/Penyakit</label>
|
<label class="form-label">Keparahan Serangan Hama/Penyakit</label>
|
||||||
<select id="keparahan_serangan" name="keparahan_serangan" class="form-select @error('keparahan_serangan') is-invalid @enderror">
|
<select id="keparahan_serangan" name="keparahan_serangan" class="form-select @error('keparahan_serangan') is-invalid @enderror">
|
||||||
<option value="">Pilih Keparahan Serangan</option>
|
<option value="">Pilih Keparahan Serangan</option>
|
||||||
<option value="{{ \App\Enums\KeparahanSerangan::RINGAN }}" {{ old('keparahan_serangan', $lahanSelected->keparahan_serangan) == \App\Enums\KeparahanSerangan::RINGAN ? 'selected' : '' }}>Ringan</option>
|
<option value="{{ \App\Enums\KeparahanSerangan::RINGAN }}" {{ old('keparahan_serangan', $lahanSelected->keparahan_serangan) == \App\Enums\KeparahanSerangan::RINGAN ? 'selected' : '' }}>{{ \App\Enums\KeparahanSerangan::RINGAN->label() }}</option>
|
||||||
<option value="{{ \App\Enums\KeparahanSerangan::SEDANG }}" {{ old('keparahan_serangan', $lahanSelected->keparahan_serangan) == \App\Enums\KeparahanSerangan::SEDANG ? 'selected' : '' }}>Sedang</option>
|
<option value="{{ \App\Enums\KeparahanSerangan::SEDANG }}" {{ old('keparahan_serangan', $lahanSelected->keparahan_serangan) == \App\Enums\KeparahanSerangan::SEDANG ? 'selected' : '' }}>{{ \App\Enums\KeparahanSerangan::SEDANG->label() }}</option>
|
||||||
<option value="{{ \App\Enums\KeparahanSerangan::BERAT }}" {{ old('keparahan_serangan', $lahanSelected->keparahan_serangan) == \App\Enums\KeparahanSerangan::BERAT ? 'selected' : '' }}>Berat</option>
|
<option value="{{ \App\Enums\KeparahanSerangan::BERAT }}" {{ old('keparahan_serangan', $lahanSelected->keparahan_serangan) == \App\Enums\KeparahanSerangan::BERAT ? 'selected' : '' }}>{{ \App\Enums\KeparahanSerangan::BERAT->label() }}</option>
|
||||||
</select>
|
</select>
|
||||||
@error('keparahan_serangan')<div class="error invalid-feedback">{{ $message }}</div>@enderror
|
@error('keparahan_serangan')<div class="error invalid-feedback">{{ $message }}</div>@enderror
|
||||||
</div>
|
</div>
|
||||||
@@ -164,10 +308,10 @@
|
|||||||
<div class="col-md-6 mb-3 form-control-validation">
|
<div class="col-md-6 mb-3 form-control-validation">
|
||||||
<label class="form-label">Tanaman Penaung</label>
|
<label class="form-label">Tanaman Penaung</label>
|
||||||
<select id="tanaman_penaung" name="tanaman_penaung[]" class="form-select @error('tanaman_penaung[]') is-invalid @enderror" multiple>
|
<select id="tanaman_penaung" name="tanaman_penaung[]" class="form-select @error('tanaman_penaung[]') is-invalid @enderror" multiple>
|
||||||
<option value="">Pilih Komoditas</option>
|
<option value="">Pilih Tanaman atau ketik jika tidak ada</option>
|
||||||
@foreach($komoditas as $k)
|
@foreach($tanamanPenaung as $k)
|
||||||
<option value="{{ $k->id }}"
|
<option value="{{ $k->nama }}"
|
||||||
{{ in_array($k->id, old('tanaman_penaung', $lahanSelected->tanaman_penaung ?? [])) ? 'selected' : '' }}>
|
{{ in_array($k->nama, old('tanaman_penaung', $lahanSelected->tanaman_penaung ?? [])) ? 'selected' : '' }}>
|
||||||
{{ $k->nama }}
|
{{ $k->nama }}
|
||||||
</option>
|
</option>
|
||||||
@endforeach
|
@endforeach
|
||||||
@@ -224,9 +368,8 @@
|
|||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-md-12 mb-3 form-control-validation">
|
<div class="col-md-12 mb-3 form-control-validation">
|
||||||
<label class="form-label">Raw Data Koordinat Lahan (Auto-generated JSON) <span class="text-danger">*</span></label>
|
<label class="form-label">Raw Data Koordinat Lahan (Auto-generated JSON) <span class="text-danger">*</span></label>
|
||||||
<textarea name="path" id="path" class="form-control @error('path') is-invalid @enderror" rows="4" readonly
|
<textarea name="path" id="path" class="form-control @error('path') is-invalid @enderror" rows="4" readonly
|
||||||
placeholder="Koordinat akan terisi otomatis setelah Anda menggambar polygon di peta...">{{ old('path', $lahanSelected->path) }}</textarea>
|
placeholder="Koordinat akan terisi otomatis setelah Anda menggambar polygon di peta...">{{ old('path', is_string($lahanSelected->path) ? $lahanSelected->path : json_encode($lahanSelected->path)) }}</textarea>
|
||||||
<small class="text-muted">Gunakan tombol edit (pensil) atau hapus (tong sampah) di peta untuk mengubah bentuk lahan.</small>
|
|
||||||
@error('path')<div class="error invalid-feedback">{{ $message }}</div>@enderror
|
@error('path')<div class="error invalid-feedback">{{ $message }}</div>@enderror
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -243,9 +386,28 @@
|
|||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<hr class="my-4">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-md-12 mb-3 form-control-validation">
|
||||||
|
<h6 class="mb-5">Foto</h6>
|
||||||
|
<div id="dropzone-container" class="dropzone-custom-container">
|
||||||
|
<div id="btn-tambah-foto" class="btn-tambah-foto">
|
||||||
|
<i class="ti tabler-plus" style="font-size: 32px; margin-bottom: 8px;"></i>
|
||||||
|
<span style="font-size: 13px; font-weight: 600;">Tambah Foto</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div id="deleted-photos-container"></div>
|
||||||
|
|
||||||
|
<input type="file" id="foto-input" multiple hidden>
|
||||||
|
@error('file')<div class="error invalid-feedback">{{ $message }}</div>@enderror
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
<div class="row mt-3">
|
<div class="row mt-3">
|
||||||
<div class="col-12 text-end">
|
<div class="col-12 text-end">
|
||||||
<a href="{{ route('petani.index') }}" class="btn btn-secondary me-2 wave-effect wave-light">Kembali</a>
|
<a href="{{ route('petani.index') }}" class="btn btn-secondary me-2 wave-effect wave-light">Kembali</a>
|
||||||
|
<button id="delete-lahan"type="button" class="btn btn-danger data-submit wave-effect wave-light"><i class="ti tabler-trash me-2"></i> Hapus Lahan</button>
|
||||||
<button type="submit" class="btn btn-success data-submit wave-effect wave-light"><i class="ti tabler-device-floppy me-2"></i> Simpan Lahan</button>
|
<button type="submit" class="btn btn-success data-submit wave-effect wave-light"><i class="ti tabler-device-floppy me-2"></i> Simpan Lahan</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -276,7 +438,7 @@
|
|||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
<tbody>
|
<tbody>
|
||||||
@forelse($lahanSelected->tanaman as $index => $item)
|
@foreach($lahanSelected->tanaman as $item)
|
||||||
<tr>
|
<tr>
|
||||||
<td>{{ $loop->iteration }}</td>
|
<td>{{ $loop->iteration }}</td>
|
||||||
<td>
|
<td>
|
||||||
@@ -339,9 +501,7 @@
|
|||||||
</div>
|
</div>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
@empty
|
@endforeach
|
||||||
<tr><td colspan="6" class="text-center py-4">Tidak ada data ditemukan.</td></tr>
|
|
||||||
@endforelse
|
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
</div>
|
</div>
|
||||||
@@ -360,6 +520,7 @@
|
|||||||
@endsection
|
@endsection
|
||||||
|
|
||||||
@push('scripts')
|
@push('scripts')
|
||||||
|
<script src="https://unpkg.com/dropzone@5/dist/min/dropzone.min.js"></script>
|
||||||
<script src="https://unpkg.com/leaflet@1.9.4/dist/leaflet.js"></script>
|
<script src="https://unpkg.com/leaflet@1.9.4/dist/leaflet.js"></script>
|
||||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/leaflet.draw/1.0.4/leaflet.draw.js"></script>
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/leaflet.draw/1.0.4/leaflet.draw.js"></script>
|
||||||
|
|
||||||
@@ -381,7 +542,9 @@
|
|||||||
$('#penyakit_tanaman').select2();
|
$('#penyakit_tanaman').select2();
|
||||||
$('#keparahan_serangan').select2();
|
$('#keparahan_serangan').select2();
|
||||||
$('#komoditas_lain').select2();
|
$('#komoditas_lain').select2();
|
||||||
$('#tanaman_penaung').select2();
|
$('#tanaman_penaung').select2({
|
||||||
|
tags: true
|
||||||
|
});
|
||||||
|
|
||||||
$('#table-tanaman').DataTable({
|
$('#table-tanaman').DataTable({
|
||||||
"paging": true,
|
"paging": true,
|
||||||
@@ -548,7 +711,7 @@
|
|||||||
let regionBoundaryLayer = L.featureGroup().addTo(map);
|
let regionBoundaryLayer = L.featureGroup().addTo(map);
|
||||||
|
|
||||||
function focusToRegionBoundary(selectElement, shouldZoom = true) {
|
function focusToRegionBoundary(selectElement, shouldZoom = true) {
|
||||||
regionBoundaryLayer.clearLayers(); // Bersihkan garis wilayah sebelumnya
|
regionBoundaryLayer.clearLayers();
|
||||||
|
|
||||||
let selectedOption = selectElement.options[selectElement.selectedIndex];
|
let selectedOption = selectElement.options[selectElement.selectedIndex];
|
||||||
if (!selectedOption || !selectedOption.hasAttribute('data-path')) return;
|
if (!selectedOption || !selectedOption.hasAttribute('data-path')) return;
|
||||||
@@ -563,7 +726,7 @@
|
|||||||
|
|
||||||
function formatCoordinates(coords) {
|
function formatCoordinates(coords) {
|
||||||
if (coords.length === 2 && typeof coords[0] === 'number') {
|
if (coords.length === 2 && typeof coords[0] === 'number') {
|
||||||
return [coords[0], coords[1]]; // JANGAN DIBALIK
|
return [coords[0], coords[1]];
|
||||||
}
|
}
|
||||||
return coords.map(formatCoordinates);
|
return coords.map(formatCoordinates);
|
||||||
}
|
}
|
||||||
@@ -639,10 +802,8 @@
|
|||||||
|
|
||||||
map.on(L.Draw.Event.CREATED, function (e) {
|
map.on(L.Draw.Event.CREATED, function (e) {
|
||||||
let layer = e.layer;
|
let layer = e.layer;
|
||||||
|
|
||||||
drawnItems.clearLayers();
|
drawnItems.clearLayers();
|
||||||
drawnItems.addLayer(layer);
|
drawnItems.addLayer(layer);
|
||||||
|
|
||||||
updatePathTextarea(layer);
|
updatePathTextarea(layer);
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -662,15 +823,142 @@
|
|||||||
return [latlng.lng, latlng.lat];
|
return [latlng.lng, latlng.lat];
|
||||||
});
|
});
|
||||||
document.getElementById('path').value = JSON.stringify(pathData);
|
document.getElementById('path').value = JSON.stringify(pathData);
|
||||||
|
|
||||||
let area = L.GeometryUtil.geodesicArea(latlngs);
|
let area = L.GeometryUtil.geodesicArea(latlngs);
|
||||||
|
let areaHa = area / 10000;
|
||||||
console.log(area);
|
$('#luas_lahan').val(areaHa.toFixed(4));
|
||||||
|
|
||||||
$('#luas_lahan').val(area.toFixed(2));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// FORM
|
const previewTemplate = `
|
||||||
|
<div class="dz-preview dz-file-preview">
|
||||||
|
<div class="dz-control-panel">
|
||||||
|
<a href="javascript:void(0);" class="dz-btn-action btn-edit" title="Ganti Foto">
|
||||||
|
<i class="ti tabler-pencil"></i>
|
||||||
|
</a>
|
||||||
|
<a href="javascript:void(0);" class="dz-btn-action btn-delete" data-dz-remove title="Hapus Foto">
|
||||||
|
<i class="ti tabler-x"></i>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
<div class="dz-image"><img data-dz-thumbnail /></div>
|
||||||
|
<div class="dz-details">
|
||||||
|
<div class="dz-filename"><span data-dz-name></span></div>
|
||||||
|
<div class="dz-size"><span data-dz-size></span></div>
|
||||||
|
</div>
|
||||||
|
</div>`;
|
||||||
|
|
||||||
|
Dropzone.autoDiscover = false;
|
||||||
|
let myDropzone = null;
|
||||||
|
const dropzoneElement = document.querySelector("#dropzone-container");
|
||||||
|
|
||||||
|
if (dropzoneElement) {
|
||||||
|
myDropzone = new Dropzone(dropzoneElement, {
|
||||||
|
url: "/",
|
||||||
|
autoProcessQueue: false,
|
||||||
|
previewTemplate: previewTemplate,
|
||||||
|
clickable: "#btn-tambah-foto",
|
||||||
|
previewsContainer: "#dropzone-container",
|
||||||
|
parallelUploads: 10,
|
||||||
|
maxFilesize: 5,
|
||||||
|
addRemoveLinks: false,
|
||||||
|
acceptedFiles: "image/jpeg,image/jpg,image/png",
|
||||||
|
|
||||||
|
init: function () {
|
||||||
|
let dz = this;
|
||||||
|
|
||||||
|
let rawPhotos = {!! json_encode($lahanSelected->foto ?? []) !!};
|
||||||
|
let existingPhotos = [];
|
||||||
|
|
||||||
|
if (typeof rawPhotos === 'string') {
|
||||||
|
try {
|
||||||
|
existingPhotos = JSON.parse(rawPhotos);
|
||||||
|
} catch(e) {
|
||||||
|
existingPhotos = [];
|
||||||
|
}
|
||||||
|
} else if (Array.isArray(rawPhotos)) {
|
||||||
|
existingPhotos = rawPhotos;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (existingPhotos && existingPhotos.length > 0) {
|
||||||
|
existingPhotos.forEach(function (photo, index) {
|
||||||
|
|
||||||
|
let pathStr = typeof photo === 'object' ? (photo.path || photo[0] || '') : photo;
|
||||||
|
|
||||||
|
if (pathStr && pathStr !== '') {
|
||||||
|
let mockFile = {
|
||||||
|
name: "Foto Lahan " + (index + 1),
|
||||||
|
size: 1024,
|
||||||
|
id: index,
|
||||||
|
file_path: pathStr,
|
||||||
|
isServerFile: true,
|
||||||
|
accepted: true
|
||||||
|
};
|
||||||
|
|
||||||
|
dz.emit("addedfile", mockFile);
|
||||||
|
dz.emit("thumbnail", mockFile, "{{ asset('storage') }}/" + pathStr);
|
||||||
|
dz.emit("complete", mockFile);
|
||||||
|
|
||||||
|
dz.files.push(mockFile);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
this.on("removedfile", function (file) {
|
||||||
|
if (file.isServerFile) {
|
||||||
|
let deleteInput = $('<input>').attr({
|
||||||
|
type: 'hidden',
|
||||||
|
name: 'deleted_photos[]',
|
||||||
|
value: file.file_path
|
||||||
|
});
|
||||||
|
$('#deleted-photos-container').append(deleteInput);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
$(document).on('click', '.btn-edit', function(e) {
|
||||||
|
e.preventDefault();
|
||||||
|
e.stopPropagation();
|
||||||
|
|
||||||
|
let previewElement = $(this).closest('.dz-preview')[0];
|
||||||
|
let dz = myDropzone;
|
||||||
|
let fileToReplace = dz.files.find(f => f.previewElement === previewElement);
|
||||||
|
|
||||||
|
if (fileToReplace) {
|
||||||
|
let tempInput = document.createElement('input');
|
||||||
|
tempInput.type = 'file';
|
||||||
|
tempInput.accept = 'image/jpeg,image/jpg,image/png';
|
||||||
|
|
||||||
|
tempInput.onchange = function(event) {
|
||||||
|
let newFile = event.target.files[0];
|
||||||
|
if (newFile) {
|
||||||
|
if(fileToReplace.isServerFile){
|
||||||
|
let deleteInput = $('<input>').attr({
|
||||||
|
type: 'hidden',
|
||||||
|
name: 'deleted_photos[]',
|
||||||
|
value: fileToReplace.file_path
|
||||||
|
});
|
||||||
|
$('#deleted-photos-container').append(deleteInput);
|
||||||
|
}
|
||||||
|
|
||||||
|
dz.removeFile(fileToReplace);
|
||||||
|
dz.addFile(newFile);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
tempInput.click();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
$(document).on('click', '#dropzone-container .dz-image img', function (e) {
|
||||||
|
e.stopPropagation();
|
||||||
|
$('#foto-lightbox-img').attr('src', this.src);
|
||||||
|
$('#foto-lightbox').addClass('active');
|
||||||
|
});
|
||||||
|
|
||||||
|
$('#foto-lightbox').on('click', function (e) {
|
||||||
|
if (e.target === this || $(e.target).hasClass('foto-lightbox-close')) {
|
||||||
|
$(this).removeClass('active');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
$('#petani-lahan-tanaman').validate({
|
$('#petani-lahan-tanaman').validate({
|
||||||
rules: {
|
rules: {
|
||||||
@@ -679,7 +967,7 @@
|
|||||||
jenis_komoditas_id: { required: true },
|
jenis_komoditas_id: { required: true },
|
||||||
varietas_id: { required: true },
|
varietas_id: { required: true },
|
||||||
desa_kelurahan_id: { required: true },
|
desa_kelurahan_id: { required: true },
|
||||||
jumlah_tanaman: { required: true, min: @json($lahanSelected->jumlah_tanaman) },
|
jumlah_tanaman: { min: @json($lahanSelected->jumlah_tanaman) },
|
||||||
},
|
},
|
||||||
messages: {
|
messages: {
|
||||||
luas_lahan: { required: "Luas lahan wajib diisi" },
|
luas_lahan: { required: "Luas lahan wajib diisi" },
|
||||||
@@ -687,7 +975,7 @@
|
|||||||
jenis_komoditas_id: { required: "Jenis komoditas wajib diisi" },
|
jenis_komoditas_id: { required: "Jenis komoditas wajib diisi" },
|
||||||
varietas_id: { required: "Varietas wajib diisi" },
|
varietas_id: { required: "Varietas wajib diisi" },
|
||||||
desa_kelurahan_id: { required: "Desa/Kelurahan wajib diisi" },
|
desa_kelurahan_id: { required: "Desa/Kelurahan wajib diisi" },
|
||||||
jumlah_tanaman: { required: "Jumlah tanaman wajib diisi", min: "Jumlah tanaman tidak boleh kurang dari @json($lahanSelected->jumlah_tanaman), hapus pada tanaman yang dimaksud" },
|
jumlah_tanaman: { min: "Jumlah tanaman tidak boleh kurang dari @json($lahanSelected->jumlah_tanaman), hapus pada tanaman yang dimaksud" },
|
||||||
},
|
},
|
||||||
errorElement: 'div',
|
errorElement: 'div',
|
||||||
errorPlacement: function (error, element) {
|
errorPlacement: function (error, element) {
|
||||||
@@ -699,11 +987,104 @@
|
|||||||
},
|
},
|
||||||
unhighlight: function (element) {
|
unhighlight: function (element) {
|
||||||
$(element).removeClass('is-invalid');
|
$(element).removeClass('is-invalid');
|
||||||
|
},
|
||||||
|
submitHandler: function (form) {
|
||||||
|
const formData = new FormData(form);
|
||||||
|
|
||||||
|
formData.append('_method', 'PUT');
|
||||||
|
|
||||||
|
if (myDropzone) {
|
||||||
|
myDropzone.files.forEach(function(file) {
|
||||||
|
if (!file.isServerFile) {
|
||||||
|
formData.append("foto[]", file);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
let submitBtn = $(form).find('button[type="submit"]');
|
||||||
|
let originalText = submitBtn.html();
|
||||||
|
submitBtn.prop('disabled', true).html('<i class="ti tabler-loader fa-spin me-2"></i> Menyimpan...');
|
||||||
|
|
||||||
|
$.ajax({
|
||||||
|
url: $(form).attr('action'),
|
||||||
|
type: "POST",
|
||||||
|
data: formData,
|
||||||
|
processData: false,
|
||||||
|
contentType: false,
|
||||||
|
headers: {
|
||||||
|
'X-CSRF-TOKEN': $('input[name="_token"]').val(),
|
||||||
|
'Accept': 'application/json'
|
||||||
|
},
|
||||||
|
success: function(res) {
|
||||||
|
Swal.fire({
|
||||||
|
icon: 'success',
|
||||||
|
title: 'Berhasil!',
|
||||||
|
text: 'Data lahan berhasil disimpan.',
|
||||||
|
showConfirmButton: false,
|
||||||
|
timer: 1500
|
||||||
|
}).then(() => {
|
||||||
|
window.location.href = res.redirect || window.location.href;
|
||||||
|
});
|
||||||
|
},
|
||||||
|
error: function(xhr) {
|
||||||
|
submitBtn.prop('disabled', false).html(originalText);
|
||||||
|
|
||||||
|
if (xhr.status === 422) {
|
||||||
|
let errors = xhr.responseJSON.errors;
|
||||||
|
let errorMsg = "";
|
||||||
|
$.each(errors, function(key, val) {
|
||||||
|
errorMsg += val[0] + "\n";
|
||||||
|
});
|
||||||
|
|
||||||
|
Swal.fire({
|
||||||
|
icon: 'warning',
|
||||||
|
title: 'Penyimpanan Gagal',
|
||||||
|
text: errorMsg,
|
||||||
|
confirmButtonColor: '#dc3545'
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
let errorDetail = xhr.responseJSON && xhr.responseJSON.message ? xhr.responseJSON.message : xhr.statusText;
|
||||||
|
|
||||||
|
Swal.fire({
|
||||||
|
icon: 'error',
|
||||||
|
title: 'Terjadi Kesalahan',
|
||||||
|
text: "Error " + xhr.status + ": " + errorDetail,
|
||||||
|
confirmButtonColor: '#dc3545'
|
||||||
|
});
|
||||||
|
console.error(xhr.responseText);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
$('#delete-lahan').click(function(e) {
|
||||||
|
e.preventDefault();
|
||||||
|
$.ajax({
|
||||||
|
url: "{{ route('petani.lahan-tanaman.destroy', ['petani' => $petani->id, 'lahan_tanaman' => $lahanSelected->id]) }}",
|
||||||
|
type: "POST",
|
||||||
|
data: {
|
||||||
|
_method: 'DELETE',
|
||||||
|
_token: $('input[name="_token"]').val()
|
||||||
|
},
|
||||||
|
success: function(res) {
|
||||||
|
Swal.fire({
|
||||||
|
icon: 'success',
|
||||||
|
title: 'Berhasil!',
|
||||||
|
text: 'Data lahan berhasil dihapus.',
|
||||||
|
showConfirmButton: false,
|
||||||
|
timer: 1500
|
||||||
|
}).then(() => {
|
||||||
|
window.location.href = "{{ route('petani.lahan-tanaman.index', ['petani' => $petani->id]) }}";
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
initWilayah();
|
initWilayah();
|
||||||
initKomoditas();
|
initKomoditas();
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
@endpush
|
@endpush
|
||||||
|
|||||||
@@ -29,6 +29,11 @@
|
|||||||
white-space: nowrap !important;
|
white-space: nowrap !important;
|
||||||
line-height: 1.5 !important;
|
line-height: 1.5 !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#section-pelatihan,
|
||||||
|
#section-sertifikasi {
|
||||||
|
scroll-margin-top: 96px;
|
||||||
|
}
|
||||||
</style>
|
</style>
|
||||||
@endpush
|
@endpush
|
||||||
|
|
||||||
@@ -51,7 +56,7 @@
|
|||||||
<div class="col-md-12">
|
<div class="col-md-12">
|
||||||
|
|
||||||
@include('produktivitas.petani.header', ['petani' => $petani])
|
@include('produktivitas.petani.header', ['petani' => $petani])
|
||||||
<div class="card mb-6">
|
<div class="card mb-6" id="section-pelatihan">
|
||||||
<div class="card-body pt-12">
|
<div class="card-body pt-12">
|
||||||
<h5 class="pb-4 border-bottom mb-4">
|
<h5 class="pb-4 border-bottom mb-4">
|
||||||
Riwayat Pelatihan
|
Riwayat Pelatihan
|
||||||
@@ -83,6 +88,7 @@
|
|||||||
class="delete-db-form">
|
class="delete-db-form">
|
||||||
@csrf
|
@csrf
|
||||||
@method('DELETE')
|
@method('DELETE')
|
||||||
|
<input type="hidden" name="redirect_fragment" value="section-pelatihan">
|
||||||
|
|
||||||
<button type="submit" class="btn btn-outline-danger">
|
<button type="submit" class="btn btn-outline-danger">
|
||||||
<i class="icon-base ti tabler-trash icon-sm"></i>
|
<i class="icon-base ti tabler-trash icon-sm"></i>
|
||||||
@@ -101,6 +107,7 @@
|
|||||||
action="{{ route('petani.pendidikan-pelatihan.pelatihan.store', $petani->id) }}"
|
action="{{ route('petani.pendidikan-pelatihan.pelatihan.store', $petani->id) }}"
|
||||||
class="form-repeater-pelatihan">
|
class="form-repeater-pelatihan">
|
||||||
@csrf
|
@csrf
|
||||||
|
<input type="hidden" name="redirect_fragment" value="section-sertifikasi">
|
||||||
|
|
||||||
<div data-repeater-list="riwayat_pelatihan">
|
<div data-repeater-list="riwayat_pelatihan">
|
||||||
<div data-repeater-item>
|
<div data-repeater-item>
|
||||||
@@ -170,7 +177,7 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
{{-- SERTIFIKASI KEAHLIAN --}}
|
{{-- SERTIFIKASI KEAHLIAN --}}
|
||||||
<div class="card mb-6">
|
<div class="card mb-6" id="section-sertifikasi">
|
||||||
<div class="card-body pt-12">
|
<div class="card-body pt-12">
|
||||||
<h5 class="pb-4 border-bottom mb-4">
|
<h5 class="pb-4 border-bottom mb-4">
|
||||||
Sertifikasi Keahlian
|
Sertifikasi Keahlian
|
||||||
@@ -231,9 +238,10 @@
|
|||||||
<form
|
<form
|
||||||
method="POST"
|
method="POST"
|
||||||
action="{{ route('petani.pendidikan-pelatihan.sertifikasi.destroy', [$petani->id, $row->id]) }}"
|
action="{{ route('petani.pendidikan-pelatihan.sertifikasi.destroy', [$petani->id, $row->id]) }}"
|
||||||
class="delete-db-form">
|
class="delete-db-form">
|
||||||
@csrf
|
@csrf
|
||||||
@method('DELETE')
|
@method('DELETE')
|
||||||
|
<input type="hidden" name="redirect_fragment" value="section-sertifikasi">
|
||||||
|
|
||||||
<button type="submit" class="btn btn-outline-danger">
|
<button type="submit" class="btn btn-outline-danger">
|
||||||
<i class="icon-base ti tabler-trash icon-sm"></i>
|
<i class="icon-base ti tabler-trash icon-sm"></i>
|
||||||
@@ -252,6 +260,7 @@
|
|||||||
action="{{ route('petani.pendidikan-pelatihan.sertifikasi.store', $petani->id) }}"
|
action="{{ route('petani.pendidikan-pelatihan.sertifikasi.store', $petani->id) }}"
|
||||||
class="form-repeater-sertifikasi">
|
class="form-repeater-sertifikasi">
|
||||||
@csrf
|
@csrf
|
||||||
|
<input type="hidden" name="redirect_fragment" value="section-sertifikasi">
|
||||||
|
|
||||||
<div data-repeater-list="sertifikasi">
|
<div data-repeater-list="sertifikasi">
|
||||||
<div data-repeater-item>
|
<div data-repeater-item>
|
||||||
@@ -536,4 +545,4 @@ $(function () {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
@endpush
|
@endpush
|
||||||
|
|||||||
@@ -517,6 +517,57 @@
|
|||||||
$(document).ready(function () {
|
$(document).ready(function () {
|
||||||
|
|
||||||
$('#tenaga-kerja, #frekuensi-pemangkasan-komoditas-utama, #frekuensi-pemangkasan-pohon-penaung, #penyerbukan-manual, #pemberian-pupuk, #jenis-pupuk').select2();
|
$('#tenaga-kerja, #frekuensi-pemangkasan-komoditas-utama, #frekuensi-pemangkasan-pohon-penaung, #penyerbukan-manual, #pemberian-pupuk, #jenis-pupuk').select2();
|
||||||
|
|
||||||
|
function syncTeknikPemangkasanState() {
|
||||||
|
const tidakPernahMemangkas = $('#frekuensi-pemangkasan-komoditas-utama').val() === '{{ \App\Enums\PraktikBudidaya\FrekuensiPemangkasanUtama::TIDAK_PERNAH->value }}';
|
||||||
|
const $teknikInputs = $('input[name="teknik_pemangkasan[]"]');
|
||||||
|
const $lainnyaInput = $('#input-teknik-pemangkasan-lainnya');
|
||||||
|
|
||||||
|
$teknikInputs
|
||||||
|
.prop('disabled', tidakPernahMemangkas)
|
||||||
|
.closest('.form-check')
|
||||||
|
.toggleClass('opacity-50', tidakPernahMemangkas);
|
||||||
|
|
||||||
|
if (tidakPernahMemangkas) {
|
||||||
|
$teknikInputs.prop('checked', false);
|
||||||
|
$lainnyaInput.val('');
|
||||||
|
}
|
||||||
|
|
||||||
|
$lainnyaInput.prop('disabled', tidakPernahMemangkas || !$('#teknik-pemangkasan-lainnya').is(':checked'));
|
||||||
|
}
|
||||||
|
|
||||||
|
$('#frekuensi-pemangkasan-komoditas-utama, #teknik-pemangkasan-lainnya').on('change select2:select select2:clear', syncTeknikPemangkasanState);
|
||||||
|
syncTeknikPemangkasanState();
|
||||||
|
|
||||||
|
function syncPemupukanState() {
|
||||||
|
const tidakPernahMemberiPupuk = $('#pemberian-pupuk').val() === '{{ \App\Enums\PraktikBudidaya\PemberianPupuk::TIDAK_PERNAH->value }}';
|
||||||
|
const $pemupukanFields = $(
|
||||||
|
'#jenis-pupuk, ' +
|
||||||
|
'input[name="frekuensi_pemupukan"], #input-frekuensi-pemupukan-lainnya, ' +
|
||||||
|
'#estimasi-dosis-pupuk-organik, #estimasi-dosis-pupuk-anorganik, ' +
|
||||||
|
'input[name="waktu_pemberian_pupuk"], #input-waktu-pemberian-pupuk-lainnya, ' +
|
||||||
|
'input[name="cara_pemberian_pupuk"], #input-cara-pemberian-pupuk-lainnya'
|
||||||
|
);
|
||||||
|
|
||||||
|
$pemupukanFields
|
||||||
|
.prop('disabled', tidakPernahMemberiPupuk)
|
||||||
|
.closest('.form-check, .form-control-validation')
|
||||||
|
.toggleClass('opacity-50', tidakPernahMemberiPupuk);
|
||||||
|
|
||||||
|
if (tidakPernahMemberiPupuk) {
|
||||||
|
$('#jenis-pupuk').val('').trigger('change.select2');
|
||||||
|
$('input[name="frekuensi_pemupukan"], input[name="waktu_pemberian_pupuk"], input[name="cara_pemberian_pupuk"]').prop('checked', false);
|
||||||
|
$('#input-frekuensi-pemupukan-lainnya, #estimasi-dosis-pupuk-organik, #estimasi-dosis-pupuk-anorganik, #input-waktu-pemberian-pupuk-lainnya, #input-cara-pemberian-pupuk-lainnya').val('');
|
||||||
|
} else {
|
||||||
|
$('#input-frekuensi-pemupukan-lainnya').prop('disabled', !$('input[data-target="#input-frekuensi-pemupukan-lainnya"]').is(':checked'));
|
||||||
|
$('#input-waktu-pemberian-pupuk-lainnya').prop('disabled', !$('input[data-target="#input-waktu-pemberian-pupuk-lainnya"]').is(':checked'));
|
||||||
|
$('#input-cara-pemberian-pupuk-lainnya').prop('disabled', !$('input[data-target="#input-cara-pemberian-pupuk-lainnya"]').is(':checked'));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$('#pemberian-pupuk').on('change select2:select select2:clear', syncPemupukanState);
|
||||||
|
syncPemupukanState();
|
||||||
|
setTimeout(syncPemupukanState, 0);
|
||||||
|
|
||||||
const $switch = $('input[name="disimpan_untuk_diri_sendiri"]');
|
const $switch = $('input[name="disimpan_untuk_diri_sendiri"]');
|
||||||
const $text = $('#switch-text');
|
const $text = $('#switch-text');
|
||||||
@@ -636,6 +687,35 @@
|
|||||||
trigger.addEventListener('change', toggleInput);
|
trigger.addEventListener('change', toggleInput);
|
||||||
toggleInput();
|
toggleInput();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
const frekuensiPemangkasan = document.getElementById('frekuensi-pemangkasan-komoditas-utama');
|
||||||
|
const teknikPemangkasanInputs = document.querySelectorAll('input[name="teknik_pemangkasan[]"]');
|
||||||
|
const teknikPemangkasanLainnya = document.getElementById('input-teknik-pemangkasan-lainnya');
|
||||||
|
|
||||||
|
function toggleTeknikPemangkasan() {
|
||||||
|
const tidakPernahMemangkas = frekuensiPemangkasan && frekuensiPemangkasan.value === '{{ \App\Enums\PraktikBudidaya\FrekuensiPemangkasanUtama::TIDAK_PERNAH->value }}';
|
||||||
|
|
||||||
|
teknikPemangkasanInputs.forEach(function (input) {
|
||||||
|
input.disabled = tidakPernahMemangkas;
|
||||||
|
input.closest('.form-check')?.classList.toggle('opacity-50', tidakPernahMemangkas);
|
||||||
|
|
||||||
|
if (tidakPernahMemangkas) {
|
||||||
|
input.checked = false;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
if (teknikPemangkasanLainnya) {
|
||||||
|
teknikPemangkasanLainnya.disabled = tidakPernahMemangkas || !document.getElementById('teknik-pemangkasan-lainnya')?.checked;
|
||||||
|
|
||||||
|
if (tidakPernahMemangkas) {
|
||||||
|
teknikPemangkasanLainnya.value = '';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
frekuensiPemangkasan?.addEventListener('change', toggleTeknikPemangkasan);
|
||||||
|
document.getElementById('teknik-pemangkasan-lainnya')?.addEventListener('change', toggleTeknikPemangkasan);
|
||||||
|
toggleTeknikPemangkasan();
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
@endpush
|
@endpush
|
||||||
|
|||||||
@@ -39,7 +39,8 @@
|
|||||||
<form id="praktikBudidayaForm" action="{{ route('petani.praktik-budidaya.update', [$petani->id, $praktikBudidaya->id]) }}" method="POST">
|
<form id="praktikBudidayaForm" action="{{ route('petani.praktik-budidaya.update', [$petani->id, $praktikBudidaya->id]) }}" method="POST">
|
||||||
@csrf
|
@csrf
|
||||||
@method('PUT')
|
@method('PUT')
|
||||||
<div class="card mb-6">
|
<input type="hidden" name="redirect_fragment" value="section-opt">
|
||||||
|
<div class="card mb-6" id="section-praktik-pemupukan">
|
||||||
<div class="card-body pt-12">
|
<div class="card-body pt-12">
|
||||||
<h5 class="pb-4 border-bottom mb-4">Persiapan Lahan & Tanaman</h5>
|
<h5 class="pb-4 border-bottom mb-4">Persiapan Lahan & Tanaman</h5>
|
||||||
<div class="row">
|
<div class="row">
|
||||||
@@ -541,8 +542,9 @@
|
|||||||
<form id="praktikBudidayaForm" action="{{ route('petani.praktik-budidaya.update', [$petani->id, $praktikBudidaya->id]) }}" method="POST">
|
<form id="praktikBudidayaForm" action="{{ route('petani.praktik-budidaya.update', [$petani->id, $praktikBudidaya->id]) }}" method="POST">
|
||||||
@csrf
|
@csrf
|
||||||
@method('PUT')
|
@method('PUT')
|
||||||
|
<input type="hidden" name="redirect_fragment" value="section-biaya-produksi">
|
||||||
|
|
||||||
<div class="card mb-6">
|
<div class="card mb-6" id="section-opt">
|
||||||
<div class="card-body pt-12">
|
<div class="card-body pt-12">
|
||||||
<!-- INFORMASI PETANI -->
|
<!-- INFORMASI PETANI -->
|
||||||
<h5 class="pb-4 border-bottom mb-4">Pengendalian Organisme Pengganggu Tumbuhan (OPT)</h5>
|
<h5 class="pb-4 border-bottom mb-4">Pengendalian Organisme Pengganggu Tumbuhan (OPT)</h5>
|
||||||
@@ -1048,7 +1050,8 @@
|
|||||||
<form id="praktikBudidayaForm" action="{{ route('petani.praktik-budidaya.update', [$petani->id, $praktikBudidaya->id]) }}" method="POST">
|
<form id="praktikBudidayaForm" action="{{ route('petani.praktik-budidaya.update', [$petani->id, $praktikBudidaya->id]) }}" method="POST">
|
||||||
@csrf
|
@csrf
|
||||||
@method('PUT')
|
@method('PUT')
|
||||||
<div class="card mb-6">
|
<input type="hidden" name="redirect_fragment" value="section-penanganan-panen">
|
||||||
|
<div class="card mb-6" id="section-biaya-produksi">
|
||||||
<div class="card-body pt-12">
|
<div class="card-body pt-12">
|
||||||
<h5 class="pb-4 border-bottom mb-4">Struktur Biaya Produksi Permusim</h5>
|
<h5 class="pb-4 border-bottom mb-4">Struktur Biaya Produksi Permusim</h5>
|
||||||
<div class="row">
|
<div class="row">
|
||||||
@@ -1360,7 +1363,8 @@
|
|||||||
<form id="praktikBudidayaForm" action="{{ route('petani.praktik-budidaya.update', [$petani->id, $praktikBudidaya->id]) }}" method="POST">
|
<form id="praktikBudidayaForm" action="{{ route('petani.praktik-budidaya.update', [$petani->id, $praktikBudidaya->id]) }}" method="POST">
|
||||||
@csrf
|
@csrf
|
||||||
@method('PUT')
|
@method('PUT')
|
||||||
<div class="card mb-6">
|
<input type="hidden" name="redirect_fragment" value="section-produktivitas">
|
||||||
|
<div class="card mb-6" id="section-penanganan-panen">
|
||||||
<div class="card-body pt-12">
|
<div class="card-body pt-12">
|
||||||
<h5 class="pb-4 border-bottom mb-4">Penanganan Awal Setelah Panen</h5>
|
<h5 class="pb-4 border-bottom mb-4">Penanganan Awal Setelah Panen</h5>
|
||||||
<div class="row">
|
<div class="row">
|
||||||
@@ -1546,7 +1550,7 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
<div class="card mb-6">
|
<div class="card mb-6" id="section-produktivitas">
|
||||||
<div class="card-body pt-12">
|
<div class="card-body pt-12">
|
||||||
<h5 class="pb-4 border-bottom mb-4">
|
<h5 class="pb-4 border-bottom mb-4">
|
||||||
Produktivitas Rata-rata 3 Musim Panen Terakhir per Komoditas
|
Produktivitas Rata-rata 3 Musim Panen Terakhir per Komoditas
|
||||||
@@ -1579,6 +1583,7 @@
|
|||||||
<form method="POST" action="{{ route('petani.survey-produktivitas.destroy', [$petani->id, $row->id]) }}">
|
<form method="POST" action="{{ route('petani.survey-produktivitas.destroy', [$petani->id, $row->id]) }}">
|
||||||
@csrf
|
@csrf
|
||||||
@method('DELETE')
|
@method('DELETE')
|
||||||
|
<input type="hidden" name="redirect_fragment" value="section-produktivitas">
|
||||||
<button type="submit" class="btn btn-outline-danger">
|
<button type="submit" class="btn btn-outline-danger">
|
||||||
<i class="icon-base ti tabler-trash icon-sm"></i>
|
<i class="icon-base ti tabler-trash icon-sm"></i>
|
||||||
</button>
|
</button>
|
||||||
@@ -1593,6 +1598,7 @@
|
|||||||
action="{{ route('petani.survey-produktivitas.store', $petani->id) }}"
|
action="{{ route('petani.survey-produktivitas.store', $petani->id) }}"
|
||||||
class="form-repeater">
|
class="form-repeater">
|
||||||
@csrf
|
@csrf
|
||||||
|
<input type="hidden" name="redirect_fragment" value="section-kehilangan-hasil">
|
||||||
|
|
||||||
<div data-repeater-list="produktivitas_komoditas">
|
<div data-repeater-list="produktivitas_komoditas">
|
||||||
<div data-repeater-item>
|
<div data-repeater-item>
|
||||||
@@ -1657,7 +1663,8 @@
|
|||||||
<form id="praktikBudidayaForm" action="{{ route('petani.praktik-budidaya.update', [$petani->id, $praktikBudidaya->id]) }}" method="POST">
|
<form id="praktikBudidayaForm" action="{{ route('petani.praktik-budidaya.update', [$petani->id, $praktikBudidaya->id]) }}" method="POST">
|
||||||
@csrf
|
@csrf
|
||||||
@method('PUT')
|
@method('PUT')
|
||||||
<div class="card mb-6">
|
<input type="hidden" name="redirect_fragment" value="section-kehilangan-hasil">
|
||||||
|
<div class="card mb-6" id="section-kehilangan-hasil">
|
||||||
<div class="card-body pt-12">
|
<div class="card-body pt-12">
|
||||||
<h5 class="pb-4 border-bottom mb-4">Kehilangan Hasil Akibat Organisme Pengganggu Tumbuhan (OPT)</h5>
|
<h5 class="pb-4 border-bottom mb-4">Kehilangan Hasil Akibat Organisme Pengganggu Tumbuhan (OPT)</h5>
|
||||||
<div class="row">
|
<div class="row">
|
||||||
@@ -1706,12 +1713,76 @@
|
|||||||
</div>
|
</div>
|
||||||
@endsection
|
@endsection
|
||||||
|
|
||||||
|
@push('scripts-head')
|
||||||
|
<style>
|
||||||
|
#section-praktik-pemupukan,
|
||||||
|
#section-opt,
|
||||||
|
#section-biaya-produksi,
|
||||||
|
#section-penanganan-panen,
|
||||||
|
#section-produktivitas,
|
||||||
|
#section-kehilangan-hasil {
|
||||||
|
scroll-margin-top: 96px;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
@endpush
|
||||||
|
|
||||||
@push('scripts')
|
@push('scripts')
|
||||||
<script>
|
<script>
|
||||||
'use strict';
|
'use strict';
|
||||||
$(document).ready(function () {
|
$(document).ready(function () {
|
||||||
|
|
||||||
$('#tenaga-kerja, #frekuensi-pemangkasan-komoditas-utama, #frekuensi-pemangkasan-pohon-penaung, #penyerbukan-manual, #pemberian-pupuk, #jenis-pupuk, #metode-penanganan-hama-penyakit, #intensitas-serangan, #waktu-kemunculan-terparah, #frekuensi-sanitasi-lahan, #penanganan-sisa-buah-ranting, #penanganan-gulma, #kondisi-pengelolaan-air-irigasi, #kebutuhan-air-permusim, #pemahaman-manfaat-konservasi, #dasar-penentuan-panen, #praktik-sortasi, #bentuk-sortasi, #estimasi-kehilangan-akibat-opt, #tingkat-reject, #tindakan-hasil-reject, #estimasi-kehilangan-akibat-hama, #komoditas-id').select2();
|
$('#tenaga-kerja, #frekuensi-pemangkasan-komoditas-utama, #frekuensi-pemangkasan-pohon-penaung, #penyerbukan-manual, #pemberian-pupuk, #jenis-pupuk, #metode-penanganan-hama-penyakit, #intensitas-serangan, #waktu-kemunculan-terparah, #frekuensi-sanitasi-lahan, #penanganan-sisa-buah-ranting, #penanganan-gulma, #kondisi-pengelolaan-air-irigasi, #kebutuhan-air-permusim, #pemahaman-manfaat-konservasi, #dasar-penentuan-panen, #praktik-sortasi, #bentuk-sortasi, #estimasi-kehilangan-akibat-opt, #tingkat-reject, #tindakan-hasil-reject, #estimasi-kehilangan-akibat-hama, #komoditas-id').select2();
|
||||||
|
|
||||||
|
function syncTeknikPemangkasanState() {
|
||||||
|
const tidakPernahMemangkas = $('#frekuensi-pemangkasan-komoditas-utama').val() === '{{ \App\Enums\PraktikBudidaya\FrekuensiPemangkasanUtama::TIDAK_PERNAH->value }}';
|
||||||
|
const $teknikInputs = $('input[name="teknik_pemangkasan[]"]');
|
||||||
|
const $lainnyaInput = $('#input-teknik-pemangkasan-lainnya');
|
||||||
|
|
||||||
|
$teknikInputs
|
||||||
|
.prop('disabled', tidakPernahMemangkas)
|
||||||
|
.closest('.form-check')
|
||||||
|
.toggleClass('opacity-50', tidakPernahMemangkas);
|
||||||
|
|
||||||
|
if (tidakPernahMemangkas) {
|
||||||
|
$teknikInputs.prop('checked', false);
|
||||||
|
$lainnyaInput.val('');
|
||||||
|
}
|
||||||
|
|
||||||
|
$lainnyaInput.prop('disabled', tidakPernahMemangkas || !$('#teknik-pemangkasan-lainnya').is(':checked'));
|
||||||
|
}
|
||||||
|
|
||||||
|
$('#frekuensi-pemangkasan-komoditas-utama, #teknik-pemangkasan-lainnya').on('change select2:select select2:clear', syncTeknikPemangkasanState);
|
||||||
|
syncTeknikPemangkasanState();
|
||||||
|
|
||||||
|
function syncPemupukanState() {
|
||||||
|
const tidakPernahMemberiPupuk = $('#pemberian-pupuk').val() === '{{ \App\Enums\PraktikBudidaya\PemberianPupuk::TIDAK_PERNAH->value }}';
|
||||||
|
const $pemupukanFields = $(
|
||||||
|
'#jenis-pupuk, ' +
|
||||||
|
'input[name="frekuensi_pemupukan"], #input-frekuensi-pemupukan-lainnya, ' +
|
||||||
|
'#estimasi-dosis-pupuk-organik, #estimasi-dosis-pupuk-anorganik, ' +
|
||||||
|
'input[name="waktu_pemberian_pupuk"], #input-waktu-pemberian-pupuk-lainnya, ' +
|
||||||
|
'input[name="cara_pemberian_pupuk"], #input-cara-pemberian-pupuk-lainnya'
|
||||||
|
);
|
||||||
|
|
||||||
|
$pemupukanFields
|
||||||
|
.prop('disabled', tidakPernahMemberiPupuk)
|
||||||
|
.closest('.form-check, .form-control-validation')
|
||||||
|
.toggleClass('opacity-50', tidakPernahMemberiPupuk);
|
||||||
|
|
||||||
|
if (tidakPernahMemberiPupuk) {
|
||||||
|
$('#jenis-pupuk').val('').trigger('change.select2');
|
||||||
|
$('input[name="frekuensi_pemupukan"], input[name="waktu_pemberian_pupuk"], input[name="cara_pemberian_pupuk"]').prop('checked', false);
|
||||||
|
$('#input-frekuensi-pemupukan-lainnya, #estimasi-dosis-pupuk-organik, #estimasi-dosis-pupuk-anorganik, #input-waktu-pemberian-pupuk-lainnya, #input-cara-pemberian-pupuk-lainnya').val('');
|
||||||
|
} else {
|
||||||
|
$('#input-frekuensi-pemupukan-lainnya').prop('disabled', !$('input[data-target="#input-frekuensi-pemupukan-lainnya"]').is(':checked'));
|
||||||
|
$('#input-waktu-pemberian-pupuk-lainnya').prop('disabled', !$('input[data-target="#input-waktu-pemberian-pupuk-lainnya"]').is(':checked'));
|
||||||
|
$('#input-cara-pemberian-pupuk-lainnya').prop('disabled', !$('input[data-target="#input-cara-pemberian-pupuk-lainnya"]').is(':checked'));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$('#pemberian-pupuk').on('change select2:select select2:clear', syncPemupukanState);
|
||||||
|
syncPemupukanState();
|
||||||
|
setTimeout(syncPemupukanState, 0);
|
||||||
|
|
||||||
const $switch = $('input[name="disimpan_untuk_diri_sendiri"]');
|
const $switch = $('input[name="disimpan_untuk_diri_sendiri"]');
|
||||||
const $text = $('#switch-text');
|
const $text = $('#switch-text');
|
||||||
@@ -1822,6 +1893,35 @@
|
|||||||
toggleInput();
|
toggleInput();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
const frekuensiPemangkasan = document.getElementById('frekuensi-pemangkasan-komoditas-utama');
|
||||||
|
const teknikPemangkasanInputs = document.querySelectorAll('input[name="teknik_pemangkasan[]"]');
|
||||||
|
const teknikPemangkasanLainnya = document.getElementById('input-teknik-pemangkasan-lainnya');
|
||||||
|
|
||||||
|
function toggleTeknikPemangkasan() {
|
||||||
|
const tidakPernahMemangkas = frekuensiPemangkasan && frekuensiPemangkasan.value === '{{ \App\Enums\PraktikBudidaya\FrekuensiPemangkasanUtama::TIDAK_PERNAH->value }}';
|
||||||
|
|
||||||
|
teknikPemangkasanInputs.forEach(function (input) {
|
||||||
|
input.disabled = tidakPernahMemangkas;
|
||||||
|
input.closest('.form-check')?.classList.toggle('opacity-50', tidakPernahMemangkas);
|
||||||
|
|
||||||
|
if (tidakPernahMemangkas) {
|
||||||
|
input.checked = false;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
if (teknikPemangkasanLainnya) {
|
||||||
|
teknikPemangkasanLainnya.disabled = tidakPernahMemangkas || !document.getElementById('teknik-pemangkasan-lainnya')?.checked;
|
||||||
|
|
||||||
|
if (tidakPernahMemangkas) {
|
||||||
|
teknikPemangkasanLainnya.value = '';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
frekuensiPemangkasan?.addEventListener('change', toggleTeknikPemangkasan);
|
||||||
|
document.getElementById('teknik-pemangkasan-lainnya')?.addEventListener('change', toggleTeknikPemangkasan);
|
||||||
|
toggleTeknikPemangkasan();
|
||||||
|
|
||||||
const biayaProduksiFields = [
|
const biayaProduksiFields = [
|
||||||
'upah-tenaga-kerja',
|
'upah-tenaga-kerja',
|
||||||
'biaya-bibit',
|
'biaya-bibit',
|
||||||
@@ -1991,4 +2091,4 @@ $(function () {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
@endpush
|
@endpush
|
||||||
|
|||||||
@@ -239,13 +239,9 @@
|
|||||||
<td class="text-wrapped">Kepemilikan aset produktif</td>
|
<td class="text-wrapped">Kepemilikan aset produktif</td>
|
||||||
<td class="text-end">{{ number_format($skor->skor_d4_k5_3_kepemilikan_aset_produktif, 1, ',', '.') }}</td>
|
<td class="text-end">{{ number_format($skor->skor_d4_k5_3_kepemilikan_aset_produktif, 1, ',', '.') }}</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
|
||||||
<td class="text-wrapped">Kepemilikan aset tidak produktif</td>
|
|
||||||
<td class="text-end">{{ number_format($skor->skor_d4_k5_4_kepemilikan_aset_tidak_produktif, 1, ',', '.') }}</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
<tr>
|
||||||
<td class="text-wrapped">Akses program bantuan</td>
|
<td class="text-wrapped">Akses program bantuan</td>
|
||||||
<td class="text-end">{{ number_format($skor->skor_d4_k5_4_5_akses_program_bantuan, 1, ',', '.') }}</td>
|
<td class="text-end">{{ number_format($skor->skor_d4_k5_4_akses_program_bantuan, 1, ',', '.') }}</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td class="text-wrapped">Keberadaan hutang terkait panen</td>
|
<td class="text-wrapped">Keberadaan hutang terkait panen</td>
|
||||||
|
|||||||
@@ -1,5 +1,17 @@
|
|||||||
@extends('layout.main')
|
@extends('layout.main')
|
||||||
|
|
||||||
|
@push('scripts-head')
|
||||||
|
<style>
|
||||||
|
#section-utama,
|
||||||
|
#section-sosial-budaya,
|
||||||
|
#section-keanggotaan-kelompok,
|
||||||
|
#section-akses-keuangan,
|
||||||
|
#section-keterikatan-hutang {
|
||||||
|
scroll-margin-top: 96px;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
@endpush
|
||||||
|
|
||||||
@section('content')
|
@section('content')
|
||||||
<div class="container-xxl flex-grow-1 container-p-y">
|
<div class="container-xxl flex-grow-1 container-p-y">
|
||||||
@if (session('success'))
|
@if (session('success'))
|
||||||
@@ -1062,6 +1074,20 @@
|
|||||||
const pinjamanTokohAdatAda = @json($pinjamanTokohAdatAdaValue);
|
const pinjamanTokohAdatAda = @json($pinjamanTokohAdatAdaValue);
|
||||||
const tekananJualSegeraAda = @json($tekananJualSegeraAdaValue);
|
const tekananJualSegeraAda = @json($tekananJualSegeraAdaValue);
|
||||||
const kebebasanMemilihPembeliCukupBebas = Number(@json($kebebasanMemilihPembeliCukupBebasValue));
|
const kebebasanMemilihPembeliCukupBebas = Number(@json($kebebasanMemilihPembeliCukupBebasValue));
|
||||||
|
const sectionAnchors = {
|
||||||
|
utama: 'section-utama',
|
||||||
|
sosial_budaya: 'section-sosial-budaya',
|
||||||
|
keanggotaan_kelompok: 'section-keanggotaan-kelompok',
|
||||||
|
akses_keuangan: 'section-akses-keuangan',
|
||||||
|
keterikatan_hutang: 'section-keterikatan-hutang'
|
||||||
|
};
|
||||||
|
const nextSectionAnchors = {
|
||||||
|
utama: 'section-sosial-budaya',
|
||||||
|
sosial_budaya: 'section-keanggotaan-kelompok',
|
||||||
|
keanggotaan_kelompok: 'section-akses-keuangan',
|
||||||
|
akses_keuangan: 'section-keterikatan-hutang',
|
||||||
|
keterikatan_hutang: 'section-keterikatan-hutang'
|
||||||
|
};
|
||||||
const fieldExamples = {
|
const fieldExamples = {
|
||||||
jumlah_tanggungan: 'Contoh: 4',
|
jumlah_tanggungan: 'Contoh: 4',
|
||||||
anak_masih_sekolah: 'Contoh: 2',
|
anak_masih_sekolah: 'Contoh: 2',
|
||||||
@@ -1399,7 +1425,8 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
function syncPihakMembantuFields() {
|
function syncPihakMembantuFields() {
|
||||||
const isTidakAda = $('#pihak-membantu').val() === pihakMembantuTanpaBantuan;
|
const isAdaSengketa = $('input[name="ada_sengketa"]:checked').val() === '1';
|
||||||
|
const isTidakAda = !isAdaSengketa || $('#pihak-membantu').val() === pihakMembantuTanpaBantuan;
|
||||||
const $fields = $('#pihak-membantu-nama, #tahun-bantuan');
|
const $fields = $('#pihak-membantu-nama, #tahun-bantuan');
|
||||||
|
|
||||||
$fields.prop('disabled', isTidakAda);
|
$fields.prop('disabled', isTidakAda);
|
||||||
@@ -1409,6 +1436,21 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function syncSengketaFields() {
|
||||||
|
const isAdaSengketa = $('input[name="ada_sengketa"]:checked').val() === '1';
|
||||||
|
const $fields = $('#keterangan-sengketa, #pihak-membantu, #status-konflik');
|
||||||
|
const $assistanceFields = $('#pihak-membantu-nama, #tahun-bantuan');
|
||||||
|
|
||||||
|
$fields.prop('disabled', !isAdaSengketa);
|
||||||
|
|
||||||
|
if (!isAdaSengketa) {
|
||||||
|
$fields.add($assistanceFields).val('');
|
||||||
|
$fields.filter('select').trigger('change.select2');
|
||||||
|
}
|
||||||
|
|
||||||
|
syncPihakMembantuFields();
|
||||||
|
}
|
||||||
|
|
||||||
function syncPernahJualHargaLebihTinggiFields() {
|
function syncPernahJualHargaLebihTinggiFields() {
|
||||||
const isPernah = $('#pernah-jual-harga-lebih-tinggi').val() === pernahJualHargaLebihTinggiPernah;
|
const isPernah = $('#pernah-jual-harga-lebih-tinggi').val() === pernahJualHargaLebihTinggiPernah;
|
||||||
const $field = $('#penyebab-harga-lebih-tinggi');
|
const $field = $('#penyebab-harga-lebih-tinggi');
|
||||||
@@ -1601,6 +1643,37 @@
|
|||||||
clearPendapatanRowValidation($row);
|
clearPendapatanRowValidation($row);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function setupSectionAnchors() {
|
||||||
|
$('input[name="form_section"]').each(function () {
|
||||||
|
const section = this.value;
|
||||||
|
const anchor = sectionAnchors[section];
|
||||||
|
const nextAnchor = nextSectionAnchors[section] || anchor;
|
||||||
|
const $form = $(this).closest('form');
|
||||||
|
|
||||||
|
if (anchor) {
|
||||||
|
$form.find('> .card').first().attr('id', anchor);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (nextAnchor && !$form.find('input[name="redirect_fragment"]').length) {
|
||||||
|
$('<input>', {
|
||||||
|
type: 'hidden',
|
||||||
|
name: 'redirect_fragment',
|
||||||
|
value: nextAnchor
|
||||||
|
}).appendTo($form);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
if (window.location.hash) {
|
||||||
|
const target = document.getElementById(window.location.hash.substring(1));
|
||||||
|
|
||||||
|
if (target) {
|
||||||
|
setTimeout(function () {
|
||||||
|
target.scrollIntoView({ block: 'start' });
|
||||||
|
}, 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
$(document).on('change', '.sosial-ekonomi-komoditas-utama', syncKomoditasLainnyaOptions);
|
$(document).on('change', '.sosial-ekonomi-komoditas-utama', syncKomoditasLainnyaOptions);
|
||||||
$(document).on('input change', '.pendapatan-row input, .pendapatan-row select', function () {
|
$(document).on('input change', '.pendapatan-row input, .pendapatan-row select', function () {
|
||||||
clearPendapatanRowValidation($(this).closest('.pendapatan-row'));
|
clearPendapatanRowValidation($(this).closest('.pendapatan-row'));
|
||||||
@@ -1636,6 +1709,7 @@
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
$('#pihak-membantu').on('change', syncPihakMembantuFields);
|
$('#pihak-membantu').on('change', syncPihakMembantuFields);
|
||||||
|
$('input[name="ada_sengketa"]').on('change', syncSengketaFields);
|
||||||
$('#pernah-jual-harga-lebih-tinggi').on('change', syncPernahJualHargaLebihTinggiFields);
|
$('#pernah-jual-harga-lebih-tinggi').on('change', syncPernahJualHargaLebihTinggiFields);
|
||||||
$('input[name="panutan_petani_sukses"]').on('change', syncPanutanFields);
|
$('input[name="panutan_petani_sukses"]').on('change', syncPanutanFields);
|
||||||
$('input[name="terdaftar_kelompok_tani"]').on('change', syncTerdaftarKelompokFields);
|
$('input[name="terdaftar_kelompok_tani"]').on('change', syncTerdaftarKelompokFields);
|
||||||
@@ -1650,10 +1724,12 @@
|
|||||||
$('#total-hutang-tidak-bersedia').on('change', syncTotalHutangFields);
|
$('#total-hutang-tidak-bersedia').on('change', syncTotalHutangFields);
|
||||||
$('input[name="tekanan_jual_segera"]').on('change', syncTekananJualFields);
|
$('input[name="tekanan_jual_segera"]').on('change', syncTekananJualFields);
|
||||||
$('input[name="kebebasan_memilih_pembeli"]').on('change', syncKebebasanPembeliFields);
|
$('input[name="kebebasan_memilih_pembeli"]').on('change', syncKebebasanPembeliFields);
|
||||||
|
setupSectionAnchors();
|
||||||
applySosialEkonomiExamples();
|
applySosialEkonomiExamples();
|
||||||
syncKomoditasLainnyaOptions();
|
syncKomoditasLainnyaOptions();
|
||||||
setupAllPendapatanRows();
|
setupAllPendapatanRows();
|
||||||
syncPihakMembantuFields();
|
syncPihakMembantuFields();
|
||||||
|
syncSengketaFields();
|
||||||
syncPernahJualHargaLebihTinggiFields();
|
syncPernahJualHargaLebihTinggiFields();
|
||||||
syncPanutanFields();
|
syncPanutanFields();
|
||||||
syncTerdaftarKelompokFields();
|
syncTerdaftarKelompokFields();
|
||||||
|
|||||||
@@ -1,5 +1,17 @@
|
|||||||
@extends('layout.main')
|
@extends('layout.main')
|
||||||
|
|
||||||
|
@push('scripts-head')
|
||||||
|
<style>
|
||||||
|
#section-utama,
|
||||||
|
#section-sosial-budaya,
|
||||||
|
#section-keanggotaan-kelompok,
|
||||||
|
#section-akses-keuangan,
|
||||||
|
#section-keterikatan-hutang {
|
||||||
|
scroll-margin-top: 96px;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
@endpush
|
||||||
|
|
||||||
@section('content')
|
@section('content')
|
||||||
<div class="container-xxl flex-grow-1 container-p-y">
|
<div class="container-xxl flex-grow-1 container-p-y">
|
||||||
@if (session('success'))
|
@if (session('success'))
|
||||||
@@ -1058,6 +1070,20 @@
|
|||||||
const pinjamanTokohAdatAda = @json($pinjamanTokohAdatAdaValue);
|
const pinjamanTokohAdatAda = @json($pinjamanTokohAdatAdaValue);
|
||||||
const tekananJualSegeraAda = @json($tekananJualSegeraAdaValue);
|
const tekananJualSegeraAda = @json($tekananJualSegeraAdaValue);
|
||||||
const kebebasanMemilihPembeliCukupBebas = Number(@json($kebebasanMemilihPembeliCukupBebasValue));
|
const kebebasanMemilihPembeliCukupBebas = Number(@json($kebebasanMemilihPembeliCukupBebasValue));
|
||||||
|
const sectionAnchors = {
|
||||||
|
utama: 'section-utama',
|
||||||
|
sosial_budaya: 'section-sosial-budaya',
|
||||||
|
keanggotaan_kelompok: 'section-keanggotaan-kelompok',
|
||||||
|
akses_keuangan: 'section-akses-keuangan',
|
||||||
|
keterikatan_hutang: 'section-keterikatan-hutang'
|
||||||
|
};
|
||||||
|
const nextSectionAnchors = {
|
||||||
|
utama: 'section-sosial-budaya',
|
||||||
|
sosial_budaya: 'section-keanggotaan-kelompok',
|
||||||
|
keanggotaan_kelompok: 'section-akses-keuangan',
|
||||||
|
akses_keuangan: 'section-keterikatan-hutang',
|
||||||
|
keterikatan_hutang: 'section-keterikatan-hutang'
|
||||||
|
};
|
||||||
const fieldExamples = {
|
const fieldExamples = {
|
||||||
jumlah_tanggungan: 'Contoh: 4',
|
jumlah_tanggungan: 'Contoh: 4',
|
||||||
anak_masih_sekolah: 'Contoh: 2',
|
anak_masih_sekolah: 'Contoh: 2',
|
||||||
@@ -1395,7 +1421,8 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
function syncPihakMembantuFields() {
|
function syncPihakMembantuFields() {
|
||||||
const isTidakAda = $('#pihak-membantu').val() === pihakMembantuTanpaBantuan;
|
const isAdaSengketa = $('input[name="ada_sengketa"]:checked').val() === '1';
|
||||||
|
const isTidakAda = !isAdaSengketa || $('#pihak-membantu').val() === pihakMembantuTanpaBantuan;
|
||||||
const $fields = $('#pihak-membantu-nama, #tahun-bantuan');
|
const $fields = $('#pihak-membantu-nama, #tahun-bantuan');
|
||||||
|
|
||||||
$fields.prop('disabled', isTidakAda);
|
$fields.prop('disabled', isTidakAda);
|
||||||
@@ -1405,6 +1432,21 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function syncSengketaFields() {
|
||||||
|
const isAdaSengketa = $('input[name="ada_sengketa"]:checked').val() === '1';
|
||||||
|
const $fields = $('#keterangan-sengketa, #pihak-membantu, #status-konflik');
|
||||||
|
const $assistanceFields = $('#pihak-membantu-nama, #tahun-bantuan');
|
||||||
|
|
||||||
|
$fields.prop('disabled', !isAdaSengketa);
|
||||||
|
|
||||||
|
if (!isAdaSengketa) {
|
||||||
|
$fields.add($assistanceFields).val('');
|
||||||
|
$fields.filter('select').trigger('change.select2');
|
||||||
|
}
|
||||||
|
|
||||||
|
syncPihakMembantuFields();
|
||||||
|
}
|
||||||
|
|
||||||
function syncPernahJualHargaLebihTinggiFields() {
|
function syncPernahJualHargaLebihTinggiFields() {
|
||||||
const isPernah = $('#pernah-jual-harga-lebih-tinggi').val() === pernahJualHargaLebihTinggiPernah;
|
const isPernah = $('#pernah-jual-harga-lebih-tinggi').val() === pernahJualHargaLebihTinggiPernah;
|
||||||
const $field = $('#penyebab-harga-lebih-tinggi');
|
const $field = $('#penyebab-harga-lebih-tinggi');
|
||||||
@@ -1597,6 +1639,37 @@
|
|||||||
clearPendapatanRowValidation($row);
|
clearPendapatanRowValidation($row);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function setupSectionAnchors() {
|
||||||
|
$('input[name="form_section"]').each(function () {
|
||||||
|
const section = this.value;
|
||||||
|
const anchor = sectionAnchors[section];
|
||||||
|
const nextAnchor = nextSectionAnchors[section] || anchor;
|
||||||
|
const $form = $(this).closest('form');
|
||||||
|
|
||||||
|
if (anchor) {
|
||||||
|
$form.find('> .card').first().attr('id', anchor);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (nextAnchor && !$form.find('input[name="redirect_fragment"]').length) {
|
||||||
|
$('<input>', {
|
||||||
|
type: 'hidden',
|
||||||
|
name: 'redirect_fragment',
|
||||||
|
value: nextAnchor
|
||||||
|
}).appendTo($form);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
if (window.location.hash) {
|
||||||
|
const target = document.getElementById(window.location.hash.substring(1));
|
||||||
|
|
||||||
|
if (target) {
|
||||||
|
setTimeout(function () {
|
||||||
|
target.scrollIntoView({ block: 'start' });
|
||||||
|
}, 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
$(document).on('change', '.sosial-ekonomi-komoditas-utama', syncKomoditasLainnyaOptions);
|
$(document).on('change', '.sosial-ekonomi-komoditas-utama', syncKomoditasLainnyaOptions);
|
||||||
$(document).on('input change', '.pendapatan-row input, .pendapatan-row select', function () {
|
$(document).on('input change', '.pendapatan-row input, .pendapatan-row select', function () {
|
||||||
clearPendapatanRowValidation($(this).closest('.pendapatan-row'));
|
clearPendapatanRowValidation($(this).closest('.pendapatan-row'));
|
||||||
@@ -1632,6 +1705,7 @@
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
$('#pihak-membantu').on('change', syncPihakMembantuFields);
|
$('#pihak-membantu').on('change', syncPihakMembantuFields);
|
||||||
|
$('input[name="ada_sengketa"]').on('change', syncSengketaFields);
|
||||||
$('#pernah-jual-harga-lebih-tinggi').on('change', syncPernahJualHargaLebihTinggiFields);
|
$('#pernah-jual-harga-lebih-tinggi').on('change', syncPernahJualHargaLebihTinggiFields);
|
||||||
$('input[name="panutan_petani_sukses"]').on('change', syncPanutanFields);
|
$('input[name="panutan_petani_sukses"]').on('change', syncPanutanFields);
|
||||||
$('input[name="terdaftar_kelompok_tani"]').on('change', syncTerdaftarKelompokFields);
|
$('input[name="terdaftar_kelompok_tani"]').on('change', syncTerdaftarKelompokFields);
|
||||||
@@ -1646,10 +1720,12 @@
|
|||||||
$('#total-hutang-tidak-bersedia').on('change', syncTotalHutangFields);
|
$('#total-hutang-tidak-bersedia').on('change', syncTotalHutangFields);
|
||||||
$('input[name="tekanan_jual_segera"]').on('change', syncTekananJualFields);
|
$('input[name="tekanan_jual_segera"]').on('change', syncTekananJualFields);
|
||||||
$('input[name="kebebasan_memilih_pembeli"]').on('change', syncKebebasanPembeliFields);
|
$('input[name="kebebasan_memilih_pembeli"]').on('change', syncKebebasanPembeliFields);
|
||||||
|
setupSectionAnchors();
|
||||||
applySosialEkonomiExamples();
|
applySosialEkonomiExamples();
|
||||||
syncKomoditasLainnyaOptions();
|
syncKomoditasLainnyaOptions();
|
||||||
setupAllPendapatanRows();
|
setupAllPendapatanRows();
|
||||||
syncPihakMembantuFields();
|
syncPihakMembantuFields();
|
||||||
|
syncSengketaFields();
|
||||||
syncPernahJualHargaLebihTinggiFields();
|
syncPernahJualHargaLebihTinggiFields();
|
||||||
syncPanutanFields();
|
syncPanutanFields();
|
||||||
syncTerdaftarKelompokFields();
|
syncTerdaftarKelompokFields();
|
||||||
|
|||||||
+10
-7
@@ -13,11 +13,14 @@ Route::post('/logout', [App\Http\Controllers\Web\Konfigurasi\AuthController::cla
|
|||||||
Route::view('/offline', 'offline')->name('offline');
|
Route::view('/offline', 'offline')->name('offline');
|
||||||
|
|
||||||
Route::get('/', function() {
|
Route::get('/', function() {
|
||||||
$userRole = auth()->check() ? (auth()->user()->role instanceof \App\Enums\Role ? auth()->user()->role->value : auth()->user()->role) : null;
|
if (!auth()->check()) {
|
||||||
|
return redirect()->route('login');
|
||||||
|
}
|
||||||
|
|
||||||
if ($userRole == 'fasilitator') {
|
if (auth()->user()->role->value === 'fasilitator') {
|
||||||
return redirect()->route('dashboard.survey-petani');
|
return redirect()->route('dashboard.survey-petani');
|
||||||
}
|
}
|
||||||
|
|
||||||
return redirect()->route('dashboard.produktivitas');
|
return redirect()->route('dashboard.produktivitas');
|
||||||
})->name('home');
|
})->name('home');
|
||||||
|
|
||||||
@@ -44,11 +47,11 @@ Route::middleware('auth')
|
|||||||
Route::get('/dashboard/petani', [App\Http\Controllers\Web\Dashboard\ProfilPetaniController::class, 'index'])->name('dashboard.petani');
|
Route::get('/dashboard/petani', [App\Http\Controllers\Web\Dashboard\ProfilPetaniController::class, 'index'])->name('dashboard.petani');
|
||||||
|
|
||||||
|
|
||||||
Route::get('/UserProfile', [App\Http\Controllers\Web\Konfigurasi\ProfileController::class, 'index'])->name('userProfile.index');
|
Route::get('/user-profile', [App\Http\Controllers\Web\Konfigurasi\ProfileController::class, 'index'])->name('userProfile.index');
|
||||||
Route::get('/UserProfile/security', [App\Http\Controllers\Web\Konfigurasi\ProfileController::class, 'security'])->name('userProfile.security');
|
Route::get('/user-profile/security', [App\Http\Controllers\Web\Konfigurasi\ProfileController::class, 'security'])->name('userProfile.security');
|
||||||
Route::get('/UserProfile/activities', [App\Http\Controllers\Web\Konfigurasi\ProfileController::class, 'activities'])->name('userProfile.activities');
|
Route::get('/user-profile/activities', [App\Http\Controllers\Web\Konfigurasi\ProfileController::class, 'activities'])->name('userProfile.activities');
|
||||||
Route::patch('/UserProfile/password', [App\Http\Controllers\Web\Konfigurasi\ProfileController::class, 'updatePassword'])->name('userProfile.password.update');
|
Route::patch('/user-profile/password', [App\Http\Controllers\Web\Konfigurasi\ProfileController::class, 'updatePassword'])->name('userProfile.password.update');
|
||||||
Route::post('/UserProfile/logout-devices', [App\Http\Controllers\Web\Konfigurasi\ProfileController::class, 'logoutDevices'])->name('userProfile.logoutDevices');
|
Route::post('/user-profile/logout-devices', [App\Http\Controllers\Web\Konfigurasi\ProfileController::class, 'logoutDevices'])->name('userProfile.logoutDevices');
|
||||||
|
|
||||||
Route::get('/dashboard/summary', [App\Http\Controllers\Web\Dashboard\SummaryController::class, 'index'])->name('dashboard.summary');
|
Route::get('/dashboard/summary', [App\Http\Controllers\Web\Dashboard\SummaryController::class, 'index'])->name('dashboard.summary');
|
||||||
Route::get('/resiliensi', [App\Http\Controllers\Web\Dashboard\ResiliensiController::class, 'index'])->name('dashboard.resiliensi');
|
Route::get('/resiliensi', [App\Http\Controllers\Web\Dashboard\ResiliensiController::class, 'index'])->name('dashboard.resiliensi');
|
||||||
|
|||||||
Reference in New Issue
Block a user