This update introduces support for Ziraat Bank, including scripts for retrieving transaction history, parsing account information, and performing IBAN payments. Enhancements include improved screen parsing logic, additional transaction types, and better handling of amounts and IBAN-specific operations.
161 lines
6.2 KiB
C++
161 lines
6.2 KiB
C++
#include "GetLastDaysHistoryZiraatScript.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"
|
||
|
||
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<TransactionInfo> localTransactions = TransactionDAO::getTransactionsWithinHours(m_account.id, 48);
|
||
|
||
QList<AccountInfo> accounts = xmlScreenParser.parseAccountsInfo();
|
||
for (auto &[account, node]: 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<TransactionInfo> transactions = xmlScreenParser.parseTodayAndYesterdayReportHistory();
|
||
if (!transactions.isEmpty()) {
|
||
break;
|
||
}
|
||
}
|
||
|
||
xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(m_account.deviceId, ++m_counter));
|
||
// все подтвержденные
|
||
QList<TransactionInfo> parsedTransactions = xmlScreenParser.parseTodayAndYesterdayReportHistory();
|
||
|
||
QSet<int> 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);
|
||
}
|