diff --git a/android/ziraat/GetLastDaysHistoryZiraatScript.cpp b/android/ziraat/GetLastDaysHistoryZiraatScript.cpp index f3befa2..7d87d5b 100644 --- a/android/ziraat/GetLastDaysHistoryZiraatScript.cpp +++ b/android/ziraat/GetLastDaysHistoryZiraatScript.cpp @@ -94,7 +94,7 @@ void GetLastDaysHistoryZiraatScript::doStart() { QList localTransactions = TransactionDAO::getTransactionsWithinHours(m_account.id, 48); QList 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)) { diff --git a/android/ziraat/PayByIbanScript.cpp b/android/ziraat/PayByIbanScript.cpp index 977b8a5..b898c15 100644 --- a/android/ziraat/PayByIbanScript.cpp +++ b/android/ziraat/PayByIbanScript.cpp @@ -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); diff --git a/android/ziraat/ScreenXmlZiraatParser.cpp b/android/ziraat/ScreenXmlZiraatParser.cpp index 026c5ef..b9e7d0f 100644 --- a/android/ziraat/ScreenXmlZiraatParser.cpp +++ b/android/ziraat/ScreenXmlZiraatParser.cpp @@ -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 ScreenXmlZiraatParser::parseTodayAndYesterdayReportHistory() { QList 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 ScreenXmlZiraatParser::parseTodayAndYesterdayReportHistor return transactions; } -QList 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 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 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 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(); diff --git a/android/ziraat/ScreenXmlZiraatParser.h b/android/ziraat/ScreenXmlZiraatParser.h index 3964d7f..36669d9 100644 --- a/android/ziraat/ScreenXmlZiraatParser.h +++ b/android/ziraat/ScreenXmlZiraatParser.h @@ -44,9 +44,6 @@ public: QList parseTodayAndYesterdayReportHistory(); - QList parseTodayAndYesterdayHistory(); - - QList parseAccountsInfo(); void test(); diff --git a/config.ini b/config.ini index eda658f..a791753 100644 --- a/config.ini +++ b/config.ini @@ -2,7 +2,7 @@ varsion=0.0.1 [apps] -list=rshb, alfabank, santanderbank +list=rshb, alfabank, santanderbank, ziraat [rshb] name=Росcельхозбанк diff --git a/database/app_data.db b/database/app_data.db index c731eb4..5f52a43 100644 Binary files a/database/app_data.db and b/database/app_data.db differ diff --git a/views/bank/BankSettingsWindow.cpp b/views/bank/BankSettingsWindow.cpp index f8d2b63..662cb2b 100644 --- a/views/bank/BankSettingsWindow.cpp +++ b/views/bank/BankSettingsWindow.cpp @@ -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,15 +47,27 @@ QString parseStatus(const ApplicationInfo &app) { } void BankSettingsWindow::startCheckPinCode(const QString &appCode) { - const auto thread = new QThread(nullptr); - auto *worker = new LoginAndCheckAccountsScript(m_deviceId, appCode, nullptr); + if (appCode == "rshb") { + const auto thread = new QThread(nullptr); + auto *worker = new LoginAndCheckAccountsScript(m_deviceId, appCode, nullptr); - worker->moveToThread(thread); - connect(thread, &QThread::started, worker, &LoginAndCheckAccountsScript::start); - connect(worker, &LoginAndCheckAccountsScript::finished, thread, &QThread::quit); - connect(worker, &LoginAndCheckAccountsScript::finished, worker, &QObject::deleteLater); - connect(thread, &QThread::finished, thread, &QObject::deleteLater); - thread->start(); + worker->moveToThread(thread); + connect(thread, &QThread::started, worker, &LoginAndCheckAccountsScript::start); + connect(worker, &LoginAndCheckAccountsScript::finished, thread, &QThread::quit); + 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) {