1
0
forked from BRT/arc

Fix default timestamp and add card report asset

Corrected the default timestamp value in multiple database schemas to ensure proper functionality and consistent formatting. Added a new asset file for the card report layout to support UI rendering for card transactions.
This commit is contained in:
slava 2025-05-10 19:42:14 +07:00
parent ea986addb7
commit c4f171259b
15 changed files with 2752 additions and 122 deletions

View File

@ -137,9 +137,6 @@ bool GetLastDaysHistoryScript::openAndSaveDitailInfo(TransactionInfo &transactio
void GetLastDaysHistoryScript::doStart() { void GetLastDaysHistoryScript::doStart() {
// берем все транзакции из БД // берем все транзакции из БД
QList<TransactionInfo> localTransactions = TransactionDAO::getTransactionsWithinHours(m_account.id, 48); QList<TransactionInfo> localTransactions = TransactionDAO::getTransactionsWithinHours(m_account.id, 48);
// for (const TransactionInfo& transaction: transactions) {
// qDebug().noquote().nospace() << convertTransactionToString(transaction);
// }
const DeviceInfo device = DeviceDAO::getDeviceById(m_account.deviceId); const DeviceInfo device = DeviceDAO::getDeviceById(m_account.deviceId);
xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(m_account.deviceId, ++m_counter)); xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(m_account.deviceId, ++m_counter));
@ -149,124 +146,202 @@ void GetLastDaysHistoryScript::doStart() {
findAndTapOnAccount(device.id, m_account.lastNumbers); findAndTapOnAccount(device.id, m_account.lastNumbers);
xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(m_account.deviceId, ++m_counter)); xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(m_account.deviceId, ++m_counter));
Node filterBtn = xmlScreenParser.findButtonNode("РСХБ Онлайн", false); Node actionBtn = xmlScreenParser.findButtonNode("Действия", false);
if (!filterBtn.isEmpty()) { if (!actionBtn.isEmpty()) {
AdbUtils::makeTap(m_account.deviceId, filterBtn.x(), filterBtn.y()); AdbUtils::makeTap(m_account.deviceId, actionBtn.x(), actionBtn.y());
QThread::msleep(1000); QThread::msleep(200);
} else { } else {
qWarning() << "--- filterBtn not found"; qWarning() << "--- actionBtn not found";
}
Node reportButton = swipeToButton(m_account.deviceId, "Выписка", m_counter, device.screenWidth,
device.screenHeight);
if (!reportButton.isEmpty()) {
AdbUtils::makeTap(m_account.deviceId, reportButton.x(), reportButton.y());
QThread::msleep(1000);
} }
xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(m_account.deviceId, ++m_counter)); xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(m_account.deviceId, ++m_counter));
Node allTransactionFilerBtn = xmlScreenParser.findButtonNode("Все операции", false);
if (!allTransactionFilerBtn.isEmpty()) {
AdbUtils::makeTap(m_account.deviceId, allTransactionFilerBtn.x(), allTransactionFilerBtn.y());
QThread::msleep(1000);
} else {
qWarning() << "--- allTransactionFilerBtn not found";
}
QList<TransactionInfo> parsedTransactions; Node reportTitle = xmlScreenParser.findTextNode("Выписка");
xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(m_account.deviceId, ++m_counter)); if (!reportTitle.isEmpty() && reportTitle.y() < 300) {
QDate beforeYesterday = DateUtils::getMoscowNow().date().addDays(-2);
QString beforeYesterdayTitle = beforeYesterday.toString("dd.MM.yyyy");
for (int i = 0; i < 5; ++i) { for (int i = 0; i < 5; ++i) {
parsedTransactions = xmlScreenParser.parseTodayAndYesterdayHistory(); Node byDayTitle = xmlScreenParser.findTextNode(beforeYesterdayTitle);
if (!parsedTransactions.empty()) { if (!byDayTitle.isEmpty()) {
qWarning() << "--- beforeYesterdayTitle found!";
break; break;
} }
AdbUtils::makeSwipe(
m_account.deviceId,
device.screenWidth / 2, device.screenHeight / 4 * 3,
device.screenWidth / 2, device.screenHeight / 4
);
QThread::msleep(1000); QThread::msleep(1000);
xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(m_account.deviceId, ++m_counter)); xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(m_account.deviceId, ++m_counter));
} }
} else {
qWarning() << "--- reportTitle not found";
}
// все поддвержденные
QList<TransactionInfo> parsedTransactions = xmlScreenParser.parseTodayAndYesterdayReportHistory();
QSet<int> parsedTransactionIds;
qDebug() << "--- parsedTransactions: " << parsedTransactions.length(); qDebug() << "--- parsedTransactions: " << parsedTransactions.length();
// localTransactions qDebug() << "--- localTransactions: " << localTransactions.length();
QList<TransactionInfo> updatedTransactions; for (const TransactionInfo &transaction: parsedTransactions) {
for (TransactionInfo &transaction: parsedTransactions) { bool updated = false;
// если shortDescription + сумма + день и Complete совпадает и одна
int cSimilar = countSimilar(transaction, parsedTransactions);
QList<TransactionInfo> txs = findSavedTransaction(localTransactions, transaction);
if (cSimilar == 1 && txs.length() < 2) { for (const TransactionInfo &saved: localTransactions) {
if (txs.length() == 1) { if (parsedTransactionIds.contains(saved.id)) {
// смотрим, надо ли обновление continue;
if (txs[0].status != TransactionStatus::Complete || txs[0].shortDescription.isEmpty()) { }
txs[0].shortDescription = transaction.shortDescription; QDate sDate = QDateTime::fromString(saved.bankTime, "dd.MM.yyyy HH:mm:ss").date();
openAndSaveDitailInfo(txs[0], device.screenWidth, device.screenHeight); if (!sDate.isValid()) {
updatedTransactions.append(txs[0]); 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) {
if (transaction.description.startsWith("Перевод")) {
// Перевод по номеру
if (saved.bankName == transaction.bankName && saved.phone == transaction.phone) {
parsedTransactionIds.insert(saved.id);
updated = true;
if (saved.status != TransactionStatus::Complete || saved.description.isEmpty()) {
if (!TransactionDAO::updateTransaction(
saved.id,
TransactionStatus::Complete,
saved.description,
transaction.description
)) {
qDebug().noquote().nospace() << "--- updated+phone failed" <<
convertTransactionToString(transaction);;
}
}
break;
} }
} else { } else {
// создаем новую // перевод по карте
openAndSaveDitailInfo(transaction, device.screenWidth, device.screenHeight); // перезаписать saved.description -> updatedDescription если не равны
if (!saved.description.isEmpty()) {
if (saved.description == transaction.description) {
// описания совпадают
if (saved.status != TransactionStatus::Complete) {
if (!TransactionDAO::updateTransaction(
saved.id,
TransactionStatus::Complete,
saved.description,
transaction.description
)) {
qDebug().noquote().nospace() << "--- updated+card[description same] failed"
<<
convertTransactionToString(transaction);;
} }
}
parsedTransactionIds.insert(saved.id);
updated = true;
break;
} else { } else {
if (cSimilar == txs.length()) { // описания не совпадают, то пробуем найти такое же, если не находим то это новая
// одинаковые транзакции (2 - 2) bool findWithSameName = false;
for (TransactionInfo &tx: txs) { for (const TransactionInfo &saved2: localTransactions) {
if (!updatedTransactions.contains(tx)) { if (saved2.description == transaction.description && !parsedTransactionIds.
openAndSaveDitailInfo(tx, device.screenWidth, device.screenHeight); contains(
updatedTransactions.append(tx); saved2.id)) {
// мы нашли с одинаковым описанием и еще не обработанную
if (saved2.status != TransactionStatus::Complete) {
if (!TransactionDAO::updateTransaction(
saved2.id,
TransactionStatus::Complete,
saved2.description,
transaction.description
)) {
qDebug().noquote().nospace() <<
"--- updated+card2[description same] failed"
<<
convertTransactionToString(transaction);;
}
}
parsedTransactionIds.insert(saved2.id);
updated = true;
findWithSameName = true;
break; break;
} }
} }
} else if (cSimilar < txs.length()) { if (!findWithSameName) {
// Дубликаты транзакций или название изменилось (1 - 2) // обновляем описание
qDebug() << "--- Дубликаты транзакций или название изменилось (1 - 2)!!!!!!!!!!!!"; if (!TransactionDAO::updateTransaction(
// FIXME alert!!! saved.id,
TransactionStatus::Complete,
saved.description,
transaction.description
)) {
qDebug().noquote().nospace() <<
"--- updated+card2+new desc[description same] failed" <<
convertTransactionToString(transaction);;
}
}
parsedTransactionIds.insert(saved.id);
updated = true;
break;
}
} else { } else {
// нужно создать новую транзакцию, которой не было (2 - 1) // пустой описание
bool updated = false; if (!TransactionDAO::updateTransaction(
for (TransactionInfo &tx: txs) { saved.id,
if (!updatedTransactions.contains(tx)) { TransactionStatus::Complete,
openAndSaveDitailInfo(tx, device.screenWidth, device.screenHeight); saved.description,
updatedTransactions.append(tx); transaction.description
)) {
qDebug().noquote().nospace() <<
"--- updated+card[empty description]" <<
convertTransactionToString(transaction);;
}
parsedTransactionIds.insert(saved.id);
updated = true; updated = true;
break; break;
} }
} }
if (!updated) {
// создаем новую, так как у нас появилась одинаковая транзакция
openAndSaveDitailInfo(transaction, device.screenWidth, device.screenHeight);
} }
} }
if (!updated) {
qDebug() << "--- insert: " << transaction.description;
// не нашлась транзакция
TransactionInfo tr;
tr.accountId = m_account.id;
tr.description = transaction.description;
tr.bankTime = transaction.bankTime;
tr.bankName = transaction.bankName;
tr.amount = transaction.amount;
tr.phone = transaction.phone;
tr.updateTime = DateUtils::getUtcNow();
tr.fee = transaction.fee;
tr.name = transaction.name;
tr.trExternalId = transaction.trExternalId;
tr.status = TransactionStatus::Complete;
tr.type = transaction.description.startsWith("Перевод")
? TransactionType::Phone
: TransactionType::Card;
tr.completeTime = DateUtils::getUtcNow();
if (TransactionDAO::insertTransaction(tr) == -1) {
qDebug() << "--- not inserted: " << transaction.description;
}
} }
xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(m_account.deviceId, ++m_counter)); // Если это перевод
// Если совпадает по сумме + телефон + банк дата (без времени) + банк
// Если по карте, мы знаем ток дату + сумма
} }
// сначала обработаем
} }
} else { } else {
qDebug() << "--- home screen not found"; qDebug() << "--- home screen not found";
} }
} }
/**
amount: -250
shortDescription: Перевод Надежда Юрьевна К** в Сбербанк через СБП, по номеру телефона +7964181514...
bankTime: 08.05.2025
amount: -305
shortDescription: Перевод Надежда Юрьевна К** в Альфа-Банк через СБП, по номеру телефона +79641815...
bankTime: 08.05.2025
amount: -250
shortDescription: Перевод Надежда Юрьевна К** в Альфа-Банк через СБП, по номеру телефона +79641815...
bankTime: 07.05.2025
amount: -250
shortDescription: Перевод Надежда Юрьевна К** в Сбербанк через СБП, по номеру телефона +7964181514...
bankTime: 07.05.2025
amount: -250
shortDescription: Перевод Надежда Юрьевна К** в Альфа-Банк через СБП, по номеру телефона +79641815...
bankTime: 07.05.2025
amount: 2100
shortDescription: Перевод через СБП от Надежда Юрьевна К (+7(964)-181-51-46) из Альфа-Банк на 4081...
bankTime: 07.05.2025
amount: 250
shortDescription: Перевод через СБП от Надежда Юрьевна К (+7(964)-181-51-46) из Сбербанк на 408178...
bankTime: 07.05.2025
*/

