diff --git a/plugins/absenceplugin/absencedialog.cpp b/plugins/absenceplugin/absencedialog.cpp new file mode 100644 index 0000000..a193d00 --- /dev/null +++ b/plugins/absenceplugin/absencedialog.cpp @@ -0,0 +1,40 @@ +#include "absencedialog.h" +#include "ui_absencedialog.h" + +#include +#include +#include + +#include "absencesmodel.h" + +AbsenceDialog::AbsenceDialog(int userId, const QDate &date, ZeiterfassungApi &erfassung, QWidget *parent) : + QDialog(parent), + ui(new Ui::AbsenceDialog) +{ + ui->setupUi(this); + +#if (QT_VERSION >= QT_VERSION_CHECK(5, 9, 0)) + setWindowFlag(Qt::WindowContextHelpButtonHint, false); +#else + setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint); +#endif + + ui->labelTitle->setText(tr("Absences for %0").arg(date.toString(tr("dd.MM.yyyy")))); + + m_model = new AbsencesModel(userId, date, erfassung, this); + connect(m_model, &AbsencesModel::errorOccured, this, &AbsenceDialog::errorOccured); + + ui->treeView->setModel(m_model); + ui->treeView->setEnabled(m_model->enabled()); + connect(m_model, &AbsencesModel::enabledChanged, ui->treeView, &QWidget::setEnabled); +} + +AbsenceDialog::~AbsenceDialog() +{ + delete ui; +} + +void AbsenceDialog::errorOccured(const QString &message) +{ + QMessageBox::warning(this, tr("Could not load absences!"), tr("Could not load absences!") % "\n\n" % message); +} diff --git a/plugins/absenceplugin/absencedialog.h b/plugins/absenceplugin/absencedialog.h new file mode 100644 index 0000000..b93cbfc --- /dev/null +++ b/plugins/absenceplugin/absencedialog.h @@ -0,0 +1,27 @@ +#pragma once + +#include + +class QDate; + +class ZeiterfassungApi; + +class AbsencesModel; +namespace Ui { class AbsenceDialog; } + +class AbsenceDialog : public QDialog +{ + Q_OBJECT + +public: + explicit AbsenceDialog(int userId, const QDate &date, ZeiterfassungApi &erfassung, QWidget *parent = 0); + ~AbsenceDialog(); + +private Q_SLOTS: + void errorOccured(const QString &message); + +private: + Ui::AbsenceDialog *ui; + + AbsencesModel *m_model; +}; diff --git a/plugins/absenceplugin/absencedialog.ui b/plugins/absenceplugin/absencedialog.ui new file mode 100644 index 0000000..eb6a823 --- /dev/null +++ b/plugins/absenceplugin/absencedialog.ui @@ -0,0 +1,79 @@ + + + AbsenceDialog + + + + 0 + 0 + 947 + 300 + + + + Absences + + + + + + + 16 + + + + Absences for + + + + + + + + + + Qt::Horizontal + + + QDialogButtonBox::Close + + + + + + + + + buttonBox + accepted() + AbsenceDialog + accept() + + + 248 + 254 + + + 157 + 274 + + + + + buttonBox + rejected() + AbsenceDialog + reject() + + + 316 + 260 + + + 286 + 274 + + + + + diff --git a/plugins/absenceplugin/absenceplugin.cpp b/plugins/absenceplugin/absenceplugin.cpp new file mode 100644 index 0000000..2e09928 --- /dev/null +++ b/plugins/absenceplugin/absenceplugin.cpp @@ -0,0 +1,38 @@ +#include "absenceplugin.h" + +#include +#include +#include +#include +#include + +#include "mainwindow.h" +#include "stripswidget.h" + +#include "absencewidget.h" + +AbsencePlugin::AbsencePlugin(QObject *parent) : + ZeiterfassungPlugin(parent) +{ + qDebug() << "called"; + + static auto dir = QDir(QCoreApplication::applicationDirPath()).absoluteFilePath(QStringLiteral("translations")); + + if(m_translator.load(QLocale(), QStringLiteral("absenceplugin"), QStringLiteral("_"), dir)) + { + if(!QCoreApplication::installTranslator(&m_translator)) + { + qWarning() << "could not install translation absenceplugin"; + } + } + else + { + qWarning() << "could not load translation absenceplugin"; + } +} + +void AbsencePlugin::attachTo(MainWindow &mainWindow) +{ + for(auto stripsWidget : mainWindow.stripsWidgets()) + stripsWidget->headerLayout()->addWidget(new AbsenceWidget(*stripsWidget)); +} diff --git a/plugins/absenceplugin/absenceplugin.h b/plugins/absenceplugin/absenceplugin.h new file mode 100644 index 0000000..b3884b8 --- /dev/null +++ b/plugins/absenceplugin/absenceplugin.h @@ -0,0 +1,24 @@ +#pragma once + +#include +#include + +#include "zeiterfassungplugin.h" + +class MainWindow; + +class Q_DECL_EXPORT AbsencePlugin : public ZeiterfassungPlugin +{ + Q_OBJECT + Q_PLUGIN_METADATA(IID "dbsoftware.zeiterfassung.plugin/1.0" FILE "absenceplugin.json") + Q_INTERFACES(ZeiterfassungPlugin) + +public: + explicit AbsencePlugin(QObject *parent = Q_NULLPTR); + + // ZeiterfassungPlugin interface + void attachTo(MainWindow &mainWindow) Q_DECL_OVERRIDE; + +private: + QTranslator m_translator; +}; diff --git a/plugins/absenceplugin/absenceplugin.json b/plugins/absenceplugin/absenceplugin.json new file mode 100644 index 0000000..e69de29 diff --git a/plugins/absenceplugin/absenceplugin.pro b/plugins/absenceplugin/absenceplugin.pro new file mode 100644 index 0000000..d938567 --- /dev/null +++ b/plugins/absenceplugin/absenceplugin.pro @@ -0,0 +1,38 @@ +QT += core network gui widgets + +TARGET = absenceplugin +TEMPLATE = lib + +CONFIG += shared c++14 + +PROJECT_ROOT = ../.. + +DESTDIR = $${OUT_PWD}/$${PROJECT_ROOT}/bin/plugins/zeiterfassung + +LIBS += -L$${OUT_PWD}/$${PROJECT_ROOT}/bin -lzeiterfassungcorelib -lzeiterfassungguilib + +INCLUDEPATH += $$PWD/$${PROJECT_ROOT}/zeiterfassungcorelib $$PWD/$${PROJECT_ROOT}/zeiterfassungguilib +DEPENDPATH += $$PWD/$${PROJECT_ROOT}/zeiterfassungcorelib $$PWD/$${PROJECT_ROOT}/zeiterfassungguilib + +DEFINES += QT_DEPRECATED_WARNINGS QT_DISABLE_DEPRECATED_BEFORE=0x060000 QT_MESSAGELOGCONTEXT + +HEADERS += absencedialog.h \ + absencesmodel.h \ + absenceplugin.h \ + absencewidget.h + +SOURCES += absencedialog.cpp \ + absencesmodel.cpp \ + absenceplugin.cpp \ + absencewidget.cpp + +FORMS += absencedialog.ui + +RESOURCES += absenceplugin_resources.qrc + +TRANSLATIONS += translations/absenceplugin_en.ts \ + translations/absenceplugin_de.ts + +OTHER_FILES += absenceplugin.json + +include(../../lrelease.pri) diff --git a/plugins/absenceplugin/absenceplugin_resources.qrc b/plugins/absenceplugin/absenceplugin_resources.qrc new file mode 100644 index 0000000..a3b089d --- /dev/null +++ b/plugins/absenceplugin/absenceplugin_resources.qrc @@ -0,0 +1,5 @@ + + + images/absence.png + + diff --git a/plugins/absenceplugin/absencesmodel.cpp b/plugins/absenceplugin/absencesmodel.cpp new file mode 100644 index 0000000..77a0043 --- /dev/null +++ b/plugins/absenceplugin/absencesmodel.cpp @@ -0,0 +1,115 @@ +#include "absencesmodel.h" + +#include "zeiterfassungapi.h" + +AbsencesModel::AbsencesModel(int userId, const QDate &date, ZeiterfassungApi &erfassung, QObject *parent) : + QAbstractListModel(parent), + m_userId(userId), + m_erfassung(erfassung) +{ + setDate(date); +} + +bool AbsencesModel::enabled() const +{ + return m_reply == Q_NULLPTR; +} + +int AbsencesModel::rowCount(const QModelIndex &parent) const +{ + Q_UNUSED(parent) + + return m_absences.count(); +} + +int AbsencesModel::columnCount(const QModelIndex &parent) const +{ + Q_UNUSED(parent) + + return 9; +} + +QVariant AbsencesModel::data(const QModelIndex &index, int role) const +{ + Q_ASSERT(index.row() < m_absences.count()); + const auto &absence = m_absences.at(index.row()); + + switch(role) + { + case Qt::DisplayRole: + case Qt::EditRole: + switch(index.column()) + { + case 0: return absence.altRepresentative; + case 1: return absence.compositeId; + case 2: return absence.end; + case 3: return absence.hourCategory; + case 4: return absence.openMarking; + case 5: return absence.persNr; + case 6: return absence.representative; + case 7: return absence.start; + case 8: return absence.text; + } + } + + return QVariant(); +} + +QVariant AbsencesModel::headerData(int section, Qt::Orientation orientation, int role) const +{ + switch(orientation) + { + case Qt::Horizontal: + switch(role) + { + case Qt::DisplayRole: + case Qt::EditRole: + switch(section) + { + case 0: return tr("altRepresentative"); + case 1: return tr("compositeId"); + case 2: return tr("end"); + case 3: return tr("hourCategory"); + case 4: return tr("openMarking"); + case 5: return tr("persNr"); + case 6: return tr("representative"); + case 7: return tr("start"); + case 8: return tr("text"); + } + } + default: + qt_noop(); + } + + return QVariant(); +} + +void AbsencesModel::setDate(const QDate &date) +{ + m_date = date; + + auto oldEnabled = enabled(); + + m_reply = m_erfassung.doGetAbsences(m_userId, m_date, m_date); + connect(m_reply.get(), &ZeiterfassungReply::finished, this, &AbsencesModel::finished); + + if(oldEnabled != enabled()) + Q_EMIT enabledChanged(enabled()); +} + +void AbsencesModel::finished() +{ + if(!m_reply->success()) + Q_EMIT errorOccured(m_reply->message()); + + beginResetModel(); + m_absences = m_reply->absences(); + endResetModel(); + + auto oldEnabled = enabled(); + + m_reply = Q_NULLPTR; + + if(oldEnabled != enabled()) + Q_EMIT enabledChanged(enabled()); +} diff --git a/plugins/absenceplugin/absencesmodel.h b/plugins/absenceplugin/absencesmodel.h new file mode 100644 index 0000000..0353e5e --- /dev/null +++ b/plugins/absenceplugin/absencesmodel.h @@ -0,0 +1,44 @@ +#pragma once + +#include + +#include +#include + +#include "replies/getabsencesreply.h" + +class ZeiterfassungApi; + +class AbsencesModel : public QAbstractListModel +{ + Q_OBJECT + Q_PROPERTY(bool enabled READ enabled NOTIFY enabledChanged) + +public: + explicit AbsencesModel(int userId, const QDate &date, ZeiterfassungApi &erfassung, QObject *parent = Q_NULLPTR); + + bool enabled() const; + + // QAbstractItemModel interface + int rowCount(const QModelIndex &parent) const Q_DECL_OVERRIDE; + int columnCount(const QModelIndex &parent) const Q_DECL_OVERRIDE; + QVariant data(const QModelIndex &index, int role) const Q_DECL_OVERRIDE; + QVariant headerData(int section, Qt::Orientation orientation, int role) const Q_DECL_OVERRIDE; + +Q_SIGNALS: + void enabledChanged(bool enabled); + void errorOccured(const QString &message); + +public Q_SLOTS: + void setDate(const QDate &date); + +private Q_SLOTS: + void finished(); + +private: + int m_userId; + QDate m_date; + ZeiterfassungApi &m_erfassung; + std::unique_ptr m_reply; + QVector m_absences; +}; diff --git a/plugins/absenceplugin/absencewidget.cpp b/plugins/absenceplugin/absencewidget.cpp new file mode 100644 index 0000000..444f87f --- /dev/null +++ b/plugins/absenceplugin/absencewidget.cpp @@ -0,0 +1,23 @@ +#include "absencewidget.h" + +#include "stripswidget.h" +#include "mainwindow.h" + +#include "absencedialog.h" + +AbsenceWidget::AbsenceWidget(StripsWidget &stripsWidget) : + QToolButton(&stripsWidget), + m_stripsWidget(stripsWidget) +{ + setIcon(QIcon(QStringLiteral(":/zeiterfassung/plugins/absenceplugin/images/absence.png"))); + setText(tr("Absence")); + + connect(this, &QAbstractButton::pressed, this, &AbsenceWidget::pressedSlot); +} + +void AbsenceWidget::pressedSlot() +{ + AbsenceDialog dialog(m_stripsWidget.mainWindow().userInfo().userId, m_stripsWidget.date(), + m_stripsWidget.mainWindow().erfassung(), this); + dialog.exec(); +} diff --git a/plugins/absenceplugin/absencewidget.h b/plugins/absenceplugin/absencewidget.h new file mode 100644 index 0000000..a93cc34 --- /dev/null +++ b/plugins/absenceplugin/absencewidget.h @@ -0,0 +1,19 @@ +#pragma once + +#include + +class StripsWidget; + +class AbsenceWidget : public QToolButton +{ + Q_OBJECT + +public: + explicit AbsenceWidget(StripsWidget &stripsWidget); + +private Q_SLOTS: + void pressedSlot(); + +private: + StripsWidget &m_stripsWidget; +}; diff --git a/plugins/absenceplugin/images/absence.png b/plugins/absenceplugin/images/absence.png new file mode 100644 index 0000000..4a33f1c Binary files /dev/null and b/plugins/absenceplugin/images/absence.png differ diff --git a/plugins/absenceplugin/translations/absenceplugin_de.ts b/plugins/absenceplugin/translations/absenceplugin_de.ts new file mode 100644 index 0000000..8f0589b --- /dev/null +++ b/plugins/absenceplugin/translations/absenceplugin_de.ts @@ -0,0 +1,83 @@ + + + + + AbsenceDialog + + + Absences + Abwesenheiten + + + + Absences for %0 + Abwesenheiten für %0 + + + + dd.MM.yyyy + dd.MM.yyyy + + + + Could not load absences! + Konnte Abwesenheiten nicht laden! + + + + AbsenceWidget + + + Absence + Abwesenheit + + + + AbsencesModel + + + altRepresentative + + + + + compositeId + + + + + end + + + + + hourCategory + + + + + openMarking + + + + + persNr + + + + + representative + + + + + start + + + + + text + + + + diff --git a/plugins/absenceplugin/translations/absenceplugin_en.ts b/plugins/absenceplugin/translations/absenceplugin_en.ts new file mode 100644 index 0000000..b02f346 --- /dev/null +++ b/plugins/absenceplugin/translations/absenceplugin_en.ts @@ -0,0 +1,83 @@ + + + + + AbsenceDialog + + + Absences + + + + + Absences for %0 + + + + + dd.MM.yyyy + + + + + Could not load absences! + + + + + AbsenceWidget + + + Absence + + + + + AbsencesModel + + + altRepresentative + + + + + compositeId + + + + + end + + + + + hourCategory + + + + + openMarking + + + + + persNr + + + + + representative + + + + + start + + + + + text + + + + diff --git a/plugins/lunchmealplugin/lunchmealwidget.cpp b/plugins/lunchmealplugin/lunchmealwidget.cpp index f93b4b5..62efaa9 100644 --- a/plugins/lunchmealplugin/lunchmealwidget.cpp +++ b/plugins/lunchmealplugin/lunchmealwidget.cpp @@ -35,8 +35,6 @@ void LunchMealWidget::pressedSlot() void LunchMealWidget::dateChanged(const QDate &date) { - qDebug() << "called"; - setEnabled(false); setVisible(false); diff --git a/plugins/plugins.pro b/plugins/plugins.pro index 647ff3d..2857a61 100644 --- a/plugins/plugins.pro +++ b/plugins/plugins.pro @@ -1,6 +1,7 @@ TEMPLATE = subdirs -SUBDIRS += advancedviewplugin \ +SUBDIRS += absenceplugin \ + advancedviewplugin \ devtoolsplugin \ lunchmealplugin \ profileplugin \ diff --git a/plugins/presenceplugin/presencewidget.cpp b/plugins/presenceplugin/presencewidget.cpp index 190476d..ee7ddbb 100644 --- a/plugins/presenceplugin/presencewidget.cpp +++ b/plugins/presenceplugin/presencewidget.cpp @@ -5,6 +5,7 @@ #include #include #include +#include #include @@ -71,7 +72,7 @@ void PresenceWidget::finished() icon = QIcon(QStringLiteral(":zeiterfassung/plugins/presenceplugin/images/not-present.png")); } else - qWarning() << "unknown presence" << status.firstName << status.lastName << status.presence; + qCritical() << "unknown presence" << status.firstName << status.lastName << status.presence; m_menu->addAction(icon, tr("%0 %1").arg(status.firstName).arg(status.lastName)); } diff --git a/plugins/reportsplugin/reportswidget.cpp b/plugins/reportsplugin/reportswidget.cpp index b5292a1..30eba00 100644 --- a/plugins/reportsplugin/reportswidget.cpp +++ b/plugins/reportsplugin/reportswidget.cpp @@ -4,6 +4,7 @@ #include #include #include +#include #include #include #include diff --git a/plugins/weatherplugin/weatherwidget.cpp b/plugins/weatherplugin/weatherwidget.cpp index 4bdb88d..764bf99 100644 --- a/plugins/weatherplugin/weatherwidget.cpp +++ b/plugins/weatherplugin/weatherwidget.cpp @@ -3,8 +3,7 @@ #include #include #include -#include -#include +#include #include #include #include diff --git a/zeiterfassungcorelib/replies/getabsencesreply.cpp b/zeiterfassungcorelib/replies/getabsencesreply.cpp new file mode 100644 index 0000000..107adc6 --- /dev/null +++ b/zeiterfassungcorelib/replies/getabsencesreply.cpp @@ -0,0 +1,77 @@ +#include "getabsencesreply.h" + +#include +#include +#include +#include +#include +#include + +#include "zeiterfassungapi.h" + +GetAbsencesReply::GetAbsencesReply(std::unique_ptr &&reply, ZeiterfassungApi *zeiterfassung) : + ZeiterfassungReply(zeiterfassung), + m_reply(std::move(reply)) +{ + connect(m_reply.get(), &QNetworkReply::finished, this, &GetAbsencesReply::requestFinished); +} + +const QVector &GetAbsencesReply::absences() const +{ + return m_absences; +} + +void GetAbsencesReply::requestFinished() +{ + if(m_reply->error() != QNetworkReply::NoError) + { + setSuccess(false); + setMessage(tr("Request error occured: %0").arg(m_reply->errorString())); + goto end; + } + + { + QJsonParseError error; + QJsonDocument document = QJsonDocument::fromJson(m_reply->readAll(), &error); + if(error.error != QJsonParseError::NoError) + { + setSuccess(false); + setMessage(tr("Parsing JSON failed: %0").arg(error.errorString())); + goto end; + } + + if(!document.isArray()) + { + setSuccess(false); + setMessage(tr("JSON document is not an array!")); + goto end; + } + + auto arr = document.array(); + + setSuccess(true); + m_absences.clear(); + m_absences.reserve(arr.count()); + for(const auto &val : arr) + { + auto obj = val.toObject(); + + m_absences.append({ + obj.value(QStringLiteral("altRepresentative")).toInt(), + obj.value(QStringLiteral("compositeId")).toString(), + QDate::fromString(QString::number(obj.value(QStringLiteral("end")).toInt()), QStringLiteral("yyyyMMdd")), + obj.value(QStringLiteral("hourCategory")).toString(), + obj.value(QStringLiteral("openMarking")).toString(), + obj.value(QStringLiteral("persNr")).toInt(), + obj.value(QStringLiteral("representative")).toInt(), + QDate::fromString(QString::number(obj.value(QStringLiteral("start")).toInt()), QStringLiteral("yyyyMMdd")), + obj.value(QStringLiteral("text")).toString() + }); + } + } + + end: + m_reply = Q_NULLPTR; + + Q_EMIT finished(); +} diff --git a/zeiterfassungcorelib/replies/getabsencesreply.h b/zeiterfassungcorelib/replies/getabsencesreply.h new file mode 100644 index 0000000..1a8cbf4 --- /dev/null +++ b/zeiterfassungcorelib/replies/getabsencesreply.h @@ -0,0 +1,43 @@ +#pragma once + +#include + +#include +#include +#include +#include + +#include "zeiterfassungcorelib_global.h" +#include "zeiterfassungreply.h" + +class ZeiterfassungApi; + +class ZEITERFASSUNGCORELIBSHARED_EXPORT GetAbsencesReply : public ZeiterfassungReply +{ + Q_OBJECT + +public: + explicit GetAbsencesReply(std::unique_ptr &&reply, ZeiterfassungApi *zeiterfassung); + + struct Absence + { + int altRepresentative; + QString compositeId; + QDate end; + QString hourCategory; + QString openMarking; + int persNr; + int representative; + QDate start; + QString text; + }; + + const QVector &absences() const; + +private Q_SLOTS: + void requestFinished(); + +private: + std::unique_ptr m_reply; + QVector m_absences; +}; diff --git a/zeiterfassungcorelib/replies/getbookingsreply.h b/zeiterfassungcorelib/replies/getbookingsreply.h index 2272829..adb2836 100644 --- a/zeiterfassungcorelib/replies/getbookingsreply.h +++ b/zeiterfassungcorelib/replies/getbookingsreply.h @@ -2,6 +2,7 @@ #include +#include #include #include diff --git a/zeiterfassungcorelib/replies/gettimeassignmentsreply.h b/zeiterfassungcorelib/replies/gettimeassignmentsreply.h index cd97149..46a1cb5 100644 --- a/zeiterfassungcorelib/replies/gettimeassignmentsreply.h +++ b/zeiterfassungcorelib/replies/gettimeassignmentsreply.h @@ -2,6 +2,8 @@ #include +#include +#include #include #include diff --git a/zeiterfassungcorelib/replies/getuserinforeply.h b/zeiterfassungcorelib/replies/getuserinforeply.h index 7003506..0f4ecd5 100644 --- a/zeiterfassungcorelib/replies/getuserinforeply.h +++ b/zeiterfassungcorelib/replies/getuserinforeply.h @@ -2,6 +2,8 @@ #include +#include +#include #include #include "zeiterfassungcorelib_global.h" diff --git a/zeiterfassungcorelib/zeiterfassungapi.cpp b/zeiterfassungcorelib/zeiterfassungapi.cpp index 34b11c2..16d0a02 100644 --- a/zeiterfassungcorelib/zeiterfassungapi.cpp +++ b/zeiterfassungcorelib/zeiterfassungapi.cpp @@ -9,20 +9,21 @@ #include #include -#include "replies/createbookingreply.h" -#include "replies/createtimeassignmentreply.h" -#include "replies/deletebookingreply.h" -#include "replies/deletetimeassignmentreply.h" -#include "replies/getreportreply.h" -#include "replies/getbookingsreply.h" -#include "replies/getpresencestatusreply.h" -#include "replies/getprojectsreply.h" -#include "replies/gettimeassignmentsreply.h" #include "replies/loginpagereply.h" #include "replies/loginreply.h" -#include "replies/updatebookingreply.h" -#include "replies/updatetimeassignmentreply.h" #include "replies/getuserinforeply.h" +#include "replies/getbookingsreply.h" +#include "replies/createbookingreply.h" +#include "replies/updatebookingreply.h" +#include "replies/deletebookingreply.h" +#include "replies/gettimeassignmentsreply.h" +#include "replies/createtimeassignmentreply.h" +#include "replies/updatetimeassignmentreply.h" +#include "replies/deletetimeassignmentreply.h" +#include "replies/getprojectsreply.h" +#include "replies/getreportreply.h" +#include "replies/getpresencestatusreply.h" +#include "replies/getabsencesreply.h" //add support for pre cpp14 compilers #include "cpp14polyfills.h" @@ -286,3 +287,15 @@ std::unique_ptr ZeiterfassungApi::doGetPresenceStatus() return std::make_unique(std::unique_ptr(m_manager->get(request)), this); } + +std::unique_ptr ZeiterfassungApi::doGetAbsences(int userId, const QDate &start, const QDate &end) +{ + QNetworkRequest request(QUrl(QStringLiteral("%0json/fulldayAbsences?start=%1&end=%2&pnrLst=%3") + .arg(m_url) + .arg(start.toString(QStringLiteral("yyyyMMdd"))) + .arg(end.toString(QStringLiteral("yyyyMMdd"))) + .arg(userId))); + request.setRawHeader(QByteArrayLiteral("sisAppName"), QByteArrayLiteral("bookingCalendar")); + + return std::make_unique(std::unique_ptr(m_manager->get(request)), this); +} diff --git a/zeiterfassungcorelib/zeiterfassungapi.h b/zeiterfassungcorelib/zeiterfassungapi.h index b1320ee..8af9b71 100644 --- a/zeiterfassungcorelib/zeiterfassungapi.h +++ b/zeiterfassungcorelib/zeiterfassungapi.h @@ -25,6 +25,7 @@ class DeleteTimeAssignmentReply; class GetProjectsReply; class GetReportReply; class GetPresenceStatusReply; +class GetAbsencesReply; class ZEITERFASSUNGCORELIBSHARED_EXPORT ZeiterfassungApi : public QObject { @@ -63,6 +64,7 @@ public: std::unique_ptr doGetProjects(int userId, const QDate &date); std::unique_ptr doGetReport(int userId, const QDate &date); std::unique_ptr doGetPresenceStatus(); + std::unique_ptr doGetAbsences(int userId, const QDate &start, const QDate &end); private: QString m_url; diff --git a/zeiterfassungcorelib/zeiterfassungcorelib.pro b/zeiterfassungcorelib/zeiterfassungcorelib.pro index 8c0d06f..9ba114a 100644 --- a/zeiterfassungcorelib/zeiterfassungcorelib.pro +++ b/zeiterfassungcorelib/zeiterfassungcorelib.pro @@ -20,6 +20,7 @@ SOURCES += timeutils.cpp \ replies/createtimeassignmentreply.cpp \ replies/deletebookingreply.cpp \ replies/deletetimeassignmentreply.cpp \ + replies/getabsencesreply.cpp \ replies/getbookingsreply.cpp \ replies/getpresencestatusreply.cpp \ replies/getprojectsreply.cpp \ @@ -41,6 +42,7 @@ HEADERS += cpp14polyfills.h \ replies/createtimeassignmentreply.h \ replies/deletebookingreply.h \ replies/deletetimeassignmentreply.h \ + replies/getabsencesreply.h \ replies/getbookingsreply.h \ replies/getpresencestatusreply.h \ replies/getprojectsreply.h \ diff --git a/zeiterfassungguilib/dialogs/authenticationdialog.ui b/zeiterfassungguilib/dialogs/authenticationdialog.ui index 7a35741..e68034f 100644 --- a/zeiterfassungguilib/dialogs/authenticationdialog.ui +++ b/zeiterfassungguilib/dialogs/authenticationdialog.ui @@ -37,7 +37,7 @@ - :/zeiterfassungguilib/images/authentication.png + :/zeiterfassungguilib/images/authentication.png true @@ -105,7 +105,7 @@ - +