Browse Source

chore: refactor fireWealth to new definition

pull/5644/head
FlavienLM 1 month ago
parent
commit
74a7a5bfda
  1. 1
      apps/api/src/app/portfolio/portfolio.controller.ts
  2. 10
      apps/api/src/app/portfolio/portfolio.service.ts
  3. 27
      apps/client/src/app/pages/portfolio/fire/fire-page.component.ts
  4. 4
      apps/client/src/app/pages/portfolio/fire/fire-page.html
  5. 3
      libs/common/src/lib/interfaces/fire-wealth.interface.ts
  6. 2
      libs/common/src/lib/interfaces/index.ts
  7. 6
      libs/common/src/lib/interfaces/portfolio-summary.interface.ts
  8. 6
      libs/ui/src/lib/fire-calculator/fire-calculator.component.stories.ts
  9. 18
      libs/ui/src/lib/fire-calculator/fire-calculator.component.ts

1
apps/api/src/app/portfolio/portfolio.controller.ts

@ -195,7 +195,6 @@ export class PortfolioController {
'excludedAccountsAndActivities',
'fees',
'filteredValueInBaseCurrency',
'fireWealth',
'grossPerformance',
'grossPerformanceWithCurrencyEffect',
'interest',

10
apps/api/src/app/portfolio/portfolio.service.ts

@ -2092,9 +2092,13 @@ export class PortfolioService {
filteredValueInPercentage: netWorth
? filteredValueInBaseCurrency.div(netWorth).toNumber()
: undefined,
fireWealth: new Big(currentValueInBaseCurrency)
.minus(emergencyFundHoldingsValueInBaseCurrency)
.toNumber(),
fireWealth: {
today: {
valueInBaseCurrency: new Big(currentValueInBaseCurrency)
.minus(emergencyFundHoldingsValueInBaseCurrency)
.toNumber()
}
},
grossPerformance: new Big(netPerformance).plus(fees).toNumber(),
grossPerformanceWithCurrencyEffect: new Big(
netPerformanceWithCurrencyEffect

27
apps/client/src/app/pages/portfolio/fire/fire-page.component.ts

@ -1,7 +1,7 @@
import { DataService } from '@ghostfolio/client/services/data.service';
import { ImpersonationStorageService } from '@ghostfolio/client/services/impersonation-storage.service';
import { UserService } from '@ghostfolio/client/services/user/user.service';
import { User } from '@ghostfolio/common/interfaces';
import { FireWealth, User } from '@ghostfolio/common/interfaces';
import { hasPermission, permissions } from '@ghostfolio/common/permissions';
import { GfFireCalculatorComponent } from '@ghostfolio/ui/fire-calculator';
import { GfPremiumIndicatorComponent } from '@ghostfolio/ui/premium-indicator';
@ -29,7 +29,7 @@ import { takeUntil } from 'rxjs/operators';
})
export class GfFirePageComponent implements OnDestroy, OnInit {
public deviceType: string;
public fireWealth: Big;
public fireWealth: FireWealth;
public hasImpersonationId: boolean;
public hasPermissionToUpdateUserSettings: boolean;
public isLoading = false;
@ -55,17 +55,24 @@ export class GfFirePageComponent implements OnDestroy, OnInit {
.fetchPortfolioDetails()
.pipe(takeUntil(this.unsubscribeSubject))
.subscribe(({ summary }) => {
this.fireWealth = summary.fireWealth
? new Big(summary.fireWealth)
: new Big(0);
this.fireWealth = {
today: {
valueInBaseCurrency: summary.fireWealth
? summary.fireWealth.today.valueInBaseCurrency
: 0
}
};
if (this.user.subscription?.type === 'Basic') {
this.fireWealth = new Big(10000);
this.fireWealth = {
today: {
valueInBaseCurrency: 10000
}
};
}
this.withdrawalRatePerYear = this.fireWealth.mul(
this.user.settings.safeWithdrawalRate
);
this.withdrawalRatePerYear = Big(
this.fireWealth.today.valueInBaseCurrency
).mul(this.user.settings.safeWithdrawalRate);
this.withdrawalRatePerMonth = this.withdrawalRatePerYear.div(12);

4
apps/client/src/app/pages/portfolio/fire/fire-page.html

@ -14,7 +14,7 @@
[colorScheme]="user?.settings?.colorScheme"
[currency]="user?.settings?.baseCurrency"
[deviceType]="deviceType"
[fireWealth]="fireWealth?.toNumber()"
[fireWealth]="fireWealth?.today.valueInBaseCurrency"
[hasPermissionToUpdateUserSettings]="
!hasImpersonationId && hasPermissionToUpdateUserSettings
"
@ -100,7 +100,7 @@
[isCurrency]="true"
[locale]="user?.settings?.locale"
[unit]="user?.settings?.baseCurrency"
[value]="fireWealth?.toNumber()"
[value]="fireWealth?.today.valueInBaseCurrency"
/>
</span>
<ng-container>&nbsp;</ng-container>

3
libs/common/src/lib/interfaces/fire-wealth.interface.ts

@ -0,0 +1,3 @@
export interface FireWealth {
today: { valueInBaseCurrency: number };
}

2
libs/common/src/lib/interfaces/index.ts

@ -19,6 +19,7 @@ import type { EnhancedSymbolProfile } from './enhanced-symbol-profile.interface'
import type { Export } from './export.interface';
import type { FilterGroup } from './filter-group.interface';
import type { Filter } from './filter.interface';
import { FireWealth } from './fire-wealth.interface';
import type { HistoricalDataItem } from './historical-data-item.interface';
import type { HoldingWithParents } from './holding-with-parents.interface';
import type { Holding } from './holding.interface';
@ -104,6 +105,7 @@ export {
Export,
Filter,
FilterGroup,
FireWealth,
HistoricalDataItem,
HistoricalResponse,
Holding,

6
libs/common/src/lib/interfaces/portfolio-summary.interface.ts

@ -16,7 +16,11 @@ export interface PortfolioSummary extends PortfolioPerformance {
fees: number;
filteredValueInBaseCurrency?: number;
filteredValueInPercentage?: number;
fireWealth: number;
fireWealth: {
today: {
valueInBaseCurrency: number;
};
};
grossPerformance: number;
grossPerformanceWithCurrencyEffect: number;
interest: number;

6
libs/ui/src/lib/fire-calculator/fire-calculator.component.stories.ts

@ -45,7 +45,11 @@ type Story = StoryObj<GfFireCalculatorComponent>;
export const Simple: Story = {
args: {
currency: 'USD',
fireWealth: 50000,
fireWealth: {
today: {
valueInBaseCurrency: 50000
}
},
locale: locale
}
};

18
libs/ui/src/lib/fire-calculator/fire-calculator.component.ts

@ -4,6 +4,7 @@ import {
} from '@ghostfolio/common/chart-helper';
import { primaryColorRgb } from '@ghostfolio/common/config';
import { getLocale } from '@ghostfolio/common/helper';
import { FireWealth } from '@ghostfolio/common/interfaces';
import { ColorScheme } from '@ghostfolio/common/types';
import { CommonModule } from '@angular/common';
@ -79,7 +80,7 @@ export class GfFireCalculatorComponent implements OnChanges, OnDestroy {
@Input() colorScheme: ColorScheme;
@Input() currency: string;
@Input() deviceType: string;
@Input() fireWealth: number;
@Input() fireWealth: FireWealth;
@Input() hasPermissionToUpdateUserSettings: boolean;
@Input() locale = getLocale();
@Input() projectedTotalAmount: number;
@ -156,12 +157,15 @@ export class GfFireCalculatorComponent implements OnChanges, OnDestroy {
}
public ngOnChanges() {
if (isNumber(this.fireWealth) && this.fireWealth >= 0) {
if (
isNumber(this.fireWealth.today.valueInBaseCurrency) &&
this.fireWealth.today.valueInBaseCurrency >= 0
) {
this.calculatorForm.setValue(
{
annualInterestRate: this.annualInterestRate ?? 5,
paymentPerPeriod: this.savingsRate ?? 0,
principalInvestmentAmount: this.fireWealth,
principalInvestmentAmount: this.fireWealth.today.valueInBaseCurrency,
projectedTotalAmount: this.projectedTotalAmount ?? 0,
retirementDate: this.retirementDate ?? this.DEFAULT_RETIREMENT_DATE
},
@ -393,9 +397,11 @@ export class GfFireCalculatorComponent implements OnChanges, OnDestroy {
r
});
datasetDeposit.data.push(this.fireWealth);
datasetDeposit.data.push(this.fireWealth.today.valueInBaseCurrency);
datasetInterest.data.push(interest.toNumber());
datasetSavings.data.push(principal.minus(this.fireWealth).toNumber());
datasetSavings.data.push(
principal.minus(this.fireWealth.today.valueInBaseCurrency)
);
}
return {
@ -405,7 +411,7 @@ export class GfFireCalculatorComponent implements OnChanges, OnDestroy {
}
private getP() {
return this.fireWealth || 0;
return this.fireWealth.today.valueInBaseCurrency || 0;
}
private getPeriodsToRetire(): number {

Loading…
Cancel
Save