Apply patch [skip ci]

This commit is contained in:
open-swe-dev-andrinoid[bot] 2026-01-22 00:42:14 +00:00
parent 85e7247e4a
commit 2ab27763f9
12 changed files with 192 additions and 226 deletions

46
TODO.md
View File

@ -1,34 +1,56 @@
# Project TODO List # Project TODO List
This document outlines the remaining tasks, incomplete features, and future development plans for the application. This document outlines the remaining tasks, incomplete features, and future
development plans for the application.
## High Priority ## High Priority
- **Implement Payment Processing**: The current rent payment system in `routes/tenant/rent/pay/index.tsx` is a placeholder. It needs to be fully implemented with a payment provider like Stripe to handle real transactions securely.
- **Implement Payment Processing**: The current rent payment system in
`routes/tenant/rent/pay/index.tsx` is a placeholder. It needs to be fully
implemented with a payment provider like Stripe to handle real transactions
securely.
## Backend & API ## Backend & API
- **Add Well-Known Endpoint**: Implement a `/.well-known/acme-challenge/:token` endpoint in `main.ts` to support services like Let's Encrypt for SSL certificate validation in production.
- **Enforce Database Constraints**: Ensure the `owner_id` field in the `AccessTokenResponse` interface is unique for each entry, as noted in `utils/database.ts`. This is crucial for maintaining data integrity. - **Add Well-Known Endpoint**: Implement a `/.well-known/acme-challenge/:token`
endpoint in `main.ts` to support services like Let's Encrypt for SSL
certificate validation in production.
- **Enforce Database Constraints**: Ensure the `owner_id` field in the
`AccessTokenResponse` interface is unique for each entry, as noted in
`utils/database.ts`. This is crucial for maintaining data integrity.
## Feature Development ## Feature Development
- **Complete Landlord Dashboard**: Flesh out all features under the `routes/landlord/` directory. This includes:
- **Complete Landlord Dashboard**: Flesh out all features under the
`routes/landlord/` directory. This includes:
- Property management - Property management
- Tenant invitation and management (`islands/LandlordInviteTenant.tsx`) - Tenant invitation and management (`islands/LandlordInviteTenant.tsx`)
- Messaging with tenants (`islands/LandlordMessageThreads.tsx`) - Messaging with tenants (`islands/LandlordMessageThreads.tsx`)
- Financial tracking and reporting - Financial tracking and reporting
- **Complete Tenant Dashboard**: Finalize all features under the `routes/tenant/` directory. This includes: - **Complete Tenant Dashboard**: Finalize all features under the
`routes/tenant/` directory. This includes:
- Viewing lease documents - Viewing lease documents
- Tracking rent payments and financial obligations - Tracking rent payments and financial obligations
- Messaging with landlords (`islands/TenantMessageThreads.tsx`) - Messaging with landlords (`islands/TenantMessageThreads.tsx`)
- Managing settings (`islands/TenantSettings.tsx`) - Managing settings (`islands/TenantSettings.tsx`)
- **Enhance User Onboarding**: Improve the onboarding flow for both new landlords and tenants in `routes/onboarding/`. - **Enhance User Onboarding**: Improve the onboarding flow for both new
- **Develop User Profile Management**: Complete the user profile editing and management features in `routes/user-profile/`. landlords and tenants in `routes/onboarding/`.
- **Develop User Profile Management**: Complete the user profile editing and
management features in `routes/user-profile/`.
## Future Features & Refinements ## Future Features & Refinements
- **AI/ML Feature Integration**: The advanced features found in the `islands/` directory need further development and integration into the user experience. This includes:
- **AI/ML Feature Integration**: The advanced features found in the `islands/`
directory need further development and integration into the user experience.
This includes:
- `BrainStudy.tsx` - `BrainStudy.tsx`
- `Quizzing.tsx` - `Quizzing.tsx`
- `ImageGenerater.tsx` - `ImageGenerater.tsx`
- `VoiceRecorder.tsx` - `VoiceRecorder.tsx`
- **Calendar Functionality**: Expand the calendar features in `routes/calendar/` and improve the `islands/FinancialCalendar.tsx` component to be more interactive and informative. - **Calendar Functionality**: Expand the calendar features in `routes/calendar/`
- **Document Management**: Build out a robust document upload, storage, and sharing system for leases, notices, and other rental-related documents. and improve the `islands/FinancialCalendar.tsx` component to be more
- **Reminders and Notifications**: Implement a system for sending automated reminders for rent payments, lease renewals, and other important events. interactive and informative.
- **Document Management**: Build out a robust document upload, storage, and
sharing system for leases, notices, and other rental-related documents.
- **Reminders and Notifications**: Implement a system for sending automated
reminders for rent payments, lease renewals, and other important events.

View File

