Transactions

This commit is contained in:
Hillel Coren 2022-09-23 08:58:06 +03:00
parent 0e6814a4b0
commit 19078e2bc9
8 changed files with 96 additions and 27 deletions

View File

@ -52,6 +52,7 @@ class TransactionFields {
static const String deposit = 'deposit'; static const String deposit = 'deposit';
static const String withdrawal = 'withdrawal'; static const String withdrawal = 'withdrawal';
static const String currency = 'currency'; static const String currency = 'currency';
static const String vendor = 'vendor';
static const String category = 'category'; static const String category = 'category';
static const String bankAccountId = 'bank_account_id'; static const String bankAccountId = 'bank_account_id';
static const String bankAccount = 'bank_account'; static const String bankAccount = 'bank_account';
@ -83,6 +84,7 @@ abstract class TransactionEntity extends Object
date: convertDateTimeToSqlDate(), date: convertDateTimeToSqlDate(),
description: '', description: '',
expenseId: '', expenseId: '',
vendorId: '',
invoiceIds: '', invoiceIds: '',
statusId: '', statusId: '',
baseType: TYPE_DEPOSIT, baseType: TYPE_DEPOSIT,
@ -134,6 +136,9 @@ abstract class TransactionEntity extends Object
@BuiltValueField(wireName: 'expense_id') @BuiltValueField(wireName: 'expense_id')
String get expenseId; String get expenseId;
@BuiltValueField(wireName: 'vendor_id')
String get vendorId;
@BuiltValueField(wireName: 'transaction_id') @BuiltValueField(wireName: 'transaction_id')
int get transactionId; int get transactionId;
@ -148,6 +153,8 @@ abstract class TransactionEntity extends Object
double get deposit => isDeposit ? amount : 0; double get deposit => isDeposit ? amount : 0;
bool get isConverted => statusId == kTransactionStatusConverted;
@override @override
List<EntityAction> getActions( List<EntityAction> getActions(
{UserCompanyEntity userCompany, {UserCompanyEntity userCompany,
@ -174,6 +181,7 @@ abstract class TransactionEntity extends Object
TransactionEntity transaction, TransactionEntity transaction,
String sortField, String sortField,
bool sortAscending, bool sortAscending,
BuiltMap<String, VendorEntity> vendorMap,
BuiltMap<String, InvoiceEntity> invoiceMap, BuiltMap<String, InvoiceEntity> invoiceMap,
BuiltMap<String, ExpenseEntity> expenseMap, BuiltMap<String, ExpenseEntity> expenseMap,
BuiltMap<String, ExpenseCategoryEntity> expenseCategoryMap, BuiltMap<String, ExpenseCategoryEntity> expenseCategoryMap,
@ -219,6 +227,13 @@ abstract class TransactionEntity extends Object
.toLowerCase() .toLowerCase()
.compareTo(expenseB.listDisplayName.toLowerCase()); .compareTo(expenseB.listDisplayName.toLowerCase());
break; 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: case TransactionFields.category:
final categoryA = expenseCategoryMap[transactionA.categoryId] ?? final categoryA = expenseCategoryMap[transactionA.categoryId] ??
ExpenseCategoryEntity(); ExpenseCategoryEntity();

View File

@ -157,6 +157,9 @@ class _$TransactionEntitySerializer
'expense_id', 'expense_id',
serializers.serialize(object.expenseId, serializers.serialize(object.expenseId,
specifiedType: const FullType(String)), specifiedType: const FullType(String)),
'vendor_id',
serializers.serialize(object.vendorId,
specifiedType: const FullType(String)),
'transaction_id', 'transaction_id',
serializers.serialize(object.transactionId, serializers.serialize(object.transactionId,
specifiedType: const FullType(int)), specifiedType: const FullType(int)),
@ -264,6 +267,10 @@ class _$TransactionEntitySerializer
result.expenseId = serializers.deserialize(value, result.expenseId = serializers.deserialize(value,
specifiedType: const FullType(String)) as String; specifiedType: const FullType(String)) as String;
break; break;
case 'vendor_id':
result.vendorId = serializers.deserialize(value,
specifiedType: const FullType(String)) as String;
break;
case 'transaction_id': case 'transaction_id':
result.transactionId = serializers.deserialize(value, result.transactionId = serializers.deserialize(value,
specifiedType: const FullType(int)) as int; specifiedType: const FullType(int)) as int;
@ -574,6 +581,8 @@ class _$TransactionEntity extends TransactionEntity {
@override @override
final String expenseId; final String expenseId;
@override @override
final String vendorId;
@override
final int transactionId; final int transactionId;
@override @override
final bool isChanged; final bool isChanged;
@ -609,6 +618,7 @@ class _$TransactionEntity extends TransactionEntity {
this.categoryId, this.categoryId,
this.invoiceIds, this.invoiceIds,
this.expenseId, this.expenseId,
this.vendorId,
this.transactionId, this.transactionId,
this.isChanged, this.isChanged,
this.createdAt, this.createdAt,
@ -642,6 +652,8 @@ class _$TransactionEntity extends TransactionEntity {
invoiceIds, 'TransactionEntity', 'invoiceIds'); invoiceIds, 'TransactionEntity', 'invoiceIds');
BuiltValueNullFieldError.checkNotNull( BuiltValueNullFieldError.checkNotNull(
expenseId, 'TransactionEntity', 'expenseId'); expenseId, 'TransactionEntity', 'expenseId');
BuiltValueNullFieldError.checkNotNull(
vendorId, 'TransactionEntity', 'vendorId');
BuiltValueNullFieldError.checkNotNull( BuiltValueNullFieldError.checkNotNull(
transactionId, 'TransactionEntity', 'transactionId'); transactionId, 'TransactionEntity', 'transactionId');
BuiltValueNullFieldError.checkNotNull( BuiltValueNullFieldError.checkNotNull(
@ -677,6 +689,7 @@ class _$TransactionEntity extends TransactionEntity {
categoryId == other.categoryId && categoryId == other.categoryId &&
invoiceIds == other.invoiceIds && invoiceIds == other.invoiceIds &&
expenseId == other.expenseId && expenseId == other.expenseId &&
vendorId == other.vendorId &&
transactionId == other.transactionId && transactionId == other.transactionId &&
isChanged == other.isChanged && isChanged == other.isChanged &&
createdAt == other.createdAt && createdAt == other.createdAt &&
@ -709,17 +722,17 @@ class _$TransactionEntity extends TransactionEntity {
$jc( $jc(
$jc( $jc(
$jc( $jc(
$jc($jc($jc(0, amount.hashCode), currencyId.hashCode), $jc($jc($jc($jc(0, amount.hashCode), currencyId.hashCode), category.hashCode),
category.hashCode), baseType.hashCode),
baseType.hashCode), accountType.hashCode),
accountType.hashCode), date.hashCode),
date.hashCode), bankAccountId.hashCode),
bankAccountId.hashCode), description.hashCode),
description.hashCode), statusId.hashCode),
statusId.hashCode), categoryId.hashCode),
categoryId.hashCode), invoiceIds.hashCode),
invoiceIds.hashCode), expenseId.hashCode),
expenseId.hashCode), vendorId.hashCode),
transactionId.hashCode), transactionId.hashCode),
isChanged.hashCode), isChanged.hashCode),
createdAt.hashCode), createdAt.hashCode),
@ -746,6 +759,7 @@ class _$TransactionEntity extends TransactionEntity {
..add('categoryId', categoryId) ..add('categoryId', categoryId)
..add('invoiceIds', invoiceIds) ..add('invoiceIds', invoiceIds)
..add('expenseId', expenseId) ..add('expenseId', expenseId)
..add('vendorId', vendorId)
..add('transactionId', transactionId) ..add('transactionId', transactionId)
..add('isChanged', isChanged) ..add('isChanged', isChanged)
..add('createdAt', createdAt) ..add('createdAt', createdAt)
@ -812,6 +826,10 @@ class TransactionEntityBuilder
String get expenseId => _$this._expenseId; String get expenseId => _$this._expenseId;
set expenseId(String expenseId) => _$this._expenseId = 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 _transactionId;
int get transactionId => _$this._transactionId; int get transactionId => _$this._transactionId;
set transactionId(int transactionId) => _$this._transactionId = transactionId; set transactionId(int transactionId) => _$this._transactionId = transactionId;
@ -869,6 +887,7 @@ class TransactionEntityBuilder
_categoryId = $v.categoryId; _categoryId = $v.categoryId;
_invoiceIds = $v.invoiceIds; _invoiceIds = $v.invoiceIds;
_expenseId = $v.expenseId; _expenseId = $v.expenseId;
_vendorId = $v.vendorId;
_transactionId = $v.transactionId; _transactionId = $v.transactionId;
_isChanged = $v.isChanged; _isChanged = $v.isChanged;
_createdAt = $v.createdAt; _createdAt = $v.createdAt;
@ -919,6 +938,7 @@ class TransactionEntityBuilder
categoryId: BuiltValueNullFieldError.checkNotNull(categoryId, 'TransactionEntity', 'categoryId'), categoryId: BuiltValueNullFieldError.checkNotNull(categoryId, 'TransactionEntity', 'categoryId'),
invoiceIds: BuiltValueNullFieldError.checkNotNull(invoiceIds, 'TransactionEntity', 'invoiceIds'), invoiceIds: BuiltValueNullFieldError.checkNotNull(invoiceIds, 'TransactionEntity', 'invoiceIds'),
expenseId: BuiltValueNullFieldError.checkNotNull(expenseId, 'TransactionEntity', 'expenseId'), expenseId: BuiltValueNullFieldError.checkNotNull(expenseId, 'TransactionEntity', 'expenseId'),
vendorId: BuiltValueNullFieldError.checkNotNull(vendorId, 'TransactionEntity', 'vendorId'),
transactionId: BuiltValueNullFieldError.checkNotNull(transactionId, 'TransactionEntity', 'transactionId'), transactionId: BuiltValueNullFieldError.checkNotNull(transactionId, 'TransactionEntity', 'transactionId'),
isChanged: isChanged, isChanged: isChanged,
createdAt: BuiltValueNullFieldError.checkNotNull(createdAt, 'TransactionEntity', 'createdAt'), createdAt: BuiltValueNullFieldError.checkNotNull(createdAt, 'TransactionEntity', 'createdAt'),

View File

@ -86,7 +86,7 @@ class TransactionRepository {
{ {
'id': transactionId, 'id': transactionId,
'vendor_id': vendorId, 'vendor_id': vendorId,
'ninja_category_id': categoryId, 'category_id': categoryId,
}, },
), ),
); );

