MIF_E31222881/app/Http/Controllers/PaymentController.php

174 lines
5.8 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' => ['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());
}
}
}