commit
f0890af9e5
|
@ -56,8 +56,7 @@ public function indexManualPayment(cekDenda $cekDenda, GenerateMonthlyBill $gene
|
||||||
public function manualPayment(Request $request, $id)
|
public function manualPayment(Request $request, $id)
|
||||||
{
|
{
|
||||||
$request->validate([
|
$request->validate([
|
||||||
'amount' => 'required',
|
''
|
||||||
'penalty' => 'nullable'
|
|
||||||
], [
|
], [
|
||||||
'amount.required' => 'wajib mengisi nominal pembayaran',
|
'amount.required' => 'wajib mengisi nominal pembayaran',
|
||||||
]);
|
]);
|
||||||
|
|
Binary file not shown.
After Width: | Height: | Size: 302 KiB |
|
@ -1,7 +1,7 @@
|
||||||
import { Inertia } from "@inertiajs/inertia";
|
import { Inertia } from "@inertiajs/inertia";
|
||||||
import React, { useState, useEffect } from "react";
|
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 [formData, setFormData] = useState({});
|
||||||
const [errors, setErrors] = useState({});
|
const [errors, setErrors] = useState({});
|
||||||
const [selectedPayments, setSelectedPayments] = useState([]);
|
const [selectedPayments, setSelectedPayments] = useState([]);
|
||||||
|
@ -53,7 +53,7 @@ const ModalInput = ({ fields, tableName, options, initialData, onClose }) => {
|
||||||
[paymentType]: {
|
[paymentType]: {
|
||||||
...currentDetails,
|
...currentDetails,
|
||||||
range: validRange,
|
range: validRange,
|
||||||
amount: newAmount, // Pastikan amount diperbarui
|
amount: newAmount,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
|
@ -140,71 +140,75 @@ const ModalInput = ({ fields, tableName, options, initialData, onClose }) => {
|
||||||
</div>
|
</div>
|
||||||
))}
|
))}
|
||||||
|
|
||||||
<div className="mb-2">
|
{showPayments && (
|
||||||
<label className="input input-bordered input-secondary flex items-center gap-2">
|
<div>
|
||||||
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">
|
<div className="mb-2">
|
||||||
<label className="input input-bordered input-secondary flex items-center gap-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
|
<input
|
||||||
type="number"
|
type="text"
|
||||||
min="1"
|
value={Object.values(paymentDetails).reduce((sum, p) => sum + (p.amount || 0), 0)}
|
||||||
value={paymentDetails[paymentType].range}
|
readOnly
|
||||||
onChange={(e) => handleRangeChange(paymentType, parseInt(e.target.value))}
|
className="grow border-none focus:ring-0 bg-gray-100"
|
||||||
className="grow border-none focus:ring-0"
|
|
||||||
/>
|
/>
|
||||||
|
|
||||||
</label>
|
</label>
|
||||||
</div>
|
</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>
|
||||||
))}
|
)}
|
||||||
<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">
|
<button type="submit" className="btn btn-secondary w-full mt-3">
|
||||||
{initialData ? "Simpan Perubahan" : "Tambah Data"}
|
{initialData ? "Simpan Perubahan" : "Tambah Data"}
|
||||||
|
|
|
@ -7,7 +7,7 @@ export default function ManualPayment({ santri, penalty, bill, fields, options }
|
||||||
return (
|
return (
|
||||||
<div className='text-red-500'>
|
<div className='text-red-500'>
|
||||||
<Head title="Manual Payment" />
|
<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) => (
|
{santri && santri.length > 0 ? santri.map((item, i) => (
|
||||||
<div key={i} className="p-4 border-b">
|
<div key={i} className="p-4 border-b">
|
||||||
<p>Nis: {item.user.nis}</p>
|
<p>Nis: {item.user.nis}</p>
|
||||||
|
|
Loading…
Reference in New Issue