From 6ff1d65a7092f783e088603f9be7e39552c4f09b Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Tue, 30 Sep 2025 08:40:11 +0200 Subject: [PATCH] Feature/add safe withdrawal rate to user settings (#5629) * Add safe withdrawal rate to user settings * Update changelog --- CHANGELOG.md | 10 ++++++++++ apps/api/src/app/user/update-user-setting.dto.ts | 4 ++++ apps/api/src/app/user/user.service.ts | 5 +++++ .../app/pages/portfolio/fire/fire-page.component.ts | 5 ++++- .../src/app/pages/portfolio/fire/fire-page.html | 12 ++++++++++-- .../src/lib/interfaces/user-settings.interface.ts | 1 + 6 files changed, 34 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8ddf62e81..36d4cbec2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,16 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## Unreleased + +### Added + +- Added the safe withdrawal rate to the user settings (experimental) + +### Changed + +- Improved the wording of the 4% rule in the _FIRE_ section + ## 2.203.0 - 2025-09-27 ### Added diff --git a/apps/api/src/app/user/update-user-setting.dto.ts b/apps/api/src/app/user/update-user-setting.dto.ts index b34b6fae2..3ee59f7dd 100644 --- a/apps/api/src/app/user/update-user-setting.dto.ts +++ b/apps/api/src/app/user/update-user-setting.dto.ts @@ -104,6 +104,10 @@ export class UpdateUserSettingDto { @IsOptional() retirementDate?: string; + @IsNumber() + @IsOptional() + safeWithdrawalRate?: number; + @IsNumber() @IsOptional() savingsRate?: number; diff --git a/apps/api/src/app/user/user.service.ts b/apps/api/src/app/user/user.service.ts index 6512fbbc2..f797270ff 100644 --- a/apps/api/src/app/user/user.service.ts +++ b/apps/api/src/app/user/user.service.ts @@ -265,6 +265,11 @@ export class UserService { PerformanceCalculationType.ROAI; } + // Set default value for safe withdrawal rate + if (!(user.settings.settings as UserSettings)?.safeWithdrawalRate) { + (user.settings.settings as UserSettings).safeWithdrawalRate = 0.04; + } + // Set default value for view mode if (!(user.settings.settings as UserSettings).viewMode) { (user.settings.settings as UserSettings).viewMode = 'DEFAULT'; diff --git a/apps/client/src/app/pages/portfolio/fire/fire-page.component.ts b/apps/client/src/app/pages/portfolio/fire/fire-page.component.ts index 83650d9ca..ab0fbc787 100644 --- a/apps/client/src/app/pages/portfolio/fire/fire-page.component.ts +++ b/apps/client/src/app/pages/portfolio/fire/fire-page.component.ts @@ -63,7 +63,10 @@ export class GfFirePageComponent implements OnDestroy, OnInit { this.fireWealth = new Big(10000); } - this.withdrawalRatePerYear = this.fireWealth.mul(4).div(100); + this.withdrawalRatePerYear = this.fireWealth.mul( + this.user.settings.safeWithdrawalRate + ); + this.withdrawalRatePerMonth = this.withdrawalRatePerYear.div(12); this.isLoading = false; diff --git a/apps/client/src/app/pages/portfolio/fire/fire-page.html b/apps/client/src/app/pages/portfolio/fire/fire-page.html index 77fd1640c..dd29dbcc8 100644 --- a/apps/client/src/app/pages/portfolio/fire/fire-page.html +++ b/apps/client/src/app/pages/portfolio/fire/fire-page.html @@ -37,7 +37,7 @@

- 4% Rule + Sustainable retirement income @if (user?.subscription?.type === 'Basic') { } @@ -96,7 +96,15 @@ [value]="fireWealth?.toNumber()" /> - and a withdrawal rate of 4%. + and a safe withdrawal rate (SWR) of + .

} diff --git a/libs/common/src/lib/interfaces/user-settings.interface.ts b/libs/common/src/lib/interfaces/user-settings.interface.ts index e5c65f82d..65325a42f 100644 --- a/libs/common/src/lib/interfaces/user-settings.interface.ts +++ b/libs/common/src/lib/interfaces/user-settings.interface.ts @@ -29,6 +29,7 @@ export interface UserSettings { performanceCalculationType?: PerformanceCalculationType; projectedTotalAmount?: number; retirementDate?: string; + safeWithdrawalRate?: number; savingsRate?: number; viewMode?: ViewMode; xRayRules?: XRayRulesSettings;