Skip to content

Commit

Permalink
Merge pull request #60 from enrique-lozano/transaction-filters-improv…
Browse files Browse the repository at this point in the history
…ements

Transaction filters improvements
  • Loading branch information
enrique-lozano authored Oct 17, 2023
2 parents 704eb59 + 54acbf6 commit 34a074d
Show file tree
Hide file tree
Showing 55 changed files with 6,817 additions and 3,512 deletions.
5 changes: 5 additions & 0 deletions build.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,11 @@ targets:
generate_values_in_copy_with: true
scoped_dart_components: true

copy_with_extension_gen:
enabled: true
options:
copy_with_null: true

slang_build_runner:
options:
base_locale: en
Expand Down
27 changes: 10 additions & 17 deletions lib/app/accounts/account_details.dart
Original file line number Diff line number Diff line change
Expand Up @@ -5,15 +5,15 @@ import 'package:intl/intl.dart';
import 'package:monekin/app/accounts/account_form.dart';
import 'package:monekin/app/transactions/transaction_list.dart';
import 'package:monekin/app/transactions/transactions.page.dart';
import 'package:monekin/core/database/app_db.dart';
import 'package:monekin/core/database/services/account/account_service.dart';
import 'package:monekin/core/database/services/exchange-rate/exchange_rate_service.dart';
import 'package:monekin/core/models/account/account.dart';
import 'package:monekin/core/models/transaction/transaction.dart';
import 'package:monekin/core/models/transaction/transaction_status.dart';
import 'package:monekin/core/presentation/widgets/card_with_header.dart';
import 'package:monekin/core/presentation/widgets/filter_sheet_modal.dart';
import 'package:monekin/core/presentation/widgets/monekin_quick_actions_buttons.dart';
import 'package:monekin/core/presentation/widgets/number_ui_formatters/currency_displayer.dart';
import 'package:monekin/core/presentation/widgets/transaction_filter/transaction_filters.dart';
import 'package:monekin/core/utils/list_tile_action_item.dart';
import 'package:monekin/i18n/translations.g.dart';