View File

@ -300,6 +300,23 @@ bool hasTimeComponent(const QString &datetimeStr) {
return dt.time() != QTime(0, 0, 0); // Проверка, что время не равно 00:00:00 return dt.time() != QTime(0, 0, 0); // Проверка, что время не равно 00:00:00
} }
QString transformBankDateTime(const QString &date) {
QDateTime dt;
if (date.contains(",")) {
// 10.05.2025, 15:03
dt = QDateTime::fromString(date, "dd.MM.yyyy, HH:mm");
} else {
dt = QDateTime::fromString(date, "dd.MM.yyyy HH:mm:ss");
}
if (!dt.isValid()) {
dt = QDateTime::fromString(date, "dd.MM.yyyy HH:mm");
}
if (!dt.isValid()) {
return date; // не распарсили
}
return dt.toString("dd.MM.yyyy HH:mm:ss");
}
void parseTransferInfo(const QString &text, TransactionInfo &info) { void parseTransferInfo(const QString &text, TransactionInfo &info) {
if (const auto m = reSender.match(text); m.hasMatch()) { if (const auto m = reSender.match(text); m.hasMatch()) {
info.name = m.captured(1).trimmed(); info.name = m.captured(1).trimmed();
@ -330,9 +347,9 @@ void parseTransferInfo(const QString &text, TransactionInfo &info) {
if (const auto m = reDate.match(text); m.hasMatch()) { if (const auto m = reDate.match(text); m.hasMatch()) {
const QString date = m.captured(1); const QString date = m.captured(1);
// если не пустая и дата у нас с 00:00 // если не пустая и дата у нас с 00:00
if (hasTimeComponent(date)) { // if (hasTimeComponent(date)) {
info.bankTime = date; info.bankTime = transformBankDateTime(date);
} // }
} }
} }
@ -491,6 +508,103 @@ QString beforeAmount(const QString &text) {
return text; // если не найдено — вернуть всю строку return text; // если не найдено — вернуть всю строку
} }
double parseAmount(const QString &amountAsString) {
QString numberString = amountAsString;
numberString.remove(QRegularExpression(R"([^\очка])"));
numberString.replace("точка", ".");
double amount = numberString.toDouble();
if (amountAsString.startsWith("-")) {
amount *= -1;
}
return amount;
}
QDomElement findElementWithListView(const QDomElement &parent) {
QDomElement element = parent.firstChildElement();
while (!element.isNull()) {
QDomElement child = element.firstChildElement();
while (!child.isNull()) {
if (child.hasAttribute("class") && child.attribute("class") == "android.widget.ListView") {
return child;
}
child = child.nextSiblingElement();
}
QDomElement found = findElementWithListView(element);
if (!found.isNull()) {
return found;
}
element = element.nextSiblingElement();
}
return {};
}
QList<TransactionInfo> ScreenXmlParser::parseTodayAndYesterdayReportHistory() {
QList<TransactionInfo> transactions;
QDomElement child = findElementWithListView(m_xml);
QDomNodeList listView = findElementWithListView(m_xml).childNodes();
qDebug() << listView.count();
if (!listView.isEmpty()) {
QString date;
for (QDomNode node: listView) {
if (node.hasChildNodes()) {
QString text;
if (node.childNodes().count() > 1) {
date = node.firstChildElement().attribute("text");
text = node.lastChildElement().attribute("text");
} else if (node.childNodes().count() == 1) {
text = node.firstChildElement().attribute("text");
}
TransactionInfo transaction;
if (text.startsWith("Перевод")) {
QRegularExpression re(R"([+-] \d{1,3}(?: \d{3})* точка \d{2} Рубль$)");
QRegularExpressionMatch match = re.match(text);
if (match.hasMatch()) {
QString amount = match.captured(0);
transaction.amount = parseAmount(amount.trimmed());
text.chop(amount.length());
}
transaction.description = text.trimmed();
parseTransferInfo(text, transaction);
if (transaction.bankTime.isEmpty()) {
transaction.bankTime = transformBankDateTime(date);
}
} else {
// карта
if (text.contains("без учета комиссии")) {
QRegularExpression re(R"( без учета комиссии -\d{1,3}(?: \d{3})* точка \d{2} Рубль$)");
QRegularExpressionMatch match = re.match(text);
if (match.hasMatch()) {
QString fee = match.captured(0);
text.chop(fee.length());
transaction.fee = parseAmount(fee.replace("без учета комиссии", "").trimmed());
}
}
QRegularExpression re(R"([+-] \d{1,3}(?: \d{3})* точка \d{2} Рубль$)");
QRegularExpressionMatch match = re.match(text);
if (match.hasMatch()) {
QString amount = match.captured(0);
transaction.amount = parseAmount(amount.trimmed());
text.chop(amount.length());
}
transaction.description = text.trimmed();
if (transaction.bankTime.isEmpty()) {
transaction.bankTime = transformBankDateTime(date);
}
}
transactions.append(transaction);
}
}
} else {
qDebug() << "ListView is empty";
}
return transactions;
}
QList<TransactionInfo> ScreenXmlParser::parseTodayAndYesterdayHistory() { QList<TransactionInfo> ScreenXmlParser::parseTodayAndYesterdayHistory() {
QDate today = DateUtils::getMoscowNow().date(); QDate today = DateUtils::getMoscowNow().date();
QDate yesterday = today.addDays(-1); QDate yesterday = today.addDays(-1);
@ -668,7 +782,7 @@ TransactionInfo parseExpandedInfoHistory(const QDomElement &root) {
switch (QDomElement e = info.toElement(); e.attribute("index").toInt()) { switch (QDomElement e = info.toElement(); e.attribute("index").toInt()) {
case 2: case 2:
// Дата операции // Дата операции
transaction.bankTime = findSubInfo(e, "1"); transaction.bankTime = transformBankDateTime(findSubInfo(e, "1"));
break; break;
case 5: case 5:
transaction.description = findSubInfo(e, "1"); transaction.description = findSubInfo(e, "1");
@ -732,7 +846,7 @@ TransactionInfo parseExpandedInfo(const QDomElement &root) {
QDomElement ee; QDomElement ee;
switch (index.toInt()) { switch (index.toInt()) {
case 3: case 3:
transaction.bankTime = findSubInfo(infoElement, "1"); transaction.bankTime = transformBankDateTime(findSubInfo(infoElement, "1"));
break; break;
case 4: case 4:
ee = findSubElement(infoElement, "0"); ee = findSubElement(infoElement, "0");
@ -786,7 +900,6 @@ TransactionInfo ScreenXmlParser::parseTransactionInfo(int screenWidth, int scree
} }
QList<QPair<AccountInfo, Node> > ScreenXmlParser::parseAccountsInfo() { QList<QPair<AccountInfo, Node> > ScreenXmlParser::parseAccountsInfo() {
QList<QPair<AccountInfo, Node> > accounts; QList<QPair<AccountInfo, Node> > accounts;
for (const Node &node: m_nodes) { for (const Node &node: m_nodes) {

View File

@ -38,6 +38,8 @@ public:
TransactionInfo parseTransactionInfoHistory(int screenWidth, int screenHeight); TransactionInfo parseTransactionInfoHistory(int screenWidth, int screenHeight);
TransactionInfo parseTransactionInfo(int screenWidth, int screenHeight); TransactionInfo parseTransactionInfo(int screenWidth, int screenHeight);
QList<TransactionInfo> parseTodayAndYesterdayReportHistory();
QList<TransactionInfo> parseTodayAndYesterdayHistory(); QList<TransactionInfo> parseTodayAndYesterdayHistory();

Binary file not shown.

After

Width:  |  Height:  |  Size: 215 KiB

View File

@ -0,0 +1,430 @@
<?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="true"
focused="false" scrollable="true"
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,1439]">
<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="Период с 08.05.2025 по 10.05.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,473][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,473][720,798]">
<node index="0" text="09.05.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="[28,473][691,517]"/>
<node index="1"
text="Перевод через СБП от Надежда Юрьевна К (+7(964)-181-51-46) из Сбербанк на 40817810328000022077 . Идентификатор операции в СБП С2С A5129141229250080000030011500701 , Дата операции 09.05.2025 17:12:29 Статус перевода Исполнен + 655 точка 00 Рубль"
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="[28,533][691,779]"/>
</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,794][720,1017]">
<node index="0" text="08.05.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="[28,794][691,837]"/>
<node index="1"
text="Перевод Надежда Юрьевна К** в Сбербанк через СБП, по номеру телефона +79641815146, ID перевода 448627512, дата 08.05.2025 - 250 точка 00 Рубль"
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="[28,854][691,995]"/>
</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,1012][720,1193]">
<node index="0"
text="Перевод Надежда Юрьевна К** в Альфа-Банк через СБП, по номеру телефона +79641815146, ID перевода 448628517, дата 08.05.2025 - 305 точка 00 Рубль"
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="[28,1030][691,1173]"/>
</node>
<node index="3" 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,1188][720,1370]">
<node index="0"
text="Перевод Надежда Юрьевна К** в Сбербанк через СБП, по номеру телефона +79641815146, ID перевода 448713642, дата 08.05.2025 - 405 точка 00 Рубль"
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="[28,1208][691,1349]"/>
</node>
<node index="4" 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,1366][720,1439]">
<node index="0"
text="Перевод Надежда Юрьевна К** в Альфа-Банк через СБП, по номеру телефона +79641815146, ID перевода 448716504, дата 08.05.2025 - 310 точка 00 Рубль"
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="[28,1385][691,1439]"/>
</node>
</node>
</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.

After

Width:  |  Height:  |  Size: 248 KiB

File diff suppressed because it is too large Load Diff

Binary file not shown.

After

Width:  |  Height:  |  Size: 185 KiB

View File

@ -0,0 +1,869 @@
<?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][350,173]"/>
<node index="2" 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="[699,89][712,157]"/>
</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="true" focused="false" scrollable="true"
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,588]">
<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,588]">
<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.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][80,588]">
<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,237][24,588]">
<node index="0" 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,82][258,382]"/>
<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 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="160"
resource-id="aft-operationHistory-money"
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 index="1" text="точка 00"
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 index="2" 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 index="3" 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 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 index="2" 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 index="3" text="** 5264"
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 NAF="true" index="4" 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,0][0,0]"/>
<node index="5" 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 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,162][720,588]">
<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="[54,237][665,588]">
<node index="0" 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="[296,82][720,382]"/>
<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,443][423,860]"/>
<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="[99,277][620,550]">
<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="[99,312][620,368]">
<node index="0" text="2 095"
resource-id="aft-operationHistory-money"
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="[99,312][215,367]"/>
<node index="1" text="точка 00"
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="[211,312][277,367]"/>
<node index="2" 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="[286,312][315,367]"/>
<node index="3" 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="[311,312][371,368]"/>
</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="[99,380][620,421]"/>
<node index="2" 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="[99,419][620,458]"/>
<node index="3" text="** 7183"
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="[99,517][620,550]"/>
<node NAF="true" index="4" 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="[571,277][620,322]"/>
<node index="5" 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="[541,524][639,550]"/>
</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="[54,172][665,211]"/>
</node>
</node>
<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="true"
focused="false" scrollable="false"
long-clickable="false" password="false"
selected="false" bounds="[78,622][268,773]"/>
<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="[264,622][455,773]"/>
<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="true"
focused="false" scrollable="false"
long-clickable="false" password="false"
selected="false" bounds="[451,622][641,773]"/>
<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="true"
focused="false" scrollable="false"
long-clickable="false" password="false"
selected="false" bounds="[30,788][352,880]"/>
<node index="5" 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="[367,788][691,880]"/>
<node index="6" 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,880][720,1439]">
<node index="0" 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="[30,880][691,959]"/>
<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="true" focused="false"
scrollable="false" long-clickable="false"
password="false" selected="false"
bounds="[30,957][691,1072]"/>
<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="[30,1070][691,1184]"/>
<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="true" focused="false"
scrollable="false" long-clickable="false"
password="false" selected="false"
bounds="[30,1180][691,1295]"/>
<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="[30,1293][691,1409]"/>
<node index="5" 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="[30,1405][691,1439]"/>
<node index="6" 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="7" text="Снятие наличных по QR-коду"
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,0][0,0]"/>
<node index="8" 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="9" 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,0][0,0]"/>
<node index="10" 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="11" 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="12" 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="13" 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 index="14" 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="15" 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="16"
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,0][0,0]"/>
<node index="17" 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>
<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.

