1
0
forked from BRT/arc

Add support for processing pending transactions

Refactored transaction processing to include pending status updates and added logic to handle "Ожидающие обработки" transactions. Updated relevant scripts, XML resources, and database handling for improved transaction tracking and status accuracy.
This commit is contained in:
slava 2025-06-11 15:28:37 +07:00
parent 6e9b7c2b6e
commit f70b46ce44
8 changed files with 357 additions and 9 deletions

2
.gitignore vendored
View File

@ -21,3 +21,5 @@ Makefile
/.ninja_log /.ninja_log
/ARCDesktopProject_autogen/ /ARCDesktopProject_autogen/
/ARCDesktopProject /ARCDesktopProject
/Contents/
/application.log

View File

@ -86,7 +86,8 @@ QString formatPrice(const double value) {
bool GetLastDaysHistoryScript::saveAndPostNewTransactionData( bool GetLastDaysHistoryScript::saveAndPostNewTransactionData(
const AccountInfo &account, const AccountInfo &account,
const TransactionInfo &transaction const TransactionInfo &transaction,
const TransactionStatus &status
) { ) {
TransactionInfo tr; TransactionInfo tr;
tr.accountId = account.id; tr.accountId = account.id;
@ -99,7 +100,7 @@ bool GetLastDaysHistoryScript::saveAndPostNewTransactionData(
tr.fee = transaction.fee; tr.fee = transaction.fee;
tr.name = transaction.name; tr.name = transaction.name;
tr.bankTrExternalId = transaction.bankTrExternalId; tr.bankTrExternalId = transaction.bankTrExternalId;
tr.status = TransactionStatus::Complete; tr.status = status;
tr.type = transaction.description.startsWith("Перевод") ? TransactionType::Phone : TransactionType::Card; tr.type = transaction.description.startsWith("Перевод") ? TransactionType::Phone : TransactionType::Card;
tr.completeTime = DateUtils::getUtcNow(); tr.completeTime = DateUtils::getUtcNow();
tr.id = TransactionDAO::insertTransaction(tr); tr.id = TransactionDAO::insertTransaction(tr);
@ -338,7 +339,7 @@ void GetLastDaysHistoryScript::doStart() {
} }
} }
if (!updated) { if (!updated) {
if (!saveAndPostNewTransactionData(m_account, transaction)) { if (!saveAndPostNewTransactionData(m_account, transaction, TransactionStatus::Complete)) {
qDebug() << "--- saveAndPostNewTransactionData failed"; qDebug() << "--- saveAndPostNewTransactionData failed";
} }
} }
@ -348,11 +349,47 @@ void GetLastDaysHistoryScript::doStart() {
// Если по карте, мы знаем ток дату + сумма // Если по карте, мы знаем ток дату + сумма
} }
Node waitTab = xmlScreenParser.findButtonNode("Ожидающие обработки", true);
if (!waitTab.isEmpty()) {
AdbUtils::makeTap(m_account.deviceId, waitTab.x(), waitTab.y());
QThread::msleep(1000);
QList<TransactionInfo> parsedWaitTransactions = xmlScreenParser.parseTodayAndYesterdayReportHistory();
for (const TransactionInfo &transaction: parsedWaitTransactions) {
QList<TransactionInfo> localActualTransactions = TransactionDAO::getTransactionsWithinHours(
m_account.id, 48
);
for (const TransactionInfo &saved: localActualTransactions) {
if (saved.status != TransactionStatus::Wait) {
continue;
}
QDate sDate = QDateTime::fromString(saved.bankTime, "dd.MM.yyyy HH:mm:ss").date();
if (!sDate.isValid()) {
sDate = QDateTime::fromString(saved.bankTime, "dd.MM.yyyy").date();
}
QDate pDate = QDateTime::fromString(transaction.bankTime, "dd.MM.yyyy HH:mm:ss").date();
if (!pDate.isValid()) {
pDate = QDateTime::fromString(transaction.bankTime, "dd.MM.yyyy").date();
}
if (saved.amount == transaction.amount && sDate == pDate) {
// одно и тоже
} else {
if (!saveAndPostNewTransactionData(m_account, transaction, TransactionStatus::Wait)) {
qDebug() << "--- saveAndPostNewTransactionData - Wait failed";
}
}
}
}
}
} }
} else { } else {
m_error = "GetLastDaysHistoryScript - home screen not found"; m_error = "GetLastDaysHistoryScript - home screen not found";
qWarning() << m_error; qWarning() << m_error;
emit finishedWithResult(m_error); emit finishedWithResult(m_error);
} }
AdbUtils::goBack(m_account.deviceId);
AdbUtils::goBack(m_account.deviceId);
AdbUtils::goBack(m_account.deviceId);
emit finishedWithResult(m_error); emit finishedWithResult(m_error);
} }

