160 lines
5.4 KiB
PHP
160 lines
5.4 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers;
|
|
|
|
use App\Models\Payment;
|
|
use Illuminate\Http\Request;
|
|
use App\Models\User;
|
|
use App\Models\PaymentType;
|
|
use App\Models\DetailPayment;
|
|
use Inertia\Inertia;
|
|
use App\Services\cekDenda;
|
|
use App\Services\GenerateMonthlyBill;
|
|
use Illuminate\Support\Facades\DB;
|
|
use Exception;
|
|
use Illuminate\Support\Facades\Log;
|
|
|
|
class PaymentController extends Controller
|
|
{
|
|
public function indexManualPayment(cekDenda $cekDenda, GenerateMonthlyBill $generateMonthlyBill)
|
|
{
|
|
$penalty = $cekDenda->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' => 'text',
|
|
'nama' => 'text',
|
|
'status_santri' => 'text',
|
|
'role_santri' => 'text',
|
|
],
|
|
'options' => [
|
|
'payment_type' => $paymentType,
|
|
'payment_nominal' => $nominal,
|
|
'payment_penalty' => $paymentPenalties
|
|
]
|
|
]);
|
|
}
|
|
|
|
public function manualPayment(Request $request, $paymentId)
|
|
{
|
|
try {
|
|
DB::beginTransaction();
|
|
DB::enableQueryLog();
|
|
|
|
$range = $request->input('range');
|
|
$payment = Payment::find($paymentId);
|
|
$userId = User::findOrFail($request->id);
|
|
|
|
if (!$payment) {
|
|
Payment::create([
|
|
'payment_status' => 'pending',
|
|
'amount_payment' => 0,
|
|
'bank' => null,
|
|
'no_va' => null,
|
|
'expired_at' => null,
|
|
'user_id' => $userId
|
|
]);
|
|
}
|
|
|
|
$unpaidDetails = DetailPayment::where('payment_id', $paymentId)
|
|
->where('status', 'unpaid')
|
|
->orderBy('payment_year', 'asc')
|
|
->orderBy('payment_month', 'asc')
|
|
->get();
|
|
|
|
$jumlahUnpaid = $unpaidDetails->count();
|
|
$totalAmount = 0;
|
|
|
|
Log::info("Jumlah Unpaid: $jumlahUnpaid | Range: $range");
|
|
|
|
if ($jumlahUnpaid > 0) {
|
|
foreach ($unpaidDetails->take($range) as $detail) {
|
|
$nominal = PaymentType::where('id', $detail->type_id)->value('nominal') ?? 0;
|
|
$penalty = $detail->penalty ?? 0;
|
|
$total = $nominal + $penalty;
|
|
|
|
Log::info("Update DetailPayment ID {$detail->id} | Total: $total");
|
|
|
|
$detail->update([
|
|
'status' => 'paid',
|
|
'amount' => $total,
|
|
'penalty' => $penalty,
|
|
]);
|
|
|
|
$totalAmount += $total;
|
|
}
|
|
}
|
|
|
|
$sisa = max(0, $range - $jumlahUnpaid);
|
|
dd("Sisa pembayaran baru yang perlu dibuat: $sisa");
|
|
|
|
if ($sisa > 0) {
|
|
$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') ?? 0;
|
|
|
|
for ($i = 1; $i <= $sisa; $i++) {
|
|
$bulanTerakhir++;
|
|
if ($bulanTerakhir > 12) {
|
|
$bulanTerakhir = 1;
|
|
$tahunTerakhir++;
|
|
}
|
|
|
|
$totalAmount += $nominal;
|
|
|
|
Log::info("Buat DetailPayment baru untuk bulan: $bulanTerakhir, tahun: $tahunTerakhir");
|
|
|
|
DetailPayment::create([
|
|
'payment_id' => $paymentId,
|
|
'payment_month' => $bulanTerakhir,
|
|
'payment_year' => $tahunTerakhir,
|
|
'amount' => $nominal,
|
|
'penalty' => 0,
|
|
'status' => 'paid',
|
|
'type_id' => $typeId,
|
|
]);
|
|
}
|
|
}
|
|
|
|
$totalAmountFinal = DetailPayment::where('payment_id', $paymentId)->sum('amount');
|
|
|
|
Log::info("Total pembayaran akhir: $totalAmountFinal");
|
|
|
|
$payment->update([
|
|
'amount_payment' => $totalAmountFinal,
|
|
'payment_status' => DetailPayment::where('payment_id', $paymentId)
|
|
->where('status', 'unpaid')
|
|
->exists() ? 'pending' : 'success'
|
|
]);
|
|
|
|
Log::info("Update Payment ID $paymentId | amount_payment: $totalAmountFinal");
|
|
|
|
DB::commit();
|
|
|
|
// dd($request->all());
|
|
|
|
return redirect()->back()->with('success', 'Berhasil Melakukan Pembayaran');
|
|
} catch (Exception $e) {
|
|
DB::rollBack();
|
|
return dd('Error:', $e->getMessage());
|
|
}
|
|
}
|
|
}
|