#pragma once #include "CommonScript.h" #include #include #include #include #include #include "db/DeviceInfo.h" #include "db/BankProfileInfo.h" namespace Dushanbe { class GetLastTransactionsScript final : public CommonScript { Q_OBJECT public: explicit GetLastTransactionsScript( QString deviceId, QString appCode, QList> targets = {}, QString materialId = {}, QObject *parent = nullptr ); ~GetLastTransactionsScript() override; signals: // Испускается на КАЖДУЮ найденную транзакцию из списка целей. // EventHandler использует эти данные напрямую для task_result вместо // повторного чтения из БД. void transactionParsed(const QJsonObject &tx); protected: void doStart() override; private: // Single-pass поиск ВСЕХ целей за один проход вниз по "Выписке": на каждом // экране сверяем видимые транзакции со всем набором оставшихся целей, // найденные эмитим через transactionParsed и убираем из pending, затем // пере-сканируем тот же экран. Это убирает N-кратный перескролл (раньше // каждая цель искалась отдельным searchOne с возвратом к началу списка → при // многих целях упор в 10-мин watchdog). По завершении в pending остаются // только ненайденные цели. Прерывание выставляет m_error="Interrupted". void searchAll(const DeviceInfo &device, int accountId, QList> &pending); // Координаты тапа по табу НИЖНЕГО меню. Сначала пробуем реальные bounds из // дерева доступности; если узел отсутствует или вырожден ([0,0][0,0] — // гибридный UI на части устройств, напр. Infinix XOS, не отдаёт bounds // нижнего бара, хотя он отрисован у самого низа экрана), падаем на геометрию // (доли ширины/высоты). Возвращает {-1,-1}, если таб неизвестен. QPoint bottomNavPoint(const QString &label, const DeviceInfo &device); QString m_deviceId; const QString m_appCode; // Список целей: пары (сумма в сомони со знаком, примерное время UTC). const QList> m_targets; const QString m_materialId; // UUID задачи (для сохранения дампов) QString m_error; }; } // namespace Dushanbe