diff --git a/replies/getbookingsreply.cpp b/replies/getbookingsreply.cpp index 6f97f50..d08704a 100644 --- a/replies/getbookingsreply.cpp +++ b/replies/getbookingsreply.cpp @@ -48,6 +48,7 @@ void GetBookingsReply::requestFinished() setSuccess(true); m_bookings.clear(); + m_bookings.reserve(arr.count()); for(const auto &val : arr) { auto obj = val.toObject(); diff --git a/replies/getpresencestatusreply.cpp b/replies/getpresencestatusreply.cpp new file mode 100644 index 0000000..de95aa3 --- /dev/null +++ b/replies/getpresencestatusreply.cpp @@ -0,0 +1,69 @@ +#include "getpresencestatusreply.h" + +#include +#include +#include +#include +#include + +GetPresenceStatusReply::GetPresenceStatusReply(std::unique_ptr &&reply, ZeiterfassungApi *zeiterfassung) : + ZeiterfassungReply(zeiterfassung), + m_reply(std::move(reply)) +{ + connect(m_reply.get(), &QNetworkReply::finished, this, &GetPresenceStatusReply::requestFinished); +} + +const QVector &GetPresenceStatusReply::presenceStatuses() const +{ + return m_presenceStatuses; +} + +void GetPresenceStatusReply::requestFinished() +{ + if(m_reply->error() != QNetworkReply::NoError) + { + setSuccess(false); + setMessage(tr("Request error occured: %0").arg(m_reply->error())); + 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_presenceStatuses.clear(); + m_presenceStatuses.reserve(arr.count()); + for(const auto &val : arr) + { + auto obj = val.toObject(); + + m_presenceStatuses.append({ + obj.value(QStringLiteral("persNr")).toInt(), + obj.value(QStringLiteral("firstName")).toString(), + obj.value(QStringLiteral("lastName")).toString(), + obj.value(QStringLiteral("presence")).toString() + }); + } + } + + end: + m_reply = Q_NULLPTR; + + Q_EMIT finished(); +} diff --git a/replies/getpresencestatusreply.h b/replies/getpresencestatusreply.h new file mode 100644 index 0000000..f75b230 --- /dev/null +++ b/replies/getpresencestatusreply.h @@ -0,0 +1,28 @@ +#ifndef GETPRESENCESTATUSREPLY_H +#define GETPRESENCESTATUSREPLY_H + +#include + +#include + +#include "zeiterfassungreply.h" +#include "zeiterfassungapi.h" + +class GetPresenceStatusReply : public ZeiterfassungReply +{ + Q_OBJECT + +public: + explicit GetPresenceStatusReply(std::unique_ptr &&reply, ZeiterfassungApi *zeiterfassung); + + const QVector &presenceStatuses() const; + +private Q_SLOTS: + void requestFinished(); + +private: + std::unique_ptr m_reply; + QVector m_presenceStatuses; +}; + +#endif // GETPRESENCESTATUSREPLY_H diff --git a/replies/getprojectsreply.cpp b/replies/getprojectsreply.cpp index ab2fb73..9c18ebb 100644 --- a/replies/getprojectsreply.cpp +++ b/replies/getprojectsreply.cpp @@ -66,6 +66,7 @@ void GetProjectsReply::requestFinished() setSuccess(true); m_projects.clear(); + m_projects.reserve(elementsArr.count()); for(const auto &val : elementsArr) { auto obj = val.toObject(); diff --git a/replies/gettimeassignmentsreply.cpp b/replies/gettimeassignmentsreply.cpp index bd86c93..9d04093 100644 --- a/replies/gettimeassignmentsreply.cpp +++ b/replies/gettimeassignmentsreply.cpp @@ -49,6 +49,7 @@ void GetTimeAssignmentsReply::requestFinished() setSuccess(true); m_timeAssignments.clear(); + m_timeAssignments.reserve(arr.count()); for(const auto &val : arr) { auto obj = val.toObject(); diff --git a/zeiterfassung.pro b/zeiterfassung.pro index edb45ac..4fdd91e 100755 --- a/zeiterfassung.pro +++ b/zeiterfassung.pro @@ -45,7 +45,8 @@ SOURCES += main.cpp \ replies/getprojectsreply.cpp \ replies/getauswertungreply.cpp \ replies/zeiterfassungreply.cpp \ - replies/deletetimeassignmentreply.cpp + replies/deletetimeassignmentreply.cpp \ + replies/getpresencestatusreply.cpp HEADERS += \ mainwindow.h \ @@ -77,7 +78,8 @@ HEADERS += \ replies/getauswertungreply.h \ replies/zeiterfassungreply.h \ replies/deletetimeassignmentreply.h \ - cpp14polyfills.h + cpp14polyfills.h \ + replies/getpresencestatusreply.h FORMS += \ mainwindow.ui \ diff --git a/zeiterfassungapi.cpp b/zeiterfassungapi.cpp index c0a86d0..d723091 100644 --- a/zeiterfassungapi.cpp +++ b/zeiterfassungapi.cpp @@ -15,6 +15,7 @@ #include "replies/deletetimeassignmentreply.h" #include "replies/getauswertungreply.h" #include "replies/getbookingsreply.h" +#include "replies/getpresencestatusreply.h" #include "replies/getprojectsreply.h" #include "replies/gettimeassignmentsreply.h" #include "replies/loginpagereply.h" @@ -297,3 +298,13 @@ std::unique_ptr ZeiterfassungApi::doGetAuswertung(int userId return std::make_unique(std::move(reply), this); } + +std::unique_ptr ZeiterfassungApi::doGetPresenceStatus() +{ + QNetworkRequest request(QUrl(m_url % "json/presencestatus")); + request.setRawHeader(QByteArrayLiteral("sisAppName"), QByteArrayLiteral("presenceStatus")); + + auto reply = std::unique_ptr(m_manager->get(request)); + + return std::make_unique(std::move(reply), this); +} diff --git a/zeiterfassungapi.h b/zeiterfassungapi.h index e403c2a..86bfa0c 100644 --- a/zeiterfassungapi.h +++ b/zeiterfassungapi.h @@ -23,6 +23,7 @@ class UpdateTimeAssignmentReply; class DeleteTimeAssignmentReply; class GetProjectsReply; class GetAuswertungReply; +class GetPresenceStatusReply; class ZeiterfassungApi : public QObject { @@ -73,6 +74,14 @@ public: QString value; }; + struct PresenceStatus + { + int userId; + QString firstName; + QString lastName; + QString presence; + }; + std::unique_ptr doLoginPage(); std::unique_ptr doLogin(const QString &username, const QString &password); std::unique_ptr doUserInfo(); @@ -97,6 +106,7 @@ public: std::unique_ptr doGetProjects(int userId, const QDate &date); std::unique_ptr doGetAuswertung(int userId, const QDate &date); + std::unique_ptr doGetPresenceStatus(); private: QString m_url;