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:
parent
e7db943a04
commit
9c6d1bd4e5
@ -94,7 +94,7 @@ void GetLastDaysHistoryZiraatScript::doStart() {
|
||||
QList<TransactionInfo> localTransactions = TransactionDAO::getTransactionsWithinHours(m_account.id, 48);
|
||||
|
||||
QList<AccountInfo> accounts = xmlScreenParser.parseAccountsInfo();
|
||||
for (auto &[account, node]: accounts) {
|
||||
for (auto &account: accounts) {
|
||||
account.deviceId = m_account.deviceId;
|
||||
account.appCode = m_account.appCode;
|
||||
if (!AccountDAO::upsertAccount(account)) {
|
||||
|
||||
@ -128,6 +128,7 @@ void PayByIbanScript::makePayment(const DeviceInfo &device) {
|
||||
if (!searchEditText.isEmpty()) {
|
||||
AdbUtils::makeTap(device.id, searchEditText.x(), searchEditText.y());
|
||||
QThread::msleep(500);
|
||||
// FIXME "Individual Payment" или "Other Payments" если нет одного, то надо другой
|
||||
AdbUtils::inputText(device.id, "Other Payments");
|
||||
QThread::msleep(1000);
|
||||
|
||||
|
||||
@ -256,38 +256,7 @@ void ScreenXmlZiraatParser::parseAndSaveXml(const QString &xml) {
|
||||
}
|
||||
}
|
||||
|
||||
QString getDayOfWeekAsString(const int day_of_week) {
|
||||
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) {
|
||||
QDomElement findSubElement2(const QDomElement &elem, const QString &index) {
|
||||
if (elem.hasChildNodes()) {
|
||||
QDomNodeList subInfoList = elem.childNodes();
|
||||
for (QDomNode subInfoNode: subInfoList) {
|
||||
@ -301,15 +270,15 @@ QDomElement findSubElement(const QDomElement &elem, const QString &index) {
|
||||
return {};
|
||||
}
|
||||
|
||||
QString findSubInfo(const QDomElement &elem, const QString &index) {
|
||||
QDomElement subInfo = findSubElement(elem, index);
|
||||
QString findSubInfo2(const QDomElement &elem, const QString &index) {
|
||||
QDomElement subInfo = findSubElement2(elem, index);
|
||||
if (!subInfo.isNull()) {
|
||||
return subInfo.attribute("text");
|
||||
}
|
||||
return "";
|
||||
}
|
||||
|
||||
bool hasTimeComponent(const QString &datetimeStr) {
|
||||
bool hasTimeComponent2(const QString &datetimeStr) {
|
||||
QDateTime dt = QDateTime::fromString(datetimeStr, "dd.MM.yyyy HH:mm:ss");
|
||||
if (!dt.isValid()) {
|
||||
return false; // Строка не соответствует формату даты и времени
|
||||
@ -317,7 +286,7 @@ bool hasTimeComponent(const QString &datetimeStr) {
|
||||
return dt.time() != QTime(0, 0, 0); // Проверка, что время не равно 00:00:00
|
||||
}
|
||||
|
||||
QString transformBankDateTime(const QString &date) {
|
||||
QString transformBankDateTime2(const QString &date) {
|
||||
QDateTime dt;
|
||||
if (date.contains(",")) {
|
||||
// 10.05.2025, 15:03
|
||||
@ -334,7 +303,7 @@ QString transformBankDateTime(const QString &date) {
|
||||
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()) {
|
||||
info.name = m.captured(1).trimmed();
|
||||
} 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()) {
|
||||
const QString date = m.captured(1);
|
||||
// если не пустая и дата у нас с 00:00
|
||||
// if (hasTimeComponent(date)) {
|
||||
info.bankTime = transformBankDateTime(date);
|
||||
// if (hasTimeComponent2(date)) {
|
||||
info.bankTime = transformBankDateTime2(date);
|
||||
// }
|
||||
}
|
||||
}
|
||||
|
||||
void traverseNodes(const QDomNode &node) {
|
||||
void traverseNodes2(const QDomNode &node) {
|
||||
if (node.isElement()) {
|
||||
QDomElement elem = node.toElement();
|
||||
|
||||
@ -391,18 +360,18 @@ void traverseNodes(const QDomNode &node) {
|
||||
QString index = infoElement.attribute("index");
|
||||
switch (index.toInt()) {
|
||||
case 2:
|
||||
qDebug() << "Дата операции:" << findSubInfo(infoElement, "1");
|
||||
qDebug() << "Дата операции:" << findSubInfo2(infoElement, "1");
|
||||
break;
|
||||
case 5:
|
||||
qDebug() << "Название:" << findSubInfo(infoElement, "1");
|
||||
qDebug() << "Название:" << findSubInfo2(infoElement, "1");
|
||||
qDebug() << "-------------------------------------";
|
||||
// parseTransfer(findSubInfo(infoElement));
|
||||
// parseTransfer(findSubInfo2(infoElement));
|
||||
break;
|
||||
case 7:
|
||||
qDebug() << "Комиссия:" << findSubInfo(infoElement, "1");
|
||||
qDebug() << "Комиссия:" << findSubInfo2(infoElement, "1");
|
||||
break;
|
||||
default:
|
||||
qDebug() << "Прочее:" << findSubInfo(infoElement, "1");
|
||||
qDebug() << "Прочее:" << findSubInfo2(infoElement, "1");
|
||||
break;
|
||||
}
|
||||
|
||||
@ -467,12 +436,12 @@ void traverseNodes(const QDomNode &node) {
|
||||
// Рекурсивно обходим всех детей
|
||||
QDomNode child = node.firstChild();
|
||||
while (!child.isNull()) {
|
||||
traverseNodes(child);
|
||||
traverseNodes2(child);
|
||||
child = child.nextSibling();
|
||||
}
|
||||
}
|
||||
|
||||
QDomNode findNode(const QDomNode &node, const QString &text) {
|
||||
QDomNode findNode2(const QDomNode &node, const QString &text) {
|
||||
if (node.isElement()) {
|
||||
QString nodeText = node.toElement().attribute("text");
|
||||
if (nodeText.toLower().startsWith(text)) {
|
||||
@ -483,7 +452,7 @@ QDomNode findNode(const QDomNode &node, const QString &text) {
|
||||
|
||||
QDomNode child = node.firstChild();
|
||||
while (!child.isNull()) {
|
||||
QDomNode result = findNode(child, text);
|
||||
QDomNode result = findNode2(child, text);
|
||||
if (!result.isNull()) {
|
||||
return result;
|
||||
}
|
||||
@ -492,7 +461,7 @@ QDomNode findNode(const QDomNode &node, const QString &text) {
|
||||
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(
|
||||
@ -517,7 +486,7 @@ float extractAmounts(const QString &text) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
QString beforeAmount(const QString &text) {
|
||||
QString beforeAmount2(const QString &text) {
|
||||
int index = text.indexOf(QRegularExpression("Плюс|Минус"));
|
||||
if (index != -1) {
|
||||
return text.left(index).trimmed();
|
||||
@ -525,7 +494,7 @@ QString beforeAmount(const QString &text) {
|
||||
return text; // если не найдено — вернуть всю строку
|
||||
}
|
||||
|
||||
double parseAmount(const QString &amountAsString) {
|
||||
double parseAmount2(const QString &amountAsString) {
|
||||
QString numberString = amountAsString;
|
||||
numberString.remove(QRegularExpression(R"([^\dточка])"));
|
||||
numberString.replace("точка", ".");
|
||||
@ -538,7 +507,7 @@ double parseAmount(const QString &amountAsString) {
|
||||
return amount;
|
||||
}
|
||||
|
||||
QDomElement findElementWithListView(const QDomElement &parent) {
|
||||
QDomElement findElementWithListView2(const QDomElement &parent) {
|
||||
QDomElement element = parent.firstChildElement();
|
||||
while (!element.isNull()) {
|
||||
QDomElement child = element.firstChildElement();
|
||||
@ -550,7 +519,7 @@ QDomElement findElementWithListView(const QDomElement &parent) {
|
||||
child = child.nextSiblingElement();
|
||||
}
|
||||
|
||||
QDomElement found = findElementWithListView(element);
|
||||
QDomElement found = findElementWithListView2(element);
|
||||
if (!found.isNull()) {
|
||||
return found;
|
||||
}
|
||||
@ -585,7 +554,7 @@ QDateTime getUtcFromTurkey(const QString &d, const QString &m, const QString &t)
|
||||
QList<TransactionInfo> ScreenXmlZiraatParser::parseTodayAndYesterdayReportHistory() {
|
||||
QList<TransactionInfo> transactions;
|
||||
|
||||
QDomElement child = findElementWithListView(m_xml);
|
||||
QDomElement child = findElementWithListView2(m_xml);
|
||||
QDomNodeList listView = child.childNodes();
|
||||
qDebug() << listView.count();
|
||||
if (!listView.isEmpty()) {
|
||||
@ -627,166 +596,8 @@ QList<TransactionInfo> ScreenXmlZiraatParser::parseTodayAndYesterdayReportHistor
|
||||
return transactions;
|
||||
}
|
||||
|
||||
QList<TransactionInfo> ScreenXmlZiraatParser::parseTodayAndYesterdayHistory() {
|
||||
QDate today = DateUtils::getMoscowNow().date();
|
||||
QDate yesterday = today.addDays(-1);
|
||||
QDate beforeYesterday = today.addDays(-2);
|
||||
|
||||
|
||||
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) {
|
||||
TransactionInfo parseExpandedInfoHistory2(const QDomElement &root) {
|
||||
if (root.isElement()) {
|
||||
QDomElement elem = root.toElement();
|
||||
if (elem.tagName() == "node"
|
||||
@ -804,18 +615,18 @@ TransactionInfo parseExpandedInfoHistory(const QDomElement &root) {
|
||||
switch (QDomElement e = info.toElement(); e.attribute("index").toInt()) {
|
||||
case 2:
|
||||
// Дата операции
|
||||
transaction.bankTime = transformBankDateTime(findSubInfo(e, "1"));
|
||||
transaction.bankTime = transformBankDateTime2(findSubInfo2(e, "1"));
|
||||
break;
|
||||
case 5:
|
||||
transaction.description = findSubInfo(e, "1");
|
||||
parseTransferInfo(transaction.description, transaction);
|
||||
transaction.description = findSubInfo2(e, "1");
|
||||
parseTransferInfo2(transaction.description, transaction);
|
||||
break;
|
||||
case 7:
|
||||
// Комиссия
|
||||
transaction.fee = findSubInfo(e, "1").remove(onlyDigitsRegex).toFloat();
|
||||
transaction.fee = findSubInfo2(e, "1").remove(onlyDigitsRegex).toFloat();
|
||||
break;
|
||||
default:
|
||||
// qDebug() << "Прочее:" << findSubInfo(e);
|
||||
// qDebug() << "Прочее:" << findSubInfo2(e);
|
||||
break;
|
||||
}
|
||||
}
|
||||
@ -826,7 +637,7 @@ TransactionInfo parseExpandedInfoHistory(const QDomElement &root) {
|
||||
// Рекурсивно обходим всех детей
|
||||
QDomNode child = root.firstChild();
|
||||
while (!child.isNull()) {
|
||||
if (TransactionInfo info = parseExpandedInfoHistory(child.toElement()); !info.bankTime.isEmpty()) {
|
||||
if (TransactionInfo info = parseExpandedInfoHistory2(child.toElement()); !info.bankTime.isEmpty()) {
|
||||
return info;
|
||||
}
|
||||
child = child.nextSibling();
|
||||
@ -837,7 +648,7 @@ TransactionInfo parseExpandedInfoHistory(const QDomElement &root) {
|
||||
|
||||
TransactionInfo ScreenXmlZiraatParser::parseTransactionInfoHistory(int screenWidth, int screenHeight) {
|
||||
// 1. Распарсить описание транзакции
|
||||
TransactionInfo transaction = parseExpandedInfoHistory(m_xml);
|
||||
TransactionInfo transaction = parseExpandedInfoHistory2(m_xml);
|
||||
// 1. Найти статус: Исполнен | Операция исполнена
|
||||
transaction.status = TransactionStatus::Wait;
|
||||
Node status1 = findTextNode("Исполнен", 0, 0, screenWidth, screenHeight / 2);
|
||||
@ -848,7 +659,7 @@ TransactionInfo ScreenXmlZiraatParser::parseTransactionInfoHistory(int screenWid
|
||||
return transaction;
|
||||
}
|
||||
|
||||
TransactionInfo parseExpandedInfo(const QDomElement &root) {
|
||||
TransactionInfo parseExpandedInfo2(const QDomElement &root) {
|
||||
if (root.isElement()) {
|
||||
QDomElement elem = root.toElement();
|
||||
if (elem.tagName() == "node"
|
||||
@ -868,25 +679,25 @@ TransactionInfo parseExpandedInfo(const QDomElement &root) {
|
||||
QDomElement ee;
|
||||
switch (index.toInt()) {
|
||||
case 3:
|
||||
transaction.bankTime = transformBankDateTime(findSubInfo(infoElement, "1"));
|
||||
transaction.bankTime = transformBankDateTime2(findSubInfo2(infoElement, "1"));
|
||||
break;
|
||||
case 4:
|
||||
ee = findSubElement(infoElement, "0");
|
||||
ee = findSubElement(ee, "1");
|
||||
transaction.phone = findSubInfo(ee, "0").remove(onlyDigitsRegex);
|
||||
ee = findSubElement2(infoElement, "0");
|
||||
ee = findSubElement2(ee, "1");
|
||||
transaction.phone = findSubInfo2(ee, "0").remove(onlyDigitsRegex);
|
||||
break;
|
||||
case 5:
|
||||
transaction.name = findSubInfo(infoElement, "1");
|
||||
transaction.name = findSubInfo2(infoElement, "1");
|
||||
break;
|
||||
case 6:
|
||||
transaction.bankName = findSubInfo(infoElement, "1");
|
||||
transaction.bankName = findSubInfo2(infoElement, "1");
|
||||
break;
|
||||
case 9:
|
||||
transaction.fee = findSubInfo(infoElement, "1").remove(onlyDigitsAndDotRegex).toFloat();
|
||||
transaction.fee = findSubInfo2(infoElement, "1").remove(onlyDigitsAndDotRegex).toFloat();
|
||||
break;
|
||||
case 10:
|
||||
ee = findSubElement(infoElement, "1");
|
||||
transaction.bankTrExternalId = findSubInfo(ee, "1");
|
||||
ee = findSubElement2(infoElement, "1");
|
||||
transaction.bankTrExternalId = findSubInfo2(ee, "1");
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
@ -899,7 +710,7 @@ TransactionInfo parseExpandedInfo(const QDomElement &root) {
|
||||
// Рекурсивно обходим всех детей
|
||||
QDomNode child = root.firstChild();
|
||||
while (!child.isNull()) {
|
||||
if (TransactionInfo info = parseExpandedInfo(child.toElement()); !info.bankTime.isEmpty()) {
|
||||
if (TransactionInfo info = parseExpandedInfo2(child.toElement()); !info.bankTime.isEmpty()) {
|
||||
return info;
|
||||
}
|
||||
child = child.nextSibling();
|
||||
@ -910,7 +721,7 @@ TransactionInfo parseExpandedInfo(const QDomElement &root) {
|
||||
|
||||
TransactionInfo ScreenXmlZiraatParser::parseTransactionInfo(int screenWidth, int screenHeight) {
|
||||
// 1. Распарсить описание транзакции
|
||||
TransactionInfo transaction = parseExpandedInfo(m_xml);
|
||||
TransactionInfo transaction = parseExpandedInfo2(m_xml);
|
||||
// 1. Найти статус: Исполнен | Операция исполнена
|
||||
transaction.status = TransactionStatus::Wait;
|
||||
Node status1 = findTextNode("Исполнен", 0, 0, screenWidth, screenHeight / 2);
|
||||
@ -928,9 +739,7 @@ QList<AccountInfo> ScreenXmlZiraatParser::parseAccountsInfo() {
|
||||
|
||||
for (int i = 0; i < nodes.count(); ++i) {
|
||||
const QDomElement el = nodes.at(i).toElement();
|
||||
if (el.attribute("resource-id") == "com.ziraat.ziraatmobil:id/text_account_or_bank_name" &&
|
||||
el.attribute("text").startsWith("LEVENT")
|
||||
) {
|
||||
if (el.attribute("resource-id") == "com.ziraat.ziraatmobil:id/text_account_or_bank_name") {
|
||||
// Нашли нужный аккаунт
|
||||
const QDomElement parent = el.parentNode().toElement(); // account_name_layout
|
||||
const QDomElement balanceFrame = parent.parentNode().parentNode().lastChildElement("node");
|
||||
@ -943,7 +752,7 @@ QList<AccountInfo> ScreenXmlZiraatParser::parseAccountsInfo() {
|
||||
QString account = el.attribute("text");
|
||||
|
||||
AccountInfo info;
|
||||
info.lastNumbers = account.split("-").last().trimmed();
|
||||
info.lastNumbers = account;
|
||||
info.amount = amount.toFloat();
|
||||
info.description = account;
|
||||
info.updateTime = DateUtils::getUtcNow();
|
||||
|
||||
@ -44,9 +44,6 @@ public:
|
||||
|
||||
QList<TransactionInfo> parseTodayAndYesterdayReportHistory();
|
||||
|
||||
QList<TransactionInfo> parseTodayAndYesterdayHistory();
|
||||
|
||||
|
||||
QList<AccountInfo> parseAccountsInfo();
|
||||
|
||||
void test();
|
||||
|
||||
@ -2,7 +2,7 @@
|
||||
varsion=0.0.1
|
||||
|
||||
[apps]
|
||||
list=rshb, alfabank, santanderbank
|
||||
list=rshb, alfabank, santanderbank, ziraat
|
||||
|
||||
[rshb]
|
||||
name=Росcельхозбанк
|
||||
|
||||
Binary file not shown.
@ -22,6 +22,7 @@
|
||||
#include "net/NetworkService.h"
|
||||
#include "rshb/LoginAndCheckAccountsScript.h"
|
||||
#include "widget/common/CollapsibleSection.h"
|
||||
#include "ziraat/LoginAndCheckAccountsZiraatScript.h"
|
||||
|
||||
QTableWidgetItem *BankSettingsWindow::createTableWidget(const QString &text) {
|
||||
QTableWidgetItem *item = new QTableWidgetItem(text);
|
||||
@ -46,6 +47,7 @@ QString parseStatus(const ApplicationInfo &app) {
|
||||
}
|
||||
|
||||
void BankSettingsWindow::startCheckPinCode(const QString &appCode) {
|
||||
if (appCode == "rshb") {
|
||||
const auto thread = new QThread(nullptr);
|
||||
auto *worker = new LoginAndCheckAccountsScript(m_deviceId, appCode, nullptr);
|
||||
|
||||
@ -55,6 +57,17 @@ void BankSettingsWindow::startCheckPinCode(const QString &appCode) {
|
||||
connect(worker, &LoginAndCheckAccountsScript::finished, worker, &QObject::deleteLater);
|
||||
connect(thread, &QThread::finished, thread, &QObject::deleteLater);
|
||||
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) {
|
||||
|
||||
Loading…
Reference in New Issue
Block a user