Merge pull request #14 from alealien666/manualPay

progress be ++
This commit is contained in:
AleAlien 2025-02-21 21:37:02 +07:00 committed by GitHub
commit f0890af9e5
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 66 additions and 63 deletions

View File

@ -56,8 +56,7 @@ public function indexManualPayment(cekDenda $cekDenda, GenerateMonthlyBill $gene
public function manualPayment(Request $request, $id)
{
$request->validate([
'amount' => 'required',
'penalty' => 'nullable'
''
], [
'amount.required' => 'wajib mengisi nominal pembayaran',
]);

Binary file not shown.

After

Width:  |  Height:  |  Size: 302 KiB

View File

@ -1,7 +1,7 @@
import { Inertia } from "@inertiajs/inertia";
import React, { useState, useEffect } from "react";
const ModalInput = ({ fields, tableName, options, initialData, onClose }) => {
const ModalInput = ({ fields, tableName, options, initialData, onClose, showPayments = false }) => {
const [formData, setFormData] = useState({});
const [errors, setErrors] = useState({});
const [selectedPayments, setSelectedPayments] = useState([]);
@ -53,7 +53,7 @@ const ModalInput = ({ fields, tableName, options, initialData, onClose }) => {
[paymentType]: {
...currentDetails,
range: validRange,
amount: newAmount, // Pastikan amount diperbarui
amount: newAmount,
},
};
});
@ -140,71 +140,75 @@ const ModalInput = ({ fields, tableName, options, initialData, onClose }) => {
</div>
))}
<div className="mb-2">
<label className="input input-bordered input-secondary flex items-center gap-2">
Payment Type
<select onChange={handlePaymentChange} className="select select-bordered w-full select-secondary">
<option disabled value="">Pilih Payment Type</option>
{options.payment_type &&
Object.entries(options.payment_type).map(([key, value]) => (
<option key={key} value={key}>{value}</option>
))}
</select>
</label>
</div>
{selectedPayments.map((paymentType) => (
<div key={paymentType} className="mb-2 border p-2 rounded relative">
<button
type="button"
onClick={() => handleRemovePayment(paymentType)}
className="absolute top-0 right-0 bg-red-500 text-white px-2 py-1 rounded-full text-xs"
>
X
</button>
{showPayments && (
<div>
<div className="mb-2">
<label className="input input-bordered input-secondary flex items-center gap-2">
{options.payment_type[paymentType]} - Range Bulan
Payment Type
<select onChange={handlePaymentChange} className="select select-bordered w-full select-secondary">
<option disabled value="">Pilih Payment Type</option>
{options.payment_type &&
Object.entries(options.payment_type).map(([key, value]) => (
<option key={key} value={key}>{value}</option>
))}
</select>
</label>
</div>
{selectedPayments.map((paymentType) => (
<div key={paymentType} className="mb-2 border p-2 rounded relative">
<button
type="button"
onClick={() => handleRemovePayment(paymentType)}
className="absolute top-0 right-0 bg-red-500 text-white px-2 py-1 rounded-full text-xs"
>
X
</button>
<div className="mb-2">
<label className="input input-bordered input-secondary flex items-center gap-2">
{options.payment_type[paymentType]} - Range Bulan
<input
type="number"
min="1"
value={paymentDetails[paymentType].range}
onChange={(e) => handleRangeChange(paymentType, parseInt(e.target.value))}
className="grow border-none focus:ring-0"
/>
</label>
</div>
<div className="mb-2">
<label className="input input-bordered input-secondary flex items-center gap-2">
Nominal
<input type="text" value={paymentDetails[paymentType].nominal} readOnly className="grow border-none focus:ring-0 bg-gray-100" />
</label>
</div>
<div className="mb-2">
<label className="input input-bordered input-secondary flex items-center gap-2">
Penalty
<input type="text" value={paymentDetails[paymentType].penalty} readOnly className="grow border-none focus:ring-0 bg-gray-100" />
</label>
</div>
</div>
))}
<div className="mb-2">
<label className="input input-bordered input-secondary flex items-center gap-2">
Total Amount
<input
type="number"
min="1"
value={paymentDetails[paymentType].range}
onChange={(e) => handleRangeChange(paymentType, parseInt(e.target.value))}
className="grow border-none focus:ring-0"
type="text"
value={Object.values(paymentDetails).reduce((sum, p) => sum + (p.amount || 0), 0)}
readOnly
className="grow border-none focus:ring-0 bg-gray-100"
/>
</label>
</div>
<div className="mb-2">
<label className="input input-bordered input-secondary flex items-center gap-2">
Nominal
<input type="text" value={paymentDetails[paymentType].nominal} readOnly className="grow border-none focus:ring-0 bg-gray-100" />
</label>
</div>
<div className="mb-2">
<label className="input input-bordered input-secondary flex items-center gap-2">
Penalty
<input type="text" value={paymentDetails[paymentType].penalty} readOnly className="grow border-none focus:ring-0 bg-gray-100" />
</label>
</div>
</div>
))}
<div className="mb-2">
<label className="input input-bordered input-secondary flex items-center gap-2">
Total Amount
<input
type="text"
value={Object.values(paymentDetails).reduce((sum, p) => sum + (p.amount || 0), 0)}
readOnly
className="grow border-none focus:ring-0 bg-gray-100"
/>
</label>
</div>
)}
<button type="submit" className="btn btn-secondary w-full mt-3">
{initialData ? "Simpan Perubahan" : "Tambah Data"}

View File

@ -7,7 +7,7 @@ export default function ManualPayment({ santri, penalty, bill, fields, options }
return (
<div className='text-red-500'>
<Head title="Manual Payment" />
<ModalInput fields={fields} options={options} tableName={['payments', 'detail_payments']} initialData={selectedSantri} onClose={() => setSelectedSantri(null)} />
<ModalInput showPayments={true} fields={fields} options={options} tableName={['payments', 'detail_payments']} initialData={selectedSantri} onClose={() => setSelectedSantri(null)} />
{santri && santri.length > 0 ? santri.map((item, i) => (
<div key={i} className="p-4 border-b">
<p>Nis: {item.user.nis}</p>