Compare commits

..

132 Commits

Author SHA1 Message Date
Josef Rokos e3a5e44c33 Fixed permission evaluation. 1 year ago
Josef Rokos 12dd6ddba0 Fixed loading of saved vouchers. 1 year ago
Josef Rokos de2bab90de Translation update. 1 year ago
Josef Rokos 285fc8e80f Merge remote-tracking branch 'origin/master' 1 year ago
Josef Rokos 93eb98c10a If macro EET is not defined EET functions will be hidden. 1 year ago
Josef Rokos e958c86eb7 Bugfix - receipt printing on widows fixed. 1 year ago
Josef Rokos 8b132c6c51 Bugfix - voucher items manipulation fixed. 1 year ago
Josef Rokos 46b2098ffc VS 2019 build fixed. 1 year ago
Josef Rokos 7082648122 Fixed build against Qt 6.5. 2 years ago
Josef Rokos e02595ba0e Merge remote-tracking branch 'origin/master' 2 years ago
Josef Rokos 2597f79d2d closes #1: Favorite buttons has been extended with category buttons. 2 years ago
Josef Rokos 5b77337b3f closes #4: Favorite buttons has been extended with category buttons. 2 years ago
Josef Rokos 5b5f31f64d Fixed CMakeLists.txt in CORE plugin 2 years ago
Josef Rokos b17b8cb259 Changed CORE plugin DB schema 2 years ago
Josef Rokos 529f7f6e7d Repository of LimeReport submodule has been changed. 2 years ago
Josef Rokos ecf0815d9f Removed LimeReport submodule 2 years ago
Josef Rokos 53b6b66cc8 Forgotten file. 2 years ago
Josef Rokos d699ce79f7 Build system changed to Cmake, ORM changed to QxORM, Qt6 compatibility. 2 years ago
Josef Rokos 30e6180c82 closes #4: Allowed to multiselect items on voucher and delete them via context menu or Ctrl+Del shortcut. 4 years ago
Josef Rokos ab20fe9b34 Added setting for hide control for item count on shop form. 4 years ago
Josef Rokos ad9a66ab32 Added setting for default VAT type on Direct sell dialog. Fixed some compiler warnings. 4 years ago
Zdenek Jonak 43e95eeb6f New Reports 5 years ago
Josef Rokos 4f2380f3db Added checkbox for select all items from saved receipt. 5 years ago
Josef Rokos c8658ba77f Implemented vat rate settings for Camp module. 5 years ago
Josef Rokos 32a836d3cf Fixed people prices recalculation. 5 years ago
Josef Rokos bb5b136aea Optimized loading of vouchers for Paid Vouchers Dialog. 6 years ago
Josef Rokos 2f1250e61d Fixed double print of bill. 6 years ago
Josef Rokos ee5130f719 Added button for report dialog to shop. 7 years ago
Josef Rokos d5844ab73d Button OK on pay dialog is now bigger. 7 years ago
Josef Rokos 65df276e7b Addresses are now sorted in combos. 7 years ago
Josef Rokos da9b062dbb Camp and Shop now shows data for actual season only. 7 years ago
Josef Rokos b113d5fca1 Added setting for bill double printing. 7 years ago
Pepa Rokos dd39ebb5cb Merge branch 'master' of https://git.bukova.info/repos/git/prodejna 7 years ago
Pepa Rokos 1c22eb3c0a Fixed MSVC 2012 build. 7 years ago
Zdenek Jonak 6b4c20eccf Updated czech translations 7 years ago
Josef Rokos 0bca412d27 Adding reports without recompilation now possible. 7 years ago
Josef Rokos 653f8eac30 Added dashboard to Shop plugin. 7 years ago
Josef Rokos 22936f2a3f Added support for dashboard. 7 years ago
Josef Rokos 5794510bd2 Shop - disabled gesture scrolling on grids. Increased scrollbar widths. 7 years ago
Josef Rokos 34e1585327 Shop - improved commodity search with bar code scanner. 7 years ago
Josef Rokos 0ddf8bce92 Commodity - added setting for translate czech chars to numbers (bar code scanner fix). 7 years ago
Josef Rokos fe3602fcfc Added support for default sorting. Commodity are sorted by name by default. 7 years ago
Josef Rokos b69637165d Fixed barcode scanner issue on Windows with czech keyboard. 7 years ago
Josef Rokos b8ed333c3a Added support for Value Added Tax. 7 years ago
Josef Rokos 8e7137f3bb Fixed saving of QDecDouble numbers. 7 years ago
Josef Rokos 5ebea2f7c9 Allow running only one instance of application. 7 years ago
Josef Rokos 6f30949343 Improved visual style of favorite buttons. 7 years ago
Josef Rokos 836521e533 Added ability to store creator, updater, date of create and date of edit on entities- columns for this added to Voucher and CampData.
Removed permission check from Service::loadById- caused access violation when user had not have read permission.
7 years ago
Josef Rokos eff4190c99 Merge branch 'master' of https://git.bukova.info/repos/git/prodejna 7 years ago
Josef Rokos c7d7886d0e Camp wizard is now accepted on close report preview. 7 years ago
Josef Rokos 9efa6c52bb SVG icons replaced by PNG on report viewer and report dialog. 7 years ago
Josef Rokos b10f21ad3c Merge branch 'master' of https://git.bukova.info/repos/git/prodejna 8 years ago
Josef Rokos b56e58146a SVG icons replaced by PNG. Caused huge memory allocation on Windows. 8 years ago
Zdenek Jonak c782d89c72 Fixed report layout and fonts 8 years ago
Josef Rokos 562268afa7 Fixed logo scaling on accommodation document.
closes #303
8 years ago
Josef Rokos 1df897e5c8 Fixed price calculation in camp module. UI fixes.
closes #309
8 years ago
Josef Rokos b83e1ee56e Fixed generation of translation files. 8 years ago
Josef Rokos c17b3b6d92 Fixed CampGrid class definition. Fixed application translation. 8 years ago
Zdenek Jonak bce139d7cd Added new translation 8 years ago
Pepa Rokos e724a3b234 Merge branch 'master' of https://git.bukova.info/repos/git/prodejna 8 years ago
Zdenek Jonak 50ac5238da Added new settings for program owner (web,email, phone) 8 years ago
Zdenek Jonak 5848bb5609 fixed application crash when loading plugin 8 years ago
Zdenek Jonak 8406dc584f Updated translation 8 years ago
Pepa Rokos 761fcad3b7 Fixed MSVC2012 build 8 years ago
Zdenek Jonak a33992b9b9 Added English version of accommodation document. Added translations. Fixed bug on adding camp to voucher. 8 years ago
Josef Rokos cc6111d09f Added sales to people. Print button on Camp wizard is now functional. Added item grids below Camp main grid. 8 years ago
Josef Rokos e5b33fa973 Added possibility to add custom widget to GridForm. Small fix in ReportDialog. 8 years ago
Josef Rokos cf937aee96 Logo on accommodation document is now loaded from settings. 8 years ago
Josef Rokos 47e21a85d7 Merge branch 'master' of https://git.bukova.info/repos/git/prodejna 8 years ago
Josef Rokos 8b99eea25a Added edit and pay functionality to camp module. 8 years ago
Josef Rokos d163a92293 Added possibility for creating vouchers from other module. 8 years ago
Josef Rokos 35696fbfea Added methods for better permission checks in modules.
Added method for returning selected entity in grid.
Added polymorphic methods for delete record and fill grid.
8 years ago
Zdenek Jonak fe53d90d50 Added camp accommodation document 8 years ago
Pepa Rokos b916d626d1 Fixed MSVS 2012 build 8 years ago
Pepa Rokos 27ec7282eb Merge branch 'master' of https://git.bukova.info/repos/git/prodejna 8 years ago
Pepa Rokos f6bcb86aab Application adds path to plugins to environment variable PATH on startup. Plugin loading is working correct now. 8 years ago
Josef Rokos b397d9382d Merge branch 'master' of https://git.bukova.info/repos/git/prodejna 8 years ago
Josef Rokos 13d90445cc Camp wizard is now able to open from shop plugin 8 years ago
Josef Rokos 397ec82d06 Added seller interface for preparing shop items from other plugins. 8 years ago
Zdenek Jonak 33913c3b42 Updated Czech translation 8 years ago
Zdenek Jonak 44c916cb68 Changed order of country data and used short name of country. refs #300 8 years ago
Josef Rokos 1e785fd488 Added report variable filler. 8 years ago
Josef Rokos 37b2dd7246 Added logo to settings. Small bugfixes. 8 years ago
Josef Rokos c3598673c6 Improved camp wizard UI. 8 years ago
Josef Rokos 328352f91a Improved permission checks. 8 years ago
Josef Rokos b0f129f38d Implemented camp wizard and service methods for camp calculation. 8 years ago
Josef Rokos 9a087e1874 Added protected method GridForm::addRow. Increased settings form size. 8 years ago
Josef Rokos b941acf9a0 Improved work with number series. Added season to voucher record. 8 years ago
Josef Rokos 87290d4be4 Changed first name and last name order when displaying address in combos. 8 years ago
Josef Rokos d53fed72d8 Fixed bug on empty database. 8 years ago
Josef Rokos 6a042c46a1 Implemented first page of camp wizard. 8 years ago
Josef Rokos 9c30d416e0 Merge branch 'master' of https://git.bukova.info/repos/git/prodejna 8 years ago
Zdenek Jonak 09899d618c translation support for camp plugin 8 years ago
Josef Rokos 80c9d21576 Merge branch 'master' of https://git.bukova.info/repos/git/prodejna 8 years ago
Josef Rokos 0608e277e7 Added camp service class. 8 years ago
Zdenek Jonak 7cfeac3f81 added translation of camp plugin to resource file 8 years ago
Zdenek Jonak 22ec64e9f4 Merge branch 'master' of https://git.bukova.info/repos/git/prodejna 8 years ago
Zdenek Jonak 0fd0d53c0b czech translation update 8 years ago
Zdenek Jonak 1d393cf3fb Merge branch 'master' of https://git.bukova.info/repos/git/prodejna 8 years ago
Zdenek Jonak 3c588cd8cf eet is enabled by default 8 years ago
Josef Rokos 123aefdab5 Added wizard for camp records. 8 years ago
Josef Rokos cd4d58749a Fixed camp settings saving. Added about messagebox. Methods IGridForm::handleNewRecord and IGridForm::handleEditRecord are virtual now. 8 years ago
Josef Rokos d5ead1b187 Added country combo to addressbook. Addressbook plugin depends on Countryregister which must be loaded first. 8 years ago
Josef Rokos 4c00364698 Added settings for Camp module. Changed Camp data model. 8 years ago
Josef Rokos 87ec7098ff Fixed saving of enums to json settings. Added global enum for rounding. 8 years ago
Josef Rokos 78c80199b2 Fixed decimal point issue in QDecDouble constructor from double. 8 years ago
Josef Rokos 50ecd60c9a Inline editing of QDecDouble in AutoTableModel now possible. 8 years ago
Josef Rokos 0e803c23cb Import dialog and import progress moved to core library. 8 years ago
Zdenek Jonak 25c481f5f1 Country register plugin created 8 years ago
Zdenek Jonak a0f325708b Updated czech translations 8 years ago
Josef Rokos cb67b48138 Merge branch 'master' of https://git.bukova.info/repos/git/prodejna 8 years ago
Josef Rokos af9edeafae Added postregister plugin. 8 years ago
Josef Rokos dbbf4a0a67 Import progress is shown while import. 8 years ago
Josef Rokos 39ab4b74e2 Disable add/edit/delete buttons now possible. 8 years ago
Zdenek Jonak f85b1c75d3 After unsuccessfull search is now text cleared. Useful for barcode scanners. closes #299 8 years ago
Zdenek Jonak 8a651871d0 Changed sorting for payed bills to descending. closes #298 8 years ago
Zdenek Jonak 6e2ee642ce Merge branch 'master' of https://git.bukova.info/repos/git/prodejna 8 years ago
Zdenek Jonak fc2ed29d25 Changed layout to three columns. Closes #297 8 years ago
Josef Rokos 8814a0e2a1 Allowed to add custom buttons/widget to grid toolbar.
Add possibility to hide plugin from navigation bar.
8 years ago
Josef Rokos fe5eac9cd9 Added support for import data from file. 8 years ago
Josef Rokos ace78877a3 Added camp plugin. Plugin accommodation removed from project file. 8 years ago
Josef Rokos afb2218150 Improved shop UI 8 years ago
Josef Rokos da3aa2987c Fixed bug when count of favorites buttons changed. 8 years ago
Josef Rokos 03fd0adf12 Item is added to voucher if found and on enter key pressed in search edit (barcode reader optimization). 8 years ago
Josef Rokos 4b3a2e1dd7 Fixed crash on add item via favorite button after application start.
Favorite buttons has short name labels.
closes #296
refs #293
8 years ago
Zdenek Jonak aa91acbe17 Reports for commodities. 8 years ago
Zdenek Jonak de665f9659 EET mandatory fields added to bill. closes #291 8 years ago
Josef Rokos b0d67cf93a Added favorite buttons to shop form.
closes #276
8 years ago
Zdenek Jonak 7aa00f1b1e Fixed build on linux 8 years ago
Zdenek Jonak 31beac537b Merge branch 'master' of https://git.bukova.info/repos/git/prodejna 8 years ago
Zdenek Jonak ae95ae1bda Merge remote branch 'origin/master' 8 years ago
Zdenek Jonak 21bb6696d6 Fixed compile problem 8 years ago

