import 'package:drift/drift.dart'; import 'package:logger/logger.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(); final Logger _logger = Logger(); @override Future execute() async { _logger.i('Generating Transactions of recurring Transactions...'); final List recurringTransactions = await _recurringTransactionRepository.findBy(); for (final recurringTransaction in recurringTransactions) { _logger.i('Generating Transactions of $recurringTransaction...'); 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) { // TODO: Nicht mit NOW, sondern Ende dieses Monats Vergleichen 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), ); _logger.i( 'Adding transaction ${transaction.name} on ${transaction.date}', ); await _transactionRepository.add(transaction); } } _logger.i('Generating transactions completed.'); return true; } }