From 1dc2887d958f4344bac1b39db22b48709e30d8e4 Mon Sep 17 00:00:00 2001 From: alealien666 Date: Mon, 17 Feb 2025 23:19:23 +0700 Subject: [PATCH] nambah titik --- app/Http/Controllers/PaymentController.php | 21 +++++--- app/Models/DetailPayment.php | 2 +- app/Services/GenerateMonthlyBill.php | 51 +++++++++++++++++++ ...025_01_28_080108_create_payments_table.php | 2 +- ...28_080123_create_detail_payments_table.php | 2 +- .../list-admin/payment/ManualPayment.jsx | 48 +++++++++++++++++ routes/web.php | 2 +- 7 files changed, 118 insertions(+), 10 deletions(-) create mode 100644 app/Services/GenerateMonthlyBill.php diff --git a/app/Http/Controllers/PaymentController.php b/app/Http/Controllers/PaymentController.php index bff9d7a..bbaf9f5 100644 --- a/app/Http/Controllers/PaymentController.php +++ b/app/Http/Controllers/PaymentController.php @@ -7,19 +7,28 @@ use App\Models\Santri; use Inertia\Inertia; use App\Services\cekDenda; +use App\Services\GenerateMonthlyBill; class PaymentController extends Controller { - public function indexManualPayment() + public function indexManualPayment(cekDenda $cekDenda, GenerateMonthlyBill $generateMonthlyBill) { - $santri = Santri::with(['payments.detailPayments.paymentType']) - ->withSum(['payments.detailPayments as total_penalty' => function ($query) { - $query->whereNotNull('penalty'); - }], 'penalty') - ->get(); + $penalty = $cekDenda->applyPenalty(); + $bill = $generateMonthlyBill->generateAutoBill(); + + + $santri = Santri::with([ + 'payments.detailPayments.paymentType' + ])->get(); + + // $santri = Payment::with('detailPayments')->get(); + + // dd($santri); return Inertia::render('list-admin/payment/ManualPayment', [ 'santri' => $santri, + 'penalty' => $penalty, + 'bill' => $bill, 'fields' => [ 'nis' => 'text', 'nama' => 'text', diff --git a/app/Models/DetailPayment.php b/app/Models/DetailPayment.php index 0f7a5eb..710fe35 100644 --- a/app/Models/DetailPayment.php +++ b/app/Models/DetailPayment.php @@ -20,7 +20,7 @@ public static function cekTunggakan($santri_id) })->orderBy('payment_year', 'asc')->orderBy('payment_month')->get(); } - public function payment() + public function payments() { return $this->belongsTo(Payment::class, 'payment_id', 'id'); } diff --git a/app/Services/GenerateMonthlyBill.php b/app/Services/GenerateMonthlyBill.php new file mode 100644 index 0000000..630715d --- /dev/null +++ b/app/Services/GenerateMonthlyBill.php @@ -0,0 +1,51 @@ +month; + $currentYear = Carbon::now()->year; + + DB::beginTransaction(); + try { + $previousPayments = Payment::with('detailPayments') + ->whereHas('detailPayments', function ($query) { + $query->where('payment_month', Carbon::now()->subMonth()->month) + ->where('payment_year', Carbon::now()->subMonth()->year); + })->get(); + + foreach ($previousPayments as $prevPay) { + $existingBill = DetailPayment::where('payment_id', $prevPay->id) + ->where('payment_month', $currentMonth) + ->where('payment_year', $currentYear)->exists(); + } + + if (!$existingBill) { + $previousDetail = $prevPay->detailPayments->last(); + DetailPayment::create([ + 'payment_id' => $prevPay->id, + 'payment_type_id' => $previousDetail->payment_type_id, + 'amount' => $previousDetail->amount, + 'status' => 'unpaid', + 'payment_month' => $currentMonth, + 'payment_year' => $currentYear, + 'penalty' => null, + ]); + } + + DB::commit(); + return ['message' => 'berhasil menambah data']; + } catch (\Exception $e) { + DB::rollBack(); + return ['error' => 'gagal menambah data' . $e->getMessage()]; + } + } +} diff --git a/database/migrations/2025_01_28_080108_create_payments_table.php b/database/migrations/2025_01_28_080108_create_payments_table.php index 08b47e2..e622327 100644 --- a/database/migrations/2025_01_28_080108_create_payments_table.php +++ b/database/migrations/2025_01_28_080108_create_payments_table.php @@ -19,7 +19,7 @@ public function up(): void $table->string('no_va')->nullable(); $table->dateTime('expired_at')->nullable(); $table->foreignId('santri_id')->constrained('santris')->onDelete('cascade'); - $table->foreignId('wallet_id')->constrained('wallets')->onDelete('cascade'); + $table->foreignId('wallet_id')->nullable()->constrained('wallets')->onDelete('cascade'); $table->timestamps(); }); } diff --git a/database/migrations/2025_01_28_080123_create_detail_payments_table.php b/database/migrations/2025_01_28_080123_create_detail_payments_table.php index db9bb8e..a052a7a 100644 --- a/database/migrations/2025_01_28_080123_create_detail_payments_table.php +++ b/database/migrations/2025_01_28_080123_create_detail_payments_table.php @@ -15,7 +15,7 @@ public function up(): void $table->id(); $table->foreignId('payment_id')->constrained('payments')->onDelete('cascade'); $table->enum('status', ['paid', 'unpaid']); - $table->float('amount'); + $table->float('amount')->nullable(); $table->float('penalty')->nullable(); $table->integer('payment_month'); $table->integer('payment_year'); diff --git a/resources/js/Pages/list-admin/payment/ManualPayment.jsx b/resources/js/Pages/list-admin/payment/ManualPayment.jsx index e69de29..7233a1b 100644 --- a/resources/js/Pages/list-admin/payment/ManualPayment.jsx +++ b/resources/js/Pages/list-admin/payment/ManualPayment.jsx @@ -0,0 +1,48 @@ +import React, { useState } from 'react'; +import { Head } from '@inertiajs/react'; +import ModalInput from '@/Components/ModalInput'; + +export default function ManualPayment({ santri, penalty, bill, fields }) { + const [selectedSantri, setSelectedSantri] = useState(null); + + return ( + + +
+ + setSelectedSantri(null)} /> + {santri && santri.length > 0 ? santri.map((item, i) => ( +
+

Santri: {item.nama}

+ + {item.payments && item.payments.length > 0 ? ( +
+

Payments:

+ {item.payments.map((payment) => ( +
+ {payment.detail_payments && payment.detail_payments.length > 0 ? ( +
    + {payment.detail_payments.map((detail) => ( +
  • + {detail.penalty ? `Denda: Rp ${detail.penalty}` : 'Tidak ada denda'} +

    {detail.status}

    +
  • + ))} +
+ ) :

Tidak ada detail pembayaran.

} +
+ ))} +
+ ) :

Tidak ada pembayaran.

} + +
+ +
+
+ )) :

Tidak ada data santri.

} +
+ ); +} diff --git a/routes/web.php b/routes/web.php index 44f93a0..24c14bd 100644 --- a/routes/web.php +++ b/routes/web.php @@ -41,7 +41,7 @@ Route::post('/deletepayment_types/{id}', [PaymentTypeController::class, 'destroy'])->name('deletePaymentType'); // manual payment -Route::get('/manualPayment', [PaymentController::class, 'index'])->name('indexManualPayment'); +Route::get('index-manual-payment', [PaymentController::class, 'indexManualPayment'])->name('indexManualPayment'); Route::get('/dashboard', function () { return Inertia::render('Dashboard');