From 688a71c0b29a3761d7950c1c378e6cb737ae90b0 Mon Sep 17 00:00:00 2001 From: trnsmkot Date: Fri, 9 May 2025 22:44:29 +0700 Subject: [PATCH] Update transaction handling with a new history parsing script. Replaced `PayByPhoneScript` with `GetLastDaysHistoryScript` in `main.cpp`. Introduced enhanced date/time utilities and improved database timestamp handling with `DateUtils`. Refactored `TransactionDAO` methods to separate parsing logic and added support for retrieving recent transactions within specified hours. Added the `GetLastDaysHistoryScript` class to parse and save recent transaction history. --- android/rshb/GetLastDaysHistoryScript.cpp | 273 ++++++++++++++++++++++ android/rshb/GetLastDaysHistoryScript.h | 22 ++ android/rshb/PayByPhoneScript.cpp | 10 +- android/rshb/PayByPhoneScript.h | 5 +- android/rshb/ScreenXmlParser.cpp | 13 +- database/app_data.db | Bin 2621440 -> 2621440 bytes database/dao/AccountDAO.cpp | 7 +- database/dao/CommonDataDAO.cpp | 10 +- database/dao/DeviceDAO.cpp | 5 +- database/dao/TransactionDAO.cpp | 130 ++++++----- database/dao/TransactionDAO.h | 5 +- database/time/DateUtils.cpp | 25 ++ database/time/DateUtils.h | 17 ++ main.cpp | 12 +- migrations.sql | 6 +- 15 files changed, 444 insertions(+), 96 deletions(-) create mode 100644 android/rshb/GetLastDaysHistoryScript.cpp create mode 100644 android/rshb/GetLastDaysHistoryScript.h create mode 100644 database/time/DateUtils.cpp create mode 100644 database/time/DateUtils.h diff --git a/android/rshb/GetLastDaysHistoryScript.cpp b/android/rshb/GetLastDaysHistoryScript.cpp new file mode 100644 index 0000000..ac4e930 --- /dev/null +++ b/android/rshb/GetLastDaysHistoryScript.cpp @@ -0,0 +1,273 @@ +#include "GetLastDaysHistoryScript.h" + +#include +#include +#include +#include + +#include "DatabaseManager.h" +#include "adb/AdbUtils.h" +#include "dao/AccountDAO.h" +#include "dao/ApplicationDAO.h" +#include "dao/DeviceDAO.h" +#include "dao/TransactionDAO.h" +#include "db/ApplicationInfo.h" +#include "db/DeviceInfo.h" +#include "time/DateUtils.h" + +GetLastDaysHistoryScript::GetLastDaysHistoryScript( + AccountInfo account, + QObject *parent +) : CommonScript(parent), + m_account(std::move(account)) { +} + +GetLastDaysHistoryScript::~GetLastDaysHistoryScript() = default; + +QList findSavedTransaction( + const QList &transactions, + const TransactionInfo &parsed +) { + QList txs; + const QDateTime dateTime = QDateTime::fromString(parsed.bankTime, "dd.MM.yyyy"); // Московское время + + for (const TransactionInfo &info: transactions) { + QDateTime timestamp = info.timestamp; + // если тот же день + if (dateTime.date() == timestamp.date() && parsed.amount == info.amount) { + // Перевод Надежда Юрьевна К** в Альфа-Банк через СБП, по номеру телефона +79641815... + if (parsed.shortDescription.contains(info.name)) { + txs.append(info); + } + } + } + + return txs; +} + +bool isSingle(const TransactionInfo &transaction, const QList &transactions) { + int count = 0; + for (const TransactionInfo &info: transactions) { + if (info.amount == transaction.amount + && info.shortDescription == transaction.shortDescription + && info.bankTime == transaction.bankTime) { + count++; + } + } + return count == 1; +} + +QString formatPrice(const double value) { + QString sign = value < 0 ? "Минус" : "Плюс"; + const auto intValue = static_cast(std::abs(value)); // округление до целого + + QString number = QString::number(intValue); + QString formatted; + + int count = 0; + for (int i = number.length() - 1; i >= 0; --i) { + formatted.prepend(number[i]); + ++count; + if (count % 3 == 0 && i != 0) { + formatted.prepend(' '); + } + } + + return QString("%1 %2").arg(sign, formatted); +} + +bool GetLastDaysHistoryScript::openAndSaveDitailInfo(TransactionInfo &transaction, int width, int height) { + QString text = QString("%1 %2").arg(transaction.shortDescription, formatPrice(transaction.amount)); + + Node trButton = swipeToButton(m_account.deviceId, text, m_counter, width, height); + if (!trButton.isEmpty()) { + AdbUtils::makeTap(m_account.deviceId, trButton.x(), trButton.y()); + QThread::msleep(500); + + xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(m_account.deviceId, ++m_counter)); + + Node moreDetailBtn = xmlScreenParser.findButtonNode("Детали операции", false); + if (!moreDetailBtn.isEmpty()) { + AdbUtils::makeTap(m_account.deviceId, moreDetailBtn.x(), moreDetailBtn.y()); + QThread::msleep(200); + xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(m_account.deviceId, ++m_counter)); + TransactionInfo info = xmlScreenParser.parseTransactionInfoHistory(width, height); + + if (transaction.id == -1) { + info.accountId = m_account.id; + info.shortDescription = transaction.shortDescription; + info.amount = transaction.amount; + info.type = info.phone.isEmpty() ? TransactionType::Card : TransactionType::Phone; + info.updateTime = DateUtils::getUtcNow(); + if (info.status == TransactionStatus::Complete) { + info.completeTime = DateUtils::getUtcNow(); + } + if (TransactionDAO::insertTransaction(info) == -1) { + qWarning() << "--- insertTransaction failed"; + } + } else { + transaction.status = info.status; + transaction.description = info.description; + if (transaction.trExternalId.isEmpty()) { + transaction.trExternalId = info.trExternalId; + } + transaction.updateTime = DateUtils::getUtcNow(); + if (transaction.status == TransactionStatus::Complete && !transaction.completeTime.isValid()) { + transaction.completeTime = DateUtils::getUtcNow(); + } + if (!TransactionDAO::updateTransaction(transaction)) { + qWarning() << "--- updateTransaction failed"; + } + } + } + + AdbUtils::goBack(m_account.deviceId); + QThread::msleep(200); + } else { + qWarning() << "--- trButton not found.........."; + } + return false; +} + +void GetLastDaysHistoryScript::doStart() { + // берем все транзакции из БД + QList localTransactions = TransactionDAO::getTransactionsWithinHours(m_account.id, 48); + // for (const TransactionInfo& transaction: transactions) { + // qDebug().noquote().nospace() << convertTransactionToString(transaction); + // } + const DeviceInfo device = DeviceDAO::getDeviceById(m_account.deviceId); + + xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(m_account.deviceId, ++m_counter)); + if (xmlScreenParser.isHomeScreen()) { + // парсим все транзакции + if (goToAllProducts(device.id, device.screenWidth, device.screenHeight)) { + QList > accounts = xmlScreenParser.parseAccountsInfo(); + for (auto &[account, node]: accounts) { + // FIXME будем считать что числа последние везде уникальные + if (m_account.lastNumbers == account.lastNumbers) { + qDebug() << "Tap by card"; + AdbUtils::makeTap(device.id, node.x(), node.y()); + QThread::msleep(1000); + break; + } + } + + xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(m_account.deviceId, ++m_counter)); + Node filterBtn = xmlScreenParser.findButtonNode("РСХБ Онлайн", false); + if (!filterBtn.isEmpty()) { + AdbUtils::makeTap(m_account.deviceId, filterBtn.x(), filterBtn.y()); + QThread::msleep(1000); + } else { + qWarning() << "--- filterBtn not found"; + } + + xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(m_account.deviceId, ++m_counter)); + Node allTransactionFilerBtn = xmlScreenParser.findButtonNode("Все операции", false); + if (!allTransactionFilerBtn.isEmpty()) { + AdbUtils::makeTap(m_account.deviceId, allTransactionFilerBtn.x(), allTransactionFilerBtn.y()); + QThread::msleep(1000); + } else { + qWarning() << "--- allTransactionFilerBtn not found"; + } + + QList parsedTransactions; + xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(m_account.deviceId, ++m_counter)); + for (int i = 0; i < 5; ++i) { + parsedTransactions = xmlScreenParser.parseTodayAndYesterdayHistory(); + if (!parsedTransactions.empty()) { + break; + } + + QThread::msleep(1000); + xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(m_account.deviceId, ++m_counter)); + } + + + qDebug() << "--- parsedTransactions: " << parsedTransactions.length(); + // localTransactions + for (TransactionInfo &transaction: parsedTransactions) { + // если shortDescription + сумма + день и Complete совпадает и одна + bool single = isSingle(transaction, parsedTransactions); + QList txs = findSavedTransaction(localTransactions, transaction); + + if (single && txs.length() < 2) { + if (txs.length() == 1) { + // смотрим, надо ли обновление + if (txs[0].status != TransactionStatus::Complete || txs[0].shortDescription.isEmpty()) { + txs[0].shortDescription = transaction.shortDescription; + openAndSaveDitailInfo(txs[0], device.screenWidth, device.screenHeight); + } + } else { + // создаем новую + openAndSaveDitailInfo(transaction, device.screenWidth, device.screenHeight); + } + } else { + // в списке за день нашли более чем 1 одинаковых транзакций + // FIXME - что то делать если две одинаковые + } + + + + if (txs.length() == 1) { + qDebug() << "--- one transaction with same amount"; + qDebug().noquote().nospace() << convertTransactionToString(transaction); + + if (transaction.status == TransactionStatus::Complete && !transaction.shortDescription.isEmpty()) { + continue; + } + // посмотреть подробности и обновить статус и описание + } else if (txs.length() > 1) { + // FIXME - что то делать если две одинаковые + // Alert !!! + qDebug() << "--- two transactions with same amount"; + } else { + // Создаем новую, так как не найдено в БД + qDebug() << "--- new transaction"; + qDebug().noquote().nospace() << convertTransactionToString(transaction); + + // посмотреть подробности и создать + } + // qDebug() << transaction.amount; + // qDebug() << transaction.shortDescription; + // qDebug().noquote().nospace() << convertTransactionToString(transaction); + // TODO вот мы дошли до списка транзакций + + xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(m_account.deviceId, ++m_counter)); + } + // сначала обработаем + } + } else { + qDebug() << "--- home screen not found"; + } +} + +/** + amount: -250 + shortDescription: Перевод Надежда Юрьевна К** в Сбербанк через СБП, по номеру телефона +7964181514... + bankTime: 08.05.2025 + + amount: -305 + shortDescription: Перевод Надежда Юрьевна К** в Альфа-Банк через СБП, по номеру телефона +79641815... + bankTime: 08.05.2025 + + + amount: -250 + shortDescription: Перевод Надежда Юрьевна К** в Альфа-Банк через СБП, по номеру телефона +79641815... + bankTime: 07.05.2025 + + amount: -250 + shortDescription: Перевод Надежда Юрьевна К** в Сбербанк через СБП, по номеру телефона +7964181514... + bankTime: 07.05.2025 + + amount: -250 + shortDescription: Перевод Надежда Юрьевна К** в Альфа-Банк через СБП, по номеру телефона +79641815... + bankTime: 07.05.2025 + + amount: 2100 + shortDescription: Перевод через СБП от Надежда Юрьевна К (+7(964)-181-51-46) из Альфа-Банк на 4081... + bankTime: 07.05.2025 + + amount: 250 + shortDescription: Перевод через СБП от Надежда Юрьевна К (+7(964)-181-51-46) из Сбербанк на 408178... + bankTime: 07.05.2025 + */ diff --git a/android/rshb/GetLastDaysHistoryScript.h b/android/rshb/GetLastDaysHistoryScript.h new file mode 100644 index 0000000..4ab370b --- /dev/null +++ b/android/rshb/GetLastDaysHistoryScript.h @@ -0,0 +1,22 @@ +#pragma once +#include "CommonScript.h" + +class GetLastDaysHistoryScript final : public CommonScript { + Q_OBJECT + +public: + ~GetLastDaysHistoryScript() override; + + explicit GetLastDaysHistoryScript( + AccountInfo account, + QObject *parent = nullptr + ); + +protected: + void doStart() override; + +private: + const AccountInfo m_account; + + bool openAndSaveDitailInfo(TransactionInfo &transaction, int width, int height); +}; diff --git a/android/rshb/PayByPhoneScript.cpp b/android/rshb/PayByPhoneScript.cpp index ce6921e..0ae0210 100644 --- a/android/rshb/PayByPhoneScript.cpp +++ b/android/rshb/PayByPhoneScript.cpp @@ -184,7 +184,8 @@ void PayByPhoneScript::makePayment( transaction.accountId = m_account.id; transaction.amount = -m_amount; transaction.type = TransactionType::Phone; - if (bool inserted = TransactionDAO::insertTransaction(transaction); !inserted) { + transaction.id = TransactionDAO::insertTransaction(transaction); + if (transaction.id == -1) { // FIXME alert!! qDebug() << "Transaction has not inserted..."; } @@ -194,8 +195,7 @@ void PayByPhoneScript::makePayment( Node paymentCompleted = xmlScreenParser.findTextNode("Исполнен", 0, 0, width, height / 2); if (!paymentCompleted.isEmpty()) { isPaymentCompleted = true; - transaction.status = TransactionStatus::Complete; - if (!TransactionDAO::updateTransactionStatus(transaction.id, transaction.status)) { + if (!TransactionDAO::updateTransactionStatus(transaction.id, TransactionStatus::Complete)) { qDebug() << "Not updated: " << transaction.id; } // TODO обновляем данные @@ -205,10 +205,6 @@ void PayByPhoneScript::makePayment( QThread::msleep(1000); xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(deviceId, ++m_counter)); } - transaction.updateTime = QDateTime::currentDateTime(); - if (!TransactionDAO::updateTransaction(transaction)) { - qDebug() << "Not updated: " << transaction.id; - } break; } else { qWarning() << "--- moreDetailBtn not found, i: " << i; diff --git a/android/rshb/PayByPhoneScript.h b/android/rshb/PayByPhoneScript.h index 4e648da..6a9f878 100644 --- a/android/rshb/PayByPhoneScript.h +++ b/android/rshb/PayByPhoneScript.h @@ -1,11 +1,12 @@ #pragma once - #include "CommonScript.h" class PayByPhoneScript final : public CommonScript { Q_OBJECT public: + ~PayByPhoneScript() override; + PayByPhoneScript( AccountInfo account, QString phone, @@ -14,8 +15,6 @@ public: QObject *parent = nullptr ); - ~PayByPhoneScript() override; - protected: void doStart() override; diff --git a/android/rshb/ScreenXmlParser.cpp b/android/rshb/ScreenXmlParser.cpp index 79f7dd4..b8a8a64 100644 --- a/android/rshb/ScreenXmlParser.cpp +++ b/android/rshb/ScreenXmlParser.cpp @@ -8,12 +8,12 @@ #include #include #include -#include #include "adb/AdbUtils.h" #include "android/xml/Node.h" #include "db/AccountInfo.h" #include "db/TransactionInfo.h" +#include "time/DateUtils.h" ScreenXmlParser::ScreenXmlParser(QObject *parent) : QObject(parent) { } @@ -492,8 +492,7 @@ QString beforeAmount(const QString &text) { } QList ScreenXmlParser::parseTodayAndYesterdayHistory() { - QTimeZone tz("Europe/Moscow"); - QDate today = QDateTime::currentDateTime(tz).date(); + QDate today = DateUtils::getMoscowNow().date(); QDate yesterday = today.addDays(-1); QDate beforeYesterday = today.addDays(-2); @@ -519,6 +518,7 @@ QList ScreenXmlParser::parseTodayAndYesterdayHistory() { QList transactions; if (!parentNode.isNull()) { + QDate date = {}; for (QDomNode transactionNode: parentNode.childNodes()) { QString transactionShortText = transactionNode.toElement().attribute("text"); @@ -527,8 +527,6 @@ QList ScreenXmlParser::parseTodayAndYesterdayHistory() { // только сегодня и вчера парсим, позавчера не трогаем break; } - - QDate date = {}; if (titleLowerCase.startsWith(todayTitle)) { date = today; transactionShortText = transactionShortText.mid(todayTitle.length() + 1); @@ -557,8 +555,7 @@ QList ScreenXmlParser::parseTodayAndYesterdayHistory() { } void parse2daysHistory(const QDomNode &node) { - QTimeZone tz("Europe/Moscow"); - QDate today = QDateTime::currentDateTime(tz).date(); + QDate today = DateUtils::getMoscowNow().date(); QDate tomorrow = today.addDays(-1); QDate after2Days = today.addDays(-2); @@ -808,7 +805,7 @@ QList > ScreenXmlParser::parseAccountsInfo() { info.lastNumbers = match.captured(1).remove(" "); info.amount = match.captured(2).remove(" ").toFloat(); info.description = text.mid(0, text.indexOf("Номер карты")); - info.updateTime = QDateTime::currentDateTime(); + info.updateTime = DateUtils::getUtcNow(); accounts.append(qMakePair(info, node)); } diff --git a/database/app_data.db b/database/app_data.db index 64524c500b23d132a37e087a2351dacbba62aed3..fdec5d745d748b581aaa31a2b3df19676970402b 100644 GIT binary patch delta 9511 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 delta 95686 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�|(hSqX9{0~Ty#vNtLZUrzeb%)5?#BuS4PSD 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 SQ>U_Sv!8GX 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 AQ2+n{ diff --git a/database/dao/AccountDAO.cpp b/database/dao/AccountDAO.cpp index 2ee24f1..aff69a0 100644 --- a/database/dao/AccountDAO.cpp +++ b/database/dao/AccountDAO.cpp @@ -4,6 +4,7 @@ #include "db/AccountInfo.h" #include "DatabaseManager.h" +#include "time/DateUtils.h" bool AccountDAO::upsertAccount(const AccountInfo &info) { QSqlQuery query(DatabaseManager::instance().database()); @@ -24,7 +25,7 @@ bool AccountDAO::upsertAccount(const AccountInfo &info) { query.bindValue(":numbers", info.numbers); query.bindValue(":last_numbers", info.lastNumbers); query.bindValue(":amount", info.amount); - query.bindValue(":update_time", info.updateTime.toString(Qt::ISODate)); + query.bindValue(":update_time", DateUtils::toUtcString(info.updateTime)); query.bindValue(":status", accountStatusToString(info.status)); query.bindValue(":description", info.description); @@ -69,7 +70,7 @@ QList AccountDAO::getAccounts(const QString &deviceId, const QStrin acc.numbers = query.value("numbers").toString(); acc.lastNumbers = query.value("last_numbers").toString(); acc.amount = query.value("amount").toDouble(); - acc.updateTime = QDateTime::fromString(query.value("update_time").toString(), Qt::ISODate); + acc.updateTime = DateUtils::fromUtcString(query.value("update_time").toString()); acc.status = accountStatusFromString(query.value("status").toString()); acc.description = query.value("description").toString(); accounts.append(acc); @@ -86,7 +87,7 @@ AccountInfo parseAccount(const QSqlQuery &query) { acc.lastNumbers = query.value("last_numbers").toString(); acc.numbers = query.value("numbers").toString(); acc.amount = query.value("amount").toDouble(); - acc.updateTime = QDateTime::fromString(query.value("update_time").toString(), Qt::ISODate); + acc.updateTime = DateUtils::fromUtcString(query.value("update_time").toString()); acc.status = accountStatusFromString(query.value("status").toString()); acc.description = query.value("description").toString(); return acc; diff --git a/database/dao/CommonDataDAO.cpp b/database/dao/CommonDataDAO.cpp index 9287635..f68b381 100644 --- a/database/dao/CommonDataDAO.cpp +++ b/database/dao/CommonDataDAO.cpp @@ -4,6 +4,8 @@ #include #include +#include "time/DateUtils.h" + QDateTime CommonDataDAO::getLastScan() { QSqlQuery query(DatabaseManager::instance().database()); @@ -16,16 +18,16 @@ QDateTime CommonDataDAO::getLastScan() { if (query.next()) { const QString timestamp = query.value(0).toString(); - return QDateTime::fromString(timestamp, Qt::ISODate); + return DateUtils::fromUtcString(timestamp); } return {}; } -bool CommonDataDAO::updateLastScan(const QDateTime& newTime) { +bool CommonDataDAO::updateLastScan(const QDateTime &newTime) { QSqlQuery query(DatabaseManager::instance().database()); query.prepare("UPDATE common_data SET update_time = :time WHERE id = 1"); - query.bindValue(":time", newTime.toString(Qt::ISODate)); + query.bindValue(":time", DateUtils::toUtcString(newTime)); if (!query.exec()) { qWarning() << "Ошибка при обновлении lastScan:" << query.lastError().text(); @@ -35,7 +37,7 @@ bool CommonDataDAO::updateLastScan(const QDateTime& newTime) { if (query.numRowsAffected() == 0) { QSqlQuery insertQuery(DatabaseManager::instance().database()); insertQuery.prepare("INSERT INTO common_data (id, update_time) VALUES (1, :time)"); - insertQuery.bindValue(":time", newTime.toString(Qt::ISODate)); + insertQuery.bindValue(":time", DateUtils::toUtcString(newTime)); if (!insertQuery.exec()) { qWarning() << "Ошибка при INSERT lastScan:" << insertQuery.lastError().text(); diff --git a/database/dao/DeviceDAO.cpp b/database/dao/DeviceDAO.cpp index 2f61f80..69cdbe8 100644 --- a/database/dao/DeviceDAO.cpp +++ b/database/dao/DeviceDAO.cpp @@ -3,6 +3,7 @@ #include "DeviceDAO.h" #include "DatabaseManager.h" #include "db/DeviceInfo.h" +#include "time/DateUtils.h" DeviceInfo parseDevice(const QSqlQuery &query) { DeviceInfo device; @@ -13,7 +14,7 @@ DeviceInfo parseDevice(const QSqlQuery &query) { device.screenWidth = query.value("screen_width").toInt(); device.screenHeight = query.value("screen_height").toInt(); device.battery = query.value("battery").toInt(); - device.updateTime = QDateTime::fromString(query.value("update_time").toString(), Qt::ISODate); + device.updateTime = DateUtils::fromUtcString(query.value("update_time").toString()); device.image = query.value("image").toByteArray(); return device; } @@ -111,7 +112,7 @@ bool DeviceDAO::upsertDevice(const DeviceInfo &device) { query.bindValue(":width", device.screenWidth); query.bindValue(":height", device.screenHeight); query.bindValue(":battery", device.battery); - query.bindValue(":update_time", device.updateTime.toString(Qt::ISODate)); + query.bindValue(":update_time", DateUtils::toUtcString(device.updateTime)); if (!query.exec()) { qWarning() << "Ошибка при вставке/обновлении устройства:" << query.lastError().text(); diff --git a/database/dao/TransactionDAO.cpp b/database/dao/TransactionDAO.cpp index 575154c..ab1182b 100644 --- a/database/dao/TransactionDAO.cpp +++ b/database/dao/TransactionDAO.cpp @@ -5,6 +5,8 @@ #include "DatabaseManager.h" #include "TransactionDAO.h" +#include "time/DateUtils.h" + bool TransactionDAO::insertTransactionIfNotExists(const TransactionInfo &info) { QSqlQuery query(DatabaseManager::instance().database()); @@ -24,7 +26,7 @@ bool TransactionDAO::insertTransactionIfNotExists(const TransactionInfo &info) { query.bindValue(":account_id", info.accountId); query.bindValue(":amount", info.amount); query.bindValue(":type", transactionTypeToString(info.type)); - query.bindValue(":timestamp", info.timestamp.toString(Qt::ISODate)); + query.bindValue(":timestamp", DateUtils::toUtcString(info.timestamp)); if (!query.exec() || !query.next()) { qWarning() << "Ошибка при проверке существования transaction:" << query.lastError().text(); @@ -63,9 +65,8 @@ bool TransactionDAO::insertTransactionIfNotExists(const TransactionInfo &info) { query.bindValue(":bank_name", info.bankName); query.bindValue(":bank_time", info.bankTime); query.bindValue(":tr_external_id", info.trExternalId); - query.bindValue(":update_time", info.updateTime.toString(Qt::ISODate)); - query.bindValue(":complete_time", info.completeTime.toString(Qt::ISODate)); - query.bindValue(":timestamp", info.timestamp.toString(Qt::ISODate)); + query.bindValue(":update_time", DateUtils::toUtcString(info.updateTime)); + query.bindValue(":complete_time", DateUtils::toUtcString(info.completeTime)); if (!query.exec()) { qWarning() << "Ошибка при вставке transaction:" << query.lastError().text(); @@ -75,7 +76,7 @@ bool TransactionDAO::insertTransactionIfNotExists(const TransactionInfo &info) { return true; } -bool TransactionDAO::insertTransaction(const TransactionInfo &info) { +int TransactionDAO::insertTransaction(const TransactionInfo &info) { QSqlQuery query(DatabaseManager::instance().database()); query.prepare(R"( @@ -106,15 +107,15 @@ bool TransactionDAO::insertTransaction(const TransactionInfo &info) { query.bindValue(":bank_name", info.bankName); query.bindValue(":bank_time", info.bankTime); query.bindValue(":tr_external_id", info.trExternalId); - query.bindValue(":update_time", info.updateTime.toString(Qt::ISODate)); - query.bindValue(":complete_time", info.completeTime.toString(Qt::ISODate)); + query.bindValue(":update_time", DateUtils::toUtcString(info.updateTime)); + query.bindValue(":complete_time", DateUtils::toUtcString(info.completeTime)); if (!query.exec()) { qWarning() << "Ошибка при вставке transaction:" << query.lastError().text(); - return false; + return -1; } - return true; + return query.lastInsertId().toInt(); } bool TransactionDAO::deleteTransaction(const int id) { @@ -124,6 +125,31 @@ bool TransactionDAO::deleteTransaction(const int id) { return query.exec(); } + +TransactionInfo parseTransaction(const QSqlQuery &query) { + TransactionInfo tx; + tx.id = query.value("id").toInt(); + tx.accountId = query.value("account_id").toInt(); + tx.amount = query.value("amount").toDouble(); + tx.fee = query.value("fee").toDouble(); + tx.status = transactionStatusFromString(query.value("status").toString()); + tx.type = transactionTypeFromString(query.value("type").toString()); + tx.phone = query.value("phone").toString(); + tx.name = query.value("name").toString(); + tx.description = query.value("description").toString(); + tx.updatedDescription = query.value("updated_description").toString(); + tx.shortDescription = query.value("short_description").toString(); + tx.updatedShortDescription = query.value("updated_short_description").toString(); + tx.bankName = query.value("bank_name").toString(); + tx.bankTime = query.value("bank_time").toString(); + tx.trExternalId = query.value("tr_external_id").toString(); + tx.updateTime = DateUtils::fromUtcString(query.value("update_time").toString()); + tx.completeTime = DateUtils::fromUtcString(query.value("complete_time").toString()); + tx.timestamp = DateUtils::fromUtcString(query.value("timestamp").toString()); + return tx; +} + + QList TransactionDAO::getTransactions(const int accountId) { QList list; QSqlQuery query(DatabaseManager::instance().database()); @@ -142,27 +168,7 @@ QList TransactionDAO::getTransactions(const int accountId) { } 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.fee = query.value("fee").toDouble(); - tx.status = transactionStatusFromString(query.value("status").toString()); - tx.type = transactionTypeFromString(query.value("type").toString()); - tx.phone = query.value("phone").toString(); - tx.name = query.value("name").toString(); - tx.description = query.value("description").toString(); - tx.updatedDescription = query.value("updated_description").toString(); - tx.shortDescription = query.value("short_description").toString(); - tx.updatedShortDescription = query.value("updated_short_description").toString(); - tx.bankName = query.value("bank_name").toString(); - tx.bankTime = query.value("bank_time").toString(); - tx.trExternalId = query.value("tr_external_id").toString(); - tx.updateTime = QDateTime::fromString(query.value("update_time").toString(), Qt::ISODate); - tx.completeTime = QDateTime::fromString(query.value("complete_time").toString(), Qt::ISODate); - tx.timestamp = QDateTime::fromString(query.value("timestamp").toString(), Qt::ISODate); - - list.append(tx); + list.append(parseTransaction(query)); } return list; @@ -171,6 +177,8 @@ QList TransactionDAO::getTransactions(const int accountId) { bool TransactionDAO::updateTransaction(const TransactionInfo &info) { QSqlQuery query(DatabaseManager::instance().database()); + qDebug().noquote().nospace() << convertTransactionToString(info); + query.prepare(R"( UPDATE transactions SET amount = :amount, @@ -206,9 +214,9 @@ bool TransactionDAO::updateTransaction(const TransactionInfo &info) { query.bindValue(":bank_name", info.bankName); query.bindValue(":bank_time", info.bankTime); query.bindValue(":tr_external_id", info.trExternalId); - query.bindValue(":update_time", info.updateTime.toString(Qt::ISODate)); - query.bindValue(":complete_time", info.completeTime.toString(Qt::ISODate)); - query.bindValue(":timestamp", info.timestamp.toString(Qt::ISODate)); + query.bindValue(":update_time", DateUtils::toUtcString(info.updateTime)); + query.bindValue(":complete_time", DateUtils::toUtcString(info.completeTime)); + query.bindValue(":timestamp", DateUtils::toUtcString(info.timestamp)); if (!query.exec()) { qWarning() << "Ошибка при обновлении transaction:" << query.lastError().text(); @@ -232,20 +240,21 @@ bool TransactionDAO::updateTransactionStatus( WHERE id = :id )"); + // const QString currentTime = now.toString("yyyy-MM-dd HH:mm:ss"); query.bindValue(":id", id); query.bindValue(":status", transactionStatusToString(status)); - QString updateTime; + query.bindValue(":update_time", DateUtils::toUtcString(DateUtils::getUtcNow())); + if (status == TransactionStatus::Complete) { - updateTime = QDateTime::currentDateTime().toString(Qt::ISODate); + query.bindValue(":complete_time", DateUtils::toUtcString(DateUtils::getUtcNow())); + } else { + query.bindValue(":complete_time", QVariant(QMetaType(QMetaType::QString))); } - query.bindValue(":update_time", updateTime); - query.bindValue(":complete_time", QDateTime::currentDateTime().toString(Qt::ISODate)); if (!query.exec()) { qWarning() << "Ошибка при обновлении transaction:" << query.lastError().text(); return false; } - return true; } @@ -255,30 +264,31 @@ TransactionInfo TransactionDAO::getTransactionById(const int id) { query.bindValue(":id", id); - TransactionInfo tx; if (!query.exec() || !query.next()) { qWarning() << "Ошибка или не найден transaction с id:" << id << query.lastError().text(); - return tx; + return {}; + } + return parseTransaction(query); +} + +QList TransactionDAO::getTransactionsWithinHours(const int accountId, const int hours) { + QList list; + QSqlQuery query(DatabaseManager::instance().database()); + query.prepare(R"( + SELECT * FROM transactions + WHERE account_id = :accountId + AND timestamp >= datetime('now', '-' || :hours || ' hours') + )"); + query.bindValue(":accountId", accountId); + query.bindValue(":hours", hours); + + if (!query.exec()) { + qWarning() << "Ошибка получения транзакций: " << query.lastError().text(); + return {}; } - tx.id = query.value("id").toInt(); - tx.accountId = query.value("account_id").toInt(); - tx.amount = query.value("amount").toDouble(); - tx.fee = query.value("fee").toDouble(); - tx.status = transactionStatusFromString(query.value("status").toString()); - tx.type = transactionTypeFromString(query.value("type").toString()); - tx.phone = query.value("phone").toString(); - tx.name = query.value("name").toString(); - tx.description = query.value("description").toString(); - tx.shortDescription = query.value("short_description").toString(); - tx.updatedDescription = query.value("updated_description").toString(); - tx.updatedShortDescription = query.value("updated_short_description").toString(); - tx.bankName = query.value("bank_name").toString(); - tx.bankTime = query.value("bank_time").toString(); - tx.trExternalId = query.value("tr_external_id").toString(); - tx.updateTime = QDateTime::fromString(query.value("update_time").toString(), Qt::ISODate); - tx.completeTime = QDateTime::fromString(query.value("complete_time").toString(), Qt::ISODate); - tx.timestamp = QDateTime::fromString(query.value("timestamp").toString(), Qt::ISODate); - - return tx; + while (query.next()) { + list.append(parseTransaction(query)); + } + return list; } diff --git a/database/dao/TransactionDAO.h b/database/dao/TransactionDAO.h index 0a84bbb..cd805a1 100644 --- a/database/dao/TransactionDAO.h +++ b/database/dao/TransactionDAO.h @@ -1,11 +1,12 @@ #pragma once #include "db/TransactionInfo.h" +#include "rshb/GetLastDaysHistoryScript.h" class TransactionDAO { public: [[nodiscard]] static bool insertTransactionIfNotExists(const TransactionInfo &info); - [[nodiscard]] static bool insertTransaction(const TransactionInfo &info); + [[nodiscard]] static int insertTransaction(const TransactionInfo &info); [[nodiscard]] static bool deleteTransaction(int id); @@ -16,4 +17,6 @@ public: [[nodiscard]] static bool updateTransactionStatus(int id, TransactionStatus status); [[nodiscard]] static TransactionInfo getTransactionById(int id); + + [[nodiscard]] static QList getTransactionsWithinHours(int accountId, int hours); }; diff --git a/database/time/DateUtils.cpp b/database/time/DateUtils.cpp new file mode 100644 index 0000000..0c35890 --- /dev/null +++ b/database/time/DateUtils.cpp @@ -0,0 +1,25 @@ +#include "DateUtils.h" + +DateUtils::DateUtils(QObject *parent) : QObject(parent) { +} + +QDateTime DateUtils::getMoscowNow() { + const QTimeZone moscowTimeZone("Europe/Moscow"); + return QDateTime::currentDateTime().toTimeZone(moscowTimeZone); +} + +QDateTime DateUtils::getUtcNow() { + return QDateTime::currentDateTimeUtc(); +} + +QDateTime DateUtils::fromUtcString(const QString ×tamp) { + QDateTime dateTime = QDateTime::fromString(timestamp, "dd.MM.yyyy HH:mm:ss"); + if (dateTime.isValid()) { + dateTime.setTimeZone(QTimeZone::utc()); + } + return dateTime; +} + +QString DateUtils::toUtcString(const QDateTime &dateTime) { + return dateTime.toString("dd.MM.yyyy HH:mm:ss"); +} diff --git a/database/time/DateUtils.h b/database/time/DateUtils.h new file mode 100644 index 0000000..40d38c7 --- /dev/null +++ b/database/time/DateUtils.h @@ -0,0 +1,17 @@ +#pragma once +#include + +class DateUtils final : public QObject { + Q_OBJECT + +public: + explicit DateUtils(QObject *parent = nullptr); + + static QDateTime getMoscowNow(); + + static QDateTime getUtcNow(); + + static QDateTime fromUtcString(const QString ×tamp); + + static QString toUtcString(const QDateTime &dateTime); +}; diff --git a/main.cpp b/main.cpp index 7cb84e9..cbbb90e 100644 --- a/main.cpp +++ b/main.cpp @@ -15,6 +15,7 @@ #include #include +#include "rshb/GetLastDaysHistoryScript.h" #include "rshb/HomeScreenScript.h" #include "rshb/PayByPhoneScript.h" @@ -55,17 +56,18 @@ void setupScriptAutoPaymentAndThread(QCoreApplication &app) { const QString phoneNumber = "79641815146"; const QString bankName = "Альфа-Банк"; // const QString bankName = "Сбербанк"; - const double ammount = 250; + const double ammount = 310; AccountInfo account = AccountDAO::findAppAccount(appName, cardNumber); if (account.id != -1) { auto *thread = new QThread; - auto *scriptWorker = new PayByPhoneScript(account, phoneNumber, bankName, ammount); + auto *scriptWorker = new GetLastDaysHistoryScript(account); + // auto *scriptWorker = new PayByPhoneScript(account, phoneNumber, bankName, ammount); scriptWorker->moveToThread(thread); - QObject::connect(thread, &QThread::started, scriptWorker, &PayByPhoneScript::start); - QObject::connect(scriptWorker, &PayByPhoneScript::finished, thread, &QThread::quit); - QObject::connect(scriptWorker, &PayByPhoneScript::finished, scriptWorker, &QObject::deleteLater); + QObject::connect(thread, &QThread::started, scriptWorker, &GetLastDaysHistoryScript::start); + QObject::connect(scriptWorker, &GetLastDaysHistoryScript::finished, thread, &QThread::quit); + QObject::connect(scriptWorker, &GetLastDaysHistoryScript::finished, scriptWorker, &QObject::deleteLater); QObject::connect(thread, &QThread::finished, thread, &QThread::deleteLater); QObject::connect(&app, &QCoreApplication::aboutToQuit, [=]() { diff --git a/migrations.sql b/migrations.sql index 02e83db..c66c44f 100644 --- a/migrations.sql +++ b/migrations.sql @@ -8,7 +8,7 @@ CREATE TABLE IF NOT EXISTS devices screen_height INTEGER, battery INTEGER, update_time DATETIME, - timestamp DATETIME DEFAULT CURRENT_TIMESTAMP, + timestamp DATETIME DEFAULT (strftime('%d.%m.%Y %H:%M:%S', 'now')), image BLOB ); @@ -35,7 +35,7 @@ CREATE TABLE IF NOT EXISTS accounts last_numbers TEXT, description TEXT, amount REAL, - update_time DATETIME DEFAULT CURRENT_TIMESTAMP, + update_time DATETIME DEFAULT (strftime('%d.%m.%Y %H:%M:%S', 'now')), status TEXT, FOREIGN KEY (device_id) REFERENCES devices (id) ON DELETE CASCADE, UNIQUE (device_id, app_name, last_numbers) @@ -66,7 +66,7 @@ CREATE TABLE IF NOT EXISTS transactions update_time DATETIME, complete_time DATETIME, - timestamp DATETIME DEFAULT CURRENT_TIMESTAMP, + timestamp DATETIME DEFAULT (strftime('%d.%m.%Y %H:%M:%S', 'now')), FOREIGN KEY (account_id) REFERENCES accounts (id) ON DELETE CASCADE, UNIQUE (amount, timestamp) ); \ No newline at end of file