applyPenalty(); $bill = $generateMonthlyBill->generateAutoBill(); $paymentType = PaymentType::pluck('payment_type'); $nominal = PaymentType::pluck('nominal'); $paymentPenalties = DetailPayment::with('paymentType') ->get() ->pluck('penalty', 'type_id'); $santri = Santri::with([ 'payments.detailPayments.paymentType', 'user' ])->get(); return Inertia::render('list-admin/payment/ManualPayment', [ 'santri' => $santri, 'penalty' => $penalty, 'bill' => $bill, 'fields' => [ 'nis' => 'text', 'nama' => 'text', 'status_santri' => 'text', 'role_santri' => 'text', // 'total_penalty' => 'text', // 'amount_payment' => 'text', // 'nominal' => 'text', // 'payment_type' => 'select', ], 'options' => [ 'payment_type' => $paymentType, 'payment_nominal' => $nominal, 'payment_penalty' => $paymentPenalties ] ]); } public function manualPayment(Request $request, $paymentId) { // $request->validate([ // 'range' => 'required|integer|min:1', // ], [ // 'range.required' => 'Jumlah bulan pembayaran harus diisi.', // 'range.integer' => 'Jumlah bulan pembayaran harus berupa angka.', // 'range.min' => 'Minimal pembayaran adalah 1 bulan.', // ]); try { DB::beginTransaction(); $range = (int) $request->input('range'); $payment = Payment::find($paymentId); $unpaidDetails = DetailPayment::where('payment_id', $paymentId) ->where('status', 'unpaid') ->orderBy('payment_year', 'asc') ->orderBy('payment_month', 'asc') ->get(); $jumlahUnpaid = $unpaidDetails->count(); $totalAmount = 0; if ($jumlahUnpaid >= $range) { foreach ($unpaidDetails->take($range) as $detail) { $total = $detail->amount + $detail->penalty; $detail->update([ 'status' => 'paid' ]); $totalAmount += $total; } } else { foreach ($unpaidDetails as $detail) { $total = $detail->amount + $detail->penalty; $detail->update([ 'status' => 'paid' ]); $totalAmount += $total; } $sisa = $range - $jumlahUnpaid; $latestUnpaid = $unpaidDetails->last(); $bulanTerakhir = $latestUnpaid ? $latestUnpaid->payment_month : now()->month; $tahunTerakhir = $latestUnpaid ? $latestUnpaid->payment_year : now()->year; $typeId = $latestUnpaid ? $latestUnpaid->type_id : PaymentType::first()->id; $nominal = PaymentType::where('id', $typeId)->value('nominal'); for ($i = 1; $i <= $sisa; $i++) { $bulanTerakhir++; if ($bulanTerakhir > 12) { $bulanTerakhir = 1; $tahunTerakhir++; } $penalty = 0; $totalAmount += $nominal + $penalty; DetailPayment::create([ 'payment_id' => $paymentId, 'payment_month' => $bulanTerakhir, 'payment_year' => $tahunTerakhir, 'amount' => $nominal, 'penalty' => $penalty, 'status' => 'paid', 'type_id' => $typeId ]); } } $payment->update([ 'amount_payment' => $totalAmount ]); DB::commit(); // return redirect()->back()->with('success', 'Berhasil Melakukan Pembayaran'); // return $request->all(); return $payment; } catch (Exception $e) { DB::rollBack(); // return redirect()->back()->with('error', $e->getMessage()); return $e->getMessage(); } } }