1
0
forked from BRT/arc
arc/database/dao/EventDAO.cpp
trnsmkot e32dd21827 Add event handling and improved account management
Introduced a new "events" table and corresponding EventDAO for managing event data. Enhanced account handling with device ID and partial card number support. Added a NetworkService method to fetch payments from an API and store them as events.
2025-05-21 20:18:53 +07:00

109 lines
3.5 KiB
C++

#include "EventDAO.h"
#include <QSqlError>
#include <QSqlQuery>
#include "DatabaseManager.h"
#include "time/DateUtils.h"
EventInfo parseEvent(const QSqlQuery &query) {
EventInfo event;
event.id = query.value("id").toInt();
event.status = eventStatusFromString(query.value("status").toString());
event.externalId = query.value("external_id").toInt();
event.accountId = query.value("account_id").toInt();
event.amount = query.value("amount").toDouble();
event.phone = query.value("phone").toString();
event.bankName = query.value("bank_name").toString();
event.timestamp = DateUtils::fromUtcString(query.value("timestamp").toString());
event.updateTime = DateUtils::fromUtcString(query.value("update_time").toString());
event.completeTime = DateUtils::fromUtcString(query.value("complete_time").toString());
return event;
}
int EventDAO::insertEvent(const EventInfo &event) {
QSqlQuery query(DatabaseManager::instance().database());
query.prepare(R"(
INSERT INTO events (
status, external_id, account_id, amount, phone, bank_name, timestamp
) VALUES (
:status, :external_id, :account_id, :amount, :phone, :bank_name, :timestamp
)
)");
query.bindValue(":status", eventStatusToString(event.status));
query.bindValue(":external_id", event.externalId);
query.bindValue(":account_id", event.accountId);
query.bindValue(":amount", event.amount);
query.bindValue(":phone", event.phone);
query.bindValue(":bank_name", event.bankName);
query.bindValue(":timestamp", DateUtils::toUtcString(DateUtils::getUtcNow()));
if (!query.exec()) {
qWarning() << "Ошибка при вставке event:" << query.lastError().text();
return -1;
}
return query.lastInsertId().toInt();
}
bool EventDAO::updateEvent(
const int id,
const EventStatus &status
) {
QSqlQuery query(DatabaseManager::instance().database());
query.prepare(R"(
UPDATE events SET
status = :status,
update_time = :update_time,
complete_time = :complete_time
WHERE id = :id
)");
query.bindValue(":id", id);
query.bindValue(":status", eventStatusToString(status));
if (status == EventStatus::Wait) {
query.bindValue(":update_time", DateUtils::toUtcString(DateUtils::getUtcNow()));
} else {
query.bindValue(":update_time", QVariant(QMetaType(QMetaType::QString)));
}
if (status == EventStatus::Complete) {
query.bindValue(":complete_time", DateUtils::toUtcString(DateUtils::getUtcNow()));
} else {
query.bindValue(":complete_time", QVariant(QMetaType(QMetaType::QString)));
}
if (!query.exec()) {
qWarning() << "Ошибка при обновлении event:" << query.lastError().text();
return false;
}
return true;
}
QList<EventInfo> EventDAO::getAllEvents(const EventStatus &status) {
QList<EventInfo> events;
QSqlQuery query(DatabaseManager::instance().database());
query.prepare(R"(
SELECT id, account_id, external_id, amount, phone, bank_name, status, update_time, complete_time, timestamp
FROM events
WHERE status = :status
)");
query.bindValue(":status", eventStatusToString(status));
if (!query.exec()) {
qWarning() << "Ошибка при получении списка устройств:" << query.lastError().text();
return events;
}
while (query.next()) {
events.append(parseEvent(query));
}
return events;
}