Deleted `CommonBirbankScript` and its associated derived classes (`GetLastDaysHistoryBirbankScript`, `LoginAndCheckAccountsBirbankScript`, `PayByCardBirbankScript`). Removed dependencies on these scripts, including XML parsing, account handling, and transaction workflows related to the Birbank app.
149 lines
5.1 KiB
C++
149 lines
5.1 KiB
C++
#include "BankListWindow.h"
|
||
|
||
#include <QHeaderView>
|
||
#include <QJsonArray>
|
||
#include <QJsonDocument>
|
||
#include <QJsonObject>
|
||
#include <QLabel>
|
||
#include <QMessageBox>
|
||
#include <QNetworkAccessManager>
|
||
#include <QNetworkReply>
|
||
#include <QSslSocket>
|
||
#include <QLineEdit>
|
||
#include <QPushButton>
|
||
#include <QVBoxLayout>
|
||
|
||
#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<BankInfo> 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<BankInfo> 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);
|
||
}
|
||
}
|