diff options
Diffstat (limited to 'database.cpp')
| -rw-r--r-- | database.cpp | 27 |
1 files changed, 20 insertions, 7 deletions
diff --git a/database.cpp b/database.cpp index 1610536..cc5fa7d 100644 --- a/database.cpp +++ b/database.cpp @@ -482,19 +482,31 @@ void Database::regenerateProjectionsForRule(const RecurringRule &rule) { break; } - // Check if an actual transaction already exists for this date and rule + // Generate occurrence key for this date + QString occurrenceKey; + if (rule.frequency == RecurrenceFrequency::Daily) { + occurrenceKey = currentDate.toString("yyyy-MM-dd"); + } else if (rule.frequency == RecurrenceFrequency::Weekly || rule.frequency == RecurrenceFrequency::BiWeekly) { + occurrenceKey = QString("%1-W%2").arg(currentDate.year()).arg(currentDate.weekNumber(), 2, 10, QChar('0')); + } else if (rule.frequency == RecurrenceFrequency::Monthly) { + occurrenceKey = currentDate.toString("yyyy-MM"); + } else if (rule.frequency == RecurrenceFrequency::Yearly) { + occurrenceKey = QString::number(currentDate.year()); + } + + // Check if this occurrence already has a transaction (actual or reconciled) QSqlQuery checkQuery(db); - checkQuery.prepare("SELECT COUNT(*) FROM transactions WHERE recurring_id = :rid AND date = :date AND type = 'actual'"); + checkQuery.prepare("SELECT COUNT(*) FROM transactions WHERE recurring_id = :rid AND occurrence_key = :okey AND (type = 'actual' OR reconciled = 1)"); checkQuery.bindValue(":rid", rule.id); - checkQuery.bindValue(":date", currentDate.toString(Qt::ISODate)); + checkQuery.bindValue(":okey", occurrenceKey); - bool hasActual = false; + bool hasTransaction = false; if (checkQuery.exec() && checkQuery.next()) { - hasActual = checkQuery.value(0).toInt() > 0; + hasTransaction = checkQuery.value(0).toInt() > 0; } - // Only create projection if no actual exists - if (!hasActual) { + // Only create projection if this occurrence hasn't been fulfilled + if (!hasTransaction) { Transaction t; t.date = currentDate; t.amount = rule.amount; @@ -505,6 +517,7 @@ void Database::regenerateProjectionsForRule(const RecurringRule &rule) { t.recurringId = rule.id; t.reconciled = false; t.sortOrder = rule.sortOrder; + t.occurrenceKey = occurrenceKey; addTransaction(t); } |
