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; } }