From 9e907ec6ceb06cbe891aa3779c1385ecd33aca25 Mon Sep 17 00:00:00 2001 From: sazzadulalambd Date: Tue, 12 May 2026 19:59:32 +0600 Subject: [PATCH] feat: add rental payment history section and interface to admin rental details page --- src/app/admin/rentals/[id]/page.tsx | 79 +++++++++++++++++++++++++++-- 1 file changed, 76 insertions(+), 3 deletions(-) diff --git a/src/app/admin/rentals/[id]/page.tsx b/src/app/admin/rentals/[id]/page.tsx index 2d46615..6e78b22 100644 --- a/src/app/admin/rentals/[id]/page.tsx +++ b/src/app/admin/rentals/[id]/page.tsx @@ -72,6 +72,7 @@ interface Rental { acceptedAt?: string; activatedAt?: string; lockHistory?: LockEvent[]; + paymentHistory?: PaymentHistory[]; } interface LockEvent { @@ -82,6 +83,16 @@ interface LockEvent { performedAt: string; } +interface PaymentHistory { + id: string; + amount: number; + type: 'daily' | 'weekly' | 'monthly' | 'deposit' | 'penalty'; + date: string; + method: 'cash' | 'bank' | 'wallet' | 'bkash' | 'nagad'; + status: 'paid' | 'pending' | 'failed'; + note?: string; +} + const mockRentals: Rental[] = [ { id: 'RNT-001', @@ -123,6 +134,12 @@ const mockRentals: Rental[] = [ createdAt: '2024-01-15', acceptedAt: '2024-01-15', activatedAt: '2024-01-16', + paymentHistory: [ + { id: 'PAY-001', amount: 3000, type: 'deposit', date: '2024-01-15', method: 'bkash', status: 'paid', note: 'Deposit payment' }, + { id: 'PAY-002', amount: 12000, type: 'monthly', date: '2024-02-15', method: 'bank', status: 'paid', note: 'February rent' }, + { id: 'PAY-003', amount: 12000, type: 'monthly', date: '2024-03-15', method: 'bank', status: 'paid', note: 'March rent' }, + { id: 'PAY-004', amount: 12000, type: 'monthly', date: '2024-04-15', method: 'bank', status: 'pending', note: 'April rent - pending' }, + ], lockHistory: [ { id: 'lh1', action: 'locked', reason: 'First payment overdue - Day 1 penalty', performedBy: 'System', performedAt: '2024-02-01' }, { id: 'lh2', action: 'unlocked', reason: 'Payment received', performedBy: 'Admin Manager', performedAt: '2024-02-03' }, @@ -282,6 +299,7 @@ export default function RentalDetailPage() { { id: 'n2', text: 'First monthly payment received.', createdAt: '2024-02-15' }, ]); const [newNote, setNewNote] = useState(''); + const [paymentPage, setPaymentPage] = useState(0); const [editForm, setEditForm] = useState>({}); const [showLockModal, setShowLockModal] = useState(false); const [showUnlockModal, setShowUnlockModal] = useState(false); @@ -692,6 +710,7 @@ export default function RentalDetailPage() { + {/* Initial Condition Images */} {/* {(rental.status === 'pending' || rental.status === 'accepted') && rental.initialImages && ( */} {rental.initialImages && (
@@ -710,7 +729,7 @@ export default function RentalDetailPage() { )}
-
+
{(['front', 'back', 'left', 'right', 'battery'] as const).map(type => { const img = rental.initialImages?.find(i => i.type === type); return ( @@ -730,8 +749,7 @@ export default function RentalDetailPage() {
)} - - + {/* Notes */}

Notes ({notes.length}) @@ -761,6 +779,61 @@ export default function RentalDetailPage() {

+ + {/* Rental Payment History */} + {rental.paymentHistory && rental.paymentHistory.length > 0 && ( +
+
+

+ Rental Payment History +

+ {rental.paymentHistory.length} payments +
+
+ {rental.paymentHistory.slice(paymentPage, paymentPage + 10).map(payment => ( +
+
+
+ + {payment.type.charAt(0).toUpperCase() + payment.type.slice(1)} + + + {payment.status.charAt(0).toUpperCase() + payment.status.slice(1)} + +
+ ৳{payment.amount.toLocaleString()} +
+
+ {payment.date} + {payment.method} +
+ {payment.note &&

{payment.note}

} +
+ ))} +
+ {rental.paymentHistory.length > 1 && ( +
+ + + Showing {paymentPage + 1}-{Math.min(paymentPage + 10, rental.paymentHistory.length)} of {rental.paymentHistory.length} + + +
+ )} +
+ )}