aboutsummaryrefslogtreecommitdiff
path: root/database.cpp
diff options
context:
space:
mode:
authorCalvin Morrison <calvin@pobox.com>2025-12-31 13:46:44 -0500
committerCalvin Morrison <calvin@pobox.com>2025-12-31 13:46:44 -0500
commita6e05ddd0add4500877ceb2df69ea3e0d5ca9b15 (patch)
tree0c1f788b943cb26b9ec13bf77312061fa27cf72e /database.cpp
parent5cf763ea3ba2a89acfa5f24422cc71e0ff7fb35b (diff)
Fix estimated transaction edit persistence - keep recurring link and set reconciled flag
Diffstat (limited to 'database.cpp')
-rw-r--r--database.cpp27
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);
}