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:
parent
ea986addb7
commit
c4f171259b
@ -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
|
|
||||||
*/
|
|
||||||
|
|||||||
@ -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"([^\dточка])"));
|
||||||
|
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) {
|
||||||
|
|||||||
@ -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();
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
BIN
assets/rshb/card_report_complete.png
Normal file
BIN
assets/rshb/card_report_complete.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 215 KiB |
430
assets/rshb/card_report_complete.xml
Normal file
430
assets/rshb/card_report_complete.xml
Normal 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>
|
||||||
BIN
assets/rshb/card_report_complete_0.png
Normal file
BIN
assets/rshb/card_report_complete_0.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 248 KiB |
1068
assets/rshb/card_report_complete_0.xml
Normal file
1068
assets/rshb/card_report_complete_0.xml
Normal file
File diff suppressed because it is too large
Load Diff
BIN
assets/rshb/card_screen_actions.png
Normal file
BIN
assets/rshb/card_screen_actions.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 185 KiB |
869
assets/rshb/card_screen_actions.xml
Normal file
869
assets/rshb/card_screen_actions.xml
Normal 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.
@ -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;
|
||||||
|
}
|
||||||
|
|||||||
@ -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
|
||||||
|
);
|
||||||
};
|
};
|
||||||
|
|||||||
@ -13,7 +13,7 @@ QDateTime DateUtils::getUtcNow() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
QDateTime DateUtils::fromUtcString(const QString ×tamp) {
|
QDateTime DateUtils::fromUtcString(const QString ×tamp) {
|
||||||
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 ×tamp) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
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");
|
||||||
}
|
}
|
||||||
|
|||||||
37
main.cpp
37
main.cpp
@ -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 << "]";
|
||||||
|
|
||||||
// Создаем второй поток после завершения первого
|
// Создаем второй поток после завершения первого
|
||||||
|
|||||||
@ -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)
|
|
||||||
);
|
);
|
||||||
Loading…
Reference in New Issue
Block a user