165 lines
6.6 KiB
C++
165 lines
6.6 KiB
C++
#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);
|
||
}
|