Feat: Fügt einen Task zur Generierung der Transaktionen anhand der wiederkehrenden Transaktionen hinzu

This commit is contained in:
2026-01-03 14:00:20 +01:00
parent 8d291a0d39
commit 7f189ce86d
3 changed files with 73 additions and 0 deletions

View File

@@ -50,6 +50,7 @@ class TransactionRepository {
final double? amountMin, final double? amountMin,
final double? amountMax, final double? amountMax,
final Account? account, final Account? account,
final RecurringTransaction? recurringTransaction,
final int? limit, final int? limit,
final int? offset, final int? offset,
final String? orderBy, final String? orderBy,
@@ -93,6 +94,12 @@ class TransactionRepository {
query.where((final t) => t.accountId.equals(account.id)); query.where((final t) => t.accountId.equals(account.id));
} }
if (recurringTransaction != null) {
query.where(
(final t) => t.recurringTransactionId.equals(recurringTransaction.id),
);
}
if (limit != null) { if (limit != null) {
query.limit(limit, offset: offset); query.limit(limit, offset: offset);
} }

View File

@@ -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<bool> execute() async {
final List<RecurringTransaction> recurringTransactions =
await _recurringTransactionRepository.findBy();
for (final recurringTransaction in recurringTransactions) {
final List<Transaction> 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;
}
}

5
lib/Tasks/task.dart Normal file
View File

@@ -0,0 +1,5 @@
/// Ein Command, welcher ausgeführt werden kann
abstract class Task {
/// Führt den Command aus
Future<bool> execute();
}