diff --git a/applog.cpp b/applog.cpp index f42fa0e..71cab21 100644 --- a/applog.cpp +++ b/applog.cpp @@ -1,9 +1,9 @@ #include "applog.h" +#include "models/slocalsettings.h" SAppLog::SAppLog() { - QDir appDataDir = QDir(QStandardPaths::writableLocation(QStandardPaths::ConfigLocation)); // C:/Users/user/AppData/Local - file.setFileName(appDataDir.path()+"/snap/snap.log"); + file.setFileName(SLocalSettings::appSettingsPath()+"/snap.log"); } QString SAppLog::filePath() diff --git a/appver.h b/appver.h index 6e55e63..e90a793 100644 --- a/appver.h +++ b/appver.h @@ -8,7 +8,7 @@ #define APP_MAJOR 0 #define APP_MINOR 0 #define APP_PATCH 0 -#define APP_COMMIT 280 +#define APP_COMMIT 281 #define FILE_VER APP_MAJOR,APP_MINOR,APP_PATCH,APP_COMMIT // обязательно запятые! #define PRODUCT_VER FILE_VER diff --git a/global.cpp b/global.cpp index 1348d71..83c635b 100644 --- a/global.cpp +++ b/global.cpp @@ -56,7 +56,7 @@ QString commonSpinBoxStyleSheetRed = "QSpinBox, QDoubleSpinBox { border: 1px so SStandardItemModel *rejectReasonModel = new SStandardItemModel; SStandardItemModel *priceColModel = new SStandardItemModel; SStandardItemModel *itemUnitsModel = new SStandardItemModel; -SAppLog *appLog = new SAppLog(); +SAppLog *appLog; SUserActivityModel *userActivityLog; SStandardItemModel *clientBinaryProperties; QSettings *debugOptions = nullptr; diff --git a/lang/snap_ru_RU.ts b/lang/snap_ru_RU.ts index e09fee2..7dfa789 100644 --- a/lang/snap_ru_RU.ts +++ b/lang/snap_ru_RU.ts @@ -2148,29 +2148,29 @@ - + Сумма ремонта не равна согласованной. Всё ОК? - + Ошибка - + Подтвердите правильность ввода данных - + Подтвердите выдачу - + Списание %1 за ремонт №%2 @@ -6034,7 +6034,7 @@ p, li { white-space: pre-wrap; } - + Печать @@ -6054,197 +6054,197 @@ p, li { white-space: pre-wrap; } - + Печать %1 - + Печать <%1> еще не реализована - + Информация - + Отправлено на печать - + new_rep квитанции - + pko ПКО - + reject акта отказа - + rko РКО - + sticker1 стикера - + sticker2 стикера - + sticker3 стикера - + rep_label стикера - + warranty гарантийного талона - + works акта выполненных работ - + diag акта диагностики - + pn ПН - + rn РН - + lost акта утери квитанции - + price1 ценника - + invoice0 счета - + invoice1 счета - + invoice2 счета - + invoice3 счета - + vatinvoice0 счета - + p_list0 товарной накладной - + w_list0 наряда - + new_cartridge квитанции - + sticker_cartridge стикера - + issue_cartridge акта (заправки) - + slip слип-чека - + move накладной перемещения - + buyout закупочного акта - + repairs списка ремонтов - + cartridges списка картриджей - + Печать квитанции к ремонту №%1 - + Печать стикеров к ремонту №%1 в кол-ве %2шт. - + Не удалось вызвать драйвер принтера - + Размер страницы отчета больше размера страницы принтера - + \(перенаправлено \d\) @@ -6342,17 +6342,17 @@ p, li { white-space: pre-wrap; } - + картридж - + Информация - + Нельзя принять картриджи разных клиентов вместе. @@ -6752,7 +6752,7 @@ p, li { white-space: pre-wrap; } - Готово + Готово к выдаче @@ -7577,7 +7577,7 @@ p, li { white-space: pre-wrap; } windowsDispatcher - + Login diff --git a/mainwindow.cpp b/mainwindow.cpp index 7e3aa4f..0a579af 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -486,11 +486,13 @@ void MainWindow::createTabRepairCartridges(QList *list) { tabRepairCartridges *subwindow = tabRepairCartridges::getInstance(list, this); if(ui->tabWidget->indexOf(subwindow) == -1) + { ui->tabWidget->addTab(subwindow, subwindow->tabTitle()); + QObject::connect(subwindow, &tabRepairCartridges::createTabClient, this, &MainWindow::createTabClient); + QObject::connect(subwindow, &tabRepairCartridges::createTabRepair, this, &MainWindow::createTabRepair); + } ui->tabWidget->setCurrentWidget(subwindow); - QObject::connect(subwindow, &tabRepairCartridges::createTabClient, this, &MainWindow::createTabClient); - QObject::connect(subwindow, &tabRepairCartridges::createTabRepair, this, &MainWindow::createTabRepair); } void MainWindow::createTabRepairNew() diff --git a/models/scomsettingstypes.h b/models/scomsettingstypes.h index 26c55f3..d003323 100644 --- a/models/scomsettingstypes.h +++ b/models/scomsettingstypes.h @@ -16,7 +16,7 @@ class t_status : public QSerializer QS_JSON_FIELD(QString, Color) QS_JSON_FIELD(QString, Terms) public: - int TermsSec; + qint64 TermsSec; QStringList ContainsStr; // данные в таком формате нужны для фильтрации в прокси-моделях QStringList ActionsStr; @@ -37,6 +37,9 @@ class t_status : public QSerializer TermsSec = statusTermDays*24*3600 + statusTermSecons; ContainsStr = toStringList(Contains); ActionsStr = toStringList(Actions); + + if(Color.isEmpty()) // для вновь созданного статуса, если не был выбран цвет, в БД записывается значение null + Color = "#00000000"; } private: QStringList toStringList(QList intList) diff --git a/models/stablerepairsmodel.cpp b/models/stablerepairsmodel.cpp index 6b79462..7e46877 100644 --- a/models/stablerepairsmodel.cpp +++ b/models/stablerepairsmodel.cpp @@ -17,7 +17,7 @@ QVariant STableRepairsModel::data(const QModelIndex &index, int role) const if (role == Qt::BackgroundRole) { if(index.column() == Columns::Status) - return QColor(comSettings->repairStatuses[QSqlQueryModel::data(index, Qt::DisplayRole).toInt()].Color); + return QColor(comSettings->repairStatuses[STableBaseModel::unformattedData(index, Qt::DisplayRole).toInt()].Color); QString rowColor = STableBaseModel::data(index.siblingAtColumn(Columns::Color)).toString(); if(!rowColor.isEmpty()) diff --git a/tabprintdialog.cpp b/tabprintdialog.cpp index db7ad31..037f5bf 100644 --- a/tabprintdialog.cpp +++ b/tabprintdialog.cpp @@ -75,6 +75,8 @@ tabPrintDialog *tabPrintDialog::create(Global::Reports type) bool tabPrintDialog::tabCloseRequest() { + if(m_reportState != ReportState::RenderingFinished) + return 0; return 1; } @@ -103,7 +105,7 @@ void tabPrintDialog::paintEvent(QPaintEvent *event) // При отображении вкладки предпросмотра событие PainEvent вызывается не менее трёх раз, но т. к. достоверно неизвестно // точное ли это число вызовов, таймер кажется более надёжным; при каждом вызове этого метода таймер перезапускается // а спустя заданную задержку после последнего вызова будет произведён запуск рендеринга. - if(!m_isReportInitialized) + if(m_reportState == ReportState::New) { renderDelayTimer->start(20); } @@ -113,7 +115,7 @@ bool tabPrintDialog::event(QEvent *ev) { bool ret = tabCommon::event(ev); - if(!m_isReportRendered) + if(m_reportState < ReportState::RenderingFinished) return ret; if(ev->type() == QEvent::ShowToParent) // при переключении на вкладку нужно установить фокус на виджет (например, при печати документа, нажатием Пробел можно быстро запустить печать и не делать лишних телодвижений мышью) @@ -163,7 +165,7 @@ void tabPrintDialog::notImplementedReport() void tabPrintDialog::initReport() { - m_isReportInitialized = 1; + m_reportState = ReportState::Initialized; QObject::connect(progressUpdateTimer, &QTimer::timeout, this, &tabPrintDialog::updateProgressWidget); progressUpdateTimer->start(250); @@ -185,7 +187,6 @@ void tabPrintDialog::initReport() setProgressText("Renderind report"); m_report->prepareReportPages(); - initPrinter(false); } void tabPrintDialog::showPreview() @@ -613,16 +614,17 @@ void tabPrintDialog::pageSetupAccepted() void tabPrintDialog::reportRenderStarted() { - m_isReportRendered = 0; + m_reportState = ReportState::RenderingInProcess; } void tabPrintDialog::reportRenderFinished() { - m_isReportRendered = 1; + m_reportState = ReportState::RenderingFinished; // эмуляция задержки // QTime dieTime= QTime::currentTime().addSecs(2); // while (QTime::currentTime() < dieTime) // QCoreApplication::processEvents(QEventLoop::AllEvents, 100); + initPrinter(false); selectPrinter(); diff --git a/tabprintdialog.h b/tabprintdialog.h index df09b9a..c963479 100644 --- a/tabprintdialog.h +++ b/tabprintdialog.h @@ -77,11 +77,11 @@ class tabPrintDialog : public tabCommon, public SReportsCommonFunctions protected: void paintEvent(QPaintEvent *event) override; private: + enum ReportState {New = 0, Initialized = 1, RenderingInProcess = 2, RenderingFinished = 3}; Ui::tabPrintDialog *ui; QPrinter *m_printer = nullptr; QStringList m_printersList; - bool m_isReportRendered = 0; - bool m_isReportInitialized = 0; + int m_reportState = ReportState::New; QLabel *m_progressWidget = nullptr; QString m_progressWidgetStaticText; LimeReport::PreviewReportWidget *m_previewWidget = nullptr; diff --git a/tabreceptcartridge.cpp b/tabreceptcartridge.cpp index bcba4df..1b19199 100644 --- a/tabreceptcartridge.cpp +++ b/tabreceptcartridge.cpp @@ -17,11 +17,6 @@ tabReceptCartridge::tabReceptCartridge(MainWindow *parent) : ui->setupUi(this); tabReceptCartridge::guiFontChanged(); - // установка белого фона только для scrollArea (не наследуется) - // https://qtcentre.org/threads/14099-How-to-stop-child-widgets-from-inheriting-parent-s-StyleSheet-and-use-system-default?p=73101#post73101 - ui->scrollAreaWidgetContents->setStyleSheet("#scrollAreaWidgetContents {\ - background-color: rgb(255, 255, 255);\ - }"); m_tableModel = new QStandardItemModel(); m_vendorsModel = new SSqlQueryModel(); m_cartridgesModel = new SSqlQueryModel(); @@ -86,6 +81,11 @@ void tabReceptCartridge::setFocusSerialNumber() void tabReceptCartridge::setDefaultStyleSheets() { + // установка фона только для scrollArea (не наследуется) + // https://qtcentre.org/threads/14099-How-to-stop-child-widgets-from-inheriting-parent-s-StyleSheet-and-use-system-default?p=73101#post73101 + ui->scrollAreaWidgetContents->setStyleSheet("#scrollAreaWidgetContents {\ + background-color: #FFFFFF;\ + }"); ui->comboBoxPresetEngineer->setStyleSheet(commonComboBoxStyleSheet); ui->comboBoxCompany->setStyleSheet(commonComboBoxStyleSheet); ui->comboBoxOffice->setStyleSheet(commonComboBoxStyleSheet); @@ -187,6 +187,14 @@ bool tabReceptCartridge::checkInput() error = qMax(error, ui->widgetClient->checkInput()); + if(existentForms().empty()) + { + ui->scrollAreaWidgetContents->setStyleSheet("#scrollAreaWidgetContents {\ + background-color: #FFD1D1;\ + }"); + error = 4; + } + if (error) { qDebug() << "Ошибка создания карточки(-ек) заправки: не заполнены общие обязательные поля (error " << error << ")"; diff --git a/tabrepaircartridges.cpp b/tabrepaircartridges.cpp index ad84181..1397058 100644 --- a/tabrepaircartridges.cpp +++ b/tabrepaircartridges.cpp @@ -112,12 +112,14 @@ void tabRepairCartridges::updateWidgets() m_readyButtonVisible = 0; m_issueButtonVisible = 1; bool formReady; + bool nEmpty = 0; if(comSettings->useSimplifiedCartridgeRepair) m_readyButtonVisible = 1; // кнопка видна только в упрощенном режиме работы с картриджами for(auto form : existentForms()) { + nEmpty = 1; formReady = form->isReady(); m_readyButtonVisible &= formReady; m_issueButtonVisible &= formReady; @@ -125,8 +127,8 @@ void tabRepairCartridges::updateWidgets() m_issueButtonVisible &= 0; client = form->clientId(); } - ui->buttonSetReadyToIssue->setVisible(m_readyButtonVisible); - ui->buttonIssue->setVisible(m_issueButtonVisible); + ui->buttonSetReadyToIssue->setVisible(m_readyButtonVisible && nEmpty); + ui->buttonIssue->setVisible(m_issueButtonVisible && nEmpty); } const QList tabRepairCartridges::existentForms() @@ -209,6 +211,9 @@ void tabRepairCartridges::createDialogIssue() list.append(form->model()); } + if(list.isEmpty()) + return; + m_dialogIssue = new SDialogIssueRepair(list, Qt::SplashScreen, this); connect(m_dialogIssue, &SDialogIssueRepair::printWorksLists, [=](){tabPrintDialog::printCartridgeWorksReports(list, false);}); connect(m_dialogIssue, &SDialogIssueRepair::issueSuccessfull, this, &tabRepairCartridges::closeTab); diff --git a/tabrepaircartridges.ui b/tabrepaircartridges.ui index 11d0a19..6d52996 100644 --- a/tabrepaircartridges.ui +++ b/tabrepaircartridges.ui @@ -203,7 +203,7 @@ Установить всем картритджам в скиске статус "Готово к выдаче" - Готово + Готово к выдаче diff --git a/tabrepairs.cpp b/tabrepairs.cpp index 65d998a..1ab6cdb 100644 --- a/tabrepairs.cpp +++ b/tabrepairs.cpp @@ -214,7 +214,7 @@ void tabRepairs::autorefreshTable() void tabRepairs::tableItemDoubleClick(QModelIndex item) { - int id = repairs_table->record(item.row()).value("id").toInt(); + int id = repairs_table->unformattedData(item.siblingAtColumn(STableRepairsModel::Columns::Id)).toInt(); if(!id) return; @@ -246,7 +246,7 @@ void tabRepairs::tableItemClick(QModelIndex index) searchStr = searchStr.replace("^", "\\^").replace("$", "\\$"); searchStr = searchStr.replace("?", "\\?").replace("\\", "\\\\"); } - ui->lineEditSearch->setText(searchStr); + ui->lineEditSearch->setText(searchStr.replace("\\\\","\\")); } } diff --git a/tabsale.cpp b/tabsale.cpp index ae1b1ae..cc582f7 100644 --- a/tabsale.cpp +++ b/tabsale.cpp @@ -326,7 +326,7 @@ bool tabSale::checkInput() if( !ui->checkBoxAnonymous->isChecked() ) { - if (ui->lineEditClientLastName->text() == "") // если не указана фамилия + if (ui->lineEditClientLastName->text() == "" && !clientModel->type()) // если не указана фамилия (обычный клиент; у юрика может быть пустым) { ui->lineEditClientLastName->setStyleSheet(commonLineEditStyleSheetRed); error = 1; diff --git a/widgets/scartridgeform.cpp b/widgets/scartridgeform.cpp index 8d4e8f2..68c4c8f 100644 --- a/widgets/scartridgeform.cpp +++ b/widgets/scartridgeform.cpp @@ -25,7 +25,7 @@ SCartridgeForm::SCartridgeForm(const int repairId, QWidget *parent) : { initWidgets(); } - catch (int) + catch (...) { m_repairId = 0; } diff --git a/widgets/sdialogissuerepair.cpp b/widgets/sdialogissuerepair.cpp index abf98d7..e908b5b 100644 --- a/widgets/sdialogissuerepair.cpp +++ b/widgets/sdialogissuerepair.cpp @@ -76,6 +76,12 @@ SDialogIssueRepair::SDialogIssueRepair(QList repairs, Qt::WindowF #ifdef QT_DEBUG // ui->checkBoxConfirmGetOut->setChecked(true); // ui->checkBoxPaymentCheckout->setChecked(true); +// if(ui->checkBoxSetReturnedInCredit->isVisible() && m_clientModel->balanceEnabled()) +// ui->checkBoxSetReturnedInCredit->setChecked(true); +// if(ui->checkBoxPaymentCheckout->isVisible() && ui->checkBoxPaymentCheckout->isEnabled()) +// ui->checkBoxPaymentCheckout->setChecked(true); +// if(ui->checkBoxConfirmGetOut->isVisible() && ui->checkBoxConfirmGetOut->isEnabled()) +// ui->checkBoxConfirmGetOut->setChecked(true); // buttonIssueClicked(); #endif } diff --git a/widgets/stableviewrepairsitemdelegates.cpp b/widgets/stableviewrepairsitemdelegates.cpp index d9bf985..7d1a40f 100644 --- a/widgets/stableviewrepairsitemdelegates.cpp +++ b/widgets/stableviewrepairsitemdelegates.cpp @@ -30,10 +30,10 @@ void STableViewRepairsItemDelegates::paintStatusProgressBar(QPainter *painter, c { uint progressStatus = 0; uint repairStatus = i_tableModel->unformattedData(index.siblingAtColumn(STableRepairsModel::Columns::Status)).toInt(); - uint statusTermSecons = comSettings->repairStatuses[repairStatus].TermsSec; + qint64 statusTermSecons = comSettings->repairStatuses[repairStatus].TermsSec; QDateTime statusChanged = i_tableModel->unformattedData(index.siblingAtColumn(STableRepairsModel::Columns::LastStatusChanged)).toDateTime(); statusChanged.setTimeZone(QTimeZone::utc()); - qint64 secondsSinceStatusChanged = statusChanged.secsTo(QDateTime::currentDateTimeUtc()); + qint64 secondsSinceStatusChanged = statusChanged.secsTo(QDateTime::currentDateTimeUtc()) + 1; if(statusTermSecons <= 0) // если термин статуса не задан, что шкала прогресса 100% statusTermSecons = secondsSinceStatusChanged; diff --git a/windowsdispatcher.cpp b/windowsdispatcher.cpp index bb617e0..fa9819e 100644 --- a/windowsdispatcher.cpp +++ b/windowsdispatcher.cpp @@ -12,6 +12,7 @@ windowsDispatcher::windowsDispatcher(QObject *parent) : setObjectName("windowsDispatcherObj"); debugInitSettings(); + appLog = new SAppLog(); appLog->appendRecord(QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss") + " Application start"); LoginWindow *windowLogin = new LoginWindow(this);