Skip to content

Commit

Permalink
Added IRR Composition
Browse files Browse the repository at this point in the history
  • Loading branch information
praslnx8 committed Jun 23, 2024
1 parent c433e61 commit f6a24eb
Show file tree
Hide file tree
Showing 4 changed files with 82 additions and 4 deletions.
26 changes: 24 additions & 2 deletions lib/presentation/dashboard_presenter.dart
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import 'package:pair/pair.dart';
import 'package:wealth_wave/contract/risk_level.dart';
import 'package:wealth_wave/core/presenter.dart';
import 'package:wealth_wave/domain/models/investment.dart';
Expand Down Expand Up @@ -47,7 +48,6 @@ class DashboardPresenter extends Presenter<DashboardViewState> {
payments: payments,
value: totalValueOfInvestment,
valueUpdatedOn: DateTime.now());
final basketIrr = _calculateBasketIRR(investments);

updateViewState((viewState) {
viewState.invested = totalInvestedAmount;
Expand All @@ -60,7 +60,8 @@ class DashboardPresenter extends Presenter<DashboardViewState> {
viewState.valueOverTime = _getValueOverTime(investments);
viewState.investmentOverTime = _getInvestmentOverTime(investments);
viewState.overallIRR = overallIRR;
viewState.basketIrr = basketIrr;
viewState.basketIrr = _calculateBasketIRR(investments);
viewState.irrGroups = _calculateIRRGroups(investments);
});
});
}
Expand Down Expand Up @@ -160,6 +161,26 @@ class DashboardPresenter extends Presenter<DashboardViewState> {

return basketIRR;
}

Map<int, Pair<double, double>> _calculateIRRGroups(
List<Investment> investments) {
Map<int, Pair<double, double>> irrValue = {};
List<int> thresholds = [40, 20, 15, 12, 10, 8, 5, 0, -5, -10, -15, -20, -40];
for (var investment in investments) {
double investmentValue = investment.getValueOn(date: DateTime.now());
double investedAmount =
investment.getTotalInvestedAmount(till: DateTime.now());
int irr = investment.getIRR().toInt();
irr = thresholds.firstWhere((threshold) => irr > threshold, orElse: () => irr);
irrValue.update(
irr,
(value) =>
Pair(value.key + investedAmount, value.value + investmentValue),
ifAbsent: () => Pair(investedAmount, investmentValue));
}

return irrValue;
}
}

int _getIrrCompositionKey(double irr) {
Expand All @@ -185,6 +206,7 @@ class DashboardViewState {
Map<RiskLevel, double> riskComposition = {};
Map<String, double> basketComposition = {};
Map<String, double> basketIrr = {};
Map<int, Pair<double, double>> irrGroups = {};
Map<int, double> irrComposition = {};
Map<DateTime, double> investmentOverTime = {};
Map<DateTime, double> valueOverTime = {};
Expand Down
51 changes: 49 additions & 2 deletions lib/ui/pages/dashboard_page.dart
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart';
import 'package:intl/intl.dart';
import 'package:pair/pair.dart';
import 'package:pie_chart/pie_chart.dart';
import 'package:primer_progress_bar/primer_progress_bar.dart';
import 'package:syncfusion_flutter_charts/charts.dart';
Expand Down Expand Up @@ -58,6 +60,12 @@ class _DashboardPage
const SizedBox(height: AppDimen.minPadding),
_buildPieChart(snapshot.riskComposition),
const SizedBox(height: AppDimen.defaultPadding),
Text('IRR Contribution:',
style: Theme.of(context).textTheme.titleMedium),
const SizedBox(height: AppDimen.minPadding),
_buildAmountIrrContribution(
context: context,
irrData: snapshot.irrGroups.entries.toList()),
Text('Basket IRR:',
style: Theme.of(context).textTheme.titleMedium),
const SizedBox(height: AppDimen.minPadding),
Expand Down Expand Up @@ -146,8 +154,9 @@ class _DashboardPage
if (valueData.isNotEmpty && investedData.isNotEmpty) {
return SfCartesianChart(
primaryXAxis: const DateTimeAxis(),
primaryYAxis:
NumericAxis(numberFormat: NumberFormat.compactCurrency(symbol: '', locale: 'en_IN', decimalDigits: 0)),
primaryYAxis: NumericAxis(
numberFormat: NumberFormat.compactCurrency(
symbol: '', locale: 'en_IN', decimalDigits: 0)),
series: [
LineSeries<MapEntry<DateTime, double>, DateTime>(
color: Colors.green,
Expand Down Expand Up @@ -193,6 +202,44 @@ class _DashboardPage
}
}

Widget _buildAmountIrrContribution(
{required final BuildContext context,
required final List<MapEntry<int, Pair<double, double>>> irrData}) {
if (irrData.isNotEmpty) {
irrData.sort((a, b) => a.key.compareTo(b.key));
List<MapEntry<int, double>> invested = [];
List<MapEntry<int, double>> value = [];
for (var element in irrData) {
invested.add(MapEntry(element.key, element.value.key));
value.add(
MapEntry(element.key, element.value.value - element.value.key));
}
return SfCartesianChart(
primaryXAxis: CategoryAxis(
axisLabelFormatter: (axisLabelRenderArgs) => ChartAxisLabel(
'${axisLabelRenderArgs.text} %+', axisLabelRenderArgs.textStyle),
),
primaryYAxis: NumericAxis(
numberFormat: NumberFormat.compactCurrency(
symbol: '', locale: 'en_IN', decimalDigits: 0)),
series: [
StackedBarSeries(
dataSource: invested,
xValueMapper: (data, _) => data.key,
yValueMapper: (data, _) => data.value,
),
StackedBarSeries(
dataSource: value,
xValueMapper: (data, _) => data.key,
yValueMapper: (data, _) => data.value,
),
],
);
} else {
return const Text('');
}
}

String _getRiskLevelName(RiskLevel riskLevel) {
switch (riskLevel) {
case RiskLevel.veryLow:
Expand Down
8 changes: 8 additions & 0 deletions pubspec.lock
Original file line number Diff line number Diff line change
Expand Up @@ -438,6 +438,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "2.1.0"
pair:
dependency: "direct main"
description:
name: pair
sha256: "59ef7f052a9e8c1b208b0566d04c52a0e705e3e2f418255e8153a6f99687e1f6"
url: "https://pub.dev"
source: hosted
version: "0.1.2"
path:
dependency: "direct main"
description:
Expand Down
1 change: 1 addition & 0 deletions pubspec.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ dependencies:
syncfusion_flutter_charts: ^24.1.47+2
petitparser: ^6.0.2
http: ^1.2.1
pair: ^0.1.2

dev_dependencies:
flutter_lints: ^3.0.1
Expand Down

0 comments on commit f6a24eb

Please sign in to comment.