Transactions

This commit is contained in:
Hillel Coren 2022-09-23 08:34:08 +03:00
parent b167b99437
commit c4e69b3577
7 changed files with 116 additions and 42 deletions

View File

@ -60,6 +60,7 @@ class TransactionFields {
static const String expenseId = 'expense_id';
static const String expense = 'expense';
static const String status = 'status';
static const String accountType = 'account_type';
}
abstract class TransactionEntity extends Object
@ -86,6 +87,8 @@ abstract class TransactionEntity extends Object
statusId: '',
baseType: TYPE_DEPOSIT,
transactionId: 0,
accountType: '',
categoryId: '',
);
}
@ -109,6 +112,9 @@ abstract class TransactionEntity extends Object
@BuiltValueField(wireName: 'base_type')
String get baseType;
@BuiltValueField(wireName: 'account_type')
String get accountType;
String get date;
@BuiltValueField(wireName: 'bank_integration_id')
@ -119,8 +125,8 @@ abstract class TransactionEntity extends Object
@BuiltValueField(wireName: 'status_id')
String get statusId;
//@BuiltValueField(wireName: 'ninja_category_id')
//String get categoryId;
@BuiltValueField(wireName: 'ninja_category_id')
String get categoryId;
@BuiltValueField(wireName: 'invoice_ids')
String get invoiceIds;
@ -131,9 +137,6 @@ abstract class TransactionEntity extends Object
@BuiltValueField(wireName: 'transaction_id')
int get transactionId;
//@BuiltValueField(wireName: 'is_matched')
//bool get isMached;
@override
EntityType get entityType => EntityType.transaction;
@ -173,6 +176,7 @@ abstract class TransactionEntity extends Object
bool sortAscending,
BuiltMap<String, InvoiceEntity> invoiceMap,
BuiltMap<String, ExpenseEntity> expenseMap,
BuiltMap<String, ExpenseCategoryEntity> expenseCategoryMap,
BuiltMap<String, BankAccountEntity> bankAccountMap,
) {
int response = 0;
@ -193,14 +197,12 @@ abstract class TransactionEntity extends Object
case TransactionFields.status:
response = transactionA.statusId.compareTo(transactionB.statusId);
break;
case TransactionFields.category:
response = transactionA.category
.toLowerCase()
.compareTo(transactionB.category.toLowerCase());
break;
case TransactionFields.date:
response = transactionA.date.compareTo(transactionB.date);
break;
case TransactionFields.accountType:
response = transactionA.accountType.compareTo(transactionB.accountType);
break;
case TransactionFields.invoices:
final invoiceA =
invoiceMap[transactionA.firstInvoiceId] ?? InvoiceEntity();
@ -217,6 +219,15 @@ abstract class TransactionEntity extends Object
.toLowerCase()
.compareTo(expenseB.listDisplayName.toLowerCase());
break;
case TransactionFields.category:
final categoryA = expenseCategoryMap[transactionA.categoryId] ??
ExpenseCategoryEntity();
final categoryB = expenseCategoryMap[transactionB.categoryId] ??
ExpenseCategoryEntity();
response = categoryA.listDisplayName
.toLowerCase()
.compareTo(categoryB.listDisplayName.toLowerCase());
break;
case TransactionFields.bankAccount:
final bankAccountA =
bankAccountMap[transactionA.bankAccountId] ?? BankAccountEntity();

View File

@ -134,6 +134,9 @@ class _$TransactionEntitySerializer
'base_type',
serializers.serialize(object.baseType,
specifiedType: const FullType(String)),
'account_type',
serializers.serialize(object.accountType,
specifiedType: const FullType(String)),
'date',
serializers.serialize(object.date, specifiedType: const FullType(String)),
'bank_integration_id',
@ -145,6 +148,9 @@ class _$TransactionEntitySerializer
'status_id',
serializers.serialize(object.statusId,
specifiedType: const FullType(String)),
'ninja_category_id',
serializers.serialize(object.categoryId,
specifiedType: const FullType(String)),
'invoice_ids',
serializers.serialize(object.invoiceIds,
specifiedType: const FullType(String)),
@ -226,6 +232,10 @@ class _$TransactionEntitySerializer
result.baseType = serializers.deserialize(value,
specifiedType: const FullType(String)) as String;
break;
case 'account_type':
result.accountType = serializers.deserialize(value,
specifiedType: const FullType(String)) as String;
break;
case 'date':
result.date = serializers.deserialize(value,
specifiedType: const FullType(String)) as String;
@ -242,6 +252,10 @@ class _$TransactionEntitySerializer
result.statusId = serializers.deserialize(value,
specifiedType: const FullType(String)) as String;
break;
case 'ninja_category_id':
result.categoryId = serializers.deserialize(value,
specifiedType: const FullType(String)) as String;
break;
case 'invoice_ids':
result.invoiceIds = serializers.deserialize(value,
specifiedType: const FullType(String)) as String;
@ -544,6 +558,8 @@ class _$TransactionEntity extends TransactionEntity {
@override
final String baseType;
@override
final String accountType;
@override
final String date;
@override
final String bankAccountId;
@ -552,6 +568,8 @@ class _$TransactionEntity extends TransactionEntity {
@override
final String statusId;
@override
final String categoryId;
@override
final String invoiceIds;
@override
final String expenseId;
@ -583,10 +601,12 @@ class _$TransactionEntity extends TransactionEntity {
this.currencyId,
this.category,
this.baseType,
this.accountType,
this.date,
this.bankAccountId,
this.description,
this.statusId,
this.categoryId,
this.invoiceIds,
this.expenseId,
this.transactionId,
@ -607,6 +627,8 @@ class _$TransactionEntity extends TransactionEntity {
category, 'TransactionEntity', 'category');
BuiltValueNullFieldError.checkNotNull(
baseType, 'TransactionEntity', 'baseType');
BuiltValueNullFieldError.checkNotNull(
accountType, 'TransactionEntity', 'accountType');
BuiltValueNullFieldError.checkNotNull(date, 'TransactionEntity', 'date');
BuiltValueNullFieldError.checkNotNull(
bankAccountId, 'TransactionEntity', 'bankAccountId');
@ -614,6 +636,8 @@ class _$TransactionEntity extends TransactionEntity {
description, 'TransactionEntity', 'description');
BuiltValueNullFieldError.checkNotNull(
statusId, 'TransactionEntity', 'statusId');
BuiltValueNullFieldError.checkNotNull(
categoryId, 'TransactionEntity', 'categoryId');
BuiltValueNullFieldError.checkNotNull(
invoiceIds, 'TransactionEntity', 'invoiceIds');
BuiltValueNullFieldError.checkNotNull(
@ -645,10 +669,12 @@ class _$TransactionEntity extends TransactionEntity {
currencyId == other.currencyId &&
category == other.category &&
baseType == other.baseType &&
accountType == other.accountType &&
date == other.date &&
bankAccountId == other.bankAccountId &&
description == other.description &&
statusId == other.statusId &&
categoryId == other.categoryId &&
invoiceIds == other.invoiceIds &&
expenseId == other.expenseId &&
transactionId == other.transactionId &&
@ -683,21 +709,15 @@ class _$TransactionEntity extends TransactionEntity {
$jc(
$jc(
$jc(
$jc(
0,
amount
.hashCode),
currencyId
.hashCode),
category
.hashCode),
baseType
.hashCode),
date.hashCode),
bankAccountId
.hashCode),
description.hashCode),
statusId.hashCode),
$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),
transactionId.hashCode),
@ -718,10 +738,12 @@ class _$TransactionEntity extends TransactionEntity {
..add('currencyId', currencyId)
..add('category', category)
..add('baseType', baseType)
..add('accountType', accountType)
..add('date', date)
..add('bankAccountId', bankAccountId)
..add('description', description)
..add('statusId', statusId)
..add('categoryId', categoryId)
..add('invoiceIds', invoiceIds)
..add('expenseId', expenseId)
..add('transactionId', transactionId)
@ -757,6 +779,10 @@ class TransactionEntityBuilder
String get baseType => _$this._baseType;
set baseType(String baseType) => _$this._baseType = baseType;
String _accountType;
String get accountType => _$this._accountType;
set accountType(String accountType) => _$this._accountType = accountType;
String _date;
String get date => _$this._date;
set date(String date) => _$this._date = date;
@ -774,6 +800,10 @@ class TransactionEntityBuilder
String get statusId => _$this._statusId;
set statusId(String statusId) => _$this._statusId = statusId;
String _categoryId;
String get categoryId => _$this._categoryId;
set categoryId(String categoryId) => _$this._categoryId = categoryId;
String _invoiceIds;
String get invoiceIds => _$this._invoiceIds;
set invoiceIds(String invoiceIds) => _$this._invoiceIds = invoiceIds;
@ -831,10 +861,12 @@ class TransactionEntityBuilder
_currencyId = $v.currencyId;
_category = $v.category;
_baseType = $v.baseType;
_accountType = $v.accountType;
_date = $v.date;
_bankAccountId = $v.bankAccountId;
_description = $v.description;
_statusId = $v.statusId;
_categoryId = $v.categoryId;
_invoiceIds = $v.invoiceIds;
_expenseId = $v.expenseId;
_transactionId = $v.transactionId;
@ -874,16 +906,18 @@ class TransactionEntityBuilder
category, 'TransactionEntity', 'category'),
baseType: BuiltValueNullFieldError.checkNotNull(
baseType, 'TransactionEntity', 'baseType'),
accountType: BuiltValueNullFieldError.checkNotNull(
accountType, 'TransactionEntity', 'accountType'),
date: BuiltValueNullFieldError.checkNotNull(
date, 'TransactionEntity', 'date'),
bankAccountId: BuiltValueNullFieldError.checkNotNull(
bankAccountId, 'TransactionEntity', 'bankAccountId'),
description: BuiltValueNullFieldError.checkNotNull(
description, 'TransactionEntity', 'description'),
statusId: BuiltValueNullFieldError.checkNotNull(
statusId, 'TransactionEntity', 'statusId'),
invoiceIds: BuiltValueNullFieldError.checkNotNull(
invoiceIds, 'TransactionEntity', 'invoiceIds'),
statusId:
BuiltValueNullFieldError.checkNotNull(statusId, 'TransactionEntity', 'statusId'),
categoryId: BuiltValueNullFieldError.checkNotNull(categoryId, 'TransactionEntity', 'categoryId'),
invoiceIds: BuiltValueNullFieldError.checkNotNull(invoiceIds, 'TransactionEntity', 'invoiceIds'),
expenseId: BuiltValueNullFieldError.checkNotNull(expenseId, 'TransactionEntity', 'expenseId'),
transactionId: BuiltValueNullFieldError.checkNotNull(transactionId, 'TransactionEntity', 'transactionId'),
isChanged: isChanged,

View File

@ -5,13 +5,14 @@ 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 = memo8(
var memoizedDropdownTransactionList = memo9(
(BuiltMap<String, TransactionEntity> transactionMap,
BuiltList<String> transactionList,
StaticState staticState,
BuiltMap<String, UserEntity> userMap,
BuiltMap<String, InvoiceEntity> invoiceMap,
BuiltMap<String, ExpenseEntity> expenseMap,
BuiltMap<String, ExpenseCategoryEntity> expenseCategoryMap,
BuiltMap<String, BankAccountEntity> bankAccountMap,
String clientId) =>
dropdownTransactionsSelector(
@ -21,6 +22,7 @@ var memoizedDropdownTransactionList = memo8(
userMap,
invoiceMap,
expenseMap,
expenseCategoryMap,
bankAccountMap,
clientId));
@ -31,6 +33,7 @@ List<String> dropdownTransactionsSelector(
BuiltMap<String, UserEntity> userMap,
BuiltMap<String, InvoiceEntity> invoiceMap,
BuiltMap<String, ExpenseEntity> expenseMap,
BuiltMap<String, ExpenseCategoryEntity> expenseCategoryMap,
BuiltMap<String, BankAccountEntity> bankAccountMap,
String clientId) {
final list = transactionList.where((transactionId) {
@ -47,17 +50,18 @@ List<String> dropdownTransactionsSelector(
final transactionA = transactionMap[transactionAId];
final transactionB = transactionMap[transactionBId];
return transactionA.compareTo(transactionB, TransactionFields.date, true,
invoiceMap, expenseMap, bankAccountMap);
invoiceMap, expenseMap, expenseCategoryMap, bankAccountMap);
});
return list;
}
var memoizedFilteredTransactionList = memo7((SelectionState selectionState,
var memoizedFilteredTransactionList = memo8((SelectionState selectionState,
BuiltMap<String, TransactionEntity> transactionMap,
BuiltList<String> transactionList,
BuiltMap<String, InvoiceEntity> invoiceMap,
BuiltMap<String, ExpenseEntity> expenseMap,
BuiltMap<String, ExpenseCategoryEntity> expenseCategoryMap,
BuiltMap<String, BankAccountEntity> bankAccountMap,
ListUIState transactionListState) =>
filteredTransactionsSelector(
@ -66,6 +70,7 @@ var memoizedFilteredTransactionList = memo7((SelectionState selectionState,
transactionList,
invoiceMap,
expenseMap,
expenseCategoryMap,
bankAccountMap,
transactionListState));
@ -75,6 +80,7 @@ List<String> filteredTransactionsSelector(
BuiltList<String> transactionList,
BuiltMap<String, InvoiceEntity> invoiceMap,
BuiltMap<String, ExpenseEntity> expenseMap,
BuiltMap<String, ExpenseCategoryEntity> expenseCategoryMap,
BuiltMap<String, BankAccountEntity> bankAccountMap,
ListUIState transactionListState) {
final filterEntityId = selectionState.filterEntityId;
@ -108,6 +114,7 @@ List<String> filteredTransactionsSelector(
transactionListState.sortAscending,
invoiceMap,
expenseMap,
expenseCategoryMap,
bankAccountMap);
});

View File

@ -92,6 +92,7 @@ class TransactionListVM {
state.transactionState.list,
state.invoiceState.map,
state.expenseState.map,
state.expenseCategoryState.map,
state.bankAccountState.map,
state.transactionListState),
transactionMap: state.transactionState.map,

View File

@ -1,5 +1,6 @@
import 'package:flutter/material.dart';
import 'package:flutter_redux/flutter_redux.dart';
import 'package:invoiceninja_flutter/constants.dart';
import 'package:invoiceninja_flutter/data/models/models.dart';
import 'package:invoiceninja_flutter/redux/app/app_state.dart';
import 'package:invoiceninja_flutter/ui/app/entities/entity_status_chip.dart';
@ -26,6 +27,7 @@ class TransactionPresenter extends EntityPresenter {
return [
...getDefaultTableFields(userCompany),
...EntityPresenter.getBaseFields(),
TransactionFields.accountType,
TransactionFields.bankAccount,
TransactionFields.currency,
TransactionFields.amount,
@ -66,25 +68,38 @@ class TransactionPresenter extends EntityPresenter {
child: Text(formatNumber(transaction.amount, context,
currencyId: transaction.currencyId)),
);
case TransactionFields.category:
return Text(toTitleCase(transaction.category.toLowerCase()));
case TransactionFields.description:
return Text(transaction.description);
case TransactionFields.accountType:
return Text(toTitleCase(transaction.accountType));
case TransactionFields.bankAccount:
final bankAccount =
state.bankAccountState.get(transaction.bankAccountId);
return LinkTextRelatedEntity(
entity: bankAccount, relation: transaction);
case TransactionFields.invoices:
return Text(transaction.invoiceIds);
//final invoice = state.invoiceState.get(transaction.invoiceIds);
//return LinkTextRelatedEntity(entity: invoice, relation: transaction);
return ConstrainedBox(
constraints: BoxConstraints(maxWidth: kTableColumnWidthMax),
child: Wrap(
clipBehavior: Clip.antiAlias,
children: transaction.invoiceIds
.split(',')
.map((invoiceId) => state.invoiceState.map[invoiceId])
.where((invoice) => invoice != null)
.map((invoice) => Padding(
padding: const EdgeInsets.only(right: 8),
child: LinkTextRelatedEntity(
entity: invoice, relation: transaction),
))
.toList(),
),
);
case TransactionFields.expense:
return Text(transaction.expenseId);
//final expense = state.expenseState.get(transaction.expenseId);
//return LinkTextRelatedEntity(entity: expense, relation: transaction);
case TransactionFields.currency:
return Text(state.bankAccountState.get(transaction.bankAccountId).name);
final expense = state.expenseState.get(transaction.expenseId);
return LinkTextRelatedEntity(entity: expense, relation: transaction);
case TransactionFields.category:
final category = state.expenseCategoryState.get(transaction.categoryId);
return LinkTextRelatedEntity(entity: category, relation: transaction);
}
return super.getField(field: field, context: context);

View File

@ -52,6 +52,7 @@ class TransactionScreenVM {
state.transactionState.list,
state.invoiceState.map,
state.expenseState.map,
state.expenseCategoryState.map,
state.bankAccountState.map,
state.transactionListState,
),

View File

@ -16,6 +16,7 @@ mixin LocalizationsProvider on LocaleCodeAware {
static final Map<String, Map<String, String>> _localizedValues = {
'en': {
// STARTER: lang key - do not remove comment
'account_type': 'Account Type',
'new_bank_account': 'New Bank Account',
'connect_accounts': 'Connect Accounts',
'manage_rules': 'Manage Rules',
@ -87382,6 +87383,10 @@ mixin LocalizationsProvider on LocaleCodeAware {
_localizedValues[localeCode]['new_bank_account'] ??
_localizedValues['en']['new_bank_account'];
String get accountType =>
_localizedValues[localeCode]['account_type'] ??
_localizedValues['en']['account_type'];
// STARTER: lang field - do not remove comment
String lookup(String key) {