diff --git a/database/app_data.db b/database/app_data.db index 4f56ff3..d89002d 100644 Binary files a/database/app_data.db and b/database/app_data.db differ diff --git a/database/dao/AccountDAO.cpp b/database/dao/AccountDAO.cpp index 432c0bb..593051d 100644 --- a/database/dao/AccountDAO.cpp +++ b/database/dao/AccountDAO.cpp @@ -2,7 +2,7 @@ #include #include "AccountDAO.h" -#include "AccountInfo.h" +#include "db/AccountInfo.h" #include "DatabaseManager.h" bool AccountDAO::upsertAccount(const AccountInfo &info) { diff --git a/database/dao/AccountDAO.h b/database/dao/AccountDAO.h index 4489258..69c98bc 100644 --- a/database/dao/AccountDAO.h +++ b/database/dao/AccountDAO.h @@ -1,5 +1,5 @@ #pragma once -#include "AccountInfo.h" +#include "db/AccountInfo.h" class AccountDAO { public: diff --git a/database/dao/DeviceDAO.cpp b/database/dao/DeviceDAO.cpp index c22a1fe..264985d 100644 --- a/database/dao/DeviceDAO.cpp +++ b/database/dao/DeviceDAO.cpp @@ -2,7 +2,7 @@ #include #include "DeviceDAO.h" #include "DatabaseManager.h" -#include "DeviceInfo.h" +#include "db/DeviceInfo.h" QList DeviceDAO::getAllDevices() { QList devices; diff --git a/database/dao/DeviceDAO.h b/database/dao/DeviceDAO.h index b9b664c..a4dbf49 100644 --- a/database/dao/DeviceDAO.h +++ b/database/dao/DeviceDAO.h @@ -1,6 +1,6 @@ #pragma once -#include +#include class DeviceDAO { public: diff --git a/database/dao/TransactionDAO.h b/database/dao/TransactionDAO.h index f75067e..f8b5d36 100644 --- a/database/dao/TransactionDAO.h +++ b/database/dao/TransactionDAO.h @@ -1,5 +1,5 @@ #pragma once -#include "TransactionInfo.h" +#include "db/TransactionInfo.h" class TransactionDAO { public: diff --git a/main.cpp b/main.cpp index 5b626fc..397de9e 100644 --- a/main.cpp +++ b/main.cpp @@ -4,6 +4,7 @@ #include "database/DatabaseManager.h" #include "database/dao/CommonDataDAO.h" +#include "db/AccountInfoScreener.h" #include "services/DeviceScreener.h" void setupWorkerAndThread(QCoreApplication& app) { @@ -40,39 +41,19 @@ void setupWorkerAndThread(QCoreApplication& app) { int main(int argc, char *argv[]) { QApplication app(argc, argv); + QList cards = AccountInfoScreener::parseCardData(QByteArray()); + qDebug() << "Cards data: " << cards.length(); - // Setup worker and thread - setupWorkerAndThread(app); - - const QDateTime current = QDateTime::currentDateTimeUtc(); - qDebug() << "Обновление lastScan:" << CommonDataDAO::updateLastScan(current); - - const QDateTime savedTime = CommonDataDAO::getLastScan(); - qDebug() << "Сохранившееся время:" << savedTime.toString(); - + // setupWorkerAndThread(app); // - // // tesseract, tesseract-lang - // QImage image("./images/img.png"); - // if (image.isNull()) { - // qDebug() << "Cant load the image"; - // return -1; - // } + // const QDateTime current = QDateTime::currentDateTimeUtc(); + // qDebug() << "Обновление lastScan:" << CommonDataDAO::updateLastScan(current); // - // image = image.convertToFormat(QImage::Format_Grayscale8); + // const QDateTime savedTime = CommonDataDAO::getLastScan(); + // qDebug() << "Сохранившееся время:" << savedTime.toString(); // - // tesseract::TessBaseAPI tess; - // if (tess.Init(nullptr, "rus")) { - // qDebug() << "Ошибка инициализации Tesseract с русским языком...."; - // return -1; - // } // - // tess.SetImage(image.bits(), image.width(), image.height(), 1, image.bytesPerLine()); - // - // QString result = QString::fromUtf8(tess.GetUTF8Text()); - // qDebug() << "Распознанный текст:" << result; - - - MainWindow window; - window.show(); + // MainWindow window; + // window.show(); return app.exec(); } diff --git a/models/android/Card.h b/models/android/Card.h new file mode 100644 index 0000000..a780afc --- /dev/null +++ b/models/android/Card.h @@ -0,0 +1,14 @@ +#pragma once + +#include + +struct Card { + QString name; + QString description; + double amount; + + [[nodiscard]] QString toString() const { + return QString("Number: %1 | Type: %2 | Amount: %3") + .arg(name, description, QString::number(amount, 'f', 2)); + } +}; diff --git a/models/AccountInfo.h b/models/db/AccountInfo.h similarity index 100% rename from models/AccountInfo.h rename to models/db/AccountInfo.h diff --git a/models/DeviceInfo.h b/models/db/DeviceInfo.h similarity index 100% rename from models/DeviceInfo.h rename to models/db/DeviceInfo.h diff --git a/models/TransactionInfo.h b/models/db/TransactionInfo.h similarity index 100% rename from models/TransactionInfo.h rename to models/db/TransactionInfo.h diff --git a/services/DeviceScreener.cpp b/services/DeviceScreener.cpp index 2cd6d72..9c1053a 100644 --- a/services/DeviceScreener.cpp +++ b/services/DeviceScreener.cpp @@ -7,7 +7,7 @@ #include #include #include -#include +#include DeviceScreener::DeviceScreener(QObject *parent) : QObject(parent) { } diff --git a/services/DeviceScreener.h b/services/DeviceScreener.h index 903ced3..c35e41a 100644 --- a/services/DeviceScreener.h +++ b/services/DeviceScreener.h @@ -1,7 +1,7 @@ #pragma once #include #include -#include +#include class DeviceScreener final : public QObject { Q_OBJECT diff --git a/services/db/AccountInfoScreener.cpp b/services/db/AccountInfoScreener.cpp new file mode 100644 index 0000000..e548a5b --- /dev/null +++ b/services/db/AccountInfoScreener.cpp @@ -0,0 +1,56 @@ +#include "AccountInfoScreener.h" +#include +#include +#include +#include + +#include "android/Card.h" +#include "tesseract/baseapi.h" + +QList AccountInfoScreener::parseCardData(const QByteArray &imageData) { + QList cards; + // QImage image; + // if (!image.loadFromData(imageData)) { + // return {}; + // } + // image = image.convertToFormat(QImage::Format_Grayscale8); + + QImage image("./images/img.png"); + if (image.isNull()) { + return {}; + } + + // важная часть, без нее не парсит + image = image.convertToFormat(QImage::Format_Grayscale8); + + tesseract::TessBaseAPI tess; + if (tess.Init(nullptr, "rus")) { + qDebug() << "Ошибка инициализации Tesseract с русским языком...."; + } + + tess.SetImage(image.bits(), image.width(), image.height(), 1, image.bytesPerLine()); + + const QString result = QString::fromUtf8(tess.GetUTF8Text()); + qDebug() << "Распознанный текст:" << result; + + + const QRegularExpression re(R"((дебетовая(?:, цифровая)?),\s*\*(\d{4})\s+([\d]+\.\d{2})\s*Р)", + QRegularExpression::CaseInsensitiveOption); + + QRegularExpressionMatchIterator i = re.globalMatch(result); + + while (i.hasNext()) { + auto card = Card(); + bool ok; + QRegularExpressionMatch match = i.next(); + const double amount = match.captured(3).toDouble(&ok); + if (ok) { + card.amount = amount; + card.name = match.captured(2); + card.description = match.captured(1); + cards.append(card); + } + } + + return cards; +} diff --git a/services/db/AccountInfoScreener.h b/services/db/AccountInfoScreener.h new file mode 100644 index 0000000..9022bbc --- /dev/null +++ b/services/db/AccountInfoScreener.h @@ -0,0 +1,8 @@ +#pragma once + +#include "android/Card.h" + +class AccountInfoScreener { +public: + [[nodiscard]] static QList parseCardData(const QByteArray &imageData); +}; diff --git a/views/DeviceWidget.h b/views/DeviceWidget.h index 2a5d0c8..e2d983f 100644 --- a/views/DeviceWidget.h +++ b/views/DeviceWidget.h @@ -1,6 +1,6 @@ #pragma once #include -#include "DeviceInfo.h" +#include "db/DeviceInfo.h" class DeviceWidget final : public QWidget { Q_OBJECT diff --git a/views/MainWindow.cpp b/views/MainWindow.cpp index 083efbf..d808c5e 100644 --- a/views/MainWindow.cpp +++ b/views/MainWindow.cpp @@ -3,7 +3,7 @@ #include #include -#include "DeviceInfo.h" +#include "db/DeviceInfo.h" #include "DeviceWidget.h" #include "dao/DeviceDAO.h" #include "widget/FlowLayout.h" diff --git a/views/MainWindow.h b/views/MainWindow.h index 9d43a82..29205d5 100644 --- a/views/MainWindow.h +++ b/views/MainWindow.h @@ -2,7 +2,7 @@ #include #include #include -#include "DeviceInfo.h" +#include "db/DeviceInfo.h" #include "widget/FlowLayout.h" class MainWindow final : public QMainWindow {