1
0
forked from BRT/arc
arc/database/dao/TransactionDAO.cpp
slava d21e7f4048 Add database schema and DAO implementation for accounts and transactions
Introduced tables for devices, accounts, and transactions in the schema, along with associated models. Implemented DAO methods for CRUD operations, including upsert functionality for accounts and deduplication for transactions. These changes enable structured management of account and transaction data.
2025-04-21 12:01:24 +07:00

83 lines
2.6 KiB
C++

#include <QSqlQuery>
#include <QSqlError>
#include "DatabaseManager.h"
#include "TransactionDAO.h"
bool TransactionDAO::insertTransactionIfNotExists(const TransactionInfo &info) {
QSqlQuery query(DatabaseManager::instance().database());
query.prepare(R"(
SELECT COUNT(*) FROM transactions
WHERE account_id = :account_id AND amount = :amount AND timestamp = :timestamp
)");
query.bindValue(":account_id", info.accountId);
query.bindValue(":amount", info.amount);
query.bindValue(":timestamp", info.timestamp.toString(Qt::ISODate));
if (!query.exec() || !query.next()) {
qWarning() << "Ошибка при проверке существования transaction:" << query.lastError().text();
return false;
}
if (query.value(0).toInt() > 0) {
return false; // Уже существует
}
query.prepare(R"(
INSERT INTO transactions (account_id, amount, description, timestamp)
VALUES (:account_id, :amount, :description, :timestamp)
)");
query.bindValue(":account_id", info.accountId);
query.bindValue(":amount", info.amount);
query.bindValue(":description", info.description);
query.bindValue(":timestamp", info.timestamp.toString(Qt::ISODate));
if (!query.exec()) {
qWarning() << "Ошибка при вставке transaction:" << query.lastError().text();
return false;
}
return true;
}
bool TransactionDAO::deleteTransaction(const int id) {
QSqlQuery query(DatabaseManager::instance().database());
query.prepare("DELETE FROM transactions WHERE id = :id");
query.bindValue(":id", id);
return query.exec();
}
QList<TransactionInfo> TransactionDAO::getTransactions(const int accountId) {
QList<TransactionInfo> list;
QSqlQuery query(DatabaseManager::instance().database());
query.prepare(R"(
SELECT id, account_id, amount, description, timestamp
FROM transactions
WHERE account_id = :account_id
ORDER BY timestamp DESC
)");
query.bindValue(":account_id", accountId);
if (!query.exec()) {
qWarning() << "Ошибка при получении transactions:" << query.lastError().text();
return list;
}
while (query.next()) {
TransactionInfo tx;
tx.id = query.value("id").toInt();
tx.accountId = query.value("account_id").toInt();
tx.amount = query.value("amount").toDouble();
tx.description = query.value("description").toString();
tx.timestamp = QDateTime::fromString(query.value("timestamp").toString(), Qt::ISODate);
list.append(tx);
}
return list;
}