#include #include #include #include #include "ApplicationDAO.h" #include "DatabaseManager.h" #include "db/ApplicationInfo.h" bool ApplicationDAO::upsertApplication(const ApplicationInfo &info) { QSqlQuery query(DatabaseManager::instance().database()); query.prepare(R"( INSERT INTO applications (id, device_id, pin_code, name, code, package, status, comment, install, pin_code_checked) VALUES (:id, :device_id, :pin_code, :name, :code, :package, :status, :comment, :install, :pin_code_checked) ON CONFLICT(device_id, code) DO UPDATE SET device_id = excluded.device_id, pin_code = excluded.pin_code, name = excluded.name, code = excluded.code, package = excluded.package, status = excluded.status, comment = excluded.comment, install = excluded.install, pin_code_checked = excluded.pin_code_checked )"); query.bindValue(":id", info.id); query.bindValue(":device_id", info.deviceId); query.bindValue(":pin_code", info.pinCode); query.bindValue(":name", info.name); query.bindValue(":code", info.code); query.bindValue(":package", info.package); query.bindValue(":status", info.status); query.bindValue(":comment", info.comment); query.bindValue(":install", info.install ? "yes" : "no"); query.bindValue(":pin_code_checked", info.pinCodeChecked ? "yes" : "no"); if (!query.exec()) { qWarning() << "Ошибка при вставке/обновлении application:" << query.lastError().text(); return false; } return true; } bool ApplicationDAO::updatePinCode(const QString &appId, const QString &pinCode) { QSqlQuery query(DatabaseManager::instance().database()); query.prepare(R"( UPDATE applications SET pin_code = :pin_code WHERE id = :id )"); query.bindValue(":pin_code", pinCode); query.bindValue(":id", appId); if (!query.exec()) { qWarning() << "Ошибка при обновлении PIN-кода приложения:" << query.lastError().text(); return false; } return true; } bool ApplicationDAO::update( const int &appId, const QString &pinCode, const QString &comment, const QString &status ) { QSqlQuery query(DatabaseManager::instance().database()); query.prepare(R"( UPDATE applications SET pin_code = :pin_code, comment = :comment, status = :status WHERE id = :id )"); query.bindValue(":id", appId); query.bindValue(":comment", comment); query.bindValue(":pin_code", pinCode); query.bindValue(":status", status); if (!query.exec()) { qWarning() << "Ошибка при обновлении PIN-кода приложения:" << query.lastError().text(); return false; } return true; } bool ApplicationDAO::updatePinCodeStatus( const int &appId, const QString &pinCodeStatus, const QString &comment ) { QSqlQuery query(DatabaseManager::instance().database()); query.prepare(R"( UPDATE applications SET pin_code_checked = :pin_code_checked, comment = :comment, status = :status WHERE id = :id )"); query.bindValue(":id", appId); query.bindValue(":comment", comment); query.bindValue(":pin_code_checked", pinCodeStatus); query.bindValue(":status", pinCodeStatus == "yes" ? "active" : "off"); if (!query.exec()) { qWarning() << "Ошибка при обновлении PIN-кода приложения:" << query.lastError().text(); return false; } return true; } ApplicationInfo parseApplication(const QSqlQuery &query) { ApplicationInfo app; app.id = query.value("id").toInt(); app.deviceId = query.value("device_id").toString(); app.pinCode = query.value("pin_code").toString(); app.code = query.value("code").toString(); app.name = query.value("name").toString(); app.package = query.value("package").toString(); app.status = query.value("status").toString(); app.comment = query.value("comment").toString(); app.install = query.value("install").toString() == "yes"; app.pinCodeChecked = query.value("pin_code_checked").toString() == "yes"; app.phone = query.value("phone").toString(); app.email = query.value("email").toString(); app.fullName = query.value("full_name").toString(); app.bankProfileId = query.value("bank_profile_id").toString(); app.currency = query.value("currency").toString(); app.amount = query.value("amount").toDouble(); return app; } ApplicationInfo ApplicationDAO::getApplication(const QString &deviceId, const QString &appCode) { QSqlQuery query(DatabaseManager::instance().database()); query.prepare(R"( SELECT id, device_id, pin_code, code, name, package, status, comment, install, pin_code_checked, phone, email, full_name, bank_profile_id, currency, amount FROM applications WHERE device_id = :device_id AND code = :code LIMIT 1 )"); query.bindValue(":device_id", deviceId); query.bindValue(":code", appCode); if (!query.exec()) { qWarning() << "Ошибка при получении приложений по deviceId:" << query.lastError().text(); return {}; } while (query.next()) { return parseApplication(query); } return {}; } QList ApplicationDAO::getApplicationsByDeviceId(const QString &deviceId) { QSqlQuery query(DatabaseManager::instance().database()); QList list; query.prepare(R"( SELECT id, device_id, pin_code, code, name, package, status, comment, install, pin_code_checked, phone, email, full_name, bank_profile_id, currency, amount FROM applications WHERE device_id = :device_id AND install = 'yes' )"); query.bindValue(":device_id", deviceId); if (!query.exec()) { qWarning() << "Ошибка при получении приложений по deviceId:" << query.lastError().text(); return {}; } while (query.next()) { list.append(parseApplication(query)); } return list; } bool ApplicationDAO::updateProfileInfo( const int &appId, const QString &fullName, const QString &phone, const QString &email ) { QSqlQuery query(DatabaseManager::instance().database()); query.prepare(R"( UPDATE applications SET full_name = :full_name, phone = :phone, email = :email WHERE id = :id )"); query.bindValue(":id", appId); query.bindValue(":full_name", fullName); query.bindValue(":phone", phone); query.bindValue(":email", email); if (!query.exec()) { qWarning() << "Ошибка при обновлении профиля приложения:" << query.lastError().text(); return false; } return true; } bool ApplicationDAO::updateAmount(const int appId, const double amount) { QSqlQuery query(DatabaseManager::instance().database()); query.prepare("UPDATE applications SET amount = :amount WHERE id = :id"); query.bindValue(":amount", amount); query.bindValue(":id", appId); if (!query.exec()) { qWarning() << "Ошибка при обновлении amount в application:" << query.lastError().text(); return false; } return true; } bool ApplicationDAO::updateBankProfileId(const int appId, const QString &bankProfileId) { QSqlQuery query(DatabaseManager::instance().database()); query.prepare("UPDATE applications SET bank_profile_id = :bank_profile_id WHERE id = :id"); query.bindValue(":bank_profile_id", bankProfileId); query.bindValue(":id", appId); if (!query.exec()) { qWarning() << "Ошибка при обновлении bank_profile_id:" << query.lastError().text(); return false; } return true; } QList ApplicationDAO::findAllByBankProfileId(const QString &bankProfileId) { QList list; QSqlQuery query(DatabaseManager::instance().database()); query.prepare(R"( SELECT id, device_id, pin_code, code, name, package, status, comment, install, pin_code_checked, phone, email, full_name, bank_profile_id, currency, amount FROM applications WHERE bank_profile_id = :bank_profile_id )"); query.bindValue(":bank_profile_id", bankProfileId); if (!query.exec()) { qWarning() << "Ошибка при поиске applications по bank_profile_id:" << query.lastError().text(); return list; } while (query.next()) { list.append(parseApplication(query)); } return list; } bool ApplicationDAO::activateAppsForDevice(const QString &deviceId) { QSqlQuery query(DatabaseManager::instance().database()); query.prepare(R"( UPDATE applications SET status = 'active' WHERE device_id = :device_id AND install = 'yes' AND pin_code_checked = 'yes' )"); query.bindValue(":device_id", deviceId); if (!query.exec()) { qWarning() << "Ошибка при активации приложений:" << query.lastError().text(); return false; } return true; } bool ApplicationDAO::deactivateAppsForDevice(const QString &deviceId) { QSqlQuery query(DatabaseManager::instance().database()); query.prepare(R"( UPDATE applications SET status = 'off' WHERE device_id = :device_id AND install = 'yes' )"); query.bindValue(":device_id", deviceId); if (!query.exec()) { qWarning() << "Ошибка при деактивации приложений:" << query.lastError().text(); return false; } return true; } bool ApplicationDAO::checkInstalledApps(const QString &deviceId, const QSet &apps) { QSqlQuery query(DatabaseManager::instance().database()); const QSettings settings("config.ini", QSettings::IniFormat); QStringList banks = settings.value("apps/list", QStringList()).toStringList(); // Сбросить install = 'no' для банков которых нет в текущем apps/list if (!banks.isEmpty()) { QStringList placeholders; for (int i = 0; i < banks.size(); ++i) placeholders << "?"; query.prepare(QString(R"( UPDATE applications SET install = 'no' WHERE device_id = ? AND code NOT IN (%1) )").arg(placeholders.join(","))); query.addBindValue(deviceId); for (const QString &bank : banks) query.addBindValue(bank); if (!query.exec()) { qWarning() << "Ошибка при сбросе install:" << query.lastError().text(); } } for (const QString &bank: banks) { QString package = settings.value(bank + "/android_package_name").toString(); QString name = settings.value(bank + "/name").toString(); const QString currency = settings.value(bank + "/currency").toString(); query.prepare(R"( INSERT INTO applications (device_id, name, code, package, status, install, pin_code_checked, currency) VALUES (:device_id, :name, :code, :package, :status, :install, :pin_code_checked, :currency) ON CONFLICT(device_id, code) DO UPDATE SET install = excluded.install, currency = CASE WHEN excluded.currency != '' THEN excluded.currency ELSE currency END )"); query.bindValue(":device_id", deviceId); query.bindValue(":code", bank); query.bindValue(":name", name); query.bindValue(":package", package); query.bindValue(":status", "off"); query.bindValue(":pin_code_checked", "no"); query.bindValue(":install", apps.contains(package) ? "yes" : "no"); query.bindValue(":currency", currency); if (!query.exec()) { qWarning() << "Ошибка при проверке приложений:" << query.lastError().text(); return false; } } return true; }