View File

@ -292,3 +292,46 @@ QList<TransactionInfo> TransactionDAO::getTransactionsWithinHours(const int acco
} }
return list; return list;
} }
bool TransactionDAO::updateTransaction(
const int id,
const TransactionStatus status,
const QString &oldDesc,
const QString &newDesc
) {
QSqlQuery query(DatabaseManager::instance().database());
query.prepare(R"(
UPDATE transactions SET
status = :status,
update_time = :update_time,
complete_time = :complete_time,
description = :description,
updated_description = :updated_description
WHERE id = :id
)");
query.bindValue(":id", id);
query.bindValue(":status", transactionStatusToString(status));
query.bindValue(":update_time", DateUtils::toUtcString(DateUtils::getUtcNow()));
if (oldDesc.isEmpty() || oldDesc != newDesc) {
query.bindValue(":description", newDesc);
query.bindValue(":updated_description", oldDesc);
} else {
query.bindValue(":description", newDesc);
query.bindValue(":updated_description", "");
}
if (status == TransactionStatus::Complete) {
query.bindValue(":complete_time", DateUtils::toUtcString(DateUtils::getUtcNow()));
} else {
query.bindValue(":complete_time", QVariant(QMetaType(QMetaType::QString)));
}
if (!query.exec()) {
qWarning() << "Ошибка при обновлении transaction:" << query.lastError().text();
return false;
}
return true;
}