2
.gitignore vendored

@ -0,0 +1,2 @@
cmake*
build

9
.gitmodules vendored

@ -0,0 +1,9 @@
[submodule "3rdparty/qdecimal"]
path = 3rdparty/qdecimal
url = https://github.com/semihc/qdecimal.git
[submodule "3rdparty/QxOrm"]
path = 3rdparty/QxOrm
url = https://github.com/PepaRokos/QxOrm.git
[submodule "3rdparty/LimeReport"]
path = 3rdparty/LimeReport
url = https://github.com/PepaRokos/LimeReport.git

@ -0,0 +1,3 @@
add_subdirectory(qdecimal)
add_subdirectory(QxOrm)
add_subdirectory(LimeReport)

@ -0,0 +1 @@
Subproject commit b1bfd131ad3a9a107c176b4661a47eee54dfd481

1
3rdparty/QxOrm vendored

@ -0,0 +1 @@
Subproject commit 975c3b5ad3e02e3a257f28ff81071da0a17a1e64

1
3rdparty/qdecimal vendored

@ -0,0 +1 @@
Subproject commit 31d650e0e61acdef1f5b2c23b6daf26ea409c22c

@ -0,0 +1,17 @@
cmake_minimum_required(VERSION 3.24)
project(prodejna-root)
add_subdirectory(3rdparty/qdecimal)
add_subdirectory(3rdparty/QxOrm)
add_subdirectory(3rdparty/LimeReport)
add_subdirectory(core)
add_subdirectory(application)
add_subdirectory(countryregister)
add_subdirectory(addressbook)
add_subdirectory(postregister)
add_subdirectory(services)
add_subdirectory(shop)
add_subdirectory(commodity)
add_subdirectory(camp)

@ -1,14 +0,0 @@
#include "accform.h"
#include "ui_accform.h"
AccForm::AccForm(QWidget *parent) :
QWidget(parent),
ui(new Ui::AccForm)
{
ui->setupUi(this);
}
AccForm::~AccForm()
{
delete ui;
}

@ -1,14 +0,0 @@
#include "accgrid.h"
#include "tablemodel.h"
AccGrid::AccGrid(QWidget *parent) :
GridForm<Person>(parent)
{
setTableModel(new TableModel());
}
AccGrid::~AccGrid()
{
}

@ -1,18 +0,0 @@
#ifndef ACCGRID_H
#define ACCGRID_H
#include <core.h>
#include "data/person.h"
#include "accommodation-odb.hxx"
class AccGrid : public GridForm<Person>
{
Q_OBJECT
public:
explicit AccGrid(QWidget *parent = NULL);
~AccGrid();
};
#endif // ACCGRID_H

@ -1,41 +0,0 @@
#include <context.h>
#include "accommodation.h"
#include <QDebug>
#include "data/person.h"
#include "accommodationservice.h"
#include "accgrid.h"
#include "acform.h"
Accommodation::Accommodation()
{
}
void Accommodation::initServiceUi()
{
AccGrid *grid = new AccGrid();
AcForm *form = new AcForm();
grid->setForm(form);
AccommodationService *service = new AccommodationService();
m_service = service;
m_ui = grid;
}
QIcon Accommodation::pluginIcon()
{
return QIcon(":/icons/accPlugin.svg");
}
/*
QWidget *Accommodation::ui()
{
QWidget *ui = IPlugin::ui();
AccGrid *form = qobject_cast<AccGrid*>(ui);
form->fillData();
return ui;
}
*/

@ -1,37 +0,0 @@
#ifndef ACCOMMODATION_H
#define ACCOMMODATION_H
#include "accommodation_global.h"
#include <core.h>
#include <QObject>
#include <QtPlugin>
class ACCOMMODATIONSHARED_EXPORT Accommodation : public QObject, IMetaDataPlugin
{
Q_OBJECT
Q_PLUGIN_METADATA(IID PluginInterface_iid FILE "accommodation.json")
Q_INTERFACES(IPlugin)
public:
Accommodation();
// QString pluginName() Q_DECL_OVERRIDE;
// void init(const QJsonObject &metaData) Q_DECL_OVERRIDE;
// QString pluginId() Q_DECL_OVERRIDE;
protected:
void initServiceUi() Q_DECL_OVERRIDE;
// IPlugin interface
public:
//QWidget *ui();
// IPlugin interface
public:
virtual QIcon pluginIcon();
};
#endif // ACCOMMODATION_H

@ -1,20 +0,0 @@
{
"id" : "ACCOMMODATION",
"name" : {
"default" : "Accommodation",
"CZ" : "Kemp"
},
"descriptoin" : {
"default" : "",
"CZ" : ""
},
"schemaVersion" : 1,
"sql" : [
"CREATE TABLE \"Person\" (
\"id\" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
\"firstName\" TEXT NULL,
\"lastName\" TEXT NULL);"
],
"dependencies" : []
}

