MIF_E31222881/app/Http/Controllers/PaymentController.php

144 lines
4.8 KiB
PHP

<?php
namespace App\Http\Controllers;
use App\Models\Payment;
use Illuminate\Http\Request;
use App\Models\Santri;
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;
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 = 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();
}
}
}