View File

@ -5,12 +5,13 @@ import 'package:built_collection/built_collection.dart';
import 'package:invoiceninja_flutter/data/models/models.dart'; import 'package:invoiceninja_flutter/data/models/models.dart';
import 'package:invoiceninja_flutter/redux/ui/list_ui_state.dart'; import 'package:invoiceninja_flutter/redux/ui/list_ui_state.dart';
var memoizedDropdownTransactionList = memo9( var memoizedDropdownTransactionList = memo10(
(BuiltMap<String, TransactionEntity> transactionMap, (BuiltMap<String, TransactionEntity> transactionMap,
BuiltList<String> transactionList, BuiltList<String> transactionList,
StaticState staticState, StaticState staticState,
BuiltMap<String, UserEntity> userMap, BuiltMap<String, UserEntity> userMap,
BuiltMap<String, InvoiceEntity> invoiceMap, BuiltMap<String, InvoiceEntity> invoiceMap,
BuiltMap<String, VendorEntity> vendorMap,
BuiltMap<String, ExpenseEntity> expenseMap, BuiltMap<String, ExpenseEntity> expenseMap,
BuiltMap<String, ExpenseCategoryEntity> expenseCategoryMap, BuiltMap<String, ExpenseCategoryEntity> expenseCategoryMap,
BuiltMap<String, BankAccountEntity> bankAccountMap, BuiltMap<String, BankAccountEntity> bankAccountMap,
@ -21,6 +22,7 @@ var memoizedDropdownTransactionList = memo9(
staticState, staticState,
userMap, userMap,
invoiceMap, invoiceMap,
vendorMap,
expenseMap, expenseMap,
expenseCategoryMap, expenseCategoryMap,
bankAccountMap, bankAccountMap,
@ -32,6 +34,7 @@ List<String> dropdownTransactionsSelector(
StaticState staticState, StaticState staticState,
BuiltMap<String, UserEntity> userMap, BuiltMap<String, UserEntity> userMap,
BuiltMap<String, InvoiceEntity> invoiceMap, BuiltMap<String, InvoiceEntity> invoiceMap,
BuiltMap<String, VendorEntity> vendorMap,
BuiltMap<String, ExpenseEntity> expenseMap, BuiltMap<String, ExpenseEntity> expenseMap,
BuiltMap<String, ExpenseCategoryEntity> expenseCategoryMap, BuiltMap<String, ExpenseCategoryEntity> expenseCategoryMap,
BuiltMap<String, BankAccountEntity> bankAccountMap, BuiltMap<String, BankAccountEntity> bankAccountMap,
@ -50,16 +53,17 @@ List<String> dropdownTransactionsSelector(
final transactionA = transactionMap[transactionAId]; final transactionA = transactionMap[transactionAId];
final transactionB = transactionMap[transactionBId]; final transactionB = transactionMap[transactionBId];
return transactionA.compareTo(transactionB, TransactionFields.date, true, return transactionA.compareTo(transactionB, TransactionFields.date, true,
invoiceMap, expenseMap, expenseCategoryMap, bankAccountMap); vendorMap, invoiceMap, expenseMap, expenseCategoryMap, bankAccountMap);
}); });
return list; return list;
} }
var memoizedFilteredTransactionList = memo8((SelectionState selectionState, var memoizedFilteredTransactionList = memo9((SelectionState selectionState,
BuiltMap<String, TransactionEntity> transactionMap, BuiltMap<String, TransactionEntity> transactionMap,
BuiltList<String> transactionList, BuiltList<String> transactionList,
BuiltMap<String, InvoiceEntity> invoiceMap, BuiltMap<String, InvoiceEntity> invoiceMap,
BuiltMap<String, VendorEntity> vendorMap,
BuiltMap<String, ExpenseEntity> expenseMap, BuiltMap<String, ExpenseEntity> expenseMap,
BuiltMap<String, ExpenseCategoryEntity> expenseCategoryMap, BuiltMap<String, ExpenseCategoryEntity> expenseCategoryMap,
BuiltMap<String, BankAccountEntity> bankAccountMap, BuiltMap<String, BankAccountEntity> bankAccountMap,
@ -69,6 +73,7 @@ var memoizedFilteredTransactionList = memo8((SelectionState selectionState,
transactionMap, transactionMap,
transactionList, transactionList,
invoiceMap, invoiceMap,
vendorMap,
expenseMap, expenseMap,
expenseCategoryMap, expenseCategoryMap,
bankAccountMap, bankAccountMap,
@ -79,6 +84,7 @@ List<String> filteredTransactionsSelector(
BuiltMap<String, TransactionEntity> transactionMap, BuiltMap<String, TransactionEntity> transactionMap,
BuiltList<String> transactionList, BuiltList<String> transactionList,
BuiltMap<String, InvoiceEntity> invoiceMap, BuiltMap<String, InvoiceEntity> invoiceMap,
BuiltMap<String, VendorEntity> vendorMap,
BuiltMap<String, ExpenseEntity> expenseMap, BuiltMap<String, ExpenseEntity> expenseMap,
BuiltMap<String, ExpenseCategoryEntity> expenseCategoryMap, BuiltMap<String, ExpenseCategoryEntity> expenseCategoryMap,
BuiltMap<String, BankAccountEntity> bankAccountMap, BuiltMap<String, BankAccountEntity> bankAccountMap,
@ -112,6 +118,7 @@ List<String> filteredTransactionsSelector(
transactionB, transactionB,
transactionListState.sortField, transactionListState.sortField,
transactionListState.sortAscending, transactionListState.sortAscending,
vendorMap,
invoiceMap, invoiceMap,
expenseMap, expenseMap,
expenseCategoryMap, expenseCategoryMap,

View File

@ -91,6 +91,7 @@ class TransactionListVM {
state.transactionState.map, state.transactionState.map,
state.transactionState.list, state.transactionState.list,
state.invoiceState.map, state.invoiceState.map,
state.vendorState.map,
state.expenseState.map, state.expenseState.map,
state.expenseCategoryState.map, state.expenseCategoryState.map,
state.bankAccountState.map, state.bankAccountState.map,

View File

@ -97,8 +97,10 @@ class TransactionPresenter extends EntityPresenter {
case TransactionFields.expense: case TransactionFields.expense:
final expense = state.expenseState.get(transaction.expenseId); final expense = state.expenseState.get(transaction.expenseId);
return LinkTextRelatedEntity(entity: expense, relation: transaction); 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: case TransactionFields.category:
return Text(transaction.categoryId);
final category = state.expenseCategoryState.get(transaction.categoryId); final category = state.expenseCategoryState.get(transaction.categoryId);
return LinkTextRelatedEntity(entity: category, relation: transaction); return LinkTextRelatedEntity(entity: category, relation: transaction);
} }

View File

@ -51,6 +51,7 @@ class TransactionScreenVM {
state.transactionState.map, state.transactionState.map,
state.transactionState.list, state.transactionState.list,
state.invoiceState.map, state.invoiceState.map,
state.vendorState.map,
state.expenseState.map, state.expenseState.map,
state.expenseCategoryState.map, state.expenseCategoryState.map,
state.bankAccountState.map, state.bankAccountState.map,

View File

@ -2,6 +2,7 @@ import 'package:flutter/material.dart';
import 'package:invoiceninja_flutter/constants.dart'; import 'package:invoiceninja_flutter/constants.dart';
import 'package:invoiceninja_flutter/data/models/models.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/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/entity_header.dart';
import 'package:invoiceninja_flutter/ui/app/forms/date_picker.dart'; import 'package:invoiceninja_flutter/ui/app/forms/date_picker.dart';
import 'package:invoiceninja_flutter/ui/app/forms/decorated_form_field.dart'; import 'package:invoiceninja_flutter/ui/app/forms/decorated_form_field.dart';
@ -36,6 +37,7 @@ class _TransactionViewState extends State<TransactionView> {
final viewModel = widget.viewModel; final viewModel = widget.viewModel;
final transaction = viewModel.transaction; final transaction = viewModel.transaction;
final localization = AppLocalization.of(context); final localization = AppLocalization.of(context);
final state = viewModel.state;
return ViewScaffold( return ViewScaffold(
isFilter: widget.isFilter, isFilter: widget.isFilter,
@ -54,18 +56,39 @@ class _TransactionViewState extends State<TransactionView> {
secondValue: formatDate(transaction.date, context), secondValue: formatDate(transaction.date, context),
), ),
ListDivider(), ListDivider(),
if (false) if (transaction.isConverted) ...[
Expanded( if (true)
child: _MatchDeposits( ...transaction.invoiceIds
viewModel: viewModel, .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,
),
),
], ],
), ),
); );