Zdenek Jonak 8 years ago
commit 31beac537b

@ -40,5 +40,10 @@ CREATE TABLE \"CommodityData\" (
"vat" : "DPH", "vat" : "DPH",
"count" : "Počet" "count" : "Počet"
} }
} },
"reports" : [
{ "name" : "Ceník", "description" : "Všechny položky v ceníku", "listReport" : true, "file" : "pokus.lrxml" },
{ "name" : "Nezpalcené účtenky", "description" : "Všechny nezaplacené účtenky", "listReport" : true, "file" : "pokus.lrxml" }
]
} }

@ -6,7 +6,7 @@
#iconset: https://www.iconfinder.com/iconsets/snipicons #iconset: https://www.iconfinder.com/iconsets/snipicons
QT += widgets sql QT += widgets sql printsupport
TARGET = core TARGET = core
TEMPLATE = lib TEMPLATE = lib
@ -59,7 +59,10 @@ SOURCES += \
data/season.cpp \ data/season.cpp \
seasonservice.cpp \ seasonservice.cpp \
numberseriesservice.cpp \ numberseriesservice.cpp \
settings/seasonnamedialog.cpp settings/seasonnamedialog.cpp \
reporting/report.cpp \
reporting/reportviewer.cpp \
reporting/reportdialog.cpp
HEADERS += core.h\ HEADERS += core.h\
core_global.h \ core_global.h \
@ -116,7 +119,10 @@ HEADERS += core.h\
data/season.h \ data/season.h \
seasonservice.h \ seasonservice.h \
numberseriesservice.h \ numberseriesservice.h \
settings/seasonnamedialog.h settings/seasonnamedialog.h \
reporting/report.h \
reporting/reportviewer.h \
reporting/reportdialog.h
unix { unix {
target.path = /usr/lib target.path = /usr/lib
@ -149,7 +155,9 @@ FORMS += \
filterdialog.ui \ filterdialog.ui \
settingsform.ui \ settingsform.ui \
settings/globalsettingsform.ui \ settings/globalsettingsform.ui \
settings/seasonnamedialog.ui settings/seasonnamedialog.ui \
reporting/reportviewer.ui \
reporting/reportdialog.ui
OTHER_FILES += \ OTHER_FILES += \
users/metaData.json \ users/metaData.json \
@ -160,6 +168,9 @@ CONFIG(debug, release|debug):DEFINES += _DEBUG
win32:CONFIG(release, debug|release):DEFINES += PLUGIN_ROOT=\\\"/plugins\\\" win32:CONFIG(release, debug|release):DEFINES += PLUGIN_ROOT=\\\"/plugins\\\"
else:unix:CONFIG(release, debug|release):DEFINES += PLUGIN_ROOT=\\\"/usr/lib/prodejna/plugins\\\" else:unix:CONFIG(release, debug|release):DEFINES += PLUGIN_ROOT=\\\"/usr/lib/prodejna/plugins\\\"
win32:CONFIG(release, debug|release):DEFINES += REPORT_ROOT=\\\"/reports\\\"
else:unix:CONFIG(release, debug|release):DEFINES += REPORT_ROOT=\\\"/usr/share/prodejna/reports\\\"
win32:CONFIG(release, debug|release): LIBS += -L$$OUT_PWD/../qdecimal/lib/ -lqdecimal -ldecnumber 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:win32:CONFIG(debug, debug|release): LIBS += -L$$OUT_PWD/../qdecimal/lib/ -lqdecimal -ldecnumber
else:unix: LIBS += -L$$OUT_PWD/../qdecimal/lib/ -lqdecimal -ldecnumber else:unix: LIBS += -L$$OUT_PWD/../qdecimal/lib/ -lqdecimal -ldecnumber
@ -167,4 +178,28 @@ else:unix: LIBS += -L$$OUT_PWD/../qdecimal/lib/ -lqdecimal -ldecnumber
INCLUDEPATH += $$PWD/../qdecimal/src INCLUDEPATH += $$PWD/../qdecimal/src
INCLUDEPATH += $$PWD/../qdecimal/decnumber INCLUDEPATH += $$PWD/../qdecimal/decnumber
unix{
ARCH_TYPE = unix
macx{
ARCH_TYPE = macx
}
linux{
!contains(QT_ARCH, x86_64){
ARCH_TYPE = linux32
}else{
ARCH_TYPE = linux64
}
}
}
win32 {
ARCH_TYPE = win32
}
win32:CONFIG(release, debug|release): LIBS += -L$$PWD/../../LimeReport/build/$${QT_VERSION}/$${ARCH_TYPE}/release/lib/ -llimereport
else:win32:CONFIG(debug, debug|release): LIBS += -L$$PWD/../../LimeReport/build/$${QT_VERSION}/$${ARCH_TYPE}/debug/lib/ -llimereport
else:unix: LIBS += -L$$PWD/../../LimeReport/build/$${QT_VERSION}/$${ARCH_TYPE}/debug/lib/ -llimereport
INCLUDEPATH += $$PWD/../../LimeReport/include
DEPENDPATH += $$PWD/../../LimeReport/include
TRANSLATIONS = translations/core_cs_CZ.ts TRANSLATIONS = translations/core_cs_CZ.ts

@ -21,5 +21,13 @@
#endif #endif
#endif #endif
#ifndef REPORT_ROOT
#ifdef _WIN32
#define REPORT_ROOT "/../../reports"
#else
#define REPORT_ROOT "/../reports"
#endif
#endif
#endif // DEFINE_H #endif // DEFINE_H

@ -0,0 +1 @@
<?xml version="1.0" ?><svg clip-rule="evenodd" fill-rule="evenodd" image-rendering="optimizeQuality" shape-rendering="geometricPrecision" text-rendering="geometricPrecision" viewBox="0 0 500 500" xmlns="http://www.w3.org/2000/svg"><defs><linearGradient gradientUnits="userSpaceOnUse" id="a" x1="345.552" x2="29.998" y1="227.99" y2="227.99"><stop offset="0" stop-color="#008BFF"/><stop offset="1" stop-color="#0af"/></linearGradient></defs><g><rect fill="#D5D6D6" height="389" rx="23" ry="22" width="250" x="210" y="35"/><rect fill="none" height="389" rx="23" ry="22" stroke="#434242" stroke-width="30" width="250" x="210" y="35"/><path d="M34 236l95 73c3 2 7 3 11 1 3-2 5-5 5-9v-42h191c5 0 10-5 10-10v-40c0-5-5-10-10-10h-191v-44c0-4-2-7-5-9-4-2-8-1-11 1l-95 73c-3 2-4 5-4 8s1 6 4 8z" fill="url(#a)" stroke="#434242" stroke-width="10"/><path d="M290 77l137-30c12-3 23 10 23 23l3 317c0 13-11 20-24 23l-136 40c-12 4-23-10-23-23l-3-327c0-13 11-21 23-23z" fill="#f5f5f5" stroke="#434242" stroke-width="10"/></g></svg>

After

Width:  |  Height:  |  Size: 1012 B

@ -0,0 +1,4 @@
<?xml version="1.0" ?><svg clip-rule="evenodd" fill-rule="evenodd" image-rendering="optimizeQuality" shape-rendering="geometricPrecision" text-rendering="geometricPrecision" viewBox="0 0 500 500" xmlns="http://www.w3.org/2000/svg"><defs><style type="text/css"><![CDATA[
.str0 {stroke:#434242;stroke-width:10;stroke-linejoin:round}
.fil0 {fill:url(#id0)}
]]></style><radialGradient cx="51%" cy="47%" fx="51%" fy="47%" id="id0"><stop offset="0" stop-color="#0af"/><stop offset="1" stop-color="#008BFF"/></radialGradient></defs><path class="fil0 str0" d="M366 193v7c0 6-5 10-10 10h-212c-5 0-10-4-10-10v-7c0-14-3-17-7-21-7-7-21-7-28 0l-64 64c-7 7-7 21 0 28l64 64c7 7 21 7 28 0 4-4 7-7 7-21v-7c0-6 5-10 10-10h212c5 0 10 4 10 10v7c0 14 3 17 7 21 7 7 21 7 28 0l64-64c7-7 7-21 0-28l-64-64c-7-7-21-7-28 0-4 4-7 7-7 21z" id="Layer_x0020_1"/></svg>

After

Width:  |  Height:  |  Size: 848 B

@ -0,0 +1 @@
<?xml version="1.0" ?><svg clip-rule="evenodd" fill-rule="evenodd" image-rendering="optimizeQuality" shape-rendering="geometricPrecision" text-rendering="geometricPrecision" viewBox="0 0 500 500" xmlns="http://www.w3.org/2000/svg"><defs><linearGradient gradientUnits="userSpaceOnUse" id="a" x1="401.544" x2="98.456" y1="98.456" y2="401.544"><stop offset="0" stop-color="#008BFF"/><stop offset="1" stop-color="#0af"/></linearGradient></defs><path d="M193 134h7c6 0 10 5 10 10v212c0 5-4 10-10 10h-7c-14 0-17 3-21 7-7 7-7 21 0 28l64 64c7 7 21 7 28 0l64-64c7-7 7-21 0-28-4-4-7-7-21-7h-7c-6 0-10-5-10-10v-212c0-5 4-10 10-10h7c14 0 17-3 21-7 7-7 7-21 0-28l-64-64c-7-7-21-7-28 0l-64 64c-7 7-7 21 0 28 4 4 7 7 21 7z" fill="url(#a)" stroke="#2B2A29" stroke-width="10"/></svg>

After

Width:  |  Height:  |  Size: 766 B

@ -0,0 +1,4 @@
<?xml version="1.0" ?><svg clip-rule="evenodd" fill-rule="evenodd" image-rendering="optimizeQuality" shape-rendering="geometricPrecision" text-rendering="geometricPrecision" viewBox="0 0 5000 5000" xmlns="http://www.w3.org/2000/svg"><defs><style type="text/css"><![CDATA[
.str0 {stroke:#434242;stroke-width:100}
.fil0 {fill:url(#id0)}
]]></style><linearGradient gradientUnits="userSpaceOnUse" id="id0" x1="3935.29" x2="1064.71" y1="3935.29" y2="1064.71"><stop offset="0" stop-color="#008BFF"/><stop offset="1" stop-color="#0af"/></linearGradient></defs><path class="fil0 str0" d="M3511 2253c136 136 136 358 0 494l-1450 1450c-78 78-205 78-283 0l-318-318c-97-97-97-256 0-354l1025-1025-1025-1025c-97-98-97-257 0-354l318-318c78-78 205-78 283 0l1450 1450z" id="Layer_x0020_1"/></svg>

After

Width:  |  Height:  |  Size: 789 B

@ -0,0 +1,4 @@
<?xml version="1.0" ?><svg clip-rule="evenodd" fill-rule="evenodd" image-rendering="optimizeQuality" shape-rendering="geometricPrecision" text-rendering="geometricPrecision" viewBox="0 0 5000 5000" xmlns="http://www.w3.org/2000/svg"><defs><style type="text/css"><![CDATA[
.str0 {stroke:#434242;stroke-width:100}
.fil0 {fill:url(#id0)}
]]></style><linearGradient gradientUnits="userSpaceOnUse" id="id0" x1="1064.71" x2="3935.29" y1="3935.29" y2="1064.71"><stop offset="0" stop-color="#008BFF"/><stop offset="1" stop-color="#0af"/></linearGradient></defs><path class="fil0 str0" d="M1489 2253c-136 136-136 358 0 494l1450 1450c78 78 205 78 283 0l318-318c97-97 97-256 0-354l-1025-1025 1025-1025c97-98 97-257 0-354l-318-318c-78-78-205-78-283 0l-1450 1450z" id="Layer_x0020_1"/></svg>

After

Width:  |  Height:  |  Size: 789 B

@ -0,0 +1 @@
<?xml version="1.0" ?><svg height="32px" version="1.1" viewBox="0 0 32 32" width="32px" xmlns="http://www.w3.org/2000/svg" xmlns:sketch="http://www.bohemiancoding.com/sketch/ns" xmlns:xlink="http://www.w3.org/1999/xlink"><title/><desc/><defs/><g fill="none" fill-rule="evenodd" id="Page-1" stroke="none" stroke-width="1"><g fill="#157EFB" id="icon-70-document-file-pdf"><path d="M21,26 L21,28.0025781 C21,29.1090746 20.1057238,30 19.0025781,30 L3.99742191,30 C2.89092539,30 2,29.1012878 2,27.9926701 L2,5.00732994 C2,3.89833832 2.8992496,3 4.0085302,3 L14,3 L14,9.00189865 C14,10.1132936 14.8980806,11 16.0059191,11 L21,11 L21,13 L12.0068483,13 C10.3462119,13 9,14.3422643 9,15.9987856 L9,23.0012144 C9,24.6573979 10.3359915,26 12.0068483,26 L21,26 L21,26 Z M15,3 L15,8.99707067 C15,9.55097324 15.4509752,10 15.990778,10 L21,10 L15,3 L15,3 Z M11.9945615,14 C10.8929956,14 10,14.9001762 10,15.992017 L10,23.007983 C10,24.1081436 10.9023438,25 11.9945615,25 L29.0054385,25 C30.1070044,25 31,24.0998238 31,23.007983 L31,15.992017 C31,14.8918564 30.0976562,14 29.0054385,14 L11.9945615,14 L11.9945615,14 Z M25,19 L25,17 L29,17 L29,16 L24,16 L24,23 L25,23 L25,20 L28,20 L28,19 L25,19 L25,19 Z M12,18 L12,23 L13,23 L13,20 L14.9951185,20 C16.102384,20 17,19.1122704 17,18 C17,16.8954305 16.1061002,16 14.9951185,16 L12,16 L12,18 L12,18 Z M13,17 L13,19 L15.0010434,19 C15.5527519,19 16,18.5561352 16,18 C16,17.4477153 15.5573397,17 15.0010434,17 L13,17 L13,17 Z M18,16 L18,23 L20.9951185,23 C22.102384,23 23,22.1134452 23,20.9940809 L23,18.0059191 C23,16.8980806 22.1061002,16 20.9951185,16 L18,16 L18,16 Z M19,17 L19,22 L21.0010434,22 C21.5527519,22 22,21.5562834 22,21.0001925 L22,17.9998075 C22,17.4476291 21.5573397,17 21.0010434,17 L19,17 L19,17 Z" id="document-file-pdf"/></g></g></svg>

After

Width:  |  Height:  |  Size: 1.7 KiB

@ -0,0 +1 @@
<?xml version="1.0" ?><svg clip-rule="evenodd" fill-rule="evenodd" image-rendering="optimizeQuality" shape-rendering="geometricPrecision" text-rendering="geometricPrecision" viewBox="0 0 500 500" xmlns="http://www.w3.org/2000/svg"><defs><linearGradient id="b" x1="1" x2="0" y1="1"><stop offset="0" stop-color="#008BFF"/><stop offset="1" stop-color="#0af"/></linearGradient><linearGradient id="a" x2="0" y1="1"><stop offset="0" stop-color="#FCFCFD"/><stop offset="1" stop-color="#DDDEDE"/></linearGradient></defs><g stroke="#434242" stroke-linejoin="round"><path d="M250 30h140c11 0 20 9 20 20v400c0 11-9 20-20 20h-280c-11 0-20-9-20-20v-260l160-160z" fill="url(#a)" stroke-linecap="round" stroke-width="15"/><path d="M220 190h-130l160-160v130c0 17-14 30-30 30z" fill="url(#b)" stroke-width="10"/></g></svg>

After

Width:  |  Height:  |  Size: 805 B

@ -0,0 +1 @@
<?xml version="1.0" ?><svg clip-rule="evenodd" fill-rule="evenodd" image-rendering="optimizeQuality" shape-rendering="geometricPrecision" text-rendering="geometricPrecision" viewBox="0 0 500 500" xmlns="http://www.w3.org/2000/svg"><defs><linearGradient gradientUnits="userSpaceOnUse" id="a" x1="249.901" x2="290.097" y1="289.886" y2="249.692"><stop offset="0" stop-color="#979798"/><stop offset=".412" stop-color="#C5C5C5"/><stop offset=".6" stop-color="#fff"/><stop offset=".722" stop-color="#CDCDCE"/><stop offset="1" stop-color="#787879"/></linearGradient><linearGradient gradientUnits="userSpaceOnUse" id="b" x1="385.356" x2="335.934" y1="335.726" y2="385.148"><stop offset="0" stop-color="#434242"/><stop offset=".478" stop-color="#545454"/><stop offset="1" stop-color="#434242"/></linearGradient></defs><g><polygon fill="url(#a)" points="234,269 269,234 302,267 267,302"/><path d="M258 307l2-12 35-35 12-3 143 143c14 14 14 36 0 50-14 13-36 13-49 0l-143-143z" fill="url(#b)"/><circle fill="#434242" r="127" stroke="#2B2A29" stroke-width=".1" transform="matrix(.717 -.717 .717 .717 165 164.999)"/><circle fill="#9DD2FF" r="127" transform="matrix(.606 -.606 .606 .606 165 164.999)"/><path d="M245 155v20c0 3-2 5-5 5h-55c-3 0-5 2-5 5v55c0 3-2 5-5 5h-20c-3 0-5-2-5-5v-55c0-3-2-5-5-5h-55c-3 0-5-2-5-5v-20c0-3 2-5 5-5h55c3 0 5-2 5-5v-55c0-3 2-5 5-5h20c3 0 5 2 5 5v55c0 3 2 5 5 5h55c3 0 5 2 5 5z" fill="#434242"/></g></svg>

After

Width:  |  Height:  |  Size: 1.4 KiB

@ -0,0 +1 @@
<?xml version="1.0" ?><svg clip-rule="evenodd" fill-rule="evenodd" image-rendering="optimizeQuality" shape-rendering="geometricPrecision" text-rendering="geometricPrecision" viewBox="0 0 500 500" xmlns="http://www.w3.org/2000/svg"><defs><linearGradient gradientUnits="userSpaceOnUse" id="a" x1="249.901" x2="290.097" y1="289.886" y2="249.692"><stop offset="0" stop-color="#979798"/><stop offset=".412" stop-color="#C5C5C5"/><stop offset=".6" stop-color="#fff"/><stop offset=".722" stop-color="#CDCDCE"/><stop offset="1" stop-color="#787879"/></linearGradient><linearGradient gradientUnits="userSpaceOnUse" id="b" x1="385.356" x2="335.934" y1="335.726" y2="385.148"><stop offset="0" stop-color="#434242"/><stop offset=".478" stop-color="#545454"/><stop offset="1" stop-color="#434242"/></linearGradient></defs><g><polygon fill="url(#a)" points="234,269 269,234 302,267 267,302"/><path d="M258 307l2-12 35-35 12-3 143 143c14 14 14 36 0 50-14 13-36 13-49 0l-143-143z" fill="url(#b)"/><circle fill="#434242" r="127" stroke="#2B2A29" stroke-width=".1" transform="matrix(.717 -.717 .717 .717 165 164.999)"/><circle fill="#9DD2FF" r="127" transform="matrix(.606 -.606 .606 .606 165 164.999)"/><path d="M245 155v20c0 3-2 5-5 5h-150c-3 0-5-2-5-5v-20c0-3 2-5 5-5h150c3 0 5 2 5 5z" fill="#434242"/></g></svg>

After

Width:  |  Height:  |  Size: 1.3 KiB

@ -7,6 +7,8 @@
#include "context.h" #include "context.h"
#include "filterui.h" #include "filterui.h"
#include "iplugin.h"
#include "reporting/reportdialog.h"
IGridForm::IGridForm(QWidget *parent) : IGridForm::IGridForm(QWidget *parent) :
QWidget(parent), QWidget(parent),
@ -132,7 +134,7 @@ void IGridForm::on_btnFilter_toggled(bool checked)
} }
} }
void IGridForm::on_tableView_clicked(const QModelIndex &index) void IGridForm::on_tableView_clicked(const QModelIndex &)
{ {
if (ui->tableView->currentIndex().isValid()) if (ui->tableView->currentIndex().isValid())
{ {
@ -140,3 +142,11 @@ void IGridForm::on_tableView_clicked(const QModelIndex &index)
ui->btnDelete->setEnabled(true); ui->btnDelete->setEnabled(true);
} }
} }
void IGridForm::on_btnPrint_clicked()
{
ReportDialog *dialog = new ReportDialog(this);
dialog->setAttribute(Qt::WA_DeleteOnClose);
dialog->setReports(Context::instance().plugin(pluginId())->reports());
dialog->show();
}

@ -55,6 +55,8 @@ private slots:
void on_tableView_clicked(const QModelIndex &index); void on_tableView_clicked(const QModelIndex &index);
void on_btnPrint_clicked();
private: private:
QString m_pluginId; QString m_pluginId;
IFormHandler *m_formHandler; IFormHandler *m_formHandler;

@ -48,6 +48,11 @@ QStringList IMetaDataPlugin::dependsOn()
return m_dependsOn; return m_dependsOn;
} }
ReportList IMetaDataPlugin::reports()
{
return m_reports;
}
void IMetaDataPlugin::init(const QJsonObject &metaData) void IMetaDataPlugin::init(const QJsonObject &metaData)
{ {
parseMetaData(metaData); parseMetaData(metaData);
@ -105,6 +110,19 @@ void IMetaDataPlugin::parseMetaData(const QJsonObject &metaData)
m_translations[key] = trLocalized.toObject()[key].toString(); m_translations[key] = trLocalized.toObject()[key].toString();
} }
} }
QJsonValue repArray = data.toObject()["reports"];
foreach (QJsonValue repVal, repArray.toArray()) {
QJsonObject repObj = repVal.toObject();
ReportPtr report = ReportPtr(new Report());
report->setName(repObj["name"].toString());
report->setDescription(repObj["description"].toString());
report->setListReport(repObj["listReport"].toBool());
report->setFile(repObj["file"].toString());
m_reports.append(report);
}
} }
QString IMetaDataPlugin::parseLocaleText(const QJsonObject &object) QString IMetaDataPlugin::parseLocaleText(const QJsonObject &object)

@ -20,6 +20,7 @@ public:
virtual int schemaVersion(); virtual int schemaVersion();
virtual QStringList schemas(); virtual QStringList schemas();
virtual QStringList dependsOn(); virtual QStringList dependsOn();
virtual ReportList reports();
virtual void init(const QJsonObject &metaData); virtual void init(const QJsonObject &metaData);
@ -34,6 +35,7 @@ private:
int m_schemaVersion; int m_schemaVersion;
QStringList m_schemas; QStringList m_schemas;
QStringList m_dependsOn; QStringList m_dependsOn;
ReportList m_reports;
QString parseLocaleText(const QJsonObject &object); QString parseLocaleText(const QJsonObject &object);
}; };

