From 6568eb8f1eb5436fde4017dac7a549ab47c2b3cf Mon Sep 17 00:00:00 2001 From: "fauzgabriel@gmail.com" Date: Wed, 11 Mar 2026 11:01:55 +0700 Subject: [PATCH] Offtaker --- .../Controllers/Api/OfftakerController.php | 123 ++++++++++++++++++ app/Http/Controllers/Api/PanenController.php | 3 +- app/Models/Map/Offtaker.php | 25 ++++ routes/api.php | 1 + 4 files changed, 150 insertions(+), 2 deletions(-) create mode 100644 app/Http/Controllers/Api/OfftakerController.php create mode 100644 app/Models/Map/Offtaker.php diff --git a/app/Http/Controllers/Api/OfftakerController.php b/app/Http/Controllers/Api/OfftakerController.php new file mode 100644 index 0000000..e3f6185 --- /dev/null +++ b/app/Http/Controllers/Api/OfftakerController.php @@ -0,0 +1,123 @@ +json($listOfftaker); + } + + public function store(Request $request): JsonResponse + { + Gate::authorize('super_admin'); + + $validated = $request->validate([ + 'user_email' => ['required', 'email', 'max:255'], + 'company_name' => ['required', 'string', 'max:255'], + 'contact_name' => ['nullable', 'string', 'max:255'], + 'phone' => ['nullable', 'string', 'max:20'], + 'address' => ['nullable', 'string'], + 'is_active' => ['nullable', 'boolean'], + ]); + + $offtaker = Offtaker::create([ + 'user_email' => $validated['user_email'], + 'company_name' => $validated['company_name'], + 'contact_name' => $validated['contact_name'] ?? null, + 'phone' => $validated['phone'] ?? null, + 'address' => $validated['address'] ?? null, + 'is_active' => $validated['is_active'] ?? true, + 'sync_status' => 'synced', + 'created_date' => now(), + ]); + + return response()->json($offtaker, 201); + } + + public function show(string $id): JsonResponse + { + Gate::authorize('super_admin'); + $offtaker = Offtaker::findOrFail($id); + return response()->json($offtaker); + } + + public function update(Request $request, string $id): JsonResponse + { + Gate::authorize('super_admin'); + $offtaker = Offtaker::findOrFail($id); + + $validated = $request->validate([ + 'user_email' => ['email', 'max:255'], + 'company_name' => ['string', 'max:255'], + 'contact_name' => ['nullable', 'string'], + 'phone' => ['nullable', 'string'], + 'address' => ['nullable', 'string'], + 'is_active' => ['boolean'], + ]); + + $offtaker->update($validated); + return response()->json($offtaker); + } + + public function destroy(string $id): JsonResponse + { + Gate::authorize('super_admin'); + // Menggunakan Soft Delete (Eloquent otomatis handle karena ada trait SoftDeletes di model) + Offtaker::findOrFail($id)->delete(); + + return response()->json(null, 204); + } + + /** + * Digunakan untuk sinkronisasi massal dari data lokal (offline) + */ + public function batchUpsert(Request $request): JsonResponse + { + Gate::authorize('super_admin'); + + $validated = $request->validate([ + 'offtakers' => ['required', 'array'], + 'offtakers.*.id' => ['nullable', 'integer'], + 'offtakers.*.user_email' => ['required', 'email'], + 'offtakers.*.company_name' => ['required', 'string'], + 'offtakers.*.contact_name' => ['nullable', 'string'], + 'offtakers.*.phone' => ['nullable', 'string'], + 'offtakers.*.address' => ['nullable', 'string'], + ]); + + $dataUpsert = []; + foreach ($validated['offtakers'] as $item) { + $dataUpsert[] = [ + 'id' => $item['id'] ?? null, + 'user_email' => $item['user_email'], + 'company_name' => $item['company_name'], + 'contact_name' => $item['contact_name'] ?? null, + 'phone' => $item['phone'] ?? null, + 'address' => $item['address'] ?? null, + 'sync_status' => 'synced', + 'is_active' => true, + 'created_at' => now(), + 'updated_at' => now(), + ]; + } + + // Melakukan upsert berdasarkan ID + Offtaker::upsert($dataUpsert, ['id'], [ + 'user_email', 'company_name', 'contact_name', 'phone', 'address', 'sync_status', 'updated_at' + ]); + + return response()->json(['status' => 'success'], 200); + } +} \ No newline at end of file diff --git a/app/Http/Controllers/Api/PanenController.php b/app/Http/Controllers/Api/PanenController.php index 69d4cb1..0a08a43 100644 --- a/app/Http/Controllers/Api/PanenController.php +++ b/app/Http/Controllers/Api/PanenController.php @@ -17,9 +17,8 @@ public function index(): JsonResponse Gate::authorize('petani'); $user = Auth::user(); - // Mengasumsikan farmer_id di data panen merujuk pada profile->id atau user_id $listPanen = Panen::where('farmer_id', $user->profile->id)->get(); - + return response()->json($listPanen); } diff --git a/app/Models/Map/Offtaker.php b/app/Models/Map/Offtaker.php new file mode 100644 index 0000000..d8e92a8 --- /dev/null +++ b/app/Models/Map/Offtaker.php @@ -0,0 +1,25 @@ +except(['create', 'edit']); Route::apiResource('/inspeksi', \App\Http\Controllers\Api\InspeksiController::class)->except(['create', 'edit']); Route::apiResource('/panen', \App\Http\Controllers\Api\PanenController::class)->except(['create', 'edit']); + Route::apiResource('/offtaker', \App\Http\Controllers\Api\OfftakerController::class)->except(['create', 'edit']); }); Route::middleware('auth:sanctum')