#include "outputdialog.h" #include "check/check.h" #include "output/output_options.h" #include "ui_outputdialog.h" #include #include #include #include #include #include #include #include "settings/settings.h" #include "utils/utils.h" #include OutputDialog::OutputDialog(QWidget *parent, std::vector *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; OutputColumnModel *model = new OutputColumnModel(&(*columns), this); ui->listView->setModel(model); const std::map 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; } }