#include "mainwindow.h" #include "./ui_mainwindow.h" #include "check/check.h" #include "exceptions/ofdrequestexception.h" #include "goods/goods.h" #include "outputdialog.h" #include "adjustpicturedialog.h" #include "settingsdialog.h" #include "solvecaptchadialog.h" #include #include #include "image/checkimage.h" #include "utils/utils.h" #include #include #include #include #include MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); this->setupStoresList(); } MainWindow::~MainWindow() { delete ui; } void MainWindow::setupStoresList() { parser = *(new Parser()); std::vector modules_names = parser.search_modules(); for (std::string name : modules_names) { StoreModule m(name); std::wstring module_name = m.get_name(); QString s = QString::fromStdWString(module_name); ui->storeType->addItem(s); } } std::string MainWindow::makeRequestToOfd(std::string captcha) { std::string checkContent = Net().fetch_check_data_from_ofdru( ui->fn_edit->text().toStdString(), ui->fd_edit->text().toStdString(), ui->fi_edit->text().toStdString(), ui->dateTimeEdit->dateTime().toString(Qt::ISODate).toStdString(), ui->fundIncomeCombo->currentIndex() + 1, // In the request to ofd.ru, total is in a strange format, like a string of a format where 2 last digits represent decimal part of a number. ui->total_edit->text().toDouble() * 100, captcha); return checkContent; } void MainWindow::on_parseButton_clicked() { QString s; switch (ui->tabWidget->currentIndex()) { case 0: s = ui->checkContent->toPlainText(); break; case 1: s = ui->checkContentFromImage->toPlainText(); break; case 2: Net().get_captcha_from_ofdru(); std::string solved_captcha = ""; bool success = true; bool is_captcha_solved = true; do { SolveCaptchaDialog dialog = SolveCaptchaDialog(this, &solved_captcha); dialog.exec(); is_captcha_solved = true; try { std::string check_content = makeRequestToOfd(solved_captcha); check = parseOfdRuAnswer(check_content); } catch(OfdRequestException e) { success = false; if (!strcmp(e.what(), "Incorrect captcha")) { is_captcha_solved = false; QMessageBox infoDialog; infoDialog.setText(tr("Captcha was not solved correctly!")); infoDialog.setIcon(QMessageBox::Critical); infoDialog.setWindowTitle(tr("Captcha is incorrect")); infoDialog.exec(); break; } else if (!strcmp(e.what(), "Internal server error")) { QMessageBox infoDialog; infoDialog.setText(tr("Internal server error. Please, try again later.")); infoDialog.setIcon(QMessageBox::Critical); infoDialog.setWindowTitle(tr("Internal server error")); infoDialog.exec(); return; } else if (!strcmp(e.what(), "Does not exist")) { QMessageBox infoDialog; infoDialog.setText(tr("Check not found. Please, ensure correctness of entered data.")); infoDialog.setIcon(QMessageBox::Critical); infoDialog.setWindowTitle(tr("Check was not found")); infoDialog.exec(); return; } } } while (!is_captcha_solved); if (success) { OutputDialog d = OutputDialog(this, check); d.exec(); } return; } std::wstring check_plaintext = s.toStdWString(); parser.set_module(parser.search_modules()[0]); std::vector c = parser.parse(check_plaintext); if (c.size() == 0) { QMessageBox infoDialog; infoDialog.setText(tr("An error has occured. Check was matched incorrectly. Vector sizes are different. Please, contact the developer.")); infoDialog.setIcon(QMessageBox::Critical); infoDialog.setWindowTitle(tr("Error in parsing")); infoDialog.exec(); return; } for (auto& g : c) { check.add_goods(g); } OutputDialog d = OutputDialog(this, check); d.show(); d.exec(); } void MainWindow::on_storeType_currentIndexChanged(int index) { std::string module = parser.search_modules()[index]; parser.set_module(module); } void MainWindow::on_preferencesButton_clicked() { SettingsDialog s = SettingsDialog(); s.show(); s.exec(); } void MainWindow::on_chooseImageButton_ofd_clicked() { QString filename = QFileDialog::getOpenFileName(); if (filename == "") { QMessageBox infoDialog; infoDialog.setText(tr("Please, select a picture where QR code that contains info about check is present")); infoDialog.setIcon(QMessageBox::Critical); infoDialog.setWindowTitle(tr("Picture was not selected")); infoDialog.exec(); return; } std::string new_text = "Selected: " + filename.toStdString(); ui->pathLabel_ofd->setText(QString::fromStdString(new_text)); AdjustPictureDialog dialog = AdjustPictureDialog(this, filename.toStdString()); connect(&dialog, &AdjustPictureDialog::decodedData, this, &MainWindow::onDecodedData); dialog.exec(); ui->picture_ofd->setPixmap(QPixmap(filename)); ui->picture_ofd->setScaledContents(true); } void MainWindow::onDecodedData(std::string data) { std::string delimiter = "&"; std::vector dataSplit = split(data, delimiter); std::cout << data << std::endl; ui->fn_edit->setText(QString::fromStdString(dataSplit[2])); ui->fd_edit->setText(QString::fromStdString(dataSplit[3])); ui->fi_edit->setText(QString::fromStdString(dataSplit[4])); QString extractedDateTime = QString::fromStdString(split(dataSplit[0], "=")[1]); QDateTime datetime = QDateTime::fromString(extractedDateTime, "yyyyMMddThhmm"); ui->dateTimeEdit->setDateTime(datetime); int type = std::stoi(split(dataSplit[5], "=")[1]); ui->fundIncomeCombo->setCurrentIndex(type - 1); std::string total = split(dataSplit[1], "=")[1]; ui->total_edit->setText(QString::fromStdString(total)); } void MainWindow::on_chooseImageButton_ocr_clicked() { QString filename = QFileDialog::getOpenFileName(); if (filename == "") { QMessageBox infoDialog; infoDialog.setText(tr("Please, select a picture to scan")); infoDialog.setIcon(QMessageBox::Critical); infoDialog.setWindowTitle(tr("Picture was not selected")); infoDialog.exec(); return; } std::string new_text = "Selected: " + filename.toStdString(); ui->pathLabel_ocr->setText(QString::fromStdString(new_text)); CheckImage i(filename.toStdString()); std::string parsed = i.parse_text(); ui->picture_ocr->setPixmap(QPixmap(filename)); ui->picture_ocr->setScaledContents(true); ui->checkContentFromImage->setPlainText(QString::fromStdString(parsed)); }