2024-11-22 23:26:42 +03:00
|
|
|
#include "outputdialog.h"
|
|
|
|
#include "check/check.h"
|
|
|
|
#include "output/output_options.h"
|
|
|
|
#include "ui_outputdialog.h"
|
|
|
|
#include <QFileDialog>
|
|
|
|
#include <QMainWindow>
|
|
|
|
#include <fstream>
|
|
|
|
#include <iostream>
|
|
|
|
#include "settings/settings.h"
|
|
|
|
#include "utils/utils.h"
|
|
|
|
|
|
|
|
OutputDialog::OutputDialog(QWidget *parent, Check &check)
|
|
|
|
: QDialog(parent), ui(new Ui::OutputDialog), check(check),
|
|
|
|
options(OutputOptions()) {
|
|
|
|
|
|
|
|
Settings settings(get_path_relative_to_home(".local/share/checks_parser/settings.json"));
|
|
|
|
|
|
|
|
ui->setupUi(this);
|
|
|
|
|
|
|
|
ui->tableWidget->item(0, 1)->setText(QString::fromStdString(settings.get_all_settings()["output_order"]["goods_name"]["name"]));
|
|
|
|
ui->tableWidget->item(0, 0)->setText(QString::number((int)settings.get_all_settings()["output_order"]["goods_name"]["position"]));
|
|
|
|
|
|
|
|
ui->tableWidget->item(1, 1)->setText(QString::fromStdString(settings.get_all_settings()["output_order"]["goods_price_per_unit"]["name"]));
|
|
|
|
ui->tableWidget->item(1, 0)->setText(QString::number((int)settings.get_all_settings()["output_order"]["goods_price_per_unit"]["position"]));
|
|
|
|
|
|
|
|
ui->tableWidget->item(2, 1)->setText(QString::fromStdString(settings.get_all_settings()["output_order"]["goods_quantity"]["name"]));
|
|
|
|
ui->tableWidget->item(2, 0)->setText(QString::number((int)settings.get_all_settings()["output_order"]["goods_quantity"]["position"]));
|
|
|
|
|
|
|
|
ui->tableWidget->item(3, 1)->setText(QString::fromStdString(settings.get_all_settings()["output_order"]["goods_net_weight"]["name"]));
|
|
|
|
ui->tableWidget->item(3, 0)->setText(QString::number((int)settings.get_all_settings()["output_order"]["goods_net_weight"]["position"]));
|
|
|
|
|
|
|
|
ui->tableWidget->item(4, 1)->setText(QString::fromStdString(settings.get_all_settings()["output_order"]["goods_total"]["name"]));
|
|
|
|
ui->tableWidget->item(4, 0)->setText(QString::number((int)settings.get_all_settings()["output_order"]["goods_total"]["position"]));
|
|
|
|
|
|
|
|
|
|
|
|
ui->printHeaderCheckBox->setChecked(settings.get_all_settings()["print_header"]);
|
|
|
|
ui->printTotalCheckBox->setChecked(settings.get_all_settings()["print_total"]);
|
|
|
|
}
|
|
|
|
|
|
|
|
OutputDialog::~OutputDialog() { delete ui; }
|
|
|
|
|
|
|
|
bool compare_position(Column &c1, Column &c2) {
|
|
|
|
return c1.position < c2.position;
|
|
|
|
}
|
|
|
|
|
|
|
|
void OutputDialog::on_buttonBox_accepted() {
|
|
|
|
std::ofstream output_file(this->options.get_path());
|
|
|
|
|
|
|
|
for (int i = 0; i < ui->tableWidget->rowCount(); i++) {
|
|
|
|
int position = ui->tableWidget->item(i, 0)->text().toInt();
|
|
|
|
std::string name = ui->tableWidget->item(i, 1)->text().toStdString();
|
|
|
|
|
|
|
|
std::cout << position << " " << name << std::endl;
|
|
|
|
|
|
|
|
Column c;
|
|
|
|
c.type = static_cast<ColumnType>(i);
|
|
|
|
c.position = position;
|
|
|
|
c.name = name;
|
|
|
|
|
|
|
|
this->options.add_or_update_column(c);
|
|
|
|
}
|
|
|
|
|
|
|
|
std::sort(this->options.get_columns().begin(),
|
|
|
|
this->options.get_columns().end(), compare_position);
|
|
|
|
|
|
|
|
if (options.get_print_header()) {
|
|
|
|
for (auto &column : this->options.get_columns()) {
|
|
|
|
output_file << column.name
|
|
|
|
<< (column.position == this->options.get_columns().size()
|
|
|
|
? ""
|
|
|
|
: ",");
|
|
|
|
}
|
|
|
|
output_file << std::endl;
|
|
|
|
}
|
|
|
|
|
|
|
|
for (auto goods : this->check.get_goods()) {
|
|
|
|
for (auto &column : this->options.get_columns()) {
|
|
|
|
switch (column.type) {
|
|
|
|
case ColumnType::goods_name:
|
2024-11-28 02:06:46 +03:00
|
|
|
output_file << goods.get_name();
|
2024-11-22 23:26:42 +03:00
|
|
|
break;
|
|
|
|
case ColumnType::goods_price_per_unit:
|
2024-11-28 02:06:46 +03:00
|
|
|
output_file << std::fixed << std::setprecision(2) << goods.get_price_per_unit();
|
2024-11-22 23:26:42 +03:00
|
|
|
break;
|
|
|
|
case ColumnType::goods_quantity:
|
2024-11-28 02:06:46 +03:00
|
|
|
output_file << std::fixed << std::setprecision(2) << goods.get_quantity();
|
2024-11-22 23:26:42 +03:00
|
|
|
break;
|
|
|
|
case ColumnType::goods_net_weight:
|
2024-11-28 02:06:46 +03:00
|
|
|
output_file << "TODO";
|
2024-11-22 23:26:42 +03:00
|
|
|
// TODO
|
|
|
|
break;
|
|
|
|
case ColumnType::goods_total:
|
2024-11-28 02:06:46 +03:00
|
|
|
output_file << std::fixed << std::setprecision(2) << goods.calculate_total_price();
|
2024-11-22 23:26:42 +03:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (column.position != this->options.get_columns().size()) {
|
2024-11-28 02:06:46 +03:00
|
|
|
output_file << ",";
|
2024-11-22 23:26:42 +03:00
|
|
|
} else {
|
2024-11-28 02:06:46 +03:00
|
|
|
output_file << "\n";
|
2024-11-22 23:26:42 +03:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (this->options.get_print_total()) {
|
2024-11-28 02:06:46 +03:00
|
|
|
output_file << "Total: " << std::fixed << std::setprecision(2) << check.calculae_total_price();
|
2024-11-22 23:26:42 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
output_file.close();
|
|
|
|
}
|
|
|
|
|
|
|
|
void update_settings(OutputOptions &options, ColumnType t, std::string name,
|
|
|
|
int value) {
|
|
|
|
Column column;
|
|
|
|
column.type = t;
|
|
|
|
column.name = name;
|
|
|
|
column.position = value;
|
|
|
|
|
|
|
|
if (value) {
|
|
|
|
options.add_or_update_column(column);
|
|
|
|
} else {
|
|
|
|
options.remove_column(t);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void OutputDialog::on_chooseFileButton_clicked() {
|
|
|
|
QString filename = QFileDialog::getSaveFileName();
|
|
|
|
this->options.set_path(filename.toStdString());
|
|
|
|
ui->pathLabel->setText("Path to export: " + filename);
|
|
|
|
}
|
|
|
|
|
|
|
|
void OutputDialog::on_printHeaderCheckBox_stateChanged(int value) {
|
|
|
|
this->options.set_print_header(value);
|
|
|
|
}
|
|
|
|
|
|
|
|
void OutputDialog::on_printTotalCheckBox_stateChanged(int value) {
|
|
|
|
this->options.set_print_total(value);
|
|
|
|
}
|