Compare commits

..

3 Commits

Author SHA1 Message Date
121d0ec236 Auto-fix 2025-05-19 22:01:17 +02:00
71993c2686 Implement account deletion 2025-05-19 21:55:49 +02:00
cbe2d5a556 Bump tag 2025-05-18 22:43:26 +02:00
8 changed files with 48 additions and 54 deletions

View File

@ -179,10 +179,19 @@ class OkaneDatabase extends _$OkaneDatabase {
}
}
@DriftAccessor(tables: [Accounts])
@DriftAccessor(
tables: [
Accounts,
Transactions,
TransactionTemplates,
RecurringTransactions,
Budgets,
Beneficiaries,
],
)
class AccountsDao extends DatabaseAccessor<OkaneDatabase>
with _$AccountsDaoMixin {
AccountsDao(OkaneDatabase db) : super(db);
AccountsDao(super.db);
Stream<List<Account>> accountsStream() {
return select(accounts).watch();
@ -195,6 +204,22 @@ class AccountsDao extends DatabaseAccessor<OkaneDatabase>
Future<int> upsertAccount(AccountsCompanion account) {
return into(accounts).insertOnConflictUpdate(account);
}
Future<void> removeAccount(Account account) async {
// Delete dependent data
await (delete(transactions)
..where((t) => t.accountId.equals(account.id))).go();
await (delete(recurringTransactions)
..where((r) => r.accountId.equals(account.id))).go();
await (delete(transactionTemplates)
..where((t) => t.accountId.equals(account.id))).go();
await (delete(budgets)..where((b) => b.accountId.equals(account.id))).go();
await (delete(beneficiaries)
..where((b) => b.accountId.equals(account.id))).go();
// Delete the account
await (delete(accounts)..where((a) => a.id.equals(account.id))).go();
}
}
enum TransactionQueryDateOption { thisMonth }
@ -202,7 +227,7 @@ enum TransactionQueryDateOption { thisMonth }
@DriftAccessor(tables: [Transactions, Beneficiaries, ExpenseCategories])
class TransactionsDao extends DatabaseAccessor<OkaneDatabase>
with _$TransactionsDaoMixin {
TransactionsDao(OkaneDatabase db) : super(db);
TransactionsDao(super.db);
JoinedSelectStatement _transactionQuery(Account account) {
return (select(transactions)
@ -325,7 +350,7 @@ class TransactionsDao extends DatabaseAccessor<OkaneDatabase>
@DriftAccessor(tables: [Beneficiaries])
class BeneficiariesDao extends DatabaseAccessor<OkaneDatabase>
with _$BeneficiariesDaoMixin {
BeneficiariesDao(OkaneDatabase db) : super(db);
BeneficiariesDao(super.db);
Stream<List<Beneficiary>> beneficiariesStream() {
return select(beneficiaries).watch();
@ -354,7 +379,7 @@ class BeneficiariesDao extends DatabaseAccessor<OkaneDatabase>
@DriftAccessor(tables: [ExpenseCategories])
class ExpenseCategoriesDao extends DatabaseAccessor<OkaneDatabase>
with _$ExpenseCategoriesDaoMixin {
ExpenseCategoriesDao(OkaneDatabase db) : super(db);
ExpenseCategoriesDao(super.db);
Stream<List<ExpenseCategory>> expenseCategoriesStream(Account account) {
return select(expenseCategories).watch();
@ -378,7 +403,7 @@ class ExpenseCategoriesDao extends DatabaseAccessor<OkaneDatabase>
@DriftAccessor(tables: [Budgets, BudgetItems])
class BudgetsDao extends DatabaseAccessor<OkaneDatabase>
with _$BudgetsDaoMixin {
BudgetsDao(OkaneDatabase db) : super(db);
BudgetsDao(super.db);
Stream<List<BudgetsDto>> budgetsStream(Account account) {
return (select(budgets)
@ -436,7 +461,7 @@ class BudgetsDao extends DatabaseAccessor<OkaneDatabase>
@DriftAccessor(tables: [Loans, LoanChanges, Beneficiaries])
class LoansDao extends DatabaseAccessor<OkaneDatabase> with _$LoansDaoMixin {
LoansDao(OkaneDatabase db) : super(db);
LoansDao(super.db);
Stream<List<LoanDto>> loansStream(Account account) {
return select(loans)
@ -512,7 +537,7 @@ class LoansDao extends DatabaseAccessor<OkaneDatabase> with _$LoansDaoMixin {
@DriftAccessor(tables: [TransactionTemplates, ExpenseCategories, Beneficiaries])
class TransactionTemplatesDao extends DatabaseAccessor<OkaneDatabase>
with _$TransactionTemplatesDaoMixin {
TransactionTemplatesDao(OkaneDatabase db) : super(db);
TransactionTemplatesDao(super.db);
Stream<List<TransactionTemplateDto>> transactionTemplatesStream(
Account account,
@ -593,7 +618,7 @@ class TransactionTemplatesDao extends DatabaseAccessor<OkaneDatabase>
@DriftAccessor(tables: [TransactionTemplates, RecurringTransactions])
class RecurringTransactionsDao extends DatabaseAccessor<OkaneDatabase>
with _$RecurringTransactionsDaoMixin {
RecurringTransactionsDao(OkaneDatabase db) : super(db);
RecurringTransactionsDao(super.db);
Stream<List<RecurringTransactionDto>> recurringTransactionsStream(
Account account,

View File

@ -8190,6 +8190,15 @@ class $OkaneDatabaseManager {
mixin _$AccountsDaoMixin on DatabaseAccessor<OkaneDatabase> {
$AccountsTable get accounts => attachedDatabase.accounts;
$ExpenseCategoriesTable get expenseCategories =>
attachedDatabase.expenseCategories;
$BeneficiariesTable get beneficiaries => attachedDatabase.beneficiaries;
$TransactionsTable get transactions => attachedDatabase.transactions;
$TransactionTemplatesTable get transactionTemplates =>
attachedDatabase.transactionTemplates;
$RecurringTransactionsTable get recurringTransactions =>
attachedDatabase.recurringTransactions;
$BudgetsTable get budgets => attachedDatabase.budgets;
}
mixin _$BeneficiariesDaoMixin on DatabaseAccessor<OkaneDatabase> {
$AccountsTable get accounts => attachedDatabase.accounts;

View File

@ -27,7 +27,7 @@ Future<void> main() async {
GetIt.I.registerSingleton<CoreCubit>(CoreCubit());
GetIt.I.registerSingleton<OkaneDatabase>(OkaneDatabase());
final appRunner = () => runApp(const MyApp());
appRunner() => runApp(const MyApp());
if (settings.sentryDsn != null) {
print("Setting up Sentry!");
await SentryFlutter.init((options) {

View File

@ -46,7 +46,7 @@ class BreakdownCard extends StatelessWidget {
Map<String, double> expenses = {};
Map<String, Color> colors = {};
double usableMoney = 0;
transactions.forEach((t) {
for (var t in transactions) {
String category;
if (t.transaction.amount > 0) {
category = CATEGORY_INCOME;
@ -67,7 +67,7 @@ class BreakdownCard extends StatelessWidget {
ifAbsent: () => t.transaction.amount.abs().toDouble(),
);
usableMoney += t.transaction.amount;
});
}
return (expenses: expenses, colors: colors, usable: usableMoney);
}

View File

@ -2,7 +2,6 @@ import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:get_it/get_it.dart';
import 'package:okane/i18n/strings.g.dart';
import 'package:okane/ui/pages/account/breakdown_card.dart';
import 'package:okane/ui/state/settings.dart';
import 'package:okane/ui/utils.dart';

View File

@ -193,8 +193,7 @@ class CoreCubit extends Cubit<CoreState> {
cancelStreams();
try {
// TODO
//await db.deleteAccount(account);
await GetIt.I.get<OkaneDatabase>().accountsDao.removeAccount(account);
} finally {
emit(state.copyWith(isDeletingAccount: false));
}

View File

@ -2,7 +2,7 @@ name: okane
description: "A cross-platform finance tracker."
publish_to: "none"
version: 1.0.0+3
version: 1.0.0+5
environment:
sdk: ^3.7.0

View File

@ -1,38 +0,0 @@
import 'package:flutter_test/flutter_test.dart';
import 'package:okane/database/collections/recurrent.dart';
void main() {
group("isDue", () {
test("null value", () {
final t = RecurringTransaction()..lastExecution = null;
expect(t.isDue(DateTime.now()), true);
});
test("Date before", () {
final now = DateTime.now();
final t =
RecurringTransaction()
..lastExecution = now
..days = 30;
expect(t.isDue(now.add(Duration(days: 10))), false);
});
test("Date before warning", () {
final now = DateTime.now();
final t =
RecurringTransaction()
..lastExecution = now
..days = 30;
expect(t.isDue(now.add(Duration(days: 20))), true);
});
test("Expired", () {
final now = DateTime.now();
final t =
RecurringTransaction()
..lastExecution = now
..days = 30;
expect(t.isDue(now.add(Duration(days: 31))), true);
});
});
}