applyPenalty(); $bill = $generateMonthlyBill->generateAutoBill(); $paymentType = PaymentType::pluck('payment_type'); $nominal = PaymentType::pluck('nominal'); $paymentPenalties = DetailPayment::with('paymentType') ->get() ->pluck('penalty', 'type_id'); $santri = User::with([ 'payments.detailPayments.paymentType', ])->paginate(2); return Inertia::render('list-admin/payment/ManualPayment', [ 'santri' => $santri->items(), 'penalty' => $penalty, 'bill' => $bill, 'fields' => [ 'nis' => ['type' => 'text', 'readonly' => true], 'nama' => ['type' => 'text', 'readonly' => true], 'status_santri' => ['type' => 'text', 'readonly' => true], ], 'options' => [ 'payment_type' => $paymentType, 'payment_nominal' => $nominal, 'payment_penalty' => $paymentPenalties ] ]); } public function manualPayment(Request $request, $paymentId) { try { DB::beginTransaction(); $range = (int) $request->input('range'); $userId = $request->id; $typeId = $request->input('type_id'); $existingPayment = Payment::where('user_id', $userId) ->where('payment_status', 'pending') ->first(); $unpaidDetails = $existingPayment ? DetailPayment::where('payment_id', $existingPayment->id) ->where('status', 'unpaid') ->orderBy('payment_year') ->orderBy('payment_month') ->get() : collect(); if ($existingPayment && $unpaidDetails->count() > 0) { $totalAmount = 0; $toPay = $unpaidDetails->take($range); $jumlahUnpaid = $toPay->count(); foreach ($toPay as $detail) { $nominal = PaymentType::where('id', $detail->type_id)->value('nominal') ?? 0; $penalty = $detail->penalty ?? 0; $total = $nominal + $penalty; $detail->update([ 'status' => 'paid', 'amount' => $nominal, 'penalty' => $penalty, ]); $totalAmount += $total; } $sisa = $range - $jumlahUnpaid; $bulan = $unpaidDetails->last()?->payment_month ?? now()->month; $tahun = $unpaidDetails->last()?->payment_year ?? now()->year; for ($i = 0; $i < $sisa; $i++) { $bulan++; if ($bulan > 12) { $bulan = 1; $tahun++; } $nominal = PaymentType::where('id', $typeId)->value('nominal') ?? 0; DetailPayment::create([ 'payment_id' => $existingPayment->id, 'payment_month' => $bulan, 'payment_year' => $tahun, 'amount' => $nominal, 'penalty' => 0, 'status' => 'paid', 'type_id' => $typeId, ]); $totalAmount += $nominal; } $existingPayment->update([ 'amount_payment' => DetailPayment::where('payment_id', $existingPayment->id)->sum('amount'), 'payment_status' => DetailPayment::where('payment_id', $existingPayment->id)->where('status', 'unpaid')->exists() ? 'pending' : 'success', ]); DB::commit(); return redirect()->back()->with('success', 'Pembayaran berhasil menggunakan data existing'); } $newPayment = Payment::create([ 'payment_status' => 'success', 'amount_payment' => 0, 'bank' => null, 'no_va' => null, 'expired_at' => null, 'user_id' => $userId, ]); $bulan = now()->month; $tahun = now()->year; $nominal = PaymentType::where('id', $typeId)->value('nominal') ?? 0; $totalAmount = 0; for ($i = 0; $i < $range; $i++) { DetailPayment::create([ 'payment_id' => $newPayment->id, 'payment_month' => $bulan, 'payment_year' => $tahun, 'amount' => $nominal, 'penalty' => 0, 'status' => 'paid', 'type_id' => $typeId, ]); $totalAmount += $nominal; $bulan++; if ($bulan > 12) { $bulan = 1; $tahun++; } } $newPayment->update([ 'amount_payment' => $totalAmount, ]); DB::commit(); dd($newPayment); return redirect()->back()->with('success', 'Pembayaran baru berhasil dibuat'); } catch (Exception $e) { DB::rollBack(); return dd('Error:', $e->getMessage()); } } }