@ -1,46 +0,0 @@
#-------------------------------------------------
#
# Project created by QtCreator 2015-10-28T15:27:14
#
#-------------------------------------------------
QT += widgets sql
TARGET = accommodation
TEMPLATE = lib
DEFINES += ACCOMMODATION_LIBRARY
SOURCES += accommodation.cpp \
data/person.cpp \
accommodationservice.cpp \
tablemodel.cpp \
acform.cpp \
accgrid.cpp \
data/address.cpp
HEADERS += accommodation.h\
accommodation_global.h \
data/person.h \
accommodationservice.h \
tablemodel.h \
acform.h \
accgrid.h \
data/address.h \
data/accommodation-data.h
include(../config_plugin.pri)
OTHER_FILES += \
accommodation.json
FORMS += \
acform.ui
ODB_FILES = accommodation/data/accommodation-data.h
H_DIR = $$PWD/data/*.h
include(../odb.pri)
RESOURCES += \
accrc.qrc

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

@ -1,28 +0,0 @@
#include "accommodationservice.h"
#include <odb/database.hxx>
#include <odb/transaction.hxx>
#include "accommodation-odb.hxx"
AccommodationService::AccommodationService()
:Service<Person>("ACCOMMODATION")
{
}
AccommodationService::~AccommodationService()
{
}
void AccommodationService::pokus(QSharedPointer<Person> entity)
{
odb::database *db = Context::instance().db();
//odb::transaction tr(db->begin());
Transaction tr;
this->all();
db->persist(entity);
tr.commit();
}

@ -1,19 +0,0 @@
#ifndef ACCOMMODATIONSERVICE_H
#define ACCOMMODATIONSERVICE_H
#include "data/person.h"
#include <core.h>
#include "accommodation_global.h"
#include "accommodation-odb.hxx"
class ACCOMMODATIONSHARED_EXPORT AccommodationService : public Service<Person>
{
public:
AccommodationService();
~AccommodationService();
void pokus(QSharedPointer<Person> entity);
};
#endif // ACCOMMODATIONSERVICE_H

@ -1,5 +0,0 @@
<RCC>
<qresource prefix="/">
<file>icons/accPlugin.svg</file>
</qresource>
</RCC>

@ -1,34 +0,0 @@
#include "acform.h"
#include "ui_acform.h"
#include <QList>
#include <settingsservice.h>
#include <settings/globalsettings.h>
#include "accommodation-odb.hxx"
AcForm::AcForm(QWidget *parent) :
AutoForm<Person>(parent),
ui(new Ui::AcForm)
{
ui->setupUi(this);
registerBinding(ui->firstName);
registerBinding(ui->lastName);
}
AcForm::~AcForm()
{
delete ui;
}
void AcForm::registerCombos()
{
QList<ComboData> cbData;
Service<Address> srv;
foreach (QSharedPointer<Address> adr, srv.all()) {
cbData.append(ComboData(adr));
}
registerBinding(ui->address, cbData);
}

@ -1,30 +0,0 @@
#ifndef ACFORM_H
#define ACFORM_H
#include <QWidget>
#include <autoform.h>
#include "data/person.h"
#include "accommodation-odb.hxx"
namespace Ui {
class AcForm;
}
class AcForm : public AutoForm<Person>
{
Q_OBJECT
public:
explicit AcForm(QWidget *parent = 0);
~AcForm();
private:
Ui::AcForm *ui;
// AutoForm interface
protected:
virtual void registerCombos();
};
#endif // ACFORM_H

@ -1,62 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>AcForm</class>
<widget class="QWidget" name="AcForm">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>833</width>
<height>536</height>
</rect>
</property>
<property name="windowTitle">
<string>Form</string>
</property>
<widget class="QLineEdit" name="firstName">
<property name="geometry">
<rect>
<x>90</x>
<y>60</y>
<width>191</width>
<height>20</height>
</rect>
</property>
</widget>
<widget class="QLineEdit" name="lastName">
<property name="geometry">
<rect>
<x>90</x>
<y>110</y>
<width>191</width>
<height>20</height>
</rect>
</property>
</widget>
<widget class="QPushButton" name="pushButton">
<property name="geometry">
<rect>
<x>610</x>
<y>410</y>
<width>81</width>
<height>22</height>
</rect>
</property>
<property name="text">
<string>PushButton</string>
</property>
</widget>
<widget class="QComboBox" name="address">
<property name="geometry">
<rect>
<x>110</x>
<y>170</y>
<width>191</width>
<height>22</height>
</rect>
</property>
</widget>
</widget>
<resources/>
<connections/>
</ui>

@ -1,8 +0,0 @@
#ifndef ACCOMMODATIONDATA_H
#define ACCOMMODATIONDATA_H
#include "address.h"
#include "person.h"
#endif // ACCOMMODATIONDATA_H

@ -1,58 +0,0 @@
#include "address.h"
Address::Address(QObject *parent) : ComboItem(parent)
{
}
Address::~Address()
{
}
QString Address::city() const
{
return m_city;
}
void Address::setCity(const QString &city)
{
m_city = city;
}
QString Address::street() const
{
return m_street;
}
void Address::setStreet(const QString &street)
{
m_street = street;
}
QString Address::houseNumber() const
{
return m_houseNumber;
}
void Address::setHouseNumber(const QString &houseNumber)
{
m_houseNumber = houseNumber;
}
int Address::id() const
{
return m_id;
}
void Address::setId(int id)
{
m_id = id;
}
bool Address::eq(ComboItem *other)
{
Address *addr = qobject_cast<Address*>(other);
return addr != NULL && m_id == addr->id();
}
QString Address::toString()
{
return m_street + ", " + m_houseNumber + ", " + m_city;
}

@ -1,55 +0,0 @@
#ifndef ADDRESS_H
#define ADDRESS_H
#include <QObject>
#include <QString>
#include <data/comboitem.h>
#include <odb/core.hxx>
#pragma db object
class Address : public ComboItem
{
Q_OBJECT
Q_PROPERTY(QString city READ city WRITE setCity)
Q_PROPERTY(QString street READ street WRITE setStreet)
Q_PROPERTY(QString houseNumber READ houseNumber WRITE setHouseNumber)
public:
explicit Address(QObject *parent = 0);
~Address();
QString city() const;
void setCity(const QString &city);
QString street() const;
void setStreet(const QString &street);
QString houseNumber() const;
void setHouseNumber(const QString &houseNumber);
int id() const;
void setId(int id);
private:
friend class odb::access;
#pragma db id auto
int m_id;
QString m_city;
QString m_street;
QString m_houseNumber;
signals:
public slots:
// ComboItem interface
public:
virtual bool eq(ComboItem *other);
virtual QString toString();
};
#endif // ADDRESS_H

@ -1,49 +0,0 @@
#include <data/comboitem.h>
#include "person.h"
Person::Person()
{
}
int Person::id() const
{
return m_id;
}
void Person::setId(int value)
{
m_id = value;
}
QString Person::getFirstName() const
{
return firstName;
}
void Person::setFirstName(const QString &value)
{
firstName = value;
}
QString Person::getLastName() const
{
return lastName;
}
void Person::setLastName(const QString &value)
{
lastName = value;
}
QSharedPointer<QObject> Person::address() const
{
return m_address;
}
void Person::setAddress(const QSharedPointer<QObject> &address)
{
if (qobject_cast<Address*>(address.data()) != NULL)
{
m_address = qSharedPointerDynamicCast<Address, QObject>(address);
}
}

@ -1,44 +0,0 @@
#ifndef PERSON_H
#define PERSON_H
#include <QObject>
#include <QString>
#include "address.h"
#include <odb/core.hxx>
#pragma db object
class Person : public QObject
{
Q_OBJECT
Q_PROPERTY(QString firstName READ getFirstName WRITE setFirstName)
Q_PROPERTY(QString lastName READ getLastName WRITE setLastName)
Q_PROPERTY(QSharedPointer<QObject> address READ address WRITE setAddress)
public:
Person();
int id() const;
void setId(int value);
QString getFirstName() const;
void setFirstName(const QString &value);
QString getLastName() const;
void setLastName(const QString &value);
QSharedPointer<QObject> address() const;
void setAddress(const QSharedPointer<QObject> &address);
private:
friend class odb::access;
#pragma db id auto
int m_id;
QString firstName;
QString lastName;
QSharedPointer<Address> m_address;
};
#endif // PERSON_H

@ -1,8 +0,0 @@
#include "tablemodel.h"
TableModel::TableModel(QObject *parent)
:AutoTableModel<Person>(parent)
{
}

@ -1,18 +0,0 @@
#ifndef TABLEMODEL_H
#define TABLEMODEL_H
#include <core.h>
#include <autotablemodel.h>
#include "data/person.h"
class TableModel : public AutoTableModel<Person>
{
Q_OBJECT
public:
explicit TableModel(QObject *parent = NULL);
};
#endif // TABLEMODEL_H

@ -0,0 +1,55 @@
cmake_minimum_required(VERSION 3.24)
project(addressbook)
include(../3rdparty/QxOrm/QxOrm.cmake)
set (CMAKE_LIBRARY_OUTPUT_DIRECTORY ../plugins)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_AUTOUIC ON)
find_package(Qt6 COMPONENTS
Core
Gui
Widgets
Qml
REQUIRED)
add_library(addressbook SHARED
addressbook.cpp
addressbook.h
addressbookrc.qrc
addressbook_global.h
addressbookform.cpp
addressbookform.h
addressbookform.ui
addressbookgrid.cpp
addressbookgrid.h
addressbookservice.cpp
addressbookservice.h
addressbooktablemodel.cpp
addressbooktablemodel.h
data/addressbookdata.cpp
data/addressbookdata.h)
target_compile_definitions(addressbook PRIVATE -DADDRESSBOOK_LIBRARY)
include_directories(../core)
include_directories(../countryregister)
target_link_libraries(addressbook
Qt::Core
Qt::Gui
Qt::Widgets
Qt::Qml
qdecimal
decnumber
QxOrm
core
countryregister
)
install(TARGETS addressbook
LIBRARY DESTINATION ../plugins)

@ -26,8 +26,8 @@ protected:
// IPlugin interface // IPlugin interface
public: public:
virtual QIcon pluginIcon(); QIcon pluginIcon() override;
QTranslator *translator(); QTranslator *translator() override;
}; };

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

@ -1,45 +0,0 @@
#-------------------------------------------------
#
# Project created by QtCreator 2016-02-09T21:27:28
#
#-------------------------------------------------
QT += widgets sql
QT -= gui
TARGET = addressbook
TEMPLATE = lib
DEFINES += ADDRESSBOOK_LIBRARY
SOURCES += addressbook.cpp \
data/addressbookdata.cpp \
addressbookform.cpp \
addressbookgrid.cpp \
addressbooktablemodel.cpp \
addressbookservice.cpp
HEADERS += addressbook.h\
addressbook_global.h \
data/addressbookdata.h \
addressbookform.h \
addressbookgrid.h \
addressbooktablemodel.h \
addressbookservice.h
include(../config_plugin.pri)
ODB_FILES = addressbook/data/addressbookdata.h
H_DIR = $$PWD/data/*.h
include(../odb.pri)
OTHER_FILES += \
addressbook.json
FORMS += \
addressbookform.ui
RESOURCES += \
addressbookrc.qrc
TRANSLATIONS = translations/addressbook_cs_CZ.ts

@ -2,6 +2,7 @@
#define ADDRESSBOOK_GLOBAL_H #define ADDRESSBOOK_GLOBAL_H
#include <QtCore/qglobal.h> #include <QtCore/qglobal.h>
#include <QxOrm.h>
#if defined(ADDRESSBOOK_LIBRARY) #if defined(ADDRESSBOOK_LIBRARY)
# define ADDRESSBOOKSHARED_EXPORT Q_DECL_EXPORT # define ADDRESSBOOKSHARED_EXPORT Q_DECL_EXPORT
@ -9,4 +10,12 @@
# define ADDRESSBOOKSHARED_EXPORT Q_DECL_IMPORT # define ADDRESSBOOKSHARED_EXPORT Q_DECL_IMPORT
#endif #endif
#ifdef ADDRESSBOOK_LIBRARY
#define QX_REGISTER_HPP_ADDR QX_REGISTER_HPP_EXPORT_DLL
#define QX_REGISTER_CPP_ADDR QX_REGISTER_CPP_EXPORT_DLL
#else // ADDRESSBOOK_LIBRARY
#define QX_REGISTER_HPP_ADDR QX_REGISTER_HPP_IMPORT_DLL
#define QX_REGISTER_CPP_ADDR QX_REGISTER_CPP_IMPORT_DLL
#endif
#endif // ADDRESSBOOK_GLOBAL_H #endif // ADDRESSBOOK_GLOBAL_H

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

@ -4,7 +4,6 @@
#include <QWidget> #include <QWidget>
#include <autoform.h> #include <autoform.h>
#include "data/addressbookdata.h" #include "data/addressbookdata.h"
#include "addressbook-odb.hxx"
namespace Ui { namespace Ui {
class AddressbookForm; class AddressbookForm;
@ -16,10 +15,14 @@ class AddressbookForm : public AutoForm<AddressbookData>
public: public:
explicit AddressbookForm(QWidget *parent = 0); explicit AddressbookForm(QWidget *parent = 0);
~AddressbookForm(); ~AddressbookForm() override;
private: private:
Ui::AddressbookForm *ui; Ui::AddressbookForm *ui;
// FormBinder interface
protected:
void registerCombos() override;
}; };

@ -6,14 +6,17 @@
<rect> <rect>
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>400</width> <width>624</width>
<height>300</height> <height>363</height>
</rect> </rect>
</property> </property>
<property name="windowTitle"> <property name="windowTitle">
<string>Form</string> <string>Form</string>
</property> </property>
<layout class="QFormLayout" name="formLayout"> <layout class="QFormLayout" name="formLayout">
<property name="fieldGrowthPolicy">
<enum>QFormLayout::ExpandingFieldsGrow</enum>
</property>
<item row="0" column="0"> <item row="0" column="0">
<widget class="QLabel" name="label"> <widget class="QLabel" name="label">
<property name="text"> <property name="text">
@ -115,8 +118,35 @@
</property> </property>
</widget> </widget>
</item> </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> </layout>
</widget> </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/> <resources/>
<connections/> <connections/>
</ui> </ui>

@ -3,7 +3,6 @@
#include <core.h> #include <core.h>
#include "data/addressbookdata.h" #include "data/addressbookdata.h"
#include "addressbook-odb.hxx"
class AddressbookGrid : public GridForm<AddressbookData> class AddressbookGrid : public GridForm<AddressbookData>
{ {

@ -1,6 +1,5 @@
#include <service.h> #include <service.h>
#include "addressbookservice.h" #include "addressbookservice.h"
#include "addressbook-odb.hxx"
AddressBookService::AddressBookService() AddressBookService::AddressBookService()
{ {
@ -10,9 +9,22 @@ AddressBookService::~AddressBookService()
{ {
} }
QList<QSharedPointer<AddressbookData> > AddressBookService::all(const QString &where) AddressbookDataPtr AddressBookService::copyAddress(AddressbookDataPtr address)
{ {
Service<AddressbookData> srv; AddressbookDataPtr newAddress(new AddressbookData());
return srv.all(where);
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 <QList>
#include <QSharedPointer> #include <QSharedPointer>
#include <service.h>
#include "data/addressbookdata.h" #include "data/addressbookdata.h"
#include "addressbook_global.h" #include "addressbook_global.h"
class ADDRESSBOOKSHARED_EXPORT AddressBookService class ADDRESSBOOKSHARED_EXPORT AddressBookService : public Service<AddressbookData>
{ {
public: public:
AddressBookService(); AddressBookService();
~AddressBookService(); ~AddressBookService();
QList<QSharedPointer<AddressbookData> > all(const QString &where = ""); AddressbookDataPtr copyAddress(AddressbookDataPtr address);
}; };
#endif // ADDRESSBOOKSERVICE_H #endif // ADDRESSBOOKSERVICE_H

@ -1,8 +1,30 @@
#include <data/countrydata.h>
#include "addressbookdata.h" #include "addressbookdata.h"
QX_REGISTER_CPP_ADDR(AddressbookData)
namespace qx {
template<> void register_class(QxClass<AddressbookData>& t) {
t.setName("AddressbookData");
t.id(&AddressbookData::m_id, "id");
t.data(&AddressbookData::m_title, "title");
t.data(&AddressbookData::m_firstName, "firstName");
t.data(&AddressbookData::m_lastName, "lastName");
t.data(&AddressbookData::m_birthDate, "birthDate");
t.data(&AddressbookData::m_idCardNumber, "idCardNumber");
t.data(&AddressbookData::m_ztp, "ztp");
t.data(&AddressbookData::m_addressCity, "addressCity");
t.data(&AddressbookData::m_addressHouseNumber, "addressHouseNumber");
t.data(&AddressbookData::m_addressZipCode, "addressZipCode");
t.relationManyToOne(&AddressbookData::m_country, "country");
}
}
AddressbookData::AddressbookData(QObject * parent) AddressbookData::AddressbookData(QObject * parent)
:ComboItem(parent) :ComboItem(parent)
{ {
m_ztp = false;
} }
QString AddressbookData::title() const QString AddressbookData::title() const
@ -95,25 +117,42 @@ void AddressbookData::setAddressZipCode(const QString &addressZipCode)
{ {
m_addressZipCode = addressZipCode; m_addressZipCode = addressZipCode;
} }
int AddressbookData::id() const long AddressbookData::id() const
{ {
return m_id; return m_id;
} }
void AddressbookData::setId(int id) void AddressbookData::setId(long id)
{ {
m_id = 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) bool AddressbookData::eq(ComboItem *other)
{ {
AddressbookData *adb = qobject_cast<AddressbookData*>(other); AddressbookData *adb = qobject_cast<AddressbookData*>(other);
return adb != NULL && adb->id() == this->id(); return adb != nullptr && adb->id() == this->id();
} }
QString AddressbookData::toString() 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;
}
QStringList AddressbookData::eagerLoad() {
return { "country" };
} }

@ -1,24 +1,22 @@
#ifndef ADDRESSBOOKDATA_H #ifndef ADDRESSBOOKDATA_H
#define ADDRESSBOOKDATA_H #define ADDRESSBOOKDATA_H
#include "../addressbook_global.h"
#include <data/comboitem.h>
#include <data/countrydata.h>
#include <QObject> #include <QObject>
#include <QString> #include <QString>
#include <QDate> #include <QDate>
#include <odb/core.hxx>
#include <QtCore/qglobal.h> #include <QtCore/qglobal.h>
#include <QSharedPointer>
#include <data/comboitem.h> #include <QxOrm.h>
#if defined(ADDRESSBOOK_LIBRARY)
# define ADDRESSBOOKSHARED_EXPORT Q_DECL_EXPORT
#else
# define ADDRESSBOOKSHARED_EXPORT Q_DECL_IMPORT
#endif
#pragma db object
class ADDRESSBOOKSHARED_EXPORT AddressbookData : public ComboItem class ADDRESSBOOKSHARED_EXPORT AddressbookData : public ComboItem
{ {
Q_OBJECT Q_OBJECT
QX_REGISTER_FRIEND_CLASS(AddressbookData)
Q_PROPERTY(QString title READ title WRITE setTitle) Q_PROPERTY(QString title READ title WRITE setTitle)
Q_PROPERTY(QString firstName READ firstName WRITE setFirstName) Q_PROPERTY(QString firstName READ firstName WRITE setFirstName)
Q_PROPERTY(QString lastName READ lastName WRITE setLastName) Q_PROPERTY(QString lastName READ lastName WRITE setLastName)
@ -29,9 +27,11 @@ class ADDRESSBOOKSHARED_EXPORT AddressbookData : public ComboItem
Q_PROPERTY(QString addressStreet READ addressStreet WRITE setAddressStreet) Q_PROPERTY(QString addressStreet READ addressStreet WRITE setAddressStreet)
Q_PROPERTY(QString addressHouseNumber READ addressHouseNumber WRITE setAddressHouseNumber) Q_PROPERTY(QString addressHouseNumber READ addressHouseNumber WRITE setAddressHouseNumber)
Q_PROPERTY(QString addressZipCode READ addressZipCode WRITE setAddressZipCode) Q_PROPERTY(QString addressZipCode READ addressZipCode WRITE setAddressZipCode)
Q_PROPERTY(QSharedPointer<QObject> country READ country WRITE setCountry)
public: public:
AddressbookData(QObject *parent = 0); AddressbookData(QObject *parent = 0);
QString title() const; QString title() const;
void setTitle(const QString &title); void setTitle(const QString &title);
@ -62,13 +62,16 @@ public:
QString addressZipCode() const; QString addressZipCode() const;
void setAddressZipCode(const QString &addressZipCode); void setAddressZipCode(const QString &addressZipCode);
int id() const; long id() const;
void setId(int id); void setId(long id);
QSharedPointer<QObject> country() const;
void setCountry(const QSharedPointer<QObject> &country);
Q_INVOKABLE QStringList eagerLoad();
private: private:
friend class odb::access; long m_id{0};
#pragma db id auto
int m_id;
QString m_title; QString m_title;
QString m_firstName; QString m_firstName;
QString m_lastName; QString m_lastName;
@ -79,11 +82,16 @@ private:
QString m_addressStreet; QString m_addressStreet;
QString m_addressHouseNumber; QString m_addressHouseNumber;
QString m_addressZipCode; QString m_addressZipCode;
CountryDataPtr m_country;
// ComboItem interface // ComboItem interface
public: public:
virtual bool eq(ComboItem *other); bool eq(ComboItem *other) override;
virtual QString toString(); QString toString() override;
}; };
typedef QSharedPointer<AddressbookData> AddressbookDataPtr;
QX_REGISTER_HPP_ADDR(AddressbookData, ComboItem, 0)
#endif // ADDRESSBOOKDATA_H #endif // ADDRESSBOOKDATA_H

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

@ -0,0 +1,47 @@
cmake_minimum_required(VERSION 3.24)
project(prodejna)
include(../3rdparty/QxOrm/QxOrm.cmake)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_AUTOUIC ON)
find_package(Qt6 COMPONENTS
Core
Gui
Widgets
Sql
Qml
REQUIRED)
include_directories(../core)
add_executable(prodejna
main.cpp
appRc.qrc
application.cpp
application.h
logindialog.cpp
logindialog.h
logindialog.ui
mainwindow.cpp
mainwindow.h
mainwindow.ui
shop.rc
)
target_link_libraries(prodejna
Qt::Core
Qt::Gui
Qt::Widgets
Qt::Sql
Qt::Qml
core
)
if(CMAKE_BUILD_TYPE STREQUAL "Release")
set_property(TARGET prodejna PROPERTY WIN32_EXECUTABLE true)
endif()

@ -0,0 +1,31 @@
#include "application.h"
Application::Application(int &argc, char **argv)
:QApplication(argc, argv)
{
m_single = new QSharedMemory("ShredMemoryForOneInstanceOfProdejnaApp", this);
}
Application::~Application()
{
if (m_single->isAttached())
{
m_single->detach();
}
}
bool Application::lock()
{
if (m_single->attach(QSharedMemory::ReadOnly))
{
m_single->detach();
return false;
}
if (m_single->create(1))
{
return true;
}
return false;
}

@ -0,0 +1,21 @@
#ifndef APPLICATION_H
#define APPLICATION_H
#include <QApplication>
#include <QSharedMemory>
class Application : public QApplication
{
Q_OBJECT
public:
Application(int &argc, char **argv);
~Application();
bool lock();
private:
QSharedMemory *m_single;
};
#endif // APPLICATION_H

@ -1,68 +0,0 @@
#-------------------------------------------------
#
# Project created by QtCreator 2015-10-28T15:23:55
#
#-------------------------------------------------
QT += core gui sql
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
TARGET = prodejna
TEMPLATE = app
DEFINES += _GLIBCXX_USE_CXX11_ABI=1
CONFIG += c++11
include(../config_odb.pri)
win32 {
INCLUDEPATH += $$ODB_INCLUDE_PREFIX/libodb-2.4.0
INCLUDEPATH += $$ODB_INCLUDE_PREFIX/libodb-qt-2.4.0
INCLUDEPATH += $$ODB_INCLUDE_PREFIX/libodb-sqlite-2.4.0
INCLUDEPATH += $$ODB_INCLUDE_PREFIX/sqlite
RC_FILE = shop.rc
}
SOURCES += main.cpp\
mainwindow.cpp \
logindialog.cpp
HEADERS += mainwindow.h \
logindialog.h
FORMS += mainwindow.ui \
logindialog.ui
unix {
QMAKE_CXXFLAGS += -Wno-unknown-pragmas
}
win32 {
QMAKE_CXXFLAGS += -wd4995 -wd4068
}
win32:CONFIG(release, debug|release): LIBS += -L$$OUT_PWD/../core/release/ -lcore
else:win32:CONFIG(debug, debug|release): LIBS += -L$$OUT_PWD/../core/debug/ -lcore
else:unix: LIBS += -L$$OUT_PWD/../core/ -lcore
INCLUDEPATH += $$PWD/../core
DEPENDPATH += $$PWD/../core
win32:CONFIG(release, debug|release): LIBS += -L$$OUT_PWD/../qdecimal/lib/ -lqdecimal -ldecnumber
else:win32:CONFIG(debug, debug|release): LIBS += -L$$OUT_PWD/../qdecimal/lib/ -lqdecimal -ldecnumber
else:unix: LIBS += -L$$OUT_PWD/../qdecimal/lib/ -lqdecimal -ldecnumber
INCLUDEPATH += $$PWD/../qdecimal/src
INCLUDEPATH += $$PWD/../qdecimal/decnumber
RESOURCES += \
appRc.qrc
TRANSLATIONS = translations/prodejna_cz.ts
DISTFILES += \
shop.rc

@ -6,8 +6,8 @@
<rect> <rect>
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>408</width> <width>427</width>
<height>220</height> <height>260</height>
</rect> </rect>
</property> </property>
<property name="windowTitle"> <property name="windowTitle">
@ -64,6 +64,9 @@
<item> <item>
<widget class="QWidget" name="widget_2" native="true"> <widget class="QWidget" name="widget_2" native="true">
<layout class="QFormLayout" name="formLayout"> <layout class="QFormLayout" name="formLayout">
<property name="fieldGrowthPolicy">
<enum>QFormLayout::ExpandingFieldsGrow</enum>
</property>
<item row="0" column="0"> <item row="0" column="0">
<widget class="QLabel" name="label_2"> <widget class="QLabel" name="label_2">
<property name="text"> <property name="text">

@ -1,24 +1,53 @@
#include "mainwindow.h" #include "mainwindow.h"
#include <QApplication> #include <QApplication>
#include <QDesktopWidget> //#include <QDesktopWidget>
#include <QSharedPointer>
#include <QTranslator> #include <QTranslator>
#include <QLibraryInfo> #include <QLibraryInfo>
#include <QMessageBox>
#include "application.h"
#ifdef _WIN32
#include <Windows.h>
#endif
int main(int argc, char *argv[]) int main(int argc, char *argv[])
{ {
QApplication a(argc, argv); Application a(argc, argv);
if (!a.lock())
{
QMessageBox::warning(nullptr, "Prodejna is running", "Prodejna is allready running. Only one instance can be started.");
return -42;
}
#ifdef _WIN32
QString exePath = a.applicationDirPath();
exePath = exePath.append("\\plugins");
wchar_t Path[10000];
::GetEnvironmentVariable(L"PATH", Path, sizeof(Path) / sizeof(TCHAR));
QString pathVar = QString::fromWCharArray(Path);
QString newPath = exePath.append(";").append(pathVar);
::SetEnvironmentVariable(TEXT("PATH"), newPath.toStdWString().c_str());
#endif
QTranslator qtTranslator; QTranslator qtTranslator;
qtTranslator.load("qt_" + QLocale::system().name(), if (qtTranslator.load("qt_" + QLocale::system().name(),
QLibraryInfo::location(QLibraryInfo::TranslationsPath)); QLibraryInfo::path(QLibraryInfo::TranslationsPath))) {
qDebug() << "Cannot load translation";
}
a.installTranslator(&qtTranslator); a.installTranslator(&qtTranslator);
QTranslator myappTranslator; QTranslator myappTranslator;
myappTranslator.load(":/translations/prodejna_" + QLocale::system().name()); if (myappTranslator.load(":/translations/prodejna_" + QLocale::system().name())) {
qDebug() << "Cannot load translation";
}
a.installTranslator(&myappTranslator); a.installTranslator(&myappTranslator);
MainWindow w; MainWindow w;
w.move(QApplication::desktop()->screen()->rect().center() - w.rect().center());
w.showMaximized(); w.showMaximized();
return a.exec(); return a.exec();

@ -8,6 +8,7 @@
#include <QVBoxLayout> #include <QVBoxLayout>
#include <QFileDialog> #include <QFileDialog>
#include <QDebug> #include <QDebug>
#include <QMessageBox>
MainWindow::MainWindow(QWidget *parent) : MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent), QMainWindow(parent),
@ -19,6 +20,8 @@ MainWindow::MainWindow(QWidget *parent) :
m_loginDialog = new LoginDialog(this); m_loginDialog = new LoginDialog(this);
ui->tabWidget->setVisible(false);
QFile styleFile(":/style.css"); QFile styleFile(":/style.css");
if (styleFile.open(QIODevice::ReadOnly | QIODevice::Text)) if (styleFile.open(QIODevice::ReadOnly | QIODevice::Text))
@ -29,9 +32,10 @@ MainWindow::MainWindow(QWidget *parent) :
connect(m_loginDialog, &LoginDialog::accepted, [this]{ connect(m_loginDialog, &LoginDialog::accepted, [this]{
PermissionService service; PermissionService service;
QSharedPointer<User> u = service.loadUser(m_loginDialog->login()); QSharedPointer<User> u = service.loadUser(m_loginDialog->login());
m_lblUser->setText(u->name());
m_loginDialog->reset();
Context::instance().setCurrentUser(u); Context::instance().setCurrentUser(u);
openDashboard();
m_loginDialog->reset();
}); });
connect(m_loginDialog, &LoginDialog::rejected, [this]{ connect(m_loginDialog, &LoginDialog::rejected, [this]{
@ -42,7 +46,7 @@ MainWindow::MainWindow(QWidget *parent) :
int i = 0; int i = 0;
foreach (IPlugin *plugin, Context::instance().plugins()) { foreach (IPlugin *plugin, Context::instance().plugins()) {
if (plugin->pluginId() != "CORE") if (plugin->pluginId() != "CORE" && plugin->showIcon())
{ {
QToolButton *plugButton = new QToolButton(this); QToolButton *plugButton = new QToolButton(this);
plugButton->setText(plugin->pluginName()); plugButton->setText(plugin->pluginName());
@ -58,11 +62,7 @@ MainWindow::MainWindow(QWidget *parent) :
} }
((QVBoxLayout*)ui->navigation->layout())->addStretch(1); ((QVBoxLayout*)ui->navigation->layout())->addStretch(1);
ui->navigation->setEnabled(true);
if (Context::instance().db() != NULL)
{
ui->navigation->setEnabled(true);
}
} }
MainWindow::~MainWindow() MainWindow::~MainWindow()
@ -81,26 +81,13 @@ void MainWindow::openPlugin()
QVariant var = QObject::sender()->property(PLUGIN_INDEX); QVariant var = QObject::sender()->property(PLUGIN_INDEX);
IPlugin *plugin = Context::instance().plugins().at(var.toInt()); IPlugin *plugin = Context::instance().plugins().at(var.toInt());
for (int i = 0; i < ui->tabWidget->count(); i++) { openPlugin(plugin);
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_actionOpen_database_triggered() void MainWindow::on_actionOpen_database_triggered()
{ {
/*QFileDialog dialog(this); closeAllTabs();
dialog.setNameFilter(tr("Database Files (*.db)")); closeDashboard();
dialog.setWindowTitle(tr("Open Database"));*/
QString dbFile = QFileDialog::getOpenFileName(this, "Open Database", "", "Database Files (*.db)"); QString dbFile = QFileDialog::getOpenFileName(this, "Open Database", "", "Database Files (*.db)");
if (!dbFile.isEmpty()) if (!dbFile.isEmpty())
@ -114,10 +101,21 @@ void MainWindow::on_actionOpen_database_triggered()
void MainWindow::on_tabWidget_tabCloseRequested(int index) void MainWindow::on_tabWidget_tabCloseRequested(int index)
{ {
ui->tabWidget->removeTab(index); ui->tabWidget->removeTab(index);
if (ui->tabWidget->count() == 0)
{
ui->dashboard->setVisible(true);
ui->tabWidget->setVisible(false);
refreshDashboard();
}
} }
void MainWindow::on_actionLogin_triggered() void MainWindow::on_actionLogin_triggered()
{ {
closeAllTabs();
closeDashboard();
QSharedPointer<User> u; QSharedPointer<User> u;
Context::instance().setCurrentUser(u); Context::instance().setCurrentUser(u);
m_lblUser->setText(""); m_lblUser->setText("");
@ -127,7 +125,7 @@ void MainWindow::on_actionLogin_triggered()
void MainWindow::showEvent(QShowEvent *evt) void MainWindow::showEvent(QShowEvent *evt)
{ {
QWidget::showEvent(evt); QWidget::showEvent(evt);
if (Context::instance().db() != NULL && Context::instance().currentUser().data() == NULL) if (Context::instance().dbOpened() && Context::instance().currentUser().data() == nullptr)
{ {
m_loginDialog->show(); m_loginDialog->show();
} }
@ -144,3 +142,119 @@ void MainWindow::on_actionSettings_triggered()
SettingsForm *settings = new SettingsForm(this); SettingsForm *settings = new SettingsForm(this);
settings->show(); settings->show();
} }
void MainWindow::on_actionPost_register_triggered()
{
IPlugin *plugZipCodes = Context::instance().plugin("POSTREGISTER");
if (plugZipCodes != nullptr)
{
openPlugin(plugZipCodes);
}
}
void MainWindow::openPlugin(IPlugin *plugin)
{
ui->tabWidget->setVisible(true);
ui->dashboard->setVisible(false);
#ifdef Q_OS_MAC
ui->tabWidget->setStyleSheet("QTabBar::tab { width: 150px; }");
#endif
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() != nullptr)
{
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 != nullptr)
{
openPlugin(plugCountryReg);
}
}
void MainWindow::closeDashboard()
{
foreach (QFrame *dbFrame, m_dbWidgets) {
dbFrame->setVisible(false);
}
}
void MainWindow::openDashboard()
{
PermissionEvaluator permEv;
foreach (IPlugin *plugin, Context::instance().plugins()) {
if (!plugin->dasboardWidgets().isEmpty()
&& permEv.hasPermission(plugin->pluginId(), PERM_READ)) {
foreach (QFrame *frame, plugin->dasboardWidgets()) {
if (m_dbWidgets.contains(frame))
{
frame->setVisible(true);
}
else
{
ui->dbWidget->layout()->addWidget(frame);
m_dbWidgets.append(frame);
}
}
}
}
if (!Context::instance().currentUser().isNull())
{
m_lblUser->setText(Context::instance().currentUser()->name());
ui->labelUser->setText(Context::instance().currentUser()->name());
}
refreshDashboard();
}
void MainWindow::refreshDashboard()
{
foreach (QFrame *frame, m_dbWidgets) {
IDashboardWidget *dbWidget = dynamic_cast<IDashboardWidget*>(frame);
if (dbWidget != nullptr)
{
dbWidget->refresh();
}
}
}
void MainWindow::closeAllTabs()
{
ui->tabWidget->setVisible(false);
ui->dashboard->setVisible(true);
int tabCount = ui->tabWidget->count();
for (int i = 0; i < tabCount; i++)
{
ui->tabWidget->removeTab(0);
}
}
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 - 2023 Josef Rokos, Zdenek Jonák"));
}