@ -11,6 +11,7 @@
#include "service.h" #include "service.h"
#include "igridform.h" #include "igridform.h"
#include "reporting/report.h"
class IPlugin class IPlugin
{ {
@ -45,6 +46,7 @@ public:
virtual int schemaVersion() = 0; virtual int schemaVersion() = 0;
virtual QStringList schemas() = 0; virtual QStringList schemas() = 0;
virtual QStringList dependsOn() = 0; virtual QStringList dependsOn() = 0;
virtual ReportList reports() = 0;
virtual void init(const QJsonObject &metaData) = 0; virtual void init(const QJsonObject &metaData) = 0;

@ -15,5 +15,14 @@
<file>icons/usersPlugin.svg</file> <file>icons/usersPlugin.svg</file>
<file>icons/rolesPlugin.svg</file> <file>icons/rolesPlugin.svg</file>
<file>translations/core_cs_CZ.qm</file> <file>translations/core_cs_CZ.qm</file>
<file>icons/close.svg</file>
<file>icons/fitHorizontal.svg</file>
<file>icons/fitVertical.svg</file>
<file>icons/pageDown.svg</file>
<file>icons/pageUp.svg</file>
<file>icons/pdf.svg</file>
<file>icons/zoomIn.svg</file>
<file>icons/zoomOut.svg</file>
<file>icons/report.svg</file>
</qresource> </qresource>
</RCC> </RCC>

@ -0,0 +1,61 @@
#include "report.h"
Report::Report()
{
}
QString Report::name() const
{
return m_name;
}
void Report::setName(const QString &name)
{
m_name = name;
}
QString Report::description() const
{
return m_description;
}
void Report::setDescription(const QString &description)
{
m_description = description;
}
QString Report::file() const
{
return m_file;
}
void Report::setFile(const QString &file)
{
m_file = file;
}
bool Report::listReport() const
{
return m_listReport;
}
void Report::setListReport(bool listReport)
{
m_listReport = listReport;
}
QMap<QString, QString> Report::variables() const
{
return m_variables;
}
void Report::setVariables(const QMap<QString, QString> &variables)
{
m_variables = variables;
}
void Report::addVariable(const QString &varName, const QString &value)
{
m_variables[varName] = value;
}

@ -0,0 +1,43 @@
#ifndef REPORT_H
#define REPORT_H
#include <QString>
#include <QMap>
#include <QList>
#include <QSharedPointer>
#include "../core_global.h"
class CORESHARED_EXPORT Report
{
public:
Report();
QString name() const;
void setName(const QString &name);
QString description() const;
void setDescription(const QString &description);
QString file() const;
void setFile(const QString &file);
bool listReport() const;
void setListReport(bool listReport);
QMap<QString, QString> variables() const;
void setVariables(const QMap<QString, QString> &variables);
void addVariable(const QString &varName, const QString &value);
private:
QString m_name;
QString m_description;
QString m_file;
bool m_listReport;
QMap<QString, QString> m_variables;
};
typedef QSharedPointer<Report> ReportPtr;
typedef QList<ReportPtr> ReportList;
#endif // REPORT_H

@ -0,0 +1,75 @@
#include "reportdialog.h"
#include "ui_reportdialog.h"
#include <QStandardItemModel>
#include <QIcon>
#include "reportviewer.h"
ReportDialog::ReportDialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::ReportDialog)
{
ui->setupUi(this);
}
ReportDialog::~ReportDialog()
{
delete ui;
}
void ReportDialog::setReports(ReportList reports)
{
QStandardItemModel *model = qobject_cast<QStandardItemModel*>(ui->listReports->model());
if (model == NULL)
{
model = new QStandardItemModel(0, 1);
}
else
{
model->clear();
}
foreach (ReportPtr report, reports) {
QStandardItem *item = new QStandardItem((report->listReport() ? QIcon(":/icons/list.svg") : QIcon(":/icons/report.svg")), report->name());
model->appendRow(item);
}
ui->listReports->setModel(model);
m_reports = reports;
connect(ui->listReports->selectionModel(), &QItemSelectionModel::currentRowChanged, [this](const QModelIndex, QModelIndex){
ui->textDescription->setText(m_reports[ui->listReports->currentIndex().row()]->description());
});
if (!reports.isEmpty())
{
ui->btnPreview->setEnabled(true);
ui->btnPrint->setEnabled(true);
ui->listReports->setCurrentIndex(model->index(0, 0));
}
}
void ReportDialog::on_btnPreview_clicked()
{
ReportViewer *viewer = new ReportViewer(this);
viewer->setAttribute(Qt::WA_DeleteOnClose);
viewer->setReport(m_reports[ui->listReports->currentIndex().row()]);
viewer->openPreview();
}
void ReportDialog::on_btnPrint_clicked()
{
ReportViewer viever;
viever.setReport(m_reports[ui->listReports->currentIndex().row()]);
viever.directPrint();
}
void ReportDialog::on_btnClose_clicked()
{
close();
}

@ -0,0 +1,33 @@
#ifndef REPORTDIALOG_H
#define REPORTDIALOG_H
#include <QDialog>
#include "report.h"
namespace Ui {
class ReportDialog;
}
class ReportDialog : public QDialog
{
Q_OBJECT
public:
explicit ReportDialog(QWidget *parent = 0);
~ReportDialog();
void setReports(ReportList reports);
private slots:
void on_btnPreview_clicked();
void on_btnPrint_clicked();
void on_btnClose_clicked();
private:
Ui::ReportDialog *ui;
ReportList m_reports;
};
#endif // REPORTDIALOG_H

@ -0,0 +1,194 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>ReportDialog</class>
<widget class="QDialog" name="ReportDialog">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>569</width>
<height>442</height>
</rect>
</property>
<property name="windowTitle">
<string>Reports</string>
</property>
<property name="modal">
<bool>true</bool>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<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>9</number>
</property>
<item>
<widget class="QFrame" name="frame">
<property name="styleSheet">
<string notr="true">background-color: rgb(255, 255, 255);</string>
</property>
<property name="frameShape">
<enum>QFrame::StyledPanel</enum>
</property>
<property name="frameShadow">
<enum>QFrame::Raised</enum>
</property>
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="QLabel" name="label">
<property name="minimumSize">
<size>
<width>32</width>
<height>32</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>36</width>
<height>36</height>
</size>
</property>
<property name="text">
<string/>
</property>
<property name="pixmap">
<pixmap resource="../rc.qrc">:/icons/print.svg</pixmap>
</property>
<property name="scaledContents">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="label_2">
<property name="font">
<font>
<pointsize>10</pointsize>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="styleSheet">
<string notr="true">color: rgb(0, 0, 0);</string>
</property>
<property name="text">
<string>Print reports</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QWidget" name="widgetReports" native="true">
<layout class="QHBoxLayout" name="horizontalLayout_2">
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="QListView" name="listReports">
<property name="selectionBehavior">
<enum>QAbstractItemView::SelectRows</enum>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QWidget" name="widget_2" native="true">
<property name="maximumSize">
<size>
<width>16777215</width>
<height>90</height>
</size>
</property>
<layout class="QVBoxLayout" name="verticalLayout_2">
<item>
<widget class="QTextBrowser" name="textDescription">
<property name="maximumSize">
<size>
<width>16777215</width>
<height>16777215</height>
</size>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QWidget" name="widget" native="true">
<layout class="QHBoxLayout" name="horizontalLayout_3">
<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>
<item>
<widget class="QPushButton" name="btnPreview">
<property name="enabled">
<bool>false</bool>
</property>
<property name="text">
<string>Preview</string>
</property>
<property name="icon">
<iconset resource="../rc.qrc">
<normaloff>:/icons/report.svg</normaloff>:/icons/report.svg</iconset>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="btnPrint">
<property name="enabled">
<bool>false</bool>
</property>
<property name="text">
<string>Print</string>
</property>
<property name="icon">
<iconset resource="../rc.qrc">
<normaloff>:/icons/print.svg</normaloff>:/icons/print.svg</iconset>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="btnClose">
<property name="text">
<string>Close</string>
</property>
<property name="icon">
<iconset resource="../rc.qrc">
<normaloff>:/icons/close.svg</normaloff>:/icons/close.svg</iconset>
</property>
</widget>
</item>
</layout>
</widget>
</item>
</layout>
</widget>
<resources>
<include location="../rc.qrc"/>
</resources>
<connections/>
</ui>

@ -0,0 +1,90 @@
#include "reportviewer.h"
#include "ui_reportviewer.h"
#include "../context.h"
#include <QFile>
#include <QPrinter>
#include <LimeReport>
ReportViewer::ReportViewer(QWidget *parent) :
QDialog(parent),
ui(new Ui::ReportViewer)
{
ui->setupUi(this);
m_report = NULL;
}
ReportViewer::~ReportViewer()
{
delete ui;
}
void ReportViewer::setReport(ReportPtr report)
{
m_report = new LimeReport::ReportEngine(this);
QString reportPath = qApp->applicationDirPath() + REPORT_ROOT + "/" + report->file();
QFile file(reportPath);
file.open(QFile::ReadOnly);
m_report->loadFromByteArray(&file.readAll());
m_report->setReportFileName(reportPath);
m_report->dataManager()->setReportVariable("dbPath", Context::instance().settings()->value("db/path", "").toString());
}
void ReportViewer::openPreview()
{
Q_ASSERT(m_report != NULL);
showMaximized();
m_prevWidget = m_report->createPreviewWidget(this);
connect(m_prevWidget, SIGNAL(pagesSet(int)), this, SLOT(slotPageSet(int)));
connect(ui->pageNavigator, SIGNAL(valueChanged(int)), m_prevWidget, SLOT(pageNavigatorChanged(int)));
connect(ui->btnPrint, SIGNAL(clicked(bool)), m_prevWidget, SLOT(print()));
connect(ui->btnPdf, SIGNAL(clicked(bool)), m_prevWidget, SLOT(printToPDF()));
connect(ui->btnPageUp, SIGNAL(clicked(bool)), m_prevWidget, SLOT(priorPage()));
connect(ui->btnPageDown, SIGNAL(clicked(bool)), m_prevWidget, SLOT(nextPage()));
connect(ui->btnZoomIn, SIGNAL(clicked(bool)), m_prevWidget, SLOT(zoomIn()));
connect(ui->btnZoomOut, SIGNAL(clicked(bool)), m_prevWidget, SLOT(zoomOut()));
connect(ui->btnFitHoriz, SIGNAL(clicked(bool)), m_prevWidget, SLOT(fitWidth()));
connect(ui->btnFitVert, SIGNAL(clicked(bool)), m_prevWidget, SLOT(fitPage()));
ui->reportLayout->addWidget(m_prevWidget);
m_prevWidget->refreshPages();
}
void ReportViewer::directPrint(bool dialog)
{
Q_ASSERT(m_report != NULL);
QPrinter printer(QPrinter::HighResolution);
if (dialog || !printer.isValid())
{
m_report->printReport();
}
else
{
m_report->printReport(&printer);
}
}
void ReportViewer::on_btnClose_clicked()
{
close();
}
void ReportViewer::on_btnEdit_clicked()
{
m_report->designReport();
}
void ReportViewer::slotPageSet(int page)
{
ui->pageNavigator->setSuffix(ui->pageNavigator->suffix() + QString::number(page));
ui->pageNavigator->setMinimum(1);
ui->pageNavigator->setMaximum(page);
}

@ -0,0 +1,41 @@
#ifndef REPORTVIEWER_H
#define REPORTVIEWER_H
#include <QDialog>
#include "report.h"
namespace Ui {
class ReportViewer;
}
namespace LimeReport {
class PreviewReportWidget;
class ReportEngine;
}
class ReportViewer : public QDialog
{
Q_OBJECT
public:
explicit ReportViewer(QWidget *parent = 0);
~ReportViewer();
void setReport(ReportPtr report);
void openPreview();
void directPrint(bool dialog = true);
private slots:
void on_btnClose_clicked();
void on_btnEdit_clicked();
void slotPageSet(int page);
private:
Ui::ReportViewer *ui;
LimeReport::PreviewReportWidget *m_prevWidget;
LimeReport::ReportEngine *m_report;
};
#endif // REPORTVIEWER_H

@ -0,0 +1,312 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>ReportViewer</class>
<widget class="QDialog" name="ReportViewer">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>914</width>
<height>675</height>
</rect>
</property>
<property name="windowTitle">
<string>Report</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout_2">
<item>
<widget class="QWidget" name="widget" native="true">
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="QToolButton" name="btnClose">
<property name="toolTip">
<string>Close</string>
</property>
<property name="text">
<string>Close</string>
</property>
<property name="icon">
<iconset resource="../rc.qrc">
<normaloff>:/icons/close.svg</normaloff>:/icons/close.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="btnPrint">
<property name="toolTip">
<string>Print</string>
</property>
<property name="text">
<string>Print</string>
</property>
<property name="icon">
<iconset resource="../rc.qrc">
<normaloff>:/icons/print.svg</normaloff>:/icons/print.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="btnPdf">
<property name="toolTip">
<string>Export to PDF</string>
</property>
<property name="text">
<string>Export to PDF</string>
</property>
<property name="icon">
<iconset resource="../rc.qrc">
<normaloff>:/icons/pdf.svg</normaloff>:/icons/pdf.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="btnEdit">
<property name="toolTip">
<string>Edit</string>
</property>
<property name="text">
<string>Edit</string>
</property>
<property name="icon">
<iconset resource="../rc.qrc">
<normaloff>:/icons/edit.svg</normaloff>:/icons/edit.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="btnPageUp">
<property name="toolTip">
<string>Page up</string>
</property>
<property name="text">
<string>Page up</string>
</property>
<property name="icon">
<iconset resource="../rc.qrc">
<normaloff>:/icons/pageUp.svg</normaloff>:/icons/pageUp.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="QSpinBox" name="pageNavigator">
<property name="suffix">
<string> of </string>
</property>
<property name="prefix">
<string>Page: </string>
</property>
</widget>
</item>
<item>
<widget class="QToolButton" name="btnPageDown">
<property name="toolTip">
<string>Page down</string>
</property>
<property name="text">
<string>Page down</string>
</property>
<property name="icon">
<iconset resource="../rc.qrc">
<normaloff>:/icons/pageDown.svg</normaloff>:/icons/pageDown.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="btnZoomOut">
<property name="toolTip">
<string>Zoom out</string>
</property>
<property name="text">
<string>Zoom out</string>
</property>
<property name="icon">
<iconset resource="../rc.qrc">
<normaloff>:/icons/zoomOut.svg</normaloff>:/icons/zoomOut.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="btnZoomIn">
<property name="toolTip">
<string>Zoom in</string>
</property>
<property name="text">
<string>Zoom in</string>
</property>
<property name="icon">
<iconset resource="../rc.qrc">
<normaloff>:/icons/zoomIn.svg</normaloff>:/icons/zoomIn.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="btnFitHoriz">
<property name="toolTip">
<string>Fit horizontal</string>
</property>
<property name="text">
<string>Fit horizontal</string>
</property>
<property name="icon">
<iconset resource="../rc.qrc">
<normaloff>:/icons/fitHorizontal.svg</normaloff>:/icons/fitHorizontal.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="btnFitVert">
<property name="toolTip">
<string>Fit vertical</string>
</property>
<property name="text">
<string>Fit vertical</string>
</property>
<property name="icon">
<iconset resource="../rc.qrc">
<normaloff>:/icons/fitVertical.svg</normaloff>:/icons/fitVertical.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>
<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="QWidget" name="widget_2" native="true">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Expanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<layout class="QHBoxLayout" name="horizontalLayout_2">
<property name="spacing">
<number>0</number>
</property>
<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>
<layout class="QVBoxLayout" name="reportLayout"/>
</item>
</layout>
</widget>
</item>
</layout>
</widget>
<resources>
<include location="../rc.qrc"/>
</resources>
<connections/>
</ui>

@ -94,5 +94,9 @@ CREATE TABLE \"Voucher\" (
"saveDateTime" : "Datum uložení", "saveDateTime" : "Datum uložení",
"insertDate" : "Datum vložení" "insertDate" : "Datum vložení"
} }
} },
"reports" : [
{ "name" : "Zpalcené účtenky", "description" : "Všechny zaplacené účtenky", "listReport" : 1, "file" : "vouchers.lrxml" },
{ "name" : "Nezpalcené účtenky", "description" : "Všechny nezaplacené účtenky", "listReport" : 1, "file" : "vouchers_n.lrxml" }
]
} }

Loading…
Cancel
Save