From 0f086387c9bcd7eb22dabbbe2d9c60eb2dad32db Mon Sep 17 00:00:00 2001 From: "fauzgabriel@gmail.com" Date: Wed, 11 Mar 2026 11:37:36 +0700 Subject: [PATCH] Distribusi --- .../Api/DistributionController.php | 117 ++++++++++++++++++ app/Models/Distribusi/Distribution.php | 31 +++++ routes/api.php | 8 ++ 3 files changed, 156 insertions(+) create mode 100644 app/Http/Controllers/Api/DistributionController.php create mode 100644 app/Models/Distribusi/Distribution.php diff --git a/app/Http/Controllers/Api/DistributionController.php b/app/Http/Controllers/Api/DistributionController.php new file mode 100644 index 0000000..c7eded3 --- /dev/null +++ b/app/Http/Controllers/Api/DistributionController.php @@ -0,0 +1,117 @@ +role === 'petani') { + $query->where('farmer_id', $user->profile->id); + } + + return response()->json($query->get()); + } + + public function store(Request $request): JsonResponse + { + Gate::authorize('petani'); + + $validated = $request->validate([ + 'offtaker_id' => 'required|uuid', + 'commodity_name' => 'required|string', + 'quantity_kg' => 'required|numeric', + 'farmer_grade' => 'nullable|string', + 'distribution_date' => 'required|date', + ]); + + $distribution = Distribution::create(array_merge($validated, [ + 'farmer_id' => Auth::user()->profile->id, + 'farmer_name' => Auth::user()->name, + 'status' => 'pending', + 'sync_status' => 'synced', + 'created_date' => now() + ])); + + return response()->json($distribution, 201); + } + + public function update(Request $request, string $id): JsonResponse + { + // Biasanya Admin atau Offtaker yang melakukan update grade/price + Gate::authorize('super_admin'); + + $distribution = Distribution::findOrFail($id); + + $validated = $request->validate([ + 'offtaker_grade' => 'required|string', + 'grade_difference_reason' => 'nullable|string', + 'price_per_kg' => 'required|numeric', + 'status' => 'required|string', // e.g., 'graded' + 'received_date' => 'required|date', + ]); + + $totalValue = $validated['price_per_kg'] * $distribution->quantity_kg; + + $distribution->update(array_merge($validated, [ + 'total_value' => $totalValue, + 'updated_date' => now() + ])); + + return response()->json($distribution); + } + + public function batchUpsert(Request $request): JsonResponse +{ + Gate::authorize('any', ['super_admin', 'petani']); + + $validated = $request->validate([ + 'distributions' => ['required', 'array'], + 'distributions.*.farmer_id' => ['required', 'uuid'], + 'distributions.*.offtaker_id' => ['required', 'uuid'], + 'distributions.*.commodity_name' => ['required', 'string'], + 'distributions.*.quantity_kg' => ['required', 'numeric'], + ]); + + $dataUpsert = []; + foreach ($validated['distributions'] as $item) { + $dataUpsert[] = [ + 'id' => $item['id'] ?? null, // Jika NULL, Postgres akan membuat ID baru + 'farmer_id' => $item['farmer_id'], + 'farmer_name' => $item['farmer_name'] ?? null, + 'offtaker_id' => $item['offtaker_id'], + 'offtaker_name' => $item['offtaker_name'] ?? null, + 'commodity_name' => $item['commodity_name'], + 'quantity_kg' => $item['quantity_kg'], + 'farmer_grade' => $item['farmer_grade'] ?? null, + 'offtaker_grade' => $item['offtaker_grade'] ?? null, + 'status' => $item['status'] ?? 'graded', + 'sync_status' => 'synced', + 'created_at' => now(), + 'updated_at' => now(), + ]; + } + + // Upsert berdasarkan ID bigint + Distribution::upsert($dataUpsert, ['id'], [ + 'quantity_kg', 'offtaker_grade', 'status', 'sync_status', 'updated_at' + ]); + + return response()->json(['status' => 'success']); +} +} \ No newline at end of file diff --git a/app/Models/Distribusi/Distribution.php b/app/Models/Distribusi/Distribution.php new file mode 100644 index 0000000..b2b727b --- /dev/null +++ b/app/Models/Distribusi/Distribution.php @@ -0,0 +1,31 @@ + 'float', + 'price_per_kg' => 'float', + 'total_value' => 'float', + 'created_date' => 'datetime', + 'updated_date' => 'datetime', + ]; +} \ No newline at end of file diff --git a/routes/api.php b/routes/api.php index cabb5fa..0747401 100644 --- a/routes/api.php +++ b/routes/api.php @@ -34,6 +34,14 @@ Route::apiResource('/offtaker', \App\Http\Controllers\Api\OfftakerController::class)->except(['create', 'edit']); }); +Route::middleware('auth:sanctum') + ->name('distribusi.') + ->prefix('distribusi') + ->group(function () { + + Route::apiResource('/lahan', \App\Http\Controllers\Api\DistributionController::class)->except(['create', 'edit']); +}); + Route::middleware('auth:sanctum') ->name('master.') ->prefix('master')