From 19078e2bc99e506ca8d32f54c3f28b1d9a13b761 Mon Sep 17 00:00:00 2001 From: Hillel Coren Date: Fri, 23 Sep 2022 08:58:06 +0300 Subject: [PATCH] Transactions --- lib/data/models/transaction_model.dart | 15 +++++++ lib/data/models/transaction_model.g.dart | 42 ++++++++++++----- .../repositories/transaction_repository.dart | 2 +- .../transaction/transaction_selectors.dart | 13 ++++-- lib/ui/transaction/transaction_list_vm.dart | 1 + lib/ui/transaction/transaction_presenter.dart | 4 +- lib/ui/transaction/transaction_screen_vm.dart | 1 + lib/ui/transaction/view/transaction_view.dart | 45 ++++++++++++++----- 8 files changed, 96 insertions(+), 27 deletions(-) diff --git a/lib/data/models/transaction_model.dart b/lib/data/models/transaction_model.dart index e2bd36b43..676cecd6b 100644 --- a/lib/data/models/transaction_model.dart +++ b/lib/data/models/transaction_model.dart @@ -52,6 +52,7 @@ class TransactionFields { static const String deposit = 'deposit'; static const String withdrawal = 'withdrawal'; static const String currency = 'currency'; + static const String vendor = 'vendor'; static const String category = 'category'; static const String bankAccountId = 'bank_account_id'; static const String bankAccount = 'bank_account'; @@ -83,6 +84,7 @@ abstract class TransactionEntity extends Object date: convertDateTimeToSqlDate(), description: '', expenseId: '', + vendorId: '', invoiceIds: '', statusId: '', baseType: TYPE_DEPOSIT, @@ -134,6 +136,9 @@ abstract class TransactionEntity extends Object @BuiltValueField(wireName: 'expense_id') String get expenseId; + @BuiltValueField(wireName: 'vendor_id') + String get vendorId; + @BuiltValueField(wireName: 'transaction_id') int get transactionId; @@ -148,6 +153,8 @@ abstract class TransactionEntity extends Object double get deposit => isDeposit ? amount : 0; + bool get isConverted => statusId == kTransactionStatusConverted; + @override List getActions( {UserCompanyEntity userCompany, @@ -174,6 +181,7 @@ abstract class TransactionEntity extends Object TransactionEntity transaction, String sortField, bool sortAscending, + BuiltMap vendorMap, BuiltMap invoiceMap, BuiltMap expenseMap, BuiltMap expenseCategoryMap, @@ -219,6 +227,13 @@ abstract class TransactionEntity extends Object .toLowerCase() .compareTo(expenseB.listDisplayName.toLowerCase()); break; + case TransactionFields.vendor: + final vendorA = vendorMap[transactionA.vendorId] ?? VendorEntity(); + final vendorB = vendorMap[transactionB.vendorId] ?? VendorEntity(); + response = vendorA.listDisplayName + .toLowerCase() + .compareTo(vendorB.listDisplayName.toLowerCase()); + break; case TransactionFields.category: final categoryA = expenseCategoryMap[transactionA.categoryId] ?? ExpenseCategoryEntity(); diff --git a/lib/data/models/transaction_model.g.dart b/lib/data/models/transaction_model.g.dart index 9c8f2c2b5..8ab07532c 100644 --- a/lib/data/models/transaction_model.g.dart +++ b/lib/data/models/transaction_model.g.dart @@ -157,6 +157,9 @@ class _$TransactionEntitySerializer 'expense_id', serializers.serialize(object.expenseId, specifiedType: const FullType(String)), + 'vendor_id', + serializers.serialize(object.vendorId, + specifiedType: const FullType(String)), 'transaction_id', serializers.serialize(object.transactionId, specifiedType: const FullType(int)), @@ -264,6 +267,10 @@ class _$TransactionEntitySerializer result.expenseId = serializers.deserialize(value, specifiedType: const FullType(String)) as String; break; + case 'vendor_id': + result.vendorId = serializers.deserialize(value, + specifiedType: const FullType(String)) as String; + break; case 'transaction_id': result.transactionId = serializers.deserialize(value, specifiedType: const FullType(int)) as int; @@ -574,6 +581,8 @@ class _$TransactionEntity extends TransactionEntity { @override final String expenseId; @override + final String vendorId; + @override final int transactionId; @override final bool isChanged; @@ -609,6 +618,7 @@ class _$TransactionEntity extends TransactionEntity { this.categoryId, this.invoiceIds, this.expenseId, + this.vendorId, this.transactionId, this.isChanged, this.createdAt, @@ -642,6 +652,8 @@ class _$TransactionEntity extends TransactionEntity { invoiceIds, 'TransactionEntity', 'invoiceIds'); BuiltValueNullFieldError.checkNotNull( expenseId, 'TransactionEntity', 'expenseId'); + BuiltValueNullFieldError.checkNotNull( + vendorId, 'TransactionEntity', 'vendorId'); BuiltValueNullFieldError.checkNotNull( transactionId, 'TransactionEntity', 'transactionId'); BuiltValueNullFieldError.checkNotNull( @@ -677,6 +689,7 @@ class _$TransactionEntity extends TransactionEntity { categoryId == other.categoryId && invoiceIds == other.invoiceIds && expenseId == other.expenseId && + vendorId == other.vendorId && transactionId == other.transactionId && isChanged == other.isChanged && createdAt == other.createdAt && @@ -709,17 +722,17 @@ class _$TransactionEntity extends TransactionEntity { $jc( $jc( $jc( - $jc($jc($jc(0, amount.hashCode), currencyId.hashCode), - category.hashCode), - baseType.hashCode), - accountType.hashCode), - date.hashCode), - bankAccountId.hashCode), - description.hashCode), - statusId.hashCode), - categoryId.hashCode), - invoiceIds.hashCode), - expenseId.hashCode), + $jc($jc($jc($jc(0, amount.hashCode), currencyId.hashCode), category.hashCode), + baseType.hashCode), + accountType.hashCode), + date.hashCode), + bankAccountId.hashCode), + description.hashCode), + statusId.hashCode), + categoryId.hashCode), + invoiceIds.hashCode), + expenseId.hashCode), + vendorId.hashCode), transactionId.hashCode), isChanged.hashCode), createdAt.hashCode), @@ -746,6 +759,7 @@ class _$TransactionEntity extends TransactionEntity { ..add('categoryId', categoryId) ..add('invoiceIds', invoiceIds) ..add('expenseId', expenseId) + ..add('vendorId', vendorId) ..add('transactionId', transactionId) ..add('isChanged', isChanged) ..add('createdAt', createdAt) @@ -812,6 +826,10 @@ class TransactionEntityBuilder String get expenseId => _$this._expenseId; set expenseId(String expenseId) => _$this._expenseId = expenseId; + String _vendorId; + String get vendorId => _$this._vendorId; + set vendorId(String vendorId) => _$this._vendorId = vendorId; + int _transactionId; int get transactionId => _$this._transactionId; set transactionId(int transactionId) => _$this._transactionId = transactionId; @@ -869,6 +887,7 @@ class TransactionEntityBuilder _categoryId = $v.categoryId; _invoiceIds = $v.invoiceIds; _expenseId = $v.expenseId; + _vendorId = $v.vendorId; _transactionId = $v.transactionId; _isChanged = $v.isChanged; _createdAt = $v.createdAt; @@ -919,6 +938,7 @@ class TransactionEntityBuilder categoryId: BuiltValueNullFieldError.checkNotNull(categoryId, 'TransactionEntity', 'categoryId'), invoiceIds: BuiltValueNullFieldError.checkNotNull(invoiceIds, 'TransactionEntity', 'invoiceIds'), expenseId: BuiltValueNullFieldError.checkNotNull(expenseId, 'TransactionEntity', 'expenseId'), + vendorId: BuiltValueNullFieldError.checkNotNull(vendorId, 'TransactionEntity', 'vendorId'), transactionId: BuiltValueNullFieldError.checkNotNull(transactionId, 'TransactionEntity', 'transactionId'), isChanged: isChanged, createdAt: BuiltValueNullFieldError.checkNotNull(createdAt, 'TransactionEntity', 'createdAt'), diff --git a/lib/data/repositories/transaction_repository.dart b/lib/data/repositories/transaction_repository.dart index d61f49657..19b76d546 100644 --- a/lib/data/repositories/transaction_repository.dart +++ b/lib/data/repositories/transaction_repository.dart @@ -86,7 +86,7 @@ class TransactionRepository { { 'id': transactionId, 'vendor_id': vendorId, - 'ninja_category_id': categoryId, + 'category_id': categoryId, }, ), ); diff --git a/lib/redux/transaction/transaction_selectors.dart b/lib/redux/transaction/transaction_selectors.dart index 69103ec78..174a88431 100644 --- a/lib/redux/transaction/transaction_selectors.dart +++ b/lib/redux/transaction/transaction_selectors.dart @@ -5,12 +5,13 @@ import 'package:built_collection/built_collection.dart'; import 'package:invoiceninja_flutter/data/models/models.dart'; import 'package:invoiceninja_flutter/redux/ui/list_ui_state.dart'; -var memoizedDropdownTransactionList = memo9( +var memoizedDropdownTransactionList = memo10( (BuiltMap transactionMap, BuiltList transactionList, StaticState staticState, BuiltMap userMap, BuiltMap invoiceMap, + BuiltMap vendorMap, BuiltMap expenseMap, BuiltMap expenseCategoryMap, BuiltMap bankAccountMap, @@ -21,6 +22,7 @@ var memoizedDropdownTransactionList = memo9( staticState, userMap, invoiceMap, + vendorMap, expenseMap, expenseCategoryMap, bankAccountMap, @@ -32,6 +34,7 @@ List dropdownTransactionsSelector( StaticState staticState, BuiltMap userMap, BuiltMap invoiceMap, + BuiltMap vendorMap, BuiltMap expenseMap, BuiltMap expenseCategoryMap, BuiltMap bankAccountMap, @@ -50,16 +53,17 @@ List dropdownTransactionsSelector( final transactionA = transactionMap[transactionAId]; final transactionB = transactionMap[transactionBId]; return transactionA.compareTo(transactionB, TransactionFields.date, true, - invoiceMap, expenseMap, expenseCategoryMap, bankAccountMap); + vendorMap, invoiceMap, expenseMap, expenseCategoryMap, bankAccountMap); }); return list; } -var memoizedFilteredTransactionList = memo8((SelectionState selectionState, +var memoizedFilteredTransactionList = memo9((SelectionState selectionState, BuiltMap transactionMap, BuiltList transactionList, BuiltMap invoiceMap, + BuiltMap vendorMap, BuiltMap expenseMap, BuiltMap expenseCategoryMap, BuiltMap bankAccountMap, @@ -69,6 +73,7 @@ var memoizedFilteredTransactionList = memo8((SelectionState selectionState, transactionMap, transactionList, invoiceMap, + vendorMap, expenseMap, expenseCategoryMap, bankAccountMap, @@ -79,6 +84,7 @@ List filteredTransactionsSelector( BuiltMap transactionMap, BuiltList transactionList, BuiltMap invoiceMap, + BuiltMap vendorMap, BuiltMap expenseMap, BuiltMap expenseCategoryMap, BuiltMap bankAccountMap, @@ -112,6 +118,7 @@ List filteredTransactionsSelector( transactionB, transactionListState.sortField, transactionListState.sortAscending, + vendorMap, invoiceMap, expenseMap, expenseCategoryMap, diff --git a/lib/ui/transaction/transaction_list_vm.dart b/lib/ui/transaction/transaction_list_vm.dart index 5f9245c20..fe94bdbf1 100644 --- a/lib/ui/transaction/transaction_list_vm.dart +++ b/lib/ui/transaction/transaction_list_vm.dart @@ -91,6 +91,7 @@ class TransactionListVM { state.transactionState.map, state.transactionState.list, state.invoiceState.map, + state.vendorState.map, state.expenseState.map, state.expenseCategoryState.map, state.bankAccountState.map, diff --git a/lib/ui/transaction/transaction_presenter.dart b/lib/ui/transaction/transaction_presenter.dart index e3cf019a8..13febb06b 100644 --- a/lib/ui/transaction/transaction_presenter.dart +++ b/lib/ui/transaction/transaction_presenter.dart @@ -97,8 +97,10 @@ class TransactionPresenter extends EntityPresenter { case TransactionFields.expense: final expense = state.expenseState.get(transaction.expenseId); return LinkTextRelatedEntity(entity: expense, relation: transaction); + case TransactionFields.vendor: + final vendor = state.vendorState.get(transaction.vendorId); + return LinkTextRelatedEntity(entity: vendor, relation: transaction); case TransactionFields.category: - return Text(transaction.categoryId); final category = state.expenseCategoryState.get(transaction.categoryId); return LinkTextRelatedEntity(entity: category, relation: transaction); } diff --git a/lib/ui/transaction/transaction_screen_vm.dart b/lib/ui/transaction/transaction_screen_vm.dart index 4fd661724..b0e740ebd 100644 --- a/lib/ui/transaction/transaction_screen_vm.dart +++ b/lib/ui/transaction/transaction_screen_vm.dart @@ -51,6 +51,7 @@ class TransactionScreenVM { state.transactionState.map, state.transactionState.list, state.invoiceState.map, + state.vendorState.map, state.expenseState.map, state.expenseCategoryState.map, state.bankAccountState.map, diff --git a/lib/ui/transaction/view/transaction_view.dart b/lib/ui/transaction/view/transaction_view.dart index c2135868a..440a9f244 100644 --- a/lib/ui/transaction/view/transaction_view.dart +++ b/lib/ui/transaction/view/transaction_view.dart @@ -2,6 +2,7 @@ import 'package:flutter/material.dart'; import 'package:invoiceninja_flutter/constants.dart'; import 'package:invoiceninja_flutter/data/models/models.dart'; import 'package:invoiceninja_flutter/ui/app/buttons/elevated_button.dart'; +import 'package:invoiceninja_flutter/ui/app/entities/entity_list_tile.dart'; import 'package:invoiceninja_flutter/ui/app/entity_header.dart'; import 'package:invoiceninja_flutter/ui/app/forms/date_picker.dart'; import 'package:invoiceninja_flutter/ui/app/forms/decorated_form_field.dart'; @@ -36,6 +37,7 @@ class _TransactionViewState extends State { final viewModel = widget.viewModel; final transaction = viewModel.transaction; final localization = AppLocalization.of(context); + final state = viewModel.state; return ViewScaffold( isFilter: widget.isFilter, @@ -54,18 +56,39 @@ class _TransactionViewState extends State { secondValue: formatDate(transaction.date, context), ), ListDivider(), - if (false) - Expanded( - child: _MatchDeposits( - viewModel: viewModel, + if (transaction.isConverted) ...[ + if (true) + ...transaction.invoiceIds + .split(',') + .map((invoiceId) => state.invoiceState.get(invoiceId)) + .map((invoice) => + EntityListTile(entity: invoice, isFilter: false)) + else ...[ + EntitiesListTile( + entity: state.vendorState.get(transaction.vendorId), + isFilter: false), + EntitiesListTile( + entity: + state.expenseCategoryState.get(transaction.categoryId), + isFilter: false), + EntitiesListTile( + entity: state.expenseState.get(transaction.expenseId), + isFilter: false), + ] + ] else ...[ + if (false) + Expanded( + child: _MatchDeposits( + viewModel: viewModel, + ), + ) + else + Expanded( + child: _MatchWithdrawals( + viewModel: viewModel, + ), ), - ) - else - Expanded( - child: _MatchWithdrawals( - viewModel: viewModel, - ), - ), + ], ], ), );