Commit Graph

277 Commits

Author SHA1 Message Date
Víctor Falcón 367abb9a69 feat: add version tracking with git tags and changelog
- Add version field to package.json (0.1.0)
- Install release-it for automated releases with conventional changelog
- Create .release-it.json configuration
- Create initial CHANGELOG.md
- Share version via Inertia (reads from package.json)
- Display version in user dropdown menu
2025-12-28 18:43:27 +01:00
Víctor Falcón 841cec6037 chore: update PWA maskable icons 2025-12-28 18:16:48 +01:00
Víctor Falcón d9647a543a fix(charts): mobile ui, and desktop tooltips 2025-12-27 16:49:02 +00:00
Víctor Falcón 88594b9281 fix(mobile): account chart 2025-12-27 16:24:47 +00:00
Víctor Falcón 5fff2afa08
feat: add multiple chart view modes for net worth evolution (#37)
## Summary

- Add four view modes for net worth and account balance charts:
- **Stacked Accounts**: existing stacked bar chart showing balances by
account
  - **Line**: net worth line chart with linear/log scale toggle
  - **Change**: bar chart showing MoM%, YoY%, Rolling 12M changes
- **Waterfall**: bridge chart showing Start -> Change -> End transition

- Add Vitest for frontend unit testing with 52 tests covering all
calculation functions
- Proper sign handling for liabilities (credit cards and loans subtract
from net worth)
- Log scale disabled with warning when net worth includes zero or
negative values
- Shared components and logic between dashboard and account detail
charts

## New Files

- `vitest.config.ts` - Vitest configuration
- `resources/js/lib/chart-calculations.ts` - Pure computation functions
- `resources/js/lib/chart-calculations.test.ts` - 52 unit tests
- `resources/js/hooks/use-chart-views.ts` - Shared chart view state hook
- `resources/js/components/charts/` - Reusable chart components

## Test plan

- [x] Dashboard net worth chart shows view toggle and all four views
work
- [ ] Account detail page chart shows view toggle and three views work
(no stacked)
- [x] Line chart scale toggle works (log disabled with warning when
applicable)
- [x] Change chart series toggle (MoM, YoY, 12M EUR, 12M %) works
- [x] Waterfall chart month selector works
- [x] All 52 unit tests pass (`bun run test`)
- [x] Build succeeds (`bun run build`)
- [x] Dark mode styling correct
2025-12-27 13:54:22 +00:00
Víctor Falcón c88318e951
fix(sync): make transaction creation idempotent (#38)
## Summary
- When a transaction ID is provided during sync, check if it already
exists before creating
- If it exists, return the existing transaction with 200 status instead
of failing with duplicate key error
- Prevents duplicate transactions when sync retries occur due to network
issues

## Test plan
- [x] Attempt to create a transaction with a specific ID
- [x] Attempt to create another transaction with the same ID
- [x] Verify the second request returns the existing transaction instead
of an error
2025-12-27 13:23:05 +00:00
Víctor Falcón e6cab5eef5 ui: add hasKeyboard prop to modals 2025-12-25 13:03:38 +00:00
Víctor Falcón 08a75ddcca ui(fix): add hasKeyboard prop to dialogs
This property move the modal to the top on mobile, so we left space
bellow for the keyboard. On desktop is vertically centered as it was
before.
2025-12-25 12:33:25 +00:00
Víctor Falcón 1db8aa4643 ui(fix): use amount display for chart current balance 2025-12-25 12:15:35 +00:00
Víctor Falcón e84929d746 ui(fix): responsive design on account show page 2025-12-25 12:11:43 +00:00
Víctor Falcón 6e2ea65757 ui(fix): disable svg focus outline 2025-12-25 11:45:30 +00:00
Víctor Falcón a454d7ec25 Disable recharts outline 2025-12-24 17:51:48 +00:00
Víctor Falcón 70d6afec53 ui(fix): transaction filters on small screens 2025-12-24 12:52:20 +00:00
Víctor Falcón 9ac46a37e0 Add retry mechanism to email mailables and update supervisor config 2025-12-18 15:38:04 +01:00
Víctor Falcón 3eaa46fa27 feat(queue): Implement queueable email jobs with rate limiting 2025-12-18 12:54:05 +01:00
Víctor Falcón fb5c09dcd8 fix: use markdown to send user lead invitation mail 2025-12-18 12:12:31 +01:00
Víctor Falcón eb6d3ce091 welcome-page: explain e2e encryption 2025-12-18 09:33:34 +01:00
Víctor Falcón 7abc86218c command: send email to leads 2025-12-18 09:14:04 +01:00
Víctor Falcón c99812ae70 welcome-page: remove lead form 2025-12-18 08:49:15 +01:00
Víctor Falcón 10821e6679 Reapply "swap horizon -> queue:work on mysql"
This reverts commit 43d615869c.
2025-12-17 18:00:32 +01:00
Víctor Falcón 4a9f74d1b1 add best value to yearly price 2025-12-17 17:36:56 +01:00
Víctor Falcón 8f1f8dd405 fix: rong schedule import 2025-12-17 17:09:01 +01:00
Víctor Falcón f94110c83a pint 2025-12-17 17:08:02 +01:00
Víctor Falcón 9f5dedc8b9 horizon: notify admin is env var is set 2025-12-17 17:02:21 +01:00
Víctor Falcón d5d3c1ef1b horizon: takes snapshot every 5 min 2025-12-17 17:02:05 +01:00
Víctor Falcón 43d615869c Revert "swap horizon -> queue:work on mysql"
This reverts commit 214ad684a8.
2025-12-17 16:31:48 +01:00
Víctor Falcón 214ad684a8 swap horizon -> queue:work on mysql 2025-12-17 16:24:38 +01:00
Víctor Falcón 67347c36ed mail: whisper money logo on header 2025-12-17 15:29:55 +01:00
Víctor Falcón 35d91a3b13 chore(commands): unify command signatures 2025-12-17 12:36:57 +01:00
Víctor Falcón bbbe8e31bf command: delete user 2025-12-17 12:33:18 +01:00
Víctor Falcón 08f5d1f947 Test mail drip command 2025-12-17 12:23:32 +01:00
Víctor Falcón 2f6ee33d4d mails: header email 2025-12-17 12:08:36 +01:00
Víctor Falcón dbe9b8956f production: remove redis config 2025-12-17 11:53:28 +01:00
Víctor Falcón f36ddb4f36 Event listeners are autowired 2025-12-17 09:46:44 +01:00
Víctor Falcón 9cb063e515 Horizon: remove basic auth, add allowed emails list to env 2025-12-17 09:10:15 +01:00
Víctor Falcón 73bb25ae8f
feat: Implement drip email campaign system (#35)
## Summary

- Implement event-driven drip email campaign system for new user signups
- Add 5 targeted emails based on user journey (welcome, onboarding
reminder, promo code, import help, feedback)
- Configure Laravel Horizon with Redis queue for reliable job processing
- Track sent emails in `user_mail_logs` table to prevent duplicates

## Email Schedule

| Email | Timing | Condition |
|-------|--------|-----------|
| Welcome | 30 min after signup | All users |
| Onboarding Reminder | 1 day after signup | Not onboarded |
| Promo Code (FOUNDER) | 1 day after signup | Onboarded + has
transactions + not subscribed |
| Import Help | 1 day after signup | Onboarded + no transactions + not
subscribed |
| Feedback | 5 days after signup | Not subscribed |

## Architecture

```
User Registers → ScheduleDripEmailsListener
    ├─> SendWelcomeEmailJob (30 min delay)
    ├─> SendOnboardingReminderEmailJob (1 day delay)
    ├─> SendPromoCodeEmailJob (1 day delay)
    ├─> SendImportHelpEmailJob (1 day delay)
    └─> SendFeedbackEmailJob (5 days delay)
```

Each job checks conditions at execution time and either sends the email
+ logs it, or silently completes.

## Test plan

- [x] All 23 drip email tests pass
- [x] Migration creates `user_mail_logs` table
- [x] Jobs dispatch with correct delays
- [x] Emails only sent when conditions are met
- [x] Duplicate emails prevented via UserMailLog check
- [ ] Verify Horizon processes jobs in production
2025-12-17 08:34:17 +01:00
Víctor Falcón 54833fcdc0
feat: Configure Resend email integration (#34)
- Install symfony/resend-mailer package for Resend support
- Add RESEND_API_KEY to .env.example with documentation
- Create mail:test command to verify email configuration
- Users can now set MAIL_MAILER=resend in .env to use Resend
- Test command usage: php artisan mail:test email@example.com

---------

Co-authored-by: Claude <noreply@anthropic.com>
2025-12-16 14:57:19 +01:00
Víctor Falcón d6ec9ff290 new onboarding funnel id 2025-12-16 13:39:47 +01:00
Víctor Falcón 4b88146383 funnel: transaction import wizard 2025-12-16 13:30:04 +01:00
Víctor Falcón 890593d967 fix: automated rules broken and now they work in batches 2025-12-16 12:01:38 +01:00
Víctor Falcón c3b1a8df4c Laravel boost: add instructions for claude 2025-12-16 11:53:38 +01:00
Víctor Falcón 2c223dfb65 Importing transactions: action notification to categorize them 2025-12-16 11:41:42 +01:00
Víctor Falcón 716e21b219 fix: toast on mobile 2025-12-16 11:31:02 +01:00
Víctor Falcón f8bea791e8
Bulk actions/select all (#33) 2025-12-15 17:59:58 +01:00
Víctor Falcón 045c7a5752 fix: bulk action bar style 2025-12-15 14:43:45 +01:00
Víctor Falcón c9e08766c1 Update automated rule timestamp when adding/removing a category or label 2025-12-15 14:30:35 +01:00
Víctor Falcón bf0c9ae989
fix: Automated rules with labels (#32) 2025-12-15 13:42:12 +01:00
Víctor Falcón bf69d4fd3b
Onboarding fix (#31) 2025-12-15 12:44:29 +01:00
Víctor Falcón fe5a55b1be
Automated rules labels (#30)
![Uploading image.png…]()
2025-12-15 12:11:55 +01:00
Víctor Falcón 4c26c7588d
Amount display format (#29) 2025-12-15 10:44:13 +01:00