From a223ef9d157585101350860de4de140677bb0050 Mon Sep 17 00:00:00 2001 From: Prasanna Anbazhagan Date: Tue, 2 Jan 2024 12:06:14 +0530 Subject: [PATCH] add future value --- .github/workflows/dart.yml | 81 ++++++++++++++++++------------- lib/domain/models/goal.dart | 20 ++++---- lib/domain/models/investment.dart | 10 ++++ lib/ui/pages/goals_page.dart | 8 ++- 4 files changed, 70 insertions(+), 49 deletions(-) diff --git a/.github/workflows/dart.yml b/.github/workflows/dart.yml index 664f9ed..6213850 100644 --- a/.github/workflows/dart.yml +++ b/.github/workflows/dart.yml @@ -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 \ No newline at end of file diff --git a/lib/domain/models/goal.dart b/lib/domain/models/goal.dart index 31d40e9..dee4fbe 100644 --- a/lib/domain/models/goal.dart +++ b/lib/domain/models/goal.dart @@ -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'; @@ -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; @@ -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 taggedInvestments}) => diff --git a/lib/domain/models/investment.dart b/lib/domain/models/investment.dart index 73cd559..29b13d4 100644 --- a/lib/domain/models/investment.dart +++ b/lib/domain/models/investment.dart @@ -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'; @@ -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 transactions, diff --git a/lib/ui/pages/goals_page.dart b/lib/ui/pages/goals_page.dart index 9386825..e99904c 100644 --- a/lib/ui/pages/goals_page.dart +++ b/lib/ui/pages/goals_page.dart @@ -115,16 +115,14 @@ class _GoalsPage extends PageState { 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), ], ),