View File

@ -19,7 +19,11 @@ private:
const AccountInfo m_account; const AccountInfo m_account;
QString m_error; QString m_error;
bool saveAndPostNewTransactionData(const AccountInfo &account, const TransactionInfo &transaction); bool saveAndPostNewTransactionData(
const AccountInfo &account,
const TransactionInfo &transaction,
const TransactionStatus &status
);
bool updateAndPostTransactionData( bool updateAndPostTransactionData(
const AccountInfo &account, const AccountInfo &account,

View File

@ -9,8 +9,8 @@
#include "adb/AdbUtils.h" #include "adb/AdbUtils.h"
HomeScreenScript::HomeScreenScript(const int transactionId, QObject *parent) HomeScreenScript::HomeScreenScript(QObject *parent)
: QObject(parent), transactionId(transactionId) { : QObject(parent) {
} }
HomeScreenScript::~HomeScreenScript() = default; HomeScreenScript::~HomeScreenScript() = default;
@ -500,7 +500,6 @@ void HomeScreenScript::start() {
// 2. Идем дальше // 2. Идем дальше
emit finished(); emit finished();
} }

View File

@ -9,7 +9,7 @@ class HomeScreenScript final : public QObject {
Q_OBJECT Q_OBJECT
public: public:
explicit HomeScreenScript(int transactionId, QObject *parent = nullptr); explicit HomeScreenScript(QObject *parent = nullptr);
~HomeScreenScript() override; ~HomeScreenScript() override;
@ -23,7 +23,6 @@ signals:
private: private:
bool m_running = true; bool m_running = true;
int transactionId;
ScreenXmlParser xmlScreenParser; ScreenXmlParser xmlScreenParser;
bool goToHomeScreen( bool goToHomeScreen(

Binary file not shown.

After

Width:  |  Height:  |  Size: 79 KiB

View File

@ -0,0 +1,307 @@
<?xml version='1.0' encoding='UTF-8' standalone='yes' ?>
<hierarchy rotation="0">
<node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="ru.rshb.dbo" content-desc=""
checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false"
scrollable="false" long-clickable="false" password="false" selected="false" bounds="[0,0][720,1439]">
<node index="0" text="" resource-id="" class="android.widget.LinearLayout" package="ru.rshb.dbo" content-desc=""
checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false"
scrollable="false" long-clickable="false" password="false" selected="false" bounds="[0,0][720,1439]">
<node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="ru.rshb.dbo"
content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false"
focused="false" scrollable="false" long-clickable="false" password="false" selected="false"
bounds="[0,82][720,1439]">
<node index="0" text="" resource-id="ru.rshb.dbo:id/action_bar_root" class="android.widget.LinearLayout"
package="ru.rshb.dbo" content-desc="" checkable="false" checked="false" clickable="false"
enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false"
password="false" selected="false" bounds="[0,82][720,1439]">
<node index="0" text="" resource-id="android:id/content" class="android.widget.FrameLayout"
package="ru.rshb.dbo" content-desc="" checkable="false" checked="false" clickable="false"
enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false"
password="false" selected="false" bounds="[0,82][720,1439]">
<node index="0" text="" resource-id="" class="android.webkit.WebView" package="ru.rshb.dbo"
content-desc="" checkable="false" checked="false" clickable="false" enabled="true"
focusable="false" focused="false" scrollable="false" long-clickable="false"
password="false" selected="false" bounds="[0,82][720,1439]">
<node index="0" text="" resource-id="" class="android.webkit.WebView" package="ru.rshb.dbo"
content-desc="" checkable="false" checked="false" clickable="false" enabled="true"
focusable="true" focused="true" scrollable="false" long-clickable="false"
password="false" selected="false" bounds="[0,82][720,1439]">
<node index="0" text="" resource-id="" class="android.view.View" package="ru.rshb.dbo"
content-desc="" checkable="false" checked="false" clickable="false" enabled="true"
focusable="false" focused="false" scrollable="false" long-clickable="false"
password="false" selected="false" bounds="[0,82][720,1439]">
<node index="0" text="" resource-id="" class="android.view.View"
package="ru.rshb.dbo" content-desc="" checkable="false" checked="false"
clickable="false" enabled="true" focusable="false" focused="false"
scrollable="false" long-clickable="false" password="false" selected="false"
bounds="[0,82][720,1439]">
<node index="0" text="" resource-id="" class="android.view.View"
package="ru.rshb.dbo" content-desc="" checkable="false" checked="false"
clickable="false" enabled="true" focusable="false" focused="false"
scrollable="false" long-clickable="false" password="false"
selected="false" bounds="[0,82][720,1439]">
<node index="0" text="" resource-id="" class="android.view.View"
package="ru.rshb.dbo" content-desc="" checkable="false"
checked="false" clickable="false" enabled="true" focusable="false"
focused="false" scrollable="false" long-clickable="false"
password="false" selected="false" bounds="[0,82][720,1439]">
<node index="0" text="" resource-id="" class="android.view.View"
package="ru.rshb.dbo" content-desc="" checkable="false"
checked="false" clickable="false" enabled="true" focusable="false"
focused="false" scrollable="false" long-clickable="false"
password="false" selected="false" bounds="[0,82][720,1439]">
<node index="0" text="" resource-id="" class="android.view.View"
package="ru.rshb.dbo" content-desc="" checkable="false"
checked="false" clickable="false" enabled="true"
focusable="false" focused="false" scrollable="false"
long-clickable="false" password="false" selected="false"
bounds="[0,82][720,1439]">
<node index="0" text="" resource-id="" class="android.view.View"
package="ru.rshb.dbo" content-desc="" checkable="false"
checked="false" clickable="false" enabled="true"
focusable="false" focused="false" scrollable="false"
long-clickable="false" password="false" selected="false"
bounds="[0,82][720,166]">
<node index="0" text="" resource-id=""
class="android.view.View" package="ru.rshb.dbo"
content-desc="" checkable="false" checked="false"
clickable="false" enabled="true" focusable="false"
focused="false" scrollable="false"
long-clickable="false" password="false"
selected="false" bounds="[7,89][78,157]">
<node index="0" text="Назад" resource-id=""
class="android.widget.Button"
package="ru.rshb.dbo" content-desc=""
checkable="false" checked="false" clickable="true"
enabled="true" focusable="true" focused="false"
scrollable="false" long-clickable="false"
password="false" selected="false"
bounds="[7,89][69,157]"/>
</node>
<node index="1" text="Выписка" resource-id=""
class="android.widget.TextView" package="ru.rshb.dbo"
content-desc="" checkable="false" checked="false"
clickable="false" enabled="true" focusable="false"
focused="false" scrollable="false"
long-clickable="false" password="false"
selected="false" bounds="[86,89][260,173]"/>
<node index="2" text="" resource-id=""
class="android.view.View" package="ru.rshb.dbo"
content-desc="" checkable="false" checked="false"
clickable="false" enabled="true" focusable="false"
focused="false" scrollable="false"
long-clickable="false" password="false"
selected="false" bounds="[641,89][712,157]">
<node index="0"
text="Информирование о сроке отображения операций по счету"
resource-id="aft-rbtnClass-buttonIcon"
class="android.widget.Button"
package="ru.rshb.dbo" content-desc=""
checkable="false" checked="false" clickable="true"
enabled="true" focusable="true" focused="false"
scrollable="false" long-clickable="false"
password="false" selected="false"
bounds="[650,89][712,157]"/>
</node>
</node>
<node index="1" text="" resource-id="" class="android.view.View"
package="ru.rshb.dbo" content-desc="" checkable="false"
checked="false" clickable="false" enabled="true"
focusable="false" focused="false" scrollable="false"
long-clickable="false" password="false" selected="false"
bounds="[0,160][720,1379]">
<node index="0" text="" resource-id=""
class="android.view.View" package="ru.rshb.dbo"
content-desc="" checkable="false" checked="false"
clickable="false" enabled="true" focusable="false"
focused="false" scrollable="false"
long-clickable="false" password="false"
selected="false" bounds="[0,160][720,1379]">
<node index="0" text="" resource-id=""
class="android.view.View" package="ru.rshb.dbo"
content-desc="" checkable="false" checked="false"
clickable="false" enabled="true" focusable="false"
focused="false" scrollable="false"
long-clickable="false" password="false"
selected="false" bounds="[0,162][720,571]">
<node index="0" text="по счету 40817 .... 2077"
resource-id="" class="android.widget.TextView"
package="ru.rshb.dbo" content-desc=""
checkable="false" checked="false"
clickable="false" enabled="true"
focusable="false" focused="false"
scrollable="false" long-clickable="false"
password="false" selected="false"
bounds="[206,205][513,258]"/>
<node index="1"
text="Период с 02.06.2025 по 04.06.2025 More"
resource-id="" class="android.widget.Button"
package="ru.rshb.dbo" content-desc=""
checkable="false" checked="false"
clickable="true" enabled="true"
focusable="true" focused="false"
scrollable="false" long-clickable="false"
password="false" selected="false"
bounds="[0,295][720,391]"/>
<node index="2"
text="Подтвержденные Ожидающие обработки"
resource-id="" class="android.widget.Button"
package="ru.rshb.dbo" content-desc=""
checkable="false" checked="false"
clickable="true" enabled="true"
focusable="true" focused="false"
scrollable="false" long-clickable="false"
password="false" selected="false"
bounds="[0,383][720,477]"/>
<node index="3" text="" resource-id=""
class="android.widget.ListView"
package="ru.rshb.dbo" content-desc=""
checkable="false" checked="false"
clickable="false" enabled="true"
focusable="false" focused="false"
scrollable="false" long-clickable="false"
password="false" selected="false"
bounds="[0,475][720,475]"/>
<node index="4"
text="Операции с 02.06.2025 по 04.06.2025 отсутствуют"
resource-id="" class="android.widget.TextView"
package="ru.rshb.dbo" content-desc=""
checkable="false" checked="false"
clickable="false" enabled="true"
focusable="false" focused="false"
scrollable="false" long-clickable="false"
password="false" selected="false"
bounds="[0,475][720,569]"/>
</node>
</node>
</node>
<node index="2" text="" resource-id="" class="android.view.View"
package="ru.rshb.dbo" content-desc="" checkable="false"
checked="false" clickable="false" enabled="true"
focusable="false" focused="false" scrollable="false"
long-clickable="false" password="false" selected="false"
bounds="[575,1235][684,1343]">
<node index="0" text="Отправить" resource-id=""
class="android.widget.Button" package="ru.rshb.dbo"
content-desc="" checkable="false" checked="false"
clickable="true" enabled="true" focusable="true"
focused="false" scrollable="false"
long-clickable="false" password="false"
selected="false" bounds="[575,1235][684,1343]"/>
</node>
</node>
</node>
</node>
<node index="1" text="" resource-id="" class="android.view.View"
package="ru.rshb.dbo" content-desc="" checkable="false"
checked="false" clickable="false" enabled="true" focusable="false"
focused="false" scrollable="false" long-clickable="false"
password="false" selected="false" bounds="[0,1377][720,1439]">
<node index="0" text="" resource-id="" class="android.view.View"
package="ru.rshb.dbo" content-desc="" checkable="false"
checked="false" clickable="false" enabled="true" focusable="false"
focused="false" scrollable="false" long-clickable="false"
password="false" selected="false" bounds="[0,1377][720,1439]">
<node index="0" text="Главная" resource-id=""
class="android.widget.Button" package="ru.rshb.dbo"
content-desc="" checkable="false" checked="false"
clickable="true" enabled="true" focusable="false"
focused="false" scrollable="false" long-clickable="false"
password="false" selected="false"
bounds="[1,1377][148,1439]"/>
<node index="1" text="История" resource-id=""
class="android.widget.Button" package="ru.rshb.dbo"
content-desc="" checkable="false" checked="false"
clickable="true" enabled="true" focusable="false"
focused="false" scrollable="false" long-clickable="false"
password="false" selected="false"
bounds="[144,1377][290,1439]"/>
<node index="2" text="Своё" resource-id=""
class="android.widget.Button" package="ru.rshb.dbo"
content-desc="" checkable="false" checked="false"
clickable="true" enabled="true" focusable="false"
focused="false" scrollable="false" long-clickable="false"
password="false" selected="false"
bounds="[286,1377][433,1439]"/>
<node index="3" text="Платежи" resource-id=""
class="android.widget.Button" package="ru.rshb.dbo"
content-desc="" checkable="false" checked="false"
clickable="true" enabled="true" focusable="false"
focused="false" scrollable="false" long-clickable="false"
password="false" selected="false"
bounds="[429,1377][575,1439]"/>
<node index="4" text="Ещё" resource-id=""
class="android.widget.Button" package="ru.rshb.dbo"
content-desc="" checkable="false" checked="false"
clickable="true" enabled="true" focusable="false"
focused="false" scrollable="false" long-clickable="false"
password="false" selected="false"
bounds="[571,1377][718,1439]"/>
</node>
</node>
<node index="2" text="" resource-id="" class="android.view.View"
package="ru.rshb.dbo" content-desc="" checkable="false"
checked="false" clickable="false" enabled="true" focusable="false"
focused="false" scrollable="false" long-clickable="false"
password="false" selected="false" bounds="[0,0][0,0]">
<node index="0" text="" resource-id="" class="android.view.View"
package="ru.rshb.dbo" content-desc="" checkable="false"
checked="false" clickable="false" enabled="true" focusable="false"
focused="false" scrollable="false" long-clickable="false"
password="false" selected="false" bounds="[0,0][0,0]">
<node index="0" text="В банк" resource-id=""
class="android.widget.Button" package="ru.rshb.dbo"
content-desc="" checkable="false" checked="false"
clickable="true" enabled="true" focusable="false"
focused="false" scrollable="false" long-clickable="false"
password="false" selected="false" bounds="[0,0][0,0]"/>
<node index="1" text="Кабинет" resource-id=""
class="android.widget.Button" package="ru.rshb.dbo"
content-desc="" checkable="false" checked="false"
clickable="true" enabled="true" focusable="false"
focused="false" scrollable="false" long-clickable="false"
password="false" selected="false" bounds="[0,0][0,0]"/>
<node index="2" text="Продажи" resource-id=""
class="android.widget.Button" package="ru.rshb.dbo"
content-desc="" checkable="false" checked="false"
clickable="true" enabled="true" focusable="false"
focused="false" scrollable="false" long-clickable="false"
password="false" selected="false" bounds="[0,0][0,0]"/>
<node index="3" text="Налоги" resource-id=""
class="android.widget.Button" package="ru.rshb.dbo"
content-desc="" checkable="false" checked="false"
clickable="true" enabled="true" focusable="false"
focused="false" scrollable="false" long-clickable="false"
password="false" selected="false" bounds="[0,0][0,0]"/>
<node index="4" text="Профиль" resource-id=""
class="android.widget.Button" package="ru.rshb.dbo"
content-desc="" checkable="false" checked="false"
clickable="true" enabled="true" focusable="false"
focused="false" scrollable="false" long-clickable="false"
password="false" selected="false" bounds="[0,0][0,0]"/>
</node>
</node>
</node>
</node>
<node index="1" text="" resource-id="" class="android.widget.TextView"
package="ru.rshb.dbo" content-desc="" checkable="false" checked="false"
clickable="false" enabled="true" focusable="false" focused="false"
scrollable="false" long-clickable="false" password="false" selected="false"
bounds="[0,0][0,0]"/>
</node>
</node>
</node>
</node>
</node>
</node>
</node>
<node index="1" text="" resource-id="android:id/statusBarBackground" class="android.view.View"
package="ru.rshb.dbo" content-desc="" checkable="false" checked="false" clickable="false" enabled="true"
focusable="false" focused="false" scrollable="false" long-clickable="false" password="false"
selected="false" bounds="[0,0][720,82]"/>
<node index="2" text="" resource-id="android:id/navigationBarBackground" class="android.view.View"
package="ru.rshb.dbo" content-desc="" checkable="false" checked="false" clickable="false" enabled="true"
focusable="false" focused="false" scrollable="false" long-clickable="false" password="false"
selected="false" bounds="[0,0][0,0]"/>
</node>
</hierarchy>

Binary file not shown.