diff --git a/config.ini b/config.ini index faefc2e..ef93d27 100644 --- a/config.ini +++ b/config.ini @@ -9,8 +9,8 @@ version=0.0.9 dbPath=./database/app_data.db [net] -#apiBase=http://93.183.75.134:8005 -apiBase=http://127.0.0.1:8888 +apiBase=http://93.183.75.134:8005 +#apiBase=http://127.0.0.1:8888 pathAuthLogin=/api/v1/auth/login pathAuthRefresh=/api/v1/auth/refresh_token pathBankProfile=/api/v1/profile/bank_profile @@ -24,17 +24,20 @@ pathMonitoringDump=/monitoring/dump [black] android_package_name=app.blackwallet.ar currency=ARS +country=argentina name=Black phone_code=54 [ozon] android_package_name=ru.ozon.fintech.finance currency=RUB +country=russia name=Ozon phone_code=7 [dushanbe_city_bank] android_package_name=tj.dc.next1 currency=TJS +country=tajikistan name=Dushanbe City phone_code=992 diff --git a/database/dao/BankProfileDAO.cpp b/database/dao/BankProfileDAO.cpp index 61adfe3..2063b80 100644 --- a/database/dao/BankProfileDAO.cpp +++ b/database/dao/BankProfileDAO.cpp @@ -5,6 +5,7 @@ #include #include "BankProfileDAO.h" #include "DatabaseManager.h" +#include "SettingsDAO.h" #include "db/BankProfileInfo.h" bool BankProfileDAO::upsertApplication(const BankProfileInfo &info) { @@ -325,6 +326,21 @@ bool BankProfileDAO::checkInstalledApps(const QString &deviceId, const QSet(loginData["expires_in"].toDouble()); SettingsDAO::setLong("token_expires_at", QDateTime::currentSecsSinceEpoch() + expiresIn); + // Шаг 1.5: получаем страну/валюту профиля + const QJsonValue infoResult = getJson(m_apiBase + m_pathProfileGetInfo, true); + if (infoResult.isObject()) { + const QJsonObject info = infoResult.toObject(); + const QString country = info["country"].toString(); + const QString currency = info["currency"].toString(); + if (!country.isEmpty()) SettingsDAO::set("country", country); + if (!currency.isEmpty()) SettingsDAO::set("currency", currency); + qDebug() << "[loginAndSetup] profile info: country=" << country << "currency=" << currency; + } + // Шаг 2: получаем актуальный desktop с сервера QString desktopId = SettingsDAO::get("desktop_id"); @@ -1013,11 +1025,25 @@ void NetworkService::toggleMaterial() { const QString enableStr = enable ? "true" : "false"; const QString path = m_apiBase + m_pathMaterial + "/" + materialId + "/" + enableStr; const QJsonValue result = patchJson(path, QJsonObject(), true); - if (result.isNull() && result.isUndefined()) { + if (result.isNull() || result.isUndefined()) { qWarning() << "[NetworkService] toggleMaterial failed:" << materialId; emit finishedWithResult(-1); } else { - qDebug() << "[NetworkService] toggleMaterial done:" << materialId << "enable=" << enable; + const QJsonArray materials = result.toArray(); + for (const QJsonValue &v : materials) { + const QJsonObject mat = v.toObject(); + const QString matId = mat["id"].toString(); + const QString serverState = mat["state"].toString(); + if (matId.isEmpty()) continue; + const MaterialInfo local = MaterialDAO::findByMaterialId(matId); + if (local.id < 0) continue; + const QString newStatus = (serverState == "disabled") ? "off" : "active"; + if (materialStatusToString(local.status) != newStatus) { + MaterialDAO::updateStatus(local.id, newStatus); + } + } + qDebug() << "[NetworkService] toggleMaterial done:" << materialId << "enable=" << enable + << "synced" << materials.size() << "materials"; emit finishedWithResult(0); } @@ -1039,7 +1065,7 @@ void NetworkService::toggleBankProfile() { const QString enableStr = enable ? "true" : "false"; const QString path = m_apiBase + m_pathBankProfile + "/" + bankProfileId + "/" + enableStr; const QJsonValue result = patchJson(path, QJsonObject(), true); - if (result.isNull() && result.isUndefined()) { + if (result.isNull() || result.isUndefined()) { qWarning() << "[NetworkService] toggleBankProfile failed:" << bankProfileId; emit finishedWithResult(-1); } else { diff --git a/services/net/NetworkService.h b/services/net/NetworkService.h index fdfe072..53df775 100644 --- a/services/net/NetworkService.h +++ b/services/net/NetworkService.h @@ -102,6 +102,7 @@ private: QString m_pathMonitoringLog; QString m_pathMonitoringDump; QString m_pathCurrentProfile; + QString m_pathProfileGetInfo; bool m_fetchingTasks = false; QNetworkAccessManager *m_manager; diff --git a/views/device/DeviceSettingsWindow.cpp b/views/device/DeviceSettingsWindow.cpp index 9198988..c01552d 100644 --- a/views/device/DeviceSettingsWindow.cpp +++ b/views/device/DeviceSettingsWindow.cpp @@ -11,6 +11,7 @@ #include "bank/AccountSettingsWindow.h" #include "bank/BankSetupWizard.h" #include "dao/BankProfileDAO.h" +#include "dao/SettingsDAO.h" #include "db/BankProfileInfo.h" static QString formatStatus(const BankProfileInfo &app) { @@ -67,8 +68,22 @@ DeviceSettingsWindow::DeviceSettingsWindow(QWidget *parent, const QString &devic void DeviceSettingsWindow::reloadContent(QTableWidget *tableWidget) { QList apps = BankProfileDAO::getAllApplicationsByDeviceId(m_deviceId); - // Дополняем список банками из config.ini, которых нет в БД const QSettings configSettings("config.ini", QSettings::IniFormat); + const QString profileCountry = SettingsDAO::get("country"); + + // Фильтруем уже сохранённые в БД банки по стране профиля + if (!profileCountry.isEmpty()) { + for (auto it = apps.begin(); it != apps.end();) { + const QString bankCountry = configSettings.value(it->code + "/country").toString(); + if (bankCountry.compare(profileCountry, Qt::CaseInsensitive) != 0) { + it = apps.erase(it); + } else { + ++it; + } + } + } + + // Дополняем список банками из config.ini, которых нет в БД const QStringList banks = configSettings.value("apps/list").toStringList(); QSet existingCodes; for (const BankProfileInfo &a : apps) { @@ -77,6 +92,10 @@ void DeviceSettingsWindow::reloadContent(QTableWidget *tableWidget) { for (const QString &rawBank : banks) { const QString bank = rawBank.trimmed(); if (bank.isEmpty() || existingCodes.contains(bank)) continue; + if (!profileCountry.isEmpty()) { + const QString bankCountry = configSettings.value(bank + "/country").toString(); + if (bankCountry.compare(profileCountry, Qt::CaseInsensitive) != 0) continue; + } BankProfileInfo stub; stub.id = -1; stub.deviceId = m_deviceId; diff --git a/views/device/DeviceWidget.cpp b/views/device/DeviceWidget.cpp index dc8f52c..8ac7d0d 100644 --- a/views/device/DeviceWidget.cpp +++ b/views/device/DeviceWidget.cpp @@ -627,6 +627,21 @@ DeviceWidget::DeviceWidget(const DeviceInfo &device, QWidget *parent): QWidget(p const bool isOffline = device.status != "device"; QList apps = BankProfileDAO::getApplicationsByDeviceId(device.id); + + // Фильтр по стране профиля + const QString profileCountry = SettingsDAO::get("country"); + if (!profileCountry.isEmpty()) { + const QSettings configSettings("config.ini", QSettings::IniFormat); + for (auto it = apps.begin(); it != apps.end();) { + const QString bankCountry = configSettings.value(it->code + "/country").toString(); + if (bankCountry.compare(profileCountry, Qt::CaseInsensitive) != 0) { + it = apps.erase(it); + } else { + ++it; + } + } + } + for (BankProfileInfo &app: apps) { if (app.install) { auto *rowWidget = new QWidget(appsView);