200 lines
6.2 KiB
C++
200 lines
6.2 KiB
C++
#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 <iostream>
|
|
#include <QFileDialog>
|
|
#include <QMessageBox>
|
|
#include "image/checkimage.h"
|
|
#include "utils/utils.h"
|
|
#include <opencv2/objdetect.hpp>
|
|
#include <opencv2/imgcodecs.hpp>
|
|
#include <opencv2/highgui/highgui.hpp>
|
|
#include <opencv2/imgproc/imgproc.hpp>
|
|
#include <zbar.h>
|
|
|
|
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<std::string> 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);
|
|
}
|
|
|
|
|
|
|
|
#ifdef DEBUG
|
|
for (auto module : parser.search_modules()) {
|
|
std::cout << "Module: " << module << std::endl;
|
|
}
|
|
#endif
|
|
}
|
|
|
|
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("Captcha was not solved correctly!");
|
|
infoDialog.setIcon(QMessageBox::Critical);
|
|
infoDialog.setWindowTitle("Captcha is incorrect");
|
|
infoDialog.exec();
|
|
break;
|
|
} else if (!strcmp(e.what(), "Does not exist")) {
|
|
QMessageBox infoDialog;
|
|
infoDialog.setText("Check not found. Please, ensure correctness of entered data.");
|
|
infoDialog.setIcon(QMessageBox::Critical);
|
|
infoDialog.setWindowTitle("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<Goods> c = parser.parse(check_plaintext);
|
|
|
|
if (c.size() == 0) {
|
|
std::cerr << "An error has occured. Check was matched incorrectly. Vector sizes are different" << std::endl;
|
|
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();
|
|
|
|
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<std::string> 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();
|
|
|
|
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));
|
|
}
|
|
|