@ -9,6 +9,8 @@
#define PLUGIN_INDEX "plug_index" #define PLUGIN_INDEX "plug_index"
class IPlugin;
namespace Ui { namespace Ui {
class MainWindow; class MainWindow;
} }
@ -33,14 +35,29 @@ private slots:
void on_actionSettings_triggered(); void on_actionSettings_triggered();
void on_actionPost_register_triggered();
void on_actionCountry_register_triggered();
void on_actionAbout_Qt_triggered();
void on_actionAbout_triggered();
private: private:
Ui::MainWindow *ui; Ui::MainWindow *ui;
LoginDialog *m_loginDialog; LoginDialog *m_loginDialog;
QLabel *m_lblUser; QLabel *m_lblUser;
QList<QFrame*> m_dbWidgets;
void openPlugin(IPlugin *plugin);
void closeDashboard();
void openDashboard();
void refreshDashboard();
void closeAllTabs();
// QWidget interface // QWidget interface
protected: protected:
void showEvent(QShowEvent *evt); void showEvent(QShowEvent *evt) override;
void closeEvent(QCloseEvent *evt) override; void closeEvent(QCloseEvent *evt) override;
}; };

@ -11,7 +11,7 @@
</rect> </rect>
</property> </property>
<property name="windowTitle"> <property name="windowTitle">
<string>MainWindow</string> <string>Prodejna</string>
</property> </property>
<property name="windowIcon"> <property name="windowIcon">
<iconset resource="appRc.qrc"> <iconset resource="appRc.qrc">
@ -52,6 +52,83 @@
</property> </property>
</widget> </widget>
</item> </item>
<item>
<widget class="QWidget" name="dashboard" native="true">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Expanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<layout class="QGridLayout" name="gridLayout">
<item row="0" column="0">
<widget class="QWidget" name="dbWidget" native="true">
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QWidget" name="widget" native="true">
<layout class="QHBoxLayout" name="horizontalLayout_2">
<item>
<widget class="QLabel" name="label">
<property name="text">
<string/>
</property>
<property name="pixmap">
<pixmap resource="appRc.qrc">:/icons/login_32.png</pixmap>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="labelUser">
<property name="text">
<string/>
</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>
</layout>
</widget>
</item>
<item row="1" column="0">
<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 row="2" column="0">
<widget class="QLabel" name="labelVersion">
<property name="text">
<string>Prodejna 3.0</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
</item>
</layout>
</widget>
</item>
</layout> </layout>
</widget> </widget>
<widget class="QMenuBar" name="menuBar"> <widget class="QMenuBar" name="menuBar">
@ -60,7 +137,7 @@
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>1000</width> <width>1000</width>
<height>19</height> <height>21</height>
</rect> </rect>
</property> </property>
<widget class="QMenu" name="menuFile"> <widget class="QMenu" name="menuFile">
@ -72,7 +149,23 @@
<addaction name="separator"/> <addaction name="separator"/>
<addaction name="actionExit"/> <addaction name="actionExit"/>
</widget> </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="menuFile"/>
<addaction name="menuRegisters"/>
<addaction name="menuHelp"/>
</widget> </widget>
<widget class="QToolBar" name="mainToolBar"> <widget class="QToolBar" name="mainToolBar">
<attribute name="toolBarArea"> <attribute name="toolBarArea">
@ -116,6 +209,26 @@
<string>Settings</string> <string>Settings</string>
</property> </property>
</action> </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>&amp;About</string>
</property>
</action>
<action name="actionAbout_Qt">
<property name="text">
<string>About &amp;Qt</string>
</property>
</action>
</widget> </widget>
<layoutdefault spacing="6" margin="11"/> <layoutdefault spacing="6" margin="11"/>
<resources> <resources>

