commit
775646ec40
|
@ -4,6 +4,7 @@
|
||||||
|
|
||||||
use App\Models\DetailPayment;
|
use App\Models\DetailPayment;
|
||||||
use App\Models\Payment;
|
use App\Models\Payment;
|
||||||
|
use App\Models\PaymentType;
|
||||||
use Illuminate\Support\Carbon;
|
use Illuminate\Support\Carbon;
|
||||||
use Illuminate\Support\Facades\DB;
|
use Illuminate\Support\Facades\DB;
|
||||||
|
|
||||||
|
@ -13,39 +14,74 @@ public function generateAutoBill()
|
||||||
{
|
{
|
||||||
$currentMonth = Carbon::now()->month;
|
$currentMonth = Carbon::now()->month;
|
||||||
$currentYear = Carbon::now()->year;
|
$currentYear = Carbon::now()->year;
|
||||||
|
$previousMonth = Carbon::now()->subMonth()->month;
|
||||||
|
$previousYear = Carbon::now()->subMonth()->year;
|
||||||
|
|
||||||
DB::beginTransaction();
|
DB::beginTransaction();
|
||||||
try {
|
try {
|
||||||
$previousPayments = Payment::with('detailPayments')
|
$santriPayments = Payment::with('detailPayments')->get();
|
||||||
->whereHas('detailPayments', function ($query) {
|
|
||||||
$query->where('payment_month', Carbon::now()->subMonth()->month)
|
|
||||||
->where('payment_year', Carbon::now()->subMonth()->year);
|
|
||||||
})->get();
|
|
||||||
|
|
||||||
foreach ($previousPayments as $prevPay) {
|
foreach ($santriPayments as $prevPay) {
|
||||||
$existingBill = DetailPayment::where('payment_id', $prevPay->id)
|
$existingPayment = Payment::where('santri_id', $prevPay->santri_id)
|
||||||
->where('payment_month', $currentMonth)
|
->whereMonth('created_at', $currentMonth)
|
||||||
->where('payment_year', $currentYear)->exists();
|
->whereYear('created_at', $currentYear)
|
||||||
}
|
->first();
|
||||||
|
|
||||||
if (!$existingBill) {
|
if (!$existingPayment) {
|
||||||
$previousDetail = $prevPay->detailPayments->last();
|
$newPayment = Payment::create([
|
||||||
DetailPayment::create([
|
'payment_status' => 'pending',
|
||||||
'payment_id' => $prevPay->id,
|
'amount_payment' => 0,
|
||||||
'payment_type_id' => $previousDetail->payment_type_id,
|
'santri_id' => $prevPay->santri_id,
|
||||||
'amount' => $previousDetail->amount,
|
'wallet_id' => $prevPay->wallet_id,
|
||||||
'status' => 'unpaid',
|
'bank' => null,
|
||||||
'payment_month' => $currentMonth,
|
'no_va' => null,
|
||||||
'payment_year' => $currentYear,
|
'expired_at' => null,
|
||||||
'penalty' => null,
|
'payment_method' => null,
|
||||||
]);
|
]);
|
||||||
|
} else {
|
||||||
|
$newPayment = $existingPayment;
|
||||||
|
}
|
||||||
|
|
||||||
|
$previousPayment = Payment::where('santri_id', $prevPay->santri_id)
|
||||||
|
->whereMonth('created_at', $previousMonth)
|
||||||
|
->whereYear('created_at', $previousYear)
|
||||||
|
->first();
|
||||||
|
|
||||||
|
if (!$previousPayment) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
$previousDetails = $previousPayment->detailPayments;
|
||||||
|
|
||||||
|
foreach ($previousDetails as $previousDetail) {
|
||||||
|
$existingBill = DetailPayment::where('payment_id', $newPayment->id)
|
||||||
|
->where('type_id', $previousDetail->type_id)
|
||||||
|
->where('payment_month', $currentMonth)
|
||||||
|
->where('payment_year', $currentYear)
|
||||||
|
->exists();
|
||||||
|
|
||||||
|
if (!$existingBill) {
|
||||||
|
$paymentType = PaymentType::find($previousDetail->type_id);
|
||||||
|
$amount = $paymentType ? $paymentType->amount : 0;
|
||||||
|
|
||||||
|
DetailPayment::create([
|
||||||
|
'payment_id' => $newPayment->id,
|
||||||
|
'type_id' => $previousDetail->type_id,
|
||||||
|
'amount' => $amount,
|
||||||
|
'status' => 'unpaid',
|
||||||
|
'payment_month' => $currentMonth,
|
||||||
|
'payment_year' => $currentYear,
|
||||||
|
'penalty' => null,
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
DB::commit();
|
DB::commit();
|
||||||
return ['message' => 'berhasil menambah data'];
|
return ['message' => 'Berhasil menambah data'];
|
||||||
} catch (\Exception $e) {
|
} catch (\Exception $e) {
|
||||||
DB::rollBack();
|
DB::rollBack();
|
||||||
return ['error' => 'gagal menambah data' . $e->getMessage()];
|
return ['error' => 'Gagal menambah data: ' . $e->getMessage()];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -14,6 +14,7 @@ public function up(): void
|
||||||
Schema::create('payment_types', function (Blueprint $table) {
|
Schema::create('payment_types', function (Blueprint $table) {
|
||||||
$table->id();
|
$table->id();
|
||||||
$table->string('payment_type');
|
$table->string('payment_type');
|
||||||
|
$table->float('amount');
|
||||||
$table->timestamps();
|
$table->timestamps();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,10 +4,7 @@ import ModalInput from '@/Components/ModalInput';
|
||||||
|
|
||||||
export default function ManualPayment({ santri, penalty, bill, fields }) {
|
export default function ManualPayment({ santri, penalty, bill, fields }) {
|
||||||
const [selectedSantri, setSelectedSantri] = useState(null);
|
const [selectedSantri, setSelectedSantri] = useState(null);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
|
|
||||||
|
|
||||||
<div className='text-red-500'>
|
<div className='text-red-500'>
|
||||||
<Head title="Manual Payment" />
|
<Head title="Manual Payment" />
|
||||||
<ModalInput fields={fields} tableName={['payments', 'detail_payments']} initialData={selectedSantri} onClose={() => setSelectedSantri(null)} />
|
<ModalInput fields={fields} tableName={['payments', 'detail_payments']} initialData={selectedSantri} onClose={() => setSelectedSantri(null)} />
|
||||||
|
@ -21,16 +18,53 @@ export default function ManualPayment({ santri, penalty, bill, fields }) {
|
||||||
<p className="font-semibold">Payments:</p>
|
<p className="font-semibold">Payments:</p>
|
||||||
{item.payments.map((payment) => (
|
{item.payments.map((payment) => (
|
||||||
<div key={payment.id} className="ml-4">
|
<div key={payment.id} className="ml-4">
|
||||||
{payment.detail_payments && payment.detail_payments.length > 0 ? (
|
{/* {payment.detail_payments && payment.detail_payments.length > 0 ? ( */}
|
||||||
<ul className="ml-6 list-disc">
|
|
||||||
{payment.detail_payments.map((detail) => (
|
{payment.detail_payments.map((detail) => (
|
||||||
<li key={detail.id}>
|
<div key={detail.id}>
|
||||||
{detail.penalty ? `Denda: Rp ${detail.penalty}` : 'Tidak ada denda'}
|
<p>{detail.penalty ? `Denda: Rp ${detail.penalty}` : 'Tidak ada denda'}</p>
|
||||||
<p>{detail.status}</p>
|
<p>{detail.status}</p>
|
||||||
</li>
|
|
||||||
))}
|
<label htmlFor="my_modal_7" className="btn">show pembayaran</label>
|
||||||
</ul>
|
|
||||||
) : <p className="ml-4 text-gray-500">Tidak ada detail pembayaran.</p>}
|
<input type="checkbox" id="my_modal_7" className="modal-toggle" />
|
||||||
|
<div className="modal" role="dialog">
|
||||||
|
<div className="modal-box">
|
||||||
|
<h3 className="text-lg font-bold">data pembayaran</h3>
|
||||||
|
<p className="py-4">{detail.payment_type?.payment_type}</p>
|
||||||
|
<div className="overflow-x-auto">
|
||||||
|
<table className="table">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th>tipe pembayaran</th>
|
||||||
|
<th>tahun</th>
|
||||||
|
<th>bulan</th>
|
||||||
|
<th>denda</th>
|
||||||
|
<th>status pemabayaran</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<th>{detail.payment_type?.payment_type}</th>
|
||||||
|
<td className='text-center'>{detail.payment_year}</td>
|
||||||
|
<td className='text-center'>{detail.payment_month}</td>
|
||||||
|
<td className='text-center'>{detail.penalty}</td>
|
||||||
|
<td className='text-center'>
|
||||||
|
<div className='p-2 bg-red-600 text-white rounded-md'>
|
||||||
|
{detail.status}
|
||||||
|
</div>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<label className="modal-backdrop" htmlFor="my_modal_7">Close</label>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
))}
|
||||||
|
|
||||||
|
{/* ) : <p className="ml-4 text-gray-500">Tidak ada detail pembayaran.</p>} */}
|
||||||
</div>
|
</div>
|
||||||
))}
|
))}
|
||||||
</div>
|
</div>
|
||||||
|
@ -38,7 +72,6 @@ export default function ManualPayment({ santri, penalty, bill, fields }) {
|
||||||
|
|
||||||
<div>
|
<div>
|
||||||
<button className='btn btn-accent text-white mt-2' onClick={() => {
|
<button className='btn btn-accent text-white mt-2' onClick={() => {
|
||||||
// console.log(item)
|
|
||||||
setSelectedSantri({
|
setSelectedSantri({
|
||||||
nama: item.nama,
|
nama: item.nama,
|
||||||
alamat: item.alamat,
|
alamat: item.alamat,
|
||||||
|
|
Loading…
Reference in New Issue