payment phase 3

This commit is contained in:
alealien666 2025-05-08 15:45:59 +07:00
parent 260942462c
commit 8617fce4aa
2 changed files with 130 additions and 98 deletions

View File

@ -21,8 +21,7 @@ public function indexManualPayment(cekDenda $cekDenda, GenerateMonthlyBill $gene
$penalty = $cekDenda->applyPenalty(); $penalty = $cekDenda->applyPenalty();
$bill = $generateMonthlyBill->generateAutoBill(); $bill = $generateMonthlyBill->generateAutoBill();
$paymentType = PaymentType::pluck('payment_type'); $paymentTypes = PaymentType::get(['id', 'payment_type', 'nominal']);
$nominal = PaymentType::pluck('nominal');
$paymentPenalties = DetailPayment::with('paymentType') $paymentPenalties = DetailPayment::with('paymentType')
->get() ->get()
@ -30,7 +29,7 @@ public function indexManualPayment(cekDenda $cekDenda, GenerateMonthlyBill $gene
$santri = User::with([ $santri = User::with([
'payments.detailPayments.paymentType', 'payments.detailPayments.paymentType',
])->paginate(2); ])->paginate(10);
return Inertia::render('list-admin/payment/ManualPayment', [ return Inertia::render('list-admin/payment/ManualPayment', [
'santri' => $santri->items(), 'santri' => $santri->items(),
@ -42,8 +41,8 @@ public function indexManualPayment(cekDenda $cekDenda, GenerateMonthlyBill $gene
'status_santri' => ['type' => 'text', 'readonly' => true], 'status_santri' => ['type' => 'text', 'readonly' => true],
], ],
'options' => [ 'options' => [
'payment_type' => $paymentType, 'payment_type' => $paymentTypes->pluck('payment_type', 'id'),
'payment_nominal' => $nominal, 'payment_nominal' => $paymentTypes->pluck('nominal', 'id'),
'payment_penalty' => $paymentPenalties 'payment_penalty' => $paymentPenalties
] ]
]); ]);
@ -51,59 +50,120 @@ public function indexManualPayment(cekDenda $cekDenda, GenerateMonthlyBill $gene
public function manualPayment(Request $request, $paymentId) public function manualPayment(Request $request, $paymentId)
{ {
// $request->validate([
// 'items' => 'required|array',
// 'items.*.type_id' => 'required|exists:payment_types,id',
// 'items.*.range' => 'required|integer|min:1'
// ]);
$items = $request->input('items');
$userId = $request->id;
$items = json_decode($request->input('items'), true);
try { try {
DB::beginTransaction(); DB::beginTransaction();
$range = (int) $request->input('range');
$userId = $request->id; // Ambil semua payment type sekaligus
$typeId = $request->input('type_id'); $paymentTypes = PaymentType::pluck('nominal', 'id');
$existingPayment = Payment::where('user_id', $userId) $existingPayment = Payment::where('user_id', $userId)
->where('payment_status', 'pending') ->where('payment_status', 'pending')
->first(); ->first();
$unpaidDetails = $existingPayment if ($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; $totalAmount = 0;
$toPay = $unpaidDetails->take($range);
$jumlahUnpaid = $toPay->count();
foreach ($toPay as $detail) { foreach ($items as $item) {
$nominal = PaymentType::where('id', $detail->type_id)->value('nominal') ?? 0; $typeId = $item['type_id'];
$penalty = $detail->penalty ?? 0; $range = $item['range'];
$total = $nominal + $penalty; $nominal = $paymentTypes[$typeId] ?? 0;
$detail->update([ // Ambil unpaid details
'status' => 'paid', $unpaidDetails = DetailPayment::where('payment_id', $existingPayment->id)
'amount' => $nominal, ->where('status', 'unpaid')
'penalty' => $penalty, ->where('type_id', $typeId)
]); ->orderBy('payment_year')
->orderBy('payment_month')
->get();
$totalAmount += $total; // Proses unpaid details
$toPay = $unpaidDetails->take($range);
$toPay->each(function ($detail) use (&$totalAmount, $nominal) {
$detail->update([
'status' => 'paid',
'amount' => $nominal,
'penalty' => $detail->penalty ?? 0,
]);
$totalAmount += $nominal + $detail->penalty;
});
// Hitung sisa bulan yang perlu dibuat
$sisa = $range - $toPay->count();
if ($sisa > 0) {
// Ambil bulan/tahun terakhir
$lastDetail = DetailPayment::where('payment_id', $existingPayment->id)
->orderBy('payment_year', 'desc')
->orderBy('payment_month', 'desc')
->first();
$bulan = $lastDetail->payment_month ?? now()->month;
$tahun = $lastDetail->payment_year ?? now()->year;
for ($i = 0; $i < $sisa; $i++) {
$bulan++;
if ($bulan > 12) {
$bulan = 1;
$tahun++;
}
DetailPayment::create([
'payment_id' => $existingPayment->id,
'payment_month' => $bulan,
'payment_year' => $tahun,
'amount' => $nominal,
'penalty' => 0,
'status' => 'paid',
'type_id' => $typeId,
]);
$totalAmount += $nominal;
}
}
} }
$sisa = $range - $jumlahUnpaid; // Update payment status
$bulan = $unpaidDetails->last()?->payment_month ?? now()->month; $existingPayment->update([
$tahun = $unpaidDetails->last()?->payment_year ?? now()->year; 'amount_payment' => DetailPayment::where('payment_id', $existingPayment->id)->sum('amount'),
'payment_status' => DetailPayment::where('payment_id', $existingPayment->id)
->where('status', 'unpaid')
->exists() ? 'pending' : 'success'
]);
for ($i = 0; $i < $sisa; $i++) { DB::commit();
$bulan++; return response()->json(['message' => 'Pembayaran berhasil diupdate']);
if ($bulan > 12) { }
$bulan = 1;
$tahun++;
}
$nominal = PaymentType::where('id', $typeId)->value('nominal') ?? 0; // Jika tidak ada existing payment, buat baru
$newPayment = Payment::create([
'payment_status' => 'success',
'amount_payment' => 0,
'user_id' => $userId,
]);
$bulan = now()->month;
$tahun = now()->year;
$totalAmount = 0;
foreach ($items as $item) {
$typeId = $item['type_id'];
$range = $item['range'];
$nominal = $paymentTypes[$typeId] ?? 0;
for ($i = 0; $i < $range; $i++) {
DetailPayment::create([ DetailPayment::create([
'payment_id' => $existingPayment->id, 'payment_id' => $newPayment->id,
'payment_month' => $bulan, 'payment_month' => $bulan,
'payment_year' => $tahun, 'payment_year' => $tahun,
'amount' => $nominal, 'amount' => $nominal,
@ -113,61 +173,24 @@ public function manualPayment(Request $request, $paymentId)
]); ]);
$totalAmount += $nominal; $totalAmount += $nominal;
}
$existingPayment->update([ $bulan++;
'amount_payment' => DetailPayment::where('payment_id', $existingPayment->id)->sum('amount'), if ($bulan > 12) {
'payment_status' => DetailPayment::where('payment_id', $existingPayment->id)->where('status', 'unpaid')->exists() ? 'pending' : 'success', $bulan = 1;
]); $tahun++;
}
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([ $newPayment->update(['amount_payment' => $totalAmount]);
'amount_payment' => $totalAmount,
]);
DB::commit(); DB::commit();
dd($newPayment); dd('berhasil lur');
return redirect()->back()->with('success', 'Pembayaran baru berhasil dibuat');
// return redirect()->back()->with(['success' => 'Pembayaran baru berhasil dibuat']);
} catch (Exception $e) { } catch (Exception $e) {
DB::rollBack(); DB::rollBack();
return dd('Error:', $e->getMessage()); dd('gagal' . $e->getMessage());
return redirect()->back()->with(['error' => 'gagal' . $e->getMessage()]);
} }
} }
} }

View File

@ -24,16 +24,18 @@ const ModalInput = ({ fields, tableName, options, initialData, onClose, showPaym
// console.log(initialData) // console.log(initialData)
const handlePaymentChange = (e) => { const handlePaymentChange = (e) => {
const value = e.target.value; const typeId = e.target.value;
if (!selectedPayments.includes(value)) { console.log(typeId)
setSelectedPayments([...selectedPayments, value]);
const nominal = parseInt(options.payment_nominal?.[value]) || 0; if (!selectedPayments.includes(typeId)) {
const penalty = parseInt(options.payment_penalty?.[value]) || 0; setSelectedPayments([...selectedPayments, typeId]);
const nominal = parseInt(options.payment_nominal[typeId]) || 0;
const penalty = parseInt(options.payment_penalty[typeId]) || 0;
setPaymentDetails({ setPaymentDetails({
...paymentDetails, ...paymentDetails,
[value]: { [typeId]: {
range: 1, range: 1,
nominal, nominal,
penalty, penalty,
@ -80,9 +82,15 @@ const ModalInput = ({ fields, tableName, options, initialData, onClose, showPaym
}); });
if (showPayments) { if (showPayments) {
formDataObj.append('payment_details', JSON.stringify(paymentDetails)); const detailsArray = Object.entries(paymentDetails).map(([type_id, detail]) => ({
...detail,
type_id: parseInt(type_id)
}));
console.log('Payment Details:', detailsArray);
formDataObj.append('items', JSON.stringify(detailsArray));
} }
const url = initialData const url = initialData
? `/update${tableName}/${initialData.id}` ? `/update${tableName}/${initialData.id}`
: `/add${tableName}`; : `/add${tableName}`;
@ -183,10 +191,11 @@ const ModalInput = ({ fields, tableName, options, initialData, onClose, showPaym
<option disabled value=""> <option disabled value="">
Pilih Payment Type Pilih Payment Type
</option> </option>
// Di bagian dropdown payment type:
{options.payment_type && {options.payment_type &&
Object.entries(options.payment_type).map(([key, value]) => ( Object.entries(options.payment_type).map(([id, name]) => (
<option key={key} value={key}> <option key={id} value={id}> {/* Gunakan ID sebagai value */}
{value} {name}
</option> </option>
))} ))}
</select> </select>