#include "BankListWindow.h" #include #include #include #include #include #include #include #include #include #include #include #include #include "dao/BankDAO.h" BankListWindow::BankListWindow(QWidget *parent) : QWidget(parent, Qt::Window | Qt::WindowTitleHint | Qt::WindowSystemMenuHint | Qt::WindowCloseButtonHint | Qt::WindowMinMaxButtonsHint) { setWindowTitle("Банки"); setMinimumSize(600, 400); resize(700, 500); auto *layout = new QVBoxLayout(this); auto *topRow = new QHBoxLayout(); auto *syncBtn = new QPushButton("Синхронизировать"); syncBtn->setStyleSheet("background-color: #1565C0; color: white;"); syncBtn->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Preferred); topRow->addWidget(syncBtn); auto *searchEdit = new QLineEdit(this); searchEdit->setPlaceholderText("Поиск..."); searchEdit->setClearButtonEnabled(true); topRow->addWidget(searchEdit); topRow->addStretch(); layout->addLayout(topRow); connect(syncBtn, &QPushButton::clicked, this, &BankListWindow::syncBanks); connect(searchEdit, &QLineEdit::textChanged, this, &BankListWindow::filterTable); m_tableWidget = new QTableWidget(this); m_tableWidget->setEditTriggers(QAbstractItemView::NoEditTriggers); m_tableWidget->setSelectionMode(QAbstractItemView::SingleSelection); m_tableWidget->setSelectionBehavior(QAbstractItemView::SelectRows); m_tableWidget->setColumnCount(3); m_tableWidget->setHorizontalHeaderLabels({"Alias", "Название", "NSPK"}); m_tableWidget->horizontalHeader()->setDefaultAlignment(Qt::AlignLeft | Qt::AlignVCenter); m_tableWidget->horizontalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents); layout->addWidget(m_tableWidget); reloadTable(); } void BankListWindow::reloadTable() { QList banks = BankDAO::getAll(); m_tableWidget->setRowCount(banks.size()); for (int i = 0; i < banks.size(); ++i) { const BankInfo &b = banks[i]; auto *alias = new QTableWidgetItem(b.alias); alias->setFlags(alias->flags() & ~Qt::ItemIsEditable); m_tableWidget->setItem(i, 0, alias); auto *name = new QTableWidgetItem(b.name); name->setFlags(name->flags() & ~Qt::ItemIsEditable); m_tableWidget->setItem(i, 1, name); auto *nspk = new QTableWidgetItem(b.nspkName); nspk->setFlags(nspk->flags() & ~Qt::ItemIsEditable); m_tableWidget->setItem(i, 2, nspk); } } void BankListWindow::syncBanks() { if (!QSslSocket::supportsSsl()) { QMessageBox::warning(this, "Ошибка", "SSL не доступен. HTTPS-запросы невозможны.\n\n" "Убедитесь, что libssl и libcrypto DLL находятся рядом с исполняемым файлом."); qWarning() << "[BankListWindow] SSL not supported. Build:" << QSslSocket::sslLibraryBuildVersionString() << "Runtime:" << QSslSocket::sslLibraryVersionString(); return; } auto *manager = new QNetworkAccessManager(this); QNetworkRequest request(QUrl("https://api.brtservice.io/api/rest/info/")); QNetworkReply *reply = manager->get(request); connect(reply, &QNetworkReply::finished, this, [this, reply, manager]() { reply->deleteLater(); manager->deleteLater(); if (reply->error() != QNetworkReply::NoError) { QMessageBox::warning(this, "Ошибка", "Не удалось загрузить банки: " + reply->errorString()); return; } const QByteArray data = reply->readAll(); const QJsonDocument doc = QJsonDocument::fromJson(data); QJsonArray array; if (doc.isArray()) { array = doc.array(); } else if (doc.isObject() && doc.object().contains("data")) { array = doc.object()["data"].toArray(); } QList banks; for (const QJsonValue &val : array) { QJsonObject obj = val.toObject(); BankInfo bank; bank.alias = obj["alias"].toString(); bank.name = obj["name"].toString(); bank.nspkName = obj["nspk_name"].toString(); if (!bank.alias.isEmpty()) { banks.append(bank); } } BankDAO::replaceAll(banks); reloadTable(); qDebug() << "[BankListWindow] Synced" << banks.size() << "banks"; }); } void BankListWindow::filterTable(const QString &text) { for (int i = 0; i < m_tableWidget->rowCount(); ++i) { bool match = false; for (int col = 0; col < m_tableWidget->columnCount(); ++col) { QTableWidgetItem *item = m_tableWidget->item(i, col); if (item && item->text().contains(text, Qt::CaseInsensitive)) { match = true; break; } } m_tableWidget->setRowHidden(i, !match); } }