@ -75,8 +75,8 @@ export default function PaymentMethodsList(
if (decryptedData) { if (decryptedData) {
const accountNumber = decryptedData; const accountNumber = decryptedData;
// Show only last 4 digits // Show only last 4 digits
processedMethod.maskedAccountNumber = processedMethod.maskedAccountNumber = "****" +
"****" + accountNumber.slice(-4); accountNumber.slice(-4);
} }
} catch (error) { } catch (error) {
console.error("Failed to decrypt account number:", error); console.error("Failed to decrypt account number:", error);
@ -93,8 +93,8 @@ export default function PaymentMethodsList(
if (decryptedData) { if (decryptedData) {
const routingNumber = decryptedData; const routingNumber = decryptedData;
// Show only last 4 digits // Show only last 4 digits
processedMethod.maskedRoutingNumber = processedMethod.maskedRoutingNumber = "****" +
"****" + routingNumber.slice(-4); routingNumber.slice(-4);
} }
} catch (error) { } catch (error) {
console.error("Failed to decrypt routing number:", error); console.error("Failed to decrypt routing number:", error);
@ -147,7 +147,8 @@ export default function PaymentMethodsList(
{popupAddPaymentMethodDialog} {popupAddPaymentMethodDialog}
<div class="space-y-4"> <div class="space-y-4">
{processedMethods.length === 0 ? ( {processedMethods.length === 0
? (
<div class="text-center py-12 bg-white rounded-lg shadow"> <div class="text-center py-12 bg-white rounded-lg shadow">
<svg <svg
xmlns="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg"
@ -177,7 +178,8 @@ export default function PaymentMethodsList(
Add Payment Method Add Payment Method
</button> </button>
</div> </div>
) : ( )
: (
<> <>
<ul class="space-y-4"> <ul class="space-y-4">
{processedMethods.map((method) => ( {processedMethods.map((method) => (

View File

@ -51,8 +51,10 @@ export default function AddPaymentMethodDialog(
const formData = new FormData(formRef.current); const formData = new FormData(formRef.current);
const bankName = formData.get("bank_name")?.toString().trim() || ""; const bankName = formData.get("bank_name")?.toString().trim() || "";
const accountType = formData.get("account_type")?.toString() || ""; const accountType = formData.get("account_type")?.toString() || "";
const routingNumber = formData.get("routing_number")?.toString().trim() || ""; const routingNumber = formData.get("routing_number")?.toString().trim() ||
const accountNumber = formData.get("account_number")?.toString().trim() || ""; "";
const accountNumber = formData.get("account_number")?.toString().trim() ||
"";
const isDefault = formData.get("is_default") === "true"; const isDefault = formData.get("is_default") === "true";
const sender = typeof location !== "undefined" ? location.pathname : "/"; const sender = typeof location !== "undefined" ? location.pathname : "/";
@ -64,8 +66,10 @@ export default function AddPaymentMethodDialog(
}; };
setFieldErrors(validation); setFieldErrors(validation);
if (validation.bank_name || validation.account_type || if (
validation.routing_number || validation.account_number) { validation.bank_name || validation.account_type ||
validation.routing_number || validation.account_number
) {
return; return;
} }

View File

@ -201,5 +201,3 @@ if (isAppReady) {
// if (import.meta.main) { // if (import.meta.main) {
// await app.listen(); // await app.listen();
// } // }

View File

@ -90,4 +90,3 @@ export const handler = define.handlers({
} }
}, },
}); });

View File

@ -38,7 +38,9 @@ export const handler = define.handlers({
<div class="row"><div class="label">Lease ID</div><div class="value">${leaseId}</div></div> <div class="row"><div class="label">Lease ID</div><div class="value">${leaseId}</div></div>
<div class="row"><div class="label">Amount</div><div class="value">$${amount.toLocaleString()}</div></div> <div class="row"><div class="label">Amount</div><div class="value">$${amount.toLocaleString()}</div></div>
<div class="row"><div class="label">Method</div><div class="value">${method}</div></div> <div class="row"><div class="label">Method</div><div class="value">${method}</div></div>
<div class="row"><div class="label">Date</div><div class="value">${new Date(date).toLocaleString()}</div></div> <div class="row"><div class="label">Date</div><div class="value">${
new Date(date).toLocaleString()
}</div></div>
</div> </div>
</body> </body>
</html>`; </html>`;
@ -49,4 +51,3 @@ export const handler = define.handlers({
}); });
}, },
}); });

View File

@ -43,20 +43,3 @@ export const handler = define.handlers({
} }
}, },
}); });

View File

@ -282,4 +282,3 @@ export default define.page(function LandlordPayments({ data }) {
</div> </div>
); );
}); });

View File

@ -150,40 +150,3 @@ export default define.page(function InviteTenantPage({ data }) {
</div> </div>
); );
}); });

View File

@ -21,9 +21,7 @@ export default define.page(function RentConfirmation({ data }) {
<h1 class="text-2xl font-bold text-green-700 mb-2"> <h1 class="text-2xl font-bold text-green-700 mb-2">
Payment Successful Payment Successful
</h1> </h1>
{amount && ( {amount && <p class="text-gray-700 mb-4">Amount: ${amount}</p>}
<p class="text-gray-700 mb-4">Amount: ${amount}</p>
)}
<p class="text-gray-600 mb-6"> <p class="text-gray-600 mb-6">
A receipt is available from your payment history. A receipt is available from your payment history.
</p> </p>
@ -55,4 +53,3 @@ export default define.page(function RentConfirmation({ data }) {
</div> </div>
); );
}); });

View File

@ -387,4 +387,3 @@ export async function cancelAutoPayment(
.where(eq(leases.id, lease_id)) .where(eq(leases.id, lease_id))
.returning(); .returning();
} }

View File

@ -592,4 +592,3 @@ export async function upsertAccessToken(tokenResponse: AccessTokenResponse) {
tokenResponse, tokenResponse,
); );
} }