Pepa Rokos 8 years ago
commit 27ec7282eb

@ -8,7 +8,7 @@
"default" : "",
"CZ" : ""
},
"schemaVersion" : 1,
"schemaVersion" : 2,
"sql" : [
"CREATE TABLE \"AddressbookData\" (
\"id\" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
@ -21,10 +21,14 @@
\"addressCity\" TEXT NULL,
\"addressStreet\" TEXT NULL,
\"addressHouseNumber\" TEXT NULL,
\"addressZipCode\" TEXT NULL);"
\"addressZipCode\" TEXT NULL);
",
"ALTER TABLE AddressbookData ADD \"country\" INTEGER NULL;
"
],
"dependencies" : [],
"dependencies" : [ "COUNTRYREGISTER" ],
"translations" : {
"CZ" : {
"title" : "Titul",

@ -32,6 +32,7 @@ include(../config_plugin.pri)
ODB_FILES = addressbook/data/addressbookdata.h
H_DIR = $$PWD/data/*.h
ODB_OTHER_INCLUDES = -I $$PWD/../countryregister/data
include(../odb.pri)
OTHER_FILES += \
@ -43,3 +44,11 @@ FORMS += \
RESOURCES += \
addressbookrc.qrc
TRANSLATIONS = translations/addressbook_cs_CZ.ts
win32:CONFIG(release, debug|release): LIBS += -L$$OUT_PWD/../plugins/ -lcountryregister
else:win32:CONFIG(debug, debug|release): LIBS += -L$$OUT_PWD/../plugins/ -lcountryregister
else:unix: LIBS += -L$$OUT_PWD/../plugins/ -lcountryregister
INCLUDEPATH += $$PWD/../countryregister/data
INCLUDEPATH += $$PWD/../countryregister

@ -1,5 +1,6 @@
#include "addressbookform.h"
#include "ui_addressbookform.h"
#include <countrydata.h>
AddressbookForm::AddressbookForm(QWidget *parent) :
AutoForm<AddressbookData>(parent),
@ -22,3 +23,9 @@ AddressbookForm::~AddressbookForm()
{
delete ui;
}
void AddressbookForm::registerCombos()
{
Service<CountryData> srv;
registerBinding(ui->country, ComboData::createComboData(srv.all()));
}

@ -20,6 +20,10 @@ public:
private:
Ui::AddressbookForm *ui;
// FormBinder interface
protected:
void registerCombos();
};

@ -6,8 +6,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>400</width>
<height>300</height>
<width>610</width>
<height>407</height>
</rect>
</property>
<property name="windowTitle">
@ -115,8 +115,35 @@
</property>
</widget>
</item>
<item row="10" column="0">
<widget class="QLabel" name="label_10">
<property name="text">
<string>Country</string>
</property>
</widget>
</item>
<item row="10" column="1">
<widget class="QComboBox" name="country">
<property name="editable">
<bool>true</bool>
</property>
</widget>
</item>
</layout>
</widget>
<tabstops>
<tabstop>title</tabstop>
<tabstop>firstName</tabstop>
<tabstop>lastName</tabstop>
<tabstop>birthDate</tabstop>
<tabstop>idCardNumber</tabstop>
<tabstop>ztp</tabstop>
<tabstop>addressCity</tabstop>
<tabstop>addressStreet</tabstop>
<tabstop>addressHouseNumber</tabstop>
<tabstop>addressZipCode</tabstop>
<tabstop>country</tabstop>
</tabstops>
<resources/>
<connections/>
</ui>

@ -10,9 +10,22 @@ AddressBookService::~AddressBookService()
{
}
QList<QSharedPointer<AddressbookData> > AddressBookService::all(const QString &where)
AddressbookDataPtr AddressBookService::copyAddress(AddressbookDataPtr address)
{
Service<AddressbookData> srv;
return srv.all(where);
AddressbookDataPtr newAddress(new AddressbookData());
newAddress->setTitle(address->title());
newAddress->setFirstName(address->firstName());
newAddress->setLastName(address->lastName());
newAddress->setBirthDate(address->birthDate());
newAddress->setIdCardNumber(address->idCardNumber());
newAddress->setZtp(address->ztp());
newAddress->setAddressStreet(address->addressStreet());
newAddress->setAddressHouseNumber(address->addressHouseNumber());
newAddress->setAddressZipCode(address->addressZipCode());
newAddress->setAddressCity(address->addressCity());
newAddress->setCountry(address->country());
return newAddress;
}

@ -3,17 +3,18 @@
#include <QList>
#include <QSharedPointer>
#include <service.h>
#include "data/addressbookdata.h"
#include "addressbook_global.h"
class ADDRESSBOOKSHARED_EXPORT AddressBookService
class ADDRESSBOOKSHARED_EXPORT AddressBookService : public Service<AddressbookData>
{
public:
AddressBookService();
~AddressBookService();
QList<QSharedPointer<AddressbookData> > all(const QString &where = "");
AddressbookDataPtr copyAddress(AddressbookDataPtr address);
};
#endif // ADDRESSBOOKSERVICE_H

@ -3,6 +3,7 @@
AddressbookData::AddressbookData(QObject * parent)
:ComboItem(parent)
{
m_ztp = false;
}
QString AddressbookData::title() const
@ -105,6 +106,19 @@ void AddressbookData::setId(int id)
m_id = id;
}
QSharedPointer<QObject> AddressbookData::country() const
{
return m_country;
}
void AddressbookData::setCountry(const QSharedPointer<QObject> &country)
{
if (qobject_cast<CountryData*>(country.data()) != NULL)
{
m_country = qSharedPointerDynamicCast<CountryData, QObject>(country);
}
}
bool AddressbookData::eq(ComboItem *other)
{
AddressbookData *adb = qobject_cast<AddressbookData*>(other);
@ -113,7 +127,7 @@ bool AddressbookData::eq(ComboItem *other)
QString AddressbookData::toString()
{
return m_firstName + " " + m_lastName + ", " + m_addressStreet + " " + m_addressHouseNumber + ", " + m_addressCity;
return m_lastName + " " + m_firstName + ", " + m_addressStreet + " " + m_addressHouseNumber + ", " + m_addressCity;
}

@ -6,8 +6,10 @@
#include <QDate>
#include <odb/core.hxx>
#include <QtCore/qglobal.h>
#include <QSharedPointer>
#include <data/comboitem.h>
#include <countrydata.h>
#if defined(ADDRESSBOOK_LIBRARY)
# define ADDRESSBOOKSHARED_EXPORT Q_DECL_EXPORT
@ -29,6 +31,7 @@ class ADDRESSBOOKSHARED_EXPORT AddressbookData : public ComboItem
Q_PROPERTY(QString addressStreet READ addressStreet WRITE setAddressStreet)
Q_PROPERTY(QString addressHouseNumber READ addressHouseNumber WRITE setAddressHouseNumber)
Q_PROPERTY(QString addressZipCode READ addressZipCode WRITE setAddressZipCode)
Q_PROPERTY(QSharedPointer<QObject> country READ country WRITE setCountry)
public:
AddressbookData(QObject *parent = 0);
@ -65,6 +68,9 @@ public:
int id() const;
void setId(int id);
QSharedPointer<QObject> country() const;
void setCountry(const QSharedPointer<QObject> &country);
private:
friend class odb::access;
#pragma db id auto
@ -79,6 +85,7 @@ private:
QString m_addressStreet;
QString m_addressHouseNumber;
QString m_addressZipCode;
CountryDataPtr m_country;
// ComboItem interface
public:
@ -86,4 +93,6 @@ public:
virtual QString toString();
};
typedef QSharedPointer<AddressbookData> AddressbookDataPtr;
#endif // ADDRESSBOOKDATA_H

@ -58,5 +58,10 @@
<source>ZIP</source>
<translation>PSČ</translation>
</message>
<message>
<location filename="../addressbookform.ui" line="121"/>
<source>Country</source>
<translation>Stát</translation>
</message>
</context>
</TS>

@ -42,7 +42,7 @@ MainWindow::MainWindow(QWidget *parent) :
int i = 0;
foreach (IPlugin *plugin, Context::instance().plugins()) {
if (plugin->pluginId() != "CORE")
if (plugin->pluginId() != "CORE" && plugin->showIcon())
{
QToolButton *plugButton = new QToolButton(this);
plugButton->setText(plugin->pluginName());
@ -81,26 +81,16 @@ void MainWindow::openPlugin()
QVariant var = QObject::sender()->property(PLUGIN_INDEX);
IPlugin *plugin = Context::instance().plugins().at(var.toInt());
for (int i = 0; i < ui->tabWidget->count(); i++) {
if (ui->tabWidget->widget(i)->objectName() == plugin->pluginId()) {
ui->tabWidget->setCurrentIndex(i);
return;
}
}
if (plugin->ui() != NULL)
{
ui->tabWidget->addTab(plugin->ui(), plugin->pluginIcon(), plugin->pluginName());
ui->tabWidget->widget(ui->tabWidget->count() - 1)->setObjectName(plugin->pluginId());
ui->tabWidget->setCurrentIndex(ui->tabWidget->count() - 1);
}
openPlugin(plugin);
}
void MainWindow::on_actionOpen_database_triggered()
{
/*QFileDialog dialog(this);
dialog.setNameFilter(tr("Database Files (*.db)"));
dialog.setWindowTitle(tr("Open Database"));*/
int tabCount = ui->tabWidget->count();
for (int i = 0; i < tabCount; i++)
{
ui->tabWidget->removeTab(0);
}
QString dbFile = QFileDialog::getOpenFileName(this, "Open Database", "", "Database Files (*.db)");
if (!dbFile.isEmpty())
@ -118,6 +108,12 @@ void MainWindow::on_tabWidget_tabCloseRequested(int index)
void MainWindow::on_actionLogin_triggered()
{
int tabCount = ui->tabWidget->count();
for (int i = 0; i < tabCount; i++)
{
ui->tabWidget->removeTab(0);
}
QSharedPointer<User> u;
Context::instance().setCurrentUser(u);
m_lblUser->setText("");
@ -144,3 +140,51 @@ void MainWindow::on_actionSettings_triggered()
SettingsForm *settings = new SettingsForm(this);
settings->show();
}
void MainWindow::on_actionPost_register_triggered()
{
IPlugin *plugZipCodes = Context::instance().plugin("POSTREGISTER");
if (plugZipCodes != NULL)
{
openPlugin(plugZipCodes);
}
}
void MainWindow::openPlugin(IPlugin *plugin)
{
for (int i = 0; i < ui->tabWidget->count(); i++) {
if (ui->tabWidget->widget(i)->objectName() == plugin->pluginId()) {
ui->tabWidget->setCurrentIndex(i);
return;
}
}
if (plugin->ui() != NULL)
{
ui->tabWidget->addTab(plugin->ui(), plugin->pluginIcon(), plugin->pluginName());
ui->tabWidget->widget(ui->tabWidget->count() - 1)->setObjectName(plugin->pluginId());
ui->tabWidget->setCurrentIndex(ui->tabWidget->count() - 1);
}
}
void MainWindow::on_actionCountry_register_triggered()
{
IPlugin *plugCountryReg = Context::instance().plugin("COUNTRYREGISTER");
if (plugCountryReg != NULL)
{
openPlugin(plugCountryReg);
}
}
void MainWindow::on_actionAbout_Qt_triggered()
{
QMessageBox::aboutQt(this);
}
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"));
}

@ -9,6 +9,8 @@
#define PLUGIN_INDEX "plug_index"
class IPlugin;
namespace Ui {
class MainWindow;
}
@ -33,10 +35,19 @@ private slots:
void on_actionSettings_triggered();
void on_actionPost_register_triggered();
void on_actionCountry_register_triggered();
void on_actionAbout_Qt_triggered();
void on_actionAbout_triggered();
private:
Ui::MainWindow *ui;
LoginDialog *m_loginDialog;
QLabel *m_lblUser;
void openPlugin(IPlugin *plugin);
// QWidget interface
protected:

@ -60,7 +60,7 @@
<x>0</x>
<y>0</y>
<width>1000</width>
<height>19</height>
<height>25</height>
</rect>
</property>
<widget class="QMenu" name="menuFile">
@ -72,7 +72,23 @@
<addaction name="separator"/>
<addaction name="actionExit"/>
</widget>
<widget class="QMenu" name="menuRegisters">
<property name="title">
<string>&amp;Registers</string>
</property>
<addaction name="actionPost_register"/>
<addaction name="actionCountry_register"/>
</widget>
<widget class="QMenu" name="menuHelp">
<property name="title">
<string>Help</string>
</property>
<addaction name="actionAbout"/>
<addaction name="actionAbout_Qt"/>
</widget>
<addaction name="menuFile"/>
<addaction name="menuRegisters"/>
<addaction name="menuHelp"/>
</widget>
<widget class="QToolBar" name="mainToolBar">
<attribute name="toolBarArea">
@ -116,6 +132,26 @@
<string>Settings</string>
</property>
</action>
<action name="actionPost_register">
<property name="text">
<string>&amp;Post register</string>
</property>
</action>
<action name="actionCountry_register">
<property name="text">
<string>&amp;Country register</string>
</property>
</action>
<action name="actionAbout">
<property name="text">
<string>About</string>
</property>
</action>
<action name="actionAbout_Qt">
<property name="text">
<string>About Qt</string>
</property>
</action>
</widget>
<layoutdefault spacing="6" margin="11"/>
<resources>

@ -28,20 +28,54 @@
<translation>&amp;Soubor</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="90"/>
<location filename="../mainwindow.ui" line="77"/>
<source>&amp;Registers</source>
<translation>Číse&amp;lníky</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="84"/>
<source>Help</source>
<translation>Pomoc</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="106"/>
<source>&amp;Exit</source>
<translation>&amp;Konec</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="95"/>
<location filename="../mainwindow.ui" line="111"/>
<source>&amp;Open database...</source>
<translation>&amp;Otevřít databázi...</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="104"/>
<location filename="../mainwindow.ui" line="120"/>
<source>&amp;Login...</source>
<translation>&amp;Přihlásit...</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="137"/>
<source>&amp;Post register</source>
<translation>Číselník PSČ</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="142"/>
<source>&amp;Country register</source>
<translation>Číselník států</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="147"/>
<source>About</source>
<translation>O aplikaci</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="152"/>
<source>About Qt</source>
<translation>O QT</translation>
</message>
<message>
<source>Post register</source>
<translation type="vanished">Číselník adres</translation>
</message>
<message>
<source>File</source>
<translation type="vanished">Soubor</translation>
@ -59,10 +93,22 @@
<translation type="vanished">Přihlásit se...</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="113"/>
<location filename="../mainwindow.ui" line="116"/>
<location filename="../mainwindow.ui" line="129"/>
<location filename="../mainwindow.ui" line="132"/>
<source>Settings</source>
<translation>Nastavení</translation>
</message>
<message>
<location filename="../mainwindow.cpp" line="189"/>
<source>About prodejna</source>
<translation>O aplikaci prodejna</translation>
</message>
<message>
<location filename="../mainwindow.cpp" line="189"/>
<source>Modular cash register software under GPL license.
(C) 2015 - 2017 Josef Rokos, Zdenek Jonák</source>
<translation>Modulární pokladní aplikace pod GPL license.
(C) 2015 - 2017 Josef Rokos, Zdenek Jonák</translation>
</message>
</context>
</TS>

@ -0,0 +1,27 @@
#include "addservicedialog.h"
#include "ui_addservicedialog.h"
AddServiceDialog::AddServiceDialog(AccServicePtr service, QWidget *parent) :
QDialog(parent),
ui(new Ui::AddServiceDialog)
{
ui->setupUi(this);
ui->editName->setText(service->accServiceName());
ui->editPrice->setValue(service->price().toDouble());
}
AddServiceDialog::~AddServiceDialog()
{
delete ui;
}
QString AddServiceDialog::description()
{
return ui->editDescription->text();
}
QDecDouble AddServiceDialog::price()
{
return QDecDouble(ui->editPrice->value());
}

@ -0,0 +1,27 @@
#ifndef ADDSERVICEDIALOG_H
#define ADDSERVICEDIALOG_H
#include <QDialog>
#include <QDecDouble.hh>
#include <data/accservice.h>
namespace Ui {
class AddServiceDialog;
}
class AddServiceDialog : public QDialog
{
Q_OBJECT
public:
explicit AddServiceDialog(AccServicePtr service, QWidget *parent = 0);
~AddServiceDialog();
QString description();
QDecDouble price();
private:
Ui::AddServiceDialog *ui;
};
#endif // ADDSERVICEDIALOG_H

@ -0,0 +1,105 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>AddServiceDialog</class>
<widget class="QDialog" name="AddServiceDialog">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>400</width>
<height>143</height>
</rect>
</property>
<property name="windowTitle">
<string>Dialog</string>
</property>
<layout class="QFormLayout" name="formLayout">
<item row="0" column="0">
<widget class="QLabel" name="label">
<property name="text">
<string>Service name</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QLineEdit" name="editName">
<property name="readOnly">
<bool>true</bool>
</property>
</widget>
</item>
<item row="6" column="0" colspan="2">
<widget class="QDialogButtonBox" name="buttonBox">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="standardButtons">
<set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QLineEdit" name="editDescription"/>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_2">
<property name="text">
<string>Description</string>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QDoubleSpinBox" name="editPrice">
<property name="buttonSymbols">
<enum>QAbstractSpinBox::NoButtons</enum>
</property>
<property name="maximum">
<double>999999.989999999990687</double>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="label_3">
<property name="text">
<string>Price</string>
</property>
</widget>
</item>
</layout>
</widget>
<resources/>
<connections>
<connection>
<sender>buttonBox</sender>
<signal>accepted()</signal>
<receiver>AddServiceDialog</receiver>
<slot>accept()</slot>
<hints>
<hint type="sourcelabel">
<x>248</x>
<y>254</y>
</hint>
<hint type="destinationlabel">
<x>157</x>
<y>274</y>
</hint>
</hints>
</connection>
<connection>
<sender>buttonBox</sender>
<signal>rejected()</signal>
<receiver>AddServiceDialog</receiver>
<slot>reject()</slot>
<hints>
<hint type="sourcelabel">
<x>316</x>
<y>260</y>
</hint>
<hint type="destinationlabel">
<x>286</x>
<y>274</y>
</hint>
</hints>
</connection>
</connections>
</ui>

@ -0,0 +1,33 @@
#include "camp.h"
#include "campgrid.h"
#include "campform.h"
#include "campservice.h"
#include "settings/campsettingsform.h"
Camp::Camp()
{
}
void Camp::initServiceUi()
{
m_service = new CampService();
m_ui = new CampGrid();
((CampGrid*)m_ui)->setForm(new CampForm());
m_settingsUi = new CampSettingsForm();
}
QIcon Camp::pluginIcon()
{
return QIcon(":/icons/campPlugin.svg");
}
QTranslator *Camp::translator()
{
return translatorFrom(":/translations/camp_");
}
bool Camp::hasNumberSeries()
{
return true;
}

@ -0,0 +1,29 @@
#ifndef CAMP_H
#define CAMP_H
#include "camp_global.h"
#include <core.h>
#include <QObject>
#include <QtPlugin>
class CAMPSHARED_EXPORT Camp : public QObject, IMetaDataPlugin
{
Q_OBJECT
Q_PLUGIN_METADATA(IID PluginInterface_iid FILE "camp.json")
Q_INTERFACES(IPlugin)
public:
Camp();
protected:
void initServiceUi() Q_DECL_OVERRIDE;
// IPlugin interface
public:
virtual QIcon pluginIcon();
QTranslator *translator();
bool hasNumberSeries();
};
#endif // CAMP_H

@ -0,0 +1,107 @@
{
"id" : "CAMP",
"name" : {
"default" : "Camp",
"CZ" : "Kemp"
},
"descriptoin" : {
"default" : "",
"CZ" : ""
},
"schemaVersion" : 5,
"sql" : [
"CREATE TABLE \"CampData\" (
\"id\" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
\"numSer\" TEXT NULL,
\"start\" TEXT NULL,
\"end\" TEXT NULL,
\"ownerFirstame\" TEXT NULL,
\"ownerLastname\" TEXT NULL,
\"ownerAddress\" TEXT NULL,
\"totalPrice\" INTEGER NOT NULL,
\"sale\" INTEGER NOT NULL,
\"fixedSale\" INTEGER NOT NULL,
\"season\" INTEGER NULL,
CONSTRAINT \"season_fk\"
FOREIGN KEY (\"season\")
REFERENCES \"Season\" (\"id\")
DEFERRABLE INITIALLY DEFERRED);
CREATE TABLE \"AddressItem\" (
\"id\" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
\"firstName\" TEXT NULL,
\"lastName\" TEXT NULL,
\"address\" TEXT NULL,
\"adbItem\" INTEGER NULL,
\"price\" INTEGER NOT NULL,
\"campData\" INTEGER NOT NULL,
\"personPrice\" INTEGER NULL,
CONSTRAINT \"adbItem_fk\"
FOREIGN KEY (\"adbItem\")
REFERENCES \"AddressbookData\" (\"id\")
DEFERRABLE INITIALLY DEFERRED,
CONSTRAINT \"campData_fk\"
FOREIGN KEY (\"campData\")
REFERENCES \"CampData\" (\"id\")
DEFERRABLE INITIALLY DEFERRED,
CONSTRAINT \"personPrice_fk\"
FOREIGN KEY (\"personPrice\")
REFERENCES \"PersonPrice\" (\"id\")
DEFERRABLE INITIALLY DEFERRED);
CREATE TABLE \"ServiceItem\" (
\"id\" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
\"name\" TEXT NULL,
\"code\" TEXT NULL,
\"price\" INTEGER NOT NULL,
\"salePossible\" INTEGER NOT NULL,
\"type\" INTEGER NOT NULL,
\"campData\" INTEGER NOT NULL,
CONSTRAINT \"campData_fk\"
FOREIGN KEY (\"campData\")
REFERENCES \"CampData\" (\"id\")
DEFERRABLE INITIALLY DEFERRED);
CREATE TABLE \"Sale\" (
\"id\" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
\"sale\" INTEGER NOT NULL,
\"fixed\" INTEGER NOT NULL);
CREATE TABLE \"PersonPrice\" (
\"id\" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
\"description\" TEXT NULL,
\"fromAge\" INTEGER NOT NULL,
\"toAge\" INTEGER NOT NULL,
\"price\" INTEGER NOT NULL,
\"active\" INTEGER NOT NULL);
",
"ALTER TABLE Sale ADD \"description\" TEXT NULL;
",
"ALTER TABLE AddressItem ADD \"owner\" INTEGER NULL;
",
"ALTER TABLE ServiceItem ADD \"sale\" INTEGER NULL;
ALTER TABLE ServiceItem ADD \"description\" TEXT NULL;
",
"ALTER TABLE ServiceItem ADD \"totalPrice\" INTEGER NULL;
ALTER TABLE ServiceItem ADD \"fullPrice\" INTEGER NULL;
ALTER TABLE CampData ADD \"fullPrice\" INTEGER NULL;
ALTER TABLE CampData ADD \"totalSale\" INTEGER NULL;
"
],
"dependencies" : [ "ADDRESSBOOK", "SHOP", "SERVICES" ],
"translations" : {
"CZ" : {
"name" : "Název",
"shortName" : "Zobrazit na účtence",
"code" : "Kód",
"type" : "Druh",
"price" : "Cena",
"vat" : "DPH",
"count" : "Počet"
}
}
}

@ -0,0 +1,104 @@
#-------------------------------------------------
#
# Project created by QtCreator 2017-04-19T09:20:32
#
#-------------------------------------------------
QT += widgets sql
TARGET = camp
TEMPLATE = lib
DEFINES += CAMP_LIBRARY
# The following define makes your compiler emit warnings if you use
# any feature of Qt which as been marked as deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS
# You can also make your code fail to compile if you use deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0
SOURCES += camp.cpp \
data/campdata.cpp \
data/addressitem.cpp \
data/serviceitem.cpp \
campgrid.cpp \
campform.cpp \
data/sale.cpp \
settings/campsettingsform.cpp \
data/personprice.cpp \
settings/campsettings.cpp \
campwizard.cpp \
campservice.cpp \
addservicedialog.cpp \
campshopitem.cpp \
campseller.cpp
HEADERS += camp.h\
camp_global.h \
data/campdata.h \
data/addressitem.h \
data/serviceitem.h \
data/camp-data.h \
campgrid.h \
campform.h \
data/sale.h \
settings/campsettingsform.h \
data/personprice.h \
settings/campsettings.h \
campwizard.h \
campservice.h \
addservicedialog.h \
campshopitem.h \
campseller.h
include(../config_plugin.pri)
ODB_FILES = camp/data/camp-data.h
H_DIR = $$PWD/data/*.h
ODB_OTHER_INCLUDES = -I $$PWD/../shop -I $$PWD/../addressbook/data -I $$PWD/../countryregister/data -I $$PWD/../services/data
include(../odb.pri)
win32:CONFIG(release, debug|release): LIBS += -L$$OUT_PWD/../plugins/ -lshop
else:win32:CONFIG(debug, debug|release): LIBS += -L$$OUT_PWD/../plugins/ -lshop
else:unix: LIBS += -L$$OUT_PWD/../plugins/ -lshop
INCLUDEPATH += $$PWD/../shop
DEPENDPATH += $$PWD/../shop
win32:CONFIG(release, debug|release): LIBS += -L$$OUT_PWD/../plugins/ -laddressbook
else:win32:CONFIG(debug, debug|release): LIBS += -L$$OUT_PWD/../plugins/ -laddressbook
else:unix: LIBS += -L$$OUT_PWD/../plugins/ -laddressbook
INCLUDEPATH += $$PWD/../addressbook
INCLUDEPATH += $$PWD/../addressbook/data
DEPENDPATH += $$PWD/../addressbook
INCLUDEPATH += $$PWD/../countryregister/data
INCLUDEPATH += $$PWD/../countryregister
win32:CONFIG(release, debug|release): LIBS += -L$$OUT_PWD/../plugins/ -lservices
else:win32:CONFIG(debug, debug|release): LIBS += -L$$OUT_PWD/../plugins/ -lservices
else:unix: LIBS += -L$$OUT_PWD/../plugins/ -lservices
INCLUDEPATH += $$PWD/../services
INCLUDEPATH += $$PWD/../services/data
DEPENDPATH += $$PWD/../services
TRANSLATIONS = translations/camp_cs_CZ.ts
DISTFILES += \
camp.json
RESOURCES += \
camprc.qrc
FORMS += \
campform.ui \
settings/campsettingsform.ui \
campwizard.ui \
addservicedialog.ui

@ -0,0 +1,12 @@
#ifndef CAMP_GLOBAL_H
#define CAMP_GLOBAL_H
#include <QtCore/qglobal.h>
#if defined(CAMP_LIBRARY)
# define CAMPSHARED_EXPORT Q_DECL_EXPORT
#else
# define CAMPSHARED_EXPORT Q_DECL_IMPORT
#endif
#endif // CAMP_GLOBAL_H

@ -0,0 +1,14 @@
#include "campform.h"
#include "ui_campform.h"
CampForm::CampForm(QWidget *parent) :
AutoForm<CampData>(parent),
ui(new Ui::CampForm)
{
ui->setupUi(this);
}
CampForm::~CampForm()
{
delete ui;
}

@ -0,0 +1,25 @@
#ifndef CAMPFORM_H
#define CAMPFORM_H
#include <QWidget>
#include <core.h>
#include "data/camp-data.h"
#include "camp-odb.hxx"
namespace Ui {
class CampForm;
}
class CampForm : public AutoForm<CampData>
{
Q_OBJECT
public:
explicit CampForm(QWidget *parent = 0);
~CampForm();
private:
Ui::CampForm *ui;
};
#endif // CAMPFORM_H

@ -0,0 +1,19 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>CampForm</class>
<widget class="QWidget" name="CampForm">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>462</width>
<height>403</height>
</rect>
</property>
<property name="windowTitle">
<string>Form</string>
</property>
</widget>
<resources/>
<connections/>
</ui>

@ -0,0 +1,28 @@
#include "campgrid.h"
#include "campwizard.h"
#include "campservice.h"
CampGrid::CampGrid(QWidget *parent) : GridForm<CampData>(parent)
{
setTableModel(new AutoTableModel<CampData>);
}
void CampGrid::handleNewRecord()
{
CampService srv;
CampDataPtr data = srv.create();
CampWizard *wizard = new CampWizard();
wizard->setAttribute(Qt::WA_DeleteOnClose);
wizard->setData(data);
connect(wizard, &QDialog::accepted, [this, data](){
addRow(data);
});
wizard->show();
}
void CampGrid::handleEditRecord()
{
}

@ -0,0 +1,19 @@
#ifndef CAMPGRID_H
#define CAMPGRID_H
#include <core.h>
#include "data/camp-data.h"
#include "camp-odb.hxx"
class CampGrid : public GridForm<CampData>
{
public:
CampGrid(QWidget *parent = NULL);
// IGridForm interface
protected:
void handleNewRecord();
void handleEditRecord();
};
#endif // CAMPGRID_H

@ -0,0 +1,6 @@
<RCC>
<qresource prefix="/">
<file>icons/campPlugin.svg</file>
<file>translations/camp_cs_CZ.qm</file>
</qresource>
</RCC>

@ -0,0 +1,28 @@
#include "campseller.h"
#include "campwizard.h"
#include "campservice.h"
#include "data/camp-data.h"
#include "campshopitem.h"
CampSeller::CampSeller(QObject *parent)
:ISeller(parent)
{
}
void CampSeller::prepareItem()
{
CampWizard *wizard = new CampWizard();
wizard->setAttribute(Qt::WA_DeleteOnClose);
CampService srv;
CampDataPtr data = srv.create();
wizard->setData(data);
wizard->show();
connect(wizard, &QDialog::accepted, [this, data](){
CampShopItemPtr item(new CampShopItem);
item->setUnitPrice(data->totalPrice());
emit itemPrepared(item, 1);
});
}

@ -0,0 +1,17 @@
#ifndef CAMPSELLER_H
#define CAMPSELLER_H
#include <iseller.h>
class CampSeller : public ISeller
{
Q_OBJECT
public:
explicit CampSeller(QObject *parent = 0);
// ISeller interface
public:
void prepareItem();
};
#endif // CAMPSELLER_H

@ -0,0 +1,315 @@
#include "campservice.h"
#include <settingsservice.h>
#include <seasonservice.h>
#include <numberseriesservice.h>
#include "campshopitem.h"
#include "campseller.h"
#include <math.h>
CampService::CampService()
{
m_pluginId = "CAMP";
m_seller = new CampSeller(this);
}
void CampService::addPerson(CampDataPtr data, AddressbookDataPtr address)
{
AddressItemPtr addrItem(new AddressItem);
addrItem->setAdbItem(address);
addrItem->setAddress(address->toString());
addrItem->setFirstName(address->firstName());
addrItem->setLastName(address->lastName());
addrItem->setCampData(data);
if (data->people().isEmpty())
{
setOwner(data, addrItem);
}
data->addPerson(addrItem);
}
void CampService::addService(CampDataPtr data, AccServicePtr service)
{
ServiceItemPtr serviceItem(new ServiceItem);
serviceItem->setName(service->accServiceName());
serviceItem->setCode(service->accServiceCode());
serviceItem->setPrice(service->price());
serviceItem->setSalePossible(service->salePossible());
serviceItem->setType(service->serviceType());
data->addServiceItem(serviceItem);
}
void CampService::addService(CampDataPtr data, AccServicePtr service, QDecDouble price, QString description)
{
ServiceItemPtr item = addServiceInt(data, service);
item->setPrice(price);
item->setDescription(description);
}
void CampService::setOwner(CampDataPtr data, AddressItemPtr person)
{
foreach (AddressItemPtr p, data->people()) {
p->setOwner(false);
}
person->setOwner(true);
data->setOwnerFirstame(person->firstName());
data->setOwnerLastname(person->lastName());
data->setOwnerAddress(person->address());
}
CampDataPtr CampService::create()
{
CampDataPtr data(new CampData);
data->setStart(QDate::currentDate());
data->setEnd(QDate::currentDate());
return data;
}
void CampService::calculate(CampDataPtr data)
{
SettingsService srv("CAMP");
m_settings = srv.loadSettings<CampSettings>();
calcServices(data);
calcPeople(data);
calcPrice(data);
}
void CampService::saveCamp(CampDataPtr data)
{
if (!checkPermission(PERM_ADD))
{
return;
}
SeasonService seasonSrv;
SeasonPtr season = seasonSrv.active();
data->setSeason(season);
Transaction tr;
try
{
odb::database *db = Context::instance().db();
NumberSeriesService numSrv;
data->setNumSer(numSrv.nextStrForPlugin("CAMP"));
db->persist(data);
foreach (ServiceItemPtr item, data->services()) {
item->setCampData(data.toWeakRef());
db->persist(item);
}
foreach (AddressItemPtr item, data->people()) {
item->setCampData(data.toWeakRef());
db->persist(item);
}
tr.commit();
}
catch (const odb::exception &ex)
{
emit dbError(ex.what());
emit dbErrorUpdate(ex.what());
return;
}
}
void CampService::calcPeople(CampDataPtr data)
{
foreach (ServiceItemPtr service, data->services()) {
if (service->type() == AccService::ACCFEE)
{
data->removeServiceItem(service);
}
}
Service<PersonPrice> srvPrices;
QList<PersonPricePtr> prices = srvPrices.all("active = 1");
int days = data->start().daysTo(data->end());
foreach (AddressItemPtr item, data->people()) {
QDate first(1,1,1);
qint64 daysStart = item->adbItem()->birthDate().daysTo(data->start());
first = first.addDays(daysStart);
int startAge = first.year() - 1;
first = QDate(1,1,1);
qint64 daysEnd = item->adbItem()->birthDate().daysTo(data->end());
first = first.addDays(daysEnd);
int endAge = first.year() - 1;
if (!item->personPrice().isNull())
{
item->setPrice(item->personPrice()->price() * days);
addAccFee(data, item, startAge, endAge, days);
continue;
}
else
{
item->setPrice(0);
}
foreach (PersonPricePtr price, prices) {
if (price->fromAge() <= endAge && price->toAge() >= endAge)
{
item->setPersonPrice(price);
item->setPrice(price->price() * days);
break;
}
}
if (item->adbItem()->ztp())
{
continue;
}
addAccFee(data, item, startAge, endAge, days);
}
}
void CampService::calcServices(CampDataPtr data)
{
QDecDouble sale = data->sale();
bool fixedSale = data->fixedSale();
int days = data->start().daysTo(data->end());
foreach (ServiceItemPtr item, data->services()) {
item->setFullPrice(item->price() * days);
if (sale != QDecDouble(0) && !fixedSale && item->salePossible())
{
QDecDouble itemSale = (item->fullPrice() * sale) / 100;
item->setSale(itemSale);
item->setTotalPrice(item->fullPrice() - itemSale);
}
else
{
item->setSale(0);
item->setTotalPrice(item->fullPrice());
}
}
}
void CampService::calcPrice(CampDataPtr data)
{
QDecDouble totalPrice(0);
QDecDouble sale(0);
foreach (ServiceItemPtr service, data->services()) {
totalPrice += service->totalPrice();
sale += service->sale();
}
foreach (AddressItemPtr addr, data->people()) {
totalPrice += addr->price();
}
if (data->fixedSale())
{
totalPrice -= data->sale();
sale = data->sale();
}
switch (m_settings->rounding()) {
case Enums::R_UP:
totalPrice = QDecDouble(ceil(totalPrice.toDouble() * pow(10, m_settings->decimalPlaces())) / pow(10, m_settings->decimalPlaces()));
break;
case Enums::R_DOWN:
totalPrice = QDecDouble(floor(totalPrice.toDouble() * pow(10, m_settings->decimalPlaces())) / pow(10, m_settings->decimalPlaces()));
break;
case Enums::R_MATH:
totalPrice = QDecDouble(round(totalPrice.toDouble() * pow(10, m_settings->decimalPlaces())) / pow(10, m_settings->decimalPlaces()));
break;
case Enums::R_NONE:
break;
}
data->setTotalPrice(totalPrice);
data->setTotalSale(sale);
}
void CampService::addAccFee(CampDataPtr data, AddressItemPtr item, int startAge, int endAge, int days)
{
auto addAccService = [this, item, data](int count){
ServiceItemPtr srvItem(new ServiceItem);
srvItem->setName(item->firstName() + " " + item->lastName());
srvItem->setDescription(m_settings->accFeeText());
srvItem->setPrice(m_settings->accFee());
srvItem->setTotalPrice(m_settings->accFee() * count);
srvItem->setFullPrice(srvItem->totalPrice());
srvItem->setType(AccService::ACCFEE);
srvItem->setSalePossible(false);
srvItem->setCampData(data);
data->addServiceItem(srvItem);
};
if (startAge == endAge || (startAge >= m_settings->accFeeStartAge() && startAge <= m_settings->accFeeEndAge()))
{
if (endAge >= m_settings->accFeeStartAge() && endAge <= m_settings->accFeeEndAge())
{
addAccService(days);
}
}
else
{
if (endAge >= m_settings->accFeeStartAge() && endAge <= m_settings->accFeeEndAge())
{
QDate tmp(data->end().year(), item->adbItem()->birthDate().month(), item->adbItem()->birthDate().day());
int count = tmp.daysTo(data->end());
addAccService(count);
}
}
}
QList<ShopItemPtr> CampService::shopItems()
{
CampShopItemPtr item(new CampShopItem);
QList<ShopItemPtr> items;
items.append(item);
return items;
}
ShopItemPtr CampService::shopItem(int )
{
return CampShopItemPtr(new CampShopItem);
}
void CampService::addedToVoucher(int , int )
{
}
ISeller *CampService::seller()
{
return m_seller;
}
ServiceItemPtr CampService::addServiceInt(CampDataPtr data, AccServicePtr service)
{
ServiceItemPtr serviceItem(new ServiceItem);
serviceItem->setName(service->accServiceName());
serviceItem->setCode(service->accServiceCode());
serviceItem->setPrice(service->price());
serviceItem->setSalePossible(service->salePossible());
serviceItem->setType(service->serviceType());
serviceItem->setCampData(data);
data->addServiceItem(serviceItem);
return serviceItem;
}

@ -0,0 +1,42 @@
#ifndef CAMPSERVICE_H
#define CAMPSERVICE_H
#include <core.h>
#include <addressbookdata.h>
#include <accservice.h>
#include <isellableservice.h>
#include "data/camp-data.h"
#include "settings/campsettings.h"
#include "camp-odb.hxx"
class CampService : public Service<CampData>, public ISellableService
{
public:
CampService();
void addPerson(CampDataPtr data, AddressbookDataPtr address);
void addService(CampDataPtr data, AccServicePtr service);
void addService(CampDataPtr data, AccServicePtr service, QDecDouble price, QString description);
void setOwner(CampDataPtr data, AddressItemPtr person);
CampDataPtr create();
void calculate(CampDataPtr data);
void saveCamp(CampDataPtr data);
private:
ServiceItemPtr addServiceInt(CampDataPtr data, AccServicePtr service);
void calcPeople(CampDataPtr data);
void calcServices(CampDataPtr data);
void calcPrice(CampDataPtr data);
void addAccFee(CampDataPtr data, AddressItemPtr item, int startAge, int endAge, int days);
CampSettingsPtr m_settings;
ISeller *m_seller;
// ISellableService interface
public:
QList<ShopItemPtr> shopItems();
ShopItemPtr shopItem(int itemId);
void addedToVoucher(int itemId, int countAdded);
ISeller *seller();
};
#endif // CAMPSERVICE_H

@ -0,0 +1,48 @@
#include "campshopitem.h"
CampShopItem::CampShopItem(QObject *parent)
:ShopItem(parent)
{
m_unitPrice = QDecDouble(0);
m_vatType = Enums::NONE;
}
QString CampShopItem::name()
{
return "Camp";
}
QString CampShopItem::shortName()
{
return "Camp";
}
QDecDouble CampShopItem::unitPrice()
{
return m_unitPrice;
}
Enums::VatType CampShopItem::vatType()
{
return m_vatType;
}
QString CampShopItem::pluginId()
{
return "CAMP";
}
QString CampShopItem::code()
{
return "Camp";
}
void CampShopItem::setUnitPrice(const QDecDouble &unitPrice)
{
m_unitPrice = unitPrice;
}
void CampShopItem::setVatType(const Enums::VatType &vatType)
{
m_vatType = vatType;
}

@ -0,0 +1,34 @@
#ifndef CAMPSHOPITEM_H
#define CAMPSHOPITEM_H
#include <shopitem.h>
class CampShopItem : public ShopItem
{
public:
CampShopItem(QObject *parent = 0);
// IShopItem interface
public:
QString name();
QString shortName();
QDecDouble unitPrice();
Enums::VatType vatType();
QString pluginId();
// ShopItem interface
public:
QString code();
void setUnitPrice(const QDecDouble &unitPrice);
void setVatType(const Enums::VatType &vatType);
private:
QDecDouble m_unitPrice;
Enums::VatType m_vatType;
};
typedef QSharedPointer<CampShopItem> CampShopItemPtr;
#endif // CAMPSHOPITEM_H

@ -0,0 +1,405 @@
#include "campwizard.h"
#include "ui_campwizard.h"
#include "campservice.h"
#include "addservicedialog.h"
#include <core.h>
#include <addressbookservice.h>
#include <accservice.h>
////////////////////////////////////
/// \brief AddressHelper::AddressHelper
/// \param parent
///
AddressHelper::AddressHelper(QObject *parent)
:QObject(parent)
{
m_address = AddressbookDataPtr(new AddressbookData);
}
QSharedPointer<QObject> AddressHelper::address() const
{
return m_address;
}
void AddressHelper::setAddress(const QSharedPointer<QObject> &address)
{
if (qobject_cast<AddressbookData*>(address.data()) != NULL)
{
m_address = qSharedPointerDynamicCast<AddressbookData, QObject>(address);
}
}
AddressbookDataPtr AddressHelper::addr() const
{
return m_address;
}
void AddressHelper::setAddr(const AddressbookDataPtr &address)
{
m_address = address;
}
AddressbookDataPtr AddressHelper::newAddress()
{
AddressBookService adbSrv;
m_copyAddress = adbSrv.copyAddress(m_address);
return m_copyAddress;
}
AddressbookDataPtr AddressHelper::copyAddress()
{
if (m_copyAddress.isNull())
{
m_copyAddress = AddressbookDataPtr(new AddressbookData);
}
return m_copyAddress;
}
//////////////////////////////////////////////////////////////
/// \brief SaleHelper::SaleHelper
/// \param parent
///
SaleHelper::SaleHelper(QObject *parent) :QObject(parent)
{
m_sale = SalePtr(new Sale);
}
SalePtr SaleHelper::salePtr() const
{
return m_sale;
}
void SaleHelper::setSalePtr(const SalePtr &sale)
{
m_sale = sale;
}
QSharedPointer<QObject> SaleHelper::sale() const
{
return m_sale;
}
void SaleHelper::setSale(const QSharedPointer<QObject> &sale)
{
if (qobject_cast<Sale*>(sale.data()) != NULL)
{
m_sale = qSharedPointerDynamicCast<Sale, QObject>(sale);
emit saleChanged();
}
}
///////////////////////////////////////////////////////////
/// \brief CampWizard::CampWizard
/// \param parent
///
CampWizard::CampWizard(QWidget *parent) :
QWizard(parent),
ui(new Ui::CampWizard)
{
ui->setupUi(this);
m_peopleModel = new AutoTableModel<AddressItem>(this);
ui->tablePeople->setModel(m_peopleModel);
ui->tablePeople->hideColumn(2);
ui->tablePeople->hideColumn(3);
ui->tablePeople->horizontalHeader()->setSectionResizeMode(0, QHeaderView::Stretch);
ui->tablePeople->horizontalHeader()->setSectionResizeMode(1, QHeaderView::Stretch);
connect(ui->tablePeople->selectionModel(), &QItemSelectionModel::currentRowChanged, [this](QModelIndex, QModelIndex){
ui->btnRemove->setEnabled(!m_data->people().isEmpty());
ui->btnOwner->setEnabled(!m_data->people().isEmpty());
});
m_dataBinder = new ObjectBinder(this);
m_dataBinder->registerBinding(ui->start);
m_dataBinder->registerBinding(ui->end);
m_dataBinder->registerBinding(ui->totalPrice);
m_dataBinder->registerBinding(ui->totalSale);
m_addrHelper = new AddressHelper(this);
Service<AddressbookData> addrSrv;
m_addrHelperBinder = new ObjectBinder(this);
m_addrHelperBinder->registerBinding(ui->address, ComboData::createComboData(addrSrv.all()));
m_addrHelperBinder->setData(m_addrHelper);
m_addressBinder = new ObjectBinder(this);
m_addressBinder->registerBinding(ui->title);
m_addressBinder->registerBinding(ui->firstName);
m_addressBinder->registerBinding(ui->lastName);
m_addressBinder->registerBinding(ui->birthDate);
m_addressBinder->registerBinding(ui->idCardNumber);
m_addressBinder->registerBinding(ui->ztp);
m_addressBinder->registerBinding(ui->addressStreet);
m_addressBinder->registerBinding(ui->addressHouseNumber);
m_addressBinder->registerBinding(ui->addressZipCode);
m_addressBinder->registerBinding(ui->addressCity);
Service<CountryData> coutrySrv;
m_addressBinder->registerBinding(ui->country, ComboData::createComboData(coutrySrv.all()));
m_addressBinder->setData(m_addrHelper->copyAddress().data());
m_addressBinder->bindToUi();
m_bindAddrCombo = true;
Service<AccService> serviceSrv;
m_servicesModel = new AutoTableModel<AccService>(this);
m_servicesModel->setData(serviceSrv.all());
ui->tableServices->setModel(m_servicesModel);
ui->tableServices->hideColumn(1);
ui->tableServices->hideColumn(3);
ui->tableServices->hideColumn(4);
ui->tableServices->hideColumn(5);
ui->tableServices->hideColumn(6);
ui->tableServices->horizontalHeader()->setSectionResizeMode(0, QHeaderView::Stretch);
m_itemsModel = new AutoTableModel<ServiceItem>();
ui->tableItems->setModel(m_itemsModel);
ui->tableItems->hideColumn(1);
ui->tableItems->hideColumn(4);
ui->tableItems->hideColumn(5);
ui->tableItems->hideColumn(6);
ui->tableItems->horizontalHeader()->setSectionResizeMode(2, QHeaderView::Stretch);
connect(ui->tableServices->selectionModel(), &QItemSelectionModel::currentRowChanged, [this](QModelIndex current, QModelIndex){
ui->btnAddService->setEnabled(current.isValid());
});
connect(ui->tableItems->selectionModel(), &QItemSelectionModel::currentRowChanged, [this](QModelIndex, QModelIndex){
ui->btnRemoveService->setEnabled(!m_data->services().isEmpty());
});
m_saleHelper = new SaleHelper(this);
m_saleBinder = new ObjectBinder(this);
Service<Sale> saleSrv;
m_saleBinder->registerBinding(ui->sale, ComboData::createComboData(saleSrv.all()));
m_saleBinder->setData(m_saleHelper);
m_saleBinder->bindToUi();
ui->tabPeople->setModel(m_peopleModel);
ui->tabPeople->hideColumn(0);
ui->tabPeople->hideColumn(1);
ui->tabPeople->hideColumn(4);
ui->tabPeople->horizontalHeader()->setSectionResizeMode(2, QHeaderView::Stretch);
ui->tabServices->setModel(m_itemsModel);
ui->tabServices->hideColumn(1);
ui->tabServices->hideColumn(6);
ui->tabServices->horizontalHeader()->setSectionResizeMode(0, QHeaderView::Stretch);
ui->tabServices->horizontalHeader()->setSectionResizeMode(2, QHeaderView::Stretch);
}
CampWizard::~CampWizard()
{
delete ui;
}
void CampWizard::setData(const CampDataPtr &data)
{
m_data = data;
m_dataBinder->setData(data.data());
m_dataBinder->bindToUi();
m_addrHelperBinder->bindToUi();
m_peopleModel->setData(data->people());
m_itemsModel->setData(data->services());
}
void CampWizard::on_btnAdd_clicked()
{
m_addressBinder->bindToData();
CampService srv;
AddressBookService adbSrv;
if (ui->groupNew->isChecked())
{
AddressbookDataPtr newAddr = adbSrv.copyAddress(m_addrHelper->copyAddress());
adbSrv.save(newAddr);
srv.addPerson(m_data, newAddr);
m_bindAddrCombo = false;
m_addrHelperBinder->registerBinding(ui->address, ComboData::createComboData(adbSrv.all()));
m_addrHelperBinder->bindToUi();
m_bindAddrCombo = true;
}
else
{
srv.addPerson(m_data, m_addrHelper->addr());
}
m_peopleModel->setData(m_data->people());
}
void CampWizard::on_address_currentIndexChanged(int)
{
if (m_bindAddrCombo)
{
AddressBookService adbSrv;
m_addrHelperBinder->bindToData();
m_addressBinder->setData(m_addrHelper->newAddress().data());
m_addressBinder->bindToUi();
}
}
void CampWizard::on_btnRemove_clicked()
{
AddressItemPtr selAddr = m_peopleModel->itemFromIndex(ui->tablePeople->currentIndex());
m_data->removePerson(selAddr);
m_peopleModel->setData(m_data->people());
ui->btnOwner->setEnabled(false);
ui->btnRemove->setEnabled(false);
}
void CampWizard::on_btnOwner_clicked()
{
CampService srv;
AddressItemPtr selAddr = m_peopleModel->itemFromIndex(ui->tablePeople->currentIndex());
srv.setOwner(m_data, selAddr);
QModelIndex currIndex = ui->tablePeople->currentIndex();
m_peopleModel->setData(m_data->people());
ui->tablePeople->setCurrentIndex(currIndex);
}
void CampWizard::on_groupNew_clicked(bool checked)
{
if (checked)
{
ui->address->setEnabled(false);
}
else
{
ui->address->setEnabled(true);
}
}
void CampWizard::on_CampWizard_currentIdChanged(int id)
{
if (id == 2)
{
CampService srv;
srv.calculate(m_data);
m_dataBinder->bindToUi();
m_itemsModel->setData(m_data->services());
ui->lFrom->setText(m_data->start().toString("d. M. yyyy"));
ui->lTo->setText(m_data->end().toString("d. M. yyyy"));
ui->lDays->setText(QString::number(m_data->start().daysTo(m_data->end())));
ui->lOwner->setText(m_data->ownerAddress());
}
}
void CampWizard::on_btnAddService_clicked()
{
AccServicePtr service = m_servicesModel->itemFromIndex(ui->tableServices->currentIndex());
AddServiceDialog *dialog = new AddServiceDialog(service, this);
dialog->setAttribute(Qt::WA_DeleteOnClose);
connect(dialog, &QDialog::accepted, [=](){
CampService srv;
srv.addService(m_data, service, dialog->price(), dialog->description());
m_itemsModel->setData(m_data->services());
});
dialog->show();
}
void CampWizard::on_btnRemoveService_clicked()
{
ServiceItemPtr item = m_itemsModel->itemFromIndex(ui->tableItems->currentIndex());
m_data->removeServiceItem(item);
m_itemsModel->setData(m_data->services());
ui->btnRemoveService->setEnabled(false);
}
void CampWizard::on_checkSale_clicked()
{
ui->sale->setEnabled(ui->checkSale->isChecked());
applySale();
}
void CampWizard::applySale()
{
if (m_data.isNull())
{
return;
}
if (ui->checkSale->isChecked())
{
m_saleBinder->bindToData();
m_data->setSale(m_saleHelper->salePtr()->sale());
m_data->setFixedSale(m_saleHelper->salePtr()->fixed());
}
else
{
m_data->setSale(QDecDouble(0));
}
}
void CampWizard::on_sale_currentIndexChanged(int)
{
applySale();
}
bool CampWizard::validateCurrentPage()
{
m_dataBinder->bindToData();
if (currentPage() == ui->peoplePage && m_data->people().isEmpty())
{
QMessageBox::critical(this, tr("Error"), tr("Add people."));
return false;
}
if (currentPage() == ui->peoplePage && m_data->start() >= m_data->end())
{
QMessageBox::critical(this, tr("Error"), tr("Start date is after or equals end date."));
return false;
}
if (currentPage() == ui->servicePage && m_data->services().isEmpty())
{
QMessageBox::critical(this, tr("Error"), tr("Add service."));
return false;
}
return true;
}
void CampWizard::accept()
{
CampService srv;
srv.saveCamp(m_data);
bool success = true;
connect(&srv, &IService::dbError, [this, &success](QString msg){
QMessageBox::critical(this, tr("Database error"), tr(msg.toStdString().c_str()));
success = false;
});
connect(&srv, &IService::permissionDenied, [this, &success](QString msg){
QMessageBox::critical(this, "Permission denied", msg.toStdString().c_str());
success = false;
});
if (success)
{
QDialog::accept();
}
}

@ -0,0 +1,115 @@
#ifndef CAMPWIZARD_H
#define CAMPWIZARD_H
#include <QWizard>
#include "data/camp-data.h"
#include <objectbinder.h>
#include <data/addressbookdata.h>
#include <data/accservice.h>
#include <core.h>
class AddressHelper : public QObject
{
Q_OBJECT
Q_PROPERTY(QSharedPointer<QObject> address READ address WRITE setAddress)
public:
AddressHelper(QObject *parent = NULL);
QSharedPointer<QObject> address() const;
void setAddress(const QSharedPointer<QObject> &address);
AddressbookDataPtr addr() const;
void setAddr(const AddressbookDataPtr &address);
AddressbookDataPtr newAddress();
AddressbookDataPtr copyAddress();
private:
AddressbookDataPtr m_address;
AddressbookDataPtr m_copyAddress;
};
class SaleHelper : public QObject
{
Q_OBJECT
Q_PROPERTY(QSharedPointer<QObject> sale READ sale WRITE setSale NOTIFY saleChanged)
public:
SaleHelper(QObject *parent = NULL);
SalePtr salePtr() const;
void setSalePtr(const SalePtr &sale);
QSharedPointer<QObject> sale() const;
void setSale(const QSharedPointer<QObject> &sale);
signals:
void saleChanged();
private:
SalePtr m_sale;
};
namespace Ui {
class CampWizard;
}
class CampWizard : public QWizard
{
Q_OBJECT
public:
explicit CampWizard(QWidget *parent = 0);
~CampWizard();
void setData(const CampDataPtr &data);
private slots:
void on_btnAdd_clicked();
void on_address_currentIndexChanged(int index);
void on_btnRemove_clicked();
void on_btnOwner_clicked();
void on_groupNew_clicked(bool checked);
void on_CampWizard_currentIdChanged(int id);
void on_btnAddService_clicked();
void on_btnRemoveService_clicked();
void on_checkSale_clicked();
void applySale();
void on_sale_currentIndexChanged(int index);
private:
Ui::CampWizard *ui;
CampDataPtr m_data;
ObjectBinder *m_dataBinder;
ObjectBinder *m_addrHelperBinder;
ObjectBinder *m_addressBinder;
AddressHelper *m_addrHelper;
ObjectBinder *m_saleBinder;
SaleHelper *m_saleHelper;
AutoTableModel<AddressItem> *m_peopleModel;
AutoTableModel<AccService> *m_servicesModel;
AutoTableModel<ServiceItem> *m_itemsModel;
bool m_bindAddrCombo;
// QWizard interface
public:
bool validateCurrentPage();
// QDialog interface
public slots:
void accept();
};
#endif // CAMPWIZARD_H

@ -0,0 +1,845 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>CampWizard</class>
<widget class="QWizard" name="CampWizard">
<property name="windowModality">
<enum>Qt::ApplicationModal</enum>
</property>
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>948</width>
<height>684</height>
</rect>
</property>
<property name="windowTitle">
<string>Camp record</string>
</property>
<property name="windowIcon">
<iconset resource="camprc.qrc">
<normaloff>:/icons/campPlugin.svg</normaloff>:/icons/campPlugin.svg</iconset>
</property>
<property name="wizardStyle">
<enum>QWizard::ClassicStyle</enum>
</property>
<widget class="QWizardPage" name="peoplePage">
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QWidget" name="widget" native="true">
<layout class="QHBoxLayout" name="horizontalLayout">
<property name="leftMargin">
<number>0</number>
</property>
<item>
<widget class="QLabel" name="label">
<property name="text">
<string>From</string>
</property>
</widget>
</item>
<item>
<widget class="QDateEdit" name="start">
<property name="displayFormat">
<string>d. M. yyyy</string>
</property>
<property name="calendarPopup">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="label_2">
<property name="text">
<string>To</string>
</property>
</widget>
</item>
<item>
<widget class="QDateEdit" name="end">
<property name="displayFormat">
<string>d. M. yyyy</string>
</property>
<property name="calendarPopup">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QGroupBox" name="groupBox_2">
<property name="title">
<string>People</string>
</property>
<layout class="QHBoxLayout" name="horizontalLayout_2">
<item>
<widget class="QWidget" name="widget_3" native="true">
<property name="maximumSize">
<size>
<width>450</width>
<height>16777215</height>
</size>
</property>
<layout class="QGridLayout" name="gridLayout">
<item row="0" column="0">
<widget class="QLabel" name="label_4">
<property name="text">
<string>Existing address</string>
</property>
</widget>
</item>
<item row="2" column="3">
<widget class="QPushButton" name="btnAdd">
<property name="text">
<string>Add</string>
</property>
<property name="icon">
<iconset resource="../core/rc.qrc">
<normaloff>:/icons/new.svg</normaloff>:/icons/new.svg</iconset>
</property>
</widget>
</item>
<item row="1" column="0" colspan="4">
<widget class="QGroupBox" name="groupNew">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Expanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>0</width>
<height>0</height>
</size>
</property>
<property name="title">
<string>&amp;New address</string>
</property>
<property name="checkable">
<bool>true</bool>
</property>
<property name="checked">
<bool>false</bool>
</property>
<layout class="QFormLayout" name="formLayout_2">
<item row="0" column="0">
<widget class="QLabel" name="label_3">
<property name="text">
<string>Title</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QLineEdit" name="title"/>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_5">
<property name="text">
<string>First name</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QLineEdit" name="firstName"/>
</item>
<item row="2" column="0">
<widget class="QLabel" name="label_6">
<property name="text">
<string>Last name</string>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QLineEdit" name="lastName"/>
</item>
<item row="3" column="0">
<widget class="QLabel" name="label_7">
<property name="text">
<string>Date of birth</string>
</property>
</widget>
</item>
<item row="3" column="1">
<widget class="QDateEdit" name="birthDate">
<property name="displayFormat">
<string>d. MM. yyyy</string>
</property>
<property name="calendarPopup">
<bool>true</bool>
</property>
</widget>
</item>
<item row="4" column="0">
<widget class="QLabel" name="label_8">
<property name="text">
<string>ID card</string>
</property>
</widget>
</item>
<item row="4" column="1">
<widget class="QLineEdit" name="idCardNumber"/>
</item>
<item row="5" column="1">
<widget class="QCheckBox" name="ztp">
<property name="text">
<string>ZTP</string>
</property>
</widget>
</item>
<item row="6" column="0">
<widget class="QLabel" name="label_9">
<property name="text">
<string>Street</string>
</property>
</widget>
</item>
<item row="6" column="1">
<widget class="QLineEdit" name="addressStreet"/>
</item>
<item row="7" column="0">
<widget class="QLabel" name="label_10">
<property name="text">
<string>House number</string>
</property>
</widget>
</item>
<item row="7" column="1">
<widget class="QLineEdit" name="addressHouseNumber"/>
</item>
<item row="8" column="0">
<widget class="QLabel" name="label_11">
<property name="text">
<string>ZIP code</string>
</property>
</widget>
</item>
<item row="8" column="1">
<widget class="QLineEdit" name="addressZipCode"/>
</item>
<item row="9" column="0">
<widget class="QLabel" name="label_12">
<property name="text">
<string>City</string>
</property>
</widget>
</item>
<item row="9" column="1">
<widget class="QLineEdit" name="addressCity"/>
</item>
<item row="10" column="0">
<widget class="QLabel" name="label_13">
<property name="text">
<string>Country</string>
</property>
</widget>
</item>
<item row="10" column="1">
<widget class="QComboBox" name="country">
<property name="maximumSize">
<size>
<width>450</width>
<height>16777215</height>
</size>
</property>
<property name="editable">
<bool>true</bool>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item row="0" column="1" colspan="3">
<widget class="QComboBox" name="address">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="editable">
<bool>true</bool>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QWidget" name="widget_8" native="true">
<property name="minimumSize">
<size>
<width>150</width>
<height>0</height>
</size>
</property>
<layout class="QVBoxLayout" name="verticalLayout_4">
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="QWidget" name="widget_9" native="true">
<layout class="QHBoxLayout" name="horizontalLayout_8">
<item>
<spacer name="horizontalSpacer_6">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QToolButton" name="btnRemove">
<property name="enabled">
<bool>false</bool>
</property>
<property name="toolTip">
<string>Remove</string>
</property>
<property name="text">
<string>...</string>
</property>
<property name="icon">
<iconset resource="../core/rc.qrc">
<normaloff>:/icons/remove.svg</normaloff>:/icons/remove.svg</iconset>
</property>
<property name="iconSize">
<size>
<width>24</width>
<height>24</height>
</size>
</property>
<property name="autoRaise">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<widget class="QToolButton" name="btnOwner">
<property name="enabled">
<bool>false</bool>
</property>
<property name="toolTip">
<string>Owner</string>
</property>
<property name="text">
<string>...</string>
</property>
<property name="icon">
<iconset resource="../core/rc.qrc">
<normaloff>:/icons/ok.svg</normaloff>:/icons/ok.svg</iconset>
</property>
<property name="iconSize">
<size>
<width>24</width>
<height>24</height>
</size>
</property>
<property name="checkable">
<bool>false</bool>
</property>
<property name="autoRaise">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer_5">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QTableView" name="tablePeople">
<property name="minimumSize">
<size>
<width>380</width>
<height>0</height>
</size>
</property>
<property name="editTriggers">
<set>QAbstractItemView::NoEditTriggers</set>
</property>
<property name="selectionBehavior">
<enum>QAbstractItemView::SelectRows</enum>
</property>
</widget>
</item>
</layout>
</widget>
</item>
</layout>
</widget>
</item>
</layout>
</widget>
<widget class="QWizardPage" name="servicePage">
<layout class="QVBoxLayout" name="verticalLayout_3">
<item>
<widget class="QGroupBox" name="groupBox_3">
<property name="title">
<string>Services</string>
</property>
<layout class="QHBoxLayout" name="horizontalLayout_3">
<item>
<widget class="QTableView" name="tableServices"/>
</item>
<item>
<widget class="QWidget" name="widget_2" native="true">
<layout class="QVBoxLayout" name="verticalLayout_2">
<item>
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QToolButton" name="btnAddService">
<property name="enabled">
<bool>false</bool>
</property>
<property name="text">
<string>...</string>
</property>
<property name="icon">
<iconset resource="../core/rc.qrc">
<normaloff>:/icons/new.svg</normaloff>:/icons/new.svg</iconset>
</property>
<property name="iconSize">
<size>
<width>32</width>
<height>32</height>
</size>
</property>
<property name="autoRaise">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<widget class="QToolButton" name="btnRemoveService">
<property name="enabled">
<bool>false</bool>
</property>
<property name="text">
<string>...</string>
</property>
<property name="icon">
<iconset resource="../core/rc.qrc">
<normaloff>:/icons/remove.svg</normaloff>:/icons/remove.svg</iconset>
</property>
<property name="iconSize">
<size>
<width>32</width>
<height>32</height>
</size>
</property>
<property name="autoRaise">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<spacer name="verticalSpacer_2">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QTableView" name="tableItems"/>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QGroupBox" name="groupBox_4">
<property name="title">
<string>Sale</string>
</property>
<layout class="QGridLayout" name="gridLayout_2">
<item row="0" column="0">
<widget class="QCheckBox" name="checkSale">
<property name="text">
<string>Apply sale</string>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QComboBox" name="sale">
<property name="enabled">
<bool>false</bool>
</property>
</widget>
</item>
</layout>
</widget>
</item>
</layout>
</widget>
<widget class="QWizardPage" name="finishPage">
<layout class="QHBoxLayout" name="horizontalLayout_6">
<item>
<widget class="QGroupBox" name="groupBox_5">
<property name="title">
<string>Summary</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout_5">
<item>
<widget class="QWidget" name="widget_4" native="true">
<layout class="QHBoxLayout" name="horizontalLayout_5">
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="QLabel" name="label_16">
<property name="text">
<string>From:</string>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="lFrom">
<property name="text">
<string>TextLabel</string>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="label_18">
<property name="text">
<string>To:</string>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="lTo">
<property name="text">
<string>TextLabel</string>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer_4">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QWidget" name="widget_5" native="true">
<layout class="QHBoxLayout" name="horizontalLayout_4">
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="QLabel" name="label_20">
<property name="text">
<string>Days:</string>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="lDays">
<property name="text">
<string>TextLabel</string>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer_2">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QWidget" name="widget_10" native="true">
<layout class="QHBoxLayout" name="horizontalLayout_9">
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="QLabel" name="label_23">
<property name="text">
<string>Owner:</string>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="lOwner">
<property name="text">
<string>TextLabel</string>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer_7">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QLabel" name="label_14">
<property name="text">
<string>People:</string>
</property>
</widget>
</item>
<item>
<widget class="QTableView" name="tabPeople"/>
</item>
<item>
<widget class="QLabel" name="label_15">
<property name="text">
<string>Services:</string>
</property>
</widget>
</item>
<item>
<widget class="QTableView" name="tabServices"/>
</item>
<item>
<widget class="QWidget" name="widget_6" native="true">
<layout class="QFormLayout" name="formLayout">
<item row="0" column="0">
<widget class="QLabel" name="label_22">
<property name="text">
<string>Sale:</string>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_24">
<property name="font">
<font>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>Total:</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QDoubleSpinBox" name="totalSale">
<property name="autoFillBackground">
<bool>true</bool>
</property>
<property name="frame">
<bool>false</bool>
</property>
<property name="readOnly">
<bool>true</bool>
</property>
<property name="buttonSymbols">
<enum>QAbstractSpinBox::NoButtons</enum>
</property>
<property name="maximum">
<double>999999999.990000009536743</double>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QDoubleSpinBox" name="totalPrice">
<property name="font">
<font>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="autoFillBackground">
<bool>true</bool>
</property>
<property name="frame">
<bool>false</bool>
</property>
<property name="readOnly">
<bool>true</bool>
</property>
<property name="buttonSymbols">
<enum>QAbstractSpinBox::NoButtons</enum>
</property>
<property name="maximum">
<double>999999999.990000009536743</double>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QWidget" name="widget_7" native="true">
<layout class="QHBoxLayout" name="horizontalLayout_7">
<item>
<widget class="QPushButton" name="pushButton_2">
<property name="text">
<string>Print</string>
</property>
<property name="icon">
<iconset resource="../core/rc.qrc">
<normaloff>:/icons/print.svg</normaloff>:/icons/print.svg</iconset>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer_3">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
</item>
</layout>
</widget>
</item>
</layout>
</widget>
</widget>
<tabstops>
<tabstop>start</tabstop>
<tabstop>end</tabstop>
<tabstop>address</tabstop>
<tabstop>groupNew</tabstop>
<tabstop>title</tabstop>
<tabstop>firstName</tabstop>
<tabstop>lastName</tabstop>
<tabstop>birthDate</tabstop>
<tabstop>idCardNumber</tabstop>
<tabstop>ztp</tabstop>
<tabstop>addressStreet</tabstop>
<tabstop>addressHouseNumber</tabstop>
<tabstop>addressZipCode</tabstop>
<tabstop>addressCity</tabstop>
<tabstop>country</tabstop>
<tabstop>btnAdd</tabstop>
<tabstop>btnRemove</tabstop>
<tabstop>btnOwner</tabstop>
<tabstop>tablePeople</tabstop>
<tabstop>btnAddService</tabstop>
<tabstop>btnRemoveService</tabstop>
<tabstop>tableItems</tabstop>
<tabstop>tabPeople</tabstop>
<tabstop>tabServices</tabstop>
<tabstop>pushButton_2</tabstop>
<tabstop>checkSale</tabstop>
<tabstop>sale</tabstop>
<tabstop>tableServices</tabstop>
</tabstops>
<resources>
<include location="camprc.qrc"/>
<include location="../core/rc.qrc"/>
</resources>
<connections/>
</ui>

@ -0,0 +1,99 @@
#include "addressitem.h"
#include <define.h>
AddressItem::AddressItem(QObject *parent) : QObject(parent)
{
m_id = 0;
m_price = 0;
m_owner = false;
}
int AddressItem::id() const
{
return m_id;
}
void AddressItem::setId(int id)
{
m_id = id;
}
QString AddressItem::firstName() const
{
return m_firstName;
}
void AddressItem::setFirstName(const QString &firstName)
{
m_firstName = firstName;
}
QString AddressItem::lastName() const
{
return m_lastName;
}
void AddressItem::setLastName(const QString &lastName)
{
m_lastName = lastName;
}
QString AddressItem::address() const
{
return m_address;
}
void AddressItem::setAddress(const QString &address)
{
m_address = address;
}
QDecDouble AddressItem::price() const
{
return TO_DEC(m_price);
}
void AddressItem::setPrice(QDecDouble price)
{
m_price = FROM_DEC(price);
}
QWeakPointer<CampData> AddressItem::campData() const
{
return m_campData;
}
void AddressItem::setCampData(const QWeakPointer<CampData> &campData)
{
m_campData = campData;
}
PersonPricePtr AddressItem::personPrice() const
{
return m_personPrice;
}
void AddressItem::setPersonPrice(const PersonPricePtr &personPrice)
{
m_personPrice = personPrice;
}
AddressbookDataPtr AddressItem::adbItem() const
{
return m_adbItem;
}
void AddressItem::setAdbItem(const AddressbookDataPtr &adbItem)
{
m_adbItem = adbItem;
}
bool AddressItem::owner() const
{
return m_owner;
}
void AddressItem::setOwner(bool owner)
{
m_owner = owner;
}

@ -0,0 +1,70 @@
#ifndef ADDRESSITEM_H
#define ADDRESSITEM_H
#include "camp-data.h"
#include <QObject>
#include <QSharedPointer>
#include <QWeakPointer>
#include <QDecDouble.hh>
#include <odb/core.hxx>
#include <addressbookdata.h>
class CampData;
#pragma db object
class AddressItem : public QObject
{
Q_OBJECT
Q_PROPERTY(QString firstName READ firstName WRITE setFirstName)
Q_PROPERTY(QString lastName READ lastName WRITE setLastName)
Q_PROPERTY(QString address READ address WRITE setAddress)
Q_PROPERTY(QDecDouble price READ price WRITE setPrice)
Q_PROPERTY(bool owner READ owner WRITE setOwner)
public:
explicit AddressItem(QObject *parent = 0);
int id() const;
void setId(int id);
QString firstName() const;
void setFirstName(const QString &firstName);
QString lastName() const;
void setLastName(const QString &lastName);
QString address() const;
void setAddress(const QString &address);
QDecDouble price() const;
void setPrice(QDecDouble price);
QWeakPointer<CampData> campData() const;
void setCampData(const QWeakPointer<CampData> &campData);
PersonPricePtr personPrice() const;
void setPersonPrice(const PersonPricePtr &personPrice);
AddressbookDataPtr adbItem() const;
void setAdbItem(const AddressbookDataPtr &adbItem);
bool owner() const;
void setOwner(bool owner);
private:
friend class odb::access;
#pragma db id auto
int m_id;
QString m_firstName;
QString m_lastName;
QString m_address;
AddressbookDataPtr m_adbItem;
int m_price;
#pragma db not_null
QWeakPointer<CampData> m_campData;
PersonPricePtr m_personPrice;
bool m_owner;
};
#endif // ADDRESSITEM_H

@ -0,0 +1,24 @@
#ifndef CAMP_DATA_H
#define CAMP_DATA_H
#include <QSharedPointer>
class CampData;
class AddressItem;
class ServiceItem;
class Sale;
class PersonPrice;
typedef QSharedPointer<CampData> CampDataPtr;
typedef QSharedPointer<ServiceItem> ServiceItemPtr;
typedef QSharedPointer<AddressItem> AddressItemPtr;
typedef QSharedPointer<Sale> SalePtr;
typedef QSharedPointer<PersonPrice> PersonPricePtr;
#include "campdata.h"
#include "addressitem.h"
#include "serviceitem.h"
#include "sale.h"
#include "personprice.h"
#endif // CAMP_DATA_H

@ -0,0 +1,181 @@
#include "campdata.h"
#include <define.h>
CampData::CampData(QObject *parent) : QObject(parent)
{
m_id = 0;
m_totalPrice = 0;
m_sale = 0;
m_totalSale = 0;
m_ownerFirstame = false;
}
int CampData::id() const
{
return m_id;
}
void CampData::setId(int id)
{
m_id = id;
}
QDate CampData::start() const
{
return m_start;
}
void CampData::setStart(const QDate &start)
{
m_start = start;
}
QDate CampData::end() const
{
return m_end;
}
void CampData::setEnd(const QDate &end)
{
m_end = end;
}
QString CampData::ownerFirstame() const
{
return m_ownerFirstame;
}
void CampData::setOwnerFirstame(const QString &ownerFirstame)
{
m_ownerFirstame = ownerFirstame;
}
QString CampData::ownerLastname() const
{
return m_ownerLastname;
}
void CampData::setOwnerLastname(const QString &ownerLastname)
{
m_ownerLastname = ownerLastname;
}
QString CampData::ownerAddress() const
{
return m_ownerAddress;
}
void CampData::setOwnerAddress(const QString &ownerAddress)
{
m_ownerAddress = ownerAddress;
}
QOdbList<ServiceItemPtr> CampData::services() const
{
return m_services;
}
void CampData::setServices(const QOdbList<QSharedPointer<ServiceItem> > &services)
{
m_services = services;
}
void CampData::addServiceItem(ServiceItemPtr serviceItem)
{
m_services.append(serviceItem);
}
void CampData::removeServiceItem(ServiceItemPtr serviceItem)
{
m_services.removeOne(serviceItem);
}
QOdbList<AddressItemPtr> CampData::people() const
{
return m_people;
}
void CampData::setPeople(const QOdbList<AddressItemPtr> &people)
{
m_people = people;
}
void CampData::addPerson(AddressItemPtr person)
{
m_people.append(person);
}
void CampData::removePerson(AddressItemPtr person)
{
m_people.removeOne(person);
}
QDecDouble CampData::totalPrice() const
{
return TO_DEC(m_totalPrice);
}
void CampData::setTotalPrice(QDecDouble totalPrice)
{
m_totalPrice = FROM_DEC(totalPrice);
}
SeasonPtr CampData::season() const
{
return m_season;
}
void CampData::setSeason(const SeasonPtr &season)
{
m_season = season;
}
QDecDouble CampData::sale() const
{
return TO_DEC(m_sale);
}
void CampData::setSale(QDecDouble sale)
{
m_sale = FROM_DEC(sale);
}
bool CampData::fixedSale() const
{
return m_fixedSale;
}
void CampData::setFixedSale(bool fixedSale)
{
m_fixedSale = fixedSale;
}
QString CampData::numSer() const
{
return m_numSer;
}
void CampData::setNumSer(const QString &numSer)
{
m_numSer = numSer;
}
QDecDouble CampData::totalSale() const
{
return TO_DEC(m_totalSale);
}
void CampData::setTotalSale(QDecDouble totalSale)
{
m_totalSale = FROM_DEC(totalSale);
}
QDecDouble CampData::fullPrice() const
{
return TO_DEC(m_fullPrice);
}
void CampData::setFullPrice(QDecDouble fullPrice)
{
m_fullPrice = FROM_DEC(fullPrice);
}

@ -0,0 +1,102 @@
#ifndef CAMPDATA_H
#define CAMPDATA_H
#include "camp-data.h"
#include <QObject>
#include <QDate>
#include <QDecDouble.hh>
#include <odb/core.hxx>
#include <odb/qt/list.hxx>
#include <data/season.h>
#pragma db object
class CampData : public QObject
{
Q_OBJECT
Q_PROPERTY(QString numSer READ numSer WRITE setNumSer)
Q_PROPERTY(QDate start READ start WRITE setStart)
Q_PROPERTY(QDate end READ end WRITE setEnd)
Q_PROPERTY(QString ownerFirstame READ ownerFirstame WRITE setOwnerFirstame)
Q_PROPERTY(QString ownerLastname READ ownerLastname WRITE setOwnerLastname)
Q_PROPERTY(QString ownerAddress READ ownerAddress WRITE setOwnerAddress)
Q_PROPERTY(QDecDouble totalPrice READ totalPrice WRITE setTotalPrice)
Q_PROPERTY(QDecDouble sale READ sale WRITE setSale)
Q_PROPERTY(bool fixedSale READ fixedSale WRITE setFixedSale)
Q_PROPERTY(QDecDouble totalSale READ totalSale WRITE setTotalSale)
public:
explicit CampData(QObject *parent = 0);
int id() const;
void setId(int id);
QDate start() const;
void setStart(const QDate &start);
QDate end() const;
void setEnd(const QDate &end);
QString ownerFirstame() const;
void setOwnerFirstame(const QString &ownerFirstame);
QString ownerLastname() const;
void setOwnerLastname(const QString &ownerLastname);
QString ownerAddress() const;
void setOwnerAddress(const QString &ownerAddress);
QOdbList<QSharedPointer<ServiceItem> > services() const;
void setServices(const QOdbList<QSharedPointer<ServiceItem> > &services);
void addServiceItem(ServiceItemPtr serviceItem);
void removeServiceItem(ServiceItemPtr serviceItem);
QOdbList<AddressItemPtr> people() const;
void setPeople(const QOdbList<AddressItemPtr> &people);
void addPerson(AddressItemPtr person);
void removePerson(AddressItemPtr person);
QDecDouble totalPrice() const;
void setTotalPrice(QDecDouble totalPrice);
SeasonPtr season() const;
void setSeason(const SeasonPtr &season);
QDecDouble sale() const;
void setSale(QDecDouble sale);
bool fixedSale() const;
void setFixedSale(bool fixedSale);
QString numSer() const;
void setNumSer(const QString &numSer);
QDecDouble totalSale() const;
void setTotalSale(QDecDouble totalSale);
QDecDouble fullPrice() const;
void setFullPrice(QDecDouble fullPrice);
private:
friend class odb::access;
#pragma db id auto
int m_id;
QString m_numSer;
QDate m_start;
QDate m_end;
QString m_ownerFirstame;
QString m_ownerLastname;
QString m_ownerAddress;
#pragma db value_not_null inverse(m_campData)
QOdbList<ServiceItemPtr> m_services;
#pragma db value_not_null inverse(m_campData)
QOdbList<AddressItemPtr> m_people;
int m_fullPrice;
int m_totalPrice;
int m_sale;
int m_totalSale;
bool m_fixedSale;
SeasonPtr m_season;
};
#endif // CAMPDATA_H

@ -0,0 +1,71 @@
#include "personprice.h"
#include <define.h>
PersonPrice::PersonPrice(QObject *parent) : QObject(parent)
{
m_id = 0;
m_fromAge = 0;
m_toAge = 0;
m_price = 0;
m_active = true;
}
int PersonPrice::id() const
{
return m_id;
}
void PersonPrice::setId(int id)
{
m_id = id;
}
QString PersonPrice::description() const
{
return m_description;
}
void PersonPrice::setDescription(const QString &description)
{
m_description = description;
}
int PersonPrice::fromAge() const
{
return m_fromAge;
}
void PersonPrice::setFromAge(int fromAge)
{
m_fromAge = fromAge;
}
int PersonPrice::toAge() const
{
return m_toAge;
}
void PersonPrice::setToAge(int toAge)
{
m_toAge = toAge;
}
QDecDouble PersonPrice::price() const
{
return TO_DEC(m_price);
}
void PersonPrice::setPrice(QDecDouble price)
{
m_price = FROM_DEC(price);
}
bool PersonPrice::active() const
{
return m_active;
}
void PersonPrice::setActive(bool active)
{
m_active = active;
}

@ -0,0 +1,50 @@
#ifndef PERSONPRICE_H
#define PERSONPRICE_H
#include <QObject>
#include <QDecDouble.hh>
#include <odb/core.hxx>
#pragma db object
class PersonPrice : public QObject
{
Q_OBJECT
Q_PROPERTY(QString description READ description WRITE setDescription)
Q_PROPERTY(int fromAge READ fromAge WRITE setFromAge)
Q_PROPERTY(int toAge READ toAge WRITE setToAge)
Q_PROPERTY(QDecDouble price READ price WRITE setPrice)
Q_PROPERTY(bool active READ active WRITE setActive)
public:
explicit PersonPrice(QObject *parent = 0);
int id() const;
void setId(int id);
QString description() const;
void setDescription(const QString &description);
int fromAge() const;
void setFromAge(int fromAge);
int toAge() const;
void setToAge(int toAge);
QDecDouble price() const;
void setPrice(QDecDouble price);
bool active() const;
void setActive(bool active);
private:
friend class odb::access;
#pragma db id auto
int m_id;
QString m_description;
int m_fromAge;
int m_toAge;
int m_price;
bool m_active;
};
#endif // PERSONPRICE_H

@ -0,0 +1,66 @@
#include "sale.h"
#include <define.h>
Sale::Sale(QObject *parent) : ComboItem(parent)
{
m_id = 0;
m_sale = 0;
m_fixed = false;
}
int Sale::id() const
{
return m_id;
}
void Sale::setId(int id)
{
m_id = id;
}
QDecDouble Sale::sale() const
{
return TO_DEC(m_sale);
}
void Sale::setSale(QDecDouble sale)
{
m_sale = FROM_DEC(sale);
}
bool Sale::fixed() const
{
return m_fixed;
}
void Sale::setFixed(bool fixed)
{
m_fixed = fixed;
}
QString Sale::description() const
{
return m_description;
}
void Sale::setDescription(const QString &description)
{
m_description = description;
}
bool Sale::eq(ComboItem *other)
{
Sale *sale = qobject_cast<Sale*>(other);
if (sale == NULL)
{
return false;
}
return this->m_id == sale->m_id && this->m_sale == sale->m_sale && this->m_fixed == sale->m_fixed;
}
QString Sale::toString()
{
return m_description;
}

@ -0,0 +1,46 @@
#ifndef SALE_H
#define SALE_H
#include <QObject>
#include <odb/core.hxx>
#include <QDecDouble.hh>
#include <combodata.h>
#pragma db object
class Sale : public ComboItem
{
Q_OBJECT
Q_PROPERTY(QString description READ description WRITE setDescription)
Q_PROPERTY(QDecDouble sale READ sale WRITE setSale)
Q_PROPERTY(bool fixed READ fixed WRITE setFixed)
public:
explicit Sale(QObject *parent = 0);
int id() const;
void setId(int id);
QDecDouble sale() const;
void setSale(QDecDouble sale);
bool fixed() const;
void setFixed(bool fixed);
QString description() const;
void setDescription(const QString &description);
private:
friend class odb::access;
#pragma db id auto
int m_id;
QString m_description;
int m_sale;
bool m_fixed;
// ComboItem interface
public:
bool eq(ComboItem *other);
QString toString();
};
#endif // SALE_H

@ -0,0 +1,122 @@
#include "serviceitem.h"
#include <define.h>
ServiceItem::ServiceItem(QObject *parent) : QObject(parent)
{
m_id = 0;
m_salePossible = false;
m_sale = 0;
m_price = 0;
m_totalPrice = 0;
m_type = AccService::OTHER;
}
int ServiceItem::id() const
{
return m_id;
}
void ServiceItem::setId(int id)
{
m_id = id;
}
QString ServiceItem::name() const
{
return m_name;
}
void ServiceItem::setName(const QString &name)
{
m_name = name;
}
QString ServiceItem::code() const
{
return m_code;
}
void ServiceItem::setCode(const QString &code)
{
m_code = code;
}
QDecDouble ServiceItem::price() const
{
return TO_DEC(m_price);
}
void ServiceItem::setPrice(QDecDouble price)
{
m_price = FROM_DEC(price);
}
bool ServiceItem::salePossible() const
{
return m_salePossible;
}
void ServiceItem::setSalePossible(bool salePossible)
{
m_salePossible = salePossible;
}
AccService::ServiceType ServiceItem::type() const
{
return m_type;
}
void ServiceItem::setType(const AccService::ServiceType &type)
{
m_type = type;
}
QWeakPointer<CampData> ServiceItem::campData() const
{
return m_campData;
}
void ServiceItem::setCampData(const QWeakPointer<CampData> &campData)
{
m_campData = campData;
}
QString ServiceItem::description() const
{
return m_description;
}
void ServiceItem::setDescription(const QString &description)
{
m_description = description;
}
QDecDouble ServiceItem::sale() const
{
return TO_DEC(m_sale);
}
void ServiceItem::setSale(QDecDouble sale)
{
m_sale = FROM_DEC(sale);
}
QDecDouble ServiceItem::totalPrice() const
{
return TO_DEC(m_totalPrice);
}
void ServiceItem::setTotalPrice(QDecDouble totalPrice)
{
m_totalPrice = FROM_DEC(totalPrice);
}
QDecDouble ServiceItem::fullPrice() const
{
return TO_DEC(m_fullPrice);
}
void ServiceItem::setFullPrice(QDecDouble fullPrice)
{
m_fullPrice = FROM_DEC(fullPrice);
}

@ -0,0 +1,81 @@
#ifndef SREVICEITEM_H
#define SREVICEITEM_H
#include "camp-data.h"
#include <QObject>
#include <QSharedPointer>
#include <QWeakPointer>
#include <QDecDouble.hh>
#include <odb/core.hxx>
#include <accservice.h>
class CampData;
#pragma db object
class ServiceItem : public QObject
{
Q_OBJECT
Q_PROPERTY(QString name READ name WRITE setName)
Q_PROPERTY(QString code READ code WRITE setCode)
Q_PROPERTY(QString description READ description WRITE setDescription)
Q_PROPERTY(QDecDouble price READ price WRITE setPrice)
Q_PROPERTY(QDecDouble sale READ sale WRITE setSale)
Q_PROPERTY(QDecDouble totalPrice READ totalPrice WRITE setTotalPrice)
Q_PROPERTY(AccService::ServiceType type READ type WRITE setType)
Q_ENUMS(AccService::ServiceType)
public:
explicit ServiceItem(QObject *parent = 0);
int id() const;
void setId(int id);
QString name() const;
void setName(const QString &name);
QString code() const;
void setCode(const QString &code);
QDecDouble price() const;
void setPrice(QDecDouble price);
bool salePossible() const;
void setSalePossible(bool salePossible);
AccService::ServiceType type() const;
void setType(const AccService::ServiceType &type);
QWeakPointer<CampData> campData() const;
void setCampData(const QWeakPointer<CampData> &campData);
QString description() const;
void setDescription(const QString &description);
QDecDouble sale() const;
void setSale(QDecDouble sale);
QDecDouble totalPrice() const;
void setTotalPrice(QDecDouble totalPrice);
QDecDouble fullPrice() const;
void setFullPrice(QDecDouble fullPrice);
private:
friend class odb::access;
#pragma db id auto
int m_id;
QString m_name;
QString m_code;
QString m_description;
int m_price;
int m_fullPrice;
int m_totalPrice;
int m_sale;
bool m_salePossible;
AccService::ServiceType m_type;
#pragma db not_null
QWeakPointer<CampData> m_campData;
};
#endif // SREVICEITEM_H

@ -0,0 +1,7 @@
<?xml version="1.0" ?><svg clip-rule="evenodd" fill-rule="evenodd" image-rendering="optimizeQuality" shape-rendering="geometricPrecision" text-rendering="geometricPrecision" viewBox="0 0 5000 5000" xmlns="http://www.w3.org/2000/svg"><defs><style type="text/css"><![CDATA[
.str1 {stroke:#434242;stroke-width:100}
.str0 {stroke:#434242;stroke-width:300;stroke-linecap:round}
.fil0 {fill:none}
.fil1 {fill:#434242}
.fil2 {fill:url(#id0)}
]]></style><linearGradient gradientUnits="userSpaceOnUse" id="id0" x1="2500.01" x2="2500.01" y1="4260.19" y2="1474.81"><stop offset="0" stop-color="#008BFF"/><stop offset="1" stop-color="#0af"/></linearGradient></defs><g id="Layer_x0020_1"><path class="fil0 str0" d="M300 2000l2050-1600c100-50 200-50 300 0l2050 1500"/><path class="fil1" d="M3500 1022l600 439v-861c0-55-45-100-100-100h-400c-55 0-100 45-100 100v422z"/><path class="fil2 str1" d="M899 4700h901v-1500c0-110 90-200 200-200h900c110 0 200 90 200 200v1500h1001c165 0 300-135 300-300l-1-2000-1776-1328c-33-26-79-37-124-36s-92 14-127 40l-1773 1324-1 2000c0 165 135 300 300 300z"/></g></svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

@ -0,0 +1,70 @@
#include "campsettings.h"
#include <define.h>
#include <QDebug>
CampSettings::CampSettings(QObject *parent) : QObject(parent)
{
m_accFee = 0;
m_rounding = Enums::R_MATH;
m_decimalPlaces = 0;
}
QDecDouble CampSettings::accFee() const
{
return TO_DEC(m_accFee);
}
void CampSettings::setAccFee(QDecDouble accFee)
{
m_accFee = FROM_DEC(accFee);
}
Enums::Rounding CampSettings::rounding() const
{
return m_rounding;
}
void CampSettings::setRounding(const Enums::Rounding &rounding)
{
m_rounding = rounding;
}
int CampSettings::decimalPlaces() const
{
return m_decimalPlaces;
}
void CampSettings::setDecimalPlaces(int decimalPlaces)
{
m_decimalPlaces = decimalPlaces;
}
int CampSettings::accFeeStartAge() const
{
return m_accFeeStartAge;
}
void CampSettings::setAccFeeStartAge(int accFeeStartAge)
{
m_accFeeStartAge = accFeeStartAge;
}
int CampSettings::accFeeEndAge() const
{
return m_accFeeEndAge;
}
void CampSettings::setAccFeeEndAge(int accFeeEndAge)
{
m_accFeeEndAge = accFeeEndAge;
}
QString CampSettings::accFeeText() const
{
return m_accFeeText;
}
void CampSettings::setAccFeeText(const QString &accFeeText)
{
m_accFeeText = accFeeText;
}

@ -0,0 +1,51 @@
#ifndef CAMPSETTINGS_H
#define CAMPSETTINGS_H
#include <QObject>
#include <enums.h>
#include <QDecDouble.hh>
#include <QSharedPointer>
class CampSettings : public QObject
{
Q_OBJECT
Q_PROPERTY(QDecDouble accFee READ accFee WRITE setAccFee)
Q_PROPERTY(int accFeeStartAge READ accFeeStartAge WRITE setAccFeeStartAge)
Q_PROPERTY(int accFeeEndAge READ accFeeEndAge WRITE setAccFeeEndAge)
Q_PROPERTY(Enums::Rounding rounding READ rounding WRITE setRounding)
Q_PROPERTY(int decimalPlaces READ decimalPlaces WRITE setDecimalPlaces)
Q_PROPERTY(QString accFeeText READ accFeeText WRITE setAccFeeText)
public:
explicit CampSettings(QObject *parent = 0);
QDecDouble accFee() const;
void setAccFee(QDecDouble accFee);
Enums::Rounding rounding() const;
void setRounding(const Enums::Rounding &rounding);
int decimalPlaces() const;
void setDecimalPlaces(int decimalPlaces);
int accFeeStartAge() const;
void setAccFeeStartAge(int accFeeStartAge);
int accFeeEndAge() const;
void setAccFeeEndAge(int accFeeEndAge);
QString accFeeText() const;
void setAccFeeText(const QString &accFeeText);
private:
int m_accFee;
int m_accFeeStartAge;
int m_accFeeEndAge;
QString m_accFeeText;
Enums::Rounding m_rounding;
int m_decimalPlaces;
};
typedef QSharedPointer<CampSettings> CampSettingsPtr;
#endif // CAMPSETTINGS_H

@ -0,0 +1,175 @@
#include "camp-odb.hxx"
#include "campsettingsform.h"
#include "ui_campsettingsform.h"
#include <settingsservice.h>
#include <QScroller>
#include <QMessageBox>
CampSettingsForm::CampSettingsForm(QWidget *parent) :
FormBinder<CampSettings>(parent),
ui(new Ui::CampSettingsForm)
{
ui->setupUi(this);
m_personPriceModel = new AutoTableModel<PersonPrice>();
m_personPriceModel->setEditableCols(QList<int>() << 0 << 1 << 2 << 3);
m_saleModel = new AutoTableModel<Sale>();
m_saleModel->setEditableCols(QList<int>() << 0 << 1 << 2);
ui->tablePersonPrices->setModel(m_personPriceModel);
ui->tableSales->setModel(m_saleModel);
ui->tablePersonPrices->horizontalHeader()->setSectionResizeMode(0, QHeaderView::Stretch);
ui->tableSales->horizontalHeader()->setSectionResizeMode(0, QHeaderView::Stretch);
QScroller::grabGesture(ui->tablePersonPrices, QScroller::LeftMouseButtonGesture);
QScroller::grabGesture(ui->tableSales, QScroller::LeftMouseButtonGesture);
connect(ui->tablePersonPrices->selectionModel(), &QItemSelectionModel::currentRowChanged, [this](){
ui->btnPriceDisable->setEnabled(ui->tablePersonPrices->currentIndex().isValid());
ui->btnPriceRemove->setEnabled(ui->tablePersonPrices->currentIndex().isValid());
ui->btnPriceDisable->setChecked(m_personPriceModel->itemFromIndex(ui->tablePersonPrices->currentIndex())->active());
});
connect(ui->tableSales->selectionModel(), &QItemSelectionModel::currentRowChanged, [this](){
ui->btnSaleRemove->setEnabled(ui->tableSales->currentIndex().isValid());
});
registerBinding(ui->accFee);
registerBinding(ui->accFeeStartAge);
registerBinding(ui->accFeeEndAge);
registerBinding(ui->decimalPlaces);
registerBinding(ui->accFeeText);
QList<ComboData> roundings ;
roundings << ComboData(Enums::R_NONE, tr("None"))
<< ComboData(Enums::R_UP, tr("Up"))
<< ComboData(Enums::R_DOWN, tr("Down"))
<< ComboData(Enums::R_MATH, tr("Mathematic"));
registerBinding(ui->rounding, roundings);
}
CampSettingsForm::~CampSettingsForm()
{
delete ui;
}
bool CampSettingsForm::saveRecord()
{
bindToData();
SettingsService srv("CAMP");
srv.saveSettings(entity());
Service<PersonPrice> personSrv;
Service<Sale> saleSrv;
bool ret = true;
connect(&personSrv, &IService::dbErrorDelete, [&ret, this](QString){
QMessageBox::critical(this, tr("Cannot delete"), tr("Price already used"));
ret = false;
});
foreach (PersonPricePtr p, personSrv.all()) {
bool found = false;
foreach (PersonPricePtr price, m_personPriceModel->list()) {
if (price->id() == p->id())
{
found = true;
break;
}
}
if (!found)
{
personSrv.erase(p);
}
}
foreach (PersonPricePtr p, m_personPriceModel->list()) {
bool found = false;
foreach (PersonPricePtr price, personSrv.all()) {
if (price->id() == p->id())
{
found = true;
break;
}
}
if (!found)
{
personSrv.save(p);
}
else
{
personSrv.update(p);
}
}
foreach (SalePtr s, saleSrv.all()) {
saleSrv.erase(s);
}
foreach (SalePtr s, m_saleModel->list()) {
saleSrv.save(s);
}
return ret;
}
void CampSettingsForm::loadEntity()
{
SettingsService srv("CAMP");
CampSettingsPtr settings = srv.loadSettings<CampSettings>();
setEntity(settings);
Service<PersonPrice> personSrv;
Service<Sale> saleSrv;
m_personPriceModel->setData(personSrv.all());
m_saleModel->setData(saleSrv.all());
ui->btnPriceDisable->setEnabled(false);
ui->btnPriceRemove->setEnabled(false);
ui->btnSaleRemove->setEnabled(false);
}
void CampSettingsForm::on_btnPriceAdd_clicked()
{
PersonPricePtr price(new PersonPrice());
m_personPriceModel->addRow(price);
}
void CampSettingsForm::on_btnSaleAdd_clicked()
{
SalePtr sale(new Sale());
m_saleModel->addRow(sale);
}
void CampSettingsForm::on_btnPriceRemove_clicked()
{
m_personPriceModel->removeRowAt(ui->tablePersonPrices->currentIndex());
}
void CampSettingsForm::on_btnPriceDisable_clicked()
{
PersonPricePtr price = m_personPriceModel->itemFromIndex(ui->tablePersonPrices->currentIndex());
price->setActive(!price->active());
}
void CampSettingsForm::on_btnPriceFilter_clicked()
{
Service<PersonPrice> srv;
if (ui->btnPriceFilter->isChecked())
{
m_personPriceModel->setData(srv.all("active = 1"));
}
else
{
m_personPriceModel->setData(srv.all());
}
}
void CampSettingsForm::on_btnSaleRemove_clicked()
{
m_saleModel->removeRowAt(ui->tableSales->currentIndex());
}

@ -0,0 +1,51 @@
#ifndef CAMPSETTINGSFORM_H
#define CAMPSETTINGSFORM_H
#include <QWidget>
#include <QList>
#include "campsettings.h"
#include "data/camp-data.h"
#include <formbinder.h>
#include <autotablemodel.h>
namespace Ui {
class CampSettingsForm;
}
class CampSettingsForm : public FormBinder<CampSettings>
{
Q_OBJECT
public:
explicit CampSettingsForm(QWidget *parent = 0);
~CampSettingsForm();
// IForm interface
public slots:
bool saveRecord();
// IForm interface
public:
void loadEntity();
private slots:
void on_btnPriceAdd_clicked();
void on_btnSaleAdd_clicked();
void on_btnPriceRemove_clicked();
void on_btnPriceDisable_clicked();
void on_btnPriceFilter_clicked();
void on_btnSaleRemove_clicked();
private:
Ui::CampSettingsForm *ui;
AutoTableModel<PersonPrice> *m_personPriceModel;
AutoTableModel<Sale> *m_saleModel;
};
#endif // CAMPSETTINGSFORM_H

@ -0,0 +1,333 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>CampSettingsForm</class>
<widget class="QWidget" name="CampSettingsForm">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>995</width>
<height>641</height>
</rect>
</property>
<property name="windowTitle">
<string>Form</string>
</property>
<layout class="QHBoxLayout" name="horizontalLayout_3">
<item>
<widget class="QWidget" name="widget_3" native="true">
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QGroupBox" name="groupBox">
<property name="title">
<string>Person prices</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout_2">
<item>
<widget class="QWidget" name="widget" native="true">
<layout class="QHBoxLayout" name="horizontalLayout">
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="QToolButton" name="btnPriceAdd">
<property name="toolTip">
<string>Add</string>
</property>
<property name="text">
<string>...</string>
</property>
<property name="icon">
<iconset resource="../../core/rc.qrc">
<normaloff>:/icons/new.svg</normaloff>:/icons/new.svg</iconset>
</property>
<property name="autoRaise">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<widget class="QToolButton" name="btnPriceRemove">
<property name="enabled">
<bool>false</bool>
</property>
<property name="toolTip">
<string>Remove</string>
</property>
<property name="text">
<string>...</string>
</property>
<property name="icon">
<iconset resource="../../core/rc.qrc">
<normaloff>:/icons/remove.svg</normaloff>:/icons/remove.svg</iconset>
</property>
<property name="autoRaise">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<widget class="QToolButton" name="btnPriceDisable">
<property name="enabled">
<bool>false</bool>
</property>
<property name="toolTip">
<string>Deactivate</string>
</property>
<property name="text">
<string>...</string>
</property>
<property name="icon">
<iconset resource="../../core/rc.qrc">
<normaloff>:/icons/ok.svg</normaloff>:/icons/ok.svg</iconset>
</property>
<property name="checkable">
<bool>true</bool>
</property>
<property name="autoRaise">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<widget class="QToolButton" name="btnPriceFilter">
<property name="toolTip">
<string>Filter active</string>
</property>
<property name="text">
<string>...</string>
</property>
<property name="icon">
<iconset resource="../../core/rc.qrc">
<normaloff>:/icons/filter.svg</normaloff>:/icons/filter.svg</iconset>
</property>
<property name="checkable">
<bool>true</bool>
</property>
<property name="autoRaise">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QTableView" name="tablePersonPrices">
<property name="minimumSize">
<size>
<width>550</width>
<height>0</height>
</size>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QGroupBox" name="groupBox_2">
<property name="title">
<string>Sales</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout_3">
<item>
<widget class="QWidget" name="widget_2" native="true">
<layout class="QHBoxLayout" name="horizontalLayout_2">
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="QToolButton" name="btnSaleAdd">
<property name="toolTip">
<string>Add</string>
</property>
<property name="text">
<string>...</string>
</property>
<property name="icon">
<iconset resource="../../core/rc.qrc">
<normaloff>:/icons/new.svg</normaloff>:/icons/new.svg</iconset>
</property>
<property name="autoRaise">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<widget class="QToolButton" name="btnSaleRemove">
<property name="enabled">
<bool>false</bool>
</property>
<property name="toolTip">
<string>Remove</string>
</property>
<property name="text">
<string>...</string>
</property>
<property name="icon">
<iconset resource="../../core/rc.qrc">
<normaloff>:/icons/remove.svg</normaloff>:/icons/remove.svg</iconset>
</property>
<property name="autoRaise">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer_2">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QTableView" name="tableSales"/>
</item>
</layout>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QGroupBox" name="groupBox_3">
<property name="title">
<string>Other settings</string>
</property>
<layout class="QFormLayout" name="formLayout">
<item row="2" column="0">
<widget class="QLabel" name="label">
<property name="text">
<string>Accommodation fee</string>
</property>
</widget>
</item>
<item row="6" column="0">
<widget class="QLabel" name="label_2">
<property name="text">
<string>Rounding</string>
</property>
</widget>
</item>
<item row="6" column="1">
<widget class="QComboBox" name="rounding"/>
</item>
<item row="7" column="0">
<widget class="QLabel" name="decimalPlaceslab">
<property name="text">
<string>Decimal places</string>
</property>
</widget>
</item>
<item row="7" column="1">
<widget class="QDoubleSpinBox" name="decimalPlaces">
<property name="buttonSymbols">
<enum>QAbstractSpinBox::NoButtons</enum>
</property>
<property name="decimals">
<number>0</number>
</property>
<property name="maximum">
<double>100000.000000000000000</double>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QLabel" name="label_3">
<property name="text">
<string>Fee start age</string>
</property>
</widget>
</item>
<item row="3" column="1">
<widget class="QSpinBox" name="accFeeStartAge">
<property name="buttonSymbols">
<enum>QAbstractSpinBox::NoButtons</enum>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QDoubleSpinBox" name="accFee">
<property name="buttonSymbols">
<enum>QAbstractSpinBox::NoButtons</enum>
</property>
<property name="maximum">
<double>99999.990000000005239</double>
</property>
</widget>
</item>
<item row="4" column="0">
<widget class="QLabel" name="label_4">
<property name="text">
<string>Fee end age</string>
</property>
</widget>
</item>
<item row="4" column="1">
<widget class="QSpinBox" name="accFeeEndAge">
<property name="buttonSymbols">
<enum>QAbstractSpinBox::NoButtons</enum>
</property>
</widget>
</item>
<item row="5" column="0">
<widget class="QLabel" name="label_5">
<property name="text">
<string>Fee description</string>
</property>
</widget>
</item>
<item row="5" column="1">
<widget class="QLineEdit" name="accFeeText"/>
</item>
</layout>
</widget>
</item>
</layout>
</widget>
<resources>
<include location="../../core/rc.qrc"/>
</resources>
<connections/>
</ui>

Binary file not shown.

@ -0,0 +1,376 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.1" language="cs_CZ">
<context>
<name>AddServiceDialog</name>
<message>
<location filename="../addservicedialog.ui" line="14"/>
<source>Dialog</source>
<translation>Služba</translation>
</message>
<message>
<location filename="../addservicedialog.ui" line="20"/>
<source>Service name</source>
<translation>Jméno služby</translation>
</message>
<message>
<location filename="../addservicedialog.ui" line="47"/>
<source>Description</source>
<translation>Popis</translation>
</message>
<message>
<location filename="../addservicedialog.ui" line="64"/>
<source>Price</source>
<translation>Cena</translation>
</message>
</context>
<context>
<name>CampForm</name>
<message>
<location filename="../campform.ui" line="14"/>
<source>Form</source>
<translation>Ubytování</translation>
</message>
</context>
<context>
<name>CampSettingsForm</name>
<message>
<location filename="../settings/campsettingsform.ui" line="14"/>
<source>Form</source>
<translation>Nastavení ubytování</translation>
</message>
<message>
<location filename="../settings/campsettingsform.ui" line="23"/>
<source>Person prices</source>
<translation>Ubytování lidí</translation>
</message>
<message>
<location filename="../settings/campsettingsform.ui" line="44"/>
<location filename="../settings/campsettingsform.ui" line="174"/>
<source>Add</source>
<translation>Nový</translation>
</message>
<message>
<location filename="../settings/campsettingsform.ui" line="47"/>
<location filename="../settings/campsettingsform.ui" line="67"/>
<location filename="../settings/campsettingsform.ui" line="87"/>
<location filename="../settings/campsettingsform.ui" line="107"/>
<location filename="../settings/campsettingsform.ui" line="177"/>
<location filename="../settings/campsettingsform.ui" line="197"/>
<source>...</source>
<translation>...</translation>
</message>
<message>
<location filename="../settings/campsettingsform.ui" line="64"/>
<location filename="../settings/campsettingsform.ui" line="194"/>
<source>Remove</source>
<translation>Odebrat</translation>
</message>
<message>
<location filename="../settings/campsettingsform.ui" line="84"/>
<source>Deactivate</source>
<translation>Odstranit</translation>
</message>
<message>
<location filename="../settings/campsettingsform.ui" line="104"/>
<source>Filter active</source>
<translation>Filtr</translation>
</message>
<message>
<location filename="../settings/campsettingsform.ui" line="153"/>
<source>Sales</source>
<translation>Slevy</translation>
</message>
<message>
<location filename="../settings/campsettingsform.ui" line="236"/>
<source>Other settings</source>
<translation>Ostatní nastavení</translation>
</message>
<message>
<location filename="../settings/campsettingsform.ui" line="242"/>
<source>Accommodation fee</source>
<translation>Rekreační poplatek</translation>
</message>
<message>
<location filename="../settings/campsettingsform.ui" line="249"/>
<source>Rounding</source>
<translation>Zaokrouhlování</translation>
</message>
<message>
<location filename="../settings/campsettingsform.ui" line="259"/>
<source>Decimal places</source>
<translation>Desetinných míst</translation>
</message>
<message>
<location filename="../settings/campsettingsform.ui" line="279"/>
<source>Fee start age</source>
<translation>Poplatek od věku</translation>
</message>
<message>
<location filename="../settings/campsettingsform.ui" line="303"/>
<source>Fee end age</source>
<translation>Poplatek do věku</translation>
</message>
<message>
<location filename="../settings/campsettingsform.ui" line="317"/>
<source>Fee description</source>
<translation>Název na dokladu</translation>
</message>
<message>
<location filename="../settings/campsettingsform.cpp" line="45"/>
<source>None</source>
<translation>Žádné</translation>
</message>
<message>
<location filename="../settings/campsettingsform.cpp" line="46"/>
<source>Up</source>
<translation>Nahoru</translation>
</message>
<message>
<location filename="../settings/campsettingsform.cpp" line="47"/>
<source>Down</source>
<translation>Dolu</translation>
</message>
<message>
<location filename="../settings/campsettingsform.cpp" line="48"/>
<source>Mathematic</source>
<translation>Matematické</translation>
</message>
<message>
<location filename="../settings/campsettingsform.cpp" line="68"/>
<source>Cannot delete</source>
<translation>Nelze smazat</translation>
</message>
<message>
<location filename="../settings/campsettingsform.cpp" line="68"/>
<source>Price already used</source>
<translation>Cena je používána</translation>
</message>
</context>
<context>
<name>CampWizard</name>
<message>
<location filename="../campwizard.ui" line="17"/>
<source>Camp record</source>
<translation>Nové ubytování</translation>
</message>
<message>
<location filename="../campwizard.ui" line="37"/>
<source>From</source>
<translation>Od</translation>
</message>
<message>
<location filename="../campwizard.ui" line="44"/>
<location filename="../campwizard.ui" line="61"/>
<source>d. M. yyyy</source>
<translation></translation>
</message>
<message>
<location filename="../campwizard.ui" line="54"/>
<source>To</source>
<translation>Do</translation>
</message>
<message>
<location filename="../campwizard.ui" line="87"/>
<source>People</source>
<translation>Ubytovaný</translation>
</message>
<message>
<location filename="../campwizard.ui" line="102"/>
<source>Existing address</source>
<translation>Existující adresa</translation>
</message>
<message>
<location filename="../campwizard.ui" line="109"/>
<source>Add</source>
<translation>Přidat</translation>
</message>
<message>
<source>New address</source>
<translation type="vanished">Nová adresa</translation>
</message>
<message>
<location filename="../campwizard.ui" line="132"/>
<source>&amp;New address</source>
<translation>&amp;Nová adresa</translation>
</message>
<message>
<location filename="../campwizard.ui" line="144"/>
<source>Title</source>
<translation>Titul</translation>
</message>
<message>
<location filename="../campwizard.ui" line="154"/>
<source>First name</source>
<translation>Křestní jméno</translation>
</message>
<message>
<location filename="../campwizard.ui" line="164"/>
<source>Last name</source>
<translation>Příjmení</translation>
</message>
<message>
<location filename="../campwizard.ui" line="174"/>
<source>Date of birth</source>
<translation>Datum narození</translation>
</message>
<message>
<location filename="../campwizard.ui" line="181"/>
<source>d. MM. yyyy</source>
<translation></translation>
</message>
<message>
<location filename="../campwizard.ui" line="191"/>
<source>ID card</source>
<translation>Číslo dokladu</translation>
</message>
<message>
<location filename="../campwizard.ui" line="201"/>
<source>ZTP</source>
<translation>ZTP</translation>
</message>
<message>
<location filename="../campwizard.ui" line="208"/>
<source>Street</source>
<translation>Ulice</translation>
</message>
<message>
<location filename="../campwizard.ui" line="218"/>
<source>House number</source>
<translation>Číslo popisné</translation>
</message>
<message>
<location filename="../campwizard.ui" line="228"/>
<source>ZIP code</source>
<translation>PSČ</translation>
</message>
<message>
<location filename="../campwizard.ui" line="238"/>
<source>City</source>
<translation>Město</translation>
</message>
<message>
<location filename="../campwizard.ui" line="248"/>
<source>Country</source>
<translation>Stát</translation>
</message>
<message>
<location filename="../campwizard.ui" line="327"/>
<source>Remove</source>
<translation>Odebrat</translation>
</message>
<message>
<location filename="../campwizard.ui" line="330"/>
<location filename="../campwizard.ui" line="356"/>
<location filename="../campwizard.ui" line="449"/>
<location filename="../campwizard.ui" line="472"/>
<source>...</source>
<translation>...</translation>
</message>
<message>
<location filename="../campwizard.ui" line="353"/>
<source>Owner</source>
<translation>Vlastník</translation>
</message>
<message>
<location filename="../campwizard.ui" line="421"/>
<source>Services</source>
<translation>Služby</translation>
</message>
<message>
<location filename="../campwizard.ui" line="514"/>
<source>Sale</source>
<translation>Sleva</translation>
</message>
<message>
<location filename="../campwizard.ui" line="520"/>
<source>Apply sale</source>
<translation>Uplatnit slevu</translation>
</message>
<message>
<location filename="../campwizard.ui" line="541"/>
<source>Summary</source>
<translation>Shrnutí</translation>
</message>
<message>
<location filename="../campwizard.ui" line="559"/>
<source>From:</source>
<translation>Od:</translation>
</message>
<message>
<location filename="../campwizard.ui" line="566"/>
<location filename="../campwizard.ui" line="580"/>
<location filename="../campwizard.ui" line="622"/>
<location filename="../campwizard.ui" line="664"/>
<source>TextLabel</source>
<translation></translation>
</message>
<message>
<location filename="../campwizard.ui" line="573"/>
<source>To:</source>
<translation>Do:</translation>
</message>
<message>
<location filename="../campwizard.ui" line="615"/>
<source>Days:</source>
<translation>Počet dní:</translation>
</message>
<message>
<location filename="../campwizard.ui" line="657"/>
<source>Owner:</source>
<translation>Vlastník:</translation>
</message>
<message>
<location filename="../campwizard.ui" line="687"/>
<source>People:</source>
<translation>Ubytovaní:</translation>
</message>
<message>
<location filename="../campwizard.ui" line="697"/>
<source>Services:</source>
<translation>Služby:</translation>
</message>
<message>
<location filename="../campwizard.ui" line="710"/>
<source>Sale:</source>
<translation>Sleva:</translation>
</message>
<message>
<location filename="../campwizard.ui" line="723"/>
<source>Total:</source>
<translation>Celkem:</translation>
</message>
<message>
<location filename="../campwizard.ui" line="780"/>
<source>Print</source>
<translation>Tisk</translation>
</message>
<message>
<location filename="../campwizard.cpp" line="366"/>
<location filename="../campwizard.cpp" line="372"/>
<location filename="../campwizard.cpp" line="378"/>
<source>Error</source>
<translation>Chyba</translation>
</message>
<message>
<location filename="../campwizard.cpp" line="366"/>
<source>Add people.</source>
<translation>Přidání lidí.</translation>
</message>
<message>
<location filename="../campwizard.cpp" line="372"/>
<source>Start date is after or equals end date.</source>
<translation>Datum začátku je stejné nebo menší než datum konce.</translation>
</message>
<message>
<location filename="../campwizard.cpp" line="378"/>
<source>Add service.</source>
<translation>Přidat službu.</translation>
</message>
<message>
<location filename="../campwizard.cpp" line="392"/>
<source>Database error</source>
<translation>Chyba databáze</translation>
</message>
</context>
</TS>

@ -35,3 +35,8 @@ ShopItemPtr CommodityService::shopItem(int itemId)
CommodityDataPtr item = this->loadById(itemId);
return qSharedPointerDynamicCast<ShopItem, CommodityData>(item);
}
ISeller *CommodityService::seller()
{
return NULL;
}

@ -15,7 +15,7 @@ public:
QList<ShopItemPtr> shopItems() override;
void addedToVoucher(int itemId, int countAdded) override;
virtual ShopItemPtr shopItem(int itemId) override;
ISeller *seller() override;
};
#endif // COMMODITYSERVICE_H

@ -17,6 +17,7 @@ else:win32:CONFIG(debug, debug|release): LIBS += -L$$OUT_PWD/../core/debug/ -lco
else:unix: LIBS += -L$$OUT_PWD/../core/ -lcore
INCLUDEPATH += $$PWD/core
INCLUDEPATH += $$PWD/core/data
DEPENDPATH += $$PWD/core
win32:CONFIG(release, debug|release): LIBS += -L$$OUT_PWD/../qdecimal/lib/ -lqdecimal -ldecnumber

@ -6,6 +6,7 @@
#include <QMetaProperty>
#include <QModelIndex>
#include <QDebug>
#include <QDecDouble.hh>
#include "../qdecimal/src/QDecDouble.hh"
@ -151,7 +152,7 @@ public:
const char *prop = rawEntity->metaObject()->property(column + 1).name();
std::sort(ALL(m_list), [prop, order](QSharedPointer<T> entA, QSharedPointer<T> entB) -> bool {
if (order == Qt::AscendingOrder) {
if (order == Qt::DescendingOrder) {
return ((QObject*)entA.data())->property(prop) < ((QObject*)entB.data())->property(prop);
} else {
return ((QObject*)entB.data())->property(prop) < ((QObject*)entA.data())->property(prop);
@ -264,7 +265,14 @@ public:
QSharedPointer<T> entity = m_list.at(index.row());
QObject *rawEntity = (QObject*)entity.data();
rawEntity->setProperty(rawEntity->metaObject()->property(index.column() + 1).name(), value);
QVariant val = value;
if (rawEntity->property(rawEntity->metaObject()->property(index.column() + 1).name()).canConvert<QDecDouble>())
{
QDecDouble dec(val.toDouble());
val = QVariant::fromValue(dec);
}
rawEntity->setProperty(rawEntity->metaObject()->property(index.column() + 1).name(), val);
}
if (role == Qt::CheckStateRole)

@ -62,7 +62,11 @@ SOURCES += \
settings/seasonnamedialog.cpp \
reporting/report.cpp \
reporting/reportviewer.cpp \
reporting/reportdialog.cpp
reporting/reportdialog.cpp \
csvimporter.cpp \
importdialog.cpp \
importprogress.cpp \
reporting/variablefiller.cpp
HEADERS += core.h\
core_global.h \
@ -122,7 +126,13 @@ HEADERS += core.h\
settings/seasonnamedialog.h \
reporting/report.h \
reporting/reportviewer.h \
reporting/reportdialog.h
reporting/reportdialog.h \
iimporter.h \
csvimporter.h \
iimportprogress.h \
importdialog.h \
importprogress.h \
reporting/variablefiller.h
unix {
target.path = /usr/lib
@ -157,7 +167,9 @@ FORMS += \
settings/globalsettingsform.ui \
settings/seasonnamedialog.ui \
reporting/reportviewer.ui \
reporting/reportdialog.ui
reporting/reportdialog.ui \
importdialog.ui \
importprogress.ui
OTHER_FILES += \
users/metaData.json \

@ -0,0 +1,93 @@
#include "csvimporter.h"
#include <QFile>
#include <QVariant>
CsvImporter::CsvImporter(const QMetaObject *metaObject, QObject *parent)
:QObject(parent),
IImporter(metaObject)
{
m_parsed = false;
m_currentRec = 1;
m_error = false;
}
void CsvImporter::setImportFile(const QString &fileName)
{
m_fileName = fileName;
}
int CsvImporter::recordCount()
{
if (!m_parsed)
{
parseFile();
}
return m_lines.count() - 1;
}
QSharedPointer<QObject> CsvImporter::nextRecord()
{
if (!m_parsed)
{
parseFile();
}
QObject *entity = m_metaObject->newInstance();
if (entity == NULL || m_currentRec > recordCount())
{
++m_currentRec;
return QSharedPointer<QObject>();
}
QStringList props = m_header.split(m_separator);
QString line = m_lines[m_currentRec];
QStringList values = line.split(m_separator);
for (int i = 0; i < props.size(); i++) {
QString property = props[i];
QString value = values[i];
if (!entity->setProperty(property.toStdString().c_str(), QVariant(value)))
{
m_error = true;
emit noSuchProperty(property);
++m_currentRec;
return QSharedPointer<QObject>();
}
}
++m_currentRec;
return QSharedPointer<QObject>(entity);
}
bool CsvImporter::isError()
{
return m_error;
}
void CsvImporter::parseFile()
{
QFile file(m_fileName);
if (!file.open(QFile::ReadOnly | QFile::Text))
{
m_error = true;
emit parseError();
return;
}
QByteArray data = file.readAll();
QString strData(data);
m_lines = strData.split("\n");
m_header = m_lines[0];
m_parsed = true;
}
void CsvImporter::setSeparator(const QString &separator)
{
m_separator = separator;
}

@ -0,0 +1,40 @@
#ifndef CSVIMPORTER_H
#define CSVIMPORTER_H
#include "iimporter.h"
#include <QStringList>
#include <QObject>
class CORESHARED_EXPORT CsvImporter : public QObject, public IImporter
{
Q_OBJECT
public:
explicit CsvImporter(const QMetaObject *metaObject, QObject *parent = NULL);
// IImporter interface
public:
void setImportFile(const QString &fileName);
int recordCount();
QSharedPointer<QObject> nextRecord();
bool isError();
void setSeparator(const QString &separator);
signals:
void parseError();
void noSuchProperty(QString propName);
private:
void parseFile();
QString m_header;
QString m_separator;
QString m_fileName;
QStringList m_lines;
bool m_parsed;
bool m_error;
int m_currentRec;
};
#endif // CSVIMPORTER_H

@ -9,6 +9,7 @@ class CORESHARED_EXPORT Enums : public QObject
Q_OBJECT
Q_ENUMS(VatType)
Q_ENUMS(Rounding)
public:
enum VatType
@ -19,6 +20,14 @@ public:
SECOND_LOWER
};
enum Rounding
{
R_NONE,
R_UP,
R_DOWN,
R_MATH
};
Enums()
{
}

@ -63,8 +63,14 @@ bool ExprEvaluator::evaluate(QObject *object, const QString &exp)
QString oper;
QVariant cond;
parseExpr(exp, value, oper, cond, object);
if (cond.isValid())
{
return m_operations[oper](value, cond);
}
return true;
}
}
void ExprEvaluator::setCaseSensitive(bool caseSensitive)
@ -87,6 +93,10 @@ void ExprEvaluator::parseExpr(const QString &exp, QVariant &value, QString &oper
QStringList expCat = exp.trimmed().split(" ");
value = object->property(expCat[0].toStdString().c_str());
oper = expCat[1];
if (expCat.size() > 2)
{
condition = expCat[2].replace("%20", " ");
}
}

@ -5,6 +5,8 @@
#include <QMessageBox>
#include <QHeaderView>
#include <QLayout>
#include <QToolButton>
#include <QDesktopWidget>
#include "autoform.h"
#include "autotablemodel.h"
@ -12,6 +14,9 @@
#include "iplugin.h"
#include "igridform.h"
#include "iservice.h"
#include "importdialog.h"
#include "csvimporter.h"
#include "importprogress.h"
template<class T>
class GridForm : public IGridForm
@ -52,8 +57,7 @@ public:
connect(m_form, &IForm::recordAdded, [this](){
//service()->save(form()->entity());
m_tableModel->addRow(form()->entity());
emit dataChanged();
addRow(form()->entity());
});
connect(m_form, &IForm::recordUpdated, [this](){
//service()->update(form()->entity());
@ -81,6 +85,7 @@ public:
}
virtual void setTranslations(const QMap<QString, QString> &translations) {
Q_ASSERT(m_tableModel != NULL);
m_tableModel->setTranslations(translations);
}
@ -111,6 +116,7 @@ public slots:
connect(tableView()->horizontalHeader(), SIGNAL(sectionResized(int,int,int)), this, SLOT(widthChanged(int,int,int)));
hideColumns(hide);
enableButtons();
return !m_permissionDenied;
}
@ -162,10 +168,19 @@ private:
bool m_serviceConnected;
bool m_permissionDenied;
private slots:
// IGridForm interface
protected:
void handleNewRecord() override
virtual void handleNewRecord() override
{
PermissionEvaluator permEv;
if (!permEv.hasPermission(pluginId(), PERM_ADD))
{
QMessageBox::critical(this, tr("Permission denied"), tr("You don't have permission to add new record."));
return;
}
if (m_form == NULL)
{
Q_ASSERT(false);
@ -177,8 +192,15 @@ protected:
m_formHandler->showForm(m_form);
}
void handleEditRecord() override
virtual void handleEditRecord() override
{
PermissionEvaluator permEv;
if (!permEv.hasPermission(pluginId(), PERM_EDIT))
{
QMessageBox::critical(this, tr("Permission denied"), tr("You don't have permission to edit record."));
return;
}
if (m_form == NULL || m_tableModel == NULL || tableView()->currentIndex().row() < 0)
{
Q_ASSERT(false);
@ -192,6 +214,13 @@ protected:
void handleDeleteRecord() override
{
PermissionEvaluator permEv;
if (!permEv.hasPermission(pluginId(), PERM_DELETE))
{
QMessageBox::critical(this, tr("Permission denied"), tr("You don't have permission to delete record."));
return;
}
m_permissionDenied = false;
connectService();
if (m_form == NULL || m_tableModel == NULL || tableView()->currentIndex().row() < 0)
@ -214,6 +243,58 @@ protected:
}
}
}
virtual int currentRecordId()
{
if (tableView()->currentIndex().isValid())
{
return m_tableModel->itemFromIndex(tableView()->currentIndex())->id();
}
return 0;
}
void addRow(QSharedPointer<T> entity)
{
m_tableModel->addRow(entity);
emit dataChanged();
}
void showImportButton()
{
QHBoxLayout *tbLayout = qobject_cast<QHBoxLayout*>(this->toolbar()->layout());
if (tbLayout != NULL)
{
QToolButton *btnImport = new QToolButton(this->toolbar());
btnImport->setIcon(QIcon(":/icons/import.svg"));
btnImport->setAutoRaise(true);
btnImport->setIconSize(QSize(24, 24));
btnImport->setToolTip(tr("Import"));
tbLayout->insertWidget(tbLayout->count() - 1, btnImport);
connect(btnImport, &QToolButton::clicked, [this](){
ImportDialog *dlg = new ImportDialog(this);
dlg->setAttribute(Qt::WA_DeleteOnClose);
dlg->show();
connect(dlg, &QDialog::accepted, [this, dlg](){
T dataObj;
CsvImporter importer(dataObj.metaObject());
importer.setImportFile(dlg->fileName());
importer.setSeparator(dlg->separator());
ImportProgress *progress = new ImportProgress();
progress->move(QApplication::desktop()->screen()->rect().center() - progress->rect().center());
progress->setWindowModality(Qt::ApplicationModal);
progress->show();
service()->importData(&importer, progress);
});
});
}
}
};
#endif // GRIDFORM_H

@ -0,0 +1 @@
<?xml version="1.0" ?><svg clip-rule="evenodd" fill-rule="evenodd" image-rendering="optimizeQuality" shape-rendering="geometricPrecision" text-rendering="geometricPrecision" viewBox="0 0 500 500" xmlns="http://www.w3.org/2000/svg"><defs><linearGradient gradientUnits="userSpaceOnUse" id="a" x1="250" x2="250" y1="284.547" y2="122.267"><stop offset="0" stop-color="#008BFF"/><stop offset="1" stop-color="#0af"/></linearGradient></defs><g><circle cx="250" cy="250" fill="none" r="210" stroke="#434242" stroke-width="30"/><rect fill="#434242" height="29.998" rx="10" ry="10" width="260" x="120" y="350"/><path d="M270 90l60 60c5 5 10 10 10 20s-10 20-20 20h-40v125c0 8-7 15-15 15h-30c-8 0-15-7-15-15v-125h-40c-10 0-20-10-20-20s5-15 10-20l60-60c13-13 27-13 40 0z" fill="url(#a)" stroke="#434242" stroke-width="10"/></g></svg>

After

Width:  |  Height:  |  Size: 820 B

@ -22,10 +22,17 @@ IGridForm::IGridForm(QWidget *parent) :
m_columnDialog = new ColumnDialog(this);
connect(m_columnDialog, SIGNAL(accepted()), this, SLOT(columnsAccepted()));
m_varFiller = new VariableFiller();
}
IGridForm::~IGridForm()
{
if (m_varFiller != NULL)
{
delete m_varFiller;
}
delete ui;
}
@ -54,6 +61,21 @@ QTableView *IGridForm::tableView()
return ui->tableView;
}
QWidget *IGridForm::toolbar()
{
return ui->widget;
}
void IGridForm::setReportVarFiller(VariableFiller *filler)
{
if (m_varFiller != NULL)
{
delete m_varFiller;
}
m_varFiller = filler;
}
void IGridForm::hideColumns(const QList<int> &cols)
{
foreach (int col, cols) {
@ -66,6 +88,11 @@ QWidget *IGridForm::filterWidget()
return ui->filterWidget;
}
void IGridForm::enableButtons()
{
ui->btnNew->setEnabled(canAddRecord());
}
void IGridForm::on_btnNew_clicked()
{
@ -138,8 +165,8 @@ void IGridForm::on_tableView_clicked(const QModelIndex &)
{
if (ui->tableView->currentIndex().isValid())
{
ui->btnEdit->setEnabled(true);
ui->btnDelete->setEnabled(true);
ui->btnEdit->setEnabled(canEditRecord());
ui->btnDelete->setEnabled(canDeleteRecord());
}
}
@ -147,6 +174,12 @@ void IGridForm::on_btnPrint_clicked()
{
ReportDialog *dialog = new ReportDialog(this);
dialog->setAttribute(Qt::WA_DeleteOnClose);
if (m_varFiller != NULL)
{
m_varFiller->fillList(Context::instance().plugin(pluginId())->reports(), currentRecordId());
}
dialog->setReports(Context::instance().plugin(pluginId())->reports());
dialog->show();
}

@ -6,11 +6,13 @@
#include <QTableView>
#include <QMenu>
#include <QList>
#include <QWidget>
#include "columndialog.h"
#include "filterui.h"
#include "defaultformhandler.h"
#include "core_global.h"
#include "reporting/variablefiller.h"
namespace Ui {
class GridForm;
@ -27,7 +29,9 @@ public:
void setPluginId(const QString &pluginId);
QString pluginId();
QTableView *tableView();
QWidget *toolbar();
virtual void setTranslations(const QMap<QString, QString> &translations) = 0;
void setReportVarFiller(VariableFiller *filler);
signals:
void dataChanged();
@ -39,8 +43,13 @@ protected:
virtual void handleNewRecord() = 0;
virtual void handleEditRecord() = 0;
virtual void handleDeleteRecord() = 0;
virtual bool canAddRecord() { return true; }
virtual bool canEditRecord() { return true; }
virtual bool canDeleteRecord() { return true; }
virtual int currentRecordId() = 0;
void hideColumns(const QList<int> &cols);
QWidget *filterWidget();
void enableButtons();
private slots:
void on_btnNew_clicked();
@ -63,6 +72,7 @@ private:
Ui::GridForm *ui;
QMenu *m_contextMenu;
ColumnDialog *m_columnDialog;
VariableFiller *m_varFiller;
protected:
FilterUi *m_filterUi;

@ -0,0 +1,23 @@
#ifndef IIMPORTER_H
#define IIMPORTER_H
#include <QMetaObject>
#include <QObject>
#include <QSharedPointer>
#include "core_global.h"
class CORESHARED_EXPORT IImporter
{
public:
explicit IImporter(const QMetaObject *metaObject) { m_metaObject = metaObject; }
virtual void setImportFile(const QString &fileName) = 0;
virtual int recordCount() = 0;
virtual QSharedPointer<QObject> nextRecord() = 0;
virtual bool isError() = 0;
protected:
const QMetaObject *m_metaObject;
};
#endif // IIMPORTER_H

@ -0,0 +1,11 @@
#ifndef IIMPORTPROGRESS_H
#define IIMPORTPROGRESS_H
class IImportProgress
{
public:
virtual void updateProgress(int currentPos) = 0;
virtual bool terminate() = 0;
};
#endif // IIMPORTPROGRESS_H

@ -0,0 +1,36 @@
#include "importdialog.h"
#include "ui_importdialog.h"
#include "importprogress.h"
#include "csvimporter.h"
#include <QFileDialog>
#include <QApplication>
#include <QDesktopWidget>
ImportDialog::ImportDialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::ImportDialog)
{
ui->setupUi(this);
}
ImportDialog::~ImportDialog()
{
delete ui;
}
QString ImportDialog::fileName()
{
return ui->editFile->text();
}
QString ImportDialog::separator()
{
return ui->editSeparator->text();
}
void ImportDialog::on_btnFile_clicked()
{
QString file = QFileDialog::getOpenFileName(this, tr("Import file"), "", tr("All Files (*.*)"));
ui->editFile->setText(file);
}

@ -0,0 +1,30 @@
#ifndef IMPORTDIALOG_H
#define IMPORTDIALOG_H
#include <QDialog>
#include <QMetaObject>
#include "iservice.h"
namespace Ui {
class ImportDialog;
}
class ImportDialog : public QDialog
{
Q_OBJECT
public:
explicit ImportDialog(QWidget *parent = 0);
~ImportDialog();
QString fileName();
QString separator();
private slots:
void on_btnFile_clicked();
private:
Ui::ImportDialog *ui;
};
#endif // IMPORTDIALOG_H

@ -0,0 +1,109 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>ImportDialog</class>
<widget class="QDialog" name="ImportDialog">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>454</width>
<height>115</height>
</rect>
</property>
<property name="windowTitle">
<string>Import data</string>
</property>
<layout class="QFormLayout" name="formLayout">
<item row="0" column="0">
<widget class="QLabel" name="label">
<property name="text">
<string>File</string>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_2">
<property name="text">
<string>Separator</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QLineEdit" name="editSeparator"/>
</item>
<item row="2" column="0" colspan="2">
<widget class="QDialogButtonBox" name="buttonBox">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="standardButtons">
<set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QWidget" name="widget" native="true">
<layout class="QHBoxLayout" name="horizontalLayout">
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="QLineEdit" name="editFile"/>
</item>
<item>
<widget class="QToolButton" name="btnFile">
<property name="text">
<string>...</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
</layout>
</widget>
<resources/>
<connections>
<connection>
<sender>buttonBox</sender>
<signal>accepted()</signal>
<receiver>ImportDialog</receiver>
<slot>accept()</slot>
<hints>
<hint type="sourcelabel">
<x>248</x>
<y>254</y>
</hint>
<hint type="destinationlabel">
<x>157</x>
<y>274</y>
</hint>
</hints>
</connection>
<connection>
<sender>buttonBox</sender>
<signal>rejected()</signal>
<receiver>ImportDialog</receiver>
<slot>reject()</slot>
<hints>
<hint type="sourcelabel">
<x>316</x>
<y>260</y>
</hint>
<hint type="destinationlabel">
<x>286</x>
<y>274</y>
</hint>
</hints>
</connection>
</connections>
</ui>

@ -0,0 +1,34 @@
#include "importprogress.h"
#include "ui_importprogress.h"
ImportProgress::ImportProgress(QWidget *parent) :
QWidget(parent),
ui(new Ui::ImportProgress)
{
ui->setupUi(this);
ui->progressBar->setRange(0, 100);
ui->progressBar->setValue(0);
m_terminate = false;
}
ImportProgress::~ImportProgress()
{
delete ui;
}
void ImportProgress::on_btnCancel_clicked()
{
m_terminate = true;
this->close();
}
void ImportProgress::updateProgress(int currentPos)
{
ui->progressBar->setValue(currentPos);
}
bool ImportProgress::terminate()
{
return m_terminate;
}

@ -0,0 +1,32 @@
#ifndef IMPORTPROGRESS_H
#define IMPORTPROGRESS_H
#include <QWidget>
#include "iimportprogress.h"
namespace Ui {
class ImportProgress;
}
class ImportProgress : public QWidget, public IImportProgress
{
Q_OBJECT
public:
explicit ImportProgress(QWidget *parent = 0);
~ImportProgress();
private slots:
void on_btnCancel_clicked();
private:
Ui::ImportProgress *ui;
bool m_terminate;
// IImportProgress interface
public:
void updateProgress(int currentPos);
bool terminate();
};
#endif // IMPORTPROGRESS_H

@ -0,0 +1,35 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>ImportProgress</class>
<widget class="QWidget" name="ImportProgress">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>400</width>
<height>165</height>
</rect>
</property>
<property name="windowTitle">
<string>Import progress</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QProgressBar" name="progressBar">
<property name="value">
<number>24</number>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="btnCancel">
<property name="text">
<string>Cenacel</string>
</property>
</widget>
</item>
</layout>
</widget>
<resources/>
<connections/>
</ui>

@ -8,6 +8,7 @@
#include <QStringList>
#include <QIcon>
#include <QTranslator>
#include <QMessageBox>
#include "service.h"
#include "igridform.h"
@ -51,6 +52,13 @@ public:
virtual void init(const QJsonObject &metaData) = 0;
virtual QWidget *ui() {
PermissionEvaluator permEv;
if (!permEv.hasPermission(pluginId(), PERM_READ))
{
QMessageBox::critical(m_ui, QObject::tr("Permission denied"), QObject::tr("You don't have permission to open this plugin."));
return NULL;
}
IGridForm *form = qobject_cast<IGridForm*>(m_ui);
bool filled = true;
@ -75,6 +83,7 @@ public:
return (Service<T>*)m_service;
}
virtual bool showIcon() { return true; }
virtual QTranslator* translator() { return NULL; }
virtual QIcon pluginIcon() { return QIcon(); }
QMap<QString, QString> translations() { return m_translations; }

@ -51,3 +51,12 @@ QList<QSharedPointer<NumberSeries> > NumberSeriesService::allForSeason(QSharedPo
{
return all(QString("season = %1").arg(QString::number(season->id())));
}
QString NumberSeriesService::nextStrForPlugin(QString pluginId)
{
NumberSeriesPtr numSer = nextForPlugin(pluginId);
QString numSerStr;
numSerStr.sprintf("%s%05d", numSer->prefix().toStdString().c_str(), numSer->lastNumber());
return numSerStr;
}

@ -15,6 +15,7 @@ public:
QSharedPointer<NumberSeries> forPlugin(QString pluginId);
QSharedPointer<NumberSeries> nextForPlugin(QString pluginId);
QList<QSharedPointer<NumberSeries> > allForSeason(QSharedPointer<Season> season);
QString nextStrForPlugin(QString pluginId);
};
#endif // NUMBERSERIESSERVICE_H

@ -24,5 +24,6 @@
<file>icons/zoomIn.svg</file>
<file>icons/zoomOut.svg</file>
<file>icons/report.svg</file>
<file>icons/import.svg</file>
</qresource>
</RCC>

@ -55,7 +55,7 @@ void Report::setVariables(const QMap<QString, QString> &variables)
m_variables = variables;
}
void Report::addVariable(const QString &varName, const QString &value)
void Report::setVariable(const QString &varName, const QString &value)
{
m_variables[varName] = value;
}

@ -27,7 +27,7 @@ public:
QMap<QString, QString> variables() const;
void setVariables(const QMap<QString, QString> &variables);
void addVariable(const QString &varName, const QString &value);
void setVariable(const QString &varName, const QString &value);
private:
QString m_name;

@ -32,6 +32,10 @@ void ReportViewer::setReport(ReportPtr report)
m_report->loadFromByteArray(&data);
m_report->setReportFileName(reportPath);
m_report->dataManager()->setReportVariable("dbPath", Context::instance().settings()->value("db/path", "").toString());
foreach (QString key, report->variables().keys()) {
m_report->dataManager()->setReportVariable(key, report->variables()[key]);
}
}
void ReportViewer::openPreview()

@ -0,0 +1,52 @@
#include "variablefiller.h"
#include "../settingsservice.h"
VariableFiller::VariableFiller()
{
}
VariableFiller::~VariableFiller()
{
}
void VariableFiller::fill(ReportPtr report, int recordId)
{
if (m_settings.isNull())
{
loadSettings();
}
QMap<QString, QString> vars;
vars[COMPANY] = m_settings->firmName();
vars[STREET] = m_settings->street();
vars[HOUSE_NUMBER] = m_settings->houseNumber();
vars[CITY] = m_settings->city();
vars[ZIP_CODE] = m_settings->zipCode();
vars[IC] = QString::number(m_settings->ic());
vars[DIC] = m_settings->dic();
vars[LOGO_PATH] = m_settings->logoPath();
if (recordId > 0)
{
vars[RECORD_ID] = QString::number(recordId);
}
else
{
vars[RECORD_ID] = "";
}
report->setVariables(vars);
}
void VariableFiller::fillList(QList<ReportPtr> reports, int recordId)
{
foreach (ReportPtr report, reports) {
fill(report, recordId);
}
}
void VariableFiller::loadSettings()
{
SettingsService srv("CORE");
m_settings = srv.loadSettings<GlobalSettings>();
}

@ -0,0 +1,32 @@
#ifndef VARIABLEFILLER_H
#define VARIABLEFILLER_H
#include "report.h"
#include "../settings/globalsettings.h"
#include "../core_global.h"
#define COMPANY "COMPANY"
#define STREET "STREET"
#define HOUSE_NUMBER "HOUSE_NUMBER"
#define CITY "CITY"
#define ZIP_CODE "ZIP_CODE"
#define IC "IC"
#define DIC "DIC"
#define LOGO_PATH "LOGO_PATH"
#define RECORD_ID "RECORD_ID"
class CORESHARED_EXPORT VariableFiller
{
public:
VariableFiller();
virtual ~VariableFiller();
virtual void fill(ReportPtr report, int recordId = 0);
void fillList(QList<ReportPtr> reports, int recordId = 0);
void loadSettings();
private:
GlobalSettingsPtr m_settings;
};
#endif // VARIABLEFILLER_H

@ -4,6 +4,8 @@
#include <QList>
#include <QSharedPointer>
#include <QString>
#include <QEventLoop>
#include <QApplication>
#include <odb/core.hxx>
#include <odb/transaction.hxx>
@ -14,6 +16,8 @@
#include "context.h"
#include "iservice.h"
#include "permissionevaluator.h"
#include "iimporter.h"
#include "iimportprogress.h"
#include "transaction.h"
@ -178,6 +182,45 @@ public:
}
}
bool importData(IImporter *importer, IImportProgress *progress = NULL) {
int count = importer->recordCount();
if (importer->isError()) {
return false;
}
for (int i = 0; i < count - 1; i++) {
QSharedPointer<QObject> qentity = importer->nextRecord();
if (importer->isError() || qentity.isNull()) {
return false;
}
QSharedPointer<T> entity = qentity.dynamicCast<T>();
if (!entity.isNull()) {
this->save(entity);
}
else
{
return false;
}
qApp->processEvents();
if (progress != NULL && progress->terminate())
{
return true;
}
if (progress != NULL)
{
progress->updateProgress(i * 100 / count);
}
}
return true;
}
protected:
bool checkPermission(const QString &permission) {
if (!m_pluginId.isEmpty()) {

@ -2,6 +2,7 @@
#include "ui_globalsettingsform.h"
#include <QMessageBox>
#include <QFileDialog>
#include "seasonnamedialog.h"
#include "globalsettings.h"
@ -107,6 +108,11 @@ void GlobalSettingsForm::loadEntity()
setEntity(settings);
ui->grpVat->setEnabled(settings->vatPayer());
if (!settings->logoPath().isEmpty())
{
ui->lblLogo->setPixmap(QPixmap(settings->logoPath()));
}
loadSeasons();
loadNumSeries();
}
@ -155,3 +161,13 @@ void GlobalSettingsForm::on_btnNew_clicked()
});
}
}
void GlobalSettingsForm::on_pushButton_clicked()
{
QString logoPath = QFileDialog::getOpenFileName(this, tr("Select logo"), "", tr("Images (*.png *.xpm *.jpg)"));
if (!logoPath.isEmpty())
{
entity()->setLogoPath(logoPath);
ui->lblLogo->setPixmap(QPixmap(logoPath));
}
}

@ -39,6 +39,7 @@ private slots:
void on_season_currentIndexChanged(int index);
void on_btnEditName_clicked();
void on_btnNew_clicked();
void on_pushButton_clicked();
};
#endif // GLOBALSETTINGSFORM_H

@ -99,9 +99,24 @@
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QLabel" name="label_8">
<widget class="QLabel" name="lblLogo">
<property name="minimumSize">
<size>
<width>180</width>
<height>160</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>180</width>
<height>160</height>
</size>
</property>
<property name="text">
<string>Logo</string>
<string/>
</property>
<property name="scaledContents">
<bool>true</bool>
</property>
</widget>
</item>

@ -6,6 +6,8 @@
#include "iplugin.h"
#include "iform.h"
#include <QMessageBox>
SettingsForm::SettingsForm(QWidget *parent) :
QDialog(parent),
ui(new Ui::SettingsForm)
@ -39,6 +41,12 @@ void SettingsForm::on_buttonBox_accepted()
void SettingsForm::accept()
{
if (!Context::instance().currentUser()->isAdmin())
{
QMessageBox::critical(this, tr("Permission denied"), tr("You don't have permission to save settings."));
return;
}
for (int i = 0; i < ui->tabWidget->count(); i++)
{
IForm *tab = qobject_cast<IForm*>(ui->tabWidget->widget(i));

@ -9,8 +9,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>800</width>
<height>600</height>
<width>1000</width>
<height>700</height>
</rect>
</property>
<property name="windowTitle">

@ -8,6 +8,7 @@
#include <QMetaProperty>
#include <QDecDouble.hh>
#include <QDebug>
#include "data/system.h"
#include "service.h"
@ -50,9 +51,20 @@ public:
{
QDecDouble dec(TO_DEC(varVal.toInt()));
varVal = QVariant::fromValue(dec);
objSettings->setProperty(propName, varVal);
continue;
}
// all other numbers are int
if (varVal.toInt() > 0)
{
objSettings->setProperty(propName, varVal.toInt());
}
else
{
objSettings->setProperty(propName, varVal);
}
}
return settingsObj;
}

Binary file not shown.

@ -4,14 +4,12 @@
<context>
<name>AutoForm</name>
<message>
<location filename="../autoform.h" line="41"/>
<source>Database error</source>
<translation>Chyba databáze</translation>
<translation type="vanished">Chyba databáze</translation>
</message>
<message>
<location filename="../autoform.h" line="46"/>
<source>Permission denied</source>
<translation>Nedostatečná oprávnění</translation>
<translation type="vanished">Nedostatečná oprávnění</translation>
</message>
</context>
<context>
@ -131,63 +129,63 @@
<translation>Hlavní nastavení</translation>
</message>
<message>
<location filename="../settings/globalsettingsform.ui" line="121"/>
<location filename="../settings/globalsettingsform.ui" line="136"/>
<source>Company info</source>
<translation>Informace o společnosti</translation>
</message>
<message>
<location filename="../settings/globalsettingsform.ui" line="130"/>
<location filename="../settings/globalsettingsform.ui" line="145"/>
<source>IC</source>
<translation>IČO</translation>
</message>
<message>
<location filename="../settings/globalsettingsform.ui" line="140"/>
<location filename="../settings/globalsettingsform.ui" line="155"/>
<source>VAT number</source>
<translation>DIČ</translation>
</message>
<message>
<location filename="../settings/globalsettingsform.ui" line="150"/>
<location filename="../settings/globalsettingsform.ui" line="165"/>
<source>VAT payer</source>
<translation>Plátce DPH</translation>
</message>
<message>
<location filename="../settings/globalsettingsform.ui" line="163"/>
<location filename="../settings/globalsettingsform.ui" line="178"/>
<source>VAT rates</source>
<translation>Sazby DPH</translation>
</message>
<message>
<location filename="../settings/globalsettingsform.ui" line="169"/>
<location filename="../settings/globalsettingsform.ui" line="184"/>
<source>High</source>
<translation>Vysoká</translation>
</message>
<message>
<location filename="../settings/globalsettingsform.ui" line="183"/>
<location filename="../settings/globalsettingsform.ui" line="198"/>
<source>First lower</source>
<translation>První snížená</translation>
</message>
<message>
<location filename="../settings/globalsettingsform.ui" line="197"/>
<location filename="../settings/globalsettingsform.ui" line="212"/>
<source>Second lower</source>
<translation>Druhá snížená</translation>
</message>
<message>
<location filename="../settings/globalsettingsform.ui" line="218"/>
<location filename="../settings/globalsettingsform.ui" line="279"/>
<location filename="../settings/globalsettingsform.ui" line="233"/>
<location filename="../settings/globalsettingsform.ui" line="294"/>
<source>Number series</source>
<translation>Číselné řady</translation>
</message>
<message>
<location filename="../settings/globalsettingsform.ui" line="247"/>
<location filename="../settings/globalsettingsform.ui" line="262"/>
<source>Edit name</source>
<translation>Upravit název</translation>
</message>
<message>
<location filename="../settings/globalsettingsform.ui" line="258"/>
<location filename="../settings/globalsettingsform.ui" line="273"/>
<source>Season</source>
<translation>Sezóna</translation>
</message>
<message>
<location filename="../settings/globalsettingsform.ui" line="265"/>
<location filename="../settings/globalsettingsform.ui" line="280"/>
<source>Create new</source>
<translation>Vytvořit novou</translation>
</message>
@ -223,35 +221,44 @@
</message>
<message>
<location filename="../settings/globalsettingsform.ui" line="98"/>
<location filename="../settings/globalsettingsform.ui" line="104"/>
<source>Logo</source>
<translation>Logo</translation>
</message>
<message>
<location filename="../settings/globalsettingsform.ui" line="111"/>
<location filename="../settings/globalsettingsform.ui" line="126"/>
<source>Select file</source>
<translation>Vyber soubor</translation>
</message>
<message>
<location filename="../settings/globalsettingsform.cpp" line="77"/>
<location filename="../settings/globalsettingsform.cpp" line="78"/>
<source>Switch season</source>
<translation>Změna sezóny</translation>
</message>
<message>
<location filename="../settings/globalsettingsform.cpp" line="77"/>
<location filename="../settings/globalsettingsform.cpp" line="78"/>
<source>Realy switch active season?</source>
<translation>Opravdu si přejete změnit aktivní sezónu?</translation>
</message>
<message>
<location filename="../settings/globalsettingsform.cpp" line="138"/>
<location filename="../settings/globalsettingsform.cpp" line="144"/>
<source>New season</source>
<translation>Nová sezóna</translation>
</message>
<message>
<location filename="../settings/globalsettingsform.cpp" line="138"/>
<location filename="../settings/globalsettingsform.cpp" line="144"/>
<source>Realy create new season and switch to it?</source>
<translation>Opravdu si přejete vytvořit novou sezónu a přepnout na ni?</translation>
</message>
<message>
<location filename="../settings/globalsettingsform.cpp" line="167"/>
<source>Select logo</source>
<translation>Vybrat logo</translation>
</message>
<message>
<location filename="../settings/globalsettingsform.cpp" line="167"/>
<source>Images (*.png *.xpm *.jpg)</source>
<translation>Obrázky (*.png *.xpm *.jpg)</translation>
</message>
</context>
<context>
<name>GridForm</name>
@ -282,7 +289,6 @@
</message>
<message>
<location filename="../gridform.ui" line="81"/>
<location filename="../gridform.h" line="204"/>
<source>Delete record</source>
<translation>Smazat záznam</translation>
</message>
@ -317,15 +323,177 @@
<translation>Vybrat sloupce</translation>
</message>
<message>
<location filename="../gridform.h" line="146"/>
<location filename="../gridform.h" line="149"/>
<source>Database error</source>
<translation>Chyba databáze</translation>
<translation type="vanished">Chyba databáze</translation>
</message>
<message>
<location filename="../gridform.h" line="204"/>
<source>Realy delete this record?</source>
<translation>Opravdu si přejete smazat tento záznam?</translation>
<translation type="vanished">Opravdu si přejete smazat tento záznam?</translation>
</message>
</context>
<context>
<name>ImportDialog</name>
<message>
<location filename="../importdialog.ui" line="14"/>
<source>Import data</source>
<translation>Import dat</translation>
</message>
<message>
<location filename="../importdialog.ui" line="20"/>
<source>File</source>
<translation>Soubor</translation>
</message>
<message>
<location filename="../importdialog.ui" line="27"/>
<source>Separator</source>
<translation>Oddělovač</translation>
</message>
<message>
<location filename="../importdialog.ui" line="65"/>
<source>...</source>
<translation>...</translation>
</message>
<message>
<location filename="../importdialog.cpp" line="34"/>
<source>Import file</source>
<translation>Importovat soubor</translation>
</message>
<message>
<location filename="../importdialog.cpp" line="34"/>
<source>All Files (*.*)</source>
<translation>Všechny soubory (*.*)</translation>
</message>
</context>
<context>
<name>ImportProgress</name>
<message>
<location filename="../importprogress.ui" line="14"/>
<source>Import progress</source>
<translation>Průběh importu</translation>
</message>
<message>
<location filename="../importprogress.ui" line="27"/>
<source>Cenacel</source>
<translation>Zrušit</translation>
</message>
</context>
<context>
<name>QObject</name>
<message>
<location filename="../iplugin.h" line="58"/>
<source>Permission denied</source>
<translation>Nedostatečná oprávnění</translation>
</message>
<message>
<location filename="../iplugin.h" line="58"/>
<source>You don&apos;t have permission to open this plugin.</source>
<translation>Nemáte oprávnění otevřít tento modul</translation>
</message>
</context>
<context>
<name>ReportDialog</name>
<message>
<location filename="../reporting/reportdialog.ui" line="14"/>
<source>Reports</source>
<translation>Sestavy</translation>
</message>
<message>
<location filename="../reporting/reportdialog.ui" line="82"/>
<source>Print reports</source>
<translation>Tisk sestavy</translation>
</message>
<message>
<location filename="../reporting/reportdialog.ui" line="152"/>
<source>Preview</source>
<translation>Zobrazit</translation>
</message>
<message>
<location filename="../reporting/reportdialog.ui" line="166"/>
<source>Print</source>
<translation>Tisk</translation>
</message>
<message>
<location filename="../reporting/reportdialog.ui" line="177"/>
<source>Close</source>
<translation>Zavřít</translation>
</message>
</context>
<context>
<name>ReportViewer</name>
<message>
<location filename="../reporting/reportviewer.ui" line="14"/>
<source>Report</source>
<translation>Sestava</translation>
</message>
<message>
<location filename="../reporting/reportviewer.ui" line="23"/>
<location filename="../reporting/reportviewer.ui" line="26"/>
<source>Close</source>
<translation>Zavřít</translation>
</message>
<message>
<location filename="../reporting/reportviewer.ui" line="46"/>
<location filename="../reporting/reportviewer.ui" line="49"/>
<source>Print</source>
<translation>Tisk</translation>
</message>
<message>
<location filename="../reporting/reportviewer.ui" line="69"/>
<location filename="../reporting/reportviewer.ui" line="72"/>
<source>Export to PDF</source>
<translation>Export do PDF</translation>
</message>
<message>
<location filename="../reporting/reportviewer.ui" line="92"/>
<location filename="../reporting/reportviewer.ui" line="95"/>
<source>Edit</source>
<translation>Upravit</translation>
</message>
<message>
<location filename="../reporting/reportviewer.ui" line="115"/>
<location filename="../reporting/reportviewer.ui" line="118"/>
<source>Page up</source>
<translation>Další strana</translation>
</message>
<message>
<location filename="../reporting/reportviewer.ui" line="138"/>
<source> of </source>
<translation> z </translation>
</message>
<message>
<location filename="../reporting/reportviewer.ui" line="141"/>
<source>Page: </source>
<translation>Strana: </translation>
</message>
<message>
<location filename="../reporting/reportviewer.ui" line="148"/>
<location filename="../reporting/reportviewer.ui" line="151"/>
<source>Page down</source>
<translation>Předchozí strana</translation>
</message>
<message>
<location filename="../reporting/reportviewer.ui" line="171"/>
<location filename="../reporting/reportviewer.ui" line="174"/>
<source>Zoom out</source>
<translation>Oddálit</translation>
</message>
<message>
<location filename="../reporting/reportviewer.ui" line="194"/>
<location filename="../reporting/reportviewer.ui" line="197"/>
<source>Zoom in</source>
<translation>Přiblížit</translation>
</message>
<message>
<location filename="../reporting/reportviewer.ui" line="217"/>
<location filename="../reporting/reportviewer.ui" line="220"/>
<source>Fit horizontal</source>
<translation>Vyplnit na šířku</translation>
</message>
<message>
<location filename="../reporting/reportviewer.ui" line="240"/>
<location filename="../reporting/reportviewer.ui" line="243"/>
<source>Fit vertical</source>
<translation>Vyplnit na výšku</translation>
</message>
</context>
<context>
@ -380,6 +548,64 @@
<source>Settings</source>
<translation>Nastavení</translation>
</message>
<message>
<location filename="../settingsform.cpp" line="46"/>
<source>Permission denied</source>
<translation>Nedostatečná oprávnění</translation>
</message>
<message>
<location filename="../settingsform.cpp" line="46"/>
<source>You don&apos;t have permission to save settings.</source>
<translation>Nemáte oprávnění uložit nastavení</translation>
</message>
</context>
<context>
<name>T</name>
<message>
<location filename="../autoform.h" line="41"/>
<location filename="../gridform.h" line="152"/>
<location filename="../gridform.h" line="155"/>
<source>Database error</source>
<translation>Chyba databáze</translation>
</message>
<message>
<location filename="../autoform.h" line="46"/>
<location filename="../gridform.h" line="180"/>
<location filename="../gridform.h" line="200"/>
<location filename="../gridform.h" line="220"/>
<source>Permission denied</source>
<translation>Nedostatečná oprávnění</translation>
</message>
<message>
<location filename="../gridform.h" line="180"/>
<source>You don&apos;t have permission to add new record.</source>
<translation>Nemáte oprávnění přidat nový záznam.</translation>
</message>
<message>
<location filename="../gridform.h" line="200"/>
<source>You don&apos;t have permission to edit record.</source>
<translation>Nemáte oprávnění upravit záznam.</translation>
</message>
<message>
<location filename="../gridform.h" line="220"/>
<source>You don&apos;t have permission to delete record.</source>
<translation>Nemáte oprávnění smazat záznam.</translation>
</message>
<message>
<location filename="../gridform.h" line="233"/>
<source>Delete record</source>
<translation>Smazat záznam</translation>
</message>
<message>
<location filename="../gridform.h" line="233"/>
<source>Realy delete this record?</source>
<translation>Opravdu si přejete smazat tento záznam?</translation>
</message>
<message>
<location filename="../gridform.h" line="273"/>
<source>Import</source>
<translation>Import</translation>
</message>
</context>
<context>
<name>UserForm</name>

@ -77,12 +77,12 @@ bool UserForm::bindOtherToData()
}
void UserForm::on_password_textChanged(const QString &arg1)
void UserForm::on_password_textChanged(const QString &)
{
m_passChanged = true;
}
void UserForm::on_retypePassword_textChanged(const QString &arg1)
void UserForm::on_retypePassword_textChanged(const QString &)
{
m_passChanged = true;
}

@ -0,0 +1,18 @@
#include "countryregister.h"
#include "countryregistergrid.h"
CountryRegister::CountryRegister()
{
}
void CountryRegister::initServiceUi()
{
m_service = new Service<CountryData>();
m_ui = new CountryRegisterGrid();
}
bool CountryRegister::showIcon()
{
return false;
}

@ -0,0 +1,27 @@
#ifndef COUNTRYREGISTER_H
#define COUNTRYREGISTER_H
#include "countryregister_global.h"
#include <QObject>
#include <imetadataplugin.h>
class COUNTRYREGISTERSHARED_EXPORT CountryRegister : public QObject, IMetaDataPlugin
{
Q_OBJECT
Q_PLUGIN_METADATA(IID PluginInterface_iid FILE "countryregister.json")
Q_INTERFACES(IPlugin)
public:
CountryRegister();
// IMetaDataPlugin interface
protected:
void initServiceUi();
// IPlugin interface
public:
bool showIcon();
};
#endif // COUNTRYREGISTER_H

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save