1
0
forked from BRT/arc
arc/database/dao/AccountDAO.cpp
slava c1b34ce7d7 Implement AccountWindow and TransactionWindow for account management
Added AccountWindow to display account tables linked to devices and TransactionWindow for viewing account details. Enhanced DeviceDAO and AccountDAO to support additional filtering and data retrieval functionalities.
2025-04-22 12:22:56 +07:00

109 lines
3.7 KiB
C++

#include <QSqlQuery>
#include <QSqlError>
#include "AccountDAO.h"
#include "db/AccountInfo.h"
#include "DatabaseManager.h"
bool AccountDAO::upsertAccount(const AccountInfo &info) {
QSqlQuery query(DatabaseManager::instance().database());
query.prepare(R"(
INSERT INTO accounts (device_id, app_name, card_name, amount, update_time, status, description)
VALUES (:device_id, :app_name, :card_name, :amount, :update_time, :status, :description)
ON CONFLICT(device_id, app_name, card_name)
DO UPDATE SET
amount = excluded.amount,
update_time = excluded.update_time,
status = excluded.status
)");
query.bindValue(":device_id", info.deviceId);
query.bindValue(":app_name", info.appName);
query.bindValue(":card_name", info.cardName);
query.bindValue(":amount", info.amount);
query.bindValue(":update_time", info.updateTime.toString(Qt::ISODate));
query.bindValue(":status", info.status);
query.bindValue(":description", info.description);
if (!query.exec()) {
qWarning() << "Ошибка при вставке/обновлении account:" << query.lastError().text();
return false;
}
return true;
}
bool AccountDAO::deleteAccount(const int id) {
QSqlQuery query(DatabaseManager::instance().database());
query.prepare("DELETE FROM accounts WHERE id = :id");
query.bindValue(":id", id);
return query.exec();
}
QList<AccountInfo> AccountDAO::getAccounts(const QString &deviceId, const QString &appName) {
QList<AccountInfo> accounts;
QSqlQuery query(DatabaseManager::instance().database());
query.prepare(R"(
SELECT id, device_id, app_name, card_name, amount, update_time, status, description
FROM accounts
WHERE device_id = :device_id AND app_name = :app_name
)");
query.bindValue(":device_id", deviceId);
query.bindValue(":app_name", appName);
if (!query.exec()) {
qWarning() << "Ошибка при получении accounts:" << query.lastError().text();
return accounts;
}
while (query.next()) {
AccountInfo acc;
acc.id = query.value("id").toInt();
acc.deviceId = query.value("device_id").toString();
acc.appName = query.value("app_name").toString();
acc.cardName = query.value("card_name").toString();
acc.amount = query.value("amount").toDouble();
acc.updateTime = QDateTime::fromString(query.value("update_time").toString(), Qt::ISODate);
acc.status = query.value("status").toString();
acc.description = query.value("description").toString();
accounts.append(acc);
}
return accounts;
}
AccountInfo AccountDAO::getAccountById(const int accountId) {
AccountInfo acc;
QSqlQuery query(DatabaseManager::instance().database());
query.prepare(R"(
SELECT id, device_id, app_name, card_name, amount, update_time, status, description
FROM accounts
WHERE id = :id
LIMIT 1
)");
query.bindValue(":id", accountId);
if (!query.exec()) {
qWarning() << "Ошибка при получении account по ID:" << query.lastError().text();
return acc;
}
if (query.next()) {
acc.id = query.value("id").toInt();
acc.deviceId = query.value("device_id").toString();
acc.appName = query.value("app_name").toString();
acc.cardName = query.value("card_name").toString();
acc.amount = query.value("amount").toDouble();
acc.updateTime = QDateTime::fromString(query.value("update_time").toString(), Qt::ISODate);
acc.status = query.value("status").toString();
acc.description = query.value("description").toString();
}
return acc;
}