// routes/tenant/payments/index.tsx import { define } from "../../../utils.ts"; import { page } from "fresh"; import { getPaymentTransactionsByUser } from "../../../services/paymentService.ts"; import { PaymentTransaction } from "../../../db/interfaces.ts"; const LATE_FEE_AMOUNT = 50; function getTransactionDate(transaction: PaymentTransaction): Date { const timestamp = transaction.payment_date ?? transaction.created_on ?? 0; return new Date(timestamp); } function isLatePayment(transaction: PaymentTransaction): boolean { const date = getTransactionDate(transaction); return date.getUTCDate() > 5; } function formatCurrency(value: number): string { return `$${value.toLocaleString()}`; } export const handler = define.handlers({ async GET(ctx) { const { user_id } = ctx.state.data; try { const transactions = await getPaymentTransactionsByUser(user_id); return page({ transactions, }); } catch (error) { console.error("Error loading payment history:", error); return page({ error: "Failed to load payment history", }); } }, }); export default define.page(function TenantPayments({ data }) { const { transactions, error: _error } = data as { transactions: PaymentTransaction[]; error?: string; }; const rows = (transactions || []).map((transaction) => { const status = transaction.transaction_status || "pending"; const lateFee = isLatePayment(transaction) ? LATE_FEE_AMOUNT : 0; const lateFeeDue = status !== "completed" ? lateFee : 0; return { ...transaction, status, date: getTransactionDate(transaction), lateFee, lateFeeDue, }; }); const totalPaid = rows .filter((row) => row.status === "completed") .reduce((sum, row) => sum + (row.amount || 0), 0); const pendingCount = rows.filter((row) => row.status !== "completed").length; const lateFeesDue = rows.reduce((sum, row) => sum + row.lateFeeDue, 0); return (

Payment History

View your past transactions and manage payment methods.

Make a Payment
{/* Payment Methods Management */}

Payment Methods

Manage Payment Methods

Set up auto-payments, update your card or bank details, and view scheduled payments.

{/* Summary Cards */}
Total Paid
{formatCurrency(totalPaid)}
Pending Payments
{pendingCount}
Late Fees Due
{formatCurrency(lateFeesDue)}
{/* Payment History Table */}

Transaction History

{rows.length > 0 ? ( rows.map((transaction) => ( )) ) : ( )}
Date Method Amount Status Late Fee Receipt
{transaction.date.toLocaleDateString()} {transaction.payment_method || "ach"} {formatCurrency(transaction.amount || 0)} {transaction.status} {transaction.lateFee ? formatCurrency(transaction.lateFee) : "-"} {transaction.stripe_payment_id ? ( View ) : "-"}
No payment history yet
); });