@ -16,8 +16,17 @@
} }
#navigation QToolButton { #navigation QToolButton {
background-color: dimgray;
color: white; color: white;
font-weight: bold; font-weight: bold;
min-width: 90px; min-width: 90px;
font: 10pt; font: 10pt;
} }
#dashboard {
background-color: qlineargradient(spread:pad, x1:0.507, y1:1, x2:0.518, y2:0.291, stop:0 rgba(83, 145, 169, 255), stop:1 rgba(255, 255, 255, 255));;
}
#dashboard QLabel {
color: black;
}

@ -0,0 +1,131 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.1" language="cs_CZ">
<context>
<name>LoginDialog</name>
<message>
<location filename="../logindialog.ui" line="14"/>
<location filename="../logindialog.ui" line="70"/>
<source>Login</source>
<translation>Login</translation>
</message>
<message>
<location filename="../logindialog.ui" line="80"/>
<source>Password</source>
<translation>Heslo</translation>
</message>
</context>
<context>
<name>MainWindow</name>
<message>
<source>MainWindow</source>
<translation type="vanished">Prodejna</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="14"/>
<source>Prodejna</source>
<translation></translation>
</message>
<message>
<location filename="../mainwindow.ui" line="122"/>
<source>Prodejna 2.0</source>
<translation></translation>
</message>
<message>
<location filename="../mainwindow.ui" line="145"/>
<source>Fi&amp;le</source>
<translation>&amp;Soubor</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="154"/>
<source>&amp;Registers</source>
<translation>Číse&amp;lníky</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="161"/>
<source>Help</source>
<translation>Pomoc</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="183"/>
<source>&amp;Exit</source>
<translation>&amp;Konec</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="188"/>
<source>&amp;Open database...</source>
<translation>&amp;Otevřít databázi...</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="197"/>
<source>&amp;Login...</source>
<translation>&amp;Přihlásit...</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="214"/>
<source>&amp;Post register</source>
<translation>Čís&amp;elník PSČ</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="219"/>
<source>&amp;Country register</source>
<translation>Čísel&amp;ník států</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="224"/>
<source>&amp;About</source>
<translation>&amp;O programu</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="229"/>
<source>About &amp;Qt</source>
<translation>O knihovně &amp;Qt</translation>
</message>
<message>
<source>About</source>
<translation type="vanished">O aplikaci</translation>
</message>
<message>
<source>About Qt</source>
<translation type="vanished">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>
</message>
<message>
<source>Exit</source>
<translation type="vanished">Konec</translation>
</message>
<message>
<source>Open database...</source>
<translation type="vanished">Otevřít databázi...</translation>
</message>
<message>
<source>Login...</source>
<translation type="vanished">Přihlásit se...</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="206"/>
<location filename="../mainwindow.ui" line="209"/>
<source>Settings</source>
<translation>Nastavení</translation>
</message>
<message>
<location filename="../mainwindow.cpp" line="259"/>
<source>About prodejna</source>
<translation>O aplikaci prodejna</translation>
</message>
<message>
<location filename="../mainwindow.cpp" line="259"/>
<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>

@ -1,68 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.1" language="cs_CZ">
<context>
<name>LoginDialog</name>
<message>
<location filename="../logindialog.ui" line="14"/>
<location filename="../logindialog.ui" line="70"/>
<source>Login</source>
<translation>Login</translation>
</message>
<message>
<location filename="../logindialog.ui" line="80"/>
<source>Password</source>
<translation>Heslo</translation>
</message>
</context>
<context>
<name>MainWindow</name>
<message>
<location filename="../mainwindow.ui" line="14"/>
<source>MainWindow</source>
<translation>Prodejna</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="68"/>
<source>Fi&amp;le</source>
<translation>&amp;Soubor</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="90"/>
<source>&amp;Exit</source>
<translation>&amp;Konec</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="95"/>
<source>&amp;Open database...</source>
<translation>&amp;Otevřít databázi...</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="104"/>
<source>&amp;Login...</source>
<translation>&amp;Přihlásit...</translation>
</message>
<message>
<source>File</source>
<translation type="vanished">Soubor</translation>
</message>
<message>
<source>Exit</source>
<translation type="vanished">Konec</translation>
</message>
<message>
<source>Open database...</source>
<translation type="vanished">Otevřít databázi...</translation>
</message>
<message>
<source>Login...</source>
<translation type="vanished">Přihlásit se...</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="113"/>
<location filename="../mainwindow.ui" line="116"/>
<source>Settings</source>
<translation>Nastavení</translation>
</message>
</context>
</TS>

@ -0,0 +1,85 @@
cmake_minimum_required(VERSION 3.24)
project(camp)
include(../3rdparty/QxOrm/QxOrm.cmake)
set (CMAKE_LIBRARY_OUTPUT_DIRECTORY ../plugins)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_AUTOUIC ON)
find_package(Qt6 COMPONENTS
Core
Gui
Widgets
Qml
REQUIRED)
add_library(camp SHARED
addservicedialog.cpp
addservicedialog.h
addservicedialog.ui
camp.cpp
camp.h
camp_global.h
campform.cpp
campform.h
campform.ui
campgrid.cpp
campgrid.h
camprc.qrc
campseller.cpp
campseller.h
campservice.cpp
campservice.h
campshopitem.cpp
campshopitem.h
campwizard.cpp
campwizard.h
campwizard.ui
detailwidget.cpp
detailwidget.h
detailwidget.ui
data/addressitem.cpp
data/addressitem.h
data/camp-data.h
data/campdata.cpp
data/campdata.h
data/personprice.cpp
data/personprice.h
data/sale.cpp
data/sale.h
data/serviceitem.cpp
data/serviceitem.h
settings/campsettings.cpp
settings/campsettings.h
settings/campsettingsform.cpp
settings/campsettingsform.h
settings/campsettingsform.ui)
target_compile_definitions(camp PRIVATE -DCAMP_LIBRARY)
include_directories(../core)
include_directories(../countryregister
../addressbook
../services
../shop)
target_link_libraries(camp
Qt::Core
Qt::Gui
Qt::Widgets
Qt::Qml
qdecimal
decnumber
QxOrm
core
addressbook
services
shop
)
install(TARGETS addressbook
LIBRARY DESTINATION ../plugins)

@ -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 = nullptr);
~AddServiceDialog() override;
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,29 @@
#include "camp.h"
#include "campgrid.h"
#include "campform.h"
#include "campservice.h"
#include "settings/campsettingsform.h"
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() = default;
protected:
void initServiceUi() Q_DECL_OVERRIDE;
// IPlugin interface
public:
QIcon pluginIcon() override;
QTranslator *translator() override;
bool hasNumberSeries() override;
};
#endif // CAMP_H

@ -0,0 +1,146 @@
{
"id" : "CAMP",
"name" : {
"default" : "Camp",
"CZ" : "Kemp"
},
"descriptoin" : {
"default" : "",
"CZ" : ""
},
"schemaVersion" : 8,
"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;
",
"ALTER TABLE CampData ADD \"onVoucher\" INTEGER NULL;
",
"ALTER TABLE AddressItem ADD \"sale\" INTEGER NULL;
ALTER TABLE AddressItem ADD \"totalPrice\" INTEGER NULL;
",
"ALTER TABLE CampData ADD \"createdBy\" TEXT NULL;
ALTER TABLE CampData ADD \"created\" TEXT NULL;
ALTER TABLE CampData ADD \"updatedBy\" TEXT NULL;
ALTER TABLE CampData ADD \"updated\" TEXT NULL;
"
],
"dependencies" : [ "ADDRESSBOOK", "SHOP", "SERVICES" ],
"translations" : {
"CZ" : {
"numSer" : "Číslo",
"start" : "Od",
"end" : "Do",
"owner" : "Plátce",
"ownerFirstame" : "Křestní jméno plátce",
"ownerLastname" : "Příjmení plátce",
"ownerAddress" : "Adresa plátce",
"totalPrice" : "Cena celkem",
"fullPrice" : "Plná cena",
"sale" : "Sleva",
"fixedSale" : "Pevná částka",
"season" : "Sezona",
"firstName" : "Křestní jméno",
"lastName" : "Příjmení",
"address" : "Adresa",
"price" : "Cena",
"name" : "Název",
"code" : "Kód",
"salePossible" : "Umožnit slevu",
"type" : "Druh",
"fixed" : "Pevná",
"description" : "Popis",
"fromAge" : "Od věku",
"toAge" : "Do věku",
"active" : "Aktivní",
"totalSale" : "Sleva celkem",
"accServiceName" : "Název",
"onVoucher" : "Na účtence"
}
},
"reports" : [
{ "name" : "Doklad", "description" : "Doklad k ubytování", "listReport" : false, "file" : "camp_accommodation_document.lrxml" },
{ "name" : "Doklad jedna strana anglicky", "description" : "Doklad k ubytování jedna strana anglicky", "listReport" : false, "file" : "camp_accommodation_document_en.lrxml" }
]
}

