checks-parser/outputdialog.cpp

139 lines
4.9 KiB
C++

#include "outputdialog.h"
#include "check/check.h"
#include "output/output_options.h"
#include "ui_outputdialog.h"
#include <QFileDialog>
#include <QLineEdit>
#include <QMainWindow>
#include <QStandardItemModel>
#include <fstream>
#include <outputcolumn.h>
#include <outputcolumnmodel.h>
#include "settings/settings.h"
#include "utils/utils.h"
#include <map>
OutputDialog::OutputDialog(QWidget *parent, std::vector<Check> *checks)
: QDialog(parent), ui(new Ui::OutputDialog), checks(checks),
options(OutputOptions()) {
Settings settings(get_path_relative_to_home(".local/share/checks_parser/settings.json"));
ui->setupUi(this);
columns = new std::vector<OutputColumn>;
OutputColumnModel *model = new OutputColumnModel(&(*columns), this);
ui->listView->setModel(model);
const std::map<std::string, ColumnType> column_names = {
{"date", ColumnType::date},
{"goods_name", ColumnType::goods_name},
{"goods_price_per_unit", ColumnType::goods_price_per_unit},
{"goods_quantity", ColumnType::goods_quantity},
{"goods_net_weight", ColumnType::goods_net_weight},
{"goods_total", ColumnType::goods_total}
};
for (unsigned short i = 0; i < 6; i ++)
columns->push_back(OutputColumn(tr("Кто здесь?"), ColumnType::date));
for (auto &column : column_names) {
std::string name = settings.get_all_settings()["output_order"][column.first]["name"];
unsigned short position = settings.get_all_settings()["output_order"][column.first]["position"];
ColumnType type = column.second;
columns->at(position - 1) = (OutputColumn(QString::fromStdString(name), type));
}
ui->printHeaderCheckBox->setChecked(settings.get_all_settings()["print_header"]);
ui->printTotalCheckBox->setChecked(settings.get_all_settings()["print_total"]);
}
OutputDialog::~OutputDialog() { delete ui; }
void OutputDialog::on_buttonBox_accepted() {
std::ofstream output_file(this->options.get_path());
print_header(&output_file);
for (Check &check : *checks) {
int row_number = 0;
for (auto it = check.get_goods().begin(); it != check.get_goods().end(); it++, row_number++) {
for (int i = 0; i < columns->size(); i ++) {
OutputColumn &column = columns->at(i);
switch (column.get_column_type()) {
case ColumnType::date:
if (row_number == 0) output_file << check.get_date();
break;
case ColumnType::goods_name:
output_file << it->get_name();
break;
case ColumnType::goods_price_per_unit:
output_file << std::fixed << std::setprecision(2) << it->get_price_per_unit();
break;
case ColumnType::goods_quantity:
output_file << std::fixed << std::setprecision(2) << it->get_quantity();
break;
case ColumnType::goods_net_weight:
output_file << it->get_net_weight();
break;
case ColumnType::goods_total:
output_file << std::fixed << std::setprecision(2) << it->calculate_total_price();
break;
}
if (i < columns->size() - 1) {
output_file << ",";
} else {
output_file << "\n";
}
}
}
if (this->options.get_print_total()) {
output_file << "Total: " << std::fixed << std::setprecision(2) << check.calculae_total_price() << std::endl;
}
}
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);
}
void OutputDialog::print_header(std::ofstream *output_file) {
if (options.get_print_header()) {
for (unsigned int i = 0; i < columns->size(); i ++) {
OutputColumn column = columns->at(i);
(*output_file) << column.get_text().toStdString()
<< (i == columns->size() - 1
? ""
: ",");
}
*output_file << std::endl;
}
}