stuntingCalculator = app()->make('App\Services\StuntingCalculator'); } catch (\Throwable $e) { // Buat manual jika injeksi gagal require_once app_path('Services/StuntingCalculator.php'); $this->stuntingCalculator = new \App\Services\StuntingCalculator(); } } /** * Get all stunting records for a specific child */ public function getByAnakId($anak_id) { $anak = Anak::find($anak_id); if (!$anak) { return response()->json([ 'status' => 'error', 'message' => 'Data anak tidak ditemukan', ], 404); } $stunting = Stunting::with('perkembangan') ->where('anak_id', $anak_id) ->orderBy('tanggal', 'desc') ->get(); return response()->json([ 'status' => 'success', 'stunting' => $stunting, ]); } /** * Get a specific stunting record */ public function show($id) { $stunting = Stunting::with('perkembangan')->find($id); if (!$stunting) { return response()->json([ 'status' => 'error', 'message' => 'Data stunting tidak ditemukan', ], 404); } return response()->json([ 'status' => 'success', 'stunting' => $stunting, ]); } /** * Calculate stunting status based on age, height, and weight */ public function calculateStatus(Request $request) { $validator = Validator::make($request->all(), [ 'usia' => 'required|string', 'tinggi_badan' => 'required|numeric', 'berat_badan' => 'required|numeric', ]); if ($validator->fails()) { return response()->json([ 'status' => 'error', 'message' => 'Validation error', 'errors' => $validator->errors() ], 422); } // Extract usia dalam bulan $ageInMonths = $this->stuntingCalculator->extractAgeInMonths($request->usia); // Jika usia kurang dari 24 bulan atau lebih dari 60 bulan if ($ageInMonths < 24 || $ageInMonths > 60) { return response()->json([ 'status' => 'error', 'message' => 'Usia harus antara 24-60 bulan untuk perhitungan stunting', ], 422); } // Hitung status stunting $statusByHeight = $this->stuntingCalculator->determineStatusByHeight( $ageInMonths, $request->tinggi_badan ); $statusByWeight = $this->stuntingCalculator->determineStatusByWeight( $ageInMonths, $request->berat_badan ); $finalStatus = $this->stuntingCalculator->determineStatus( $ageInMonths, $request->tinggi_badan, $request->berat_badan ); return response()->json([ 'status' => 'success', 'usia_bulan' => $ageInMonths, 'tinggi_badan' => $request->tinggi_badan, 'berat_badan' => $request->berat_badan, 'status_by_height' => $statusByHeight, 'status_by_weight' => $statusByWeight, 'final_status' => $finalStatus, ]); } /** * Create a new stunting record */ public function store(Request $request) { $validator = Validator::make($request->all(), [ 'anak_id' => 'required|exists:anak,id', 'tanggal' => 'required|date', 'usia' => 'required|string', 'catatan' => 'nullable|string', 'status' => 'nullable|in:Stunting,Resiko Stunting,Tidak Stunting', 'perkembangan_id' => 'required|exists:perkembangan_anak,id', ]); if ($validator->fails()) { return response()->json([ 'status' => 'error', 'message' => 'Validation error', 'errors' => $validator->errors() ], 422); } // Get perkembangan for height and weight $perkembangan = PerkembanganAnak::findOrFail($request->perkembangan_id); // Extract usia dalam bulan $ageInMonths = $this->stuntingCalculator->extractAgeInMonths($request->usia); // Calculate stunting status $calculatedStatus = $this->stuntingCalculator->determineStatus( $ageInMonths, $perkembangan->tinggi_badan, $perkembangan->berat_badan ); // Use provided status or calculated status $data = $request->all(); $data['status'] = $request->status ?? $calculatedStatus; $data['tinggi_badan'] = $perkembangan->tinggi_badan; $data['berat_badan'] = $perkembangan->berat_badan; $stunting = Stunting::create($data); return response()->json([ 'status' => 'success', 'message' => 'Data stunting berhasil ditambahkan', 'stunting' => $stunting, 'calculated_status' => $calculatedStatus ], 201); } /** * Update a stunting record */ public function update(Request $request, $id) { $stunting = Stunting::find($id); if (!$stunting) { return response()->json([ 'status' => 'error', 'message' => 'Data stunting tidak ditemukan', ], 404); } $validator = Validator::make($request->all(), [ 'tanggal' => 'required|date', 'usia' => 'required|string', 'catatan' => 'nullable|string', 'status' => 'nullable|in:Stunting,Resiko Stunting,Tidak Stunting', 'perkembangan_id' => 'required|exists:perkembangan_anak,id', ]); if ($validator->fails()) { return response()->json([ 'status' => 'error', 'message' => 'Validation error', 'errors' => $validator->errors() ], 422); } // Get perkembangan for height and weight $perkembangan = PerkembanganAnak::findOrFail($request->perkembangan_id); // Extract usia dalam bulan $ageInMonths = $this->stuntingCalculator->extractAgeInMonths($request->usia); // Calculate stunting status $calculatedStatus = $this->stuntingCalculator->determineStatus( $ageInMonths, $perkembangan->tinggi_badan, $perkembangan->berat_badan ); // Get data to update $data = $request->all(); $data['status'] = $request->status ?? $calculatedStatus; $data['tinggi_badan'] = $perkembangan->tinggi_badan; $data['berat_badan'] = $perkembangan->berat_badan; $stunting->update($data); return response()->json([ 'status' => 'success', 'message' => 'Data stunting berhasil diperbarui', 'stunting' => $stunting, 'calculated_status' => $calculatedStatus ]); } /** * Delete a stunting record */ public function destroy($id) { $stunting = Stunting::find($id); if (!$stunting) { return response()->json([ 'status' => 'error', 'message' => 'Data stunting tidak ditemukan', ], 404); } $stunting->delete(); return response()->json([ 'status' => 'success', 'message' => 'Data stunting berhasil dihapus', ]); } }