#include "shopform.h" #include "ui_shopform.h" #include "directsaleform.h" #include "temporaryreceiptsaveform.h" #include "receiptsaveform.h" #include "receiptloadform.h" #include "shopservice.h" #include "receiptgenerator.h" #include "paydialog.h" #include "paydvouchersdialog.h" #include "isellableservice.h" #include #include #include #include "shop-odb.hxx" ShopForm::ShopForm(QWidget *parent) : QWidget(parent), ui(new Ui::ShopForm) { ui->setupUi(this); m_itemsModel = NULL; m_commodityModel = NULL; ui->temporarySaveButton->setEnabled(false); ui->saveButton->setEnabled(false); ui->payButton->setEnabled(false); } ShopForm::~ShopForm() { delete ui; } void ShopForm::loadLast() { if (m_itemsModel == NULL) { m_itemsModel = new AutoTableModel(this); m_itemsModel->setEditableCols(QList() << 1); m_itemsModel->setTranslations(Context::instance().plugin("SHOP")->translations()); ui->actualReceipt->setModel(m_itemsModel); ui->actualReceipt->horizontalHeader()->setSectionResizeMode(0, QHeaderView::Stretch); } ShopService srv; QList > receipt = srv.all(QString("status = %1").arg(QString::number(Voucher::NEW))); if (!receipt.isEmpty()) { m_voucher = receipt[0]; srv.loadItems(m_voucher); m_itemsModel->setData(m_voucher->items()); connectItemSignals(); ui->total->setText(QString::number(m_voucher->totalPrice().toDouble(), 'f', 2)); ui->temporarySaveButton->setEnabled(true); ui->saveButton->setEnabled(true); ui->payButton->setEnabled(true); } if (m_commodityModel == NULL) { m_commodityModel = new AutoTableModel(this); ui->commodityTable->setModel(m_commodityModel); connect(ui->commodityTable->selectionModel(), &QItemSelectionModel::currentRowChanged, [this](const QModelIndex ¤t, const QModelIndex &){ ui->btnAddItem->setEnabled(current.isValid()); }); } m_commodityModel->setData(srv.allSellableItems()); } void ShopForm::fillRaceiptCombo() { bool oldState = ui->receiptCombo->blockSignals(true); ShopService srv; QList > receipts = srv.all(QString("status = %1").arg(QString::number(Voucher::TEMPORARY))); ui->receiptCombo->clear(); ui->receiptCombo->addItem(tr("<< empty >>")); foreach (QSharedPointer voucher, receipts) { ui->receiptCombo->addItem(voucher->name(), voucher->id()); } ui->receiptCombo->blockSignals(oldState); } void ShopForm::on_directSale_clicked() { if (m_voucher.isNull()) { createVoucher(); } DirectSaleForm *form = new DirectSaleForm(this); form->setAttribute(Qt::WA_DeleteOnClose); connect(form, &QDialog::accepted, [this, form](){ addItem(form->shopItem(), ((DirectSaleItem*)form->shopItem().data())->count()); }); form->show(); } void ShopForm::on_temporarySaveButton_clicked() { doTempSave(false); } void ShopForm::on_saveButton_clicked() { ReceiptSaveForm *form = new ReceiptSaveForm(m_voucher, this); form->setAttribute(Qt::WA_DeleteOnClose); connect(form, &QDialog::accepted, [this]() { ShopService srv; m_voucher->setStatus(Voucher::NOT_PAID); srv.saveVoucher(m_voucher); m_voucher = srv.createVoucher(); m_itemsModel->setData(m_voucher->items()); ui->total->setText("0"); }); form->show(); } void ShopForm::on_loadButton_clicked() { ReceiptLoadForm *form = new ReceiptLoadForm(this); form->setAttribute(Qt::WA_DeleteOnClose); form->show(); } void ShopForm::onCountChanged(int oldCount) { VoucherItem *item = qobject_cast(sender()); if (item != NULL && item->count() == 0) { for (int i = 0; i < m_voucher->items().count(); i++) { if (m_voucher->items()[i].data() == item) { m_voucher->removeItem(m_voucher->items()[i]); m_itemsModel->setData(m_voucher->items()); } } } ShopService srv; srv.calculate(m_voucher); ui->total->setText(QString::number(m_voucher->totalPrice().toDouble(), 'f', 2)); ui->temporarySaveButton->setEnabled(!m_voucher->items().isEmpty()); ui->saveButton->setEnabled(!m_voucher->items().isEmpty()); ui->payButton->setEnabled(!m_voucher->items().isEmpty()); if (m_voucher->status() == Voucher::NEW && m_voucher->id() == 0) { srv.saveVoucher(m_voucher); } else { srv.updateVoucher(m_voucher); } if (item != NULL) { int countAdded = item->count() - oldCount; srv.updateRelatedItem(item, countAdded); } } void ShopForm::createVoucher() { ShopService srv; m_voucher = srv.createVoucher(); } void ShopForm::doTempSave(bool comboChanged) { TemporaryReceiptSaveForm *form = new TemporaryReceiptSaveForm(m_voucher, this); form->setAttribute(Qt::WA_DeleteOnClose); connect(form, &QDialog::accepted, [this, form, comboChanged](){ ShopService srv; if (!m_voucher->items().isEmpty()) { m_voucher->setStatus(Voucher::TEMPORARY); srv.updateVoucher(m_voucher); } if (comboChanged && ui->receiptCombo->currentIndex() > 0) { changeReceipt(); } else { createEmptyVoucher(); } fillRaceiptCombo(); m_itemsModel->setData(m_voucher->items()); }); form->show(); } void ShopForm::changeReceipt() { ShopService srv; m_voucher = srv.loadById(ui->receiptCombo->currentData().toInt()); srv.loadItems(m_voucher); connectItemSignals(); m_voucher->setStatus(Voucher::NEW); srv.updateVoucher(m_voucher); m_itemsModel->setData(m_voucher->items()); ui->total->setText(m_voucher->totalPrice().toString()); ui->temporarySaveButton->setEnabled(true); ui->saveButton->setEnabled(true); ui->payButton->setEnabled(true); fillRaceiptCombo(); } void ShopForm::connectItemSignals() { foreach (QSharedPointer item, m_voucher->items()) { connect(item.data(), SIGNAL(countChanged(int)), this, SLOT(onCountChanged(int))); } } void ShopForm::createEmptyVoucher() { ShopService srv; m_voucher = srv.createVoucher(); ui->total->setText("0"); ui->temporarySaveButton->setEnabled(false); ui->saveButton->setEnabled(false); ui->payButton->setEnabled(false); } void ShopForm::addItem(QSharedPointer item, int count) { ShopService srv; srv.addShopItem(m_voucher, item, count); this->m_itemsModel->addRow(m_voucher->items()[m_voucher->items().count() - 1]); connect(m_voucher->items()[m_voucher->items().count() - 1].data(), SIGNAL(countChanged(int)), this, SLOT(onCountChanged(int))); onCountChanged(0); } void ShopForm::on_receiptCombo_currentIndexChanged(int) { if (!m_voucher.isNull() && m_voucher->items().isEmpty()) { ShopService srv; srv.erase(m_voucher); changeReceipt(); return; } if (m_voucher.isNull()) { changeReceipt(); } else { doTempSave(true); } } void ShopForm::on_payButton_clicked() { PayDialog *dialog = new PayDialog(m_voucher->totalPrice(), this); dialog->setAttribute(Qt::WA_DeleteOnClose); dialog->show(); connect(dialog, &QDialog::accepted, [this](){ ShopService srv; srv.pay(m_voucher); ReceiptGenerator generator; generator.setVoucher(m_voucher); generator.print(); createEmptyVoucher(); m_itemsModel->setData(m_voucher->items()); }); } void ShopForm::on_showPaiedButton_clicked() { PaydVouchersDialog *dialog = new PaydVouchersDialog(this); dialog->setAttribute(Qt::WA_DeleteOnClose); dialog->show(); } void ShopForm::on_btnAddItem_clicked() { if (m_voucher.isNull()) { createVoucher(); } ShopItemPtr item = m_commodityModel->itemFromIndex(ui->commodityTable->currentIndex()); addItem(item, ui->spnCount->value()); } void ShopForm::on_commoditySearch_textChanged(const QString &text) { QSortFilterProxyModel proxy; proxy.setSourceModel(m_commodityModel); proxy.setFilterKeyColumn(0); proxy.setFilterFixedString(text); auto moveToIndex = [this](const QModelIndex &matchingIndex) { ui->commodityTable->scrollTo(matchingIndex,QAbstractItemView::EnsureVisible); ui->commodityTable->setCurrentIndex(matchingIndex); }; QModelIndex matchingIndex = proxy.mapToSource(proxy.index(0,0)); if(matchingIndex.isValid()) { moveToIndex(matchingIndex); } else { proxy.setFilterKeyColumn(1); matchingIndex = proxy.mapToSource(proxy.index(0,0)); if (matchingIndex.isValid()) { moveToIndex(matchingIndex); } } }