diff --git a/app/Http/Controllers/Web/Produktivitas/PetaniController.php b/app/Http/Controllers/Web/Produktivitas/PetaniController.php new file mode 100644 index 0000000..2808ba7 --- /dev/null +++ b/app/Http/Controllers/Web/Produktivitas/PetaniController.php @@ -0,0 +1,163 @@ +get(); + + $query = Petani::with('desakelurahan') + ->orderBy('created_at', 'desc'); + + if ($request->search) { + $query->where(function ($query) use ($request) { + $query->where('nama', 'like', '%' . $request->search . '%') + ->orWhere('ktp', 'like', '%' . $request->search . '%'); + }); + } + + $petani = $query->paginate($request->per_page ?? 10); + + return view('produktivitas.petani.index', compact('petani', 'provinsi')); + } + + public function create() + { + if (!Gate::any(['super_admin', 'admin', 'fasilitator'])) { + abort(403); + } + + $pendidikan = Pendidikan::options(); + $pekerjaan = Pekerjaan::options(); + $pernikahan = Pernikahan::options(); + + $provinsi = Provinsi::orderBy('kode', 'asc')->get(); + + return view('produktivitas.petani.add', compact('pendidikan', 'pekerjaan', + 'pernikahan', 'provinsi')); + } + + public function store(Request $request) + { + if (!Gate::any(['super_admin', 'admin', 'fasilitator'])) { + abort(403); + } + + $validatedData = $request->validate([ + 'nama' => ['required','string','max:255'], + 'jenis_kelamin' => ['required','boolean'], + 'tempat_lahir' => ['required','string','max:255'], + 'tanggal_lahir' => ['required','date'], + 'pendidikan_terakhir' => ['required', Rule::enum(Pendidikan::class)], + 'alamat' => ['required','string','max:500'], + 'desa_kelurahan_id' => ['required','exists:master_desa_kelurahan,id'], + //'komoditas_id' => ['required','exists:master_komoditas,id'], + 'status_perkawinan' => ['required', Rule::enum(Pernikahan::class)], + 'ktp' => ['nullable', 'min:16', 'max:16'], + 'file_ktp' => ['nullable', 'file', 'mimes:jpeg,jpg,png,pdf', 'max:2048'], + 'kk' => ['nullable', 'min:16', 'max:16'], + 'file_kk' => ['nullable', 'file', 'mimes:jpeg,jpg,png,pdf', 'max:2048'], + 'foto' => ['nullable', 'file', 'mimes:jpeg,jpg,png', 'max:2048'], + ]); + + Petani::create([...$validatedData, + 'uid' => 'PTN-'. strtoupper(Str::random(10)), + 'created_by' => auth()->id(), + 'updated_by' => auth()->id()]); + + return redirect()->route('petani.index')->with('success', 'Data petani berhasil ditambahkan.'); + } + + public function show(string $id) + { + if (!Gate::any(['super_admin', 'admin', 'fasilitator'])) { + abort(403); + } + + $petani = Petani::findOrFail($id); + + return view('produktivitas.petani.view', compact('petani')); + } + + + public function edit(string $id, Request $request) + { + if (!Gate::any(['super_admin', 'admin', 'fasilitator'])) { + abort(403); + } + + $petani = Petani::findOrFail($id); + + $pendidikan = Pendidikan::options(); + $pekerjaan = Pekerjaan::options(); + $pernikahan = Pernikahan::options(); + + $provinsi = Provinsi::all(); + + $section = $request->section ?? 'budidaya'; + + return view('produktivitas.petani.edit', compact('petani', 'pendidikan', 'pekerjaan', + 'pernikahan', 'provinsi', 'section')); + } + + + public function update(Request $request, string $id) + { + if (!Gate::any(['super_admin', 'admin', 'fasilitator'])) { + abort(403); + } + + $petani = Petani::findOrFail($id); + + $validatedData = $request->validate([ + 'nama' => ['required','string','max:255'], + 'jenis_kelamin' => ['required','boolean'], + 'tempat_lahir' => ['required','string','max:255'], + 'tanggal_lahir' => ['required','date'], + 'pendidikan_terakhir' => ['required', Rule::enum(Pendidikan::class)], + 'alamat' => ['required','string','max:500'], + 'desa_kelurahan_id' => ['required','exists:master_desa_kelurahan,id'], + //'komoditas_id' => ['required','exists:master_komoditas,id'], + 'status_perkawinan' => ['required', Rule::enum(Pernikahan::class)], + 'ktp' => ['nullable', 'min:16', 'max:16'], + 'file_ktp' => ['nullable', 'file', 'mimes:jpeg,jpg,png,pdf', 'max:2048'], + 'kk' => ['nullable', 'min:16', 'max:16'], + 'file_kk' => ['nullable', 'file', 'mimes:jpeg,jpg,png,pdf', 'max:2048'], + 'foto' => ['nullable', 'file', 'mimes:jpeg,jpg,png', 'max:2048'], + ]); + + $petani->update([...$validatedData, + 'updated_by' => auth()->id()]); + + return redirect()->route('petani.index')->with('success', 'Data petani berhasil diupdate.'); + } + + /** + * Remove the specified resource from storage. + */ + public function destroy(string $id) + { + // + } +} diff --git a/app/Http/Controllers/Web/Produktivitas/PetaniLahanController.php b/app/Http/Controllers/Web/Produktivitas/PetaniLahanController.php new file mode 100644 index 0000000..bb97bc0 --- /dev/null +++ b/app/Http/Controllers/Web/Produktivitas/PetaniLahanController.php @@ -0,0 +1,90 @@ +orderBy('created_at', 'desc') + ->paginate($request->per_page ?? 10); + + return view('produktivitas.petani.lahan.index', compact('petani', 'lahan')); + } + + public function create($petaniId) + { + if (!Gate::any(['super_admin', 'admin', 'fasilitator'])) { + abort(403); + } + + $petani = Petani::findOrFail($petaniId); + + $lahan = Lahan::where('petani_id', $petaniId) + ->orderBy('created_at', 'desc') + ->paginate($request->per_page ?? 10); + + $provinsi = Provinsi::orderBy('kode', 'asc')->get(); + + $komoditas = Komoditas::all(); + + return view('produktivitas.petani.lahan.add', compact('petani', 'lahan', 'provinsi', 'komoditas')); + } + + /** + * Store a newly created resource in storage. + */ + public function store(Request $request) + { + // + } + + /** + * Display the specified resource. + */ + public function show(string $id) + { + // + } + + /** + * Show the form for editing the specified resource. + */ + public function edit(string $id) + { + // + } + + /** + * Update the specified resource in storage. + */ + public function update(Request $request, string $id) + { + // + } + + /** + * Remove the specified resource from storage. + */ + public function destroy(string $id) + { + // + } +} diff --git a/app/Models/Map/Lahan.php b/app/Models/Map/Lahan.php index 671c45c..eeac4fb 100644 --- a/app/Models/Map/Lahan.php +++ b/app/Models/Map/Lahan.php @@ -16,6 +16,7 @@ class Lahan extends Model 'nama', 'status_kepemilikan', 'profile_id', + 'petani_id', 'desa_kelurahan_id', 'uid', 'path', diff --git a/database/migrations/2026_06_26_180741_create_petani_master_table.php b/database/migrations/2026_06_26_180741_create_petani_master_table.php index 6e3efed..dc2d06d 100644 --- a/database/migrations/2026_06_26_180741_create_petani_master_table.php +++ b/database/migrations/2026_06_26_180741_create_petani_master_table.php @@ -52,6 +52,6 @@ return new class extends Migration */ public function down(): void { - Schema::dropIfExists('petanis'); + Schema::dropIfExists('petani'); } }; diff --git a/database/migrations/2026_06_28_095941_update_lahan_table.php b/database/migrations/2026_06_28_095941_update_lahan_table.php new file mode 100644 index 0000000..a54c02e --- /dev/null +++ b/database/migrations/2026_06_28_095941_update_lahan_table.php @@ -0,0 +1,47 @@ +foreignId('petani_id')->nullable()->constrained('petani')->onDelete('set null'); + + $table->foreignId('komoditas_id')->nullable()->constrained('master_komoditas')->onDelete('set null'); + $table->foreignId('jenis_komoditas_id')->nullable()->constrained('jenis_komoditas')->onDelete('set null'); + $table->foreignId('varietas_id')->nullable()->constrained('master_varietas')->onDelete('set null'); + + $table->float('umur_tanaman', 8)->nullable(); + $table->float('umur_kebun', 8)->nullable(); + + $table->integer('jumlah_tanaman')->nullable(); + + $table->string('kondisi_tanaman')->nullable(); + $table->string('hama_tanaman')->nullable(); + $table->string('penyakit_tanaman')->nullable(); + $table->string('keparahan_serangan')->nullable(); + + // TODO: + // komoditas lainnya dan tanaman penaung + }); + + Schema::table('petani', function (Blueprint $table) { + $table->foreignId('profile_id')->nullable()->constrained('profiles')->onDelete('set null'); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + + } +}; diff --git a/resources/views/auth/login.blade.php b/resources/views/auth/login.blade.php index 4eda5f9..f65225a 100644 --- a/resources/views/auth/login.blade.php +++ b/resources/views/auth/login.blade.php @@ -4,7 +4,7 @@
- +
- +
- + +@endsection + +@push('scripts') + +@endpush \ No newline at end of file diff --git a/resources/views/produktivitas/petani/edit.blade.php b/resources/views/produktivitas/petani/edit.blade.php new file mode 100644 index 0000000..b863876 --- /dev/null +++ b/resources/views/produktivitas/petani/edit.blade.php @@ -0,0 +1,234 @@ +@extends('layout.main') + +@section('content') +
+ @if ($errors->any()) +
+
    + @foreach ($errors->all() as $error) +
  • {{ $error }}
  • + @endforeach +
+
+ @endif + +
+ + + +
+ + @include('produktivitas.petani.header', ['petani' => $petani]) + +
+
+ +
Data Pribadi
+
+
+ + + @error('nama')
{{ $message }}
@enderror +
+
+ + + @error('jenis_kelamin')
{{ $message }}
@enderror +
+
+ + + @error('tempat_lahir')
{{ $message }}
@enderror +
+
+ + + @error('tanggal_lahir')
{{ $message }}
@enderror +
+
+
+
+ + + @error('pendidikan_terakhir')
{{ $message }}
@enderror +
+
+ + + @error('status_perkawinan')
{{ $message }}
@enderror +
+
+
Alamat
+
+
+ + + @error('alamat')
{{ $message }}
@enderror +
+
+
+
+ + + @error('provinsi_id')
{{ $message }}
@enderror +
+
+ + + @error('kabupaten_id')
{{ $message }}
@enderror +
+
+ + + @error('kecamatan_id')
{{ $message }}
@enderror +
+
+ + + @error('desa_kelurahan_id')
{{ $message }}
@enderror +
+
+ +
+ +
+
+
+
+
+
+@endsection + +@push('scripts') + +@endpush \ No newline at end of file diff --git a/resources/views/produktivitas/petani/header.blade.php b/resources/views/produktivitas/petani/header.blade.php new file mode 100644 index 0000000..17434c6 --- /dev/null +++ b/resources/views/produktivitas/petani/header.blade.php @@ -0,0 +1,95 @@ +
+
+
+
+
+
+ User avatar + +
+
+
+
+
+
+ +
+
+
+
1.23k
+ Task Done +
+
+
+
+
+ +
+
+
+
568
+ Project Done +
+
+
+
+
+
Profil Petani
+
+
    +
  • Nama: {{ $petani->nama }}
  • +
  • Jenis Kelamin: {{ $petani->jenis_kelamin == 1 ? 'Laki-laki' : 'Perempuan' }}
  • +
  • Alamat: {{ $petani->alamat }}, + {{ $petani->desaKelurahan?->nama }}, + {{ $petani->desaKelurahan?->kecamatan->nama }}, + {{ $petani->desaKelurahan?->kecamatan->kabupatenKota->nama }}, + {{ $petani->desaKelurahan?->kecamatan->kabupatenKota->provinsi->nama }}
  • +
+
+
+
+
+
+ + \ No newline at end of file diff --git a/resources/views/produktivitas/petani/index.blade.php b/resources/views/produktivitas/petani/index.blade.php new file mode 100644 index 0000000..4d23828 --- /dev/null +++ b/resources/views/produktivitas/petani/index.blade.php @@ -0,0 +1,111 @@ +@extends('layout.main') + +@section('content') +
+
+
+
Data Petani
+
+ +
+
+
+
+ + + +
+
+
+
+ + +
+ + Tambah + +
+
+
+ +
+ + + + + + + + + + + + + @forelse($petani as $index => $item) + + + + + + + + + + @empty + + @endforelse + +
NoNamaJenis KelaminUsiaDesa/KelurahanAksi
{{ $loop->iteration }}{{ $item->nama }}{{ $item->jenis_kelamin ? 'Laki-laki' : 'Perempuan' }}{{ $item->umur }} tahun{{ $item->desaKelurahan?->nama }}, {{ $item->desaKelurahan?->kecamatan?->nama }}, {{ $item->desaKelurahan?->kecamatan?->kabupatenKota?->nama }}, {{ $item->desaKelurahan?->kecamatan?->kabupatenKota?->provinsi?->nama }} +
+ + + +
+
Tidak ada data ditemukan.
+
+ +
+
+@endsection + +@push('scripts') + +@endpush diff --git a/resources/views/produktivitas/petani/lahan/add.blade.php b/resources/views/produktivitas/petani/lahan/add.blade.php new file mode 100644 index 0000000..e281675 --- /dev/null +++ b/resources/views/produktivitas/petani/lahan/add.blade.php @@ -0,0 +1,457 @@ +@extends('layout.main') + +@push('style') + + + + +@endpush + +@section('content') +
+ @if ($errors->any()) +
+
    + @foreach ($errors->all() as $error) +
  • {{ $error }}
  • + @endforeach +
+
+ @endif + +
+ + + +
+ + @include('produktivitas.petani.header', ['petani' => $petani]) + +
+
+
+
+
+ +
+
+ +
+ @csrf +
+
+
+
Data Lahan dan Komoditas
+ +
+
+ + + @error('luas_lahan')
{{ $message }}
@enderror +
+
+
+
+ + + @error('komoditas_id')
{{ $message }}
@enderror +
+
+ + + @error('jenis_komoditas_id')
{{ $message }}
@enderror +
+
+
+
+ + + @error('varietas_id')
{{ $message }}
@enderror +
+
+ + + @error('jumlah_tanaman')
{{ $message }}
@enderror +
+
+ +
+
Lokasi Wilayah
+ +
+
+ + + @error('provinsi_id')
{{ $message }}
@enderror +
+
+ + +
+ @error('kabupaten_id')
{{ $message }}
@enderror +
+ +
+
+ + + @error('kecamatan_id')
{{ $message }}
@enderror +
+
+ + + @error('desa_kelurahan_id')
{{ $message }}
@enderror +
+
+ +
+
+ + + Pastikan menggambar polygon di peta dengan menyambungkan titik akhir ke titik awal. + @error('path')
{{ $message }}
@enderror +
+
+
+ +
+
+
Gambar Area Lahan
+ Gunakan tool ⬟ di kiri peta +
+ +
+
+ +
+
+ + +
+
+
+
+
+
+
+
+
+
+
+@endsection + +@push('scripts') + + + + +@endpush \ No newline at end of file diff --git a/resources/views/produktivitas/petani/lahan/index.blade.php b/resources/views/produktivitas/petani/lahan/index.blade.php new file mode 100644 index 0000000..17afd7d --- /dev/null +++ b/resources/views/produktivitas/petani/lahan/index.blade.php @@ -0,0 +1,155 @@ +@extends('layout.main') + +@section('content') +
+ @if ($errors->any()) +
+
    + @foreach ($errors->all() as $error) +
  • {{ $error }}
  • + @endforeach +
+
+ @endif + +
+ + + +
+ + @include('produktivitas.petani.header', ['petani' => $petani]) + +
+
+
+
+ +
+
+ + +
+
+
+
+
+@endsection + +@push('scripts') + +@endpush \ No newline at end of file diff --git a/resources/views/produktivitas/petani/view.blade.php b/resources/views/produktivitas/petani/view.blade.php new file mode 100644 index 0000000..9d005b0 --- /dev/null +++ b/resources/views/produktivitas/petani/view.blade.php @@ -0,0 +1,103 @@ +@extends('layout.main') + +@section('content') +
+
+
+
Edit Petani
+
+ +
+
+ @if ($errors->any()) +
+
    + @foreach ($errors->all() as $error) +
  • {{ $error }}
  • + @endforeach +
+
+ @endif + +
Informasi Petani
+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+
+
+ + +
+
+ + +
+
+
+
+ + +
+
+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ +
+ Kembali +
+
+
+
+
+@endsection + +@push('scripts') + +@endpush \ No newline at end of file diff --git a/routes/web.php b/routes/web.php index 5240440..317a9e1 100644 --- a/routes/web.php +++ b/routes/web.php @@ -11,6 +11,10 @@ Route::post('/logout', [App\Http\Controllers\Web\Konfigurasi\AuthController::cla Route::view('/offline', 'offline')->name('offline'); +Route::get('/', function() { + return redirect()->route('dashboard.summary'); + })->name('home'); + Route::middleware('auth') ->group(function () { @@ -25,14 +29,17 @@ Route::middleware('auth') })->name('survey.petani.create'); // Home - Route::get('/', [App\Http\Controllers\Web\Dashboard\SummaryController::class, 'produktivitas'])->name('dashboard.produktivitas'); + + Route::get('/dashboard/produktivitas', [App\Http\Controllers\Web\Dashboard\SummaryController::class, 'produktivitas'])->name('dashboard.produktivitas'); + + Route::get('/UserProfile', [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('/UserProfile/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::post('/UserProfile/logout-devices', [App\Http\Controllers\Web\Konfigurasi\ProfileController::class, 'logoutDevices'])->name('userProfile.logoutDevices'); - // Route::get('/', [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('/hilirisasi', [App\Http\Controllers\Web\Dashboard\HilirisasiController::class, 'index'])->name('dashboard.hilirisasi'); Route::get('/konektivitas', [App\Http\Controllers\Web\Dashboard\KonektivitasController::class, 'index'])->name('dashboard.konektivitas'); @@ -113,8 +120,10 @@ Route::middleware('auth') Route::delete('/komoditas/{id}', [App\Http\Controllers\Web\Master\KomoditasController::class, 'destroy'])->name('komoditas.destroy'); Route::resource('jenis-komoditas', App\Http\Controllers\Web\Master\JenisKomoditasController::class); + Route::get('/jenis-komoditas/komoditas/{komoditas_id}', [App\Http\Controllers\Web\Master\JenisKomoditasController::class, 'getByKomoditas'])->name('jenis-komoditas.by-komoditas'); Route::get('/jenis-komoditas-by-komoditas/{komoditas_id}', [App\Http\Controllers\Web\Master\JenisKomoditasController::class, 'getByKomoditas'])->name('jenis-komoditas.by-komoditas'); Route::resource('varietas', App\Http\Controllers\Web\Master\VarietasController::class); + Route::get('/varietas/jenis-komoditas/{jenis_komoditas_id}', [App\Http\Controllers\Web\Master\VarietasController::class, 'getByJenisKomoditas'])->name('varietas.by-jenis-komoditas'); Route::get('/varietas-by-jenis-komoditas/{jenis_komoditas_id}', [App\Http\Controllers\Web\Master\VarietasController::class, 'getByJenisKomoditas'])->name('varietas.by-jenis-komoditas'); Route::resource('map-tanaman', App\Http\Controllers\Web\Produktivitas\MapTanamanController::class); @@ -175,4 +184,8 @@ Route::middleware('auth') Route::resource('realisasi', App\Http\Controllers\Web\Program\RealisasiController::class)->only('index', 'store', 'show', 'update', 'destroy'); Route::resource('verifikasi', App\Http\Controllers\Web\Program\VerifikasiController::class)->only('store', 'destroy'); + + // Petani + Route::resource('petani', App\Http\Controllers\Web\Produktivitas\PetaniController::class); + Route::resource('petani.lahan-tanaman', App\Http\Controllers\Web\Produktivitas\PetaniLahanController::class); });