Skip to content

Commit

Permalink
add future value
Browse files Browse the repository at this point in the history
  • Loading branch information
praslnx8 committed Jan 2, 2024
1 parent 84cf3a5 commit a223ef9
Show file tree
Hide file tree
Showing 4 changed files with 70 additions and 49 deletions.
81 changes: 48 additions & 33 deletions .github/workflows/dart.yml
Original file line number Diff line number Diff line change
@@ -1,42 +1,57 @@
# This workflow uses actions that are not certified by GitHub.
# They are provided by a third-party and are governed by
# separate terms of service, privacy policy, and support
# documentation.

name: Dart
name: Build & deploy

on:
push:
branches: [ "master" ]
branches:
- master
pull_request:
branches: [ "master" ]
branches:
- master

jobs:
build:
name: Build
runs-on: ubuntu-latest

steps:
- uses: actions/checkout@v3

# Note: This workflow uses the latest stable version of the Dart SDK.
# You can specify other versions if desired, see documentation here:
# https://github.com/dart-lang/setup-dart/blob/main/README.md
# - uses: dart-lang/setup-dart@v1
- uses: dart-lang/setup-dart@9a04e6d73cca37bd455e0608d7e5092f881fd603

- name: Install dependencies
run: flutter pub get

# Uncomment this step to verify the use of 'dart format' on each commit.
# - name: Verify formatting
# run: dart format --output=none --set-exit-if-changed .

# Consider passing '--fatal-infos' for slightly stricter analysis.
- name: Analyze project source
run: dart analyze

# Your project will need to have tests in test/ and a dependency on
# package:test for this step to succeed. Note that Flutter projects will
# want to change this to 'flutter test'.
- name: Run tests
run: dart test
- name: Checkout code
uses: actions/checkout@v2

- name: Install Flutter
uses: subosito/flutter-action@v1
with:
flutter-version: '2.0.5'

- name: Get dependencies
run: flutter pub get

- name: Test project
run: flutter test

- name: Build release project
run: flutter build web

- name: Upload production-ready build files
uses: actions/upload-artifact@v2
with:
name: production-files
path: ./build/web

deploy:
name: Deploy
needs: build
runs-on: ubuntu-latest
if: github.ref == 'refs/heads/master'

steps:
- name: Download artifact
uses: actions/download-artifact@v2
with:
name: production-files
path: ./build

- name: Deploy to gh-pages
uses: peaceiris/actions-gh-pages@v3
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
publish_dir: ./build
20 changes: 9 additions & 11 deletions lib/domain/models/goal.dart
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
import 'dart:math';

import 'package:wealth_wave/api/db/app_database.dart';
import 'package:wealth_wave/contract/goal_importance.dart';
import 'package:wealth_wave/domain/models/investment.dart';
Expand Down Expand Up @@ -61,15 +59,6 @@ class Goal {
.reduce((a, b) => a + b);
}

double getFutureValueOnTargetDate() {
double yearsLeft = getYearsLeft();
double growthRate = getIrr();
double value = getInvestedValue();

double progressedValue = value * pow(1 + growthRate, yearsLeft);
return progressedValue;
}

double getProgress() {
double progress = targetAmount > 0 ? getInvestedValue() / targetAmount : 0;
return progress;
Expand All @@ -79,6 +68,15 @@ class Goal {
return targetDate.difference(DateTime.now()).inDays.toDouble() / 365;
}

double getFutureValueOnTargetDate() {
if (taggedInvestments.isEmpty) {
return 0;
}
return taggedInvestments.entries
.map((e) => e.key.getFutureValueOn(targetDate) * e.value)
.reduce((a, b) => a + b);
}

static Goal from(
{required final GoalDO goal,
required final Map<Investment, double> taggedInvestments}) =>
Expand Down
10 changes: 10 additions & 0 deletions lib/domain/models/investment.dart
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
import 'dart:math';

import 'package:wealth_wave/api/db/app_database.dart';
import 'package:wealth_wave/contract/risk_level.dart';
import 'package:wealth_wave/domain/irr_calculator.dart';
Expand Down Expand Up @@ -37,6 +39,14 @@ class Investment {
);
}

double getFutureValueOn(DateTime date) {
double? irr = getIrr();
if (irr == null) {
return value;
}
return value * pow(1 + irr, date.difference(valueUpdatedOn).inDays / 365);
}

static Investment from(
{required final InvestmentEnrichedDO investment,
required final List<TransactionDO> transactions,
Expand Down
8 changes: 3 additions & 5 deletions lib/ui/pages/goals_page.dart
Original file line number Diff line number Diff line change
Expand Up @@ -115,16 +115,14 @@ class _GoalsPage extends PageState<GoalsViewState, GoalsPage, GoalsPresenter> {
style: Theme.of(context).textTheme.labelSmall),
],
),
const SizedBox(width: AppDimen.minPadding), //
Column(
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Text(formatToCurrency(goal.getFutureValueOnTargetDate()),
style: Theme.of(context).textTheme.bodyMedium),
Text('(Predicted Amount at Target Date)',
style: Theme.of(context).textTheme.labelSmall),
Text(formatToPercentage(goal.getIrr()),
style: Theme.of(context).textTheme.bodyMedium),
Text('(Growth Rate)',
Text(
'(At growth Rate of ${formatToPercentage(goal.getIrr())})',
style: Theme.of(context).textTheme.labelSmall),
],
),
Expand Down

0 comments on commit a223ef9

Please sign in to comment.