@@ -0,0 +1,55 @@
|
||||
# rental_income_tracker
|
||||
|
||||
Simple Flutter app to track US rental income and convert to SEK for Swedish tax reporting.
|
||||
|
||||
## What it does
|
||||
|
||||
- Stores a default monthly rent amount in USD.
|
||||
- Shows year-based monthly rows in a table (January to current month for current year, full year for past years).
|
||||
- Marks each month as Paid on time, Paid late, Not paid, Pending, or Not occupied.
|
||||
- Saves USD amount, SEK amount, and USD->SEK rate when a payment is logged.
|
||||
- Schedules local rent check notifications with Yes/No actions.
|
||||
- Retries one time on the next eligible day if not confirmed.
|
||||
- Supports one-click backfill for last year using 1st-of-month EST rates.
|
||||
- Exports local data as a data file.
|
||||
|
||||
## Important business rules implemented
|
||||
|
||||
- On-time means payment is confirmed on or before the 1st at 23:59 EST.
|
||||
- Notification cycle starts after EST midnight and respects local quiet hours (no reminders after local 23:00).
|
||||
- If a notification would fall after local quiet hours, it is deferred to 09:00 local.
|
||||
- If occupancy is turned off, notifications stop and current/future months are marked Not occupied.
|
||||
- Updating rent amount applies to future payment logs.
|
||||
|
||||
## Setup
|
||||
|
||||
1. Set your Open Exchange Rates app key in `lib/state/rent_controller.dart`:
|
||||
|
||||
```dart
|
||||
const String openExchangeApiKey = 'REPLACE_WITH_YOUR_OPENEXCHANGE_API_KEY';
|
||||
```
|
||||
|
||||
1. Install dependencies:
|
||||
|
||||
```bash
|
||||
flutter pub get
|
||||
```
|
||||
|
||||
1. Run:
|
||||
|
||||
```bash
|
||||
flutter run
|
||||
```
|
||||
|
||||
## Usage
|
||||
|
||||
1. Open Settings and set monthly rent in USD.
|
||||
2. Keep Unit occupied enabled while the property is rented.
|
||||
3. Use Backfill last year to import the previous year in one click.
|
||||
4. Use Export to write an export file to app documents storage.
|
||||
5. Use year arrows on the main screen to switch yearly views.
|
||||
|
||||
## Notes
|
||||
|
||||
- Data is stored locally on-device using shared preferences.
|
||||
- Notification action handling when the app is terminated may depend on OS behavior.
|
||||
Reference in New Issue
Block a user