Compare commits

...

118 Commits

Author SHA1 Message Date
pepa 529f7f6e7d Repository of LimeReport submodule has been changed. 2023-05-03 10:16:35 +02:00
pepa ecf0815d9f Removed LimeReport submodule 2023-05-03 10:11:16 +02:00
pepa 53b6b66cc8 Forgotten file. 2023-04-28 22:26:16 +02:00
pepa d699ce79f7 Build system changed to Cmake, ORM changed to QxORM, Qt6 compatibility. 2023-04-28 22:25:29 +02:00
pepa 30e6180c82 closes #4: Allowed to multiselect items on voucher and delete them via context menu or Ctrl+Del shortcut. 2021-05-10 13:23:54 +02:00
pepa ab20fe9b34 Added setting for hide control for item count on shop form. 2021-01-29 22:09:34 +01:00
pepa ad9a66ab32 Added setting for default VAT type on Direct sell dialog. Fixed some compiler warnings. 2020-07-01 22:09:40 +02:00
jony 43e95eeb6f New Reports 2019-07-14 22:05:59 +02:00
pepa 4f2380f3db Added checkbox for select all items from saved receipt. 2019-07-14 15:53:58 +02:00
pepa c8658ba77f Implemented vat rate settings for Camp module. 2019-07-02 21:20:27 +02:00
pepa 32a836d3cf Fixed people prices recalculation. 2019-07-01 20:26:04 +02:00
pepa bb5b136aea Optimized loading of vouchers for Paid Vouchers Dialog. 2019-05-23 21:16:20 +02:00
pepa 2f1250e61d Fixed double print of bill. 2018-06-20 22:26:28 +02:00
pepa ee5130f719 Added button for report dialog to shop. 2018-06-19 21:23:34 +02:00
pepa d5844ab73d Button OK on pay dialog is now bigger. 2018-06-19 20:40:45 +02:00
pepa 65df276e7b Addresses are now sorted in combos. 2018-06-19 20:29:31 +02:00
pepa da9b062dbb Camp and Shop now shows data for actual season only. 2018-06-19 20:19:54 +02:00
pepa b113d5fca1 Added setting for bill double printing. 2018-06-19 19:55:18 +02:00
pepa dd39ebb5cb Merge branch 'master' of https://git.bukova.info/repos/git/prodejna 2018-06-19 19:21:06 +02:00
pepa 1c22eb3c0a Fixed MSVC 2012 build. 2018-06-19 19:20:37 +02:00
jony 6b4c20eccf Updated czech translations 2018-06-13 09:36:50 +02:00
pepa 0bca412d27 Adding reports without recompilation now possible. 2018-05-23 14:50:55 +02:00
pepa 653f8eac30 Added dashboard to Shop plugin. 2018-05-23 14:11:56 +02:00
pepa 22936f2a3f Added support for dashboard. 2018-05-23 13:10:58 +02:00
pepa 5794510bd2 Shop - disabled gesture scrolling on grids. Increased scrollbar widths. 2018-05-23 12:09:57 +02:00
pepa 34e1585327 Shop - improved commodity search with bar code scanner. 2018-05-23 12:00:24 +02:00
pepa 0ddf8bce92 Commodity - added setting for translate czech chars to numbers (bar code scanner fix). 2018-05-23 11:59:26 +02:00
pepa fe3602fcfc Added support for default sorting. Commodity are sorted by name by default. 2018-05-10 16:11:05 +02:00
pepa b69637165d Fixed barcode scanner issue on Windows with czech keyboard. 2018-05-10 15:06:27 +02:00
pepa b8ed333c3a Added support for Value Added Tax. 2017-10-13 12:58:26 +02:00
pepa 8e7137f3bb Fixed saving of QDecDouble numbers. 2017-10-13 12:53:15 +02:00
pepa 5ebea2f7c9 Allow running only one instance of application. 2017-08-22 12:33:57 +02:00
pepa 6f30949343 Improved visual style of favorite buttons. 2017-08-21 14:43:41 +02:00
pepa 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.
2017-08-21 14:16:43 +02:00
pepa eff4190c99 Merge branch 'master' of https://git.bukova.info/repos/git/prodejna 2017-08-15 13:27:21 +02:00
pepa c7d7886d0e Camp wizard is now accepted on close report preview. 2017-08-15 13:26:56 +02:00
pepa 9efa6c52bb SVG icons replaced by PNG on report viewer and report dialog. 2017-08-14 11:11:43 +02:00
pepa b10f21ad3c Merge branch 'master' of https://git.bukova.info/repos/git/prodejna 2017-06-23 15:09:36 +02:00
pepa b56e58146a SVG icons replaced by PNG. Caused huge memory allocation on Windows. 2017-06-23 15:08:56 +02:00
jony c782d89c72 Fixed report layout and fonts 2017-06-15 17:44:08 +02:00
pepa 562268afa7 Fixed logo scaling on accommodation document.
closes #303
2017-06-14 11:05:39 +02:00
pepa 1df897e5c8 Fixed price calculation in camp module. UI fixes.
closes #309
2017-06-14 11:04:57 +02:00
pepa b83e1ee56e Fixed generation of translation files. 2017-06-09 10:34:31 +02:00
pepa c17b3b6d92 Fixed CampGrid class definition. Fixed application translation. 2017-06-09 10:31:36 +02:00
jony bce139d7cd Added new translation 2017-06-09 10:12:23 +02:00
pepa e724a3b234 Merge branch 'master' of https://git.bukova.info/repos/git/prodejna 2017-06-08 22:16:44 +02:00
jony 50ac5238da Added new settings for program owner (web,email, phone) 2017-06-08 22:16:18 +02:00
jony 5848bb5609 fixed application crash when loading plugin 2017-06-08 22:14:19 +02:00
jony 8406dc584f Updated translation 2017-06-08 22:13:26 +02:00
pepa 761fcad3b7 Fixed MSVC2012 build 2017-06-08 22:11:25 +02:00
jony a33992b9b9 Added English version of accommodation document. Added translations. Fixed bug on adding camp to voucher. 2017-06-08 21:23:14 +02:00
pepa cc6111d09f Added sales to people. Print button on Camp wizard is now functional. Added item grids below Camp main grid. 2017-06-08 14:24:33 +02:00
pepa e5b33fa973 Added possibility to add custom widget to GridForm. Small fix in ReportDialog. 2017-06-08 14:21:55 +02:00
pepa cf937aee96 Logo on accommodation document is now loaded from settings. 2017-06-07 16:13:31 +02:00
pepa 47e21a85d7 Merge branch 'master' of https://git.bukova.info/repos/git/prodejna 2017-06-07 15:57:35 +02:00
pepa 8b99eea25a Added edit and pay functionality to camp module. 2017-06-07 15:57:15 +02:00
pepa d163a92293 Added possibility for creating vouchers from other module. 2017-06-07 15:54:13 +02:00
pepa 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.
2017-06-07 15:51:33 +02:00
jony fe53d90d50 Added camp accommodation document 2017-06-05 22:19:38 +02:00
pepa b916d626d1 Fixed MSVS 2012 build 2017-05-31 22:14:31 +02:00
pepa 27ec7282eb Merge branch 'master' of https://git.bukova.info/repos/git/prodejna 2017-05-31 21:20:05 +02:00
pepa f6bcb86aab Application adds path to plugins to environment variable PATH on startup. Plugin loading is working correct now. 2017-05-31 19:08:01 +02:00
pepa b397d9382d Merge branch 'master' of https://git.bukova.info/repos/git/prodejna 2017-05-31 16:16:39 +02:00
pepa 13d90445cc Camp wizard is now able to open from shop plugin 2017-05-31 16:16:22 +02:00
pepa 397ec82d06 Added seller interface for preparing shop items from other plugins. 2017-05-31 16:11:15 +02:00
Zdenek Jonak 33913c3b42 Updated Czech translation 2017-05-30 21:19:58 +02:00
jony 44c916cb68 Changed order of country data and used short name of country. refs #300 2017-05-30 19:56:11 +02:00
pepa 1e785fd488 Added report variable filler. 2017-05-30 10:38:02 +02:00
pepa 37b2dd7246 Added logo to settings. Small bugfixes. 2017-05-30 09:12:40 +02:00
pepa c3598673c6 Improved camp wizard UI. 2017-05-29 22:35:51 +02:00
pepa 328352f91a Improved permission checks. 2017-05-29 22:09:03 +02:00
pepa b0f129f38d Implemented camp wizard and service methods for camp calculation. 2017-05-29 21:40:22 +02:00
pepa 9a087e1874 Added protected method GridForm::addRow. Increased settings form size. 2017-05-29 21:37:15 +02:00
pepa b941acf9a0 Improved work with number series. Added season to voucher record. 2017-05-29 14:08:06 +02:00
pepa 87290d4be4 Changed first name and last name order when displaying address in combos. 2017-05-21 16:54:49 +02:00
pepa d53fed72d8 Fixed bug on empty database. 2017-05-21 16:43:12 +02:00
pepa 6a042c46a1 Implemented first page of camp wizard. 2017-05-20 23:40:57 +02:00
pepa 9c30d416e0 Merge branch 'master' of https://git.bukova.info/repos/git/prodejna 2017-05-20 21:26:56 +02:00
jony 09899d618c translation support for camp plugin 2017-05-19 21:31:17 +02:00
pepa 80c9d21576 Merge branch 'master' of https://git.bukova.info/repos/git/prodejna 2017-05-19 14:36:56 +02:00
pepa 0608e277e7 Added camp service class. 2017-05-19 14:36:41 +02:00
jony 7cfeac3f81 added translation of camp plugin to resource file 2017-05-19 14:21:18 +02:00
jony 22ec64e9f4 Merge branch 'master' of https://git.bukova.info/repos/git/prodejna 2017-05-18 21:21:38 +02:00
Zdenek Jonak 0fd0d53c0b czech translation update 2017-05-16 21:24:49 +02:00
jony 1d393cf3fb Merge branch 'master' of https://git.bukova.info/repos/git/prodejna 2017-05-14 22:06:23 +02:00
jony 3c588cd8cf eet is enabled by default 2017-05-14 22:06:09 +02:00
pepa 123aefdab5 Added wizard for camp records. 2017-05-13 21:57:11 +02:00
pepa cd4d58749a Fixed camp settings saving. Added about messagebox. Methods IGridForm::handleNewRecord and IGridForm::handleEditRecord are virtual now. 2017-05-12 14:33:14 +02:00
pepa d5ead1b187 Added country combo to addressbook. Addressbook plugin depends on Countryregister which must be loaded first. 2017-05-08 14:03:51 +02:00
pepa 4c00364698 Added settings for Camp module. Changed Camp data model. 2017-05-07 23:41:36 +02:00
pepa 87ec7098ff Fixed saving of enums to json settings. Added global enum for rounding. 2017-05-07 23:40:17 +02:00
pepa 78c80199b2 Fixed decimal point issue in QDecDouble constructor from double. 2017-05-07 23:38:46 +02:00
pepa 50ecd60c9a Inline editing of QDecDouble in AutoTableModel now possible. 2017-05-07 23:37:30 +02:00
pepa 0e803c23cb Import dialog and import progress moved to core library. 2017-05-06 23:27:54 +02:00
jony 25c481f5f1 Country register plugin created 2017-05-03 22:23:49 +02:00
jony a0f325708b Updated czech translations 2017-05-03 20:30:56 +02:00
pepa cb67b48138 Merge branch 'master' of https://git.bukova.info/repos/git/prodejna 2017-04-25 21:40:03 +02:00
pepa af9edeafae Added postregister plugin. 2017-04-25 21:39:47 +02:00
pepa dbbf4a0a67 Import progress is shown while import. 2017-04-25 21:36:23 +02:00
pepa 39ab4b74e2 Disable add/edit/delete buttons now possible. 2017-04-25 21:30:51 +02:00
jony f85b1c75d3 After unsuccessfull search is now text cleared. Useful for barcode scanners. closes #299 2017-04-25 20:48:57 +02:00
jony 8a651871d0 Changed sorting for payed bills to descending. closes #298 2017-04-25 20:37:22 +02:00
jony 6e2ee642ce Merge branch 'master' of https://git.bukova.info/repos/git/prodejna 2017-04-24 19:50:29 +02:00
jony fc2ed29d25 Changed layout to three columns. Closes #297 2017-04-24 19:50:04 +02:00
pepa 8814a0e2a1 Allowed to add custom buttons/widget to grid toolbar.
Add possibility to hide plugin from navigation bar.
2017-04-21 23:41:29 +02:00
pepa fe5eac9cd9 Added support for import data from file. 2017-04-21 23:35:57 +02:00
pepa ace78877a3 Added camp plugin. Plugin accommodation removed from project file. 2017-04-19 22:38:49 +02:00
pepa afb2218150 Improved shop UI 2017-04-06 21:44:36 +02:00
pepa da3aa2987c Fixed bug when count of favorites buttons changed. 2017-04-06 21:20:16 +02:00
pepa 03fd0adf12 Item is added to voucher if found and on enter key pressed in search edit (barcode reader optimization). 2017-04-04 22:33:39 +02:00
pepa 4b3a2e1dd7 Fixed crash on add item via favorite button after application start.
Favorite buttons has short name labels.
closes #296
refs #293
2017-04-04 21:57:36 +02:00
jony aa91acbe17 Reports for commodities. 2017-03-29 22:08:42 +02:00
jony de665f9659 EET mandatory fields added to bill. closes #291 2017-03-29 20:20:17 +02:00
pepa b0d67cf93a Added favorite buttons to shop form.
closes #276
2017-03-28 22:13:54 +02:00
jony 7aa00f1b1e Fixed build on linux 2017-03-28 21:02:38 +02:00
jony 31beac537b Merge branch 'master' of https://git.bukova.info/repos/git/prodejna 2017-03-27 22:27:39 +02:00
jony ae95ae1bda Merge remote branch 'origin/master' 2017-03-27 22:21:47 +02:00
jony 21bb6696d6 Fixed compile problem 2017-03-27 22:19:51 +02:00
586 changed files with 22812 additions and 130407 deletions
+2
View File
@@ -0,0 +1,2 @@
cmake*
build
+9
View File
@@ -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
+3
View File
@@ -0,0 +1,3 @@
add_subdirectory(qdecimal)
add_subdirectory(QxOrm)
add_subdirectory(LimeReport)
Vendored Submodule
+1
Submodule 3rdparty/LimeReport added at b1bfd131ad
Vendored Submodule
+1
Submodule 3rdparty/QxOrm added at 975c3b5ad3
Vendored Submodule
+1
Submodule 3rdparty/qdecimal added at 31d650e0e6
+17
View File
@@ -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)
-14
View File
@@ -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;
}
-14
View File
@@ -1,14 +0,0 @@
#include "accgrid.h"
#include "tablemodel.h"
AccGrid::AccGrid(QWidget *parent) :
GridForm<Person>(parent)
{
setTableModel(new TableModel());
}
AccGrid::~AccGrid()
{
}
-18
View File
@@ -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
-41
View File
@@ -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;
}
*/
-37
View File
@@ -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
-20
View File
@@ -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" : []
}
-46
View File
@@ -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
-12
View File
@@ -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
-28
View File
@@ -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();
}
-19
View File
@@ -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
-5
View File
@@ -1,5 +0,0 @@
<RCC>
<qresource prefix="/">
<file>icons/accPlugin.svg</file>
</qresource>
</RCC>
-34
View File
@@ -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);
}
-30
View File
@@ -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
-62
View File
@@ -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>
-8
View File
@@ -1,8 +0,0 @@
#ifndef ACCOMMODATIONDATA_H
#define ACCOMMODATIONDATA_H
#include "address.h"
#include "person.h"
#endif // ACCOMMODATIONDATA_H
-58
View File
@@ -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;
}
-55
View File
@@ -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
-49
View File
@@ -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);
}
}
-44
View File
@@ -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
-8
View File
@@ -1,8 +0,0 @@
#include "tablemodel.h"
TableModel::TableModel(QObject *parent)
:AutoTableModel<Person>(parent)
{
}
-18
View File
@@ -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
+53
View File
@@ -0,0 +1,53 @@
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
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
qdecimal
decnumber
QxOrm
core
countryregister
)
install(TARGETS addressbook
LIBRARY DESTINATION ../plugins)
+2 -2
View File
@@ -26,8 +26,8 @@ protected:
// IPlugin interface
public:
virtual QIcon pluginIcon();
QTranslator *translator();
QIcon pluginIcon() override;
QTranslator *translator() override;
};
+7 -3
View File
@@ -8,7 +8,7 @@
"default" : "",
"CZ" : ""
},
"schemaVersion" : 1,
"schemaVersion" : 2,
"sql" : [
"CREATE TABLE \"AddressbookData\" (
\"id\" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
@@ -21,10 +21,14 @@
\"addressCity\" TEXT NULL,
\"addressStreet\" TEXT NULL,
\"addressHouseNumber\" TEXT NULL,
\"addressZipCode\" TEXT NULL);"
\"addressZipCode\" TEXT NULL);
",
"ALTER TABLE AddressbookData ADD \"country\" INTEGER NULL;
"
],
"dependencies" : [],
"dependencies" : [ "COUNTRYREGISTER" ],
"translations" : {
"CZ" : {
"title" : "Titul",
-45
View File
@@ -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
+9
View File
@@ -2,6 +2,7 @@
#define ADDRESSBOOK_GLOBAL_H
#include <QtCore/qglobal.h>
#include <QxOrm.h>
#if defined(ADDRESSBOOK_LIBRARY)
# define ADDRESSBOOKSHARED_EXPORT Q_DECL_EXPORT
@@ -9,4 +10,12 @@
# define ADDRESSBOOKSHARED_EXPORT Q_DECL_IMPORT
#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
+8
View File
@@ -1,5 +1,7 @@
#include <data/countrydata.h>
#include "addressbookform.h"
#include "ui_addressbookform.h"
#include <data/countrydata.h>
AddressbookForm::AddressbookForm(QWidget *parent) :
AutoForm<AddressbookData>(parent),
@@ -22,3 +24,9 @@ AddressbookForm::~AddressbookForm()
{
delete ui;
}
void AddressbookForm::registerCombos()
{
Service<CountryData> srv;
registerBinding(ui->country, ComboData::createComboData(srv.all()));
}
+5 -2
View File
@@ -4,7 +4,6 @@
#include <QWidget>
#include <autoform.h>
#include "data/addressbookdata.h"
#include "addressbook-odb.hxx"
namespace Ui {
class AddressbookForm;
@@ -16,10 +15,14 @@ class AddressbookForm : public AutoForm<AddressbookData>
public:
explicit AddressbookForm(QWidget *parent = 0);
~AddressbookForm();
~AddressbookForm() override;
private:
Ui::AddressbookForm *ui;
// FormBinder interface
protected:
void registerCombos() override;
};
+32 -2
View File
@@ -6,14 +6,17 @@
<rect>
<x>0</x>
<y>0</y>
<width>400</width>
<height>300</height>
<width>624</width>
<height>363</height>
</rect>
</property>
<property name="windowTitle">
<string>Form</string>
</property>
<layout class="QFormLayout" name="formLayout">
<property name="fieldGrowthPolicy">
<enum>QFormLayout::ExpandingFieldsGrow</enum>
</property>
<item row="0" column="0">
<widget class="QLabel" name="label">
<property name="text">
@@ -115,8 +118,35 @@
</property>
</widget>
</item>
<item row="10" column="0">
<widget class="QLabel" name="label_10">
<property name="text">
<string>Country</string>
</property>
</widget>
</item>
<item row="10" column="1">
<widget class="QComboBox" name="country">
<property name="editable">
<bool>true</bool>
</property>
</widget>
</item>
</layout>
</widget>
<tabstops>
<tabstop>title</tabstop>
<tabstop>firstName</tabstop>
<tabstop>lastName</tabstop>
<tabstop>birthDate</tabstop>
<tabstop>idCardNumber</tabstop>
<tabstop>ztp</tabstop>
<tabstop>addressCity</tabstop>
<tabstop>addressStreet</tabstop>
<tabstop>addressHouseNumber</tabstop>
<tabstop>addressZipCode</tabstop>
<tabstop>country</tabstop>
</tabstops>
<resources/>
<connections/>
</ui>
-1
View File
@@ -3,7 +3,6 @@
#include <core.h>
#include "data/addressbookdata.h"
#include "addressbook-odb.hxx"
class AddressbookGrid : public GridForm<AddressbookData>
{
+16 -4
View File
@@ -1,6 +1,5 @@
#include <service.h>
#include "addressbookservice.h"
#include "addressbook-odb.hxx"
AddressBookService::AddressBookService()
{
@@ -10,9 +9,22 @@ AddressBookService::~AddressBookService()
{
}
QList<QSharedPointer<AddressbookData> > AddressBookService::all(const QString &where)
AddressbookDataPtr AddressBookService::copyAddress(AddressbookDataPtr address)
{
Service<AddressbookData> srv;
return srv.all(where);
AddressbookDataPtr newAddress(new AddressbookData());
newAddress->setTitle(address->title());
newAddress->setFirstName(address->firstName());
newAddress->setLastName(address->lastName());
newAddress->setBirthDate(address->birthDate());
newAddress->setIdCardNumber(address->idCardNumber());
newAddress->setZtp(address->ztp());
newAddress->setAddressStreet(address->addressStreet());
newAddress->setAddressHouseNumber(address->addressHouseNumber());
newAddress->setAddressZipCode(address->addressZipCode());
newAddress->setAddressCity(address->addressCity());
//newAddress->setCountry(address->country());
return newAddress;
}
+3 -2
View File
@@ -3,17 +3,18 @@
#include <QList>
#include <QSharedPointer>
#include <service.h>
#include "data/addressbookdata.h"
#include "addressbook_global.h"
class ADDRESSBOOKSHARED_EXPORT AddressBookService
class ADDRESSBOOKSHARED_EXPORT AddressBookService : public Service<AddressbookData>
{
public:
AddressBookService();
~AddressBookService();
QList<QSharedPointer<AddressbookData> > all(const QString &where = "");
AddressbookDataPtr copyAddress(AddressbookDataPtr address);
};
#endif // ADDRESSBOOKSERVICE_H
+43 -4
View File
@@ -1,8 +1,30 @@
#include <data/countrydata.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)
:ComboItem(parent)
{
m_ztp = false;
}
QString AddressbookData::title() const
@@ -95,25 +117,42 @@ void AddressbookData::setAddressZipCode(const QString &addressZipCode)
{
m_addressZipCode = addressZipCode;
}
int AddressbookData::id() const
long AddressbookData::id() const
{
return m_id;
}
void AddressbookData::setId(int id)
void AddressbookData::setId(long id)
{
m_id = id;
}
QSharedPointer<QObject> AddressbookData::country() const
{
return m_country;
}
void AddressbookData::setCountry(const QSharedPointer<QObject> &country)
{
if (qobject_cast<CountryData*>(country.data()) != NULL)
{
m_country = qSharedPointerDynamicCast<CountryData, QObject>(country);
}
}
bool AddressbookData::eq(ComboItem *other)
{
AddressbookData *adb = qobject_cast<AddressbookData*>(other);
return adb != NULL && adb->id() == this->id();
return adb != nullptr && adb->id() == this->id();
}
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" };
}
+24 -16
View File
@@ -1,24 +1,22 @@
#ifndef ADDRESSBOOKDATA_H
#define ADDRESSBOOKDATA_H
#include "../addressbook_global.h"
#include <data/comboitem.h>
#include <data/countrydata.h>
#include <QObject>
#include <QString>
#include <QDate>
#include <odb/core.hxx>
#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
{
Q_OBJECT
QX_REGISTER_FRIEND_CLASS(AddressbookData)
Q_PROPERTY(QString title READ title WRITE setTitle)
Q_PROPERTY(QString firstName READ firstName WRITE setFirstName)
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 addressHouseNumber READ addressHouseNumber WRITE setAddressHouseNumber)
Q_PROPERTY(QString addressZipCode READ addressZipCode WRITE setAddressZipCode)
Q_PROPERTY(QSharedPointer<QObject> country READ country WRITE setCountry)
public:
AddressbookData(QObject *parent = 0);
QString title() const;
void setTitle(const QString &title);
@@ -62,13 +62,16 @@ public:
QString addressZipCode() const;
void setAddressZipCode(const QString &addressZipCode);
int id() const;
void setId(int id);
long id() const;
void setId(long id);
QSharedPointer<QObject> country() const;
void setCountry(const QSharedPointer<QObject> &country);
Q_INVOKABLE QStringList eagerLoad();
private:
friend class odb::access;
#pragma db id auto
int m_id;
long m_id{0};
QString m_title;
QString m_firstName;
QString m_lastName;
@@ -79,11 +82,16 @@ private:
QString m_addressStreet;
QString m_addressHouseNumber;
QString m_addressZipCode;
CountryDataPtr m_country;
// ComboItem interface
public:
virtual bool eq(ComboItem *other);
virtual QString toString();
bool eq(ComboItem *other) override;
QString toString() override;
};
typedef QSharedPointer<AddressbookData> AddressbookDataPtr;
QX_REGISTER_HPP_ADDR(AddressbookData, ComboItem, 0)
#endif // ADDRESSBOOKDATA_H
Binary file not shown.
@@ -58,5 +58,10 @@
<source>ZIP</source>
<translation>PSČ</translation>
</message>
<message>
<location filename="../addressbookform.ui" line="121"/>
<source>Country</source>
<translation>Stát</translation>
</message>
</context>
</TS>
+38
View File
@@ -0,0 +1,38 @@
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
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)
target_link_libraries(prodejna
Qt::Core
Qt::Gui
Qt::Widgets
Qt::Sql
core
)
+31
View File
@@ -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;
}
+21
View File
@@ -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
-68
View File
@@ -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
+5 -2
View File
@@ -6,8 +6,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>408</width>
<height>220</height>
<width>427</width>
<height>260</height>
</rect>
</property>
<property name="windowTitle">
@@ -64,6 +64,9 @@
<item>
<widget class="QWidget" name="widget_2" native="true">
<layout class="QFormLayout" name="formLayout">
<property name="fieldGrowthPolicy">
<enum>QFormLayout::ExpandingFieldsGrow</enum>
</property>
<item row="0" column="0">
<widget class="QLabel" name="label_2">
<property name="text">
+35 -6
View File
@@ -1,24 +1,53 @@
#include "mainwindow.h"
#include <QApplication>
#include <QDesktopWidget>
//#include <QDesktopWidget>
#include <QSharedPointer>
#include <QTranslator>
#include <QLibraryInfo>
#include <QMessageBox>
#include "application.h"
#ifdef _WIN32
#include <Windows.h>
#endif
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;
qtTranslator.load("qt_" + QLocale::system().name(),
QLibraryInfo::location(QLibraryInfo::TranslationsPath));
if (qtTranslator.load("qt_" + QLocale::system().name(),
QLibraryInfo::path(QLibraryInfo::TranslationsPath))) {
qDebug() << "Cannot load translation";
}
a.installTranslator(&qtTranslator);
QTranslator myappTranslator;
myappTranslator.load(":/translations/prodejna_" + QLocale::system().name());
if (myappTranslator.load(":/translations/prodejna_" + QLocale::system().name())) {
qDebug() << "Cannot load translation";
}
a.installTranslator(&myappTranslator);
MainWindow w;
w.move(QApplication::desktop()->screen()->rect().center() - w.rect().center());
w.showMaximized();
return a.exec();
+138 -24
View File
@@ -8,6 +8,7 @@
#include <QVBoxLayout>
#include <QFileDialog>
#include <QDebug>
#include <QMessageBox>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
@@ -19,6 +20,8 @@ MainWindow::MainWindow(QWidget *parent) :
m_loginDialog = new LoginDialog(this);
ui->tabWidget->setVisible(false);
QFile styleFile(":/style.css");
if (styleFile.open(QIODevice::ReadOnly | QIODevice::Text))
@@ -29,9 +32,10 @@ MainWindow::MainWindow(QWidget *parent) :
connect(m_loginDialog, &LoginDialog::accepted, [this]{
PermissionService service;
QSharedPointer<User> u = service.loadUser(m_loginDialog->login());
m_lblUser->setText(u->name());
m_loginDialog->reset();
Context::instance().setCurrentUser(u);
openDashboard();
m_loginDialog->reset();
});
connect(m_loginDialog, &LoginDialog::rejected, [this]{
@@ -42,7 +46,7 @@ MainWindow::MainWindow(QWidget *parent) :
int i = 0;
foreach (IPlugin *plugin, Context::instance().plugins()) {
if (plugin->pluginId() != "CORE")
if (plugin->pluginId() != "CORE" && plugin->showIcon())
{
QToolButton *plugButton = new QToolButton(this);
plugButton->setText(plugin->pluginName());
@@ -58,11 +62,7 @@ MainWindow::MainWindow(QWidget *parent) :
}
((QVBoxLayout*)ui->navigation->layout())->addStretch(1);
if (Context::instance().db() != NULL)
{
ui->navigation->setEnabled(true);
}
}
MainWindow::~MainWindow()
@@ -81,26 +81,13 @@ void MainWindow::openPlugin()
QVariant var = QObject::sender()->property(PLUGIN_INDEX);
IPlugin *plugin = Context::instance().plugins().at(var.toInt());
for (int i = 0; i < ui->tabWidget->count(); i++) {
if (ui->tabWidget->widget(i)->objectName() == plugin->pluginId()) {
ui->tabWidget->setCurrentIndex(i);
return;
}
}
if (plugin->ui() != NULL)
{
ui->tabWidget->addTab(plugin->ui(), plugin->pluginIcon(), plugin->pluginName());
ui->tabWidget->widget(ui->tabWidget->count() - 1)->setObjectName(plugin->pluginId());
ui->tabWidget->setCurrentIndex(ui->tabWidget->count() - 1);
}
openPlugin(plugin);
}
void MainWindow::on_actionOpen_database_triggered()
{
/*QFileDialog dialog(this);
dialog.setNameFilter(tr("Database Files (*.db)"));
dialog.setWindowTitle(tr("Open Database"));*/
closeAllTabs();
closeDashboard();
QString dbFile = QFileDialog::getOpenFileName(this, "Open Database", "", "Database Files (*.db)");
if (!dbFile.isEmpty())
@@ -114,10 +101,21 @@ void MainWindow::on_actionOpen_database_triggered()
void MainWindow::on_tabWidget_tabCloseRequested(int index)
{
ui->tabWidget->removeTab(index);
if (ui->tabWidget->count() == 0)
{
ui->dashboard->setVisible(true);
ui->tabWidget->setVisible(false);
refreshDashboard();
}
}
void MainWindow::on_actionLogin_triggered()
{
closeAllTabs();
closeDashboard();
QSharedPointer<User> u;
Context::instance().setCurrentUser(u);
m_lblUser->setText("");
@@ -127,7 +125,7 @@ void MainWindow::on_actionLogin_triggered()
void MainWindow::showEvent(QShowEvent *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();
}
@@ -144,3 +142,119 @@ void MainWindow::on_actionSettings_triggered()
SettingsForm *settings = new SettingsForm(this);
settings->show();
}
void MainWindow::on_actionPost_register_triggered()
{
IPlugin *plugZipCodes = Context::instance().plugin("POSTREGISTER");
if (plugZipCodes != 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 - 2017 Josef Rokos, Zdenek Jonák"));
}
+18 -1
View File
@@ -9,6 +9,8 @@
#define PLUGIN_INDEX "plug_index"
class IPlugin;
namespace Ui {
class MainWindow;
}
@@ -33,14 +35,29 @@ private slots:
void on_actionSettings_triggered();
void on_actionPost_register_triggered();
void on_actionCountry_register_triggered();
void on_actionAbout_Qt_triggered();
void on_actionAbout_triggered();
private:
Ui::MainWindow *ui;
LoginDialog *m_loginDialog;
QLabel *m_lblUser;
QList<QFrame*> m_dbWidgets;
void openPlugin(IPlugin *plugin);
void closeDashboard();
void openDashboard();
void refreshDashboard();
void closeAllTabs();
// QWidget interface
protected:
void showEvent(QShowEvent *evt);
void showEvent(QShowEvent *evt) override;
void closeEvent(QCloseEvent *evt) override;
};
+115 -2
View File
@@ -11,7 +11,7 @@
</rect>
</property>
<property name="windowTitle">
<string>MainWindow</string>
<string>Prodejna</string>
</property>
<property name="windowIcon">
<iconset resource="appRc.qrc">
@@ -52,6 +52,83 @@
</property>
</widget>
</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="label_2">
<property name="text">
<string>Prodejna 2.0</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
</item>
</layout>
</widget>
</item>
</layout>
</widget>
<widget class="QMenuBar" name="menuBar">
@@ -60,7 +137,7 @@
<x>0</x>
<y>0</y>
<width>1000</width>
<height>19</height>
<height>42</height>
</rect>
</property>
<widget class="QMenu" name="menuFile">
@@ -72,7 +149,23 @@
<addaction name="separator"/>
<addaction name="actionExit"/>
</widget>
<widget class="QMenu" name="menuRegisters">
<property name="title">
<string>&amp;Registers</string>
</property>
<addaction name="actionPost_register"/>
<addaction name="actionCountry_register"/>
</widget>
<widget class="QMenu" name="menuHelp">
<property name="title">
<string>Help</string>
</property>
<addaction name="actionAbout"/>
<addaction name="actionAbout_Qt"/>
</widget>
<addaction name="menuFile"/>
<addaction name="menuRegisters"/>
<addaction name="menuHelp"/>
</widget>
<widget class="QToolBar" name="mainToolBar">
<attribute name="toolBarArea">
@@ -116,6 +209,26 @@
<string>Settings</string>
</property>
</action>
<action name="actionPost_register">
<property name="text">
<string>&amp;Post register</string>
</property>
</action>
<action name="actionCountry_register">
<property name="text">
<string>&amp;Country register</string>
</property>
</action>
<action name="actionAbout">
<property name="text">
<string>&amp;About</string>
</property>
</action>
<action name="actionAbout_Qt">
<property name="text">
<string>About &amp;Qt</string>
</property>
</action>
</widget>
<layoutdefault spacing="6" margin="11"/>
<resources>
+9
View File
@@ -16,8 +16,17 @@
}
#navigation QToolButton {
background-color: dimgray;
color: white;
font-weight: bold;
min-width: 90px;
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;
}
Binary file not shown.
+131
View File
@@ -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>
Binary file not shown.
-68
View File
@@ -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>
+83
View File
@@ -0,0 +1,83 @@
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
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
qdecimal
decnumber
QxOrm
core
addressbook
services
shop
)
install(TARGETS addressbook
LIBRARY DESTINATION ../plugins)
+27
View File
@@ -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());
}
+27
View File
@@ -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
+105
View File
@@ -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>
+29
View File
@@ -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;
}
+29
View File
@@ -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
+146
View File
@@ -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" }
]
}
+21
View File
@@ -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
+14
View File
@@ -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;
}
+24
View File
@@ -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
+19
View File
@@ -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>
+165
View File
@@ -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.saveVoucher(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();
}
+38
View File
@@ -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
+6
View File
@@ -0,0 +1,6 @@
<RCC>
<qresource prefix="/">
<file>icons/campPlugin.svg</file>
<file>translations/camp_cs_CZ.qm</file>
</qresource>
</RCC>
+35
View File
@@ -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);
});
}
+17
View File
@@ -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
+411
View File
@@ -0,0 +1,411 @@
#include "campservice.h"
#include <settingsservice.h>
#include <seasonservice.h>
#include <numberseriesservice.h>
#include "campshopitem.h"
#include "campseller.h"
#include <cmath>
#ifdef _WIN32
double round(double value) { return value < 0 ? -std::floor(0.5 - value) : std::floor(0.5 + value); }
#endif
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()
{
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;
}
+45
View File
@@ -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() override;
IShopItemPtr shopItem(int itemId) override;
void addedToVoucher(int itemId, int countAdded) override;
ISeller *seller() override;
};
#endif // CAMPSERVICE_H
+59
View File
@@ -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()
{
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()
{
return m_id;
}
void CampShopItem::setId(long id)
{
m_id = id;
}
+36
View File
@@ -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() override;
QString name() override;
QString shortName() override;
QDecDouble unitPrice() override;
Enums::VatType vatType() override;
QString pluginId() 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
+497
View File
@@ -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();
});
}
+118
View File
@@ -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
+913
View File
@@ -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>
+141
View File
@@ -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);
}
+80
View File
@@ -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
+24
View File
@@ -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
+262
View File
@@ -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;
}
+125
View File
@@ -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
+85
View File
@@ -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;
}
+52
View File
@@ -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
+78
View File
@@ -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;
}
+48
View File
@@ -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
+143
View File
@@ -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);
}
+82
View File
@@ -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
+52
View File
@@ -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());
}
+28
View File
@@ -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
+59
View File
@@ -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

+83
View File
@@ -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;
}
+56
View File
@@ -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
+181
View File
@@ -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());
}
+51
View File
@@ -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
+343
View File
@@ -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