1
0
forked from BRT/arc
arc/android/birbank/GetLastDaysHistoryBirbankScript.cpp
2025-07-27 21:01:13 +05:00

165 lines
6.6 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "GetLastDaysHistoryBirbankScript.h"
#include <QJsonObject>
#include <QRandomGenerator>
#include <QThread>
#include <utility>
#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"
GetLastDaysHistoryBirbankScript::GetLastDaysHistoryBirbankScript(
AccountInfo account,
QObject *parent
) : CommonBirbankScript(parent),
m_account(std::move(account)) {
}
GetLastDaysHistoryBirbankScript::~GetLastDaysHistoryBirbankScript() = default;
bool GetLastDaysHistoryBirbankScript::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 = TransactionType::Card;
tr.completeTime = transaction.completeTime;
tr.id = TransactionDAO::insertTransaction(tr);
if (tr.id == -1) {
return false;
}
postNewTransactionData(account, tr);
return true;
}
bool GetLastDaysHistoryBirbankScript::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 GetLastDaysHistoryBirbankScript::doStart() {
// берем все транзакции из БД
const DeviceInfo device = DeviceDAO::getDeviceById(m_account.deviceId);
const ApplicationInfo app = ApplicationDAO::getApplication(m_account.deviceId, m_account.appCode);
xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(m_account.deviceId, ++m_counter));
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("Maraqlı deyil", 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()) {
// QList<TransactionInfo> localTransactions = TransactionDAO::getTransactionsWithinHours(m_account.id, 48);
QList<AccountInfo> oldAccounts = AccountDAO::getAccounts(m_account.deviceId, m_account.appCode);
QMap<QString, AccountInfo> accountMap;
for (AccountInfo &oldAccount: oldAccounts) {
if (oldAccount.status == AccountStatus::Active) {
accountMap.insert(oldAccount.lastNumbers, oldAccount);
}
}
QList<AccountInfo> accounts = xmlScreenParser.parseAccountsInfo();
for (auto account: accounts) {
if (accountMap.contains(account.lastNumbers)) {
account.deviceId = m_account.deviceId;
account.appCode = m_account.appCode;
account.currency = accountMap[account.lastNumbers].currency;
account.description = accountMap[account.lastNumbers].description;
account.status = AccountStatus::Active;
if (!AccountDAO::upsertAccount(account)) {
m_error = "Not updated: " + account.lastNumbers;
qCritical() << m_error;
}
}
}
QList<AccountInfo> savedAccounts = AccountDAO::getAccounts(m_account.deviceId, m_account.appCode);
postAccountsData(savedAccounts);
xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(m_account.deviceId, ++m_counter));
Node cardText = xmlScreenParser.findTextNode(m_account.lastNumbers);
if (!cardText.isEmpty()) {
AdbUtils::makeTap(device.id, cardText.x(), cardText.y());
QThread::msleep(2000);
xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(m_account.deviceId, ++m_counter));
Node cardTitleText = xmlScreenParser.findTextNode(m_account.lastNumbers);
Node cardHistory = xmlScreenParser.findTextNode("История платежей");
if (!cardTitleText.isEmpty() && !cardHistory.isEmpty()) {
QList<TransactionInfo> transactions = xmlScreenParser.parsePositiveTransactions();
QList<TransactionInfo> savedTransactions = TransactionDAO::getTransactionsWithinHours(m_account.id, 48);
for (TransactionInfo &transaction: transactions) {
bool isSaved = false;
for (TransactionInfo &savedTransaction: savedTransactions) {
if (savedTransaction.amount == transaction.amount
&& savedTransaction.bankTime == transaction.bankTime) {
isSaved = true;
break;
}
}
if (!isSaved) {
if (!saveAndPostNewTransactionData(m_account, transaction, TransactionStatus::Complete)) {
qDebug() << "--- saveAndPostNewTransactionData failed";
}
}
}
} else {
m_error = "Card page not found: " + m_account.deviceId + " " + m_account.lastNumbers;
qWarning() << m_error;
emit finishedWithResult(m_error);
return;
}
} else {
m_error = "Card not found: " + m_account.deviceId + " " + m_account.lastNumbers;
qWarning() << m_error;
emit finishedWithResult(m_error);
return;
}
}
AdbUtils::goBack(m_account.deviceId);
emit finishedWithResult(m_error);
}