1
0
forked from BRT/arc
arc/android/dushanbe/GetLastTransactionsScript.h

71 lines
3.5 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#pragma once
#include "CommonScript.h"
#include <QDateTime>
#include <QJsonObject>
#include <QList>
#include <QPair>
#include <QPoint>
#include <QSet>
#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<QPair<double, QDateTime>> targets = {},
QString materialId = {},
QObject *parent = nullptr
);
~GetLastTransactionsScript() override;
signals:
// Испускается на КАЖДУЮ найденную транзакцию из списка целей.
// EventHandler использует эти данные напрямую для task_result вместо
// повторного чтения из БД.
void transactionParsed(const QJsonObject &tx);
public:
// Снимок глобального кэша найденных транзакций (от EventHandler).
// Ключи: "real_created_at|abs_amount_cents". Транзакции из этого набора
// пропускаются при поиске, чтобы одна и та же TX не подтверждала два задания.
void setFoundCache(const QSet<QString> &cache) { m_foundCache = cache; }
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<QPair<double, QDateTime>> &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<QPair<double, QDateTime>> m_targets;
const QString m_materialId; // UUID задачи (для сохранения дампов)
QString m_error;
QSet<QString> m_foundCache; // снимок глобального кэша (от EventHandler)
};
} // namespace Dushanbe