#include "GetLastDaysHistoryZiraatScript.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/DeviceInfo.h" #include "net/NetworkService.h" #include "time/DateUtils.h" GetLastDaysHistoryZiraatScript::GetLastDaysHistoryZiraatScript( AccountInfo account, QObject *parent ) : CommonZiraatScript(parent), m_account(std::move(account)) { } GetLastDaysHistoryZiraatScript::~GetLastDaysHistoryZiraatScript() = default; bool GetLastDaysHistoryZiraatScript::saveAndPostNewTransactionData( const AccountInfo &account, const TransactionInfo &transaction, const TransactionStatus &status ) { TransactionInfo tr; tr.accountId = account.id; tr.description = transaction.description; tr.bankTime = transaction.bankTime; tr.bankName = transaction.bankName; tr.amount = transaction.amount; tr.phone = transaction.phone; tr.updateTime = DateUtils::getUtcNow(); tr.fee = transaction.fee; tr.name = transaction.name; tr.bankTrExternalId = transaction.bankTrExternalId; tr.status = status; tr.type = transaction.description.startsWith("Перевод") ? TransactionType::Phone : TransactionType::Card; tr.completeTime = DateUtils::getUtcNow(); tr.id = TransactionDAO::insertTransaction(tr); if (tr.id == -1) { return false; } postNewTransactionData(account, tr); return true; } bool GetLastDaysHistoryZiraatScript::updateAndPostTransactionData( const AccountInfo &account, const int transactionId, const TransactionStatus status, const QString &oldDesc, const QString &newDesc ) { if (TransactionDAO::updateTransaction(transactionId, status, oldDesc, newDesc)) { updateTransactionData(account, transactionId, status, oldDesc, newDesc); return true; } return false; } void GetLastDaysHistoryZiraatScript::doStart() { // берем все транзакции из БД const DeviceInfo device = DeviceDAO::getDeviceById(m_account.deviceId); const ApplicationInfo app = ApplicationDAO::getApplication(m_account.deviceId, m_account.appCode); if (!xmlScreenParser.isHomeScreen()) { if (!runAppAndGoToHomeScreen(device.id, app.package, app.pinCode, device.screenWidth, device.screenHeight)) { m_error = "Не смогли дойти до домашней страницы"; qCritical() << m_error; emit finishedWithResult(m_error); return; } } xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(m_account.deviceId, ++m_counter)); Node closeBannerNode = xmlScreenParser.findButtonNode("HAYIR", false); if (!closeBannerNode.isEmpty()) { AdbUtils::makeTap(device.id, closeBannerNode.x(), closeBannerNode.y()); QThread::msleep(1000); xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(m_account.deviceId, ++m_counter)); } if (xmlScreenParser.isHomeScreen()) { if (goToAllProducts(device.id, device.screenWidth, device.screenHeight)) { QList localTransactions = TransactionDAO::getTransactionsWithinHours(m_account.id, 48); QList accounts = xmlScreenParser.parseAccountsInfo(); for (auto &account: accounts) { account.deviceId = m_account.deviceId; account.appCode = m_account.appCode; if (!AccountDAO::upsertAccount(account)) { qDebug() << "Not updated: " << account.lastNumbers; } } postAccountsData(accounts); AdbUtils::goBack(device.id); QThread::msleep(500); xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(m_account.deviceId, ++m_counter)); Node actionBtn = xmlScreenParser.findButtonNode("Account Activities", false); if (!actionBtn.isEmpty()) { AdbUtils::makeTap(m_account.deviceId, actionBtn.x(), actionBtn.y()); QThread::msleep(1000); } else { m_error = "Account Activities btn not found"; qCritical() << m_error; emit finishedWithResult(m_error); return; } // localTransactions // FIXME доделать так, чтобы свайпать и брать больше чем 5 транзакций for (int i = 0; i < 5; ++i) { xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(m_account.deviceId, ++m_counter)); QList transactions = xmlScreenParser.parseTodayAndYesterdayReportHistory(); if (!transactions.isEmpty()) { break; } } xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(m_account.deviceId, ++m_counter)); // все подтвержденные QList parsedTransactions = xmlScreenParser.parseTodayAndYesterdayReportHistory(); QSet parsedTransactionIds; for (const TransactionInfo &transaction: parsedTransactions) { for (const TransactionInfo &saved: localTransactions) { if (parsedTransactionIds.contains(saved.id)) { continue; } if (transaction.bankTime == saved.bankTime && transaction.amount == saved.amount) { parsedTransactionIds.insert(saved.id); continue; } if (!saveAndPostNewTransactionData(m_account, transaction, TransactionStatus::Complete)) { qDebug() << "--- saveAndPostNewTransactionData failed"; } } } } } else { m_error = "GetLastDaysHistoryZiraatScript - home screen not found"; qWarning() << m_error; emit finishedWithResult(m_error); } AdbUtils::goBack(m_account.deviceId); emit finishedWithResult(m_error); }