From a355a1d1d84f591e6ae7dc9d8a4a8f0a25eda9eb Mon Sep 17 00:00:00 2001 From: "fauzgabriel@gmail.com" Date: Mon, 8 Jun 2026 11:23:33 +0700 Subject: [PATCH 1/2] Panen and include all support --- .../Api/PanenTanamanController.php | 143 ++++++++++++++++++ .../Api/Produktivitas/PanenController.php | 61 ++++++-- .../Api/Produktivitas/PanenController01.php | 136 +++++++++++++++++ app/Models/Map/Panen.php | 26 +++- app/Models/Map/PanenTanaman.php | 25 +++ .../2026_04_27_092223_create_panen_table.php | 6 +- ...6_06_134032_create_panen_tanamen_table.php | 38 +++++ 7 files changed, 411 insertions(+), 24 deletions(-) create mode 100644 app/Http/Controllers/Api/PanenTanamanController.php create mode 100644 app/Http/Controllers/Api/Produktivitas/PanenController01.php create mode 100644 app/Models/Map/PanenTanaman.php create mode 100644 database/migrations/2026_06_06_134032_create_panen_tanamen_table.php diff --git a/app/Http/Controllers/Api/PanenTanamanController.php b/app/Http/Controllers/Api/PanenTanamanController.php new file mode 100644 index 0000000..731f662 --- /dev/null +++ b/app/Http/Controllers/Api/PanenTanamanController.php @@ -0,0 +1,143 @@ +get(); + + return response()->json([ + 'success' => true, + 'message' => 'Daftar data panen tanaman berhasil diambil.', + 'data' => $panenTanaman + ], 200); + } catch (Exception $e) { + return response()->json([ + 'success' => false, + 'message' => 'Terjadi kesalahan saat mengambil data.', + 'error' => $e->getMessage() + ], 500); + } + } + + /** + * Store a newly created resource in storage. + */ + public function store(Request $request) + { + $validator = Validator::make($request->all(), [ + 'panen_id' => 'required|integer', + 'tanaman_id' => 'required|integer', + 'commodity_name' => 'required|string|max:255', + 'sync_status' => 'nullable|string|max:50', + 'weight_kg' => 'required|numeric|min:0', + ]); + + if ($validator->fails()) { + return response()->json([ + 'success' => false, + 'message' => 'Validasi gagal.', + 'errors' => $validator->errors() + ], 422); + } + + try { + $panenTanaman = PanenTanaman::create($request->all()); + + return response()->json([ + 'success' => true, + 'message' => 'Data panen tanaman berhasil disimpan.', + 'data' => $panenTanaman + ], 201); + } catch (Exception $e) { + return response()->json([ + 'success' => false, + 'message' => 'Gagal menyimpan data.', + 'error' => $e->getMessage() + ], 500); + } + } + + /** + * Display the specified resource. + */ + public function show(PanenTanaman $panenTanaman) + { + return response()->json([ + 'success' => true, + 'message' => 'Detail data panen tanaman ditemukan.', + 'data' => $panenTanaman + ], 200); + } + + /** + * Update the specified resource in storage. + */ + public function update(Request $request, PanenTanaman $panenTanaman) + { + $validator = Validator::make($request->all(), [ + 'panen_id' => 'sometimes|required|integer', + 'tanaman_id' => 'sometimes|required|integer', + 'commodity_name' => 'sometimes|required|string|max:255', + 'sync_status' => 'nullable|string|max:50', + 'weight_kg' => 'sometimes|required|numeric|min:0', + ]); + + if ($validator->fails()) { + return response()->json([ + 'success' => false, + 'message' => 'Validasi gagal.', + 'errors' => $validator->errors() + ], 422); + } + + try { + $panenTanaman->update($request->all()); + + return response()->json([ + 'success' => true, + 'message' => 'Data panen tanaman berhasil diperbarui.', + 'data' => $panenTanaman + ], 200); + } catch (Exception $e) { + return response()->json([ + 'success' => false, + 'message' => 'Gagal memperbarui data.', + 'error' => $e->getMessage() + ], 500); + } + } + + /** + * Remove the specified resource from storage. + */ + public function destroy(PanenTanaman $panenTanaman) + { + try { + $panenTanaman->delete(); // Karena pakai SoftDeletes, data tidak terhapus permanen di DB + + return response()->json([ + 'success' => true, + 'message' => 'Data panen tanaman berhasil dihapus (soft delete).' + ], 200); + } catch (Exception $e) { + return response()->json([ + 'success' => false, + 'message' => 'Gagal menghapus data.', + 'error' => $e->getMessage() + ], 500); + } + } +} diff --git a/app/Http/Controllers/Api/Produktivitas/PanenController.php b/app/Http/Controllers/Api/Produktivitas/PanenController.php index c537b58..277f45b 100644 --- a/app/Http/Controllers/Api/Produktivitas/PanenController.php +++ b/app/Http/Controllers/Api/Produktivitas/PanenController.php @@ -1,12 +1,13 @@ validate([ + 'uid' => ['required', 'string'], + 'title' => ['required', 'string'], 'land_id' => ['required', 'integer'], - 'plant_id' => ['required', 'integer'], - 'commodity_name' => ['required', 'string', 'max:255'], - 'weight_kg' => ['required', 'numeric'], + 'farmer_id' => ['required', 'integer'], + 'land_description' => ['nullable', 'string'], 'harvest_date' => ['required', 'date'], + 'commodities' => ['required', 'array', 'min:1'], + 'commodities.*.plant_id' => ['nullable', 'integer'], + 'commodities.*.commodity_name' => ['required', 'string'], + 'commodities.*.weight_kg' => ['required', 'numeric'], 'notes' => ['nullable', 'string'], ]); - $panen = Panen::create([ - 'land_id' => $validated['land_id'], - 'plant_id' => $validated['plant_id'], - 'farmer_id' => Auth::user()->profile->id, - 'commodity_name' => $validated['commodity_name'], - 'weight_kg' => $validated['weight_kg'], - 'harvest_date' => $validated['harvest_date'], - 'notes' => $validated['notes'] ?? null, - 'sync_status' => 'synced' - ]); + try { + $panen = DB::transaction(function () use ($validated) { + + $panenData = collect($validated)->except('commodities')->toArray(); + $panen = Panen::create($panenData); - return response()->json($panen, 201); + foreach ($validated['commodities'] as $commodity) { + \App\Models\Map\PanenTanaman::create([ + 'panen_id' => $panen->id, + 'tanaman_id' => $commodity['plant_id'] ?? null, + 'commodity_name' => $commodity['commodity_name'], + 'weight_kg' => $commodity['weight_kg'], + 'sync_status' => 'synced', + ]); + } + + return $panen; + }); + $panen->load('panenTanaman'); + + return response()->json([ + 'success' => true, + 'message' => 'Data panen dan detail tanaman berhasil disimpan.', + 'data' => $panen + ], 201); + + } catch (\Exception $e) { + return response()->json([ + 'success' => false, + 'message' => 'Gagal menyimpan data ke database.', + 'error' => $e->getMessage() + ], 500); + } } + + public function show(string $id): JsonResponse { if (!Gate::any(['petani', 'fasilitator','super_admin'])) { diff --git a/app/Http/Controllers/Api/Produktivitas/PanenController01.php b/app/Http/Controllers/Api/Produktivitas/PanenController01.php new file mode 100644 index 0000000..edb49a3 --- /dev/null +++ b/app/Http/Controllers/Api/Produktivitas/PanenController01.php @@ -0,0 +1,136 @@ +profile; + + $profileId = $user->role === 'petani' ? $profile->id : $request->id; + $listPanen = Panen::when($profileId, fn($q,$v) => $q->where('farmer_id',$user->id))->get(); + + return response()->json($listPanen); + } + + public function store(Request $request): JsonResponse + { + if (!Gate::any(['petani', 'fasilitator','super_admin'])) { + abort(403); + } + + $validated = $request->validate([ + 'land_id' => ['required', 'integer'], + 'plant_id' => ['required', 'integer'], + 'commodity_name' => ['required', 'string', 'max:255'], + 'weight_kg' => ['required', 'numeric'], + 'harvest_date' => ['required', 'date'], + 'notes' => ['nullable', 'string'], + ]); + + $panen = Panen::create([ + 'land_id' => $validated['land_id'], + 'plant_id' => $validated['plant_id'], + 'farmer_id' => Auth::user()->profile->id, + 'commodity_name' => $validated['commodity_name'], + 'weight_kg' => $validated['weight_kg'], + 'harvest_date' => $validated['harvest_date'], + 'notes' => $validated['notes'] ?? null, + 'sync_status' => 'synced' + ]); + + return response()->json($panen, 201); + } + + public function show(string $id): JsonResponse + { + if (!Gate::any(['petani', 'fasilitator','super_admin'])) { + abort(403); + } + $panen = Panen::findOrFail($id); + return response()->json($panen); + } + + public function update(Request $request, string $id): JsonResponse + { + if (!Gate::any(['petani', 'fasilitator','super_admin'])) { + abort(403); + } + $panen = Panen::findOrFail($id); + + $validated = $request->validate([ + 'commodity_name' => ['string', 'max:255'], + 'weight_kg' => ['numeric'], + 'harvest_date' => ['date'], + 'notes' => ['nullable', 'string'], + ]); + + $panen->update($validated); + return response()->json($panen); + } + + public function destroy(string $id): JsonResponse + { + Gate::authorize(['petani', 'fasilitator']); + Panen::findOrFail($id)->delete(); + return response()->json(null, 204); + } + + /** + * Digunakan untuk sinkronisasi massal dari data lokal (offline) + */ + public function batchUpsert(Request $request): JsonResponse + { + if (Gate::authorize(['petani', 'fasilitator','super_admin'])) { + abort(403); + } + $profileId = Auth::user()->profile->id; + + $validated = $request->validate([ + 'panens' => ['required', 'array'], + 'panens.*.id' => ['nullable', 'integer'], + 'panens.*.land_id' => ['required', 'integer'], + 'panens.*.plant_id' => ['required', 'integer'], + 'panens.*.commodity_name' => ['required', 'string'], + 'panens.*.weight_kg' => ['required', 'numeric'], + 'panens.*.harvest_date' => ['required', 'date'], + ]); + + $dataUpsert = []; + foreach ($validated['panens'] as $item) { + $dataUpsert[] = [ + 'id' => $item['id'] ?? null, + 'land_id' => $item['land_id'], + 'plant_id' => $item['plant_id'], + 'farmer_id' => $profileId, + 'commodity_name' => $item['commodity_name'], + 'weight_kg' => $item['weight_kg'], + 'harvest_date' => $item['harvest_date'], + 'sync_status' => 'synced', + 'created_at' => now(), + 'updated_at' => now(), + ]; + } + + // Melakukan upsert berdasarkan ID + Panen::upsert($dataUpsert, ['id'], [ + 'weight_kg', 'commodity_name', 'harvest_date', 'sync_status', 'updated_at' + ]); + + return response()->json(['status' => 'success'], 200); + } +} \ No newline at end of file diff --git a/app/Models/Map/Panen.php b/app/Models/Map/Panen.php index df007a2..47386c3 100644 --- a/app/Models/Map/Panen.php +++ b/app/Models/Map/Panen.php @@ -5,6 +5,8 @@ namespace App\Models\Map; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\BelongsTo; +use Illuminate\Database\Eloquent\Relations\BelongsToMany; +use Illuminate\Database\Eloquent\Relations\HasMany; use Illuminate\Database\Eloquent\SoftDeletes; class Panen extends Model @@ -18,11 +20,12 @@ class Panen extends Model * Atribut yang dapat diisi (mass assignable). */ protected $fillable = [ + 'uid', // PN-1234567890-1234567890-1234567890 (lahan-tanaman-panen) + // 'plant_id', + 'title', 'land_id', - 'plant_id', 'farmer_id', - 'commodity_name', - 'weight_kg', + 'land_description', 'harvest_date', 'notes', 'sync_status', @@ -41,12 +44,25 @@ class Panen extends Model { return $this->belongsTo(Lahan::class, 'land_id'); } - public function tanaman(): BelongsTo + public function detailKomoditas(): HasMany { - return $this->belongsTo(Tanaman::class, 'plant_id'); + return $this->hasMany(PanenKomoditas::class, 'panen_id'); + } + + public function tanamans(): BelongsToMany + { + return $this->belongsToMany(Tanaman::class, 'panen_komoditas', 'panen_id', 'plant_id') + ->using(PanenKomoditas::class) + ->withPivot(['uid', 'commodity_name', 'weight_kg', 'sync_status']) + ->withTimestamps(); } public function petani(): BelongsTo { return $this->belongsTo(\App\Models\Profile::class, 'farmer_id'); } + + public function panenTanaman(): HasMany + { + return $this->hasMany(PanenTanaman::class, 'panen_id', 'id'); + } } \ No newline at end of file diff --git a/app/Models/Map/PanenTanaman.php b/app/Models/Map/PanenTanaman.php new file mode 100644 index 0000000..b735a70 --- /dev/null +++ b/app/Models/Map/PanenTanaman.php @@ -0,0 +1,25 @@ +belongsTo(\App\Models\Map\Panen::class, 'panen_id', 'id'); + } +} diff --git a/database/migrations/2026_04_27_092223_create_panen_table.php b/database/migrations/2026_04_27_092223_create_panen_table.php index e03ded3..70b346c 100644 --- a/database/migrations/2026_04_27_092223_create_panen_table.php +++ b/database/migrations/2026_04_27_092223_create_panen_table.php @@ -8,11 +8,11 @@ return new class extends Migration { public function up(): void { Schema::create('map_panen', function (Blueprint $table) { $table->id(); + $table->string('uid')->unique()->nullable(); // Bagus untuk sinkronisasi Dexie offline + $table->string('title'); // Judul aktivitas panen $table->unsignedBigInteger('land_id')->nullable(); - $table->unsignedBigInteger('plant_id')->nullable(); $table->unsignedBigInteger('farmer_id')->nullable(); - $table->string('commodity_name'); - $table->double('weight_kg')->default(0); + $table->text('land_description')->nullable(); // Deskripsi kondisi lahan saat panen $table->date('harvest_date'); $table->text('notes')->nullable(); $table->string('sync_status')->default('pending'); diff --git a/database/migrations/2026_06_06_134032_create_panen_tanamen_table.php b/database/migrations/2026_06_06_134032_create_panen_tanamen_table.php new file mode 100644 index 0000000..9ab2c9a --- /dev/null +++ b/database/migrations/2026_06_06_134032_create_panen_tanamen_table.php @@ -0,0 +1,38 @@ +id(); + + $bluePrint->foreignId('panen_id') + ->constrained('panen') + ->onDelete('cascade'); + + $bluePrint->unsignedBigInteger('tanaman_id'); + $bluePrint->string('commodity_name'); + $bluePrint->string('sync_status', 50)->nullable()->default('synced'); + $bluePrint->decimal('weight_kg', 10, 2); // Menggunakan decimal agar mendukung angka pecahan (misal: 10.5 kg) + + $bluePrint->timestamps(); + $bluePrint->softDeletes(); // Menambahkan kolom deleted_at untuk fitur SoftDeletes + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('panen_tanamen'); + } +}; From d509a7957631eb508ca848adbe0f8c618dbd23ac Mon Sep 17 00:00:00 2001 From: SyaharaniSalsabilla Date: Mon, 8 Jun 2026 12:01:21 +0700 Subject: [PATCH 2/2] upadate produksi --- .../Web/Produktivitas/KualitasController.php | 162 ------------------ .../Web/Produktivitas/ProduksiController.php | 32 ++-- app/Models/Pertanian/Kualitas.php | 58 ------- app/Models/Pertanian/Produksi.php | 5 - ...026_06_05_000001_create_produksi_table.php | 2 +- ...026_06_05_000002_create_kualitas_table.php | 39 ----- resources/views/layout/sidebar.blade.php | 11 +- .../produktivitas/kualitas/_form.blade.php | 160 ----------------- .../produktivitas/kualitas/add.blade.php | 17 -- .../produktivitas/kualitas/edit.blade.php | 17 -- .../produktivitas/kualitas/index.blade.php | 128 -------------- .../produktivitas/kualitas/view.blade.php | 40 ----- .../produktivitas/produksi/_form.blade.php | 69 +++----- .../produktivitas/produksi/add.blade.php | 2 +- .../produktivitas/produksi/edit.blade.php | 2 +- .../produktivitas/produksi/index.blade.php | 34 ++-- .../produktivitas/produksi/view.blade.php | 15 +- routes/web.php | 1 - 18 files changed, 74 insertions(+), 720 deletions(-) delete mode 100644 app/Http/Controllers/Web/Produktivitas/KualitasController.php delete mode 100644 app/Models/Pertanian/Kualitas.php delete mode 100644 database/migrations/2026_06_05_000002_create_kualitas_table.php delete mode 100644 resources/views/produktivitas/kualitas/_form.blade.php delete mode 100644 resources/views/produktivitas/kualitas/add.blade.php delete mode 100644 resources/views/produktivitas/kualitas/edit.blade.php delete mode 100644 resources/views/produktivitas/kualitas/index.blade.php delete mode 100644 resources/views/produktivitas/kualitas/view.blade.php diff --git a/app/Http/Controllers/Web/Produktivitas/KualitasController.php b/app/Http/Controllers/Web/Produktivitas/KualitasController.php deleted file mode 100644 index 084571a..0000000 --- a/app/Http/Controllers/Web/Produktivitas/KualitasController.php +++ /dev/null @@ -1,162 +0,0 @@ -orderBy('created_at', 'desc'); - - if ($request->filled('search')) { - $query->where(function ($q) use ($request) { - $search = '%' . $request->search . '%'; - $q->where('grade', 'like', $search) - ->orWhere('pemeriksa', 'like', $search) - ->orWhereHas('profile', fn ($profile) => $profile->where('nama', 'like', $search)) - ->orWhereHas('komoditas', fn ($komoditas) => $komoditas->where('nama', 'like', $search)) - ->orWhereHas('produksi', fn ($produksi) => $produksi->where('kode_produksi', 'like', $search)); - }); - } - - if ($request->filled('status_kelayakan')) { - $query->where('status_kelayakan', $request->status_kelayakan); - } - - $kualitas = $query->paginate($request->per_page ?? 10); - - return view('produktivitas.kualitas.index', compact('kualitas')); - } - - public function create() - { - return view('produktivitas.kualitas.add', $this->formData()); - } - - public function store(Request $request) - { - $validator = $this->validator($request); - - if ($validator->fails()) { - return back()->withErrors($validator)->withInput(); - } - - Kualitas::create($this->payload($request) + [ - 'created_by' => auth()->id(), - 'updated_by' => auth()->id(), - ]); - - return redirect()->route('kualitas.index')->with('success', 'Data kualitas berhasil ditambahkan.'); - } - - public function show($id) - { - $kualitas = Kualitas::with(['produksi', 'profile', 'lahan', 'komoditas'])->findOrFail($id); - - return view('produktivitas.kualitas.view', compact('kualitas')); - } - - public function edit($id) - { - $kualitas = Kualitas::findOrFail($id); - - return view('produktivitas.kualitas.edit', $this->formData() + compact('kualitas')); - } - - public function update(Request $request, $id) - { - $validator = $this->validator($request); - - if ($validator->fails()) { - return back()->withErrors($validator)->withInput(); - } - - $kualitas = Kualitas::findOrFail($id); - $kualitas->update($this->payload($request) + [ - 'updated_by' => auth()->id(), - ]); - - return redirect()->route('kualitas.index')->with('success', 'Data kualitas berhasil diperbarui.'); - } - - public function destroy($id) - { - $kualitas = Kualitas::findOrFail($id); - $kualitas->update(['deleted_by' => auth()->id()]); - $kualitas->delete(); - - return response()->json(['status' => 'success', 'message' => 'Data kualitas berhasil dihapus.']); - } - - private function formData(): array - { - return [ - 'produksi' => Produksi::with(['komoditas', 'profile'])->orderBy('created_at', 'desc')->get(), - 'profiles' => Profile::where('role', Role::PETANI->value)->orderBy('nama')->get(), - 'lahan' => Lahan::whereHas('profile', function ($query) { - $query->where('role', Role::PETANI->value); - })->orderBy('nama')->get(), - 'komoditas' => Komoditas::orderBy('nama')->get(), - ]; - } - - private function validator(Request $request) - { - return Validator::make($request->all(), [ - 'produksi_id' => ['nullable', 'exists:produksi,id'], - 'profile_id' => [ - 'required', - Rule::exists('profiles', 'id')->where('role', Role::PETANI->value), - ], - 'lahan_id' => [ - 'required', - Rule::exists('map_lahan', 'id')->where('profile_id', $request->profile_id), - ], - 'komoditas_id' => ['required', 'exists:master_komoditas,id'], - 'tanggal_pemeriksaan' => ['nullable', 'date'], - 'grade' => ['required', 'string', 'max:50'], - 'kadar_air' => ['nullable', 'numeric', 'min:0'], - 'berat_bersih' => ['nullable', 'numeric', 'min:0'], - 'berat_rusak' => ['nullable', 'numeric', 'min:0'], - 'standar_mutu' => ['nullable', 'string', 'max:255'], - 'status_kelayakan' => ['required', 'in:layak,perlu_sortir,tidak_layak'], - 'pemeriksa' => ['nullable', 'string', 'max:255'], - 'catatan' => ['nullable', 'string'], - ]); - } - - private function payload(Request $request): array - { - $beratBersih = (float) $request->berat_bersih; - $beratRusak = (float) $request->berat_rusak; - - return [ - 'produksi_id' => $request->produksi_id, - 'profile_id' => $request->profile_id, - 'lahan_id' => $request->lahan_id, - 'komoditas_id' => $request->komoditas_id, - 'tanggal_pemeriksaan' => $request->tanggal_pemeriksaan, - 'grade' => $request->grade, - 'kadar_air' => $request->kadar_air, - 'berat_bersih' => $request->berat_bersih, - 'berat_rusak' => $request->berat_rusak, - 'persentase_kerusakan' => $beratBersih > 0 ? round(($beratRusak / $beratBersih) * 100, 2) : null, - 'standar_mutu' => $request->standar_mutu, - 'status_kelayakan' => $request->status_kelayakan, - 'pemeriksa' => $request->pemeriksa, - 'catatan' => $request->catatan, - ]; - } -} diff --git a/app/Http/Controllers/Web/Produktivitas/ProduksiController.php b/app/Http/Controllers/Web/Produktivitas/ProduksiController.php index c90b825..d7e387b 100644 --- a/app/Http/Controllers/Web/Produktivitas/ProduksiController.php +++ b/app/Http/Controllers/Web/Produktivitas/ProduksiController.php @@ -7,7 +7,6 @@ use App\Enums\Role; use App\Models\Pertanian\Komoditas; use App\Models\Pertanian\Lahan; use App\Models\Pertanian\Produksi; -use App\Models\Pertanian\Tanaman; use App\Models\Profile; use Illuminate\Http\Request; use Illuminate\Support\Facades\Validator; @@ -17,7 +16,7 @@ class ProduksiController extends Controller { public function index(Request $request) { - $query = Produksi::with(['profile', 'lahan', 'tanaman', 'komoditas']) + $query = Produksi::with(['profile', 'lahan', 'komoditas']) ->orderBy('created_at', 'desc'); if ($request->filled('search')) { @@ -35,9 +34,14 @@ class ProduksiController extends Controller $query->where('status_panen', $request->status_panen); } - $produksi = $query->paginate($request->per_page ?? 10); + if ($request->filled('komoditas_id')) { + $query->where('komoditas_id', $request->komoditas_id); + } - return view('produktivitas.produksi.index', compact('produksi')); + $produksi = $query->paginate($request->per_page ?? 10); + $komoditas = Komoditas::orderBy('nama')->get(); + + return view('produktivitas.produksi.index', compact('produksi', 'komoditas')); } public function create() @@ -58,12 +62,12 @@ class ProduksiController extends Controller 'updated_by' => auth()->id(), ]); - return redirect()->route('produksi.index')->with('success', 'Data produksi berhasil ditambahkan.'); + return redirect()->route('produksi.index')->with('success', 'Data hasil panen berhasil ditambahkan.'); } public function show($id) { - $produksi = Produksi::with(['profile', 'lahan', 'tanaman', 'komoditas', 'kualitas'])->findOrFail($id); + $produksi = Produksi::with(['profile', 'lahan', 'komoditas'])->findOrFail($id); return view('produktivitas.produksi.view', compact('produksi')); } @@ -88,7 +92,7 @@ class ProduksiController extends Controller 'updated_by' => auth()->id(), ]); - return redirect()->route('produksi.index')->with('success', 'Data produksi berhasil diperbarui.'); + return redirect()->route('produksi.index')->with('success', 'Data hasil panen berhasil diperbarui.'); } public function destroy($id) @@ -97,7 +101,7 @@ class ProduksiController extends Controller $produksi->update(['deleted_by' => auth()->id()]); $produksi->delete(); - return response()->json(['status' => 'success', 'message' => 'Data produksi berhasil dihapus.']); + return response()->json(['status' => 'success', 'message' => 'Data hasil panen berhasil dihapus.']); } private function formData(): array @@ -107,7 +111,6 @@ class ProduksiController extends Controller 'lahan' => Lahan::whereHas('profile', function ($query) { $query->where('role', Role::PETANI->value); })->orderBy('nama')->get(), - 'tanaman' => Tanaman::with('komoditas')->orderBy('nama')->get(), 'komoditas' => Komoditas::orderBy('nama')->get(), ]; } @@ -124,15 +127,14 @@ class ProduksiController extends Controller 'required', Rule::exists('map_lahan', 'id')->where('profile_id', $request->profile_id), ], - 'tanaman_id' => ['nullable', 'exists:map_tanaman,id'], 'komoditas_id' => ['required', 'exists:master_komoditas,id'], 'periode' => ['nullable', 'string', 'max:255'], - 'tanggal_panen' => ['nullable', 'date'], + 'tanggal_panen' => ['required', 'date'], 'luas_tanam' => ['nullable', 'numeric', 'min:0'], 'luas_panen' => ['nullable', 'numeric', 'min:0'], - 'jumlah_panen' => ['nullable', 'numeric', 'min:0'], + 'jumlah_panen' => ['required', 'numeric', 'min:0'], 'satuan' => ['required', 'string', 'max:20'], - 'status_panen' => ['required', 'in:belum_panen,panen_sebagian,selesai'], + 'status_panen' => ['nullable', 'in:panen_sebagian,selesai'], 'catatan' => ['nullable', 'string'], ]); } @@ -146,7 +148,7 @@ class ProduksiController extends Controller 'kode_produksi' => $request->kode_produksi, 'profile_id' => $request->profile_id, 'lahan_id' => $request->lahan_id, - 'tanaman_id' => $request->tanaman_id, + 'tanaman_id' => null, 'komoditas_id' => $request->komoditas_id, 'periode' => $request->periode, 'tanggal_panen' => $request->tanggal_panen, @@ -155,7 +157,7 @@ class ProduksiController extends Controller 'jumlah_panen' => $request->jumlah_panen, 'satuan' => $request->satuan, 'produktivitas' => $luasPanen > 0 ? round($jumlahPanen / $luasPanen, 2) : null, - 'status_panen' => $request->status_panen, + 'status_panen' => $request->status_panen ?? 'selesai', 'catatan' => $request->catatan, ]; } diff --git a/app/Models/Pertanian/Kualitas.php b/app/Models/Pertanian/Kualitas.php deleted file mode 100644 index 062d782..0000000 --- a/app/Models/Pertanian/Kualitas.php +++ /dev/null @@ -1,58 +0,0 @@ - 'date', - ]; - - public function produksi() - { - return $this->belongsTo(Produksi::class, 'produksi_id'); - } - - public function profile() - { - return $this->belongsTo(Profile::class, 'profile_id'); - } - - public function lahan() - { - return $this->belongsTo(Lahan::class, 'lahan_id'); - } - - public function komoditas() - { - return $this->belongsTo(Komoditas::class, 'komoditas_id'); - } -} diff --git a/app/Models/Pertanian/Produksi.php b/app/Models/Pertanian/Produksi.php index ce1cab2..9d54818 100644 --- a/app/Models/Pertanian/Produksi.php +++ b/app/Models/Pertanian/Produksi.php @@ -55,9 +55,4 @@ class Produksi extends Model { return $this->belongsTo(Komoditas::class, 'komoditas_id'); } - - public function kualitas() - { - return $this->hasMany(Kualitas::class, 'produksi_id'); - } } diff --git a/database/migrations/2026_06_05_000001_create_produksi_table.php b/database/migrations/2026_06_05_000001_create_produksi_table.php index 4055c25..364c56c 100644 --- a/database/migrations/2026_06_05_000001_create_produksi_table.php +++ b/database/migrations/2026_06_05_000001_create_produksi_table.php @@ -22,7 +22,7 @@ return new class extends Migration $table->decimal('jumlah_panen', 12, 2)->nullable(); $table->string('satuan', 20)->default('kg'); $table->decimal('produktivitas', 12, 2)->nullable(); - $table->string('status_panen')->default('belum_panen'); + $table->string('status_panen')->default('selesai'); $table->text('catatan')->nullable(); $table->foreignId('created_by')->nullable()->constrained('users')->onDelete('set null'); $table->foreignId('updated_by')->nullable()->constrained('users')->onDelete('set null'); diff --git a/database/migrations/2026_06_05_000002_create_kualitas_table.php b/database/migrations/2026_06_05_000002_create_kualitas_table.php deleted file mode 100644 index 69101d9..0000000 --- a/database/migrations/2026_06_05_000002_create_kualitas_table.php +++ /dev/null @@ -1,39 +0,0 @@ -id(); - $table->foreignId('produksi_id')->nullable()->constrained('produksi')->onDelete('set null'); - $table->foreignId('profile_id')->nullable()->constrained('profiles')->onDelete('set null'); - $table->foreignId('lahan_id')->nullable()->constrained('map_lahan')->onDelete('set null'); - $table->foreignId('komoditas_id')->nullable()->constrained('master_komoditas')->onDelete('set null'); - $table->date('tanggal_pemeriksaan')->nullable(); - $table->string('grade')->nullable(); - $table->decimal('kadar_air', 8, 2)->nullable(); - $table->decimal('berat_bersih', 12, 2)->nullable(); - $table->decimal('berat_rusak', 12, 2)->nullable(); - $table->decimal('persentase_kerusakan', 8, 2)->nullable(); - $table->string('standar_mutu')->nullable(); - $table->string('status_kelayakan')->default('layak'); - $table->string('pemeriksa')->nullable(); - $table->text('catatan')->nullable(); - $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(); - }); - } - - public function down(): void - { - Schema::dropIfExists('kualitas'); - } -}; diff --git a/resources/views/layout/sidebar.blade.php b/resources/views/layout/sidebar.blade.php index 144fff4..e31ecce 100644 --- a/resources/views/layout/sidebar.blade.php +++ b/resources/views/layout/sidebar.blade.php @@ -88,7 +88,7 @@ -