@ -0,0 +1,21 @@
#ifndef CAMP_GLOBAL_H
#define CAMP_GLOBAL_H
#include <QtCore/qglobal.h>
#include <QxOrm.h>
#if defined(CAMP_LIBRARY)
# define CAMPSHARED_EXPORT Q_DECL_EXPORT
#else
# define CAMPSHARED_EXPORT Q_DECL_IMPORT
#endif
#ifdef CAMP_LIBRARY
#define QX_REGISTER_HPP_CAMP QX_REGISTER_HPP_EXPORT_DLL
#define QX_REGISTER_CPP_CAMP QX_REGISTER_CPP_EXPORT_DLL
#else // CAMP_LIBRARY
#define QX_REGISTER_HPP_CAMP QX_REGISTER_HPP_IMPORT_DLL
#define QX_REGISTER_CPP_CAMP QX_REGISTER_CPP_IMPORT_DLL
#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,24 @@
#ifndef CAMPFORM_H
#define CAMPFORM_H
#include <QWidget>
#include <core.h>
#include "data/camp-data.h"
namespace Ui {
class CampForm;
}
class CampForm : public AutoForm<CampData>
{
Q_OBJECT
public:
explicit CampForm(QWidget *parent = nullptr);
~CampForm() override;
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,165 @@
#include "campgrid.h"
#include "campwizard.h"
#include "campservice.h"
#include "campshopitem.h"
#include <data/shop-data.h>
#include <shopservice.h>
#include <paydialog.h>
CampGrid::CampGrid(QWidget *parent) : GridForm<CampData>(parent)
{
setTableModel(new AutoTableModel<CampData>);
QHBoxLayout *tbLayout = qobject_cast<QHBoxLayout*>(this->toolbar()->layout());
if (tbLayout != nullptr)
{
QToolButton *btnImport = new QToolButton(this->toolbar());
btnImport->setIcon(QIcon(":/icons/pay.svg"));
btnImport->setAutoRaise(true);
btnImport->setIconSize(QSize(24, 24));
btnImport->setToolTip(tr("Pay"));
tbLayout->insertWidget(tbLayout->count() - 1, btnImport);
connect(btnImport, &QToolButton::clicked, [this](){
CampDataPtr data = currentEntity();
if (!data.isNull())
{
addToVoucher(data);
}
});
}
m_detail = new DetailWidget(this);
mainLayout()->addWidget(m_detail);
}
void CampGrid::handleNewRecord()
{
if (!checkPermAdd())
{
return;
}
CampService srv;
CampDataPtr data = srv.create();
CampWizard *wizard = new CampWizard();
wizard->setAttribute(Qt::WA_DeleteOnClose);
wizard->setData(data);
wizard->setNewRecord(true);
connect(wizard, &QDialog::accepted, [this, data](){
addRow(data);
});
wizard->show();
}
void CampGrid::handleEditRecord()
{
if (!checkPermEdit())
{
return;
}
CampDataPtr data = currentEntity();
if (data.isNull())
{
return;
}
if (data->onVoucher())
{
QMessageBox::critical(this, tr("Can not edit"), tr("This record is asociated with voucher. Can not edit paid items"));
return;
}
if (data->people().isEmpty() || data->services().isEmpty()) {
CampService srv;
srv.load(data);
}
CampWizard *wizard = new CampWizard();
wizard->setAttribute(Qt::WA_DeleteOnClose);
wizard->setData(data);
wizard->show();
}
void CampGrid::doDelete(CampDataPtr entity)
{
if (!checkPermDelete())
{
return;
}
if (entity->onVoucher())
{
QMessageBox::critical(this, tr("Can not delete"), tr("This record is asociated with voucher. Can not delete paid items"));
return;
}
CampService srv;
srv.erase(entity);
}
void CampGrid::addToVoucher(const CampDataPtr& data)
{
if (data->onVoucher())
{
QMessageBox::information(this, tr("Can not pay"), tr("This record is already paid"));
return;
}
SettingsService settSrv("CAMP");
CampSettingsPtr settings = settSrv.loadSettings<CampSettings>();
CampShopItemPtr campItem(new CampShopItem);
campItem->setId(data->id());
campItem->setUnitPrice(data->totalPrice());
campItem->setVatType(settings->vatType());
ShopService shopSrv;
VoucherPtr voucher = shopSrv.createVoucher();
shopSrv.addShopItem(voucher, campItem, 1);
shopSrv.calculate(voucher);
shopSrv.save(voucher);
data->setOnVoucher(true);
CampService srvCamp;
srvCamp.update(data);
PayDialog *payDlg = new PayDialog(voucher->totalPrice(), this);
payDlg->setAttribute(Qt::WA_DeleteOnClose);
payDlg->show();
connect(payDlg, &QDialog::accepted, [payDlg, voucher](){
payVoucherFromUI(voucher, payDlg);
});
connect(payDlg, &QDialog::rejected, [voucher, &shopSrv, data](){
CampService srvCamp;
data->setOnVoucher(false);
srvCamp.update(data);
voucher->clearItems();
shopSrv.erase(voucher);
});
}
void CampGrid::currentIndexChanged(const QModelIndex &current)
{
if (current.isValid())
{
auto current = currentEntity();
m_detail->setData(current);
}
}
QList<CampDataPtr> CampGrid::listForGrid()
{
CampService srv;
return srv.allForSeason();
}

@ -0,0 +1,38 @@
#ifndef CAMPGRID_H
#define CAMPGRID_H
#include <core.h>
#include "data/camp-data.h"
#include "detailwidget.h"
class CampGrid : public GridForm<CampData>
{
Q_OBJECT
public:
explicit CampGrid(QWidget *parent = nullptr);
// IGridForm interface
protected:
void handleNewRecord() override;
void handleEditRecord() override;
// GridForm interface
protected:
void doDelete(CampDataPtr entity) override;
private:
void addToVoucher(const CampDataPtr& data);
DetailWidget *m_detail;
// IGridForm interface
protected:
void currentIndexChanged(const QModelIndex &current) override;
// GridForm interface
protected:
QList<CampDataPtr> listForGrid() override;
};
#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,35 @@
#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->setNewRecord(true);
wizard->show();
connect(wizard, &QDialog::accepted, [this, data](){
SettingsService settSrv("CAMP");
CampSettingsPtr settings = settSrv.loadSettings<CampSettings>();
CampShopItemPtr item(new CampShopItem);
item->setUnitPrice(data->totalPrice());
item->setId(data->id());
item->setVatType(settings->vatType());
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 = nullptr);
// ISeller interface
public:
void prepareItem() override;
};
#endif // CAMPSELLER_H

@ -0,0 +1,411 @@
#include "campservice.h"
#include <settingsservice.h>
#include <seasonservice.h>
#include <numberseriesservice.h>
#include "campshopitem.h"
#include "campseller.h"
#include <cmath>
CampService::CampService()
{
m_pluginId = "CAMP";
m_seller = new CampSeller(this);
}
void CampService::addPerson(const CampDataPtr& data, const 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(const CampDataPtr& data, const 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, const QString& description)
{
ServiceItemPtr item = addServiceInt(data, service);
item->setPrice(price);
item->setDescription(description);
}
void CampService::setOwner(const CampDataPtr& data, const 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(const CampDataPtr& data)
{
SettingsService srv("CAMP");
m_settings = srv.loadSettings<CampSettings>();
calcServices(data);
calcPeople(data);
calcPrice(data);
}
void CampService::saveCamp(const CampDataPtr& data)
{
if (!checkPermission(PERM_ADD))
{
return;
}
SeasonService seasonSrv;
SeasonPtr season = seasonSrv.active();
data->setSeason(season);
qx::QxSession session;
NumberSeriesService numSrv;
data->setNumSer(numSrv.nextStrForPlugin("CAMP", &session));
addDateAndUser(data, true);
save(data, &session);
}
/*void CampService::updateCamp(CampDataPtr data)
{
if (!checkPermission(PERM_EDIT))
{
return;
}
Transaction tr;
try
{
odb::database *db = Context::instance().db();
db->execute(QString("DELETE FROM ServiceItem WHERE campData = %1").arg(data->id()).toStdString());
db->execute(QString("DELETE FROM AddressItem WHERE campData = %1").arg(data->id()).toStdString());
foreach (ServiceItemPtr item, data->services()) {
item->setCampData(data.toWeakRef());
db->persist(item);
}
foreach (AddressItemPtr item, data->people()) {
item->setCampData(data.toWeakRef());
db->persist(item);
}
addDateAndUser(data, false);
db->update(data);
tr.commit();
}
catch (const odb::exception &ex)
{
emit dbError(ex.what());
emit dbErrorUpdate(ex.what());
return;
}
}*/
/*void CampService::eraseCamp(CampDataPtr data)
{
if (!checkPermission(PERM_DELETE))
{
return;
}
Transaction tr;
try
{
odb::database *db = Context::instance().db();
db->execute(QString("DELETE FROM ServiceItem WHERE campData = %1").arg(data->id()).toStdString());
db->execute(QString("DELETE FROM AddressItem WHERE campData = %1").arg(data->id()).toStdString());
db->erase(data);
tr.commit();
}
catch (const odb::exception &ex)
{
emit dbError(ex.what());
emit dbErrorDelete(ex.what());
return;
}
}*/
/*void CampService::loadItems(CampDataPtr data)
{
Service<AddressItem> srv;
data->setPeople(srv.all(QString("campData = %1").arg(data->id())));
Service<ServiceItem> srvService;
data->setServices(srvService.all(QString("campData = %1").arg(data->id())));
}*/
QList<CampDataPtr> CampService::allForSeason()
{
SeasonService seasonSrv;
SeasonPtr season = seasonSrv.active();
return all(QString("season = %1").arg(QString::number(season->id())));
}
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());
QDecDouble sale = data->sale();
bool fixedSale = data->fixedSale();
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;
auto setTotal = [&](){
if (sale != QDecDouble(0) && !fixedSale)
{
QDecDouble itemSale = (item->price() * sale) / 100;
item->setSale(itemSale);
item->setTotalPrice(item->price() - itemSale);
}
else
{
item->setSale(0);
item->setTotalPrice(item->price());
}
addAccFee(data, item, startAge, endAge, days);
};
if (!item->personPrice().isNull())
{
item->setPrice(item->personPrice()->price() * days);
setTotal();
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;
}
}
setTotal();
}
}
void CampService::calcServices(const 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(const 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->totalPrice();
sale += addr->sale();
}
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(const CampDataPtr& data, const AddressItemPtr& item, int startAge, int endAge, int days)
{
if (item->adbItem()->ztp())
{
return;
}
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<IShopItemPtr> CampService::shopItems(const QString& category)
{
if (!category.isEmpty()) {
return {};
}
CampShopItemPtr item(new CampShopItem);
QList<IShopItemPtr> items;
items.append(item);
return items;
}
IShopItemPtr CampService::shopItem(int )
{
return CampShopItemPtr(new CampShopItem);
}
void CampService::addedToVoucher(int itemId, int countAdded)
{
CampDataPtr data = loadById(itemId);
if (countAdded > 0)
{
data->setOnVoucher(true);
}
else
{
data->setOnVoucher(false);
}
this->update(data);
}
ISeller *CampService::seller()
{
return m_seller;
}
ServiceItemPtr CampService::addServiceInt(const CampDataPtr& data, const 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,45 @@
#ifndef CAMPSERVICE_H
#define CAMPSERVICE_H
#include <core.h>
#include <data/addressbookdata.h>
#include <data/accservice.h>
#include <isellableservice.h>
#include "data/camp-data.h"
#include "settings/campsettings.h"
class CampService : public Service<CampData>, public ISellableService
{
public:
CampService();
void addPerson(const CampDataPtr& data, const AddressbookDataPtr& address);
void addService(const CampDataPtr& data, const AccServicePtr& service);
void addService(CampDataPtr data, AccServicePtr service, QDecDouble price, const QString& description);
void setOwner(const CampDataPtr& data, const AddressItemPtr& person);
CampDataPtr create();
void calculate(const CampDataPtr& data);
void saveCamp(const CampDataPtr& data);
//void updateCamp(CampDataPtr data);
//void eraseCamp(CampDataPtr data);
//void loadItems(CampDataPtr data);
QList<CampDataPtr> allForSeason();
private:
ServiceItemPtr addServiceInt(const CampDataPtr& data, const AccServicePtr& service);
void calcPeople(CampDataPtr data);
void calcServices(const CampDataPtr& data);
void calcPrice(const CampDataPtr& data);
void addAccFee(const CampDataPtr& data, const AddressItemPtr& item, int startAge, int endAge, int days);
CampSettingsPtr m_settings;
ISeller *m_seller;
// ISellableService interface
public:
QList<IShopItemPtr> shopItems(const QString& category = "") override;
IShopItemPtr shopItem(int itemId) override;
void addedToVoucher(int itemId, int countAdded) override;
ISeller *seller() override;
};
#endif // CAMPSERVICE_H

@ -0,0 +1,59 @@
#include "campshopitem.h"
CampShopItem::CampShopItem(QObject *parent)
:IShopItem(parent)
{
m_id = 0;
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() const
{
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;
}
long CampShopItem::id() const
{
return m_id;
}
void CampShopItem::setId(long id)
{
m_id = id;
}

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

@ -0,0 +1,497 @@
#include "campwizard.h"
#include "ui_campwizard.h"
#include "campservice.h"
#include "addservicedialog.h"
#include <core.h>
#include <addressbookservice.h>
#include <data/accservice.h>
#include <reporting/reportviewer.h>
#include <QScroller>
////////////////////////////////////
/// \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);
m_peopleModel->setTranslations(Context::instance().plugin("CAMP")->translations());
ui->tablePeople->setModel(m_peopleModel);
ui->tablePeople->hideColumn(2);
ui->tablePeople->hideColumn(3);
ui->tablePeople->hideColumn(4);
ui->tablePeople->hideColumn(5);
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->setTranslations(Context::instance().plugin("CAMP")->translations());
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>();
m_itemsModel->setTranslations(Context::instance().plugin("CAMP")->translations());
ui->tableItems->setModel(m_itemsModel);
ui->tableItems->hideColumn(1);
ui->tableItems->hideColumn(4);
ui->tableItems->hideColumn(5);
ui->tableItems->hideColumn(6);
ui->tableItems->hideColumn(7);
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(6);
ui->tabPeople->horizontalHeader()->setSectionResizeMode(2, QHeaderView::Stretch);
ui->tabServices->setModel(m_itemsModel);
ui->tabServices->hideColumn(1);
ui->tabServices->hideColumn(3);
ui->tabServices->hideColumn(7);
ui->tabServices->horizontalHeader()->setSectionResizeMode(0, QHeaderView::Stretch);
ui->tabServices->horizontalHeader()->setSectionResizeMode(2, QHeaderView::Stretch);
QScroller::grabGesture(ui->tabServices, QScroller::LeftMouseButtonGesture);
QScroller::grabGesture(ui->tabPeople, QScroller::LeftMouseButtonGesture);
m_newRecord = false;
}
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());
ui->sale_2->setValue(m_data->sale().toDouble());
ui->lblSale->setText(m_data->fixedSale() ? tr("Fixed amound") : tr("%"));
}
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();
}
void CampWizard::setNewRecord(bool newRecord)
{
m_newRecord = newRecord;
if (newRecord)
{
ui->wSale->setVisible(false);
ui->checkSale->setText(tr("Apply sale"));
}
else
{
ui->wSale->setVisible(true);
ui->checkSale->setText(tr("Change"));
}
}
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;
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, tr("Permission denied"), msg.toStdString().c_str());
success = false;
});
if (m_newRecord && m_data->id() == 0)
{
srv.saveCamp(m_data);
}
else
{
srv.update(m_data);
}
if (success)
{
QDialog::accept();
}
}
void CampWizard::on_btnPrint_clicked()
{
if (QMessageBox::question(this, tr("Save record?"), tr("Record must be saved before print. Do you want to save record?")) != QMessageBox::Yes)
{
return;
}
CampService srv;
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, tr("Permission denied"), msg.toStdString().c_str());
success = false;
});
if (m_newRecord && m_data->id() == 0)
{
srv.saveCamp(m_data);
}
else
{
srv.update(m_data);
}
if(!success)
{
return;
}
ReportPtr report(new Report);
report->setFile("camp_accommodation_document.lrxml");
VariableFiller filler;
filler.fill(report, m_data->id());
ReportViewer *viewer = new ReportViewer(this);
viewer->setAttribute(Qt::WA_DeleteOnClose);
viewer->setReport(report);
viewer->openPreview();
connect(viewer, &QDialog::finished, [this](int){
this->accept();
});
}

