Compare commits

...

14 Commits

66 changed files with 1048 additions and 320 deletions
+2
View File
@@ -14,6 +14,7 @@ find_package(Qt6 COMPONENTS
Core Core
Gui Gui
Widgets Widgets
Qml
REQUIRED) REQUIRED)
add_library(addressbook SHARED add_library(addressbook SHARED
@@ -42,6 +43,7 @@ target_link_libraries(addressbook
Qt::Core Qt::Core
Qt::Gui Qt::Gui
Qt::Widgets Qt::Widgets
Qt::Qml
qdecimal qdecimal
decnumber decnumber
QxOrm QxOrm
+11 -2
View File
@@ -13,6 +13,7 @@ find_package(Qt6 COMPONENTS
Gui Gui
Widgets Widgets
Sql Sql
Qml
REQUIRED) REQUIRED)
include_directories(../core) include_directories(../core)
@@ -27,12 +28,20 @@ add_executable(prodejna
logindialog.ui logindialog.ui
mainwindow.cpp mainwindow.cpp
mainwindow.h mainwindow.h
mainwindow.ui) mainwindow.ui
shop.rc
)
target_link_libraries(prodejna target_link_libraries(prodejna
Qt::Core Qt::Core
Qt::Gui Qt::Gui
Qt::Widgets Qt::Widgets
Qt::Sql Qt::Sql
Qt::Qml
core core
) )
if(CMAKE_BUILD_TYPE STREQUAL "Release")
set_property(TARGET prodejna PROPERTY WIN32_EXECUTABLE true)
endif()
+1 -1
View File
@@ -256,5 +256,5 @@ void MainWindow::on_actionAbout_Qt_triggered()
void MainWindow::on_actionAbout_triggered() void MainWindow::on_actionAbout_triggered()
{ {
QMessageBox::about(this, tr("About prodejna"), tr("Modular cash register software under GPL license.\n(C) 2015 - 2017 Josef Rokos, Zdenek Jonák")); QMessageBox::about(this, tr("About prodejna"), tr("Modular cash register software under GPL license.\n(C) 2015 - 2023 Josef Rokos, Zdenek Jonák"));
} }
+3 -3
View File
@@ -117,9 +117,9 @@
</spacer> </spacer>
</item> </item>
<item row="2" column="0"> <item row="2" column="0">
<widget class="QLabel" name="label_2"> <widget class="QLabel" name="labelVersion">
<property name="text"> <property name="text">
<string>Prodejna 2.0</string> <string>Prodejna 3.0</string>
</property> </property>
<property name="alignment"> <property name="alignment">
<set>Qt::AlignCenter</set> <set>Qt::AlignCenter</set>
@@ -137,7 +137,7 @@
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>1000</width> <width>1000</width>
<height>42</height> <height>21</height>
</rect> </rect>
</property> </property>
<widget class="QMenu" name="menuFile"> <widget class="QMenu" name="menuFile">
+2
View File
@@ -14,6 +14,7 @@ find_package(Qt6 COMPONENTS
Core Core
Gui Gui
Widgets Widgets
Qml
REQUIRED) REQUIRED)
add_library(camp SHARED add_library(camp SHARED
@@ -70,6 +71,7 @@ target_link_libraries(camp
Qt::Core Qt::Core
Qt::Gui Qt::Gui
Qt::Widgets Qt::Widgets
Qt::Qml
qdecimal qdecimal
decnumber decnumber
QxOrm QxOrm
+1 -1
View File
@@ -125,7 +125,7 @@ void CampGrid::addToVoucher(const CampDataPtr& data)
shopSrv.addShopItem(voucher, campItem, 1); shopSrv.addShopItem(voucher, campItem, 1);
shopSrv.calculate(voucher); shopSrv.calculate(voucher);
shopSrv.saveVoucher(voucher); shopSrv.save(voucher);
data->setOnVoucher(true); data->setOnVoucher(true);
+5 -5
View File
@@ -6,10 +6,6 @@
#include "campseller.h" #include "campseller.h"
#include <cmath> #include <cmath>
#ifdef _WIN32
double round(double value) { return value < 0 ? -std::floor(0.5 - value) : std::floor(0.5 + value); }
#endif
CampService::CampService() CampService::CampService()
{ {
m_pluginId = "CAMP"; m_pluginId = "CAMP";
@@ -357,8 +353,12 @@ void CampService::addAccFee(const CampDataPtr& data, const AddressItemPtr& item,
} }
} }
QList<IShopItemPtr> CampService::shopItems() QList<IShopItemPtr> CampService::shopItems(const QString& category)
{ {
if (!category.isEmpty()) {
return {};
}
CampShopItemPtr item(new CampShopItem); CampShopItemPtr item(new CampShopItem);
QList<IShopItemPtr> items; QList<IShopItemPtr> items;
+1 -1
View File
@@ -36,7 +36,7 @@ private:
// ISellableService interface // ISellableService interface
public: public:
QList<IShopItemPtr> shopItems() override; QList<IShopItemPtr> shopItems(const QString& category = "") override;
IShopItemPtr shopItem(int itemId) override; IShopItemPtr shopItem(int itemId) override;
void addedToVoucher(int itemId, int countAdded) override; void addedToVoucher(int itemId, int countAdded) override;
ISeller *seller() override; ISeller *seller() override;
+2 -2
View File
@@ -28,7 +28,7 @@ Enums::VatType CampShopItem::vatType()
return m_vatType; return m_vatType;
} }
QString CampShopItem::pluginId() QString CampShopItem::pluginId() const
{ {
return "CAMP"; return "CAMP";
} }
@@ -48,7 +48,7 @@ void CampShopItem::setVatType(const Enums::VatType &vatType)
m_vatType = vatType; m_vatType = vatType;
} }
long CampShopItem::id() long CampShopItem::id() const
{ {
return m_id; return m_id;
} }
+2 -2
View File
@@ -10,12 +10,12 @@ public:
// IShopItem interface // IShopItem interface
public: public:
long id() override; long id() const override;
QString name() override; QString name() override;
QString shortName() override; QString shortName() override;
QDecDouble unitPrice() override; QDecDouble unitPrice() override;
Enums::VatType vatType() override; Enums::VatType vatType() override;
QString pluginId() override; QString pluginId() const override;
// ShopItem interface // ShopItem interface
public: public:
+3 -1
View File
@@ -14,6 +14,7 @@ find_package(Qt6 COMPONENTS
Core Core
Gui Gui
Widgets Widgets
Qml
REQUIRED) REQUIRED)
add_library(commodity SHARED add_library(commodity SHARED
@@ -40,7 +41,7 @@ add_library(commodity SHARED
data/commoditytypedata.h data/commoditytypedata.h
settings/commoditysettings.cpp settings/commoditysettings.cpp
settings/commoditysettings.h settings/commoditysettings.h
) coloritemdelegate.cpp coloritemdelegate.h)
target_compile_definitions(commodity PRIVATE -DCOMMODITY_LIBRARY) target_compile_definitions(commodity PRIVATE -DCOMMODITY_LIBRARY)
@@ -51,6 +52,7 @@ target_link_libraries(commodity
Qt::Core Qt::Core
Qt::Gui Qt::Gui
Qt::Widgets Qt::Widgets
Qt::Qml
qdecimal qdecimal
decnumber decnumber
QxOrm QxOrm
+175
View File
@@ -0,0 +1,175 @@
//
// Created by Josef Rokos on 03.05.2023.
//
#include "coloritemdelegate.h"
#include <QPainter>
#include <QApplication>
#include <QPaintEvent>
#include <QHBoxLayout>
#include <QColorDialog>
ColorLabel::ColorLabel(QWidget* parent) : QWidget(parent), m_color(Qt::white) {
setAttribute(Qt::WA_StaticContents);
setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Minimum);
setFocusPolicy(Qt::NoFocus);
}
QColor ColorLabel::color() const {
return m_color;
}
void ColorLabel::setColor(const QColor& color) {
m_color = color;
}
QSize ColorLabel::sizeHint() const {
return {20,20};
}
void ColorLabel::paintEvent(QPaintEvent* event) {
QPainter painter(this);
QStyle* style = QApplication::style();
painter.save();
painter.setBrush(m_color);
bool dark = false;
qreal darkness = 1-(0.299*m_color.red() + 0.587*m_color.green() + 0.114*m_color.blue())/255;
if(darkness >= 0.5){
dark = true;
}
QColor penColor = dark ? Qt::transparent : Qt::darkGray;
painter.setPen(penColor);
int border = (event->rect().height() - style->pixelMetric(QStyle::PM_IndicatorWidth))/2;
QRect rect(event->rect().x()+border, event->rect().y()+border,
style->pixelMetric(QStyle::PM_IndicatorWidth),
style->pixelMetric(QStyle::PM_IndicatorWidth));// = option.rect.adjusted(4,4,-4,-6);
painter.drawRect(rect);
painter.restore();
}
ColorItemEditor::ColorItemEditor(QWidget* parent) : QWidget(parent), m_buttonPressed(false)
{
m_colorIndicator = new ColorLabel(this);
m_colorIndicator->setColor(m_color);
m_button = new QToolButton(this);
m_button->setSizePolicy(QSizePolicy::Fixed,QSizePolicy::Fixed);
m_button->setText("...");
m_button->installEventFilter(this);
QHBoxLayout* layout = new QHBoxLayout(this);
layout->addWidget(m_colorIndicator);
layout->addWidget(m_button);
layout->setSpacing(0);
layout->setContentsMargins(1,1,1,1);
setFocusProxy(m_button);
setAutoFillBackground(true);
setLayout(layout);
setAutoFillBackground(true);
connect(m_button,SIGNAL(clicked()),this,SLOT(slotClicked()));
}
void ColorItemEditor::setColor(const QColor& value) {
m_color = value;
m_colorIndicator->setColor(value);
}
bool ColorItemEditor::eventFilter(QObject* obj, QEvent* event) {
if (obj == m_button){
if (event->type() == QEvent::FocusOut && !m_buttonPressed){
auto focusEvent = dynamic_cast<QFocusEvent*>(event);
if (focusEvent && focusEvent->reason()!=Qt::MouseFocusReason){
setFocusToParent();
emit(editingFinished());
}
return false;
}
}
return false;
}
void ColorItemEditor::setFocusToParent() {
if (parentWidget()) {
parentWidget()->setFocus();
}
}
void ColorItemEditor::slotClicked() {
m_buttonPressed = true;
auto dialog = new QColorDialog(this);
dialog->setCurrentColor(m_color);
if (dialog->exec()) {
setColor(dialog->currentColor());
}
delete dialog;
setFocusToParent();
emit(editingFinished());
}
ColorItemDelegate::ColorItemDelegate(QObject* parent) : QStyledItemDelegate(parent) {
}
void ColorItemDelegate::paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const {
QColor color(index.data().toString());
if (color.isValid()) {
painter->save();
painter->setBrush(color);
QRect rect(option.rect.x(), option.rect.y(), option.rect.width(), option.rect.height());
painter->drawRect(rect);
painter->restore();
} else {
QStyledItemDelegate::paint(painter, option, index);
}
}
QSize ColorItemDelegate::sizeHint(const QStyleOptionViewItem& option, const QModelIndex& index) const {
return QStyledItemDelegate::sizeHint(option, index);
}
QWidget* ColorItemDelegate::createEditor(QWidget* parent, const QStyleOptionViewItem& option, const QModelIndex& index) const {
QColor color(index.data().toString());
if (!color.isValid()) {
color = QColorConstants::Gray;
}
auto editor = new ColorItemEditor(parent);
editor->setColor(color);
connect(editor, &ColorItemEditor::editingFinished, this, &ColorItemDelegate::commitAndCloseEditor);
return editor;
}
void ColorItemDelegate::commitAndCloseEditor() {
auto editor = qobject_cast<ColorItemEditor*>(sender());
emit commitData(editor);
emit closeEditor(editor);
}
void ColorItemDelegate::setEditorData(QWidget* editor, const QModelIndex& index) const {
auto edit = qobject_cast<ColorItemEditor*>(editor);
QColor color(index.data().toString());
if (edit && color.isValid()) {
edit->setColor(color);
} else {
QStyledItemDelegate::setEditorData(editor, index);
}
}
void ColorItemDelegate::setModelData(QWidget* editor, QAbstractItemModel* model, const QModelIndex& index) const {
auto edit = qobject_cast<ColorItemEditor*>(editor);
if (edit) {
model->setData(index, edit->color().name());
} else {
QStyledItemDelegate::setModelData(editor, model, index);
}
}
+64
View File
@@ -0,0 +1,64 @@
//
// Created by Josef Rokos on 03.05.2023.
//
#ifndef COLORITEMDELEGATE_H
#define COLORITEMDELEGATE_H
#include <QStyledItemDelegate>
#include <QToolButton>
class ColorItemDelegate : public QStyledItemDelegate {
Q_OBJECT
public:
explicit ColorItemDelegate(QObject* parent = nullptr);
~ColorItemDelegate() override = default;
void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const override;
QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const override;
QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const override;
void setEditorData(QWidget *editor, const QModelIndex &index) const override;
void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const override;
private slots:
void commitAndCloseEditor();
};
class ColorLabel : public QWidget{
Q_OBJECT
public:
explicit ColorLabel(QWidget* parent = nullptr);
QColor color() const;
void setColor(const QColor &color);
QSize sizeHint() const override;
protected:
void paintEvent(QPaintEvent *event) override;
private:
QColor m_color;
};
class ColorItemEditor : public QWidget
{
Q_OBJECT
public:
explicit ColorItemEditor(QWidget *parent = nullptr);
QColor color(){return m_color;}
void setColor(const QColor& value);
protected:
bool eventFilter(QObject *obj, QEvent *event) override;
private:
void setFocusToParent();
signals:
void editingFinished();
private slots:
void slotClicked();
private:
QColor m_color;
QToolButton* m_button;
ColorLabel* m_colorIndicator;
bool m_buttonPressed;
};
#endif //COLORITEMDELEGATE_H
+8 -3
View File
@@ -8,7 +8,7 @@
"default" : "", "default" : "",
"CZ" : "" "CZ" : ""
}, },
"schemaVersion" : 1, "schemaVersion" : 2,
"sql" : [ "sql" : [
"CREATE TABLE \"CommodityTypeData\" ( "CREATE TABLE \"CommodityTypeData\" (
\"id\" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, \"id\" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
@@ -26,8 +26,13 @@ CREATE TABLE \"CommodityData\" (
CONSTRAINT \"type_fk\" CONSTRAINT \"type_fk\"
FOREIGN KEY (\"type\") FOREIGN KEY (\"type\")
REFERENCES \"CommodityTypeData\" (\"id\") REFERENCES \"CommodityTypeData\" (\"id\")
DEFERRABLE INITIALLY DEFERRED);" DEFERRABLE INITIALLY DEFERRED);
",
"
ALTER TABLE \"CommodityTypeData\" ADD \"color\" TEXT NULL;
ALTER TABLE \"CommodityData\" ADD \"favorite\" INTEGER NULL;
UPDATE \"CommodityData\" SET \"favorite\"=0;
"
], ],
"dependencies" : [ "SHOP" ], "dependencies" : [ "SHOP" ],
"translations" : { "translations" : {
+1
View File
@@ -25,6 +25,7 @@ CommodityForm::CommodityForm(QWidget *parent) :
<< ComboData(Enums::SECOND_LOWER,tr("Second Lower")); << ComboData(Enums::SECOND_LOWER,tr("Second Lower"));
registerBinding(ui->vat, vt); registerBinding(ui->vat, vt);
registerBinding(ui->count); registerBinding(ui->count);
registerBinding(ui->favorite);
m_codeAsNumber = false; m_codeAsNumber = false;
} }
+7
View File
@@ -94,6 +94,13 @@
</property> </property>
</widget> </widget>
</item> </item>
<item row="7" column="1">
<widget class="QCheckBox" name="favorite">
<property name="text">
<string>Favorite</string>
</property>
</widget>
</item>
</layout> </layout>
</widget> </widget>
<tabstops> <tabstops>
+4 -2
View File
@@ -1,11 +1,13 @@
#include "commodityservice.h" #include "commodityservice.h"
QList<QSharedPointer<IShopItem> > CommodityService::shopItems() QList<QSharedPointer<IShopItem> > CommodityService::shopItems(const QString& category/* = ""*/)
{ {
QList<QSharedPointer<IShopItem> > ret; QList<QSharedPointer<IShopItem> > ret;
foreach (QSharedPointer<CommodityData> data, all()) { foreach (QSharedPointer<CommodityData> data, all()) {
ret.append(qSharedPointerDynamicCast<IShopItem, CommodityData>(data)); if (category.isEmpty() || (data->favorite() && data->category() == category)) {
ret.append(qSharedPointerDynamicCast<IShopItem, CommodityData>(data));
}
} }
return ret; return ret;
+1 -1
View File
@@ -12,7 +12,7 @@ public:
// ISellableService interface // ISellableService interface
public: public:
QList<IShopItemPtr> shopItems() override; QList<IShopItemPtr> shopItems(const QString& category = "") override;
void addedToVoucher(int itemId, int countAdded) override; void addedToVoucher(int itemId, int countAdded) override;
IShopItemPtr shopItem(int itemId) override; IShopItemPtr shopItem(int itemId) override;
ISeller *seller() override; ISeller *seller() override;
+4 -1
View File
@@ -4,6 +4,8 @@
#include <service.h> #include <service.h>
#include <settingsservice.h> #include <settingsservice.h>
#include "coloritemdelegate.h"
CommoditySettingsForm::CommoditySettingsForm(QWidget *parent) : CommoditySettingsForm::CommoditySettingsForm(QWidget *parent) :
FormBinder<CommoditySettings>(parent), FormBinder<CommoditySettings>(parent),
ui(new Ui::CommoditySettingsForm) ui(new Ui::CommoditySettingsForm)
@@ -13,9 +15,10 @@ CommoditySettingsForm::CommoditySettingsForm(QWidget *parent) :
registerBinding(ui->codeAsNumber); registerBinding(ui->codeAsNumber);
m_table = new AutoTableModel<CommodityTypeData>(); m_table = new AutoTableModel<CommodityTypeData>();
m_table->setEditableCols(QList<int>() << 0); m_table->setEditableCols(QList<int>() << 0 << 1);
ui->commodityTypesTable->setModel(m_table); ui->commodityTypesTable->setModel(m_table);
ui->commodityTypesTable->horizontalHeader()->setSectionResizeMode(0, QHeaderView::Stretch); ui->commodityTypesTable->horizontalHeader()->setSectionResizeMode(0, QHeaderView::Stretch);
ui->commodityTypesTable->setItemDelegateForColumn(1, new ColorItemDelegate(this));
} }
CommoditySettingsForm::~CommoditySettingsForm() CommoditySettingsForm::~CommoditySettingsForm()
+19 -2
View File
@@ -13,6 +13,7 @@ namespace qx {
t.data(&CommodityData::m_price, "price"); t.data(&CommodityData::m_price, "price");
t.data(&CommodityData::m_vat, "vat"); t.data(&CommodityData::m_vat, "vat");
t.data(&CommodityData::m_count, "count"); t.data(&CommodityData::m_count, "count");
t.data(&CommodityData::m_favorite, "favorite");
t.relationManyToOne(&CommodityData::m_type, "type"); t.relationManyToOne(&CommodityData::m_type, "type");
} }
@@ -25,7 +26,7 @@ CommodityData::CommodityData(QObject *parent)
m_price = 0; m_price = 0;
m_vat = Enums::NONE; m_vat = Enums::NONE;
} }
long CommodityData::id() long CommodityData::id() const
{ {
return m_id; return m_id;
} }
@@ -114,7 +115,7 @@ Enums::VatType CommodityData::vatType()
return vat(); return vat();
} }
QString CommodityData::pluginId() QString CommodityData::pluginId() const
{ {
return "COMMODITY"; return "COMMODITY";
} }
@@ -123,6 +124,22 @@ QStringList CommodityData::eagerLoad() {
return { "type" }; return { "type" };
} }
bool CommodityData::favorite() {
return m_favorite;
}
void CommodityData::setFavorite(bool favorite) {
m_favorite = favorite;
}
QString CommodityData::color() {
return m_type->color();
}
QString CommodityData::category() {
return m_type->name();
}
+9 -4
View File
@@ -11,7 +11,6 @@
#include "../commodity_global.h" #include "../commodity_global.h"
#pragma db object
class CommodityData : public IShopItem class CommodityData : public IShopItem
{ {
Q_OBJECT Q_OBJECT
@@ -24,11 +23,12 @@ class CommodityData : public IShopItem
Q_PROPERTY(QDecDouble price READ price WRITE setPrice) Q_PROPERTY(QDecDouble price READ price WRITE setPrice)
Q_PROPERTY(Enums::VatType vat READ vat WRITE setVat) Q_PROPERTY(Enums::VatType vat READ vat WRITE setVat)
Q_PROPERTY(int count READ count WRITE setCount) Q_PROPERTY(int count READ count WRITE setCount)
Q_PROPERTY(bool favorite READ favorite WRITE setFavorite)
public: public:
explicit CommodityData(QObject *parent = nullptr); explicit CommodityData(QObject *parent = nullptr);
long id() override; long id() const override;
void setId(long id); void setId(long id);
QString name() override; QString name() override;
@@ -52,6 +52,9 @@ public:
int count() const; int count() const;
void setCount(int count); void setCount(int count);
bool favorite() override;
void setFavorite(bool favorite);
Q_INVOKABLE QStringList eagerLoad(); Q_INVOKABLE QStringList eagerLoad();
private: private:
@@ -63,13 +66,15 @@ private:
int m_price; int m_price;
Enums::VatType m_vat; Enums::VatType m_vat;
int m_count; int m_count;
bool m_favorite;
// IShopItem interface // IShopItem interface
public: public:
QDecDouble unitPrice() override; QDecDouble unitPrice() override;
Enums::VatType vatType() override; Enums::VatType vatType() override;
QString pluginId() override; QString pluginId() const override;
QString color() override;
QString category() override;
}; };
typedef QSharedPointer<CommodityData> CommodityDataPtr; typedef QSharedPointer<CommodityData> CommodityDataPtr;
+9
View File
@@ -7,6 +7,7 @@ namespace qx {
t.setName("CommodityTypeData"); t.setName("CommodityTypeData");
t.id(&CommodityTypeData::m_id, "id"); t.id(&CommodityTypeData::m_id, "id");
t.data(&CommodityTypeData::m_name, "name"); t.data(&CommodityTypeData::m_name, "name");
t.data(&CommodityTypeData::m_color, "color");
} }
} }
@@ -47,4 +48,12 @@ QString CommodityTypeData::toString()
return this->name(); return this->name();
} }
QString CommodityTypeData::color() const {
return m_color;
}
void CommodityTypeData::setColor(const QString& color) {
m_color = color;
}
+5
View File
@@ -12,6 +12,7 @@ class CommodityTypeData :public ComboItem
QX_REGISTER_FRIEND_CLASS(CommodityTypeData) QX_REGISTER_FRIEND_CLASS(CommodityTypeData)
Q_PROPERTY(QString name READ name WRITE setName) Q_PROPERTY(QString name READ name WRITE setName)
Q_PROPERTY(QString color READ color WRITE setColor)
public: public:
explicit CommodityTypeData(QObject *parent = nullptr); explicit CommodityTypeData(QObject *parent = nullptr);
@@ -22,9 +23,13 @@ public:
QString name() const; QString name() const;
void setName(const QString &name); void setName(const QString &name);
QString color() const;
void setColor(const QString& color);
private: private:
long m_id{0}; long m_id{0};
QString m_name; QString m_name;
QString m_color;
// ComboItem interface // ComboItem interface
public: public:
-1
View File
@@ -18,7 +18,6 @@ find_package(Qt6 COMPONENTS
REQUIRED) REQUIRED)
add_library(core SHARED add_library(core SHARED
main.cpp
autoform.h autoform.h
autotablemodel.h autotablemodel.h
columndialog.cpp columndialog.cpp
+4
View File
@@ -95,6 +95,10 @@ void Role::clearPermissions()
m_listPermissions.clear(); m_listPermissions.clear();
} }
QStringList Role::eagerLoad() {
return {"object_id_fk", "value_fk"};
}
+2
View File
@@ -46,6 +46,8 @@ public:
void addPermission(QSharedPointer<Permission> perm); void addPermission(QSharedPointer<Permission> perm);
void clearPermissions(); void clearPermissions();
Q_INVOKABLE QStringList eagerLoad();
private: private:
long m_id; long m_id;
QString m_name; QString m_name;
+4
View File
@@ -112,6 +112,10 @@ void User::setIsAdmin(bool isAdmin)
m_isAdmin = isAdmin; m_isAdmin = isAdmin;
} }
QStringList User::eagerLoad() {
return {"object_id_fk"};
}
+1
View File
@@ -57,6 +57,7 @@ public:
void clearRoles(); void clearRoles();
Q_INVOKABLE QStringList eagerLoad();
private: private:
long m_id; long m_id;
+10 -2
View File
@@ -15,7 +15,11 @@
#ifndef PLUGIN_ROOT #ifndef PLUGIN_ROOT
#ifdef _WIN32 #ifdef _WIN32
#define PLUGIN_ROOT "/../../plugins" #ifdef QT_NO_DEBUG
#define PLUGIN_ROOT "/plugins"
#else
#define PLUGIN_ROOT "/../../plugins"
#endif
#else #else
#define PLUGIN_ROOT "/../plugins" #define PLUGIN_ROOT "/../plugins"
#endif #endif
@@ -23,7 +27,11 @@
#ifndef REPORT_ROOT #ifndef REPORT_ROOT
#ifdef _WIN32 #ifdef _WIN32
#define REPORT_ROOT "/../../reports" #ifdef QT_NO_DEBUG
#define REPORT_ROOT "/reports"
#else
#define REPORT_ROOT "/../../reports"
#endif
#else #else
#define REPORT_ROOT "/../reports" #define REPORT_ROOT "/../reports"
#endif #endif
-23
View File
@@ -1,21 +1,5 @@
#include "exprevaluator.h" #include "exprevaluator.h"
#ifdef _MSC_VER
ExprEvaluator::ExprEvaluator()
{
m_operations["=="] = [](QVariant left, QVariant right) { return left == right; };
m_operations["!="] = [](QVariant left, QVariant right) { return left != right; };
m_operations["<"] = [](QVariant left, QVariant right) { return left < right; };
m_operations["<="] = [](QVariant left, QVariant right) { return left <= right; };
m_operations[">"] = [](QVariant left, QVariant right) { return left > right; };
m_operations[">="] = [](QVariant left, QVariant right) { return left >= right; };
m_operations["%"] = [](QVariant left, QVariant right) { return left.toString().contains(right.toString()); };
m_operations["||"] = [](QVariant left, QVariant right) { return left.toBool() || right.toBool(); };
m_operations["&&"] = [](QVariant left, QVariant right) { return left.toBool() && right.toBool(); };
m_caseSensitive = false;
}
#else
const QMap<QString, std::function<bool(QVariant, QVariant)> > ExprEvaluator::m_operations = { const QMap<QString, std::function<bool(QVariant, QVariant)> > ExprEvaluator::m_operations = {
{ "==", [](QVariant left, QVariant right) { return left == right; }}, { "==", [](QVariant left, QVariant right) { return left == right; }},
{ "!=", [](QVariant left, QVariant right) { return left != right; }}, { "!=", [](QVariant left, QVariant right) { return left != right; }},
@@ -35,13 +19,6 @@ const QMap<QString, std::function<bool(QVariant, QVariant)> > ExprEvaluator::m_o
{ "&&", [](QVariant left, QVariant right) { return left.toBool() && right.toBool(); }} { "&&", [](QVariant left, QVariant right) { return left.toBool() && right.toBool(); }}
}; };
ExprEvaluator::ExprEvaluator()
{
m_caseSensitive = false;
}
#endif
bool ExprEvaluator::evaluate(QObject *object, const QString &exp) bool ExprEvaluator::evaluate(QObject *object, const QString &exp)
{ {
if (exp.contains("&&") && exp.contains("||")) if (exp.contains("&&") && exp.contains("||"))
+2 -6
View File
@@ -11,19 +11,15 @@
class CORESHARED_EXPORT ExprEvaluator class CORESHARED_EXPORT ExprEvaluator
{ {
public: public:
ExprEvaluator(); ExprEvaluator() = default;
bool evaluate(QObject *object, const QString &exp); bool evaluate(QObject *object, const QString &exp);
void setCaseSensitive(bool caseSensitive); void setCaseSensitive(bool caseSensitive);
private: private:
#ifdef _MSC_VER
QMap<QString, std::function<bool(QVariant, QVariant)> > m_operations;
#else
static const QMap<QString, std::function<bool(QVariant, QVariant)> > m_operations; static const QMap<QString, std::function<bool(QVariant, QVariant)> > m_operations;
#endif
bool m_caseSensitive; bool m_caseSensitive{false};
bool subEval(const QString &oper, const QString &expresion, QObject *object); bool subEval(const QString &oper, const QString &expresion, QObject *object);
void parseExpr(const QString &exp, QVariant &value, QString &oper, QVariant &condition, QObject *object); void parseExpr(const QString &exp, QVariant &value, QString &oper, QVariant &condition, QObject *object);
+1 -1
View File
@@ -95,7 +95,7 @@ protected:
m_translator = new QTranslator(); m_translator = new QTranslator();
if (!m_translator->load(fileName + QLocale::system().name())) { if (!m_translator->load(fileName + QLocale::system().name())) {
qDebug() << "Cannot load translation"; qDebug() << "Cannot load translation " << QLocale::system().name();
} }
} }
+9
View File
@@ -1,5 +1,14 @@
#include "iservice.h" #include "iservice.h"
#ifdef _MSC_VER
QX_REGISTER_CPP_CORE(IService)
namespace qx {
template<> void register_class(QxClass<IService>&) {
}
}
#endif
IService::IService(QObject *parent) : QObject(parent) IService::IService(QObject *parent) : QObject(parent)
{ {
} }
+4
View File
@@ -33,4 +33,8 @@ protected:
QString m_pluginId; QString m_pluginId;
}; };
#ifdef _MSC_VER
QX_REGISTER_HPP_CORE(IService, QObject, 0)
#endif
#endif // ISERVICE_H #endif // ISERVICE_H
+9 -2
View File
@@ -9,7 +9,7 @@
"default" : "", "default" : "",
"CZ" : "" "CZ" : ""
}, },
"schemaVersion" : 1, "schemaVersion" : 2,
"sql" : [ "sql" : [
"CREATE TABLE \"User\" ( "CREATE TABLE \"User\" (
\"id\" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, \"id\" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
@@ -91,7 +91,14 @@ CREATE TABLE \"NumberSeries\" (
FOREIGN KEY (\"season\") FOREIGN KEY (\"season\")
REFERENCES \"Season\" (\"id\") REFERENCES \"Season\" (\"id\")
DEFERRABLE INITIALLY DEFERRED); DEFERRABLE INITIALLY DEFERRED);
" ], ",
"DROP INDEX \"Role_listPermissions_index_i\";
ALTER TABLE \"Role_listPermissions\" DROP \"index\";
DROP INDEX \"User_listRoles_index_i\";
ALTER TABLE \"User_listRoles\" DROP \"index\";
"
],
"dependencies" : [] "dependencies" : []
} }
} }
+5
View File
@@ -1,4 +1,5 @@
#include "permissionservice.h" #include "permissionservice.h"
#include "service.h"
#include <QCryptographicHash> #include <QCryptographicHash>
QList<QSharedPointer<Permission> > PermissionService::forPlugin(const QString &pluginId) QList<QSharedPointer<Permission> > PermissionService::forPlugin(const QString &pluginId)
@@ -54,6 +55,10 @@ QSharedPointer<User> PermissionService::loadUser(const QString &login)
auto admin = srvUser.all("login = '" + login + "'"); auto admin = srvUser.all("login = '" + login + "'");
if (admin.count() == 1) { if (admin.count() == 1) {
Service<Role> srvRole;
for (auto& role : admin[0]->listRoles()) {
srvRole.load(role);
}
return admin[0]; return admin[0];
} }
+2 -1
View File
@@ -3,12 +3,13 @@
#include <QDialog> #include <QDialog>
#include "report.h" #include "report.h"
#include "../core_global.h"
namespace Ui { namespace Ui {
class ReportDialog; class ReportDialog;
} }
class ReportDialog : public QDialog class CORESHARED_EXPORT ReportDialog : public QDialog
{ {
Q_OBJECT Q_OBJECT
+3 -3
View File
@@ -58,7 +58,7 @@ public:
return ret; return ret;
} }
void save(QSharedPointer<T> entity, qx::QxSession* pSession = nullptr) { virtual void save(QSharedPointer<T> entity, qx::QxSession* pSession = nullptr) {
if (!checkPermission(PERM_ADD)) { if (!checkPermission(PERM_ADD)) {
return; return;
} }
@@ -83,7 +83,7 @@ public:
emit dataChanged(); emit dataChanged();
} }
void update(QSharedPointer<T> entity, qx::QxSession* pSession = nullptr) { virtual void update(QSharedPointer<T> entity, qx::QxSession* pSession = nullptr) {
if (!checkPermission(PERM_EDIT)) { if (!checkPermission(PERM_EDIT)) {
return; return;
} }
@@ -156,7 +156,7 @@ public:
pSession = ptrSession.data(); pSession = ptrSession.data();
} }
*pSession += qx::dao::delete_by_id(entity); *pSession += qx::dao::delete_by_id(entity, pSession->database());
if (!pSession->isValid()) { if (!pSession->isValid()) {
qDebug() << pSession->firstError().text(); qDebug() << pSession->firstError().text();
Binary file not shown.
+60 -52
View File
@@ -129,83 +129,83 @@
<translation>Hlavní nastavení</translation> <translation>Hlavní nastavení</translation>
</message> </message>
<message> <message>
<location filename="../settings/globalsettingsform.ui" line="104"/> <location filename="../settings/globalsettingsform.ui" line="107"/>
<source>Web</source> <source>Web</source>
<translation>Web</translation> <translation>Web</translation>
</message> </message>
<message> <message>
<location filename="../settings/globalsettingsform.ui" line="111"/> <location filename="../settings/globalsettingsform.ui" line="114"/>
<source>E-mail</source> <source>E-mail</source>
<translation>E-mail</translation> <translation>E-mail</translation>
</message> </message>
<message> <message>
<location filename="../settings/globalsettingsform.ui" line="118"/> <location filename="../settings/globalsettingsform.ui" line="121"/>
<source>Phone</source> <source>Phone</source>
<translation>Telefon</translation> <translation>Telefon</translation>
</message> </message>
<message> <message>
<location filename="../settings/globalsettingsform.ui" line="166"/> <location filename="../settings/globalsettingsform.ui" line="169"/>
<source>Company info</source> <source>Company info</source>
<translation>Informace o společnosti</translation> <translation>Informace o společnosti</translation>
</message> </message>
<message> <message>
<location filename="../settings/globalsettingsform.ui" line="175"/> <location filename="../settings/globalsettingsform.ui" line="178"/>
<source>IC</source> <source>IC</source>
<translation>IČO</translation> <translation>IČO</translation>
</message> </message>
<message> <message>
<location filename="../settings/globalsettingsform.ui" line="185"/> <location filename="../settings/globalsettingsform.ui" line="188"/>
<source>VAT number</source> <source>VAT number</source>
<translation>DIČ</translation> <translation>DIČ</translation>
</message> </message>
<message> <message>
<location filename="../settings/globalsettingsform.ui" line="195"/> <location filename="../settings/globalsettingsform.ui" line="198"/>
<source>VAT payer</source> <source>VAT payer</source>
<translation>Plátce DPH</translation> <translation>Plátce DPH</translation>
</message> </message>
<message> <message>
<location filename="../settings/globalsettingsform.ui" line="208"/> <location filename="../settings/globalsettingsform.ui" line="211"/>
<source>VAT rates</source> <source>VAT rates</source>
<translation>Sazby DPH</translation> <translation>Sazby DPH</translation>
</message> </message>
<message> <message>
<location filename="../settings/globalsettingsform.ui" line="214"/> <location filename="../settings/globalsettingsform.ui" line="217"/>
<source>High</source> <source>High</source>
<translation>Vysoká</translation> <translation>Vysoká</translation>
</message> </message>
<message> <message>
<location filename="../settings/globalsettingsform.ui" line="228"/> <location filename="../settings/globalsettingsform.ui" line="231"/>
<source>First lower</source> <source>First lower</source>
<translation>První snížená</translation> <translation>První snížená</translation>
</message> </message>
<message> <message>
<location filename="../settings/globalsettingsform.ui" line="242"/> <location filename="../settings/globalsettingsform.ui" line="245"/>
<source>Second lower</source> <source>Second lower</source>
<translation>Druhá snížená</translation> <translation>Druhá snížená</translation>
</message> </message>
<message> <message>
<location filename="../settings/globalsettingsform.ui" line="259"/> <location filename="../settings/globalsettingsform.ui" line="262"/>
<source>Prices with VAT</source> <source>Prices with VAT</source>
<translation>Ceny s DPH</translation> <translation>Ceny s DPH</translation>
</message> </message>
<message> <message>
<location filename="../settings/globalsettingsform.ui" line="270"/> <location filename="../settings/globalsettingsform.ui" line="273"/>
<location filename="../settings/globalsettingsform.ui" line="331"/> <location filename="../settings/globalsettingsform.ui" line="334"/>
<source>Number series</source> <source>Number series</source>
<translation>Číselné řady</translation> <translation>Číselné řady</translation>
</message> </message>
<message> <message>
<location filename="../settings/globalsettingsform.ui" line="299"/> <location filename="../settings/globalsettingsform.ui" line="302"/>
<source>Edit name</source> <source>Edit name</source>
<translation>Upravit název</translation> <translation>Upravit název</translation>
</message> </message>
<message> <message>
<location filename="../settings/globalsettingsform.ui" line="310"/> <location filename="../settings/globalsettingsform.ui" line="313"/>
<source>Season</source> <source>Season</source>
<translation>Sezóna</translation> <translation>Sezóna</translation>
</message> </message>
<message> <message>
<location filename="../settings/globalsettingsform.ui" line="317"/> <location filename="../settings/globalsettingsform.ui" line="320"/>
<source>Create new</source> <source>Create new</source>
<translation>Vytvořit novou</translation> <translation>Vytvořit novou</translation>
</message> </message>
@@ -215,67 +215,75 @@
<translation>Kontaktní údaje</translation> <translation>Kontaktní údaje</translation>
</message> </message>
<message> <message>
<location filename="../settings/globalsettingsform.ui" line="45"/> <location filename="../settings/globalsettingsform.ui" line="48"/>
<source>Firm Name</source> <source>Firm Name</source>
<translation>Název společnosti</translation> <translation>Název společnosti</translation>
</message> </message>
<message> <message>
<location filename="../settings/globalsettingsform.ui" line="55"/> <location filename="../settings/globalsettingsform.ui" line="58"/>
<source>Street</source> <source>Street</source>
<translation>Ulice</translation> <translation>Ulice</translation>
</message> </message>
<message> <message>
<location filename="../settings/globalsettingsform.ui" line="65"/> <location filename="../settings/globalsettingsform.ui" line="68"/>
<source>House Number</source> <source>House Number</source>
<translation>Číslo popisné</translation> <translation>Číslo popisné</translation>
</message> </message>
<message> <message>
<location filename="../settings/globalsettingsform.ui" line="75"/> <location filename="../settings/globalsettingsform.ui" line="78"/>
<source>City</source> <source>City</source>
<translation>Město</translation> <translation>Město</translation>
</message> </message>
<message> <message>
<location filename="../settings/globalsettingsform.ui" line="85"/> <location filename="../settings/globalsettingsform.ui" line="88"/>
<source>ZIP code</source> <source>ZIP code</source>
<translation>PSČ</translation> <translation>PSČ</translation>
</message> </message>
<message> <message>
<location filename="../settings/globalsettingsform.ui" line="128"/> <location filename="../settings/globalsettingsform.ui" line="131"/>
<source>Logo</source> <source>Logo</source>
<translation>Logo</translation> <translation>Logo</translation>
</message> </message>
<message> <message>
<location filename="../settings/globalsettingsform.ui" line="156"/> <location filename="../settings/globalsettingsform.ui" line="159"/>
<source>Select file</source> <source>Select file</source>
<translation>Vyber soubor</translation> <translation>Vyber soubor</translation>
</message> </message>
<message> <message>
<location filename="../settings/globalsettingsform.cpp" line="82"/> <location filename="../settings/globalsettingsform.cpp" line="95"/>
<source>Switch season</source> <source>Switch season</source>
<translation>Změna sezóny</translation> <translation>Změna sezóny</translation>
</message> </message>
<message> <message>
<location filename="../settings/globalsettingsform.cpp" line="82"/>
<source>Realy switch active season?</source> <source>Realy switch active season?</source>
<translation>Opravdu si přejete změnit aktivní sezónu?</translation> <translation type="vanished">Opravdu si přejete změnit aktivní sezónu?</translation>
</message> </message>
<message> <message>
<location filename="../settings/globalsettingsform.cpp" line="150"/> <location filename="../settings/globalsettingsform.cpp" line="155"/>
<source>New season</source> <source>New season</source>
<translation>Nová sezóna</translation> <translation>Nová sezóna</translation>
</message> </message>
<message> <message>
<location filename="../settings/globalsettingsform.cpp" line="150"/>
<source>Realy create new season and switch to it?</source> <source>Realy create new season and switch to it?</source>
<translation type="vanished">Opravdu si přejete vytvořit novou sezónu a přepnout na ni?</translation>
</message>
<message>
<location filename="../settings/globalsettingsform.cpp" line="95"/>
<source>Really switch active season?</source>
<translation>Opravdu si přejete změnit aktivní sezónu?</translation>
</message>
<message>
<location filename="../settings/globalsettingsform.cpp" line="155"/>
<source>Really create new season and switch to it?</source>
<translation>Opravdu si přejete vytvořit novou sezónu a přepnout na ni?</translation> <translation>Opravdu si přejete vytvořit novou sezónu a přepnout na ni?</translation>
</message> </message>
<message> <message>
<location filename="../settings/globalsettingsform.cpp" line="173"/> <location filename="../settings/globalsettingsform.cpp" line="178"/>
<source>Select logo</source> <source>Select logo</source>
<translation>Vybrat logo</translation> <translation>Vybrat logo</translation>
</message> </message>
<message> <message>
<location filename="../settings/globalsettingsform.cpp" line="173"/> <location filename="../settings/globalsettingsform.cpp" line="178"/>
<source>Images (*.png *.xpm *.jpg)</source> <source>Images (*.png *.xpm *.jpg)</source>
<translation>Obrázky (*.png *.xpm *.jpg)</translation> <translation>Obrázky (*.png *.xpm *.jpg)</translation>
</message> </message>
@@ -359,17 +367,17 @@
<translation>Import dat</translation> <translation>Import dat</translation>
</message> </message>
<message> <message>
<location filename="../importdialog.ui" line="20"/> <location filename="../importdialog.ui" line="23"/>
<source>File</source> <source>File</source>
<translation>Soubor</translation> <translation>Soubor</translation>
</message> </message>
<message> <message>
<location filename="../importdialog.ui" line="27"/> <location filename="../importdialog.ui" line="30"/>
<source>Separator</source> <source>Separator</source>
<translation>Oddělovač</translation> <translation>Oddělovač</translation>
</message> </message>
<message> <message>
<location filename="../importdialog.ui" line="65"/> <location filename="../importdialog.ui" line="68"/>
<source>...</source> <source>...</source>
<translation>...</translation> <translation>...</translation>
</message> </message>
@@ -400,12 +408,12 @@
<context> <context>
<name>QObject</name> <name>QObject</name>
<message> <message>
<location filename="../iplugin.h" line="58"/> <location filename="../iplugin.h" line="52"/>
<source>Permission denied</source> <source>Permission denied</source>
<translation>Nedostatečná oprávnění</translation> <translation>Nedostatečná oprávnění</translation>
</message> </message>
<message> <message>
<location filename="../iplugin.h" line="58"/> <location filename="../iplugin.h" line="52"/>
<source>You don&apos;t have permission to open this plugin.</source> <source>You don&apos;t have permission to open this plugin.</source>
<translation>Nemáte oprávnění otevřít tento modul.</translation> <translation>Nemáte oprávnění otevřít tento modul.</translation>
</message> </message>
@@ -590,39 +598,39 @@
</message> </message>
<message> <message>
<location filename="../autoform.h" line="46"/> <location filename="../autoform.h" line="46"/>
<location filename="../gridform.h" line="250"/> <location filename="../gridform.h" line="252"/>
<location filename="../gridform.h" line="262"/> <location filename="../gridform.h" line="264"/>
<location filename="../gridform.h" line="274"/> <location filename="../gridform.h" line="276"/>
<source>Permission denied</source> <source>Permission denied</source>
<translation>Nedostatečná oprávnění</translation> <translation>Nedostatečná oprávnění</translation>
</message> </message>
<message> <message>
<location filename="../gridform.h" line="250"/> <location filename="../gridform.h" line="252"/>
<source>You don&apos;t have permission to add new record.</source> <source>You don&apos;t have permission to add new record.</source>
<translation>Nemáte oprávnění přidat nový záznam.</translation> <translation>Nemáte oprávnění přidat nový záznam.</translation>
</message> </message>
<message> <message>
<location filename="../gridform.h" line="262"/> <location filename="../gridform.h" line="264"/>
<source>You don&apos;t have permission to edit record.</source> <source>You don&apos;t have permission to edit record.</source>
<translation>Nemáte oprávnění upravit záznam.</translation> <translation>Nemáte oprávnění upravit záznam.</translation>
</message> </message>
<message> <message>
<location filename="../gridform.h" line="274"/> <location filename="../gridform.h" line="276"/>
<source>You don&apos;t have permission to delete record.</source> <source>You don&apos;t have permission to delete record.</source>
<translation>Nemáte oprávnění smazat záznam.</translation> <translation>Nemáte oprávnění smazat záznam.</translation>
</message> </message>
<message> <message>
<location filename="../gridform.h" line="231"/> <location filename="../gridform.h" line="233"/>
<source>Delete record</source> <source>Delete record</source>
<translation>Smazat záznam</translation> <translation>Smazat záznam</translation>
</message> </message>
<message> <message>
<location filename="../gridform.h" line="231"/> <location filename="../gridform.h" line="233"/>
<source>Realy delete this record?</source> <source>Realy delete this record?</source>
<translation>Opravdu si přejete smazat tento záznam?</translation> <translation>Opravdu si přejete smazat tento záznam?</translation>
</message> </message>
<message> <message>
<location filename="../gridform.h" line="327"/> <location filename="../gridform.h" line="329"/>
<source>Import</source> <source>Import</source>
<translation>Import</translation> <translation>Import</translation>
</message> </message>
@@ -635,37 +643,37 @@
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../users/userform.ui" line="20"/> <location filename="../users/userform.ui" line="23"/>
<source>Login</source> <source>Login</source>
<translation>Uživatelské jméno</translation> <translation>Uživatelské jméno</translation>
</message> </message>
<message> <message>
<location filename="../users/userform.ui" line="30"/> <location filename="../users/userform.ui" line="33"/>
<source>Password</source> <source>Password</source>
<translation>Heslo</translation> <translation>Heslo</translation>
</message> </message>
<message> <message>
<location filename="../users/userform.ui" line="44"/> <location filename="../users/userform.ui" line="47"/>
<source>Name</source> <source>Name</source>
<translation>Jméno</translation> <translation>Jméno</translation>
</message> </message>
<message> <message>
<location filename="../users/userform.ui" line="57"/> <location filename="../users/userform.ui" line="60"/>
<source>Is Admin</source> <source>Is Admin</source>
<translation>Admin</translation> <translation>Admin</translation>
</message> </message>
<message> <message>
<location filename="../users/userform.ui" line="67"/> <location filename="../users/userform.ui" line="70"/>
<source>Active</source> <source>Active</source>
<translation>Aktivní</translation> <translation>Aktivní</translation>
</message> </message>
<message> <message>
<location filename="../users/userform.ui" line="77"/> <location filename="../users/userform.ui" line="80"/>
<source>Roles</source> <source>Roles</source>
<translation>Role</translation> <translation>Role</translation>
</message> </message>
<message> <message>
<location filename="../users/userform.ui" line="91"/> <location filename="../users/userform.ui" line="94"/>
<source>Retype Password</source> <source>Retype Password</source>
<translation>Zopakujte heslo</translation> <translation>Zopakujte heslo</translation>
</message> </message>
+2
View File
@@ -14,6 +14,7 @@ find_package(Qt6 COMPONENTS
Core Core
Gui Gui
Widgets Widgets
Qml
REQUIRED) REQUIRED)
add_library(countryregister SHARED add_library(countryregister SHARED
@@ -33,6 +34,7 @@ target_link_libraries(countryregister
Qt::Core Qt::Core
Qt::Gui Qt::Gui
Qt::Widgets Qt::Widgets
Qt::Qml
qdecimal qdecimal
decnumber decnumber
QxOrm QxOrm
+2
View File
@@ -14,6 +14,7 @@ find_package(Qt6 COMPONENTS
Core Core
Gui Gui
Widgets Widgets
Qml
REQUIRED) REQUIRED)
add_library(postregister SHARED add_library(postregister SHARED
@@ -33,6 +34,7 @@ target_link_libraries(postregister
Qt::Core Qt::Core
Qt::Gui Qt::Gui
Qt::Widgets Qt::Widgets
Qt::Qml
qdecimal qdecimal
decnumber decnumber
QxOrm QxOrm
+2
View File
@@ -14,6 +14,7 @@ find_package(Qt6 COMPONENTS
Core Core
Gui Gui
Widgets Widgets
Qml
REQUIRED) REQUIRED)
add_library(services SHARED add_library(services SHARED
@@ -39,6 +40,7 @@ target_link_libraries(services
Qt::Core Qt::Core
Qt::Gui Qt::Gui
Qt::Widgets Qt::Widgets
Qt::Qml
qdecimal qdecimal
decnumber decnumber
QxOrm QxOrm
+2
View File
@@ -14,6 +14,7 @@ find_package(Qt6 COMPONENTS
Core Core
Gui Gui
Widgets Widgets
Qml
REQUIRED) REQUIRED)
add_library(shop SHARED add_library(shop SHARED
@@ -85,6 +86,7 @@ target_link_libraries(shop
Qt::Core Qt::Core
Qt::Gui Qt::Gui
Qt::Widgets Qt::Widgets
Qt::Qml
qdecimal qdecimal
decnumber decnumber
QxOrm QxOrm
+2 -2
View File
@@ -5,7 +5,7 @@ QX_REGISTER_CPP_SHOP(FavoritItem)
QX_REGISTER_ALL_QT_PROPERTIES(FavoritItem, "id") QX_REGISTER_ALL_QT_PROPERTIES(FavoritItem, "id")
long FavoritItem::id() long FavoritItem::id() const
{ {
return m_id; return m_id;
} }
@@ -55,7 +55,7 @@ void FavoritItem::setVatType(const Enums::VatType &vatType)
m_vatType = vatType; m_vatType = vatType;
} }
QString FavoritItem::pluginId() QString FavoritItem::pluginId() const
{ {
return m_pluginId; return m_pluginId;
} }
+3 -3
View File
@@ -30,13 +30,13 @@ public:
// IShopItem interface // IShopItem interface
public: public:
long id() override; long id() const override;
void setId(long id); void setId(long id);
QString name() override; QString name() override;
void setName(const QString &name); void setName(const QString &name);
virtual QString shortName() override; QString shortName() override;
void setShortName(const QString &shortName); void setShortName(const QString &shortName);
QDecDouble unitPrice() override; QDecDouble unitPrice() override;
@@ -45,7 +45,7 @@ public:
Enums::VatType vatType() override; Enums::VatType vatType() override;
void setVatType(const Enums::VatType &vatType); void setVatType(const Enums::VatType &vatType);
QString pluginId() override; QString pluginId() const override;
void setPluginId(const QString &pluginId); void setPluginId(const QString &pluginId);
QString favButtonName() const; QString favButtonName() const;
+17 -1
View File
@@ -131,7 +131,13 @@ void Voucher::addItem(QSharedPointer<VoucherItem> item)
void Voucher::removeItem(QSharedPointer<VoucherItem> item) void Voucher::removeItem(QSharedPointer<VoucherItem> item)
{ {
m_items.removeOne(item); if (item->id() != 0) {
m_items.removeIf([&item](const auto& it){
return item->id() == it->id();
});
} else {
m_items.removeOne(item);
}
} }
void Voucher::clearItems() void Voucher::clearItems()
@@ -415,3 +421,13 @@ QDecDouble VoucherSum::totalPrice() const
int VoucherSum::count() const { int VoucherSum::count() const {
return m_count; return m_count;
} }
VoucherSum::VoucherSum(int count, int totalPrice) : m_count(count), m_totalPrice(totalPrice) {}
void VoucherSum::addPrice(QDecDouble price) {
m_totalPrice += FROM_DEC(price);
}
void VoucherSum::addCount(int count) {
m_count += count;
}
+4
View File
@@ -210,9 +210,13 @@ class VoucherSum
QX_REGISTER_FRIEND_CLASS(VoucherSum) QX_REGISTER_FRIEND_CLASS(VoucherSum)
public: public:
VoucherSum() = default; VoucherSum() = default;
VoucherSum(int count, int totalPrice);
QDecDouble totalPrice() const; QDecDouble totalPrice() const;
int count() const; int count() const;
void addPrice(QDecDouble price);
void addCount(int count);
private: private:
int m_count{0}; int m_count{0};
+2 -2
View File
@@ -6,7 +6,7 @@ DirectSaleItem::DirectSaleItem(QObject *parent) : IShopItem(parent)
m_vat = Enums::NONE; m_vat = Enums::NONE;
} }
long DirectSaleItem::id() long DirectSaleItem::id() const
{ {
return 0; return 0;
} }
@@ -26,7 +26,7 @@ QDecDouble DirectSaleItem::unitPrice()
return m_unitPrice; return m_unitPrice;
} }
QString DirectSaleItem::pluginId() QString DirectSaleItem::pluginId() const
{ {
return ""; return "";
} }
+2 -2
View File
@@ -22,11 +22,11 @@ public slots:
// IShopItem interface // IShopItem interface
public: public:
long id() override; long id() const override;
QString name() override; QString name() override;
QString shortName() override; QString shortName() override;
QDecDouble unitPrice() override; QDecDouble unitPrice() override;
QString pluginId() override; QString pluginId() const override;
Enums::VatType vatType() override; Enums::VatType vatType() override;
int count() const; int count() const;
+5 -5
View File
@@ -8,11 +8,11 @@ class FavButtonStyle : public QProxyStyle
{ {
public: public:
FavButtonStyle(); FavButtonStyle();
virtual ~FavButtonStyle(); ~FavButtonStyle() override = default;
// QStyle interface // QStyle interface
public: public:
void drawItemText(QPainter *painter, const QRect &rect, int flags, const QPalette &pal, bool enabled, const QString &text, QPalette::ColorRole textRole) const; void drawItemText(QPainter *painter, const QRect &rect, int flags, const QPalette &pal, bool enabled, const QString &text, QPalette::ColorRole textRole) const override;
private: private:
Q_DISABLE_COPY(FavButtonStyle) Q_DISABLE_COPY(FavButtonStyle)
@@ -23,15 +23,15 @@ class FavButton : public QToolButton
Q_OBJECT Q_OBJECT
public: public:
FavButton(QWidget *parent = 0); explicit FavButton(QWidget *parent = nullptr);
signals: signals:
void itemDropped(); void itemDropped();
// QWidget interface // QWidget interface
protected: protected:
virtual void dragEnterEvent(QDragEnterEvent *event) override; void dragEnterEvent(QDragEnterEvent *event) override;
virtual void dropEvent(QDropEvent *event) override; void dropEvent(QDropEvent *event) override;
private: private:
FavButtonStyle m_style; FavButtonStyle m_style;
+1 -1
View File
@@ -12,7 +12,7 @@ class SHOPSHARED_EXPORT ISellableService
public: public:
ISellableService(); ISellableService();
virtual QList<IShopItemPtr> shopItems() = 0; virtual QList<IShopItemPtr> shopItems(const QString& category = "") = 0;
virtual IShopItemPtr shopItem(int itemId) = 0; virtual IShopItemPtr shopItem(int itemId) = 0;
virtual void addedToVoucher(int itemId, int countAdded) = 0; virtual void addedToVoucher(int itemId, int countAdded) = 0;
virtual ISeller *seller() = 0; virtual ISeller *seller() = 0;
+10 -2
View File
@@ -17,20 +17,28 @@ class SHOPSHARED_EXPORT IShopItem : public QObject
Q_PROPERTY(QString shortName READ shortName) Q_PROPERTY(QString shortName READ shortName)
Q_PROPERTY(QDecDouble unitPrice READ unitPrice) Q_PROPERTY(QDecDouble unitPrice READ unitPrice)
Q_PROPERTY(Enums::VatType vatType READ vatType) Q_PROPERTY(Enums::VatType vatType READ vatType)
Q_PROPERTY(bool favorite READ favorite)
public: public:
explicit IShopItem(QObject* parent = nullptr); explicit IShopItem(QObject* parent = nullptr);
~IShopItem() override = default; ~IShopItem() override = default;
virtual long id() { return {}; } virtual long id() const { return {}; }
virtual QString name() { return {}; } virtual QString name() { return {}; }
virtual QString code() { return {}; } virtual QString code() { return {}; }
virtual QString shortName() { return {}; } virtual QString shortName() { return {}; }
virtual QDecDouble unitPrice() { return {}; } virtual QDecDouble unitPrice() { return {}; }
virtual Enums::VatType vatType() { return {}; } virtual Enums::VatType vatType() { return {}; }
virtual QString pluginId() { return {}; } virtual QString pluginId() const { return {}; }
virtual QString color() { return {}; }
virtual QString category() { return {}; }
virtual bool favorite() { return false; }
}; };
inline bool operator==(const IShopItem& lhs, const IShopItem& rhs) {
return lhs.id() == rhs.id() && lhs.pluginId() == rhs.pluginId();
}
using IShopItemPtr = QSharedPointer<IShopItem>; using IShopItemPtr = QSharedPointer<IShopItem>;
QX_REGISTER_HPP_SHOP(IShopItem, QObject, 0) QX_REGISTER_HPP_SHOP(IShopItem, QObject, 0)
+9 -1
View File
@@ -47,12 +47,20 @@ PaydVouchersDialog::PaydVouchersDialog(QWidget *parent) :
ui->tableItems->setColumnHidden(0, true); ui->tableItems->setColumnHidden(0, true);
ui->tableItems->verticalScrollBar()->setStyleSheet("QScrollBar:vertical { width: 30px; }"); ui->tableItems->verticalScrollBar()->setStyleSheet("QScrollBar:vertical { width: 30px; }");
#ifndef EET
ui->btnEetNotSen->setVisible(false);
ui->btnSendEet->setVisible(false);
ui->label_2->setVisible(false);
ui->lblEetStatus->setVisible(false);
#endif
ShopService srv; ShopService srv;
m_voucherModel->setData(srv.paiedVouchers()); m_voucherModel->setData(srv.paiedVouchers());
ui->tableVouchers->sortByColumn(0,Qt::AscendingOrder); ui->tableVouchers->sortByColumn(0,Qt::AscendingOrder);
ui->tableVouchers->verticalScrollBar()->setStyleSheet("QScrollBar:vertical { width: 30px; }"); ui->tableVouchers->verticalScrollBar()->setStyleSheet("QScrollBar:vertical { width: 30px; }");
connect(ui->tableVouchers->selectionModel(), &QItemSelectionModel::currentRowChanged, [this, &srv](const QModelIndex &current, const QModelIndex &) { connect(ui->tableVouchers->selectionModel(), &QItemSelectionModel::currentRowChanged, [this](const QModelIndex &current, const QModelIndex &) {
ShopService srv;
QSharedPointer<Voucher> voucher = m_voucherModel->itemFromIndex(current); QSharedPointer<Voucher> voucher = m_voucherModel->itemFromIndex(current);
if (voucher->items().isEmpty()) { if (voucher->items().isEmpty()) {
srv.load(voucher); srv.load(voucher);
+4 -4
View File
@@ -59,11 +59,11 @@ void ReceiptGenerator::print()
DWORD dwBytes; DWORD dwBytes;
BOOL bStatus = FALSE; BOOL bStatus = FALSE;
if (OpenPrinter((LPWSTR)printer.toStdWString().c_str(), &hPrinter, NULL)) if (OpenPrinter((LPWSTR)printer.toStdWString().c_str(), &hPrinter, nullptr))
{ {
docInfo.pDocName = L"Uctenka"; docInfo.pDocName = (LPWSTR)(L"Uctenka");
docInfo.pOutputFile = NULL; docInfo.pOutputFile = nullptr;
docInfo.pDatatype = L"RAW"; docInfo.pDatatype = (LPWSTR)(L"RAW");
dwJob = StartDocPrinter(hPrinter, 1, (LPBYTE)&docInfo); dwJob = StartDocPrinter(hPrinter, 1, (LPBYTE)&docInfo);
if (dwJob > 0) if (dwJob > 0)
+5 -7
View File
@@ -1,8 +1,6 @@
#include "shopsettingsform.h" #include "shopsettingsform.h"
#include "ui_shopsettingsform.h" #include "ui_shopsettingsform.h"
#include <settingsservice.h>
#include <combodata.h>
#include <QFileDialog> #include <QFileDialog>
#include <QDragEnterEvent> #include <QDragEnterEvent>
#include <QDebug> #include <QDebug>
@@ -18,6 +16,7 @@ ShopSettingsForm::ShopSettingsForm(QWidget *parent) :
registerBinding(ui->lettersPerLine); registerBinding(ui->lettersPerLine);
registerBinding(ui->byMessage); registerBinding(ui->byMessage);
#ifdef EET
registerBinding(ui->eetActive); registerBinding(ui->eetActive);
registerBinding(ui->eetShopId); registerBinding(ui->eetShopId);
registerBinding(ui->eetRegisterId); registerBinding(ui->eetRegisterId);
@@ -28,6 +27,9 @@ ShopSettingsForm::ShopSettingsForm(QWidget *parent) :
registerBinding(ui->eetKeyPassword); registerBinding(ui->eetKeyPassword);
registerBinding(ui->eetTest); registerBinding(ui->eetTest);
registerBinding(ui->eetPlayground); registerBinding(ui->eetPlayground);
#else
ui->tabWidget->removeTab(2);
#endif
registerBinding(ui->favBtnCols); registerBinding(ui->favBtnCols);
registerBinding(ui->favBtnRows); registerBinding(ui->favBtnRows);
@@ -146,7 +148,7 @@ bool ShopSettingsForm::saveRecord()
} }
foreach (QString btnName, m_btnMap.keys()) { foreach (QString btnName, m_btnMap.keys()) {
if (m_btnMap[btnName] != NULL) if (m_btnMap[btnName] != nullptr)
{ {
srvFav.save(m_btnMap[btnName]); srvFav.save(m_btnMap[btnName]);
} }
@@ -192,10 +194,6 @@ FavButtonStyle::FavButtonStyle()
{ {
} }
FavButtonStyle::~FavButtonStyle()
{
}
void FavButtonStyle::drawItemText(QPainter *painter, const QRect &rect, int flags, const QPalette &pal, bool enabled, const QString &text, QPalette::ColorRole textRole) const void FavButtonStyle::drawItemText(QPainter *painter, const QRect &rect, int flags, const QPalette &pal, bool enabled, const QString &text, QPalette::ColorRole textRole) const
{ {
flags |= Qt::TextWordWrap; flags |= Qt::TextWordWrap;
+128 -10
View File
@@ -145,6 +145,7 @@ void ShopForm::loadLast()
m_commodityModel->setData(srv.allSellableItems()); m_commodityModel->setData(srv.allSellableItems());
ui->commodityTable->horizontalHeader()->setSectionResizeMode(1, QHeaderView::Stretch); ui->commodityTable->horizontalHeader()->setSectionResizeMode(1, QHeaderView::Stretch);
ui->commodityTable->setColumnHidden(4, true); ui->commodityTable->setColumnHidden(4, true);
ui->commodityTable->setColumnHidden(5, true);
ui->commodityTable->setColumnHidden(2, true); ui->commodityTable->setColumnHidden(2, true);
ui->commodityTable->setColumnWidth(3, 90); ui->commodityTable->setColumnWidth(3, 90);
@@ -167,22 +168,20 @@ void ShopForm::loadButtons(const ShopSettingsPtr& settings)
Service<FavoritItem> srvFav; Service<FavoritItem> srvFav;
QMap<QString, FavoritItemPtr> btnMap; QMap<QString, FavoritItemPtr> btnMap;
foreach (QWidget *child, ui->favorites->findChildren<QWidget*>()) { clearFavButtons();
if (child->objectName() != "directSale")
{
delete child;
}
}
foreach (FavoritItemPtr item, srvFav.all()) { foreach (FavoritItemPtr item, srvFav.all()) {
btnMap[item->favButtonName()] = item; btnMap[item->favButtonName()] = item;
} }
ShopService srv;
auto allItems = srv.allSellableItems();
for (int i = 0; i < settings->favBtnRows(); i++) for (int i = 0; i < settings->favBtnRows(); i++)
{ {
for (int j = 0; j < settings->favBtnCols(); j++) for (int j = 0; j < settings->favBtnCols(); j++)
{ {
FavButton *btn = new FavButton(ui->favorites); auto *btn = new QToolButton(ui->favorites);
QString btnName = QString::number(i) + "_" + QString::number(j); QString btnName = QString::number(i) + "_" + QString::number(j);
btn->setObjectName(btnName); btn->setObjectName(btnName);
@@ -197,6 +196,16 @@ void ShopForm::loadButtons(const ShopSettingsPtr& settings)
if (btnMap[btnName] != nullptr) if (btnMap[btnName] != nullptr)
{ {
btn->setText(btnMap[btnName]->shortName()); btn->setText(btnMap[btnName]->shortName());
auto shItem = std::find_if(allItems.begin(), allItems.end(),[btnMap, btn](auto it) -> bool {
return btnMap[btn->objectName()]->refId() == it->id() && btnMap[btn->objectName()]->pluginId() == it->pluginId();
});
if (shItem != allItems.end()) {
btn->setStyleSheet("background: " + shItem->data()->color() + ";");
btn->update();
}
connect(btn, &FavButton::clicked, [this, btnMap, btn](bool){ connect(btn, &FavButton::clicked, [this, btnMap, btn](bool){
FavoritItemPtr item = btnMap[btn->objectName()]; FavoritItemPtr item = btnMap[btn->objectName()];
@@ -249,6 +258,7 @@ void ShopForm::setupForm()
loadLast(); loadLast();
fillReceiptCombo(); fillReceiptCombo();
loadButtons(settings); loadButtons(settings);
loadCatButtons();
} }
void ShopForm::on_directSale_clicked() void ShopForm::on_directSale_clicked()
@@ -505,7 +515,6 @@ void ShopForm::recalculate()
{ {
ShopService srv; ShopService srv;
srv.calculate(m_voucher); srv.calculate(m_voucher);
this->m_itemsModel->setData(m_voucher->items());
setTotalText(); setTotalText();
ui->temporarySaveButton->setEnabled(!m_voucher->items().isEmpty()); ui->temporarySaveButton->setEnabled(!m_voucher->items().isEmpty());
@@ -514,12 +523,15 @@ void ShopForm::recalculate()
if (m_voucher->status() == Voucher::NEW && m_voucher->id() == 0) if (m_voucher->status() == Voucher::NEW && m_voucher->id() == 0)
{ {
srv.saveVoucher(m_voucher); srv.save(m_voucher);
} }
else else
{ {
srv.update(m_voucher); srv.update(m_voucher);
} }
this->m_itemsModel->setData(m_voucher->items());
connectItemSignals();
} }
void ShopForm::on_receiptCombo_currentIndexChanged(int) void ShopForm::on_receiptCombo_currentIndexChanged(int)
@@ -644,7 +656,9 @@ void ShopForm::on_actionDelete_items_triggered()
QList<VoucherItemPtr> forDelete; QList<VoucherItemPtr> forDelete;
for (const auto& row : ui->actualReceipt->selectionModel()->selectedIndexes()) { for (const auto& row : ui->actualReceipt->selectionModel()->selectedIndexes()) {
forDelete << m_itemsModel->itemFromIndex(row); if (!forDelete.contains(m_itemsModel->itemFromIndex(row))) {
forDelete << m_itemsModel->itemFromIndex(row);
}
} }
for (auto& item : forDelete) { for (auto& item : forDelete) {
@@ -664,3 +678,107 @@ void ShopForm::on_actualReceipt_customContextMenuRequested(const QPoint &pos)
QPoint globalPos = ui->actualReceipt->mapToGlobal(pos); QPoint globalPos = ui->actualReceipt->mapToGlobal(pos);
m_itemCtxMenu->exec(globalPos); m_itemCtxMenu->exec(globalPos);
} }
void ShopForm::clearFavButtons() {
foreach (QWidget *child, ui->favorites->findChildren<QWidget*>()) {
if (child->objectName() != "directSale")
{
delete child;
}
}
}
void ShopForm::loadFavCatButtons(const QString& category) {
SettingsService srvSettings("SHOP");
ShopSettingsPtr settings = srvSettings.loadSettings<ShopSettings>();
if (category.isEmpty()) {
loadButtons(settings);
return;
}
clearFavButtons();
ShopService srv;
auto all = srv.allSellableItems(category);
if (all.count() == 0) {
return;
}
auto square = std::sqrt(all.count());
int cols = static_cast<int>(square);
int rows = cols;
if (square - cols != 0) {
if (cols > 1) {
++rows;
} else {
++cols;
}
}
if (cols * rows < all.count()) {
++cols;
}
int index = 0;
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
if (index >= all.count()) {
break;
}
auto item = all[index];
++index;
auto *btn = new QToolButton(ui->favorites);
if (settings->favBtnSize() > 0)
{
btn->setMinimumHeight(settings->favBtnSize());
btn->setMinimumWidth(settings->favBtnSize());
}
btn->setText(item->shortName());
btn->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
((QGridLayout*)ui->favorites->layout())->addWidget(btn, i + 1, j);
btn->setStyleSheet("background: " + item->color() + ";");
btn->update();
connect(btn, &QToolButton::clicked, [this, item](bool){
addItem(item, 1);
});
}
}
}
void ShopForm::loadCatButtons() {
ShopService srv;
auto allCat = srv.allCategories();
for (const auto btnFav : ui->widgetCategories->findChildren<QWidget*>()) {
if (btnFav->objectName() != "btnFav") {
delete btnFav;
}
}
for (const auto& cat : allCat.keys()) {
auto catButton = new QToolButton(ui->widgetCategories);
catButton->setText(cat);
catButton->setMinimumHeight(45);
catButton->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
catButton->setStyleSheet("background: " + allCat[cat] + ";");
catButton->update();
connect(catButton, &QPushButton::clicked, [this, cat](bool){
loadFavCatButtons(cat);
});
ui->widgetCategories->layout()->addWidget(catButton);
}
}
void ShopForm::on_btnFav_clicked() {
loadFavCatButtons("");
}
+5
View File
@@ -42,6 +42,8 @@ private slots:
void on_payButton_clicked(); void on_payButton_clicked();
void on_btnFav_clicked();
void on_showPaidButton_clicked(); void on_showPaidButton_clicked();
void on_btnAddItem_clicked(); void on_btnAddItem_clicked();
@@ -67,6 +69,9 @@ private:
void loadLast(); void loadLast();
void loadButtons(const ShopSettingsPtr& settings); void loadButtons(const ShopSettingsPtr& settings);
void loadFavCatButtons(const QString& category);
void loadCatButtons();
void clearFavButtons();
void fillReceiptCombo(); void fillReceiptCombo();
void createVoucher(); void createVoucher();
void doTempSave(bool comboChanged); void doTempSave(bool comboChanged);
+67 -43
View File
@@ -35,6 +35,73 @@
<property name="bottomMargin"> <property name="bottomMargin">
<number>0</number> <number>0</number>
</property> </property>
<item>
<widget class="QWidget" name="widgetButtons" native="true">
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QToolButton" name="directSale">
<property name="font">
<font>
<pointsize>10</pointsize>
</font>
</property>
<property name="text">
<string>Direct Sell</string>
</property>
<property name="icon">
<iconset resource="shoprc.qrc">
<normaloff>:/icons/shop.svg</normaloff>:/icons/shop.svg</iconset>
</property>
<property name="iconSize">
<size>
<width>45</width>
<height>45</height>
</size>
</property>
<property name="shortcut">
<string>Ctrl+D</string>
</property>
<property name="toolButtonStyle">
<enum>Qt::ToolButtonTextUnderIcon</enum>
</property>
<property name="autoRaise">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<widget class="QWidget" name="widgetCategories" native="true">
<layout class="QHBoxLayout" name="horizontalLayout_5">
<item>
<widget class="QPushButton" name="btnFav">
<property name="minimumSize">
<size>
<width>0</width>
<height>45</height>
</size>
</property>
<property name="text">
<string>Favorities</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QWidget" name="favorites" native="true">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="MinimumExpanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<layout class="QGridLayout" name="gridLayout"/>
</widget>
</item>
</layout>
</widget>
</item>
<item> <item>
<widget class="QWidget" name="widgetComodity" native="true"> <widget class="QWidget" name="widgetComodity" native="true">
<layout class="QVBoxLayout" name="verticalLayout_3"> <layout class="QVBoxLayout" name="verticalLayout_3">
@@ -110,49 +177,6 @@
</layout> </layout>
</widget> </widget>
</item> </item>
<item>
<widget class="QWidget" name="widgetButtons" native="true">
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QWidget" name="favorites" native="true">
<layout class="QGridLayout" name="gridLayout">
<item row="0" column="0">
<widget class="QToolButton" name="directSale">
<property name="font">
<font>
<pointsize>10</pointsize>
</font>
</property>
<property name="text">
<string>Direct Sell</string>
</property>
<property name="icon">
<iconset resource="shoprc.qrc">
<normaloff>:/icons/shop.svg</normaloff>:/icons/shop.svg</iconset>
</property>
<property name="iconSize">
<size>
<width>45</width>
<height>45</height>
</size>
</property>
<property name="shortcut">
<string>Ctrl+D</string>
</property>
<property name="toolButtonStyle">
<enum>Qt::ToolButtonTextUnderIcon</enum>
</property>
<property name="autoRaise">
<bool>true</bool>
</property>
</widget>
</item>
</layout>
</widget>
</item>
</layout>
</widget>
</item>
<item> <item>
<widget class="QWidget" name="widget_2" native="true"> <widget class="QWidget" name="widget_2" native="true">
<layout class="QVBoxLayout" name="verticalLayout_6"> <layout class="QVBoxLayout" name="verticalLayout_6">
+2 -2
View File
@@ -25,13 +25,13 @@ public slots:
// IShopItem interface // IShopItem interface
public: public:
long id() override { return 0; } long id() const override { return 0; }
QString code() override { return ""; } QString code() override { return ""; }
QString name() override { return ""; } QString name() override { return ""; }
QString shortName() override { return ""; } QString shortName() override { return ""; }
QDecDouble unitPrice() override { return {}; } QDecDouble unitPrice() override { return {}; }
Enums::VatType vatType() override { return Enums::NONE; } Enums::VatType vatType() override { return Enums::NONE; }
QString pluginId() override { return ""; } QString pluginId() const override { return ""; }
}; };
typedef QSharedPointer<ShopItem> ShopItemPtr; typedef QSharedPointer<ShopItem> ShopItemPtr;
+13 -1
View File
@@ -7,6 +7,11 @@ ShopOverview::ShopOverview(QWidget *parent) :
ui(new Ui::ShopOverview) ui(new Ui::ShopOverview)
{ {
ui->setupUi(this); ui->setupUi(this);
#ifndef EET
ui->labelUnsendEET->setVisible(false);
ui->label_6->setVisible(false);
#endif
} }
ShopOverview::~ShopOverview() ShopOverview::~ShopOverview()
@@ -19,9 +24,16 @@ void ShopOverview::refresh()
ShopService srv; ShopService srv;
VoucherSum unpaid = srv.unpaidSummary(); VoucherSum unpaid = srv.unpaidSummary();
VoucherSum unsend = srv.unsendEET();
ui->labelUnapiedCount->setText(QString::number(unpaid.count())); ui->labelUnapiedCount->setText(QString::number(unpaid.count()));
ui->labelUnpaiedAmount->setText(QString::number(unpaid.totalPrice().toDouble())); ui->labelUnpaiedAmount->setText(QString::number(unpaid.totalPrice().toDouble()));
VoucherSum today = srv.salesSummary(QDate::currentDate());
ui->labelSales->setText(QString::number(today.totalPrice().toDouble()));
ui->labelNumSales->setText(QString::number(today.count()));
#ifdef EET
VoucherSum unsend = srv.unsendEET();
ui->labelUnsendEET->setText(QString::number(unsend.count())); ui->labelUnsendEET->setText(QString::number(unsend.count()));
#endif
} }
+47 -3
View File
@@ -7,7 +7,7 @@
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>908</width> <width>908</width>
<height>95</height> <height>162</height>
</rect> </rect>
</property> </property>
<property name="windowTitle"> <property name="windowTitle">
@@ -83,7 +83,6 @@
<widget class="QLabel" name="label_6"> <widget class="QLabel" name="label_6">
<property name="font"> <property name="font">
<font> <font>
<weight>75</weight>
<bold>true</bold> <bold>true</bold>
</font> </font>
</property> </property>
@@ -102,7 +101,6 @@
</property> </property>
<property name="font"> <property name="font">
<font> <font>
<weight>75</weight>
<bold>true</bold> <bold>true</bold>
</font> </font>
</property> </property>
@@ -114,6 +112,52 @@
</property> </property>
</widget> </widget>
</item> </item>
<item row="4" column="0">
<widget class="QLabel" name="label_3">
<property name="text">
<string>Today sales:</string>
</property>
</widget>
</item>
<item row="4" column="1">
<widget class="QLabel" name="labelSales">
<property name="minimumSize">
<size>
<width>90</width>
<height>0</height>
</size>
</property>
<property name="text">
<string>TextLabel</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QLabel" name="label_5">
<property name="text">
<string>Number of sales today:</string>
</property>
</widget>
</item>
<item row="3" column="1">
<widget class="QLabel" name="labelNumSales">
<property name="minimumSize">
<size>
<width>90</width>
<height>0</height>
</size>
</property>
<property name="text">
<string>TextLabel</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
</layout> </layout>
</widget> </widget>
</item> </item>
+74 -12
View File
@@ -60,10 +60,6 @@ void ShopService::calculate(VoucherPtr voucher)
loadSettings(); loadSettings();
if (voucher->items().isEmpty()) {
load(voucher);
}
foreach (QSharedPointer<VoucherItem> item, voucher->items()) { foreach (QSharedPointer<VoucherItem> item, voucher->items()) {
if (item->refId() == ROUNDING_ITEM) if (item->refId() == ROUNDING_ITEM)
@@ -173,6 +169,10 @@ void ShopService::pay(VoucherPtr voucher)
voucher->setPayDateTime(QDateTime::currentDateTime()); voucher->setPayDateTime(QDateTime::currentDateTime());
this->update(voucher, &session); this->update(voucher, &session);
if (!session.isValid()) {
qDebug() << session.firstError().text();
}
} }
void ShopService::updateRelatedItem(VoucherItem* item, int countAdded) void ShopService::updateRelatedItem(VoucherItem* item, int countAdded)
@@ -371,7 +371,7 @@ void ShopService::moveItems(QList<VoucherItemPtr> items, VoucherPtr source, Vouc
if (target->status() == Voucher::NEW && target->id() == 0) if (target->status() == Voucher::NEW && target->id() == 0)
{ {
this->saveVoucher(target, &session); this->save(target, &session);
} }
for (const auto& it : items) { for (const auto& it : items) {
@@ -380,6 +380,9 @@ void ShopService::moveItems(QList<VoucherItemPtr> items, VoucherPtr source, Vouc
it->setVoucher(target); it->setVoucher(target);
} }
calculate(target);
update(target, &session);
if (source->items().isEmpty()) if (source->items().isEmpty())
{ {
erase(source, &session); erase(source, &session);
@@ -415,7 +418,7 @@ QList<VoucherPtr> ShopService::vouchersForEet()
.arg(QString::number(Voucher::PAID), QString::number(Voucher::EET_SENT), QString::number(Voucher::EET_NOT_ENTERING))); .arg(QString::number(Voucher::PAID), QString::number(Voucher::EET_SENT), QString::number(Voucher::EET_NOT_ENTERING)));
} }
QList<IShopItemPtr> ShopService::allSellableItems() QList<IShopItemPtr> ShopService::allSellableItems(const QString& category/* = ""*/)
{ {
QList<QSharedPointer<IShopItem> > items; QList<QSharedPointer<IShopItem> > items;
foreach (IPlugin *plugin, Context::instance().plugins()) { foreach (IPlugin *plugin, Context::instance().plugins()) {
@@ -424,7 +427,7 @@ QList<IShopItemPtr> ShopService::allSellableItems()
if (selSrv != nullptr) if (selSrv != nullptr)
{ {
items.append(selSrv->shopItems()); items.append(selSrv->shopItems(category));
} }
} }
@@ -433,9 +436,7 @@ QList<IShopItemPtr> ShopService::allSellableItems()
VoucherSum ShopService::unpaidSummary() VoucherSum ShopService::unpaidSummary()
{ {
VoucherSum sum; //= db->query_value<VoucherSum>("status = " + query::_ref((int)Voucher::NOT_PAID)); return summary("status = " + QString::number(Voucher::NOT_PAID));
return sum;
} }
VoucherSum ShopService::unsendEET() VoucherSum ShopService::unsendEET()
@@ -491,13 +492,74 @@ QDecDouble ShopService::vatRate(Enums::VatType vatType)
return vatRate; return vatRate;
} }
void ShopService::saveVoucher(VoucherPtr entity, qx::QxSession* pSession/* = nullptr*/) void ShopService::save(VoucherPtr entity, qx::QxSession* pSession/* = nullptr*/)
{ {
SeasonService seasonSrv; SeasonService seasonSrv;
SeasonPtr season = seasonSrv.active(); SeasonPtr season = seasonSrv.active();
entity->setSeason(season); entity->setSeason(season);
addDateAndUser(entity, true); addDateAndUser(entity, true);
save(entity, pSession); Service::save(entity, pSession);
}
QMap<QString, QString> ShopService::allCategories() {
QMap<QString, QString> ret;
for (const auto& item : allSellableItems()) {
if (!item->category().isEmpty() && !ret.contains(item->category())) {
ret[item->category()] = item->color();
}
}
return ret;
}
void ShopService::update(VoucherPtr entity, qx::QxSession* pSession) {
bool reloadItems = pSession == nullptr;
{
QScopedPointer<qx::QxSession> ptrSession;
if (pSession == nullptr) {
ptrSession.reset(new qx::QxSession());
pSession = ptrSession.data();
}
Service::update(entity, pSession);
auto oldItems = entity->items();
Service<VoucherItem> srvItem;
auto items = srvItem.all("voucher = " + QString::number(entity->id()));
for (auto item : items) {
auto newItem = std::find_if(oldItems.begin(), oldItems.end(), [item](auto it){
return item->id() == it->id();
});
if (newItem == oldItems.end()) {
qx::dao::delete_by_id(item, pSession->database());
}
}
}
if (reloadItems) {
entity->clearItems();
load(entity);
}
}
VoucherSum ShopService::salesSummary(QDate date) {
return summary("payDateTime >= '" + date.toString("yyyy-MM-dd") + "'");
}
VoucherSum ShopService::summary(const QString& where) {
auto sums = all(where);
VoucherSum sum(sums.count(), 0);
for (const auto& item : sums) {
sum.addPrice(item->totalPrice());
}
return sum;
} }
+6 -2
View File
@@ -27,7 +27,8 @@ public:
void calculate(VoucherPtr voucher); void calculate(VoucherPtr voucher);
void calculateItem(VoucherItemPtr item); void calculateItem(VoucherItemPtr item);
void pay(VoucherPtr voucher); void pay(VoucherPtr voucher);
void saveVoucher(VoucherPtr entity, qx::QxSession* pSession = nullptr); void save(VoucherPtr entity, qx::QxSession* pSession = nullptr) override;
void update(VoucherPtr entity, qx::QxSession* pSession = nullptr) override;
void moveItems(QList<VoucherItemPtr> items, VoucherPtr source, VoucherPtr target); void moveItems(QList<VoucherItemPtr> items, VoucherPtr source, VoucherPtr target);
void updateRelatedItem(VoucherItem* item, int countAdded); void updateRelatedItem(VoucherItem* item, int countAdded);
bool processEet(VoucherPtr voucher, QString &message); bool processEet(VoucherPtr voucher, QString &message);
@@ -40,14 +41,17 @@ public:
QList<VoucherPtr> tempVouchers(); QList<VoucherPtr> tempVouchers();
QList<VoucherPtr> paiedVouchers(); QList<VoucherPtr> paiedVouchers();
QList<VoucherPtr> vouchersForEet(); QList<VoucherPtr> vouchersForEet();
QList<IShopItemPtr> allSellableItems(); QList<IShopItemPtr> allSellableItems(const QString& category = "");
QMap<QString, QString> allCategories();
VoucherSum unpaidSummary(); VoucherSum unpaidSummary();
VoucherSum salesSummary(QDate date);
VoucherSum unsendEET(); VoucherSum unsendEET();
private: private:
QDecDouble includeVat(QDecDouble price, Enums::VatType vatType); QDecDouble includeVat(QDecDouble price, Enums::VatType vatType);
QDecDouble excludeVat(QDecDouble price, Enums::VatType vatType); QDecDouble excludeVat(QDecDouble price, Enums::VatType vatType);
void loadSettings(); void loadSettings();
VoucherSum summary(const QString& where);
QSharedPointer<GlobalSettings> m_gs; QSharedPointer<GlobalSettings> m_gs;
QDecDouble vatRate(Enums::VatType vatType); QDecDouble vatRate(Enums::VatType vatType);
Binary file not shown.
+179 -95
View File
@@ -29,22 +29,22 @@
<translation>Sazba DPH</translation> <translation>Sazba DPH</translation>
</message> </message>
<message> <message>
<location filename="../directsaleform.cpp" line="17"/> <location filename="../directsaleform.cpp" line="18"/>
<source>None</source> <source>None</source>
<translation>Žádná</translation> <translation>Žádná</translation>
</message> </message>
<message> <message>
<location filename="../directsaleform.cpp" line="18"/> <location filename="../directsaleform.cpp" line="19"/>
<source>High</source> <source>High</source>
<translation>Vysoká</translation> <translation>Vysoká</translation>
</message> </message>
<message> <message>
<location filename="../directsaleform.cpp" line="19"/> <location filename="../directsaleform.cpp" line="20"/>
<source>First Lower</source> <source>First Lower</source>
<translation>První snížená</translation> <translation>První snížená</translation>
</message> </message>
<message> <message>
<location filename="../directsaleform.cpp" line="20"/> <location filename="../directsaleform.cpp" line="21"/>
<source>Second Lower</source> <source>Second Lower</source>
<translation>Druhá snížená</translation> <translation>Druhá snížená</translation>
</message> </message>
@@ -60,36 +60,41 @@
<context> <context>
<name>PayDialog</name> <name>PayDialog</name>
<message> <message>
<location filename="../paydialog.ui" line="14"/> <location filename="../paydialog.ui" line="20"/>
<source>Recieve money</source> <source>Recieve money</source>
<translation>Platba</translation> <translation>Platba</translation>
</message> </message>
<message> <message>
<location filename="../paydialog.ui" line="30"/> <location filename="../paydialog.ui" line="36"/>
<source>Total:</source> <source>Total:</source>
<translation>Celkem:</translation> <translation>Celkem:</translation>
</message> </message>
<message> <message>
<location filename="../paydialog.ui" line="44"/> <location filename="../paydialog.ui" line="50"/>
<location filename="../paydialog.ui" line="101"/> <location filename="../paydialog.ui" line="107"/>
<source>0</source> <source>0</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../paydialog.ui" line="59"/> <location filename="../paydialog.ui" line="65"/>
<source>Recieved</source> <source>Recieved</source>
<translation>Obdrženo</translation> <translation>Obdrženo</translation>
</message> </message>
<message> <message>
<location filename="../paydialog.ui" line="89"/> <location filename="../paydialog.ui" line="95"/>
<source>Return</source> <source>Return</source>
<translation>Vrátit</translation> <translation>Vrátit</translation>
</message> </message>
<message> <message>
<location filename="../paydialog.ui" line="124"/> <location filename="../paydialog.ui" line="117"/>
<source>Send to EET portal</source> <source>Send to EET portal</source>
<translation>Odeslat na EET</translation> <translation>Odeslat na EET</translation>
</message> </message>
<message>
<location filename="../paydialog.ui" line="142"/>
<source>OK</source>
<translation>OK</translation>
</message>
</context> </context>
<context> <context>
<name>PaydVouchersDialog</name> <name>PaydVouchersDialog</name>
@@ -104,65 +109,66 @@
<translation>Vytisknout účtenku</translation> <translation>Vytisknout účtenku</translation>
</message> </message>
<message> <message>
<location filename="../paydvouchersdialog.ui" line="55"/> <location filename="../paydvouchersdialog.ui" line="75"/>
<location filename="../paydvouchersdialog.cpp" line="99"/> <location filename="../paydvouchersdialog.cpp" line="110"/>
<source>Save receipt</source> <source>Save receipt</source>
<translation>Uložit účtenku</translation> <translation>Uložit účtenku</translation>
</message> </message>
<message> <message>
<location filename="../paydvouchersdialog.ui" line="58"/> <location filename="../paydvouchersdialog.ui" line="52"/>
<location filename="../paydvouchersdialog.ui" line="78"/> <location filename="../paydvouchersdialog.ui" line="78"/>
<location filename="../paydvouchersdialog.ui" line="101"/> <location filename="../paydvouchersdialog.ui" line="98"/>
<location filename="../paydvouchersdialog.ui" line="121"/>
<source>...</source> <source>...</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../paydvouchersdialog.ui" line="153"/> <location filename="../paydvouchersdialog.ui" line="173"/>
<source>Items</source> <source>Items</source>
<translation>Položky</translation> <translation>Položky</translation>
</message> </message>
<message> <message>
<location filename="../paydvouchersdialog.ui" line="168"/> <location filename="../paydvouchersdialog.ui" line="188"/>
<source>EET:</source> <source>EET:</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../paydvouchersdialog.ui" line="219"/> <location filename="../paydvouchersdialog.ui" line="239"/>
<source>Total:</source> <source>Total:</source>
<translation>Celkem:</translation> <translation>Celkem:</translation>
</message> </message>
<message> <message>
<location filename="../paydvouchersdialog.ui" line="239"/> <location filename="../paydvouchersdialog.ui" line="259"/>
<source>0</source> <source>0</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../paydvouchersdialog.cpp" line="63"/> <location filename="../paydvouchersdialog.cpp" line="74"/>
<source>not entering</source> <source>not entering</source>
<translation>Nevstupuje</translation> <translation>Nevstupuje</translation>
</message> </message>
<message> <message>
<location filename="../paydvouchersdialog.cpp" line="66"/> <location filename="../paydvouchersdialog.cpp" line="77"/>
<source>for send</source> <source>for send</source>
<translation>K odeslání</translation> <translation>K odeslání</translation>
</message> </message>
<message> <message>
<location filename="../paydvouchersdialog.cpp" line="69"/> <location filename="../paydvouchersdialog.cpp" line="80"/>
<source>error</source> <source>error</source>
<translation>Chyba</translation> <translation>Chyba</translation>
</message> </message>
<message> <message>
<location filename="../paydvouchersdialog.cpp" line="72"/> <location filename="../paydvouchersdialog.cpp" line="83"/>
<source>sent</source> <source>sent</source>
<translation>Odesláno</translation> <translation>Odesláno</translation>
</message> </message>
<message> <message>
<location filename="../paydvouchersdialog.cpp" line="99"/> <location filename="../paydvouchersdialog.cpp" line="110"/>
<source>Text files (*.txt)</source> <source>Text files (*.txt)</source>
<translation>Textové soubory (*.txt)</translation> <translation>Textové soubory (*.txt)</translation>
</message> </message>
<message> <message>
<location filename="../paydvouchersdialog.cpp" line="139"/> <location filename="../paydvouchersdialog.cpp" line="150"/>
<source>Error</source> <source>Error</source>
<translation>Chyba</translation> <translation>Chyba</translation>
</message> </message>
@@ -170,33 +176,33 @@
<context> <context>
<name>QObject</name> <name>QObject</name>
<message> <message>
<location filename="../shopform.cpp" line="36"/> <location filename="../shopform.cpp" line="35"/>
<source>EET communication error. <source>EET communication error.
</source> </source>
<translation>Chyba komunikace s EET</translation> <translation>Chyba komunikace s EET</translation>
</message> </message>
<message> <message>
<location filename="../shopform.cpp" line="40"/> <location filename="../shopform.cpp" line="39"/>
<source>Message from portal: </source> <source>Message from portal: </source>
<translation>Zpráva z EET portálu:</translation> <translation>Zpráva z EET portálu:</translation>
</message> </message>
<message> <message>
<location filename="../shopform.cpp" line="43"/> <location filename="../shopform.cpp" line="42"/>
<source>Switch to offline?</source> <source>Switch to offline?</source>
<translation>Přepnout do offline?</translation> <translation>Přepnout do offline?</translation>
</message> </message>
<message> <message>
<location filename="../shopform.cpp" line="45"/> <location filename="../shopform.cpp" line="44"/>
<source>EET error</source> <source>EET error</source>
<translation>Chyba EET</translation> <translation>Chyba EET</translation>
</message> </message>
<message> <message>
<location filename="../shopform.cpp" line="51"/> <location filename="../shopform.cpp" line="50"/>
<source>&lt;a href=&quot;#eet&quot;&gt;Online&lt;/a&gt;</source> <source>&lt;a href=&quot;#eet&quot;&gt;Online&lt;/a&gt;</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../shopform.cpp" line="51"/> <location filename="../shopform.cpp" line="50"/>
<source>&lt;a href=&quot;#eet&quot;&gt;Offline&lt;/a&gt;</source> <source>&lt;a href=&quot;#eet&quot;&gt;Offline&lt;/a&gt;</source>
<translation></translation> <translation></translation>
</message> </message>
@@ -223,6 +229,11 @@
<source>Items</source> <source>Items</source>
<translation>Položky</translation> <translation>Položky</translation>
</message> </message>
<message>
<location filename="../receiptloadform.ui" line="55"/>
<source>Select &amp;all</source>
<translation>Vybrat &amp;vše</translation>
</message>
</context> </context>
<context> <context>
<name>ReceiptSaveForm</name> <name>ReceiptSaveForm</name>
@@ -284,142 +295,167 @@
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../shopform.ui" line="44"/> <location filename="../shopform.ui" line="111"/>
<source>Commodity</source> <source>Commodity</source>
<translation>Zboží</translation> <translation>Zboží</translation>
</message> </message>
<message> <message>
<location filename="../shopform.ui" line="73"/> <location filename="../shopform.ui" line="140"/>
<source>Count</source> <source>Count</source>
<translation>Počet</translation> <translation>Počet</translation>
</message> </message>
<message> <message>
<location filename="../shopform.ui" line="99"/> <location filename="../shopform.ui" line="166"/>
<source>Add Item</source> <source>Add Item</source>
<translation>Přidat položku</translation> <translation>Přidat položku</translation>
</message> </message>
<message> <message>
<location filename="../shopform.ui" line="127"/>
<source>Direct Sale</source> <source>Direct Sale</source>
<translation>Přímý prodej</translation> <translation type="vanished">Přímý prodej</translation>
</message> </message>
<message> <message>
<location filename="../shopform.ui" line="140"/> <location filename="../shopform.ui" line="62"/>
<source>Ctrl+D</source> <source>Ctrl+D</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../shopform.ui" line="162"/> <location filename="../shopform.ui" line="84"/>
<source>Favorities</source>
<translation>Oblíbené</translation>
</message>
<message>
<location filename="../shopform.ui" line="186"/>
<source>Receipt</source> <source>Receipt</source>
<translation>Účtenka</translation> <translation>Účtenka</translation>
</message> </message>
<message> <message>
<location filename="../shopform.ui" line="201"/> <location filename="../shopform.ui" line="231"/>
<source>10%</source> <source>10%</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../shopform.ui" line="260"/> <location filename="../shopform.ui" line="289"/>
<source>0%</source> <source>0%</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../shopform.ui" line="273"/> <location filename="../shopform.ui" line="302"/>
<source>21%</source> <source>21%</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../shopform.ui" line="312"/> <location filename="../shopform.ui" line="340"/>
<source>15%</source> <source>15%</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../shopform.ui" line="361"/> <location filename="../shopform.ui" line="387"/>
<source>Witouth VAT</source> <source>Witouth VAT</source>
<translation>Bez DPH</translation> <translation>Bez DPH</translation>
</message> </message>
<message> <message>
<location filename="../shopform.ui" line="371"/> <location filename="../shopform.ui" line="397"/>
<source>VAT</source> <source>VAT</source>
<translation>DPH</translation> <translation>DPH</translation>
</message> </message>
<message> <message>
<location filename="../shopform.ui" line="381"/> <location filename="../shopform.ui" line="407"/>
<source>Total</source> <source>Total</source>
<translation>Celkem</translation> <translation>Celkem</translation>
</message> </message>
<message> <message>
<location filename="../shopform.ui" line="409"/> <location filename="../shopform.ui" line="435"/>
<source>EET status:</source> <source>EET status:</source>
<translation>EET status:</translation> <translation>EET status:</translation>
</message> </message>
<message> <message>
<location filename="../shopform.ui" line="425"/> <location filename="../shopform.ui" line="450"/>
<source>&lt;a href=&quot;#eet&quot;&gt;dfghdfg&lt;/a&gt;</source> <source>&lt;a href=&quot;#eet&quot;&gt;dfghdfg&lt;/a&gt;</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../shopform.ui" line="455"/> <location filename="../shopform.ui" line="479"/>
<source>Total:</source> <source>Total:</source>
<translation>Celkem:</translation> <translation>Celkem:</translation>
</message> </message>
<message> <message>
<location filename="../shopform.ui" line="185"/> <location filename="../shopform.ui" line="627"/>
<location filename="../shopform.ui" line="208"/> <location filename="../shopform.cpp" line="655"/>
<location filename="../shopform.ui" line="218"/> <source>Delete items</source>
<location filename="../shopform.ui" line="228"/> <translation>Smazat položky</translation>
<location filename="../shopform.ui" line="244"/> </message>
<location filename="../shopform.ui" line="280"/> <message>
<location filename="../shopform.ui" line="296"/> <location filename="../shopform.ui" line="630"/>
<location filename="../shopform.ui" line="325"/> <source>Ctrl+Del</source>
<location filename="../shopform.ui" line="335"/> <translation>Ctrl+Del</translation>
<location filename="../shopform.ui" line="351"/> </message>
<location filename="../shopform.ui" line="472"/> <message>
<location filename="../shopform.ui" line="215"/>
<location filename="../shopform.ui" line="238"/>
<location filename="../shopform.ui" line="248"/>
<location filename="../shopform.ui" line="258"/>
<location filename="../shopform.ui" line="273"/>
<location filename="../shopform.ui" line="309"/>
<location filename="../shopform.ui" line="324"/>
<location filename="../shopform.ui" line="352"/>
<location filename="../shopform.ui" line="362"/>
<location filename="../shopform.ui" line="377"/>
<location filename="../shopform.ui" line="495"/>
<source>0</source> <source>0</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../shopform.ui" line="493"/> <location filename="../shopform.ui" line="49"/>
<source>Direct Sell</source>
<translation>Přímý prodej</translation>
</message>
<message>
<location filename="../shopform.ui" line="516"/>
<source>Temporary Save</source> <source>Temporary Save</source>
<translation>Dočasné uložení</translation> <translation>Dočasné uložení</translation>
</message> </message>
<message> <message>
<location filename="../shopform.ui" line="515"/> <location filename="../shopform.ui" line="538"/>
<source>Save</source> <source>Save</source>
<translation>Uložení</translation> <translation>Uložení</translation>
</message> </message>
<message> <message>
<location filename="../shopform.ui" line="537"/> <location filename="../shopform.ui" line="560"/>
<source>Load</source> <source>Load</source>
<translation>Načíst</translation> <translation>Načíst</translation>
</message> </message>
<message> <message>
<location filename="../shopform.ui" line="559"/> <location filename="../shopform.ui" line="582"/>
<source>Show paid</source> <source>Show paid</source>
<translation>Zobrazit zaplacené</translation> <translation>Zobrazit zaplacené</translation>
</message> </message>
<message> <message>
<location filename="../shopform.ui" line="581"/> <location filename="../shopform.ui" line="604"/>
<source>Pay</source> <source>Pay</source>
<translation>Zaplatit</translation> <translation>Zaplatit</translation>
</message> </message>
<message> <message>
<location filename="../shopform.cpp" line="149"/> <location filename="../shopform.cpp" line="157"/>
<location filename="../shopform.cpp" line="595"/> <location filename="../shopform.cpp" line="640"/>
<source>&lt;a href=&quot;#eet&quot;&gt;Online&lt;/a&gt;</source> <source>&lt;a href=&quot;#eet&quot;&gt;Online&lt;/a&gt;</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../shopform.cpp" line="149"/> <location filename="../shopform.cpp" line="157"/>
<location filename="../shopform.cpp" line="595"/> <location filename="../shopform.cpp" line="640"/>
<source>&lt;a href=&quot;#eet&quot;&gt;Offline&lt;/a&gt;</source> <source>&lt;a href=&quot;#eet&quot;&gt;Offline&lt;/a&gt;</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../shopform.cpp" line="223"/> <location filename="../shopform.cpp" line="236"/>
<source>&lt;&lt; empty &gt;&gt;</source> <source>&lt;&lt; empty &gt;&gt;</source>
<translation>&lt;&lt; nevybráno &gt;&gt;</translation> <translation>&lt;&lt; nevybráno &gt;&gt;</translation>
</message> </message>
<message>
<location filename="../shopform.cpp" line="655"/>
<source>Really delete selected voucher items?</source>
<translation>Opravdu chcete smazat vybrané položky?</translation>
</message>
<message> <message>
<source>EET communication error. <source>EET communication error.
</source> </source>
@@ -453,7 +489,9 @@
<message> <message>
<location filename="../shopoverview.ui" line="52"/> <location filename="../shopoverview.ui" line="52"/>
<location filename="../shopoverview.ui" line="75"/> <location filename="../shopoverview.ui" line="75"/>
<location filename="../shopoverview.ui" line="110"/> <location filename="../shopoverview.ui" line="108"/>
<location filename="../shopoverview.ui" line="131"/>
<location filename="../shopoverview.ui" line="154"/>
<source>TextLabel</source> <source>TextLabel</source>
<translation></translation> <translation></translation>
</message> </message>
@@ -463,10 +501,20 @@
<translation>Nezaplaceno v :</translation> <translation>Nezaplaceno v :</translation>
</message> </message>
<message> <message>
<location filename="../shopoverview.ui" line="91"/> <location filename="../shopoverview.ui" line="90"/>
<source>Unsend to EET:</source> <source>Unsend to EET:</source>
<translation>Neodesláno na EET:</translation> <translation>Neodesláno na EET:</translation>
</message> </message>
<message>
<location filename="../shopoverview.ui" line="118"/>
<source>Today sales:</source>
<translation>Dnešní tržba:</translation>
</message>
<message>
<location filename="../shopoverview.ui" line="141"/>
<source>Number of sales today:</source>
<translation>Dnešní počet prodejů:</translation>
</message>
</context> </context>
<context> <context>
<name>ShopSettingsForm</name> <name>ShopSettingsForm</name>
@@ -481,127 +529,148 @@
<translation>Nastavení rychlé volby</translation> <translation>Nastavení rychlé volby</translation>
</message> </message>
<message> <message>
<location filename="../settings/shopsettingsform.ui" line="236"/> <location filename="../settings/shopsettingsform.ui" line="245"/>
<source>...</source> <source>...</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../settings/shopsettingsform.ui" line="126"/> <location filename="../settings/shopsettingsform.ui" line="129"/>
<source>Printer</source> <source>Printer</source>
<translation>Tiskárna</translation> <translation>Tiskárna</translation>
</message> </message>
<message> <message>
<location filename="../settings/shopsettingsform.ui" line="89"/> <location filename="../settings/shopsettingsform.ui" line="92"/>
<source>Columns</source> <source>Columns</source>
<translation>Sloupců</translation> <translation>Sloupců</translation>
</message> </message>
<message> <message>
<location filename="../settings/shopsettingsform.ui" line="99"/> <location filename="../settings/shopsettingsform.ui" line="102"/>
<source>Rows</source> <source>Rows</source>
<translation>Řádků</translation> <translation>Řádků</translation>
</message> </message>
<message> <message>
<location filename="../settings/shopsettingsform.ui" line="109"/> <location filename="../settings/shopsettingsform.ui" line="112"/>
<source>Size</source> <source>Size</source>
<translation>Velikost</translation> <translation>Velikost</translation>
</message> </message>
<message> <message>
<location filename="../settings/shopsettingsform.ui" line="132"/> <location filename="../settings/shopsettingsform.ui" line="138"/>
<source>Output device</source> <source>Output device</source>
<translation>Jméno tiskárny</translation> <translation>Jméno tiskárny</translation>
</message> </message>
<message> <message>
<location filename="../settings/shopsettingsform.ui" line="142"/> <location filename="../settings/shopsettingsform.ui" line="148"/>
<source>Letters per line</source> <source>Letters per line</source>
<translation>Znaků na řádek</translation> <translation>Znaků na řádek</translation>
</message> </message>
<message> <message>
<location filename="../settings/shopsettingsform.ui" line="152"/> <location filename="../settings/shopsettingsform.ui" line="158"/>
<source>Footer text</source> <source>Footer text</source>
<translation>Patička</translation> <translation>Patička</translation>
</message> </message>
<message> <message>
<location filename="../settings/shopsettingsform.ui" line="163"/> <location filename="../settings/shopsettingsform.ui" line="169"/>
<source>EET</source> <source>EET</source>
<translation>EET</translation> <translation>EET</translation>
</message> </message>
<message> <message>
<location filename="../settings/shopsettingsform.ui" line="169"/> <location filename="../settings/shopsettingsform.ui" line="175"/>
<source>Activate EET</source> <source>Activate EET</source>
<translation>Zapnout podporu EET</translation> <translation>Zapnout podporu EET</translation>
</message> </message>
<message> <message>
<location filename="../settings/shopsettingsform.ui" line="181"/> <location filename="../settings/shopsettingsform.ui" line="190"/>
<source>Shop ID</source> <source>Shop ID</source>
<translation>ID provozovny</translation> <translation>ID provozovny</translation>
</message> </message>
<message> <message>
<location filename="../settings/shopsettingsform.ui" line="191"/> <location filename="../settings/shopsettingsform.ui" line="200"/>
<source>Cash register ID</source> <source>Cash register ID</source>
<translation>ID zařízení</translation> <translation>ID zařízení</translation>
</message> </message>
<message> <message>
<location filename="../settings/shopsettingsform.ui" line="201"/> <location filename="../settings/shopsettingsform.ui" line="210"/>
<source>EET mode</source> <source>EET mode</source>
<translation>EET režim</translation> <translation>EET režim</translation>
</message> </message>
<message> <message>
<location filename="../settings/shopsettingsform.ui" line="211"/> <location filename="../settings/shopsettingsform.ui" line="220"/>
<source>Certificate file</source> <source>Certificate file</source>
<translation>Certifikát</translation> <translation>Certifikát</translation>
</message> </message>
<message> <message>
<location filename="../settings/shopsettingsform.ui" line="246"/> <location filename="../settings/shopsettingsform.ui" line="255"/>
<source>Private key password</source> <source>Private key password</source>
<translation>Heslo k certifikátu</translation> <translation>Heslo k certifikátu</translation>
</message> </message>
<message> <message>
<location filename="../settings/shopsettingsform.ui" line="260"/> <location filename="../settings/shopsettingsform.ui" line="269"/>
<source>Test mode</source> <source>Test mode</source>
<translation>Testovací režim</translation> <translation>Testovací režim</translation>
</message> </message>
<message> <message>
<location filename="../settings/shopsettingsform.ui" line="267"/> <location filename="../settings/shopsettingsform.ui" line="276"/>
<source>Communication with playground </source> <source>Communication with playground </source>
<translation>Testovací EET server </translation> <translation>Testovací EET server </translation>
</message> </message>
<message> <message>
<location filename="../settings/shopsettingsform.ui" line="278"/> <location filename="../settings/shopsettingsform.ui" line="287"/>
<source>Other</source> <source>Other</source>
<translation>Jiné</translation> <translation>Jiné</translation>
</message> </message>
<message> <message>
<location filename="../settings/shopsettingsform.ui" line="284"/> <location filename="../settings/shopsettingsform.ui" line="293"/>
<source>Rounding</source> <source>Rounding</source>
<translation>Zaokrouhlování</translation> <translation>Zaokrouhlování</translation>
</message> </message>
<message> <message>
<location filename="../settings/shopsettingsform.ui" line="290"/> <location filename="../settings/shopsettingsform.ui" line="302"/>
<source>Direction</source> <source>Direction</source>
<translation>Typ</translation> <translation>Typ</translation>
</message> </message>
<message> <message>
<location filename="../settings/shopsettingsform.ui" line="300"/> <location filename="../settings/shopsettingsform.ui" line="312"/>
<source>Decimal places</source> <source>Decimal places</source>
<translation>Desetiných míst</translation> <translation>Desetiných míst</translation>
</message> </message>
<message> <message>
<location filename="../settings/shopsettingsform.ui" line="313"/> <location filename="../settings/shopsettingsform.ui" line="325"/>
<source>Rounding item text</source> <source>Rounding item text</source>
<translation>Název položky</translation> <translation>Název položky</translation>
</message> </message>
<message> <message>
<location filename="../settings/shopsettingsform.cpp" line="27"/> <location filename="../settings/shopsettingsform.ui" line="335"/>
<source>Default VAT type</source>
<translation>Výchozí sazba daně</translation>
</message>
<message>
<location filename="../settings/shopsettingsform.ui" line="348"/>
<source>Doub&amp;le print bill</source>
<translation>Z&amp;dvojená účtenka</translation>
</message>
<message>
<location filename="../settings/shopsettingsform.ui" line="363"/>
<source>Item name</source>
<translation>Jméno položky</translation>
</message>
<message>
<location filename="../settings/shopsettingsform.ui" line="376"/>
<source>Show field for item count</source>
<translation>Zobrazit pole pro počet položek</translation>
</message>
<message>
<location filename="../settings/shopsettingsform.cpp" line="24"/>
<source>Simplifyed</source> <source>Simplifyed</source>
<translation>Zjednodušený</translation> <translation>Zjednodušený</translation>
</message> </message>
<message> <message>
<location filename="../settings/shopsettingsform.cpp" line="27"/> <location filename="../settings/shopsettingsform.cpp" line="24"/>
<source>Standard</source> <source>Standard</source>
<translation>Standartní</translation> <translation>Standartní</translation>
</message> </message>
<message> <message>
<location filename="../settings/shopsettingsform.cpp" line="40"/> <location filename="../settings/shopsettingsform.cpp" line="40"/>
<location filename="../settings/shopsettingsform.cpp" line="55"/>
<source>None</source> <source>None</source>
<translation>Žádný</translation> <translation>Žádný</translation>
</message> </message>
@@ -620,6 +689,21 @@
<source>Mathematic</source> <source>Mathematic</source>
<translation>Matematické</translation> <translation>Matematické</translation>
</message> </message>
<message>
<location filename="../settings/shopsettingsform.cpp" line="56"/>
<source>High</source>
<translation>Vysoká</translation>
</message>
<message>
<location filename="../settings/shopsettingsform.cpp" line="57"/>
<source>First lower</source>
<translation>První snížená</translation>
</message>
<message>
<location filename="../settings/shopsettingsform.cpp" line="58"/>
<source>Second lower</source>
<translation>Druhá snížená</translation>
</message>
</context> </context>
<context> <context>
<name>TemporaryReceiptSaveForm</name> <name>TemporaryReceiptSaveForm</name>