From baa60d008b1e1b0093d663aefe3d0222b49477ea Mon Sep 17 00:00:00 2001 From: slava Date: Mon, 6 Apr 2026 20:16:58 +0700 Subject: [PATCH] Ensure `BankSetupWizard` triggers only when `bankProfileId` is empty and `pinCodeChecked` is false in `DeviceSettingsWindow` and `DeviceWidget`. --- views/bank/AccountSettingsWindow.cpp | 50 +++++++++++++++++++++++++--- views/device/DeviceWidget.cpp | 18 ++++++++++ 2 files changed, 63 insertions(+), 5 deletions(-) diff --git a/views/bank/AccountSettingsWindow.cpp b/views/bank/AccountSettingsWindow.cpp index 16c9591..0e256f4 100644 --- a/views/bank/AccountSettingsWindow.cpp +++ b/views/bank/AccountSettingsWindow.cpp @@ -16,6 +16,7 @@ #include "black/LoginAndCheckAccountsScript.h" #include "black/GetProfileInfoScript.h" #include "black/GetCardInfoScript.h" +#include "dushanbe/LoginAndCheckAccountsScript.h" #include "dushanbe/GetProfileInfoScript.h" #include "dushanbe/GetCardInfoScript.h" #include "dao/BankProfileDAO.h" @@ -223,6 +224,26 @@ void AccountSettingsWindow::toggleProfileStatus() { m_app.status = newStatus; showOverlay(isActive ? "Выключение профиля..." : "Включение профиля..."); sendAppStatus(newStatus); + + // При включении профиля — включаем на сервере все локально активные материалы + if (!isActive) { + const QList materials = MaterialDAO::getAccounts(m_deviceId, m_app.code); + for (const auto &mat : materials) { + if (mat.status == MaterialStatus::Active && !mat.materialId.isEmpty()) { + auto *thread = new QThread; + auto *net = new NetworkService; + net->moveToThread(thread); + net->addExtra("material_id", mat.materialId); + net->addExtra("enable", true); + connect(thread, &QThread::started, net, &NetworkService::toggleMaterial); + connect(net, &NetworkService::finished, thread, &QThread::quit); + connect(net, &NetworkService::finished, net, &QObject::deleteLater); + connect(thread, &QThread::finished, thread, &QThread::deleteLater); + thread->start(); + qDebug() << "[AccountSettings] Enabling material on server:" << mat.materialId; + } + } + } } // ── Edit PIN ─────────────────────────────────────────────────────────────── @@ -250,17 +271,26 @@ void AccountSettingsWindow::startCheckPinCode() { return; } + showOverlay("Проверка пин-кода..."); + pauseActiveProfiles(); + auto *thread = new QThread(nullptr); const QString deviceId = m_deviceId; const QString appCode = m_app.code; const int appId = m_app.id; auto onResult = [this, appId](const QString &result) { - if (result.isEmpty()) { - BankProfileDAO::updatePinCodeStatus(appId, "yes", ""); - m_app.pinCodeChecked = true; - QMetaObject::invokeMethod(this, [this]() { updateStatusUI(); }, Qt::QueuedConnection); - } + QMetaObject::invokeMethod(this, [this, appId, result]() { + resumePausedProfiles(); + if (result.isEmpty()) { + BankProfileDAO::updatePinCodeStatus(appId, "yes", ""); + m_app.pinCodeChecked = true; + updateStatusUI(); + hideOverlay(true, "Пин-код проверен"); + } else { + hideOverlay(false, "Ошибка: " + result); + } + }, Qt::QueuedConnection); }; if (appCode == "ozon") { @@ -279,7 +309,17 @@ void AccountSettingsWindow::startCheckPinCode() { connect(worker, &Black::LoginAndCheckAccountsScript::finished, thread, &QThread::quit); connect(worker, &Black::LoginAndCheckAccountsScript::finished, worker, &QObject::deleteLater); connect(thread, &QThread::finished, thread, &QObject::deleteLater); + } else if (appCode == "dushanbe_city_bank") { + auto *worker = new Dushanbe::LoginAndCheckAccountsScript(deviceId, appCode, nullptr, true); + worker->moveToThread(thread); + connect(thread, &QThread::started, worker, &Dushanbe::LoginAndCheckAccountsScript::start); + connect(worker, &Dushanbe::LoginAndCheckAccountsScript::finishedWithResult, this, onResult, Qt::QueuedConnection); + connect(worker, &Dushanbe::LoginAndCheckAccountsScript::finished, thread, &QThread::quit); + connect(worker, &Dushanbe::LoginAndCheckAccountsScript::finished, worker, &QObject::deleteLater); + connect(thread, &QThread::finished, thread, &QObject::deleteLater); } else { + resumePausedProfiles(); + hideOverlay(false, "Банк не поддерживается"); thread->deleteLater(); return; } diff --git a/views/device/DeviceWidget.cpp b/views/device/DeviceWidget.cpp index 61858c9..3d84be5 100644 --- a/views/device/DeviceWidget.cpp +++ b/views/device/DeviceWidget.cpp @@ -192,6 +192,24 @@ void DeviceWidget::buildBankRow(const BankProfileInfo &app, QWidget *rowWidget, qDebug() << "Cant update bank data"; } else { sendBankStatus(app.deviceId, app.code, newStatus); + // При включении — включаем на сервере все локально активные материалы + if (newStatus == "active") { + const QList materials = MaterialDAO::getAccounts(app.deviceId, app.code); + for (const auto &mat : materials) { + if (mat.status == MaterialStatus::Active && !mat.materialId.isEmpty()) { + auto *thr = new QThread; + auto *ns = new NetworkService; + ns->moveToThread(thr); + ns->addExtra("material_id", mat.materialId); + ns->addExtra("enable", true); + QObject::connect(thr, &QThread::started, ns, &NetworkService::toggleMaterial); + QObject::connect(ns, &NetworkService::finished, thr, &QThread::quit); + QObject::connect(ns, &NetworkService::finished, ns, &QObject::deleteLater); + QObject::connect(thr, &QThread::finished, thr, &QThread::deleteLater); + thr->start(); + } + } + } } } });