@ -0,0 +1,118 @@
#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:
explicit AddressHelper(QObject *parent = nullptr);
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:
explicit SaleHelper(QObject *parent = nullptr);
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 = nullptr);
~CampWizard() override;
void setData(const CampDataPtr &data);
void setNewRecord(bool newRecord);
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);
void on_btnPrint_clicked();
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;
bool m_newRecord;
// QWizard interface
public:
bool validateCurrentPage() override;
public slots:
void accept() override;
};
#endif // CAMPWIZARD_H

@ -0,0 +1,913 @@
<?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="minimumSize">
<size>
<width>300</width>
<height>0</height>
</size>
</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">
<property name="selectionMode">
<enum>QAbstractItemView::SingleSelection</enum>
</property>
<property name="selectionBehavior">
<enum>QAbstractItemView::SelectRows</enum>
</property>
</widget>
</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">
<property name="selectionMode">
<enum>QAbstractItemView::SingleSelection</enum>
</property>
<property name="selectionBehavior">
<enum>QAbstractItemView::SelectRows</enum>
</property>
</widget>
</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="1" column="0">
<widget class="QCheckBox" name="checkSale">
<property name="text">
<string>Change</string>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QComboBox" name="sale">
<property name="enabled">
<bool>false</bool>
</property>
</widget>
</item>
<item row="0" column="0">
<widget class="QWidget" name="wSale" native="true">
<layout class="QHBoxLayout" name="horizontalLayout_10">
<item>
<widget class="QDoubleSpinBox" name="sale_2">
<property name="maximumSize">
<size>
<width>60</width>
<height>16777215</height>
</size>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
<property name="readOnly">
<bool>true</bool>
</property>
<property name="buttonSymbols">
<enum>QAbstractSpinBox::NoButtons</enum>
</property>
<property name="maximum">
<double>999.990000000000009</double>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="lblSale">
<property name="text">
<string>TextLabel</string>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer_8">
<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 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="btnPrint">
<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>btnPrint</tabstop>
<tabstop>checkSale</tabstop>
<tabstop>sale</tabstop>
<tabstop>tableServices</tabstop>
</tabstops>
<resources>
<include location="../core/rc.qrc"/>
<include location="camprc.qrc"/>
</resources>
<connections/>
</ui>

@ -0,0 +1,141 @@
#include "addressitem.h"
#include <define.h>
QX_REGISTER_CPP_CAMP(AddressItem)
namespace qx {
template<> void register_class(QxClass<AddressItem>& t) {
t.setName("AddressItem");
t.id(&AddressItem::m_id, "id");
t.data(&AddressItem::m_firstName, "firstName");
t.data(&AddressItem::m_lastName, "lastName");
t.data(&AddressItem::m_address, "address");
t.data(&AddressItem::m_price, "price");
t.data(&AddressItem::m_owner, "owner");
t.data(&AddressItem::m_sale, "sale");
t.data(&AddressItem::m_totalPrice, "totalPrice");
t.relationManyToOne(&AddressItem::m_adbItem, "adbItem");
t.relationManyToOne(&AddressItem::m_campData, "campData");
t.relationManyToOne(&AddressItem::m_personPrice, "personPrice");
}
}
AddressItem::AddressItem(QObject *parent) : QObject(parent)
{
m_id = 0;
m_price = 0;
m_owner = false;
m_sale = 0;
m_totalPrice = 0;
}
long AddressItem::id() const
{
return m_id;
}
void AddressItem::setId(long 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);
}
QSharedPointer<CampData> AddressItem::campData() const
{
return m_campData;
}
void AddressItem::setCampData(const QSharedPointer<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;
}
QDecDouble AddressItem::totalPrice() const
{
return TO_DEC(m_totalPrice);
}
void AddressItem::setTotalPrice(QDecDouble totalPrice)
{
m_totalPrice = FROM_DEC(totalPrice);
}
QDecDouble AddressItem::sale() const
{
return TO_DEC(m_sale);
}
void AddressItem::setSale(QDecDouble sale)
{
m_sale = FROM_DEC(sale);
}

@ -0,0 +1,80 @@
#ifndef ADDRESSITEM_H
#define ADDRESSITEM_H
#include "camp-data.h"
#include <QObject>
#include <QSharedPointer>
#include <QWeakPointer>
#include <QDecDouble.hh>
#include <data/addressbookdata.h>
#include "../camp_global.h"
class CampData;
class AddressItem : public QObject
{
Q_OBJECT
QX_REGISTER_FRIEND_CLASS(AddressItem)
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(QDecDouble sale READ sale WRITE setSale)
Q_PROPERTY(QDecDouble totalPrice READ totalPrice WRITE setTotalPrice)
Q_PROPERTY(bool owner READ owner WRITE setOwner)
public:
explicit AddressItem(QObject *parent = 0);
long id() const;
void setId(long 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);
QSharedPointer<CampData> campData() const;
void setCampData(const QSharedPointer<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);
QDecDouble totalPrice() const;
void setTotalPrice(QDecDouble totalPrice);
QDecDouble sale() const;
void setSale(QDecDouble sale);
private:
long m_id;
QString m_firstName;
QString m_lastName;
QString m_address;
AddressbookDataPtr m_adbItem;
int m_price;
int m_totalPrice;
int m_sale;
CampDataPtr m_campData;
PersonPricePtr m_personPrice;
bool m_owner;
};
QX_REGISTER_HPP_CAMP(AddressItem, QObject, 0)
#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,262 @@
#include "campdata.h"
#include <define.h>
QX_REGISTER_CPP_CAMP(CampData)
namespace qx {
template<> void register_class(QxClass<CampData>& t) {
t.setName("CampData");
t.id(&CampData::m_id, "id");
t.data(&CampData::m_numSer, "numSer");
t.data(&CampData::m_start, "start");
t.data(&CampData::m_end, "end");
t.data(&CampData::m_ownerFirstame, "ownerFirstame");
t.data(&CampData::m_ownerLastname, "ownerLastname");
t.data(&CampData::m_ownerAddress, "ownerAddress");
t.data(&CampData::m_totalPrice, "totalPrice");
t.data(&CampData::m_sale, "sale");
t.data(&CampData::m_fixedSale, "fixedSale");
t.data(&CampData::m_fullPrice, "fullPrice");
t.data(&CampData::m_totalSale, "totalSale");
t.data(&CampData::m_onVoucher, "onVoucher");
t.data(&CampData::m_createdBy, "createdBy");
t.data(&CampData::m_created, "created");
t.data(&CampData::m_updatedBy, "updatedBy");
t.data(&CampData::m_updated, "updated");
t.relationManyToOne(&CampData::m_season, "season");
t.relationOneToMany(&CampData::m_people, "people", "campData");
t.relationOneToMany(&CampData::m_services, "services", "campData");
}
}
CampData::CampData(QObject *parent) : QObject(parent)
{
m_id = 0;
m_totalPrice = 0;
m_sale = 0;
m_totalSale = 0;
m_fixedSale = false;
m_fullPrice = 0;
m_onVoucher = false;
}
long CampData::id() const
{
return m_id;
}
void CampData::setId(long 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;
}
QList<ServiceItemPtr> CampData::services() const
{
return m_services;
}
void CampData::setServices(const QList<QSharedPointer<ServiceItem> > &services)
{
m_services = services;
}
void CampData::addServiceItem(const ServiceItemPtr& serviceItem)
{
m_services.append(serviceItem);
}
void CampData::removeServiceItem(const ServiceItemPtr& serviceItem)
{
m_services.removeOne(serviceItem);
}
QList<AddressItemPtr> CampData::people() const
{
return m_people;
}
void CampData::setPeople(const QList<AddressItemPtr> &people)
{
m_people = people;
}
void CampData::addPerson(const AddressItemPtr& person)
{
m_people.append(person);
}
void CampData::removePerson(const 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);
}
bool CampData::onVoucher() const
{
return m_onVoucher;
}
void CampData::setOnVoucher(bool onVoucher)
{
m_onVoucher = onVoucher;
}
QString CampData::createdBy() const
{
return m_createdBy;
}
void CampData::setCreatedBy(const QString &createdBy)
{
m_createdBy = createdBy;
}
QString CampData::updatedBy() const
{
return m_updatedBy;
}
void CampData::setUpdatedBy(const QString &updatedBy)
{
m_updatedBy = updatedBy;
}
QDateTime CampData::created() const
{
return m_created;
}
void CampData::setCreated(const QDateTime &created)
{
m_created = created;
}
QDateTime CampData::updated() const
{
return m_updated;
}
void CampData::setUpdated(const QDateTime &updated)
{
m_updated = updated;
}

