From b24ac9e00a7fe26acdfbfda1e1d19e12099eaae6 Mon Sep 17 00:00:00 2001 From: 0xFEEDC0DE64 <0xFEEDC0DE64@gmail.com> Date: Mon, 17 Sep 2018 19:43:50 +0200 Subject: [PATCH] Imported existing sources --- images/refresh.png | Bin 0 -> 6914 bytes images/report.png | Bin 0 -> 3977 bytes reportsplugin.cpp | 36 ++++++++ reportsplugin.h | 24 +++++ reportsplugin.json | 0 reportsplugin.pro | 22 +++++ reportsplugin_resources.qrc | 6 ++ reportswidget.cpp | 150 +++++++++++++++++++++++++++++++ reportswidget.h | 36 ++++++++ translations/reportsplugin_de.ts | 49 ++++++++++ translations/reportsplugin_en.ts | 49 ++++++++++ 11 files changed, 372 insertions(+) create mode 100644 images/refresh.png create mode 100644 images/report.png create mode 100644 reportsplugin.cpp create mode 100644 reportsplugin.h create mode 100644 reportsplugin.json create mode 100644 reportsplugin.pro create mode 100644 reportsplugin_resources.qrc create mode 100644 reportswidget.cpp create mode 100644 reportswidget.h create mode 100644 translations/reportsplugin_de.ts create mode 100644 translations/reportsplugin_en.ts diff --git a/images/refresh.png b/images/refresh.png new file mode 100644 index 0000000000000000000000000000000000000000..f3585b74a877cd7716fb55a1c7392c87164095ac GIT binary patch literal 6914 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 literal 0 HcmV?d00001 diff --git a/images/report.png b/images/report.png new file mode 100644 index 0000000000000000000000000000000000000000..c00f86189213a167ea0c56247b7a59abbd1f8da3 GIT binary patch literal 3977 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 literal 0 HcmV?d00001 diff --git a/reportsplugin.cpp b/reportsplugin.cpp new file mode 100644 index 0000000..c629073 --- /dev/null +++ b/reportsplugin.cpp @@ -0,0 +1,36 @@ +#include "reportsplugin.h" + +#include +#include +#include +#include +#include + +#include "mainwindow.h" + +#include "reportswidget.h" + +ReportsPlugin::ReportsPlugin(QObject *parent) : + ZeiterfassungPlugin(parent) +{ + qDebug() << "called"; + + static auto dir = QDir(QCoreApplication::applicationDirPath()).absoluteFilePath(QStringLiteral("translations")); + + if(m_translator.load(QLocale(), QStringLiteral("reportsplugin"), QStringLiteral("_"), dir)) + { + if(!QCoreApplication::installTranslator(&m_translator)) + { + qWarning() << "could not install translation reportsplugin"; + } + } + else + { + qWarning() << "could not load translation reportsplugin"; + } +} + +void ReportsPlugin::attachTo(MainWindow &mainWindow) +{ + mainWindow.statusBar()->addPermanentWidget(new ReportsWidget(mainWindow)); +} diff --git a/reportsplugin.h b/reportsplugin.h new file mode 100644 index 0000000..6f58568 --- /dev/null +++ b/reportsplugin.h @@ -0,0 +1,24 @@ +#pragma once + +#include +#include + +#include "zeiterfassungplugin.h" + +class MainWindow; + +class Q_DECL_EXPORT ReportsPlugin : public ZeiterfassungPlugin +{ + Q_OBJECT + Q_PLUGIN_METADATA(IID "dbsoftware.zeiterfassung.plugin/1.0" FILE "reportsplugin.json") + Q_INTERFACES(ZeiterfassungPlugin) + +public: + explicit ReportsPlugin(QObject *parent = Q_NULLPTR); + + // ZeiterfassungPlugin interface + void attachTo(MainWindow &mainWindow) Q_DECL_OVERRIDE; + +private: + QTranslator m_translator; +}; diff --git a/reportsplugin.json b/reportsplugin.json new file mode 100644 index 0000000..e69de29 diff --git a/reportsplugin.pro b/reportsplugin.pro new file mode 100644 index 0000000..0258f62 --- /dev/null +++ b/reportsplugin.pro @@ -0,0 +1,22 @@ +QT += core network gui widgets + +DBLIBS += zeiterfassungcore zeiterfassunggui + +TARGET = reportsplugin + +HEADERS += reportsplugin.h \ + reportswidget.h + +SOURCES += reportsplugin.cpp \ + reportswidget.cpp + +FORMS += + +RESOURCES += reportsplugin_resources.qrc + +TRANSLATIONS += translations/reportsplugin_en.ts \ + translations/reportsplugin_de.ts + +OTHER_FILES += reportsplugin.json + +include(../plugin.pri) diff --git a/reportsplugin_resources.qrc b/reportsplugin_resources.qrc new file mode 100644 index 0000000..acd4367 --- /dev/null +++ b/reportsplugin_resources.qrc @@ -0,0 +1,6 @@ + + + images/refresh.png + images/report.png + + diff --git a/reportswidget.cpp b/reportswidget.cpp new file mode 100644 index 0000000..30eba00 --- /dev/null +++ b/reportswidget.cpp @@ -0,0 +1,150 @@ +#include "reportswidget.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "mainwindow.h" +#include "zeiterfassungapi.h" + +ReportsWidget::ReportsWidget(MainWindow &mainWindow) : + QLabel(&mainWindow), + m_mainWindow(mainWindow) +{ + connect(&m_mainWindow, &MainWindow::dateChanged, this, &ReportsWidget::dateChanged); + connect(&m_mainWindow, &MainWindow::refreshEverything, this, &ReportsWidget::refresh); + + setFrameShape(QFrame::Panel); + setFrameShadow(QFrame::Sunken); + + m_actionRefreshReport = new QAction(QIcon(QStringLiteral(":/zeiterfassung/plugins/reportsplugin/images/refresh.png")), + tr("Refresh report"), this); + connect(m_actionRefreshReport, &QAction::triggered, this, &ReportsWidget::refresh); + m_mainWindow.menuView()->addAction(m_actionRefreshReport); + + m_actionOpenReport = new QAction(QIcon(QStringLiteral(":/zeiterfassung/plugins/reportsplugin/images/report.png")), + tr("Open report"), this); + connect(m_actionOpenReport, &QAction::triggered, this, &ReportsWidget::openReport); + m_mainWindow.menuTools()->addAction(m_actionOpenReport); + + m_mainWindow.toolBar()->addAction(m_actionOpenReport); + + dateChanged(m_mainWindow.date()); +} + +void ReportsWidget::dateChanged(const QDate &date) +{ + if(!date.isValid()) + { + qWarning() << "invalid date" << date; + return; + } + + auto monthBegin = QDate(date.year(), date.month(), 1); + if(monthBegin != m_date) + { + m_date = monthBegin; + refresh(); + } +} + +void ReportsWidget::refresh() +{ + if(!m_date.isValid()) + { + qWarning() << "invalid date" << m_date; + return; + } + + setText(tr("Balance: %0, Holidays: %1").arg(tr("???")).arg(tr("???"))); + + m_actionRefreshReport->setEnabled(false); + m_actionOpenReport->setEnabled(false); + + m_reply = m_mainWindow.erfassung().doGetReport(m_mainWindow.userInfo().userId, m_date); + connect(m_reply.get(), &ZeiterfassungReply::finished, this, &ReportsWidget::finished); +} + +void ReportsWidget::finished() +{ + if(!m_reply->success()) + { + m_date = QDate(); + QMessageBox::warning(this, tr("Could not load report!"), tr("Could not load report!") % "\n\n" % m_reply->message()); + goto after; + } + + { + auto content = m_reply->content(); + + QString balance; + + { + static QRegularExpression regex(QStringLiteral("Gleitzeit +([0-9]+\\:[0-9]+\\-?) +([0-9]+\\:[0-9]+\\-?)")); + auto match = regex.match(content); + if(match.hasMatch()) + { + balance = match.captured(2); + if(balance.endsWith(QChar('-'))) + { + balance.chop(1); + balance = QChar('-') % balance; + } + } + else + { + balance = tr("n/a"); + qWarning() << "balance not found in PDF"; + } + } + + QString holidays; + + { + static QRegularExpression regex(QStringLiteral("Urlaubsanspruch +(\\-?[0-9]+\\.[0-9]+) +(\\-?[0-9]+\\.[0-9]+)")); + auto match = regex.match(content); + if(match.hasMatch()) + holidays = match.captured(2); + else + { + holidays = tr("n/a"); + qWarning() << "holidays not found in PDF"; + } + } + + setText(tr("Balance: %0, Holidays: %1").arg(balance).arg(holidays)); + + { + QTemporaryFile file(QDir::temp().absoluteFilePath(QStringLiteral("reportXXXXXX.pdf"))); + file.setAutoRemove(false); + if(!file.open()) + { + QMessageBox::warning(this, tr("Could not write report!"), tr("Could not write report!") % "\n\n" % file.errorString()); + goto after; + } + + file.write(content); + + m_url = QUrl::fromLocalFile(file.fileName()); + } + } + + m_actionOpenReport->setEnabled(true); + + after: + m_actionRefreshReport->setEnabled(true); + m_reply = Q_NULLPTR; +} + +void ReportsWidget::openReport() +{ + if(!QDesktopServices::openUrl(m_url)) + QMessageBox::warning(this, tr("Could not launch your default PDF viewer!"), tr("Could not launch your default PDF viewer!")); +} diff --git a/reportswidget.h b/reportswidget.h new file mode 100644 index 0000000..46ad7d9 --- /dev/null +++ b/reportswidget.h @@ -0,0 +1,36 @@ +#pragma once + +#include +#include +#include + +#include "replies/getreportreply.h" + +class QAction; + +class MainWindow; + +class ReportsWidget : public QLabel +{ + Q_OBJECT + +public: + explicit ReportsWidget(MainWindow &mainWindow); + +private Q_SLOTS: + void dateChanged(const QDate &date); + void refresh(); + void finished(); + void openReport(); + +private: + MainWindow &m_mainWindow; + + QAction *m_actionOpenReport; + QAction *m_actionRefreshReport; + + QDate m_date; + QUrl m_url; + + std::unique_ptr m_reply; +}; diff --git a/translations/reportsplugin_de.ts b/translations/reportsplugin_de.ts new file mode 100644 index 0000000..14f8202 --- /dev/null +++ b/translations/reportsplugin_de.ts @@ -0,0 +1,49 @@ + + + + + ReportsWidget + + + Refresh report + Auswertung aktualisieren + + + + Open report + Auswertung öffnen + + + + ??? + ??? + + + + + Balance: %0, Holidays: %1 + Gleitzeit: %0, Urlaub: %1 + + + + Could not load report! + Konnte Auswertung nicht laden! + + + + + n/a + n/v + + + + Could not write report! + Konnte Auswertung nicht abspeichern! + + + + Could not launch your default PDF viewer! + Konnte Standard-PDF-Viewer nicht öffnen! + + + diff --git a/translations/reportsplugin_en.ts b/translations/reportsplugin_en.ts new file mode 100644 index 0000000..ffb6a03 --- /dev/null +++ b/translations/reportsplugin_en.ts @@ -0,0 +1,49 @@ + + + + + ReportsWidget + + + Refresh report + + + + + Open report + + + + + ??? + + + + + + Balance: %0, Holidays: %1 + + + + + Could not load report! + + + + + + n/a + + + + + Could not write report! + + + + + Could not launch your default PDF viewer! + + + +