1
0
forked from BRT/arc

Add device timezone handling in transaction filtering and refine match logic by amount and timestamp

This commit is contained in:
slava 2026-04-10 18:14:52 +07:00
parent 76ceaed0eb
commit fd99281dfb
2 changed files with 36 additions and 3 deletions

View File

@ -358,7 +358,10 @@ void GetLastTransactionsScript::doStart() {
qDebug() << "[Dushanbe::GetLastTransactions] Searching: amount=" << m_searchAmount qDebug() << "[Dushanbe::GetLastTransactions] Searching: amount=" << m_searchAmount
<< "time=" << m_searchTime.toString(Qt::ISODate); << "time=" << m_searchTime.toString(Qt::ISODate);
const QTimeZone tjTz("Asia/Dushanbe"); // UTC+5 // Время в банковском приложении показывается в таймзоне устройства
const QString tzName = AdbUtils::getDeviceTimezone(m_deviceId);
QTimeZone tjTz(tzName.toUtf8());
if (!tjTz.isValid()) tjTz = QTimeZone("Asia/Dushanbe");
const int maxScrolls = 10; const int maxScrolls = 10;
for (int scroll = 0; scroll <= maxScrolls; ++scroll) { for (int scroll = 0; scroll <= maxScrolls; ++scroll) {

View File

@ -313,6 +313,28 @@ void EventHandler::updateEventThread(const QString &key, const EventInfo &event,
} }
} else if (event.type == EventType::FetchTransactions) { } else if (event.type == EventType::FetchTransactions) {
QList<TransactionInfo> txList = TransactionDAO::getTransactionsWithinHours(event.accountId, 24); QList<TransactionInfo> txList = TransactionDAO::getTransactionsWithinHours(event.accountId, 24);
// Оставляем только совпадения по сумме
txList.erase(std::remove_if(txList.begin(), txList.end(),
[&](const TransactionInfo &tx) {
return qAbs(tx.amount - event.amount) > 0.01;
}), txList.end());
// Если больше одной — берём ближайшую по времени к запросу сервера
if (txList.size() > 1) {
const QJsonObject taskJson = QJsonDocument::fromJson(event.json.toUtf8()).object();
const QDateTime target = QDateTime::fromString(
taskJson["body"].toObject()["created_at"].toString(), Qt::ISODate);
if (target.isValid()) {
auto best = std::min_element(txList.begin(), txList.end(),
[&](const TransactionInfo &a, const TransactionInfo &b) {
const QDateTime ta = a.completeTime.isValid() ? a.completeTime : a.timestamp;
const QDateTime tb = b.completeTime.isValid() ? b.completeTime : b.timestamp;
return qAbs(ta.toUTC().secsTo(target)) < qAbs(tb.toUTC().secsTo(target));
});
const TransactionInfo chosen = *best;
txList.clear();
txList.append(chosen);
}
}
// Фильтруем: отправляем только транзакции с bank_transaction_id // Фильтруем: отправляем только транзакции с bank_transaction_id
bool hasWithoutId = false; bool hasWithoutId = false;
QJsonArray arr; QJsonArray arr;
@ -331,8 +353,16 @@ void EventHandler::updateEventThread(const QString &key, const EventInfo &event,
QJsonObject extraObj; QJsonObject extraObj;
extraObj["fee"] = static_cast<int>(tx.fee * 100); extraObj["fee"] = static_cast<int>(tx.fee * 100);
txObj["extra"] = extraObj; txObj["extra"] = extraObj;
const QTimeZone bankTz(event.bankName == "dushanbe_city_bank" // Банковские приложения показывают время в таймзоне устройства
? "Asia/Dushanbe" : "Europe/Moscow"); const DeviceInfo bankDevice = DeviceDAO::getDeviceById(event.deviceId);
const QString bankAdbSerial = bankDevice.adbSerial.isEmpty()
? event.deviceId : bankDevice.adbSerial;
const QString bankTzName = AdbUtils::getDeviceTimezone(bankAdbSerial);
QTimeZone bankTz(bankTzName.toUtf8());
if (!bankTz.isValid()) {
bankTz = QTimeZone(event.bankName == "dushanbe_city_bank"
? "Asia/Dushanbe" : "Europe/Moscow");
}
// Приоритет: bankTime (время операции) > timestamp (время сохранения) // Приоритет: bankTime (время операции) > timestamp (время сохранения)
// Сервер ожидает UTC ("Z") // Сервер ожидает UTC ("Z")
bool createdAtSet = false; bool createdAtSet = false;