1
0
forked from BRT/arc

Add Ziraat Bank integration and refactor XML parsing

Added support for Ziraat Bank in BankSettingsWindow and parsing scripts. Refactored XML parsing code for improved readability, removing unused methods and renaming functions for consistency. Updated configuration and app data to include Ziraat Bank.
This commit is contained in:
slava 2025-06-18 18:33:11 +07:00
parent e7db943a04
commit 9c6d1bd4e5
7 changed files with 69 additions and 249 deletions

View File

@ -94,7 +94,7 @@ void GetLastDaysHistoryZiraatScript::doStart() {
QList<TransactionInfo> localTransactions = TransactionDAO::getTransactionsWithinHours(m_account.id, 48); QList<TransactionInfo> localTransactions = TransactionDAO::getTransactionsWithinHours(m_account.id, 48);
QList<AccountInfo> accounts = xmlScreenParser.parseAccountsInfo(); QList<AccountInfo> accounts = xmlScreenParser.parseAccountsInfo();
for (auto &[account, node]: accounts) { for (auto &account: accounts) {
account.deviceId = m_account.deviceId; account.deviceId = m_account.deviceId;
account.appCode = m_account.appCode; account.appCode = m_account.appCode;
if (!AccountDAO::upsertAccount(account)) { if (!AccountDAO::upsertAccount(account)) {

View File

@ -128,6 +128,7 @@ void PayByIbanScript::makePayment(const DeviceInfo &device) {
if (!searchEditText.isEmpty()) { if (!searchEditText.isEmpty()) {
AdbUtils::makeTap(device.id, searchEditText.x(), searchEditText.y()); AdbUtils::makeTap(device.id, searchEditText.x(), searchEditText.y());
QThread::msleep(500); QThread::msleep(500);
// FIXME "Individual Payment" или "Other Payments" если нет одного, то надо другой
AdbUtils::inputText(device.id, "Other Payments"); AdbUtils::inputText(device.id, "Other Payments");
QThread::msleep(1000); QThread::msleep(1000);

View File

@ -256,38 +256,7 @@ void ScreenXmlZiraatParser::parseAndSaveXml(const QString &xml) {
} }
} }
QString getDayOfWeekAsString(const int day_of_week) { QDomElement findSubElement2(const QDomElement &elem, const QString &index) {
switch (day_of_week) {
case 1: return "понедельник";
case 2: return "вторник";
case 3: return "среда";
case 4: return "четверг";
case 5: return "пятница";
case 6: return "суббота";
case 7: return "воскресенье";
default: return "";
}
}
QString getMonthAsString(const int month) {
switch (month) {
case 1: return "января";
case 2: return "февраля";
case 3: return "марта";
case 4: return "апреля";
case 5: return "мая";
case 6: return "июня";
case 7: return "июля";
case 8: return "августа";
case 9: return "сентября";
case 10: return "октября";
case 11: return "ноября";
case 12: return "декабря";
default: return "";
}
}
QDomElement findSubElement(const QDomElement &elem, const QString &index) {
if (elem.hasChildNodes()) { if (elem.hasChildNodes()) {
QDomNodeList subInfoList = elem.childNodes(); QDomNodeList subInfoList = elem.childNodes();
for (QDomNode subInfoNode: subInfoList) { for (QDomNode subInfoNode: subInfoList) {
@ -301,15 +270,15 @@ QDomElement findSubElement(const QDomElement &elem, const QString &index) {
return {}; return {};
} }
QString findSubInfo(const QDomElement &elem, const QString &index) { QString findSubInfo2(const QDomElement &elem, const QString &index) {
QDomElement subInfo = findSubElement(elem, index); QDomElement subInfo = findSubElement2(elem, index);
if (!subInfo.isNull()) { if (!subInfo.isNull()) {
return subInfo.attribute("text"); return subInfo.attribute("text");
} }
return ""; return "";
} }
bool hasTimeComponent(const QString &datetimeStr) { bool hasTimeComponent2(const QString &datetimeStr) {
QDateTime dt = QDateTime::fromString(datetimeStr, "dd.MM.yyyy HH:mm:ss"); QDateTime dt = QDateTime::fromString(datetimeStr, "dd.MM.yyyy HH:mm:ss");
if (!dt.isValid()) { if (!dt.isValid()) {
return false; // Строка не соответствует формату даты и времени return false; // Строка не соответствует формату даты и времени
@ -317,7 +286,7 @@ bool hasTimeComponent(const QString &datetimeStr) {
return dt.time() != QTime(0, 0, 0); // Проверка, что время не равно 00:00:00 return dt.time() != QTime(0, 0, 0); // Проверка, что время не равно 00:00:00
} }
QString transformBankDateTime(const QString &date) { QString transformBankDateTime2(const QString &date) {
QDateTime dt; QDateTime dt;
if (date.contains(",")) { if (date.contains(",")) {
// 10.05.2025, 15:03 // 10.05.2025, 15:03
@ -334,7 +303,7 @@ QString transformBankDateTime(const QString &date) {
return dt.toString("dd.MM.yyyy HH:mm:ss"); return dt.toString("dd.MM.yyyy HH:mm:ss");
} }
void parseTransferInfo(const QString &text, TransactionInfo &info) { void parseTransferInfo2(const QString &text, TransactionInfo &info) {
if (const auto m = reSender.match(text); m.hasMatch()) { if (const auto m = reSender.match(text); m.hasMatch()) {
info.name = m.captured(1).trimmed(); info.name = m.captured(1).trimmed();
} else if (const auto m1 = reNameAlt.match(text); m1.hasMatch()) { } else if (const auto m1 = reNameAlt.match(text); m1.hasMatch()) {
@ -364,13 +333,13 @@ void parseTransferInfo(const QString &text, TransactionInfo &info) {
if (const auto m = reDate.match(text); m.hasMatch()) { if (const auto m = reDate.match(text); m.hasMatch()) {
const QString date = m.captured(1); const QString date = m.captured(1);
// если не пустая и дата у нас с 00:00 // если не пустая и дата у нас с 00:00
// if (hasTimeComponent(date)) { // if (hasTimeComponent2(date)) {
info.bankTime = transformBankDateTime(date); info.bankTime = transformBankDateTime2(date);
// } // }
} }
} }
void traverseNodes(const QDomNode &node) { void traverseNodes2(const QDomNode &node) {
if (node.isElement()) { if (node.isElement()) {
QDomElement elem = node.toElement(); QDomElement elem = node.toElement();
@ -391,18 +360,18 @@ void traverseNodes(const QDomNode &node) {
QString index = infoElement.attribute("index"); QString index = infoElement.attribute("index");
switch (index.toInt()) { switch (index.toInt()) {
case 2: case 2:
qDebug() << "Дата операции:" << findSubInfo(infoElement, "1"); qDebug() << "Дата операции:" << findSubInfo2(infoElement, "1");
break; break;
case 5: case 5:
qDebug() << "Название:" << findSubInfo(infoElement, "1"); qDebug() << "Название:" << findSubInfo2(infoElement, "1");
qDebug() << "-------------------------------------"; qDebug() << "-------------------------------------";
// parseTransfer(findSubInfo(infoElement)); // parseTransfer(findSubInfo2(infoElement));
break; break;
case 7: case 7:
qDebug() << "Комиссия:" << findSubInfo(infoElement, "1"); qDebug() << "Комиссия:" << findSubInfo2(infoElement, "1");
break; break;
default: default:
qDebug() << "Прочее:" << findSubInfo(infoElement, "1"); qDebug() << "Прочее:" << findSubInfo2(infoElement, "1");
break; break;
} }
@ -467,12 +436,12 @@ void traverseNodes(const QDomNode &node) {
// Рекурсивно обходим всех детей // Рекурсивно обходим всех детей
QDomNode child = node.firstChild(); QDomNode child = node.firstChild();
while (!child.isNull()) { while (!child.isNull()) {
traverseNodes(child); traverseNodes2(child);
child = child.nextSibling(); child = child.nextSibling();
} }
} }
QDomNode findNode(const QDomNode &node, const QString &text) { QDomNode findNode2(const QDomNode &node, const QString &text) {
if (node.isElement()) { if (node.isElement()) {
QString nodeText = node.toElement().attribute("text"); QString nodeText = node.toElement().attribute("text");
if (nodeText.toLower().startsWith(text)) { if (nodeText.toLower().startsWith(text)) {
@ -483,7 +452,7 @@ QDomNode findNode(const QDomNode &node, const QString &text) {
QDomNode child = node.firstChild(); QDomNode child = node.firstChild();
while (!child.isNull()) { while (!child.isNull()) {
QDomNode result = findNode(child, text); QDomNode result = findNode2(child, text);
if (!result.isNull()) { if (!result.isNull()) {
return result; return result;
} }
@ -492,7 +461,7 @@ QDomNode findNode(const QDomNode &node, const QString &text) {
return {}; return {};
} }
float extractAmounts(const QString &text) { float extractAmounts2(const QString &text) {
// Разрешаем пробелы внутри чисел, захватываем "рубль", "рубля", "рублей" и т.д. // Разрешаем пробелы внутри чисел, захватываем "рубль", "рубля", "рублей" и т.д.
// QRegularExpression re(R"((Плюс|Минус)\s+([\d\s]+)\s+рубл\w*\s+(\d+)\s+копе\w*)"); // QRegularExpression re(R"((Плюс|Минус)\s+([\d\s]+)\s+рубл\w*\s+(\d+)\s+копе\w*)");
QRegularExpression re( QRegularExpression re(
@ -517,7 +486,7 @@ float extractAmounts(const QString &text) {
return 0; return 0;
} }
QString beforeAmount(const QString &text) { QString beforeAmount2(const QString &text) {
int index = text.indexOf(QRegularExpression("Плюс|Минус")); int index = text.indexOf(QRegularExpression("Плюс|Минус"));
if (index != -1) { if (index != -1) {
return text.left(index).trimmed(); return text.left(index).trimmed();
@ -525,7 +494,7 @@ QString beforeAmount(const QString &text) {
return text; // если не найдено — вернуть всю строку return text; // если не найдено — вернуть всю строку
} }
double parseAmount(const QString &amountAsString) { double parseAmount2(const QString &amountAsString) {
QString numberString = amountAsString; QString numberString = amountAsString;
numberString.remove(QRegularExpression(R"([^\очка])")); numberString.remove(QRegularExpression(R"([^\очка])"));
numberString.replace("точка", "."); numberString.replace("точка", ".");
@ -538,7 +507,7 @@ double parseAmount(const QString &amountAsString) {
return amount; return amount;
} }
QDomElement findElementWithListView(const QDomElement &parent) { QDomElement findElementWithListView2(const QDomElement &parent) {
QDomElement element = parent.firstChildElement(); QDomElement element = parent.firstChildElement();
while (!element.isNull()) { while (!element.isNull()) {
QDomElement child = element.firstChildElement(); QDomElement child = element.firstChildElement();
@ -550,7 +519,7 @@ QDomElement findElementWithListView(const QDomElement &parent) {
child = child.nextSiblingElement(); child = child.nextSiblingElement();
} }
QDomElement found = findElementWithListView(element); QDomElement found = findElementWithListView2(element);
if (!found.isNull()) { if (!found.isNull()) {
return found; return found;
} }
@ -585,7 +554,7 @@ QDateTime getUtcFromTurkey(const QString &d, const QString &m, const QString &t)
QList<TransactionInfo> ScreenXmlZiraatParser::parseTodayAndYesterdayReportHistory() { QList<TransactionInfo> ScreenXmlZiraatParser::parseTodayAndYesterdayReportHistory() {
QList<TransactionInfo> transactions; QList<TransactionInfo> transactions;
QDomElement child = findElementWithListView(m_xml); QDomElement child = findElementWithListView2(m_xml);
QDomNodeList listView = child.childNodes(); QDomNodeList listView = child.childNodes();
qDebug() << listView.count(); qDebug() << listView.count();
if (!listView.isEmpty()) { if (!listView.isEmpty()) {
@ -627,166 +596,8 @@ QList<TransactionInfo> ScreenXmlZiraatParser::parseTodayAndYesterdayReportHistor
return transactions; return transactions;
} }
QList<TransactionInfo> ScreenXmlZiraatParser::parseTodayAndYesterdayHistory() {
QDate today = DateUtils::getMoscowNow().date();
QDate yesterday = today.addDays(-1);
QDate beforeYesterday = today.addDays(-2);
TransactionInfo parseExpandedInfoHistory2(const QDomElement &root) {
QString todayTitle = QString("сегодня, %1").arg(getDayOfWeekAsString(today.dayOfWeek()));
QString yesterdayTitle = QString("вчера, %1").arg(getDayOfWeekAsString(yesterday.dayOfWeek()));
QString beforeYesterdayTitle = QString("%1 %2, %3").arg(
QString::number(beforeYesterday.day()),
getMonthAsString(beforeYesterday.month()),
getDayOfWeekAsString(beforeYesterday.dayOfWeek())
);
QDomNode todayNode = findNode(m_xml, todayTitle);
QDomNode yesterdayNode = findNode(m_xml, yesterdayTitle);
QDomNode parentNode;
if (!yesterdayNode.isNull()) {
parentNode = yesterdayNode.parentNode();
} else if (!todayNode.isNull()) {
parentNode = todayNode.parentNode();
}
QList<TransactionInfo> transactions;
if (!parentNode.isNull()) {
QDate date = {};
for (QDomNode transactionNode: parentNode.childNodes()) {
QString transactionShortText = transactionNode.toElement().attribute("text");
const QString titleLowerCase = transactionShortText.toLower();
if (titleLowerCase.startsWith(beforeYesterdayTitle)) {
// только сегодня и вчера парсим, позавчера не трогаем
break;
}
if (titleLowerCase.startsWith(todayTitle)) {
date = today;
transactionShortText = transactionShortText.mid(todayTitle.length() + 1);
}
if (titleLowerCase.startsWith(yesterdayTitle)) {
date = yesterday;
transactionShortText = transactionShortText.mid(yesterdayTitle.length() + 1);
}
if (transactionShortText.contains("ЕСПП")) {
continue;
}
float amount = extractAmounts(transactionShortText);
QString shortDesc = beforeAmount(transactionShortText);
TransactionInfo info;
info.amount = amount;
info.bankTime = date.toString("dd.MM.yyyy");
info.description = shortDesc;
transactions.append(info);
}
}
return transactions;
}
void parse2daysHistory(const QDomNode &node) {
QDate today = DateUtils::getMoscowNow().date();
QDate tomorrow = today.addDays(-1);
QDate after2Days = today.addDays(-2);
QString todayTitle = QString("сегодня, %1").arg(getDayOfWeekAsString(today.dayOfWeek()));
QDomNode todayNode = findNode(node, todayTitle);
if (todayNode.isNull()) {
} else {
qDebug() << "todayNode: " << todayNode.toElement().attribute("text");
}
QString tomorrowTitle = QString("вчера, %1").arg(getDayOfWeekAsString(tomorrow.dayOfWeek()));
QDomNode tomorrowNode = findNode(node, tomorrowTitle);
if (tomorrowNode.isNull()) {
} else {
qDebug() << "tomorrowNode: " << tomorrowNode.toElement().attribute("text");
}
// 30 апреля, Среда
QString after2DaysTitle = QString("%1 %2, %3").arg(
QString::number(after2Days.day()),
getMonthAsString(after2Days.month()),
getDayOfWeekAsString(after2Days.dayOfWeek()));
QDomNode after2DaysNode = findNode(node, after2DaysTitle);
if (after2DaysNode.isNull()) {
qDebug() << "No after2DaysNode";
} else {
qDebug() << "after2DaysNode: " << after2DaysNode.toElement().attribute("text");
}
QDomNode parentNode;
if (!todayNode.isNull() || !tomorrowNode.isNull() || !after2DaysNode.isNull()) {
if (!todayNode.isNull()) {
parentNode = todayNode.parentNode();
}
if (!tomorrowNode.isNull()) {
parentNode = tomorrowNode.parentNode();
}
if (!after2DaysNode.isNull()) {
parentNode = after2DaysNode.parentNode();
}
}
if (!parentNode.isNull()) {
for (QDomNode child_node: parentNode.childNodes()) {
QString child_text = child_node.toElement().attribute("text");
if (child_text.toLower().startsWith(todayTitle)) {
qDebug() << "=== Today: " << todayTitle;
qDebug() << "node: " << beforeAmount(child_text.mid(todayTitle.length() + 1));
qDebug() << "--> sum: " << QString::number(extractAmounts(child_text), 'f', 2);
// qDebug() << "";
continue;
}
if (child_text.toLower().startsWith(tomorrowTitle)) {
qDebug() << "=== Yesterday: " << todayTitle;
qDebug() << "node: " << beforeAmount(child_text.mid(tomorrowTitle.length() + 1));
qDebug() << "--> sum: " << QString::number(extractAmounts(child_text), 'f', 2);
// qDebug() << "";
continue;
}
if (child_text.toLower().startsWith(after2DaysTitle)) {
qDebug() << "=== Before yesterday: " << todayTitle;
qDebug() << "node: " << beforeAmount(child_text.mid(after2DaysTitle.length() + 1));
qDebug() << "--> sum: " << QString::number(extractAmounts(child_text), 'f', 2);
// qDebug() << "";
continue;
}
qDebug() << "node: " << beforeAmount(child_node.toElement().attribute("text"));
qDebug() << "--> sum: " <<
QString::number(extractAmounts(child_node.toElement().attribute("text")), 'f', 2);
// qDebug() << "";
}
}
// QString d = today.day() > 9 ? QString::number(today.day()) : "0" + QString::number(today.day());
// QString m = today.month() > 9 ? QString::number(today.month()) : "0" + QString::number(today.month());
// QString y = QString::number(today.year());
// QString w = getDayOfWeekAsString(today.dayOfWeek());
// QString mm = getMonthAsString(today.month());
// qDebug() << "Date:" << d << m << y << w << mm;
// QString d2 = after2Days.day() > 9 ? QString::number(after2Days.day()) : "0" + QString::number(after2Days.day());
// QString m2 = after2Days.month() > 9
// ? QString::number(after2Days.month())
// : "0" + QString::number(after2Days.month());
// QString y2 = QString::number(after2Days.year());
// QString w2 = getDayOfWeekAsString(after2Days.dayOfWeek());
// QString mm2 = getMonthAsString(after2Days.month());
// qDebug() << "Date:" << d2 << m2 << y2 << w2 << mm2;
}
TransactionInfo parseExpandedInfoHistory(const QDomElement &root) {
if (root.isElement()) { if (root.isElement()) {
QDomElement elem = root.toElement(); QDomElement elem = root.toElement();
if (elem.tagName() == "node" if (elem.tagName() == "node"
@ -804,18 +615,18 @@ TransactionInfo parseExpandedInfoHistory(const QDomElement &root) {
switch (QDomElement e = info.toElement(); e.attribute("index").toInt()) { switch (QDomElement e = info.toElement(); e.attribute("index").toInt()) {
case 2: case 2:
// Дата операции // Дата операции
transaction.bankTime = transformBankDateTime(findSubInfo(e, "1")); transaction.bankTime = transformBankDateTime2(findSubInfo2(e, "1"));
break; break;
case 5: case 5:
transaction.description = findSubInfo(e, "1"); transaction.description = findSubInfo2(e, "1");
parseTransferInfo(transaction.description, transaction); parseTransferInfo2(transaction.description, transaction);
break; break;
case 7: case 7:
// Комиссия // Комиссия
transaction.fee = findSubInfo(e, "1").remove(onlyDigitsRegex).toFloat(); transaction.fee = findSubInfo2(e, "1").remove(onlyDigitsRegex).toFloat();
break; break;
default: default:
// qDebug() << "Прочее:" << findSubInfo(e); // qDebug() << "Прочее:" << findSubInfo2(e);
break; break;
} }
} }
@ -826,7 +637,7 @@ TransactionInfo parseExpandedInfoHistory(const QDomElement &root) {
// Рекурсивно обходим всех детей // Рекурсивно обходим всех детей
QDomNode child = root.firstChild(); QDomNode child = root.firstChild();
while (!child.isNull()) { while (!child.isNull()) {
if (TransactionInfo info = parseExpandedInfoHistory(child.toElement()); !info.bankTime.isEmpty()) { if (TransactionInfo info = parseExpandedInfoHistory2(child.toElement()); !info.bankTime.isEmpty()) {
return info; return info;
} }
child = child.nextSibling(); child = child.nextSibling();
@ -837,7 +648,7 @@ TransactionInfo parseExpandedInfoHistory(const QDomElement &root) {
TransactionInfo ScreenXmlZiraatParser::parseTransactionInfoHistory(int screenWidth, int screenHeight) { TransactionInfo ScreenXmlZiraatParser::parseTransactionInfoHistory(int screenWidth, int screenHeight) {
// 1. Распарсить описание транзакции // 1. Распарсить описание транзакции
TransactionInfo transaction = parseExpandedInfoHistory(m_xml); TransactionInfo transaction = parseExpandedInfoHistory2(m_xml);
// 1. Найти статус: Исполнен | Операция исполнена // 1. Найти статус: Исполнен | Операция исполнена
transaction.status = TransactionStatus::Wait; transaction.status = TransactionStatus::Wait;
Node status1 = findTextNode("Исполнен", 0, 0, screenWidth, screenHeight / 2); Node status1 = findTextNode("Исполнен", 0, 0, screenWidth, screenHeight / 2);
@ -848,7 +659,7 @@ TransactionInfo ScreenXmlZiraatParser::parseTransactionInfoHistory(int screenWid
return transaction; return transaction;
} }
TransactionInfo parseExpandedInfo(const QDomElement &root) { TransactionInfo parseExpandedInfo2(const QDomElement &root) {
if (root.isElement()) { if (root.isElement()) {
QDomElement elem = root.toElement(); QDomElement elem = root.toElement();
if (elem.tagName() == "node" if (elem.tagName() == "node"
@ -868,25 +679,25 @@ TransactionInfo parseExpandedInfo(const QDomElement &root) {
QDomElement ee; QDomElement ee;
switch (index.toInt()) { switch (index.toInt()) {
case 3: case 3:
transaction.bankTime = transformBankDateTime(findSubInfo(infoElement, "1")); transaction.bankTime = transformBankDateTime2(findSubInfo2(infoElement, "1"));
break; break;
case 4: case 4:
ee = findSubElement(infoElement, "0"); ee = findSubElement2(infoElement, "0");
ee = findSubElement(ee, "1"); ee = findSubElement2(ee, "1");
transaction.phone = findSubInfo(ee, "0").remove(onlyDigitsRegex); transaction.phone = findSubInfo2(ee, "0").remove(onlyDigitsRegex);
break; break;
case 5: case 5:
transaction.name = findSubInfo(infoElement, "1"); transaction.name = findSubInfo2(infoElement, "1");
break; break;
case 6: case 6:
transaction.bankName = findSubInfo(infoElement, "1"); transaction.bankName = findSubInfo2(infoElement, "1");
break; break;
case 9: case 9:
transaction.fee = findSubInfo(infoElement, "1").remove(onlyDigitsAndDotRegex).toFloat(); transaction.fee = findSubInfo2(infoElement, "1").remove(onlyDigitsAndDotRegex).toFloat();
break; break;
case 10: case 10:
ee = findSubElement(infoElement, "1"); ee = findSubElement2(infoElement, "1");
transaction.bankTrExternalId = findSubInfo(ee, "1"); transaction.bankTrExternalId = findSubInfo2(ee, "1");
break; break;
default: default:
break; break;
@ -899,7 +710,7 @@ TransactionInfo parseExpandedInfo(const QDomElement &root) {
// Рекурсивно обходим всех детей // Рекурсивно обходим всех детей
QDomNode child = root.firstChild(); QDomNode child = root.firstChild();
while (!child.isNull()) { while (!child.isNull()) {
if (TransactionInfo info = parseExpandedInfo(child.toElement()); !info.bankTime.isEmpty()) { if (TransactionInfo info = parseExpandedInfo2(child.toElement()); !info.bankTime.isEmpty()) {
return info; return info;
} }
child = child.nextSibling(); child = child.nextSibling();
@ -910,7 +721,7 @@ TransactionInfo parseExpandedInfo(const QDomElement &root) {
TransactionInfo ScreenXmlZiraatParser::parseTransactionInfo(int screenWidth, int screenHeight) { TransactionInfo ScreenXmlZiraatParser::parseTransactionInfo(int screenWidth, int screenHeight) {
// 1. Распарсить описание транзакции // 1. Распарсить описание транзакции
TransactionInfo transaction = parseExpandedInfo(m_xml); TransactionInfo transaction = parseExpandedInfo2(m_xml);
// 1. Найти статус: Исполнен | Операция исполнена // 1. Найти статус: Исполнен | Операция исполнена
transaction.status = TransactionStatus::Wait; transaction.status = TransactionStatus::Wait;
Node status1 = findTextNode("Исполнен", 0, 0, screenWidth, screenHeight / 2); Node status1 = findTextNode("Исполнен", 0, 0, screenWidth, screenHeight / 2);
@ -928,9 +739,7 @@ QList<AccountInfo> ScreenXmlZiraatParser::parseAccountsInfo() {
for (int i = 0; i < nodes.count(); ++i) { for (int i = 0; i < nodes.count(); ++i) {
const QDomElement el = nodes.at(i).toElement(); const QDomElement el = nodes.at(i).toElement();
if (el.attribute("resource-id") == "com.ziraat.ziraatmobil:id/text_account_or_bank_name" && if (el.attribute("resource-id") == "com.ziraat.ziraatmobil:id/text_account_or_bank_name") {
el.attribute("text").startsWith("LEVENT")
) {
// Нашли нужный аккаунт // Нашли нужный аккаунт
const QDomElement parent = el.parentNode().toElement(); // account_name_layout const QDomElement parent = el.parentNode().toElement(); // account_name_layout
const QDomElement balanceFrame = parent.parentNode().parentNode().lastChildElement("node"); const QDomElement balanceFrame = parent.parentNode().parentNode().lastChildElement("node");
@ -943,7 +752,7 @@ QList<AccountInfo> ScreenXmlZiraatParser::parseAccountsInfo() {
QString account = el.attribute("text"); QString account = el.attribute("text");
AccountInfo info; AccountInfo info;
info.lastNumbers = account.split("-").last().trimmed(); info.lastNumbers = account;
info.amount = amount.toFloat(); info.amount = amount.toFloat();
info.description = account; info.description = account;
info.updateTime = DateUtils::getUtcNow(); info.updateTime = DateUtils::getUtcNow();

View File

@ -44,9 +44,6 @@ public:
QList<TransactionInfo> parseTodayAndYesterdayReportHistory(); QList<TransactionInfo> parseTodayAndYesterdayReportHistory();
QList<TransactionInfo> parseTodayAndYesterdayHistory();
QList<AccountInfo> parseAccountsInfo(); QList<AccountInfo> parseAccountsInfo();
void test(); void test();

View File

@ -2,7 +2,7 @@
varsion=0.0.1 varsion=0.0.1
[apps] [apps]
list=rshb, alfabank, santanderbank list=rshb, alfabank, santanderbank, ziraat
[rshb] [rshb]
name=Росcельхозбанк name=Росcельхозбанк

Binary file not shown.

View File

@ -22,6 +22,7 @@
#include "net/NetworkService.h" #include "net/NetworkService.h"
#include "rshb/LoginAndCheckAccountsScript.h" #include "rshb/LoginAndCheckAccountsScript.h"
#include "widget/common/CollapsibleSection.h" #include "widget/common/CollapsibleSection.h"
#include "ziraat/LoginAndCheckAccountsZiraatScript.h"
QTableWidgetItem *BankSettingsWindow::createTableWidget(const QString &text) { QTableWidgetItem *BankSettingsWindow::createTableWidget(const QString &text) {
QTableWidgetItem *item = new QTableWidgetItem(text); QTableWidgetItem *item = new QTableWidgetItem(text);
@ -46,15 +47,27 @@ QString parseStatus(const ApplicationInfo &app) {
} }
void BankSettingsWindow::startCheckPinCode(const QString &appCode) { void BankSettingsWindow::startCheckPinCode(const QString &appCode) {
const auto thread = new QThread(nullptr); if (appCode == "rshb") {
auto *worker = new LoginAndCheckAccountsScript(m_deviceId, appCode, nullptr); const auto thread = new QThread(nullptr);
auto *worker = new LoginAndCheckAccountsScript(m_deviceId, appCode, nullptr);
worker->moveToThread(thread); worker->moveToThread(thread);
connect(thread, &QThread::started, worker, &LoginAndCheckAccountsScript::start); connect(thread, &QThread::started, worker, &LoginAndCheckAccountsScript::start);
connect(worker, &LoginAndCheckAccountsScript::finished, thread, &QThread::quit); connect(worker, &LoginAndCheckAccountsScript::finished, thread, &QThread::quit);
connect(worker, &LoginAndCheckAccountsScript::finished, worker, &QObject::deleteLater); connect(worker, &LoginAndCheckAccountsScript::finished, worker, &QObject::deleteLater);
connect(thread, &QThread::finished, thread, &QObject::deleteLater); connect(thread, &QThread::finished, thread, &QObject::deleteLater);
thread->start(); thread->start();
} else if (appCode == "ziraat") {
const auto thread = new QThread(nullptr);
auto *worker = new LoginAndCheckAccountsZiraatScript(m_deviceId, appCode, nullptr);
worker->moveToThread(thread);
connect(thread, &QThread::started, worker, &LoginAndCheckAccountsZiraatScript::start);
connect(worker, &LoginAndCheckAccountsZiraatScript::finished, thread, &QThread::quit);
connect(worker, &LoginAndCheckAccountsZiraatScript::finished, worker, &QObject::deleteLater);
connect(thread, &QThread::finished, thread, &QObject::deleteLater);
thread->start();
}
} }
void sendAppStatus(const QString &deviceId, const QString &code, const QString &status) { void sendAppStatus(const QString &deviceId, const QString &code, const QString &status) {