This commit is contained in:
2026-07-20 16:36:29 +07:00
18 changed files with 865 additions and 55 deletions
@@ -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',
)); ));
} }
} }
@@ -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.',
@@ -18,6 +18,7 @@ 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\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 +63,9 @@ 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();
return view('produktivitas.petani.lahan.add', compact('petani', 'lahan', 'provinsi', 'komoditas')); return view('produktivitas.petani.lahan.add', compact('petani', 'lahan', 'provinsi', 'komoditas', 'tanamanPenaung'));
} }
private function validateLahan(Request $request) private function validateLahan(Request $request)
@@ -81,7 +83,7 @@ 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:0'], 'jumlah_tanaman' => ['nullable', 'numeric', 'min:0'],
'umur_lahan' => ['nullable', '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)],
@@ -91,7 +93,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,7 +104,7 @@ 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 0.', 'jumlah_tanaman.min' => 'Jumlah tanaman minimal 0.',
//'umur_lahan.required' => 'Umur lahan wajib diisi.', //'umur_lahan.required' => 'Umur lahan wajib diisi.',
@@ -119,7 +121,7 @@ class PetaniLahanController extends Controller
'komoditas_lain.array' => 'Komoditas lain diisi dengan array.', 'komoditas_lain.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 +130,28 @@ class PetaniLahanController extends Controller
} }
private function syncTanamanPenaung(Request $request)
{
$existing = JenisTanaman::pluck('nama')->toArray();
$tanamanPenaung = collect($request->tanaman_penaung)
->unique()
->reject(fn ($nama) => in_array($nama, $existing))
->map(fn ($nama) => [
'nama' => Str::title($nama),
'created_by' => auth()->id(),
'updated_by' => auth()->id(),
'created_at' => now(),
'updated_at' => now(),
])
->values()
->toArray();
if (!empty($tanamanPenaung)) {
JenisTanaman::insert($tanamanPenaung);
}
}
public function store($petaniId, Request $request) public function store($petaniId, Request $request)
{ {
if (!Gate::any(['super_admin', 'admin', 'fasilitator'])) { if (!Gate::any(['super_admin', 'admin', 'fasilitator'])) {
@@ -136,6 +160,12 @@ 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);
$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)
@@ -154,6 +184,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),
@@ -236,10 +268,11 @@ 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();
$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'));
} }
public function update(Request $request, string $petaniId, string $id) public function update(Request $request, string $petaniId, string $id)
@@ -251,6 +284,11 @@ 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);
$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();
@@ -285,6 +323,8 @@ 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) {
return [ return [
@@ -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()) {
+21
View File
@@ -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',
];
}
@@ -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');
}
};
+8 -8
View File
@@ -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'
} }
} }
} }
+8 -3
View File
@@ -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>
+41
View File
@@ -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
+67 -2
View File
@@ -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
+491 -3
View File
@@ -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">
@@ -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">
@@ -210,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 &amp; 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 &amp; 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 &amp; 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 &amp; GAP
</div>
<div>
<span class="badge bg-label-primary">K4</span> Keterlibatan Kelembagaan
</div>
<div>
<span class="badge bg-label-primary">K5</span> Akses &amp; Kebebasan Keuangan
</div>
<div>
<span class="badge bg-label-primary">K6</span> Rantai Nilai &amp; 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
@@ -106,6 +106,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 +115,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 +270,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>
+1
View File
@@ -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>
@@ -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>
@@ -213,8 +213,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 (min 0)" 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">
@@ -302,9 +302,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
@@ -429,7 +429,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();
@@ -770,7 +772,7 @@
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, number: true, min: 0 }, jumlah_tanaman: { number: true, min: 0 },
umur_lahan: { 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 },
@@ -784,7 +786,7 @@
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", number: "Jumlah tanaman harus berupa angka", min: "Jumlah tanaman minimal 0" }, jumlah_tanaman: { number: "Jumlah tanaman harus berupa angka", min: "Jumlah tanaman minimal 0" },
umur_lahan: { 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" },
@@ -85,8 +85,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 (min 0)" 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>
@@ -187,10 +187,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
@@ -420,7 +420,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,
@@ -843,7 +845,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" },
@@ -851,7 +853,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) {
+5 -5
View File
@@ -47,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');