Skip to content

Commit 56c899d

Browse files
authored
Merge pull request #682 from flow-mn/develop
fixes, karma, close #681
2 parents d6dcebc + 00a2cd7 commit 56c899d

10 files changed

Lines changed: 53 additions & 125 deletions

File tree

CHANGELOG.md

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,16 @@
11
# Changelog
22

3+
## 0.19.4
4+
5+
### Fixes
6+
7+
* Fixed duplicating transfers reversed their accounts
8+
* Fixed home page pending transactions not showing, closes [#681](https://github.com/flow-mn/flow/issues/681)
9+
10+
### Changes
11+
12+
* Added an optional `transaction date` field to Shortcut action (iOS)
13+
314
## 0.19.3
415

516
### Fixes

ios/Runner/RecordTransactionIntent.swift

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,9 @@ struct RecordTransactionIntent: AppIntent {
1919
@Parameter(title: "Title", description: "Transaction title.")
2020
var title: String?
2121

22+
@Parameter(title: "Date of transaction", description: "Date.")
23+
var transactionDate: Date?
24+
2225
static var openAppWhenRun = false
2326

2427
func perform() async throws -> some IntentResult & ProvidesDialog {
@@ -30,15 +33,17 @@ struct RecordTransactionIntent: AppIntent {
3033
if let number = formatter.number(from: amount) {
3134
parsedAmount = number.doubleValue
3235
} else {
33-
let digitsOnly = amount.replacingOccurrences(of: "[^0-9]", with: "", options: .regularExpression)
36+
let digitsOnly = amount.replacingOccurrences(
37+
of: "[^0-9]", with: "", options: .regularExpression)
3438
let hadDecimalSeparator = amount.contains(formatter.decimalSeparator)
3539
guard let fallbackNumber = Double(digitsOnly) else {
3640
throw NSError(domain: "InvalidAmount", code: 1)
3741
}
3842
parsedAmount = fallbackNumber / (hadDecimalSeparator ? 100 : 1)
3943
}
4044
let tx = RecordedTransaction(
41-
type: .expense, amount: parsedAmount, title: title, fromAccount: account, category: category,
45+
transactionDate: transactionDate ?? Date(), type: .expense, amount: parsedAmount,
46+
title: title, fromAccount: account, category: category,
4247
notes: notes)
4348
try RecordedTransactionService.append(tx)
4449
return .result(dialog: "Expense recorded ✅")

lib/data/transaction_programmable_object.dart

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import "package:flow/services/user_preferences.dart";
44
import "package:flow/utils/loose_parsers.dart";
55
import "package:flow/utils/money_parsing.dart";
66
import "package:flow/utils/utils.dart";
7+
import "package:moment_dart/moment_dart.dart";
78
import "package:uuid/uuid.dart";
89

910
class TransactionProgrammableObject {
@@ -107,6 +108,12 @@ class TransactionProgrammableObject {
107108
_ => null,
108109
};
109110

111+
final bool isPending =
112+
(looseString(params["isPending"])?.toLowerCase() == "true")
113+
? true
114+
: (transactionDate?.isAfter(DateTime.now().startOfNextMinute()) ??
115+
false);
116+
110117
return TransactionProgrammableObject(
111118
transactionDate: transactionDate,
112119
categoryUuid: looseString(params["categoryUuid"]),
@@ -119,7 +126,7 @@ class TransactionProgrammableObject {
119126
toAccountUuid: looseString(params["toAccountUuid"]),
120127
toAccount: looseString(params["toAccount"]),
121128
type: type,
122-
isPending: looseString(params["isPending"])?.toLowerCase() == "true",
129+
isPending: isPending,
123130
transferConversionRate: looseDouble(params["transferConversionRate"]),
124131
tagsUuids: looseStringList(params["tagsUuids"]),
125132
tags: looseStringList(params["tags"]),

lib/objectbox/actions.dart

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -637,7 +637,7 @@ extension TransactionActions on Transaction {
637637

638638
final (int a, _) = fromAccount.transferTo(
639639
targetAccount: toAccount,
640-
amount: amount,
640+
amount: amount.abs(),
641641
description: description,
642642
createdDate: Moment.now(),
643643
isPending: isPending,
@@ -649,6 +649,7 @@ extension TransactionActions on Transaction {
649649
extensions: extensions.data,
650650
latitude: extensions.geo?.latitude,
651651
longitude: extensions.geo?.longitude,
652+
conversionRate: transferDetails.conversionRate,
652653
);
653654

654655
return a;

lib/routes/home/home_tab.dart

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -144,10 +144,14 @@ class _HomeTabState extends State<HomeTab> with AutomaticKeepAliveClientMixin {
144144
);
145145

146146
final List<Transaction> transactions = [
147-
...?pendingTransactionsSnapshot.data,
148-
...?currentTransactionsSnapshot.data?.where(
149-
(t) => t.isPending != true,
147+
...?pendingTransactionsSnapshot.data?.where(
148+
(transaction) =>
149+
normalizedCurrentFilter.range?.range?.contains(
150+
transaction.transactionDate,
151+
) !=
152+
true,
150153
),
154+
...?currentTransactionsSnapshot.data,
151155
];
152156

153157
if (currentFilter.range?.range?.contains(now) == true) {

lib/utils/extensions/iterables.dart

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,15 @@ extension Iterables<E> on Iterable<E> {
2020
return map;
2121
});
2222

23+
List<E> uniqueBy<T>(T Function(E) selector) {
24+
final Map<T, E> items = {};
25+
for (final E element in this) {
26+
final T key = selector(element);
27+
items[key] = element;
28+
}
29+
return items.values.toList();
30+
}
31+
2332
E? firstWhereOrNull(bool Function(E element) test) {
2433
for (var element in this) {
2534
if (test(element)) return element;

lib/widgets/grouped_transactions_list_view.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -168,6 +168,7 @@ class _GroupedTransactionsListViewState
168168
index: index,
169169
key: ValueKey(transaction.uuid),
170170
child: TransactionListTile(
171+
key: ValueKey(transaction.id),
171172
combineTransfers: combineTransfers,
172173
transaction: transaction,
173174
dismissibleKey: ValueKey(transaction.id),

macos/Podfile.lock

Lines changed: 5 additions & 117 deletions
Original file line numberDiff line numberDiff line change
@@ -1,164 +1,52 @@
11
PODS:
2-
- app_links (6.4.1):
3-
- FlutterMacOS
4-
- connectivity_plus (0.0.1):
5-
- FlutterMacOS
6-
- desktop_drop (0.0.1):
7-
- FlutterMacOS
8-
- file_picker (0.0.1):
9-
- FlutterMacOS
102
- file_saver (0.0.1):
113
- FlutterMacOS
12-
- file_selector_macos (0.0.1):
13-
- FlutterMacOS
14-
- flutter_app_group_directory (0.0.1):
15-
- FlutterMacOS
16-
- flutter_local_notifications (0.0.1):
17-
- FlutterMacOS
18-
- flutter_timezone (0.1.0):
4+
- flutter_contacts (0.0.1):
195
- FlutterMacOS
206
- FlutterMacOS (1.0.0)
21-
- geolocator_apple (1.2.0):
22-
- Flutter
23-
- FlutterMacOS
247
- icloud_storage (0.0.1):
258
- FlutterMacOS
26-
- in_app_review (2.0.0):
27-
- FlutterMacOS
28-
- local_auth_darwin (0.0.1):
29-
- Flutter
30-
- FlutterMacOS
319
- ObjectBox (5.2.0)
3210
- objectbox_flutter_libs (0.0.1):
3311
- FlutterMacOS
3412
- ObjectBox (= 5.2.0)
35-
- package_info_plus (0.0.1):
36-
- FlutterMacOS
37-
- pasteboard (0.0.1):
38-
- FlutterMacOS
39-
- path_provider_foundation (0.0.1):
40-
- Flutter
41-
- FlutterMacOS
42-
- quill_native_bridge_macos (0.0.1):
43-
- FlutterMacOS
4413
- screen_retriever_macos (0.0.1):
4514
- FlutterMacOS
46-
- share_plus (0.0.1):
47-
- FlutterMacOS
48-
- shared_preferences_foundation (0.0.1):
49-
- Flutter
50-
- FlutterMacOS
51-
- url_launcher_macos (0.0.1):
52-
- FlutterMacOS
53-
- window_manager (0.5.0):
54-
- FlutterMacOS
5515

5616
DEPENDENCIES:
57-
- app_links (from `Flutter/ephemeral/.symlinks/plugins/app_links/macos`)
58-
- connectivity_plus (from `Flutter/ephemeral/.symlinks/plugins/connectivity_plus/macos`)
59-
- desktop_drop (from `Flutter/ephemeral/.symlinks/plugins/desktop_drop/macos`)
60-
- file_picker (from `Flutter/ephemeral/.symlinks/plugins/file_picker/macos`)
6117
- file_saver (from `Flutter/ephemeral/.symlinks/plugins/file_saver/macos`)
62-
- file_selector_macos (from `Flutter/ephemeral/.symlinks/plugins/file_selector_macos/macos`)
63-
- flutter_app_group_directory (from `Flutter/ephemeral/.symlinks/plugins/flutter_app_group_directory/macos`)
64-
- flutter_local_notifications (from `Flutter/ephemeral/.symlinks/plugins/flutter_local_notifications/macos`)
65-
- flutter_timezone (from `Flutter/ephemeral/.symlinks/plugins/flutter_timezone/macos`)
18+
- flutter_contacts (from `Flutter/ephemeral/.symlinks/plugins/flutter_contacts/macos`)
6619
- FlutterMacOS (from `Flutter/ephemeral`)
67-
- geolocator_apple (from `Flutter/ephemeral/.symlinks/plugins/geolocator_apple/darwin`)
6820
- icloud_storage (from `Flutter/ephemeral/.symlinks/plugins/icloud_storage/macos`)
69-
- in_app_review (from `Flutter/ephemeral/.symlinks/plugins/in_app_review/macos`)
70-
- local_auth_darwin (from `Flutter/ephemeral/.symlinks/plugins/local_auth_darwin/darwin`)
7121
- objectbox_flutter_libs (from `Flutter/ephemeral/.symlinks/plugins/objectbox_flutter_libs/macos`)
72-
- package_info_plus (from `Flutter/ephemeral/.symlinks/plugins/package_info_plus/macos`)
73-
- pasteboard (from `Flutter/ephemeral/.symlinks/plugins/pasteboard/macos`)
74-
- path_provider_foundation (from `Flutter/ephemeral/.symlinks/plugins/path_provider_foundation/darwin`)
75-
- quill_native_bridge_macos (from `Flutter/ephemeral/.symlinks/plugins/quill_native_bridge_macos/macos`)
7622
- screen_retriever_macos (from `Flutter/ephemeral/.symlinks/plugins/screen_retriever_macos/macos`)
77-
- share_plus (from `Flutter/ephemeral/.symlinks/plugins/share_plus/macos`)
78-
- shared_preferences_foundation (from `Flutter/ephemeral/.symlinks/plugins/shared_preferences_foundation/darwin`)
79-
- url_launcher_macos (from `Flutter/ephemeral/.symlinks/plugins/url_launcher_macos/macos`)
80-
- window_manager (from `Flutter/ephemeral/.symlinks/plugins/window_manager/macos`)
8123

8224
SPEC REPOS:
8325
trunk:
8426
- ObjectBox
8527

8628
EXTERNAL SOURCES:
87-
app_links:
88-
:path: Flutter/ephemeral/.symlinks/plugins/app_links/macos
89-
connectivity_plus:
90-
:path: Flutter/ephemeral/.symlinks/plugins/connectivity_plus/macos
91-
desktop_drop:
92-
:path: Flutter/ephemeral/.symlinks/plugins/desktop_drop/macos
93-
file_picker:
94-
:path: Flutter/ephemeral/.symlinks/plugins/file_picker/macos
9529
file_saver:
9630
:path: Flutter/ephemeral/.symlinks/plugins/file_saver/macos
97-
file_selector_macos:
98-
:path: Flutter/ephemeral/.symlinks/plugins/file_selector_macos/macos
99-
flutter_app_group_directory:
100-
:path: Flutter/ephemeral/.symlinks/plugins/flutter_app_group_directory/macos
101-
flutter_local_notifications:
102-
:path: Flutter/ephemeral/.symlinks/plugins/flutter_local_notifications/macos
103-
flutter_timezone:
104-
:path: Flutter/ephemeral/.symlinks/plugins/flutter_timezone/macos
31+
flutter_contacts:
32+
:path: Flutter/ephemeral/.symlinks/plugins/flutter_contacts/macos
10533
FlutterMacOS:
10634
:path: Flutter/ephemeral
107-
geolocator_apple:
108-
:path: Flutter/ephemeral/.symlinks/plugins/geolocator_apple/darwin
10935
icloud_storage:
11036
:path: Flutter/ephemeral/.symlinks/plugins/icloud_storage/macos
111-
in_app_review:
112-
:path: Flutter/ephemeral/.symlinks/plugins/in_app_review/macos
113-
local_auth_darwin:
114-
:path: Flutter/ephemeral/.symlinks/plugins/local_auth_darwin/darwin
11537
objectbox_flutter_libs:
11638
:path: Flutter/ephemeral/.symlinks/plugins/objectbox_flutter_libs/macos
117-
package_info_plus:
118-
:path: Flutter/ephemeral/.symlinks/plugins/package_info_plus/macos
119-
pasteboard:
120-
:path: Flutter/ephemeral/.symlinks/plugins/pasteboard/macos
121-
path_provider_foundation:
122-
:path: Flutter/ephemeral/.symlinks/plugins/path_provider_foundation/darwin
123-
quill_native_bridge_macos:
124-
:path: Flutter/ephemeral/.symlinks/plugins/quill_native_bridge_macos/macos
12539
screen_retriever_macos:
12640
:path: Flutter/ephemeral/.symlinks/plugins/screen_retriever_macos/macos
127-
share_plus:
128-
:path: Flutter/ephemeral/.symlinks/plugins/share_plus/macos
129-
shared_preferences_foundation:
130-
:path: Flutter/ephemeral/.symlinks/plugins/shared_preferences_foundation/darwin
131-
url_launcher_macos:
132-
:path: Flutter/ephemeral/.symlinks/plugins/url_launcher_macos/macos
133-
window_manager:
134-
:path: Flutter/ephemeral/.symlinks/plugins/window_manager/macos
13541

13642
SPEC CHECKSUMS:
137-
app_links: 05a6ec2341985eb05e9f97dc63f5837c39895c3f
138-
connectivity_plus: 4adf20a405e25b42b9c9f87feff8f4b6fde18a4e
139-
desktop_drop: 10a3e6a7fa9dbe350541f2574092fecfa345a07b
140-
file_picker: 7584aae6fa07a041af2b36a2655122d42f578c1a
14143
file_saver: e35bd97de451dde55ff8c38862ed7ad0f3418d0f
142-
file_selector_macos: 9e9e068e90ebee155097d00e89ae91edb2374db7
143-
flutter_app_group_directory: 14eb7e7a2b0e30a6a68bb855197b4ed6f5063e55
144-
flutter_local_notifications: 4bf37a31afde695b56091b4ae3e4d9c7a7e6cda0
145-
flutter_timezone: d272288c69082ad571630e0d17140b3d6b93dc0c
44+
flutter_contacts: 22579d648c4278eefa588e8392499f10540a24b2
14645
FlutterMacOS: d0db08ddef1a9af05a5ec4b724367152bb0500b1
147-
geolocator_apple: ab36aa0e8b7d7a2d7639b3b4e48308394e8cef5e
14846
icloud_storage: eb5b0f20687cf5a4fabc0b541f3b079cd6df7dcb
149-
in_app_review: 66e7680752b632d83f4f0e88b34d52ed303fbff4
150-
local_auth_darwin: c3ee6cce0a8d56be34c8ccb66ba31f7f180aaebb
15147
ObjectBox: 946c1e8586aaa61e21b6661bab4948d06fdd51c4
15248
objectbox_flutter_libs: 52ffb4ad42870c47886c2c6a7528e76b770af6d9
153-
package_info_plus: f0052d280d17aa382b932f399edf32507174e870
154-
pasteboard: 278d8100149f940fb795d6b3a74f0720c890ecb7
155-
path_provider_foundation: bb55f6dbba17d0dccd6737fe6f7f34fbd0376880
156-
quill_native_bridge_macos: 2b005cb56902bb740e0cd9620aa399dfac6b4882
15749
screen_retriever_macos: 452e51764a9e1cdb74b3c541238795849f21557f
158-
share_plus: 510bf0af1a42cd602274b4629920c9649c52f4cc
159-
shared_preferences_foundation: 7036424c3d8ec98dfe75ff1667cb0cd531ec82bb
160-
url_launcher_macos: f87a979182d112f911de6820aefddaf56ee9fbfd
161-
window_manager: b729e31d38fb04905235df9ea896128991cad99e
16250

16351
PODFILE CHECKSUM: 3d7cd7f90b4de5948ed6e76869b40159643b2f0c
16452

macos/Runner.xcodeproj/project.pbxproj

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,7 @@
9393
C7ABF111C6B24A94C5590605 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = "<group>"; };
9494
EF2119E4452EB90D74660621 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = "<group>"; };
9595
FF8EDF75036434848BA3CFBA /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; };
96+
78E0A7A72DC9AD7400C4905E /* FlutterGeneratedPluginSwiftPackage */ = {isa = PBXFileReference; lastKnownFileType = wrapper; name = FlutterGeneratedPluginSwiftPackage; path = ephemeral/Packages/FlutterGeneratedPluginSwiftPackage; sourceTree = "<group>"; };
9697
/* End PBXFileReference section */
9798

9899
/* Begin PBXFrameworksBuildPhase section */
@@ -170,6 +171,7 @@
170171
33CEB47122A05771004F2AC0 /* Flutter */ = {
171172
isa = PBXGroup;
172173
children = (
174+
78E0A7A72DC9AD7400C4905E /* FlutterGeneratedPluginSwiftPackage */,
173175
335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */,
174176
33CEB47222A05771004F2AC0 /* Flutter-Debug.xcconfig */,
175177
33CEB47422A05771004F2AC0 /* Flutter-Release.xcconfig */,

pubspec.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ description: A personal finance managing app
33

44
publish_to: "none" # Remove this line if you wish to publish to pub.dev
55

6-
version: "0.19.3+331"
6+
version: "0.19.4+332"
77

88
environment:
99
sdk: ">=3.10.0 <4.0.0"

0 commit comments

Comments
 (0)