@ -0,0 +1,125 @@
#ifndef CAMPDATA_H
#define CAMPDATA_H
#include "camp-data.h"
#include <QObject>
#include <QDate>
#include <QDecDouble.hh>
#include <data/season.h>
#include "../camp_global.h"
class CampData : public QObject
{
Q_OBJECT
QX_REGISTER_FRIEND_CLASS(CampData)
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)
Q_PROPERTY(bool onVoucher READ onVoucher WRITE setOnVoucher)
Q_PROPERTY(QString createdBy READ createdBy WRITE setCreatedBy)
Q_PROPERTY(QString updatedBy READ updatedBy WRITE setUpdatedBy)
Q_PROPERTY(QDateTime created READ created WRITE setCreated)
Q_PROPERTY(QDateTime updated READ updated WRITE setUpdated)
public:
explicit CampData(QObject *parent = nullptr);
long id() const;
void setId(long 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);
QList<ServiceItemPtr> services() const;
void setServices(const QList<ServiceItemPtr> &services);
void addServiceItem(const ServiceItemPtr& serviceItem);
void removeServiceItem(const ServiceItemPtr& serviceItem);
QList<AddressItemPtr> people() const;
void setPeople(const QList<AddressItemPtr> &people);
void addPerson(const AddressItemPtr& person);
void removePerson(const 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);
bool onVoucher() const;
void setOnVoucher(bool onVoucher);
QString createdBy() const;
void setCreatedBy(const QString &createdBy);
QString updatedBy() const;
void setUpdatedBy(const QString &updatedBy);
QDateTime created() const;
void setCreated(const QDateTime &created);
QDateTime updated() const;
void setUpdated(const QDateTime &updated);
private:
long m_id;
QString m_numSer;
QDate m_start;
QDate m_end;
QString m_ownerFirstame;
QString m_ownerLastname;
QString m_ownerAddress;
QList<ServiceItemPtr> m_services;
QList<AddressItemPtr> m_people;
int m_fullPrice;
int m_totalPrice;
int m_sale;
int m_totalSale;
bool m_fixedSale;
SeasonPtr m_season;
bool m_onVoucher;
QString m_createdBy;
QString m_updatedBy;
QDateTime m_created;
QDateTime m_updated;
};
QX_REGISTER_HPP_CAMP(CampData, QObject, 0)
#endif // CAMPDATA_H

@ -0,0 +1,85 @@
#include "personprice.h"
#include <define.h>
QX_REGISTER_CPP_CAMP(PersonPrice)
namespace qx {
template<> void register_class(QxClass<PersonPrice>& t) {
t.setName("PersonPrice");
t.id(&PersonPrice::m_id, "id");
t.data(&PersonPrice::m_description, "description");
t.data(&PersonPrice::m_fromAge, "fromAge");
t.data(&PersonPrice::m_toAge, "toAge");
t.data(&PersonPrice::m_price, "price");
t.data(&PersonPrice::m_active, "active");
}
}
PersonPrice::PersonPrice(QObject *parent) : QObject(parent)
{
m_id = 0;
m_fromAge = 0;
m_toAge = 0;
m_price = 0;
m_active = true;
}
long PersonPrice::id() const
{
return m_id;
}
void PersonPrice::setId(long 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,52 @@
#ifndef PERSONPRICE_H
#define PERSONPRICE_H
#include <QObject>
#include <QDecDouble.hh>
#include "../camp_global.h"
class PersonPrice : public QObject
{
Q_OBJECT
QX_REGISTER_FRIEND_CLASS(PersonPrice)
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);
long id() const;
void setId(long 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:
long m_id;
QString m_description;
int m_fromAge;
int m_toAge;
int m_price;
bool m_active;
};
QX_REGISTER_HPP_CAMP(PersonPrice, QObject, 0)
#endif // PERSONPRICE_H

@ -0,0 +1,78 @@
#include "sale.h"
#include <define.h>
QX_REGISTER_CPP_CAMP(Sale)
namespace qx {
template<> void register_class(QxClass<Sale>& t) {
t.setName("Sale");
t.id(&Sale::m_id, "id");
t.data(&Sale::m_sale, "sale");
t.data(&Sale::m_fixed, "fixed");
t.data(&Sale::m_description, "description");
}
}
Sale::Sale(QObject *parent) : ComboItem(parent)
{
m_id = 0;
m_sale = 0;
m_fixed = false;
}
long Sale::id() const
{
return m_id;
}
void Sale::setId(long 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,48 @@
#ifndef SALE_H
#define SALE_H
#include <QObject>
#include <QDecDouble.hh>
#include <combodata.h>
#include "../camp_global.h"
class Sale : public ComboItem
{
Q_OBJECT
QX_REGISTER_FRIEND_CLASS(Sale)
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 = nullptr);
long id() const;
void setId(long id);
QDecDouble sale() const;
void setSale(QDecDouble sale);
bool fixed() const;
void setFixed(bool fixed);
QString description() const;
void setDescription(const QString &description);
private:
long m_id;
QString m_description;
int m_sale;
bool m_fixed;
// ComboItem interface
public:
bool eq(ComboItem *other) override;
QString toString() override;
};
QX_REGISTER_HPP_CAMP(Sale, ComboItem, 0)
#endif // SALE_H

@ -0,0 +1,143 @@
#include "serviceitem.h"
#include <define.h>
QX_REGISTER_CPP_CAMP(ServiceItem)
namespace qx {
template<> void register_class(QxClass<ServiceItem>& t) {
t.setName("ServiceItem");
t.id(&ServiceItem::m_id, "id");
t.data(&ServiceItem::m_name, "name");
t.data(&ServiceItem::m_code, "code");
t.data(&ServiceItem::m_price, "price");
t.data(&ServiceItem::m_salePossible, "salePossible");
t.data(&ServiceItem::m_type, "type");
t.data(&ServiceItem::m_sale, "sale");
t.data(&ServiceItem::m_description, "description");
t.data(&ServiceItem::m_totalPrice, "totalPrice");
t.data(&ServiceItem::m_fullPrice, "fullPrice");
t.relationManyToOne(&ServiceItem::m_campData, "campData");
}
}
ServiceItem::ServiceItem(QObject *parent) : QObject(parent)
{
m_id = 0;
m_salePossible = false;
m_sale = 0;
m_price = 0;
m_totalPrice = 0;
m_fullPrice = 0;
m_type = AccService::OTHER;
}
long ServiceItem::id() const
{
return m_id;
}
void ServiceItem::setId(long 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,82 @@
#ifndef SREVICEITEM_H
#define SREVICEITEM_H
#include "camp-data.h"
#include <QObject>
#include <QSharedPointer>
#include <QWeakPointer>
#include <QDecDouble.hh>
#include <data/accservice.h>
#include "../camp_global.h"
class CampData;
class ServiceItem : public QObject
{
Q_OBJECT
QX_REGISTER_FRIEND_CLASS(ServiceItem)
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 fullPrice READ fullPrice WRITE setFullPrice)
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 = nullptr);
long id() const;
void setId(long 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:
long 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;
CampDataPtr m_campData;
};
QX_REGISTER_HPP_CAMP(ServiceItem, QObject, 0)
#endif // SREVICEITEM_H

@ -0,0 +1,52 @@
#include "detailwidget.h"
#include "ui_detailwidget.h"
#include <QScroller>
#include "campservice.h"
DetailWidget::DetailWidget(QWidget *parent) :
QWidget(parent),
ui(new Ui::DetailWidget)
{
ui->setupUi(this);
m_peopleModel = new AutoTableModel<AddressItem>(this);
m_servicesModel = new AutoTableModel<ServiceItem>(this);
m_peopleModel->setTranslations(Context::instance().plugin("CAMP")->translations());
m_servicesModel->setTranslations(Context::instance().plugin("CAMP")->translations());
ui->tabPeople->setModel(m_peopleModel);
ui->tabServices->setModel(m_servicesModel);
ui->tabPeople->hideColumn(0);
ui->tabPeople->hideColumn(1);
ui->tabPeople->hideColumn(6);
ui->tabPeople->horizontalHeader()->setSectionResizeMode(2, QHeaderView::Stretch);
ui->tabServices->hideColumn(1);
ui->tabServices->hideColumn(3);
ui->tabServices->hideColumn(7);
ui->tabServices->horizontalHeader()->setSectionResizeMode(0, QHeaderView::Stretch);
ui->tabServices->horizontalHeader()->setSectionResizeMode(2, QHeaderView::Stretch);
QScroller::grabGesture(ui->tabServices, QScroller::LeftMouseButtonGesture);
QScroller::grabGesture(ui->tabPeople, QScroller::LeftMouseButtonGesture);
}
DetailWidget::~DetailWidget()
{
delete ui;
}
void DetailWidget::setData(CampDataPtr &data)
{
if (data->people().isEmpty() || data->services().isEmpty()) {
CampService srv;
srv.load(data);
}
m_peopleModel->setData(data->people());
m_servicesModel->setData(data->services());
}

@ -0,0 +1,28 @@
#ifndef DETAILWIDGET_H
#define DETAILWIDGET_H
#include <QWidget>
#include <autotablemodel.h>
#include "data/camp-data.h"
namespace Ui {
class DetailWidget;
}
class DetailWidget : public QWidget
{
Q_OBJECT
public:
explicit DetailWidget(QWidget *parent = nullptr);
~DetailWidget() override;
void setData(CampDataPtr &data);
private:
Ui::DetailWidget *ui;
AutoTableModel<AddressItem> *m_peopleModel;
AutoTableModel<ServiceItem> *m_servicesModel;
};
#endif // DETAILWIDGET_H

@ -0,0 +1,59 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>DetailWidget</class>
<widget class="QWidget" name="DetailWidget">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>806</width>
<height>445</height>
</rect>
</property>
<property name="windowTitle">
<string>Form</string>
</property>
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="QGroupBox" name="groupBox">
<property name="title">
<string>People</string>
</property>
<layout class="QHBoxLayout" name="horizontalLayout_2">
<item>
<widget class="QTableView" name="tabPeople">
<property name="selectionMode">
<enum>QAbstractItemView::NoSelection</enum>
</property>
<property name="selectionBehavior">
<enum>QAbstractItemView::SelectRows</enum>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QGroupBox" name="groupBox_2">
<property name="title">
<string>Services</string>
</property>
<layout class="QHBoxLayout" name="horizontalLayout_3">
<item>
<widget class="QTableView" name="tabServices">
<property name="selectionMode">
<enum>QAbstractItemView::NoSelection</enum>
</property>
<property name="selectionBehavior">
<enum>QAbstractItemView::SelectRows</enum>
</property>
</widget>
</item>
</layout>
</widget>
</item>
</layout>
</widget>
<resources/>
<connections/>
</ui>

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 1.1 KiB

@ -0,0 +1,83 @@
#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;
m_vatType = Enums::NONE;
m_accFeeStartAge = 0;
m_accFeeEndAge = 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;
}
Enums::VatType CampSettings::vatType() const
{
return m_vatType;
}
void CampSettings::setVatType(const Enums::VatType &vatType)
{
m_vatType = vatType;
}

@ -0,0 +1,56 @@
#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(Enums::VatType vatType READ vatType WRITE setVatType)
Q_PROPERTY(int decimalPlaces READ decimalPlaces WRITE setDecimalPlaces)
Q_PROPERTY(QString accFeeText READ accFeeText WRITE setAccFeeText)
public:
explicit CampSettings(QObject *parent = nullptr);
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);
Enums::VatType vatType() const;
void setVatType(const Enums::VatType &vatType);
private:
int m_accFee;
int m_accFeeStartAge;
int m_accFeeEndAge;
QString m_accFeeText;
Enums::Rounding m_rounding;
Enums::VatType m_vatType;
int m_decimalPlaces;
};
typedef QSharedPointer<CampSettings> CampSettingsPtr;
#endif // CAMPSETTINGS_H

@ -0,0 +1,181 @@
#include "campsettingsform.h"
#include "ui_campsettingsform.h"
#include <settingsservice.h>
#include <QScroller>
#include <QMessageBox>
#include <QHeaderView>
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);
QList<ComboData> vatTypes;
vatTypes << ComboData(Enums::NONE, tr("None"))
<< ComboData(Enums::HIGH, tr("High"))
<< ComboData(Enums::FIRST_LOWER, tr("First lower"))
<< ComboData(Enums::SECOND_LOWER, tr("Second lower"));
registerBinding(ui->vatType, vatTypes);
}
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 = nullptr);
~CampSettingsForm() override;
// IForm interface
public slots:
bool saveRecord() override;
// IForm interface
public:
void loadEntity() override;
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,343 @@
<?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_24x24.png</normaloff>:/icons/new_24x24.png</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_24x24.png</normaloff>:/icons/remove_24x24.png</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_24x24.png</normaloff>:/icons/ok_24x24.png</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_24x24.png</normaloff>:/icons/filter_24x24.png</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_24x24.png</normaloff>:/icons/new_24x24.png</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_24x24.png</normaloff>:/icons/remove_24x24.png</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>
<item row="8" column="0">
<widget class="QLabel" name="label_6">
<property name="text">
<string>Vat type</string>
</property>
</widget>
</item>
<item row="8" column="1">
<widget class="QComboBox" name="vatType"/>
</item>
</layout>
</widget>
</item>
</layout>
</widget>
<resources>
<include location="../../core/rc.qrc"/>
</resources>
<connections/>
</ui>

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

Loading…
Cancel
Save