Expand Down Expand Up @@ -47,7 +47,7 @@ class _AccountDetailsPageState extends State<AccountDetailsPage> {
)),
ListTileActionItem(
label: t.transfer.create,
icon: Icons.swap_vert_rounded,
icon: TransactionType.transfer.icon(),
onClick: account.isArchived
? null
: () async {
Expand Down Expand Up @@ -386,27 +386,20 @@ class _AccountDetailsPageState extends State<AccountDetailsPage> {
MaterialPageRoute(
builder: (context) => TransactionsPage(
filters: TransactionFilters(
accounts: [widget.account]),
accountsIDs: [widget.account.id]),
),
),
);
},
body: StreamBuilder(
stream: TransactionService.instance
.getTransactions(
predicate: (transaction,
account,
accountCurrency,
receivingAccount,
receivingAccountCurrency,
c,
p6) =>
AppDB.instance.buildExpr([
transaction.status.isNotInValues([
TransactionStatus.pending,
TransactionStatus.voided
])
]),
filters: TransactionFilters(
status: TransactionStatus.notIn({
TransactionStatus.pending,
TransactionStatus.voided
}),
),
limit: 5,
orderBy: (p0, p1, p2, p3, p4, p5, p6) =>
drift.OrderBy([
Expand Down
56 changes: 24 additions & 32 deletions lib/app/accounts/account_form.dart
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
import 'package:drift/drift.dart' as drift;
import 'package:flutter/material.dart';
import 'package:flutter_svg/flutter_svg.dart';
import 'package:intl/intl.dart';
Expand All @@ -10,11 +9,13 @@ import 'package:monekin/core/database/services/transaction/transaction_service.d
import 'package:monekin/core/models/account/account.dart';
import 'package:monekin/core/models/currency/currency.dart';
import 'package:monekin/core/models/supported-icon/supported_icon.dart';
import 'package:monekin/core/models/transaction/transaction.dart';
import 'package:monekin/core/presentation/widgets/currency_selector_modal.dart';
import 'package:monekin/core/presentation/widgets/expansion_panel/single_expansion_panel.dart';
import 'package:monekin/core/presentation/widgets/icon_selector_modal.dart';
import 'package:monekin/core/presentation/widgets/inline_info_card.dart';
import 'package:monekin/core/presentation/widgets/persistent_footer_button.dart';
import 'package:monekin/core/presentation/widgets/transaction_filter/transaction_filters.dart';
import 'package:monekin/core/services/supported_icon/supported_icon_service.dart';
import 'package:monekin/core/utils/text_field_utils.dart';
import 'package:monekin/i18n/translations.g.dart';
Expand Down Expand Up @@ -61,10 +62,8 @@ class _AccountFormPageState extends State<AccountFormPage> {
if (_accountToEdit != null) {
if ((await TransactionService.instance
.getTransactions(
predicate: (transaction, account, accountCurrency,
receivingAccount, receivingAccountCurrency, c, p6) =>
account.id.isValue(_accountToEdit!.id) &
transaction.date.isSmallerThanValue(_openingDate),
filters: TransactionFilters(
accountsIDs: [_accountToEdit!.id], maxDate: _openingDate),
limit: 2,
)
.first)
Expand Down Expand Up @@ -286,19 +285,16 @@ class _AccountFormPageState extends State<AccountFormPage> {
onTap: () {
if (_currency == null) return;

showModalBottomSheet(
context: context,
isScrollControlled: true,
showDragHandle: true,
builder: (context) {
return CurrencySelectorModal(
preselectedCurrency: _currency!,
onCurrencySelected: (newCurrency) {
setState(() {
_currency = newCurrency;
});
});
});
showCurrencySelectorModal(
context,
CurrencySelectorModal(
preselectedCurrency: _currency!,
onCurrencySelected: (newCurrency) {
setState(() {
_currency = newCurrency;
});
}),
);
},
decoration: InputDecoration(
labelText: t.currencies.currency,
Expand Down Expand Up @@ -338,20 +334,16 @@ class _AccountFormPageState extends State<AccountFormPage> {
stream: _accountToEdit == null
? Stream.value(true)
: TransactionService.instance
.getTransactions(
predicate: (transaction,
account,
accountCurrency,
receivingAccount,
receivingAccountCurrency,
c,
p6) =>
transaction.receivingAccountID
.isNull() &
transaction.accountID
.isValue(_accountToEdit!.id),
limit: 1)
.map((event) => event.isEmpty),
.countTransactions(
predicate: TransactionFilters(
transactionTypes: [
TransactionType.expense,
TransactionType.income
],
accountsIDs: [_accountToEdit!.id],
),
)
.map((event) => event.numberOfRes == 0),
builder: (context, snapshot) {
if (!snapshot.hasData || snapshot.data! == false) {
return Container();
Expand Down
20 changes: 11 additions & 9 deletions lib/app/accounts/all_accounts_balance.dart
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import 'package:monekin/core/database/services/account/account_service.dart';
import 'package:monekin/core/models/account/account.dart';
import 'package:monekin/core/presentation/widgets/animated_progress_bar.dart';
import 'package:monekin/core/presentation/widgets/card_with_header.dart';
import 'package:monekin/core/presentation/widgets/filter_sheet_modal.dart';
import 'package:monekin/core/presentation/widgets/transaction_filter/transaction_filters.dart';
import 'package:monekin/i18n/translations.g.dart';

import '../../core/database/services/currency/currency_service.dart';
Expand All @@ -31,27 +31,29 @@ class CurrencyWithMoney {
}

class AllAccountBalancePage extends StatefulWidget {
const AllAccountBalancePage({super.key, required this.date, this.filters});
const AllAccountBalancePage(
{super.key,
required this.date,
this.filters = const TransactionFilters()});

final DateTime date;

final TransactionFilters? filters;
final TransactionFilters filters;

@override
State<AllAccountBalancePage> createState() => _AllAccountBalancePageState();
}

class _AllAccountBalancePageState extends State<AllAccountBalancePage> {
Future<List<AccountWithMoney>> getAccountsWithMoney(
DateTime date, TransactionFilters? filters) async {
final accounts =
filters?.accounts ?? await AccountService.instance.getAccounts().first;
Future<List<AccountWithMoney>> getAccountsWithMoney(DateTime date,
{TransactionFilters filters = const TransactionFilters()}) async {
final accounts = await filters.accounts().first;

final balances = accounts.map((account) async => AccountWithMoney(
money: await AccountService.instance
.getAccountMoney(
account: account,
categoriesIds: filters?.categories?.map((e) => e.id),
trFilters: filters,
convertToPreferredCurrency: true,
date: date,
)
Expand Down Expand Up @@ -97,7 +99,7 @@ class _AllAccountBalancePageState extends State<AllAccountBalancePage> {
final t = Translations.of(context);

return FutureBuilder(
future: getAccountsWithMoney(widget.date, widget.filters),
future: getAccountsWithMoney(widget.date, filters: widget.filters),
builder: (context, snapshot) {
if (!snapshot.hasData) {
return const LinearProgressIndicator();
Expand Down
36 changes: 18 additions & 18 deletions lib/app/budgets/budget_details_page.dart
Original file line number Diff line number Diff line change
Expand Up @@ -5,17 +5,17 @@ import 'package:monekin/app/budgets/budget_form_page.dart';
import 'package:monekin/app/budgets/budgets_page.dart';
import 'package:monekin/app/budgets/components/budget_evolution_chart.dart';
import 'package:monekin/app/transactions/transaction_list.dart';
import 'package:monekin/core/database/app_db.dart';
import 'package:monekin/core/database/services/budget/budget_service.dart';
import 'package:monekin/core/database/services/transaction/transaction_service.dart';
import 'package:monekin/core/models/budget/budget.dart';
import 'package:monekin/core/models/transaction/transaction.dart';
import 'package:monekin/core/models/transaction/transaction_status.dart';
import 'package:monekin/core/presentation/theme.dart';
import 'package:monekin/core/presentation/widgets/animated_progress_bar.dart';
import 'package:monekin/core/presentation/widgets/card_with_header.dart';
import 'package:monekin/core/presentation/widgets/monekin_popup_menu_button.dart';
import 'package:monekin/core/presentation/widgets/number_ui_formatters/currency_displayer.dart';
import 'package:monekin/core/presentation/widgets/skeleton.dart';
import 'package:monekin/core/presentation/widgets/transaction_filter/transaction_filters.dart';
import 'package:monekin/core/utils/list_tile_action_item.dart';
import 'package:monekin/i18n/translations.g.dart';

Expand Down Expand Up @@ -43,7 +43,7 @@ class _BudgetDetailsPageState extends State<BudgetDetailsPage> {
title: Text(t.budgets.details.title),
bottom: TabBar(tabs: [
Tab(text: t.budgets.details.statistics),
Tab(text: t.general.transactions),
Tab(text: t.transaction.display(n: 1)),
]),
actions: [
MonekinPopuMenuButton(actionItems: [
Expand Down Expand Up @@ -225,21 +225,21 @@ class _BudgetDetailsPageState extends State<BudgetDetailsPage> {
),
),
StreamBuilder(
stream: TransactionService.instance.getTransactions(
predicate: (transaction, account, accountCurrency,
receivingAccount, receivingAccountCurrency, c, p6) =>
AppDB.instance.buildExpr([
c.id.isIn(widget.budget.categories) |
c.parentCategoryID.isIn(widget.budget.categories),
transaction.accountID.isIn(widget.budget.accounts),
transaction.isHidden.isNotValue(true),
transaction.date
.isBiggerThanValue(widget.budget.currentDateRange[0]),
transaction.date
.isSmallerThanValue(widget.budget.currentDateRange[1]),
transaction.status.isNotInValues(
[TransactionStatus.pending, TransactionStatus.voided])
]),
stream: TransactionService.instance.getTransactionsFromPredicate(
predicate: TransactionFilters(
status: TransactionStatus.notIn(
{TransactionStatus.pending, TransactionStatus.voided}),
minDate: widget.budget.currentDateRange[0],
maxDate: widget.budget.currentDateRange[1],
).toTransactionExpression(
extraFilters: (transaction, account, accountCurrency,
receivingAccount, receivingAccountCurrency, c, p6) =>
[
c.id.isIn(widget.budget.categories) |
c.parentCategoryID.isIn(widget.budget.categories),
transaction.accountID.isIn(widget.budget.accounts),
],
),
),
builder: (context, snapshot) {
if (!snapshot.hasData) {
Expand Down
4 changes: 2 additions & 2 deletions lib/app/categories/categories_list.dart
Original file line number Diff line number Diff line change
Expand Up @@ -171,8 +171,8 @@ class _CategoriesListState extends State<CategoriesList> {
appBar: AppBar(
elevation: 0,
bottom: TabBar(tabs: [
Tab(text: t.general.incomes),
Tab(text: t.general.expenses),
Tab(text: t.transaction.types.income(n: 10)),
Tab(text: t.transaction.types.expense(n: 10)),
]),
title: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
Expand Down
6 changes: 4 additions & 2 deletions lib/app/categories/form/category_form.dart
Original file line number Diff line number Diff line change
Expand Up @@ -249,10 +249,12 @@ class _CategoryFormPageState extends State<CategoryFormPage> {
items: [
DropdownMenuItem(
value: CategoryType.I,
child: Text(t.general.income)),
child:
Text(t.transaction.types.income(n: 1))),
DropdownMenuItem(
value: CategoryType.E,
child: Text(t.general.expense)),
child: Text(
t.transaction.types.expense(n: 1))),
DropdownMenuItem(
value: CategoryType.B,
child: Text(t.categories.both_types))
Expand Down
Loading

0 comments on commit 34a074d

Please sign in to comment.