1
1
import 'dart:math' ;
2
2
3
3
import 'package:async/async.dart' ;
4
- import 'package:collection/collection.dart' ;
5
4
import 'package:flutter/material.dart' ;
6
5
import 'package:monekin/core/database/services/account/account_service.dart' ;
7
6
import 'package:monekin/core/database/services/transaction/transaction_service.dart' ;
8
7
import 'package:monekin/core/models/transaction/transaction.dart' ;
9
8
import 'package:monekin/core/presentation/widgets/transaction_filter/transaction_filters.dart' ;
9
+ import 'package:monekin/core/utils/date_time_picker.dart' ;
10
10
import 'package:monekin/i18n/translations.g.dart' ;
11
11
import 'package:rxdart/rxdart.dart' ;
12
12
@@ -87,7 +87,7 @@ class FinanceHealthData {
87
87
score: monthsWithoutIncome == null
88
88
? null
89
89
: min (monthsWithoutIncome! * 10 , 100 ),
90
- weight: 50 );
90
+ weight: monthsWithoutIncomeWeight );
91
91
}
92
92
93
93
FinanceHealthAttrScore get savingPercentageScore {
@@ -101,7 +101,8 @@ class FinanceHealthData {
101
101
// To desmos: \frac{100}{1+e^{-1.25+-0.2\left(x-\ 15\right)}}
102
102
toReturn = 100 / (1 + exp (- 1.25 - 0.2 * (savingsPercentage - 15 ))) - 2 ;
103
103
104
- return FinanceHealthAttrScore (score: toReturn, weight: 50 );
104
+ return FinanceHealthAttrScore (
105
+ score: toReturn, weight: savingPercentageWeight);
105
106
}
106
107
107
108
final int savingPercentageWeight = 50 ;
@@ -168,37 +169,37 @@ class FinanceHealthService {
168
169
Stream <double ?> getMonthsWithoutIncome ({
169
170
required TransactionFilters filters,
170
171
}) {
171
- return Rx .combineLatest ([
172
- TransactionService .instance
173
- .countTransactions (predicate: filters)
174
- .map ((event) => event.numberOfRes),
175
- AccountService .instance
176
- .getAccountsMoney (date: filters.maxDate, trFilters: filters),
177
- for (var i = 1 ; i <= 6 ; i++ )
172
+ final minDate = filters.minDate ?? kDefaultFirstSelectableDate;
173
+ final maxDate = filters.maxDate ?? DateTime .now ();
174
+
175
+ return Rx .combineLatest4 (
176
+ TransactionService .instance
177
+ .countTransactions (predicate: filters)
178
+ .map ((event) => event.numberOfRes),
179
+ AccountService .instance.getAccountsBalance (
180
+ filters: filters,
181
+ ),
178
182
AccountService .instance
179
183
.getAccountsBalance (
180
184
filters: filters.copyWith (
181
- minDate: (filters.maxDate ?? DateTime .now ())
182
- .subtract (Duration (days: i * 30 )),
183
- maxDate: (filters.maxDate ?? DateTime .now ())
184
- .subtract (Duration (days: (i - 1 ) * 30 )),
185
- transactionTypes: [TransactionType .expense]),
185
+ transactionTypes: [TransactionType .expense],
186
+ ),
186
187
)
187
- .map ((event) => event.abs () * (1.1 - (i / 6 )))
188
- ], (values) {
189
- if (values[0 ] < 6 ) {
188
+ .map ((e) => e.abs ()),
189
+ AccountService .instance
190
+ .getAccountsMoney (
191
+ date: minDate,
192
+ trFilters: filters.copyWith (minDate: null ),
193
+ )
194
+ .map ((event) => max (event, 0 )),
195
+ (numberOfTransactions, balance, expense, initialMoney) {
196
+ if (numberOfTransactions < 4 ) {
190
197
return null ;
191
198
}
192
199
193
- final balance = values[1 ];
194
- final expensesInLastPeriod =
195
- values.whereIndexed ((index, element) => index >= 2 );
196
-
197
- if (balance < 0 ) return 0 ;
200
+ final dateDiff = maxDate.difference (minDate).inDays;
198
201
199
- return balance /
200
- (expensesInLastPeriod.sum /
201
- [for (var i = 1 ; i <= 6 ; i++ ) (1.1 - (i / 6 ))].sum);
202
+ return (initialMoney + balance) / expense / dateDiff * 30 ;
202
203
});
203
204
}
204
205
0 commit comments