View File

@ -19,4 +19,10 @@ public:
[[nodiscard]] static TransactionInfo getTransactionById(int id); [[nodiscard]] static TransactionInfo getTransactionById(int id);
[[nodiscard]] static QList<TransactionInfo> getTransactionsWithinHours(int accountId, int hours); [[nodiscard]] static QList<TransactionInfo> getTransactionsWithinHours(int accountId, int hours);
[[nodiscard]] static bool updateTransaction(
int id, TransactionStatus status,
const QString &oldDesc,
const QString &newDesc
);
}; };

View File

@ -13,7 +13,7 @@ QDateTime DateUtils::getUtcNow() {
} }
QDateTime DateUtils::fromUtcString(const QString &timestamp) { QDateTime DateUtils::fromUtcString(const QString &timestamp) {
QDateTime dateTime = QDateTime::fromString(timestamp, "dd.MM.yyyy HH:mm:ss"); QDateTime dateTime = QDateTime::fromString(timestamp, "yyyy-MM-dd HH:mm:ss");
if (dateTime.isValid()) { if (dateTime.isValid()) {
dateTime.setTimeZone(QTimeZone::utc()); dateTime.setTimeZone(QTimeZone::utc());
} }
@ -21,5 +21,5 @@ QDateTime DateUtils::fromUtcString(const QString &timestamp) {
} }
QString DateUtils::toUtcString(const QDateTime &dateTime) { QString DateUtils::toUtcString(const QDateTime &dateTime) {
return dateTime.toString("dd.MM.yyyy HH:mm:ss"); return dateTime.toString("yyyy-MM-dd HH:mm:ss");
} }

View File

@ -49,6 +49,25 @@ void setupWorkerAndThread(QCoreApplication &app) {
thread->start(); thread->start();
} }
void setupWorkerAndThreadHistory(QCoreApplication &app) {
const QString appName = "rshb";
const QString cardNumber = "2200380317107183";
AccountInfo account = AccountDAO::findAppAccount(appName, cardNumber);
auto *thread = new QThread;
auto *deviceScreenerWorker = new GetLastDaysHistoryScript(account);
deviceScreenerWorker->moveToThread(thread);
QObject::connect(thread, &QThread::started, deviceScreenerWorker, &GetLastDaysHistoryScript::start);
QObject::connect(deviceScreenerWorker, &GetLastDaysHistoryScript::finished, thread, &QThread::quit);
QObject::connect(deviceScreenerWorker, &GetLastDaysHistoryScript::finished, deviceScreenerWorker, &QObject::deleteLater);
QObject::connect(thread, &QThread::finished, thread, &QThread::deleteLater);
QObject::connect(&app, &QCoreApplication::aboutToQuit, [=]() {
deviceScreenerWorker->stop();
});
thread->start();
}
void setupScriptAutoPaymentAndThread(QCoreApplication &app) { void setupScriptAutoPaymentAndThread(QCoreApplication &app) {
const QString appName = "rshb"; const QString appName = "rshb";
const QString cardNumber = "2200380317107183"; const QString cardNumber = "2200380317107183";
@ -56,15 +75,21 @@ void setupScriptAutoPaymentAndThread(QCoreApplication &app) {
const QString phoneNumber = "79641815146"; const QString phoneNumber = "79641815146";
const QString bankName = "Альфа-Банк"; const QString bankName = "Альфа-Банк";
// const QString bankName = "Сбербанк"; // const QString bankName = "Сбербанк";
const double amount = 310; const double amount = 440;
AccountInfo account = AccountDAO::findAppAccount(appName, cardNumber); const AccountInfo account = AccountDAO::findAppAccount(appName, cardNumber);
if (account.id != -1) { if (account.id != -1) {
// Функция для подключения потоков к завершению приложения // Функция для подключения потоков к завершению приложения
auto connectStopOnQuit = [&](QObject *worker, QThread *thread) { auto connectStopOnQuit = [&](QObject *worker, QThread *thread) {
QObject::connect(&app, &QCoreApplication::aboutToQuit, worker, &QObject::deleteLater); QObject::connect(&app, &QCoreApplication::aboutToQuit, [=]() {
QObject::connect(&app, &QCoreApplication::aboutToQuit, thread, &QThread::quit); if (thread->isRunning()) {
QObject::connect(&app, &QCoreApplication::aboutToQuit, thread, &QThread::deleteLater); qDebug() << "Завершаем поток:" << thread;
thread->quit();
thread->wait(); // Ожидаем завершения потока
}
worker->deleteLater();
thread->deleteLater();
});
}; };
// Первый поток // Первый поток
@ -79,7 +104,7 @@ void setupScriptAutoPaymentAndThread(QCoreApplication &app) {
QObject::connect(thread, &QThread::finished, thread, &QThread::deleteLater); QObject::connect(thread, &QThread::finished, thread, &QThread::deleteLater);
// Обработка результата первого потока // Обработка результата первого потока
QObject::connect(scriptWorker, &PayByPhoneScript::finishedWithResult, &app, [&](const QString &result) { QObject::connect(scriptWorker, &PayByPhoneScript::finishedWithResult, &app, [account, connectStopOnQuit](const QString &result) {
qDebug() << "Получен результат: [" << result << "]"; qDebug() << "Получен результат: [" << result << "]";
// Создаем второй поток после завершения первого // Создаем второй поток после завершения первого

View File

@ -66,7 +66,6 @@ CREATE TABLE IF NOT EXISTS transactions
update_time DATETIME, update_time DATETIME,
complete_time DATETIME, complete_time DATETIME,
timestamp DATETIME DEFAULT (strftime('%d.%m.%Y %H:%M:%S', 'now')), timestamp DATETIME DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (account_id) REFERENCES accounts (id) ON DELETE CASCADE, FOREIGN KEY (account_id) REFERENCES accounts (id) ON DELETE CASCADE
UNIQUE (amount, timestamp)
); );