diff --git a/lib/Repositories/transaction_repository.dart b/lib/Repositories/transaction_repository.dart index dcc2a26..b4f17c6 100644 --- a/lib/Repositories/transaction_repository.dart +++ b/lib/Repositories/transaction_repository.dart @@ -50,6 +50,7 @@ class TransactionRepository { final double? amountMin, final double? amountMax, final Account? account, + final RecurringTransaction? recurringTransaction, final int? limit, final int? offset, final String? orderBy, @@ -93,6 +94,12 @@ class TransactionRepository { query.where((final t) => t.accountId.equals(account.id)); } + if (recurringTransaction != null) { + query.where( + (final t) => t.recurringTransactionId.equals(recurringTransaction.id), + ); + } + if (limit != null) { query.limit(limit, offset: offset); } diff --git a/lib/Tasks/generate_transactions_task.dart b/lib/Tasks/generate_transactions_task.dart new file mode 100644 index 0000000..8a5bd63 --- /dev/null +++ b/lib/Tasks/generate_transactions_task.dart @@ -0,0 +1,61 @@ +import 'package:drift/drift.dart'; + +import '../Entities/drift_database.dart'; +import '../Entities/time_frame_enum.dart'; +import '../Repositories/recurring_transacation_repository.dart'; +import '../Repositories/transaction_repository.dart'; +import 'task.dart'; + +/// Generiert neue Transaktionen +/// anhand der erstellten wiederkehrenden Transaktionen +class GenerateTransactionsTask extends Task { + final TransactionRepository _transactionRepository = TransactionRepository(); + final RecurringTransactionRepository _recurringTransactionRepository = + RecurringTransactionRepository(); + + @override + Future execute() async { + final List recurringTransactions = + await _recurringTransactionRepository.findBy(); + + for (final recurringTransaction in recurringTransactions) { + final List transactions = await _transactionRepository + .findBy( + recurringTransaction: recurringTransaction, + orderBy: 'dateDesc', + ); + final Transaction? transaction = transactions.firstOrNull; + + final DateTime date = (transaction != null) + ? transaction.date! + : recurringTransaction.startDate!; + final DateTime nextTransactionDate; + + switch (recurringTransaction.timeFrame) { + case TimeFrameEnum.daily: + nextTransactionDate = date.add(const Duration(days: 1)); + case TimeFrameEnum.weekly: + nextTransactionDate = date.add(const Duration(days: 7)); + case TimeFrameEnum.monthly: + nextTransactionDate = DateTime(date.year, date.month + 1, date.day); + case TimeFrameEnum.yearly: + nextTransactionDate = DateTime(date.year + 1, date.month, date.day); + } + + if (DateTime.now().compareTo(nextTransactionDate) <= 0) { + final TransactionsCompanion transaction = TransactionsCompanion( + name: Value(recurringTransaction.name), + date: Value(nextTransactionDate), + amount: Value(recurringTransaction.amount), + checked: const Value(false), + accountId: Value(recurringTransaction.accountId), + recurringTransactionId: Value(recurringTransaction.id), + ); + + await _transactionRepository.add(transaction); + } + } + + return true; + } +} diff --git a/lib/Tasks/task.dart b/lib/Tasks/task.dart new file mode 100644 index 0000000..5dd966a --- /dev/null +++ b/lib/Tasks/task.dart @@ -0,0 +1,5 @@ +/// Ein Command, welcher ausgeführt werden kann +abstract class Task { + /// Führt den Command aus + Future execute(); +}