@marcos_feitoza/personal-finance-frontend-feature-dashboard 1.1.0 → 1.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,17 @@
|
|
|
1
|
+
## [1.1.2](https://github.com/MarcosOps/personal-finance-frontend-feature-dashboard/compare/v1.1.1...v1.1.2) (2025-12-06)
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
### Bug Fixes
|
|
5
|
+
|
|
6
|
+
* Criação do `DashboardViewModel ([ee9447a](https://github.com/MarcosOps/personal-finance-frontend-feature-dashboard/commit/ee9447abe8b99ecbd92d9ce61afa0c4492a8b70c))
|
|
7
|
+
|
|
8
|
+
## [1.1.1](https://github.com/MarcosOps/personal-finance-frontend-feature-dashboard/compare/v1.1.0...v1.1.1) (2025-12-06)
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
### Bug Fixes
|
|
12
|
+
|
|
13
|
+
* conversão double.parse ([8804b4c](https://github.com/MarcosOps/personal-finance-frontend-feature-dashboard/commit/8804b4c544d9720befe5dcf27e2f544b0273063f))
|
|
14
|
+
|
|
1
15
|
# [1.1.0](https://github.com/MarcosOps/personal-finance-frontend-feature-dashboard/compare/v1.0.1...v1.1.0) (2025-11-28)
|
|
2
16
|
|
|
3
17
|
|
|
@@ -137,12 +137,11 @@ class _HomeScreenState extends State<HomeScreen> {
|
|
|
137
137
|
for (var item in pmSummary) {
|
|
138
138
|
final paymentMethod =
|
|
139
139
|
(item['payment_method'] as String?)?.toUpperCase();
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
}
|
|
140
|
+
if (paymentMethod == 'RBC') {
|
|
141
|
+
_rbcUnpaidExpenses += double.tryParse(item['unpaid_amount']?.toString() ?? '0.0') ?? 0.0;
|
|
142
|
+
} else if (paymentMethod == 'BMO') {
|
|
143
|
+
_bmoUnpaidExpenses += double.tryParse(item['unpaid_amount']?.toString() ?? '0.0') ?? 0.0;
|
|
144
|
+
} }
|
|
146
145
|
|
|
147
146
|
_cashTransactions = otherResults[1] as List<Map<String, dynamic>>;
|
|
148
147
|
_rbcTransactions = otherResults[2] as List<Map<String, dynamic>>;
|
|
@@ -660,7 +659,7 @@ class _HomeScreenState extends State<HomeScreen> {
|
|
|
660
659
|
children: transactions.map((transaction) {
|
|
661
660
|
final date = DateFormat('MM/dd')
|
|
662
661
|
.format(DateTime.parse(transaction['date']));
|
|
663
|
-
final amount = double.
|
|
662
|
+
final amount = (double.tryParse(transaction['amount']?.toString() ?? '0.0') ?? 0.0)
|
|
664
663
|
.toStringAsFixed(2);
|
|
665
664
|
final subcategory =
|
|
666
665
|
transaction['subcategory'] ?? 'No subcategory';
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
import 'package:flutter/material.dart';
|
|
2
|
+
import 'package:personal_finance_frontend_core_services/services/transaction_service.dart';
|
|
3
|
+
import 'package:personal_finance_frontend_core_ui/utils/currency_input_formatter.dart';
|
|
4
|
+
|
|
5
|
+
class DashboardViewModel extends ChangeNotifier {
|
|
6
|
+
final TransactionService _transactionService = TransactionService();
|
|
7
|
+
String? _token;
|
|
8
|
+
|
|
9
|
+
// Controllers
|
|
10
|
+
final rbcCashController = TextEditingController();
|
|
11
|
+
final wealthsimpleCashController = TextEditingController();
|
|
12
|
+
final rbcCardController = TextEditingController();
|
|
13
|
+
final bmoCardController = TextEditingController();
|
|
14
|
+
|
|
15
|
+
// State variables
|
|
16
|
+
bool _isLoading = true;
|
|
17
|
+
String? _selectedMenu;
|
|
18
|
+
Map<String, double> _accountBalances = {};
|
|
19
|
+
double _rbcUnpaidExpenses = 0.0;
|
|
20
|
+
double _bmoUnpaidExpenses = 0.0;
|
|
21
|
+
List<Map<String, dynamic>> _cashTransactions = [];
|
|
22
|
+
List<Map<String, dynamic>> _rbcTransactions = [];
|
|
23
|
+
List<Map<String, dynamic>> _bmoTransactions = [];
|
|
24
|
+
|
|
25
|
+
final List<String> _investmentAccountNames = const [
|
|
26
|
+
'TFSA',
|
|
27
|
+
'RRSP Wealthsimple',
|
|
28
|
+
'Non-Registered',
|
|
29
|
+
'Crypto'
|
|
30
|
+
];
|
|
31
|
+
|
|
32
|
+
// Getters
|
|
33
|
+
bool get isLoading => _isLoading;
|
|
34
|
+
String? get selectedMenu => _selectedMenu;
|
|
35
|
+
Map<String, double> get accountBalances => _accountBalances;
|
|
36
|
+
List<String> get investmentAccountNames => _investmentAccountNames;
|
|
37
|
+
double get rbcUnpaidExpenses => _rbcUnpaidExpenses;
|
|
38
|
+
double get bmoUnpaidExpenses => _bmoUnpaidExpenses;
|
|
39
|
+
List<Map<String, dynamic>> get cashTransactions => _cashTransactions;
|
|
40
|
+
List<Map<String, dynamic>> get rbcTransactions => _rbcTransactions;
|
|
41
|
+
List<Map<String, dynamic>> get bmoTransactions => _bmoTransactions;
|
|
42
|
+
|
|
43
|
+
double get totalUserCash =>
|
|
44
|
+
CurrencyInputFormatter.unformat(rbcCashController.text) +
|
|
45
|
+
CurrencyInputFormatter.unformat(wealthsimpleCashController.text);
|
|
46
|
+
|
|
47
|
+
double get appCalculatedCash => _accountBalances['CASH'] ?? 0.0;
|
|
48
|
+
|
|
49
|
+
DashboardViewModel(this._token) {
|
|
50
|
+
// Add listeners to controllers to notify UI changes
|
|
51
|
+
rbcCashController.addListener(notifyListeners);
|
|
52
|
+
wealthsimpleCashController.addListener(notifyListeners);
|
|
53
|
+
rbcCardController.addListener(notifyListeners);
|
|
54
|
+
bmoCardController.addListener(notifyListeners);
|
|
55
|
+
|
|
56
|
+
fetchData();
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
@override
|
|
60
|
+
void dispose() {
|
|
61
|
+
rbcCashController.dispose();
|
|
62
|
+
wealthsimpleCashController.dispose();
|
|
63
|
+
rbcCardController.dispose();
|
|
64
|
+
bmoCardController.dispose();
|
|
65
|
+
super.dispose();
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
void setMenu(String? menu) {
|
|
69
|
+
_selectedMenu = menu;
|
|
70
|
+
notifyListeners();
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
Future<void> fetchData() async {
|
|
74
|
+
_isLoading = true;
|
|
75
|
+
notifyListeners();
|
|
76
|
+
|
|
77
|
+
try {
|
|
78
|
+
final cashBalanceFuture = _transactionService.getAccountBalance('CASH', token: _token);
|
|
79
|
+
final investmentBalanceFutures = _investmentAccountNames
|
|
80
|
+
.map((name) => _transactionService.getAccountBalance(name, token: _token))
|
|
81
|
+
.toList();
|
|
82
|
+
|
|
83
|
+
final otherFutures = <Future<dynamic>>[
|
|
84
|
+
_transactionService.getSummaryByPaymentMethod(token: _token),
|
|
85
|
+
_transactionService.fetchTransactions(paymentMethod: 'CASH', limit: 10, token: _token),
|
|
86
|
+
_transactionService.fetchTransactions(paymentMethod: 'RBC', limit: 10, token: _token),
|
|
87
|
+
_transactionService.fetchTransactions(paymentMethod: 'BMO', limit: 10, token: _token),
|
|
88
|
+
];
|
|
89
|
+
|
|
90
|
+
final allInvestmentBalances = await Future.wait(investmentBalanceFutures);
|
|
91
|
+
final cashBalance = await cashBalanceFuture;
|
|
92
|
+
final otherResults = await Future.wait(otherFutures);
|
|
93
|
+
|
|
94
|
+
_accountBalances = {'CASH': cashBalance};
|
|
95
|
+
for (int i = 0; i < _investmentAccountNames.length; i++) {
|
|
96
|
+
_accountBalances[_investmentAccountNames[i]] = allInvestmentBalances[i];
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
final pmSummary = otherResults[0] as List<Map<String, dynamic>>;
|
|
100
|
+
double tempRbcUnpaid = 0.0;
|
|
101
|
+
double tempBmoUnpaid = 0.0;
|
|
102
|
+
for (var item in pmSummary) {
|
|
103
|
+
final paymentMethod = (item['payment_method'] as String?)?.toUpperCase();
|
|
104
|
+
if (paymentMethod == 'RBC') {
|
|
105
|
+
tempRbcUnpaid += double.tryParse(item['unpaid_amount']?.toString() ?? '0.0') ?? 0.0;
|
|
106
|
+
} else if (paymentMethod == 'BMO') {
|
|
107
|
+
tempBmoUnpaid += double.tryParse(item['unpaid_amount']?.toString() ?? '0.0') ?? 0.0;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
_rbcUnpaidExpenses = tempRbcUnpaid;
|
|
111
|
+
_bmoUnpaidExpenses = tempBmoUnpaid;
|
|
112
|
+
|
|
113
|
+
_cashTransactions = otherResults[1] as List<Map<String, dynamic>>;
|
|
114
|
+
_rbcTransactions = otherResults[2] as List<Map<String, dynamic>>;
|
|
115
|
+
_bmoTransactions = otherResults[3] as List<Map<String, dynamic>>;
|
|
116
|
+
|
|
117
|
+
} catch (e) {
|
|
118
|
+
debugPrint('Error fetching dashboard data: $e');
|
|
119
|
+
} finally {
|
|
120
|
+
_isLoading = false;
|
|
121
|
+
notifyListeners();
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
}
|