Replaced Kontierung with TimeAssignment for better translations

This commit is contained in:
0xFEEDC0DE64
2017-12-05 21:03:03 +01:00
parent 409ac9a716
commit 7ddab6885f
24 changed files with 586 additions and 542 deletions

View File

@@ -7,9 +7,15 @@
<x>0</x>
<y>0</y>
<width>400</width>
<height>300</height>
<height>236</height>
</rect>
</property>
<property name="maximumSize">
<size>
<width>16777215</width>
<height>0</height>
</size>
</property>
<property name="windowTitle">
<string>Dialog</string>
</property>

View File

@@ -10,6 +10,12 @@
<height>181</height>
</rect>
</property>
<property name="maximumSize">
<size>
<width>16777215</width>
<height>0</height>
</size>
</property>
<property name="windowTitle">
<string>Dialog</string>
</property>

View File

@@ -7,9 +7,15 @@
<x>0</x>
<y>0</y>
<width>400</width>
<height>300</height>
<height>237</height>
</rect>
</property>
<property name="maximumSize">
<size>
<width>16777215</width>
<height>0</height>
</size>
</property>
<property name="windowTitle">
<string>Dialog</string>
</property>

View File

@@ -13,7 +13,7 @@ SettingsDialog::SettingsDialog(ZeiterfassungSettings &settings, QWidget *parent)
ui->lineEditBuchungKommenBackgroundColor->setText(settings.buchungKommenBackgroundColor());
ui->lineEditBuchungGehenBackgroundColor->setText(settings.buchungGehenBackgroundColor());
ui->lineEditBuchungOtherBackgroundColor->setText(settings.buchungOtherBackgroundColor());
ui->lineEditKontierungBackgroundColor->setText(settings.kontierungBackgroundColor());
ui->lineEditTimeAssignmentBackgroundColor->setText(settings.timeAssignmentBackgroundColor());
connect(ui->buttonBox, &QDialogButtonBox::accepted, this, &SettingsDialog::submit);
}
@@ -31,8 +31,8 @@ void SettingsDialog::submit()
m_settings.setBuchungGehenBackgroundColor(ui->lineEditBuchungGehenBackgroundColor->text());
if(ui->lineEditBuchungOtherBackgroundColor->text() != m_settings.buchungOtherBackgroundColor())
m_settings.setBuchungOtherBackgroundColor(ui->lineEditBuchungOtherBackgroundColor->text());
if(ui->lineEditKontierungBackgroundColor->text() != m_settings.kontierungBackgroundColor())
m_settings.setKontierungBackgroundColor(ui->lineEditKontierungBackgroundColor->text());
if(ui->lineEditTimeAssignmentBackgroundColor->text() != m_settings.timeAssignmentBackgroundColor())
m_settings.setTimeAssignmentBackgroundColor(ui->lineEditTimeAssignmentBackgroundColor->text());
accept();
}

View File

@@ -7,9 +7,15 @@
<x>0</x>
<y>0</y>
<width>647</width>
<height>300</height>
<height>235</height>
</rect>
</property>
<property name="maximumSize">
<size>
<width>16777215</width>
<height>0</height>
</size>
</property>
<property name="windowTitle">
<string>Dialog</string>
</property>
@@ -54,12 +60,12 @@
</widget>
</item>
<item row="3" column="0">
<widget class="QLabel" name="kontierungBackgroundColor">
<widget class="QLabel" name="labelTimeAssignmentBackgroundColor">
<property name="text">
<string>kontierungBackgroundColor</string>
<string>timeAssignmentBackgroundColor</string>
</property>
<property name="buddy">
<cstring>lineEditKontierungBackgroundColor</cstring>
<cstring>lineEditTimeAssignmentBackgroundColor</cstring>
</property>
</widget>
</item>
@@ -73,7 +79,7 @@
<widget class="QLineEdit" name="lineEditBuchungOtherBackgroundColor"/>
</item>
<item row="3" column="1">
<widget class="QLineEdit" name="lineEditKontierungBackgroundColor"/>
<widget class="QLineEdit" name="lineEditTimeAssignmentBackgroundColor"/>
</item>
</layout>
</item>

View File

@@ -1,5 +1,5 @@
#include "kontierungdialog.h"
#include "ui_kontierungdialog.h"
#include "timeassignmentdialog.h"
#include "ui_timeassignmentdialog.h"
#include <QMap>
#include <QStringBuilder>
@@ -7,10 +7,10 @@
#include "zeiterfassungsettings.h"
KontierungDialog::KontierungDialog(const QMap<QString, QString> &projekte, const ZeiterfassungSettings &settings,
TimeAssignmentDialog::TimeAssignmentDialog(const QMap<QString, QString> &projekte, const ZeiterfassungSettings &settings,
QWidget *parent) :
QDialog(parent),
ui(new Ui::KontierungDialog)
ui(new Ui::TimeAssignmentDialog)
{
ui->setupUi(this);
@@ -49,37 +49,37 @@ KontierungDialog::KontierungDialog(const QMap<QString, QString> &projekte, const
ui->comboBoxText->clearEditText();
}
KontierungDialog::~KontierungDialog()
TimeAssignmentDialog::~TimeAssignmentDialog()
{
delete ui;
}
QTime KontierungDialog::getTime() const
QTime TimeAssignmentDialog::getTime() const
{
return ui->timeEditTime->time();
}
void KontierungDialog::setTime(const QTime &time)
void TimeAssignmentDialog::setTime(const QTime &time)
{
ui->timeEditTime->setTime(time);
}
QTime KontierungDialog::getTimespan() const
QTime TimeAssignmentDialog::getTimespan() const
{
return ui->timeEditTimespan->time();
}
void KontierungDialog::setTimespan(const QTime &timespan)
void TimeAssignmentDialog::setTimespan(const QTime &timespan)
{
ui->timeEditTimespan->setTime(timespan);
}
QString KontierungDialog::getProjekt() const
QString TimeAssignmentDialog::getProjekt() const
{
return ui->comboBoxProjekt->currentData().toString();
}
void KontierungDialog::setProjekt(const QString &projekt)
void TimeAssignmentDialog::setProjekt(const QString &projekt)
{
auto index = ui->comboBoxProjekt->findData(projekt);
if(index >= 0)
@@ -88,32 +88,32 @@ void KontierungDialog::setProjekt(const QString &projekt)
qWarning() << "could not find projekt" << projekt;
}
QString KontierungDialog::getSubprojekt() const
QString TimeAssignmentDialog::getSubprojekt() const
{
return ui->comboBoxSubprojekt->currentText();
}
void KontierungDialog::setSubprojekt(const QString &subprojekt)
void TimeAssignmentDialog::setSubprojekt(const QString &subprojekt)
{
ui->comboBoxSubprojekt->setCurrentText(subprojekt);
}
QString KontierungDialog::getWorkpackage() const
QString TimeAssignmentDialog::getWorkpackage() const
{
return ui->comboBoxWorkpackage->currentText();
}
void KontierungDialog::setWorkpackage(const QString &workpackage)
void TimeAssignmentDialog::setWorkpackage(const QString &workpackage)
{
ui->comboBoxWorkpackage->setCurrentText(workpackage);
}
QString KontierungDialog::getText() const
QString TimeAssignmentDialog::getText() const
{
return ui->comboBoxText->currentText();
}
void KontierungDialog::setText(const QString &text)
void TimeAssignmentDialog::setText(const QString &text)
{
ui->comboBoxText->setCurrentText(text);
}

View File

@@ -1,5 +1,5 @@
#ifndef KONTIERUNGDIALOG_H
#define KONTIERUNGDIALOG_H
#ifndef TIMEASSIGNMENTDIALOG_H
#define TIMEASSIGNMENTDIALOG_H
#include <QDialog>
#include <QTime>
@@ -8,16 +8,16 @@ template <class Key, class T> class QMap;
class ZeiterfassungSettings;
namespace Ui { class KontierungDialog; }
namespace Ui { class TimeAssignmentDialog; }
class KontierungDialog : public QDialog
class TimeAssignmentDialog : public QDialog
{
Q_OBJECT
public:
explicit KontierungDialog(const QMap<QString, QString> &projekte, const ZeiterfassungSettings &settings,
explicit TimeAssignmentDialog(const QMap<QString, QString> &projekte, const ZeiterfassungSettings &settings,
QWidget *parent = 0);
~KontierungDialog();
~TimeAssignmentDialog();
QTime getTime() const;
void setTime(const QTime &time);
@@ -38,7 +38,7 @@ public:
void setText(const QString &text);
private:
Ui::KontierungDialog *ui;
Ui::TimeAssignmentDialog *ui;
};
#endif // KONTIERUNGDIALOG_H
#endif // TIMEASSIGNMENTDIALOG_H

View File

@@ -1,15 +1,21 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>KontierungDialog</class>
<widget class="QDialog" name="KontierungDialog">
<class>TimeAssignmentDialog</class>
<widget class="QDialog" name="TimeAssignmentDialog">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>400</width>
<height>300</height>
<height>307</height>
</rect>
</property>
<property name="maximumSize">
<size>
<width>16777215</width>
<height>0</height>
</size>
</property>
<property name="windowTitle">
<string>Dialog</string>
</property>
@@ -17,7 +23,7 @@
<item>
<widget class="QLabel" name="labelTitle">
<property name="text">
<string>&lt;h1&gt;Kontierung&lt;/h1&gt;</string>
<string>&lt;h1&gt;Time assignment&lt;/h1&gt;</string>
</property>
</widget>
</item>
@@ -140,7 +146,7 @@
<connection>
<sender>buttonBox</sender>
<signal>accepted()</signal>
<receiver>KontierungDialog</receiver>
<receiver>TimeAssignmentDialog</receiver>
<slot>accept()</slot>
<hints>
<hint type="sourcelabel">
@@ -156,7 +162,7 @@
<connection>
<sender>buttonBox</sender>
<signal>rejected()</signal>
<receiver>KontierungDialog</receiver>
<receiver>TimeAssignmentDialog</receiver>
<slot>reject()</slot>
<hints>
<hint type="sourcelabel">

View File

@@ -18,12 +18,12 @@
#include "eventloopwithstatus.h"
#include "dialogs/aboutmedialog.h"
#include "dialogs/buchungdialog.h"
#include "dialogs/kontierungdialog.h"
#include "dialogs/timeassignmentdialog.h"
#include "dialogs/settingsdialog.h"
#include "strips/buchungstrip.h"
#include "strips/kontierungstrip.h"
#include "strips/timeassignmentstrip.h"
#include "models/buchungenmodel.h"
#include "models/kontierungenmodel.h"
#include "models/timeassignmentsmodel.h"
MainWindow::MainWindow(ZeiterfassungSettings &settings, Zeiterfassung &erfassung, const Zeiterfassung::UserInfo &userInfo, QWidget *parent) :
QMainWindow(parent),
@@ -32,7 +32,7 @@ MainWindow::MainWindow(ZeiterfassungSettings &settings, Zeiterfassung &erfassung
m_erfassung(erfassung),
m_userInfo(userInfo),
m_buchungenModel(new BuchungenModel(erfassung, this)),
m_kontierungenModel(new KontierungenModel(erfassung, this)),
m_timeAssignmentsModel(new TimeAssignmentsModel(erfassung, this)),
m_flag(false)
{
ui->setupUi(this);
@@ -51,8 +51,7 @@ MainWindow::MainWindow(ZeiterfassungSettings &settings, Zeiterfassung &erfassung
file.setAutoRemove(false);
if(!file.open())
{
QMessageBox::warning(this, tr("Could not open auswertung!"), tr("Auswertung could not be written:\n\n%0")
.arg(file.errorString()));
QMessageBox::warning(this, tr("Could not open auswertung!"), tr("Could not open auswertung!") % "\n\n" % file.errorString());
return;
}
@@ -95,12 +94,12 @@ MainWindow::MainWindow(ZeiterfassungSettings &settings, Zeiterfassung &erfassung
connect(ui->pushButtonEnd, &QAbstractButton::pressed, this, &MainWindow::pushButtonEndPressed);
ui->treeViewBuchungen->setModel(m_buchungenModel);
ui->treeViewKontierungen->setModel(m_kontierungenModel);
ui->treeViewTimeAssignments->setModel(m_timeAssignmentsModel);
connect(ui->treeViewBuchungen, &QWidget::customContextMenuRequested,
this, &MainWindow::contextMenuBuchung);
connect(ui->treeViewKontierungen, &QWidget::customContextMenuRequested,
this, &MainWindow::contextMenuKontierung);
connect(ui->treeViewTimeAssignments, &QWidget::customContextMenuRequested,
this, &MainWindow::contextMenuTimeAssignment);
ui->statusbar->addPermanentWidget(m_workingTimeLabel = new QLabel(ui->statusbar));
m_workingTimeLabel->setFrameShape(QFrame::Panel);
@@ -157,9 +156,9 @@ void MainWindow::refresh(bool forceAuswertung)
ui->pushButtonStart->setEnabled(false);
ui->pushButtonEnd->setEnabled(false);
ui->treeViewBuchungen->setEnabled(false);
ui->treeViewKontierungen->setEnabled(false);
ui->treeViewTimeAssignments->setEnabled(false);
m_workingTimeLabel->setText(tr("Working time: %0").arg(tr("???")));
m_workingTimeLabel->setText(tr("%0: %1").arg(tr("Working time")).arg(tr("???")));
auto waitForBuchugen = m_buchungenModel->refresh(m_userInfo.userId, ui->dateEditDate->date(), ui->dateEditDate->date());
if(waitForBuchugen)
@@ -168,18 +167,18 @@ void MainWindow::refresh(bool forceAuswertung)
this, &MainWindow::refreshBuchungenFinished);
}
auto waitForKontierungen = m_kontierungenModel->refresh(m_userInfo.userId, ui->dateEditDate->date(), ui->dateEditDate->date());
if(waitForKontierungen)
auto waitForTimeAssignments = m_timeAssignmentsModel->refresh(m_userInfo.userId, ui->dateEditDate->date(), ui->dateEditDate->date());
if(waitForTimeAssignments)
{
connect(m_kontierungenModel, &KontierungenModel::refreshFinished,
this, &MainWindow::refreshKontierungenFinished);
connect(m_timeAssignmentsModel, &TimeAssignmentsModel::refreshFinished,
this, &MainWindow::refreshTimeAssignmentsFinished);
}
if(!waitForBuchugen || !waitForKontierungen)
if(!waitForBuchugen || !waitForTimeAssignments)
QMessageBox::warning(this, tr("Unknown error occured."), tr("An unknown error occured."));
if(waitForBuchugen || waitForKontierungen)
m_flag = waitForBuchugen == waitForKontierungen;
if(waitForBuchugen || waitForTimeAssignments)
m_flag = waitForBuchugen == waitForTimeAssignments;
else
{
ui->actionToday->setEnabled(true);
@@ -194,8 +193,8 @@ void MainWindow::refresh(bool forceAuswertung)
auto auswertungDate = QDate(ui->dateEditDate->date().year(), ui->dateEditDate->date().month(), 1);
if(forceAuswertung || m_auswertungDate != auswertungDate)
{
m_balanceLabel->setText(tr("Balance: %0").arg(tr("???")));
m_holidaysLabel->setText(tr("Holidays: %0").arg(tr("???")));
m_balanceLabel->setText(tr("%0: %1").arg(tr("Balance")).arg(tr("???")));
m_holidaysLabel->setText(tr("%0: %1").arg(tr("Holidays")).arg(tr("???")));
ui->actionAuswertung->setEnabled(false);
m_auswertung.clear();
@@ -222,7 +221,7 @@ void MainWindow::getProjekteFinished(bool success, const QString &message, const
if(!success)
{
QMessageBox::warning(this, tr("Could not load Buchungen!"), tr("Could not load Buchungen:\n\n%0").arg(message));
QMessageBox::warning(this, tr("Could not load Buchungen!"), tr("Could not load Buchungen!") % "\n\n" % message);
return;
}
@@ -242,7 +241,7 @@ void MainWindow::getAuswertungFinished(bool success, const QString &message, con
if(!success)
{
m_auswertungDate = QDate();
QMessageBox::warning(this, tr("Could not load Auswertung!"), tr("Could not load Auswertung:\n\n%0").arg(message));
QMessageBox::warning(this, tr("Could not load Auswertung!"), tr("Could not load Auswertung!") % "\n\n" % message);
return;
}
@@ -264,13 +263,21 @@ void MainWindow::getAuswertungFinished(bool success, const QString &message, con
static QRegularExpression regex(QStringLiteral("Gleitzeit +([0-9]+\\:[0-9]+\\-?) +([0-9]+\\:[0-9]+\\-?)"));
auto match = regex.match(content);
if(match.hasMatch())
{
gleitzeit = match.captured(2);
if(gleitzeit.endsWith(QChar('-')))
{
gleitzeit.chop(1);
gleitzeit = QChar('-') % gleitzeit;
}
gleitzeit = tr("%0h").arg(gleitzeit);
}
else
qWarning() << "Gleitzeit not found";
}
m_balanceLabel->setText(tr("Balance: %0").arg(gleitzeit));
m_holidaysLabel->setText(tr("Holidays: %0").arg(urlaubsAnspruch));
m_balanceLabel->setText(tr("%0: %1").arg(tr("Balance")).arg(gleitzeit));
m_holidaysLabel->setText(tr("%0: %1").arg(tr("Holidays")).arg(urlaubsAnspruch));
}
void MainWindow::refreshBuchungenFinished(bool success, const QString &message)
@@ -287,16 +294,16 @@ void MainWindow::refreshBuchungenFinished(bool success, const QString &message)
validateEntries();
if(!success)
QMessageBox::warning(Q_NULLPTR, tr("Could not refresh Buchungen!"), tr("Could not refresh Buchungen:\n\n%0").arg(message));
QMessageBox::warning(Q_NULLPTR, tr("Could not refresh Buchungen!"), tr("Could not refresh Buchungen!") % "\n\n" % message);
}
void MainWindow::refreshKontierungenFinished(bool success, const QString &message)
void MainWindow::refreshTimeAssignmentsFinished(bool success, const QString &message)
{
disconnect(m_kontierungenModel, &KontierungenModel::refreshFinished,
this, &MainWindow::refreshKontierungenFinished);
disconnect(m_timeAssignmentsModel, &TimeAssignmentsModel::refreshFinished,
this, &MainWindow::refreshTimeAssignmentsFinished);
if(success)
ui->treeViewKontierungen->setEnabled(true);
ui->treeViewTimeAssignments->setEnabled(true);
if(m_flag)
m_flag = false;
@@ -304,7 +311,7 @@ void MainWindow::refreshKontierungenFinished(bool success, const QString &messag
validateEntries();
if(!success)
QMessageBox::warning(Q_NULLPTR, tr("Could not refresh Kontierungen!"), tr("Could not refresh Kontierungen:\n\n%0").arg(message));
QMessageBox::warning(Q_NULLPTR, tr("Could not refresh time assignments!"), tr("Could not refresh time assignments!") % "\n\n" % message);
}
void MainWindow::contextMenuBuchung(const QPoint &pos)
@@ -372,7 +379,7 @@ void MainWindow::contextMenuBuchung(const QPoint &pos)
}
else
{
QMessageBox::warning(this, tr("Could not update Buchung!"), tr("Could not update Buchung:\n\n%0").arg(eventLoop.message()));
QMessageBox::warning(this, tr("Could not update Buchung!"), tr("Could not update Buchung!") % "\n\n" % eventLoop.message());
goto again1;
}
}
@@ -425,7 +432,7 @@ void MainWindow::contextMenuBuchung(const QPoint &pos)
}
}
else
QMessageBox::warning(this, tr("Could not delete Buchung!"), tr("Could not delete Buchung:\n\n%0").arg(eventLoop.message()));
QMessageBox::warning(this, tr("Could not delete Buchung!"), tr("Could not delete Buchung!") % "\n\n" % eventLoop.message());
}
}
}
@@ -484,7 +491,7 @@ void MainWindow::contextMenuBuchung(const QPoint &pos)
}
else
{
QMessageBox::warning(this, tr("Could not create Buchung!"), tr("Could not create Buchung:\n\n%0").arg(eventLoop.message()));
QMessageBox::warning(this, tr("Could not create Buchung!"), tr("Could not create Buchung!") % "\n\n" % eventLoop.message());
goto again2;
}
}
@@ -492,34 +499,34 @@ void MainWindow::contextMenuBuchung(const QPoint &pos)
}
}
void MainWindow::contextMenuKontierung(const QPoint &pos)
void MainWindow::contextMenuTimeAssignment(const QPoint &pos)
{
auto index = ui->treeViewKontierungen->indexAt(pos);
auto index = ui->treeViewTimeAssignments->indexAt(pos);
if(index.isValid())
{
auto kontierung = m_kontierungenModel->getKontierung(index);
auto timeAssignment = m_timeAssignmentsModel->getTimeAssignment(index);
QMenu menu;
auto editAction = menu.addAction(tr("Edit"));
auto deleteAction = menu.addAction(tr("Delete"));
auto selectedAction = menu.exec(ui->treeViewKontierungen->viewport()->mapToGlobal(pos));
auto selectedAction = menu.exec(ui->treeViewTimeAssignments->viewport()->mapToGlobal(pos));
if(selectedAction == editAction)
{
KontierungDialog dialog(m_projekte, m_settings, this);
dialog.setTime(kontierung.time);
dialog.setTimespan(kontierung.timespan);
dialog.setProjekt(kontierung.projekt);
dialog.setSubprojekt(kontierung.subprojekt);
dialog.setWorkpackage(kontierung.workpackage);
dialog.setText(kontierung.text);
TimeAssignmentDialog dialog(m_projekte, m_settings, this);
dialog.setTime(timeAssignment.time);
dialog.setTimespan(timeAssignment.timespan);
dialog.setProjekt(timeAssignment.projekt);
dialog.setSubprojekt(timeAssignment.subprojekt);
dialog.setWorkpackage(timeAssignment.workpackage);
dialog.setText(timeAssignment.text);
again1:
if(dialog.exec() == QDialog::Accepted)
{
EventLoopWithStatus eventLoop;
connect(&m_erfassung, &Zeiterfassung::updateKontierungFinished, &eventLoop, &EventLoopWithStatus::quitWithStatus);
connect(&m_erfassung, &Zeiterfassung::updateTimeAssignmentFinished, &eventLoop, &EventLoopWithStatus::quitWithStatus);
m_erfassung.doUpdateKontierung(kontierung.id, m_userInfo.userId, ui->dateEditDate->date(),
m_erfassung.doUpdateTimeAssignment(timeAssignment.id, m_userInfo.userId, ui->dateEditDate->date(),
dialog.getTime(), dialog.getTimespan(),
dialog.getProjekt(), dialog.getSubprojekt(),
dialog.getWorkpackage(), dialog.getText());
@@ -539,7 +546,7 @@ void MainWindow::contextMenuKontierung(const QPoint &pos)
ui->comboBoxText->setEnabled(false);
ui->pushButtonStart->setEnabled(false);
ui->pushButtonEnd->setEnabled(false);
ui->treeViewKontierungen->setEnabled(false);
ui->treeViewTimeAssignments->setEnabled(false);
m_settings.prependProjekt(dialog.getProjekt());
m_settings.prependSubprojekt(dialog.getSubprojekt());
@@ -548,10 +555,10 @@ void MainWindow::contextMenuKontierung(const QPoint &pos)
clearStrips();
if(m_kontierungenModel->refresh(m_userInfo.userId, ui->dateEditDate->date(), ui->dateEditDate->date()))
if(m_timeAssignmentsModel->refresh(m_userInfo.userId, ui->dateEditDate->date(), ui->dateEditDate->date()))
{
connect(m_kontierungenModel, &KontierungenModel::refreshFinished,
this, &MainWindow::refreshKontierungenFinished);
connect(m_timeAssignmentsModel, &TimeAssignmentsModel::refreshFinished,
this, &MainWindow::refreshTimeAssignmentsFinished);
m_flag = false;
}
else
@@ -565,7 +572,7 @@ void MainWindow::contextMenuKontierung(const QPoint &pos)
}
else
{
QMessageBox::warning(this, tr("Could not update Kontierung!"), tr("Could not update Kontierung:\n\n%0").arg(eventLoop.message()));
QMessageBox::warning(this, tr("Could not update time assignment!"), tr("Could not update time assignment!") % "\n\n" % eventLoop.message());
goto again1;
}
}
@@ -573,15 +580,15 @@ void MainWindow::contextMenuKontierung(const QPoint &pos)
else if(selectedAction == deleteAction)
{
QMessageBox msgBox;
msgBox.setText("Do you really want to delete the Kontierung?");
msgBox.setText("Do you really want to delete the time assignment?");
msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::Cancel);
msgBox.setDefaultButton(QMessageBox::Cancel);
if(msgBox.exec() == QMessageBox::Yes)
{
EventLoopWithStatus eventLoop;
connect(&m_erfassung, &Zeiterfassung::deleteKontierungFinished, &eventLoop, &EventLoopWithStatus::quitWithStatus);
connect(&m_erfassung, &Zeiterfassung::deleteTimeAssignmentFinished, &eventLoop, &EventLoopWithStatus::quitWithStatus);
m_erfassung.doDeleteKontierung(kontierung.id);
m_erfassung.doDeleteTimeAssignment(timeAssignment.id);
eventLoop.exec();
if(eventLoop.success())
@@ -598,14 +605,14 @@ void MainWindow::contextMenuKontierung(const QPoint &pos)
ui->comboBoxText->setEnabled(false);
ui->pushButtonStart->setEnabled(false);
ui->pushButtonEnd->setEnabled(false);
ui->treeViewKontierungen->setEnabled(false);
ui->treeViewTimeAssignments->setEnabled(false);
clearStrips();
if(m_kontierungenModel->refresh(m_userInfo.userId, ui->dateEditDate->date(), ui->dateEditDate->date()))
if(m_timeAssignmentsModel->refresh(m_userInfo.userId, ui->dateEditDate->date(), ui->dateEditDate->date()))
{
connect(m_kontierungenModel, &KontierungenModel::refreshFinished,
this, &MainWindow::refreshKontierungenFinished);
connect(m_timeAssignmentsModel, &TimeAssignmentsModel::refreshFinished,
this, &MainWindow::refreshTimeAssignmentsFinished);
m_flag = false;
}
else
@@ -618,7 +625,7 @@ void MainWindow::contextMenuKontierung(const QPoint &pos)
}
}
else
QMessageBox::warning(this, tr("Could not delete Kontierung!"), tr("Could not delete Kontierung:\n\n%0").arg(eventLoop.message()));
QMessageBox::warning(this, tr("Could not delete time assignment!"), tr("Could not delete time assignment!") % "\n\n" % eventLoop.message());
}
}
}
@@ -626,17 +633,17 @@ void MainWindow::contextMenuKontierung(const QPoint &pos)
{
QMenu menu;
auto createAction = menu.addAction(tr("Create"));
auto selectedAction = menu.exec(ui->treeViewKontierungen->viewport()->mapToGlobal(pos));
auto selectedAction = menu.exec(ui->treeViewTimeAssignments->viewport()->mapToGlobal(pos));
if(selectedAction == createAction)
{
KontierungDialog dialog(m_projekte, m_settings, this);
TimeAssignmentDialog dialog(m_projekte, m_settings, this);
again2:
if(dialog.exec() == QDialog::Accepted)
{
EventLoopWithStatus eventLoop;
connect(&m_erfassung, &Zeiterfassung::createKontierungFinished, &eventLoop, &EventLoopWithStatus::quitWithStatus);
connect(&m_erfassung, &Zeiterfassung::createTimeAssignmentFinished, &eventLoop, &EventLoopWithStatus::quitWithStatus);
m_erfassung.doCreateKontierung(m_userInfo.userId, ui->dateEditDate->date(),
m_erfassung.doCreateTimeAssignment(m_userInfo.userId, ui->dateEditDate->date(),
dialog.getTime(), dialog.getTimespan(),
dialog.getProjekt(), dialog.getSubprojekt(),
dialog.getWorkpackage(), dialog.getText());
@@ -656,7 +663,7 @@ void MainWindow::contextMenuKontierung(const QPoint &pos)
ui->comboBoxText->setEnabled(false);
ui->pushButtonStart->setEnabled(false);
ui->pushButtonEnd->setEnabled(false);
ui->treeViewKontierungen->setEnabled(false);
ui->treeViewTimeAssignments->setEnabled(false);
m_settings.prependProjekt(dialog.getProjekt());
m_settings.prependSubprojekt(dialog.getSubprojekt());
@@ -665,10 +672,10 @@ void MainWindow::contextMenuKontierung(const QPoint &pos)
clearStrips();
if(m_kontierungenModel->refresh(m_userInfo.userId, ui->dateEditDate->date(), ui->dateEditDate->date()))
if(m_timeAssignmentsModel->refresh(m_userInfo.userId, ui->dateEditDate->date(), ui->dateEditDate->date()))
{
connect(m_kontierungenModel, &KontierungenModel::refreshFinished,
this, &MainWindow::refreshKontierungenFinished);
connect(m_timeAssignmentsModel, &TimeAssignmentsModel::refreshFinished,
this, &MainWindow::refreshTimeAssignmentsFinished);
m_flag = false;
}
else
@@ -682,7 +689,7 @@ void MainWindow::contextMenuKontierung(const QPoint &pos)
}
else
{
QMessageBox::warning(this, tr("Could not create Kontierung!"), tr("Could not create Kontierung:\n\n%0").arg(eventLoop.message()));
QMessageBox::warning(this, tr("Could not create time assignment!"), tr("Could not create time assignment!") % "\n\n" % eventLoop.message());
goto again2;
}
}
@@ -705,33 +712,33 @@ void MainWindow::pushButtonStartPressed()
if(!eventLoop.success())
{
QMessageBox::warning(this, tr("Could not create Buchung!"), tr("Could not create Buchung:\n\n%0").arg(eventLoop.message()));
QMessageBox::warning(this, tr("Could not create Buchung!"), tr("Could not create Buchung!") % "\n\n" % eventLoop.message());
refresh(true);
return;
}
}
if(m_kontierungenModel->rbegin() != m_kontierungenModel->rend())
if(m_timeAssignmentsModel->rbegin() != m_timeAssignmentsModel->rend())
{
auto kontierung = *m_kontierungenModel->rbegin();
if(kontierung.timespan == QTime(0, 0))
auto timeAssignment = *m_timeAssignmentsModel->rbegin();
if(timeAssignment.timespan == QTime(0, 0))
{
EventLoopWithStatus eventLoop;
connect(&m_erfassung, &Zeiterfassung::updateKontierungFinished, &eventLoop, &EventLoopWithStatus::quitWithStatus);
connect(&m_erfassung, &Zeiterfassung::updateTimeAssignmentFinished, &eventLoop, &EventLoopWithStatus::quitWithStatus);
auto timespan = timeBetween(m_lastKontierungStart, ui->timeEditTime->time());
auto timespan = timeBetween(m_lastTimeAssignmentStart, ui->timeEditTime->time());
m_erfassung.doUpdateKontierung(kontierung.id, m_userInfo.userId, kontierung.date,
kontierung.time, timespan,
kontierung.projekt, kontierung.subprojekt,
kontierung.workpackage, kontierung.text);
m_erfassung.doUpdateTimeAssignment(timeAssignment.id, m_userInfo.userId, timeAssignment.date,
timeAssignment.time, timespan,
timeAssignment.projekt, timeAssignment.subprojekt,
timeAssignment.workpackage, timeAssignment.text);
eventLoop.exec();
if(eventLoop.success())
m_kontierungTime = timeAdd(m_kontierungTime, timespan);
m_timeAssignmentTime = timeAdd(m_timeAssignmentTime, timespan);
else
{
QMessageBox::warning(this, tr("Could not update Kontierung!"), tr("Could not update Kontierung:\n\n%0").arg(eventLoop.message()));
QMessageBox::warning(this, tr("Could not update time assignment!"), tr("Could not update time assignment!") % "\n\n" % eventLoop.message());
refresh(true);
return;
}
@@ -739,17 +746,17 @@ void MainWindow::pushButtonStartPressed()
}
EventLoopWithStatus eventLoop;
connect(&m_erfassung, &Zeiterfassung::createKontierungFinished, &eventLoop, &EventLoopWithStatus::quitWithStatus);
connect(&m_erfassung, &Zeiterfassung::createTimeAssignmentFinished, &eventLoop, &EventLoopWithStatus::quitWithStatus);
m_erfassung.doCreateKontierung(m_userInfo.userId, ui->dateEditDate->date(),
m_kontierungTime, QTime(0, 0),
m_erfassung.doCreateTimeAssignment(m_userInfo.userId, ui->dateEditDate->date(),
m_timeAssignmentTime, QTime(0, 0),
ui->comboBoxProjekt->currentData().toString(), ui->comboBoxSubprojekt->currentText(),
ui->comboBoxWorkpackage->currentText(), ui->comboBoxText->currentText());
eventLoop.exec();
if(!eventLoop.success())
{
QMessageBox::warning(this, tr("Could not create Kontierung!"), tr("Could not create Kontierung:\n\n%0").arg(eventLoop.message()));
QMessageBox::warning(this, tr("Could not create time assignment!"), tr("Could not create time assignment!") % "\n\n" % eventLoop.message());
refresh(true);
return;
}
@@ -777,32 +784,32 @@ void MainWindow::pushButtonEndPressed()
if(!eventLoop.success())
{
QMessageBox::warning(this, tr("Could not create Buchung!"), tr("Could not create Buchung:\n\n%0").arg(eventLoop.message()));
QMessageBox::warning(this, tr("Could not create Buchung!"), tr("Could not create Buchung!") % "\n\n" % eventLoop.message());
refresh(true);
return;
}
}
{
auto kontierung = *m_kontierungenModel->rbegin();
Q_ASSERT(kontierung.timespan == QTime(0, 0));
auto timeAssignment = *m_timeAssignmentsModel->rbegin();
Q_ASSERT(timeAssignment.timespan == QTime(0, 0));
EventLoopWithStatus eventLoop;
connect(&m_erfassung, &Zeiterfassung::updateKontierungFinished, &eventLoop, &EventLoopWithStatus::quitWithStatus);
connect(&m_erfassung, &Zeiterfassung::updateTimeAssignmentFinished, &eventLoop, &EventLoopWithStatus::quitWithStatus);
auto timespan = timeBetween(m_lastKontierungStart, ui->timeEditTime->time());
auto timespan = timeBetween(m_lastTimeAssignmentStart, ui->timeEditTime->time());
m_erfassung.doUpdateKontierung(kontierung.id, m_userInfo.userId, kontierung.date,
kontierung.time, timespan,
kontierung.projekt, kontierung.subprojekt,
kontierung.workpackage, kontierung.text);
m_erfassung.doUpdateTimeAssignment(timeAssignment.id, m_userInfo.userId, timeAssignment.date,
timeAssignment.time, timespan,
timeAssignment.projekt, timeAssignment.subprojekt,
timeAssignment.workpackage, timeAssignment.text);
eventLoop.exec();
if(eventLoop.success())
m_kontierungTime = timeAdd(m_kontierungTime, timespan);
m_timeAssignmentTime = timeAdd(m_timeAssignmentTime, timespan);
else
{
QMessageBox::warning(this, tr("Could not update Kontierung!"), tr("Could not update Kontierung:\n\n%0").arg(eventLoop.message()));
QMessageBox::warning(this, tr("Could not update time assignment!"), tr("Could not update time assignment!") % "\n\n" % eventLoop.message());
refresh(true);
return;
}
@@ -824,24 +831,24 @@ void MainWindow::validateEntries()
if(!ui->treeViewBuchungen->isEnabled())
return;
if(!ui->treeViewKontierungen->isEnabled())
if(!ui->treeViewTimeAssignments->isEnabled())
return;
auto buchungenIter = m_buchungenModel->constBegin();
auto kontierungenIter = m_kontierungenModel->constBegin();
auto timeAssignmentsIter = m_timeAssignmentsModel->constBegin();
m_kontierungTime = QTime(0, 0);
m_timeAssignmentTime = QTime(0, 0);
auto buchungTimespan = QTime(0, 0);
const Zeiterfassung::Buchung *lastBuchung = Q_NULLPTR;
const Zeiterfassung::Kontierung *lastKontierung = Q_NULLPTR;
const Zeiterfassung::TimeAssignment *lastTimeAssignment = Q_NULLPTR;
QString errorMessage;
while(true)
{
if(buchungenIter == m_buchungenModel->constEnd() &&
kontierungenIter == m_kontierungenModel->constEnd())
timeAssignmentsIter == m_timeAssignmentsModel->constEnd())
{
goto after;
}
@@ -863,7 +870,10 @@ void MainWindow::validateEntries()
if(lastBuchung)
{
auto label = new QLabel(tr("Pause: %0h").arg(timeBetween(lastBuchung->time, startBuchung.time).toString(QStringLiteral("HH:mm"))), ui->scrollAreaWidgetContents);
auto label = new QLabel(tr("%0: %1")
.arg(tr("Break"))
.arg(tr("%0h").arg(timeBetween(lastBuchung->time, startBuchung.time).toString(QStringLiteral("HH:mm")))),
ui->scrollAreaWidgetContents);
ui->verticalLayout2->addWidget(label);
label->setMinimumHeight(20);
label->setMaximumHeight(20);
@@ -871,106 +881,106 @@ void MainWindow::validateEntries()
lastBuchung = &startBuchung;
m_lastKontierungStart = startBuchung.time;
m_lastTimeAssignmentStart = startBuchung.time;
ui->verticalLayout2->addWidget(new BuchungStrip(startBuchung.id, startBuchung.time, startBuchung.type, m_settings, ui->scrollAreaWidgetContents));
if(kontierungenIter == m_kontierungenModel->constEnd())
if(timeAssignmentsIter == m_timeAssignmentsModel->constEnd())
{
errorMessage = tr("Missing Kontierung.");
errorMessage = tr("Missing time assignment.");
goto after;
}
auto kontierung = *kontierungenIter++;
if(kontierung.time != m_kontierungTime)
auto timeAssignment = *timeAssignmentsIter++;
if(timeAssignment.time != m_timeAssignmentTime)
{
errorMessage = tr("Expected time %0 but got %1 Kontierung.\nKontierung ID: %2")
.arg(m_kontierungTime.toString("HH:mm:ss"))
.arg(kontierung.time.toString("HH:mm:ss"))
.arg(kontierung.id);
errorMessage = tr("Expected %0 but received %1 in time assignment.\nTime assignment ID: %2")
.arg(m_timeAssignmentTime.toString("HH:mm:ss"))
.arg(timeAssignment.time.toString("HH:mm:ss"))
.arg(timeAssignment.id);
goto after;
}
lastKontierung = &kontierung;
lastTimeAssignment = &timeAssignment;
ui->verticalLayout2->addWidget(new KontierungStrip(kontierung.id, kontierung.timespan, buildProjektString(kontierung.projekt),
kontierung.subprojekt, kontierung.workpackage, kontierung.text,
ui->verticalLayout2->addWidget(new TimeAssignmentStrip(timeAssignment.id, timeAssignment.timespan, buildProjektString(timeAssignment.projekt),
timeAssignment.subprojekt, timeAssignment.workpackage, timeAssignment.text,
m_settings, ui->scrollAreaWidgetContents));
if(kontierung.timespan == QTime(0, 0))
if(timeAssignment.timespan == QTime(0, 0))
{
if(buchungenIter != m_buchungenModel->constEnd())
{
errorMessage = tr("There is another Buchung after an unfinished Kontierung.\nBuchung ID: %0\nKontierung ID: %1")
errorMessage = tr("There is another Buchung after an unfinished time assignment.\nBuchung ID: %0\nTime assignment ID: %1")
.arg(buchungenIter->id)
.arg(kontierung.id);
.arg(timeAssignment.id);
goto after;
}
if(kontierungenIter != m_kontierungenModel->constEnd())
if(timeAssignmentsIter != m_timeAssignmentsModel->constEnd())
{
errorMessage = tr("There is another Kontierung after an unfinished Kontierung.\nKontierung ID: %0\nKontierung ID: %1")
.arg(kontierungenIter->id)
.arg(kontierung.id);
errorMessage = tr("There is another time assignment after an unfinished time assignment.\nTime assignment ID: %0\nTime assignment ID: %1")
.arg(timeAssignmentsIter->id)
.arg(timeAssignment.id);
goto after;
}
ui->timeEditTime->setMinimumTime(timeAdd(m_lastKontierungStart, QTime(0, 1)));
ui->timeEditTime->setMinimumTime(timeAdd(m_lastTimeAssignmentStart, QTime(0, 1)));
ui->pushButtonStart->setText(tr("Switch"));
ui->pushButtonEnd->setEnabled(true);
goto after;
}
else
{
m_kontierungTime = timeAdd(m_kontierungTime, kontierung.timespan);
m_lastKontierungStart = timeAdd(m_lastKontierungStart, kontierung.timespan);
m_timeAssignmentTime = timeAdd(m_timeAssignmentTime, timeAssignment.timespan);
m_lastTimeAssignmentStart = timeAdd(m_lastTimeAssignmentStart, timeAssignment.timespan);
if(buchungenIter == m_buchungenModel->constEnd())
{
while(true)
{
if(kontierungenIter == m_kontierungenModel->constEnd())
if(timeAssignmentsIter == m_timeAssignmentsModel->constEnd())
{
errorMessage = tr("The last Kontierung is finished without Gehen-Buchung\nKontierung ID: %0")
.arg(kontierung.id);
errorMessage = tr("The last time assignment is finished without Gehen-Buchung\nTime assignment ID: %0")
.arg(timeAssignment.id);
goto after;
}
kontierung = *kontierungenIter++;
if(kontierung.time != m_kontierungTime)
timeAssignment = *timeAssignmentsIter++;
if(timeAssignment.time != m_timeAssignmentTime)
{
errorMessage = tr("Expected time %0 but got %1 Kontierung.\nKontierung ID: %2")
.arg(m_kontierungTime.toString("HH:mm:ss"))
.arg(kontierung.time.toString("HH:mm:ss"))
.arg(kontierung.id);
errorMessage = tr("Expected %0 but received %1 in time assignment.\nTime assignment ID: %2")
.arg(m_timeAssignmentTime.toString("HH:mm:ss"))
.arg(timeAssignment.time.toString("HH:mm:ss"))
.arg(timeAssignment.id);
goto after;
}
lastKontierung = &kontierung;
lastTimeAssignment = &timeAssignment;
ui->verticalLayout2->addWidget(new KontierungStrip(kontierung.id, kontierung.timespan, buildProjektString(kontierung.projekt),
kontierung.subprojekt, kontierung.workpackage, kontierung.text,
ui->verticalLayout2->addWidget(new TimeAssignmentStrip(timeAssignment.id, timeAssignment.timespan, buildProjektString(timeAssignment.projekt),
timeAssignment.subprojekt, timeAssignment.workpackage, timeAssignment.text,
m_settings, ui->scrollAreaWidgetContents));
if(kontierung.timespan == QTime(0, 0))
if(timeAssignment.timespan == QTime(0, 0))
{
if(kontierungenIter != m_kontierungenModel->constEnd())
if(timeAssignmentsIter != m_timeAssignmentsModel->constEnd())
{
errorMessage = tr("There is another Kontierung after an unfinished Kontierung.\n"
"Kontierung ID: %0\nKontierung ID: %1")
.arg(kontierung.id)
.arg(kontierungenIter->id);
errorMessage = tr("There is another time assignment after an unfinished time assignment.\n"
"Time assignment ID: %0\nTime assignment ID: %1")
.arg(timeAssignment.id)
.arg(timeAssignmentsIter->id);
goto after;
}
ui->timeEditTime->setMinimumTime(timeAdd(m_lastKontierungStart, QTime(0, 1)));
ui->timeEditTime->setMinimumTime(timeAdd(m_lastTimeAssignmentStart, QTime(0, 1)));
ui->pushButtonStart->setText(tr("Switch"));
ui->pushButtonEnd->setEnabled(true);
goto after;
}
else
{
m_kontierungTime = timeAdd(m_kontierungTime, kontierung.timespan);
m_lastKontierungStart = timeAdd(m_lastKontierungStart, kontierung.timespan);
m_timeAssignmentTime = timeAdd(m_timeAssignmentTime, timeAssignment.timespan);
m_lastTimeAssignmentStart = timeAdd(m_lastTimeAssignmentStart, timeAssignment.timespan);
}
}
}
@@ -990,12 +1000,12 @@ void MainWindow::validateEntries()
buchungTimespan = timeAdd(buchungTimespan, timeBetween(startBuchung.time, endBuchung.time));
ui->timeEditTime->setMinimumTime(timeAdd(endBuchung.time, QTime(0, 1)));
while(m_kontierungTime < buchungTimespan)
while(m_timeAssignmentTime < buchungTimespan)
{
if(kontierungenIter == m_kontierungenModel->constEnd())
if(timeAssignmentsIter == m_timeAssignmentsModel->constEnd())
{
errorMessage = tr("Missing Kontierung! Missing: %0h")
.arg(timeBetween(m_kontierungTime, buchungTimespan).toString("HH:mm:ss"));
errorMessage = tr("Missing time assignment(s)! Missing: %0h")
.arg(timeBetween(m_timeAssignmentTime, buchungTimespan).toString("HH:mm:ss"));
{
auto label = new QLabel(errorMessage, ui->scrollAreaWidgetContents);
@@ -1009,56 +1019,56 @@ void MainWindow::validateEntries()
goto after;
}
kontierung = *kontierungenIter++;
if(kontierung.time != m_kontierungTime)
timeAssignment = *timeAssignmentsIter++;
if(timeAssignment.time != m_timeAssignmentTime)
{
errorMessage = tr("Expected time %0 but got %1 Kontierung.\nKontierung ID: %2")
.arg(m_kontierungTime.toString("HH:mm:ss"))
.arg(kontierung.time.toString("HH:mm:ss"))
.arg(kontierung.id);
errorMessage = tr("Expected %0 but received %1 in time assignment.\nTime assignment ID: %2")
.arg(m_timeAssignmentTime.toString("HH:mm:ss"))
.arg(timeAssignment.time.toString("HH:mm:ss"))
.arg(timeAssignment.id);
goto after;
}
lastKontierung = &kontierung;
lastTimeAssignment = &timeAssignment;
ui->verticalLayout2->addWidget(new KontierungStrip(kontierung.id, kontierung.timespan, buildProjektString(kontierung.projekt),
kontierung.subprojekt, kontierung.workpackage, kontierung.text,
ui->verticalLayout2->addWidget(new TimeAssignmentStrip(timeAssignment.id, timeAssignment.timespan, buildProjektString(timeAssignment.projekt),
timeAssignment.subprojekt, timeAssignment.workpackage, timeAssignment.text,
m_settings, ui->scrollAreaWidgetContents));
if(kontierung.timespan == QTime(0, 0))
if(timeAssignment.timespan == QTime(0, 0))
{
if(buchungenIter != m_buchungenModel->constEnd())
{
errorMessage = tr("There is another Buchung after an unfinished Kontierung.\n"
"Buchung ID: %0\nKontierung ID: %1")
errorMessage = tr("There is another Buchung after an unfinished time assignment.\n"
"Buchung ID: %0\nTime assignment ID: %1")
.arg(buchungenIter->id)
.arg(kontierung.id);
.arg(timeAssignment.id);
goto after;
}
if(kontierungenIter != m_kontierungenModel->constEnd())
if(timeAssignmentsIter != m_timeAssignmentsModel->constEnd())
{
errorMessage = tr("There is another Kontierung after an unfinished Kontierung.\nKontierung ID: %0\nKontierung ID: %1")
.arg(kontierungenIter->id)
.arg(kontierung.id);
errorMessage = tr("There is another time assignment after an unfinished time assignment.\nTime assignment ID: %0\nTime assignment ID: %1")
.arg(timeAssignmentsIter->id)
.arg(timeAssignment.id);
goto after;
}
ui->timeEditTime->setMinimumTime(timeAdd(m_lastKontierungStart, QTime(0, 1)));
ui->timeEditTime->setMinimumTime(timeAdd(m_lastTimeAssignmentStart, QTime(0, 1)));
ui->pushButtonStart->setText(tr("Switch"));
ui->pushButtonEnd->setEnabled(true);
goto after;
}
else
{
m_kontierungTime = timeAdd(m_kontierungTime, kontierung.timespan);
m_timeAssignmentTime = timeAdd(m_timeAssignmentTime, timeAssignment.timespan);
}
}
if(m_kontierungTime > buchungTimespan)
if(m_timeAssignmentTime > buchungTimespan)
{
errorMessage = tr("Kontierung time longer than Buchung time! Kontierung: %0 Buchung: %1")
.arg(m_kontierungTime.toString("HH:mm:ss"))
errorMessage = tr("Time assignment time longer than Buchung time! Time assignment: %0 Buchung: %1")
.arg(m_timeAssignmentTime.toString("HH:mm:ss"))
.arg(buchungTimespan.toString("HH:mm:ss"));
auto label = new QLabel(errorMessage, ui->scrollAreaWidgetContents);
@@ -1069,7 +1079,7 @@ void MainWindow::validateEntries()
ui->verticalLayout2->addWidget(new BuchungStrip(endBuchung.id, endBuchung.time, endBuchung.type, m_settings, ui->scrollAreaWidgetContents));
if(m_kontierungTime > buchungTimespan)
if(m_timeAssignmentTime > buchungTimespan)
goto after;
}
}
@@ -1077,7 +1087,7 @@ void MainWindow::validateEntries()
after:
if(errorMessage.isEmpty())
m_workingTimeLabel->setText(tr("Working time: %0").arg(m_kontierungTime.toString(QStringLiteral("HH:mm"))));
m_workingTimeLabel->setText(tr("%0: %1").arg(tr("Working time")).arg(tr("%0h").arg(m_timeAssignmentTime.toString(QStringLiteral("HH:mm")))));
else
{
auto label = new QLabel(tr("Strip rendering aborted due error."), ui->scrollAreaWidgetContents);
@@ -1090,7 +1100,7 @@ void MainWindow::validateEntries()
if(!errorMessage.isEmpty())
{
QMessageBox::warning(this, tr("Illegal state!"), tr("Your Buchungen and Kontierungen for this day are in an invalid state:\n\n%0")
QMessageBox::warning(this, tr("Illegal state!"), tr("Your Buchungen and time assignments for this day are in an invalid state:\n\n%0")
.arg(errorMessage));
return;
}

View File

@@ -11,7 +11,7 @@ class QLabel;
namespace Ui { class MainWindow; }
class ZeiterfassungSettings;
class BuchungenModel;
class KontierungenModel;
class TimeAssignmentsModel;
class MainWindow : public QMainWindow
{
@@ -31,9 +31,9 @@ private Q_SLOTS:
void getProjekteFinished(bool success, const QString &message, const QVector<Zeiterfassung::Projekt> &projekte);
void getAuswertungFinished(bool success, const QString &message, const QByteArray &content);
void refreshBuchungenFinished(bool success, const QString &message);
void refreshKontierungenFinished(bool success, const QString &message);
void refreshTimeAssignmentsFinished(bool success, const QString &message);
void contextMenuBuchung(const QPoint &pos);
void contextMenuKontierung(const QPoint &pos);
void contextMenuTimeAssignment(const QPoint &pos);
void pushButtonStartPressed();
void pushButtonEndPressed();
@@ -56,11 +56,11 @@ private:
QLabel *m_holidaysLabel;
BuchungenModel *m_buchungenModel;
KontierungenModel *m_kontierungenModel;
TimeAssignmentsModel *m_timeAssignmentsModel;
bool m_flag;
QTime m_kontierungTime;
QTime m_lastKontierungStart;
QTime m_timeAssignmentTime;
QTime m_lastTimeAssignmentStart;
};
#endif // MAINWINDOW_H

View File

@@ -233,13 +233,13 @@
</item>
</layout>
</widget>
<widget class="QGroupBox" name="groupBoxKontierungen">
<widget class="QGroupBox" name="groupBoxTimeAssignments">
<property name="title">
<string>Kontierungen</string>
<string>Time assignments</string>
</property>
<layout class="QHBoxLayout" name="horizontalLayout_2">
<item>
<widget class="QTreeView" name="treeViewKontierungen">
<widget class="QTreeView" name="treeViewTimeAssignments">
<property name="enabled">
<bool>false</bool>
</property>
@@ -273,7 +273,7 @@
<widget class="QMenu" name="menu_About">
<property name="title">
<string>&amp;About</string>
</property>v
</property>
<addaction name="actionAboutMe"/>
<addaction name="actionSettings"/>
<addaction name="separator"/>

View File

@@ -1,110 +0,0 @@
#include "kontierungenmodel.h"
KontierungenModel::KontierungenModel(Zeiterfassung &erfassung, QObject *parent) :
QAbstractListModel(parent),
m_erfassung(erfassung)
{
}
int KontierungenModel::rowCount(const QModelIndex &parent) const
{
Q_UNUSED(parent)
return m_kontierungen.count();
}
int KontierungenModel::columnCount(const QModelIndex &parent) const
{
Q_UNUSED(parent)
return 7;
}
QVariant KontierungenModel::data(const QModelIndex &index, int role) const
{
Q_ASSERT(index.row() < m_kontierungen.count());
const auto &kontierung = m_kontierungen.at(index.row());
switch(role)
{
case Qt::DisplayRole:
case Qt::EditRole:
switch(index.column())
{
case 0: return kontierung.id;
case 1: return kontierung.time;
case 2: return kontierung.timespan;
case 3: return kontierung.projekt;
case 4: return kontierung.subprojekt;
case 5: return kontierung.workpackage;
case 6: return kontierung.text;
}
}
return QVariant();
}
QVariant KontierungenModel::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("ID");
case 1: return tr("Time");
case 2: return tr("Timespan");
case 3: return tr("Projekt");
case 4: return tr("Subprojekt");
case 5: return tr("Workpackage");
case 6: return tr("Text");
}
}
}
return QVariant();
}
Zeiterfassung::Kontierung KontierungenModel::getKontierung(const QModelIndex &index) const
{
if(!index.isValid())
return Zeiterfassung::Kontierung();
Q_ASSERT(index.row() <= m_kontierungen.count());
return m_kontierungen.at(index.row());
}
bool KontierungenModel::refresh(int userId, const QDate &from, const QDate &to)
{
if(!m_erfassung.doGetKontierungen(userId, from, to))
return false;
beginResetModel();
m_kontierungen.clear();
endResetModel();
connect(&m_erfassung, &Zeiterfassung::getKontierungenFinished,
this, &KontierungenModel::getKontierungenFinished);
return true;
}
void KontierungenModel::getKontierungenFinished(bool success, const QString &message, const QVector<Zeiterfassung::Kontierung> &kontierungen)
{
disconnect(&m_erfassung, &Zeiterfassung::getKontierungenFinished,
this, &KontierungenModel::getKontierungenFinished);
if(success)
{
beginResetModel();
m_kontierungen = kontierungen;
endResetModel();
}
Q_EMIT refreshFinished(success, message);
}

View File

@@ -1,68 +0,0 @@
#ifndef KONTIERUNGENMODEL_H
#define KONTIERUNGENMODEL_H
#include <QAbstractListModel>
#include <QVector>
#include "zeiterfassung.h"
class KontierungenModel : public QAbstractListModel
{
Q_OBJECT
public:
explicit KontierungenModel(Zeiterfassung &erfassung, QObject *parent = nullptr);
// 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;
Zeiterfassung::Kontierung getKontierung(const QModelIndex &index) const;
bool refresh(int userId, const QDate &from, const QDate &to);
typedef QVector<Zeiterfassung::Kontierung>::iterator iterator;
typedef QVector<Zeiterfassung::Kontierung>::const_iterator const_iterator;
typedef QVector<Zeiterfassung::Kontierung>::reverse_iterator reverse_iterator;
typedef QVector<Zeiterfassung::Kontierung>::const_reverse_iterator const_reverse_iterator;
#if !defined(QT_STRICT_ITERATORS) || defined(Q_QDOC)
//inline iterator begin() { return m_kontierungen.begin(); }
inline const_iterator begin() const Q_DECL_NOTHROW { return m_kontierungen.begin(); }
inline const_iterator cbegin() const Q_DECL_NOTHROW { return m_kontierungen.cbegin(); }
inline const_iterator constBegin() const Q_DECL_NOTHROW { return m_kontierungen.constBegin(); }
//inline iterator end() { return m_kontierungen.end(); }
inline const_iterator end() const Q_DECL_NOTHROW { return m_kontierungen.end(); }
inline const_iterator cend() const Q_DECL_NOTHROW { return m_kontierungen.cend(); }
inline const_iterator constEnd() const Q_DECL_NOTHROW { return m_kontierungen.constEnd(); }
#else
//inline iterator begin(iterator = iterator()) { return m_kontierungen.begin(); }
inline const_iterator begin(const_iterator = const_iterator()) const Q_DECL_NOTHROW { return m_kontierungen.begin(); }
inline const_iterator cbegin(const_iterator = const_iterator()) const Q_DECL_NOTHROW { return d->constBegin(); }
inline const_iterator constBegin(const_iterator = const_iterator()) const Q_DECL_NOTHROW { return m_kontierungen.constBegin(); }
//inline iterator end(iterator = iterator()) { return m_kontierungen.end(); }
inline const_iterator end(const_iterator = const_iterator()) const Q_DECL_NOTHROW { return m_kontierungen.end(); }
inline const_iterator cend(const_iterator = const_iterator()) const Q_DECL_NOTHROW { return m_kontierungen.cend(); }
inline const_iterator constEnd(const_iterator = const_iterator()) const Q_DECL_NOTHROW { return m_kontierungen.constEnd(); }
#endif
//reverse_iterator rbegin() { return m_kontierungen.rbegin(); }
//reverse_iterator rend() { return m_kontierungen.rbegin(); }
const_reverse_iterator rbegin() const Q_DECL_NOTHROW { return m_kontierungen.rbegin(); }
const_reverse_iterator rend() const Q_DECL_NOTHROW { return m_kontierungen.rend(); }
const_reverse_iterator crbegin() const Q_DECL_NOTHROW { return m_kontierungen.crbegin(); }
const_reverse_iterator crend() const Q_DECL_NOTHROW { return m_kontierungen.crend(); }
Q_SIGNALS:
void refreshFinished(bool success, const QString &message);
private Q_SLOTS:
void getKontierungenFinished(bool success, const QString &message, const QVector<Zeiterfassung::Kontierung> &kontierungen);
private:
Zeiterfassung &m_erfassung;
QVector<Zeiterfassung::Kontierung> m_kontierungen;
};
#endif // KONTIERUNGENMODEL_H

View File

@@ -0,0 +1,110 @@
#include "timeassignmentsmodel.h"
TimeAssignmentsModel::TimeAssignmentsModel(Zeiterfassung &erfassung, QObject *parent) :
QAbstractListModel(parent),
m_erfassung(erfassung)
{
}
int TimeAssignmentsModel::rowCount(const QModelIndex &parent) const
{
Q_UNUSED(parent)
return m_timeAssignments.count();
}
int TimeAssignmentsModel::columnCount(const QModelIndex &parent) const
{
Q_UNUSED(parent)
return 7;
}
QVariant TimeAssignmentsModel::data(const QModelIndex &index, int role) const
{
Q_ASSERT(index.row() < m_timeAssignments.count());
const auto &timeAssignment = m_timeAssignments.at(index.row());
switch(role)
{
case Qt::DisplayRole:
case Qt::EditRole:
switch(index.column())
{
case 0: return timeAssignment.id;
case 1: return timeAssignment.time;
case 2: return timeAssignment.timespan;
case 3: return timeAssignment.projekt;
case 4: return timeAssignment.subprojekt;
case 5: return timeAssignment.workpackage;
case 6: return timeAssignment.text;
}
}
return QVariant();
}
QVariant TimeAssignmentsModel::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("ID");
case 1: return tr("Time");
case 2: return tr("Timespan");
case 3: return tr("Projekt");
case 4: return tr("Subprojekt");
case 5: return tr("Workpackage");
case 6: return tr("Text");
}
}
}
return QVariant();
}
Zeiterfassung::TimeAssignment TimeAssignmentsModel::getTimeAssignment(const QModelIndex &index) const
{
if(!index.isValid())
return Zeiterfassung::TimeAssignment();
Q_ASSERT(index.row() <= m_timeAssignments.count());
return m_timeAssignments.at(index.row());
}
bool TimeAssignmentsModel::refresh(int userId, const QDate &from, const QDate &to)
{
if(!m_erfassung.doGetTimeAssignments(userId, from, to))
return false;
beginResetModel();
m_timeAssignments.clear();
endResetModel();
connect(&m_erfassung, &Zeiterfassung::getTimeAssignmentsFinished,
this, &TimeAssignmentsModel::getTimeAssignmentsFinished);
return true;
}
void TimeAssignmentsModel::getTimeAssignmentsFinished(bool success, const QString &message, const QVector<Zeiterfassung::TimeAssignment> &timeAssignments)
{
disconnect(&m_erfassung, &Zeiterfassung::getTimeAssignmentsFinished,
this, &TimeAssignmentsModel::getTimeAssignmentsFinished);
if(success)
{
beginResetModel();
m_timeAssignments = timeAssignments;
endResetModel();
}
Q_EMIT refreshFinished(success, message);
}

View File

@@ -0,0 +1,68 @@
#ifndef TIMEASSIGNMENTSMODEL_H
#define TIMEASSIGNMENTSMODEL_H
#include <QAbstractListModel>
#include <QVector>
#include "zeiterfassung.h"
class TimeAssignmentsModel : public QAbstractListModel
{
Q_OBJECT
public:
explicit TimeAssignmentsModel(Zeiterfassung &erfassung, QObject *parent = nullptr);
// 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;
Zeiterfassung::TimeAssignment getTimeAssignment(const QModelIndex &index) const;
bool refresh(int userId, const QDate &from, const QDate &to);
typedef QVector<Zeiterfassung::TimeAssignment>::iterator iterator;
typedef QVector<Zeiterfassung::TimeAssignment>::const_iterator const_iterator;
typedef QVector<Zeiterfassung::TimeAssignment>::reverse_iterator reverse_iterator;
typedef QVector<Zeiterfassung::TimeAssignment>::const_reverse_iterator const_reverse_iterator;
#if !defined(QT_STRICT_ITERATORS)
//inline iterator begin() { return m_timeAssignments.begin(); }
inline const_iterator begin() const Q_DECL_NOTHROW { return m_timeAssignments.begin(); }
inline const_iterator cbegin() const Q_DECL_NOTHROW { return m_timeAssignments.cbegin(); }
inline const_iterator constBegin() const Q_DECL_NOTHROW { return m_timeAssignments.constBegin(); }
//inline iterator end() { return m_timeAssignments.end(); }
inline const_iterator end() const Q_DECL_NOTHROW { return m_timeAssignments.end(); }
inline const_iterator cend() const Q_DECL_NOTHROW { return m_timeAssignments.cend(); }
inline const_iterator constEnd() const Q_DECL_NOTHROW { return m_timeAssignments.constEnd(); }
#else
//inline iterator begin(iterator = iterator()) { return m_timeAssignments.begin(); }
inline const_iterator begin(const_iterator = const_iterator()) const Q_DECL_NOTHROW { return m_timeAssignments.begin(); }
inline const_iterator cbegin(const_iterator = const_iterator()) const Q_DECL_NOTHROW { return d->constBegin(); }
inline const_iterator constBegin(const_iterator = const_iterator()) const Q_DECL_NOTHROW { return m_timeAssignments.constBegin(); }
//inline iterator end(iterator = iterator()) { return m_timeAssignments.end(); }
inline const_iterator end(const_iterator = const_iterator()) const Q_DECL_NOTHROW { return m_timeAssignments.end(); }
inline const_iterator cend(const_iterator = const_iterator()) const Q_DECL_NOTHROW { return m_timeAssignments.cend(); }
inline const_iterator constEnd(const_iterator = const_iterator()) const Q_DECL_NOTHROW { return m_timeAssignments.constEnd(); }
#endif
//reverse_iterator rbegin() { return m_timeAssignments.rbegin(); }
//reverse_iterator rend() { return m_timeAssignments.rbegin(); }
const_reverse_iterator rbegin() const Q_DECL_NOTHROW { return m_timeAssignments.rbegin(); }
const_reverse_iterator rend() const Q_DECL_NOTHROW { return m_timeAssignments.rend(); }
const_reverse_iterator crbegin() const Q_DECL_NOTHROW { return m_timeAssignments.crbegin(); }
const_reverse_iterator crend() const Q_DECL_NOTHROW { return m_timeAssignments.crend(); }
Q_SIGNALS:
void refreshFinished(bool success, const QString &message);
private Q_SLOTS:
void getTimeAssignmentsFinished(bool success, const QString &message, const QVector<Zeiterfassung::TimeAssignment> &timeAssignments);
private:
Zeiterfassung &m_erfassung;
QVector<Zeiterfassung::TimeAssignment> m_timeAssignments;
};
#endif // TIMEASSIGNMENTSMODEL_H

View File

@@ -1,25 +0,0 @@
#ifndef KONTIERUNGSTRIP_H
#define KONTIERUNGSTRIP_H
#include <QFrame>
class QTime;
class ZeiterfassungSettings;
namespace Ui { class KontierungStrip; }
class KontierungStrip : public QFrame
{
Q_OBJECT
public:
explicit KontierungStrip(int id, const QTime &duration, const QString &projekt, const QString &subprojekt,
const QString &workpackage, const QString &text, const ZeiterfassungSettings &settings,
QWidget *parent = 0);
~KontierungStrip();
private:
Ui::KontierungStrip *ui;
};
#endif // KONTIERUNGSTRIP_H

View File

@@ -1,23 +1,23 @@
#include "kontierungstrip.h"
#include "ui_kontierungstrip.h"
#include "timeassignmentstrip.h"
#include "ui_timeassignmentstrip.h"
#include <QTime>
#include <QStringBuilder>
#include "zeiterfassungsettings.h"
KontierungStrip::KontierungStrip(int id, const QTime &duration, const QString &projekt, const QString &subprojekt,
TimeAssignmentStrip::TimeAssignmentStrip(int id, const QTime &duration, const QString &projekt, const QString &subprojekt,
const QString &workpackage, const QString &text, const ZeiterfassungSettings &settings,
QWidget *parent) :
QFrame(parent),
ui(new Ui::KontierungStrip)
ui(new Ui::TimeAssignmentStrip)
{
ui->setupUi(this);
setMinimumHeight(minimumSizeHint().height());
setMaximumHeight(minimumSizeHint().height());
setStyleSheet(QStringLiteral("%0 { background-color: %1; }").arg(staticMetaObject.className()).arg(settings.kontierungBackgroundColor()));
setStyleSheet(QStringLiteral("%0 { background-color: %1; }").arg(staticMetaObject.className()).arg(settings.timeAssignmentBackgroundColor()));
ui->labelTime->setText(duration == QTime(0, 0) ? tr("Open") : duration.toString(QStringLiteral("HH:mm")));
ui->labelProjekt->setText(projekt);
@@ -28,7 +28,7 @@ KontierungStrip::KontierungStrip(int id, const QTime &duration, const QString &p
ui->labelText->setText(text);
}
KontierungStrip::~KontierungStrip()
TimeAssignmentStrip::~TimeAssignmentStrip()
{
delete ui;
}

View File

@@ -0,0 +1,25 @@
#ifndef TIMEASSIGNMENTSTRIP_H
#define TIMEASSIGNMENTSTRIP_H
#include <QFrame>
class QTime;
class ZeiterfassungSettings;
namespace Ui { class TimeAssignmentStrip; }
class TimeAssignmentStrip : public QFrame
{
Q_OBJECT
public:
explicit TimeAssignmentStrip(int id, const QTime &duration, const QString &projekt, const QString &subprojekt,
const QString &workpackage, const QString &text, const ZeiterfassungSettings &settings,
QWidget *parent = 0);
~TimeAssignmentStrip();
private:
Ui::TimeAssignmentStrip *ui;
};
#endif // TIMEASSIGNMENTSTRIP_H

View File

@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>KontierungStrip</class>
<widget class="QFrame" name="KontierungStrip">
<class>TimeAssignmentStrip</class>
<widget class="QFrame" name="TimeAssignmentStrip">
<property name="geometry">
<rect>
<x>0</x>

View File

@@ -187,11 +187,11 @@ bool Zeiterfassung::doDeleteBuchung(int buchungId)
return true;
}
bool Zeiterfassung::doGetKontierungen(int userId, const QDate &start, const QDate &end)
bool Zeiterfassung::doGetTimeAssignments(int userId, const QDate &start, const QDate &end)
{
if(m_replies.getKontierungen)
if(m_replies.getTimeAssignments)
{
qWarning() << "another getKontierungen already processing!";
qWarning() << "another getTimeAssignments already processing!";
return false;
}
@@ -202,18 +202,20 @@ bool Zeiterfassung::doGetKontierungen(int userId, const QDate &start, const QDat
.arg(userId)));
request.setRawHeader(QByteArrayLiteral("sisAppName"), QByteArrayLiteral("bookingCalendar"));
m_replies.getKontierungen = m_manager->get(request);
connect(m_replies.getKontierungen, &QNetworkReply::finished,
this, &Zeiterfassung::getKontierungenRequestFinished);
m_replies.getTimeAssignments = m_manager->get(request);
connect(m_replies.getTimeAssignments, &QNetworkReply::finished,
this, &Zeiterfassung::getTimeAssignmentsRequestFinished);
return true;
}
bool Zeiterfassung::doCreateKontierung(int userId, const QDate &date, const QTime &time, const QTime &timespan, const QString &projekt, const QString &subprojekt, const QString &workpackage, const QString &text)
bool Zeiterfassung::doCreateTimeAssignment(int userId, const QDate &date, const QTime &time, const QTime &timespan,
const QString &projekt, const QString &subprojekt, const QString &workpackage,
const QString &text)
{
if(m_replies.createKontierung)
if(m_replies.createTimeAssignment)
{
qWarning() << "another createKontierung already processing!";
qWarning() << "another createTimeAssignment already processing!";
return false;
}
@@ -248,27 +250,29 @@ bool Zeiterfassung::doCreateKontierung(int userId, const QDate &date, const QTim
obj[QStringLiteral("koWertList")] = koWertList;
}
m_replies.createKontierung = m_manager->post(request, QJsonDocument(obj).toJson());
connect(m_replies.createKontierung, &QNetworkReply::finished,
this, &Zeiterfassung::createKontierungRequestFinished);
m_replies.createTimeAssignment = m_manager->post(request, QJsonDocument(obj).toJson());
connect(m_replies.createTimeAssignment, &QNetworkReply::finished,
this, &Zeiterfassung::createTimeAssignmentRequestFinished);
return true;
}
bool Zeiterfassung::doUpdateKontierung(int kontierungId, int userId, const QDate &date, const QTime &time, const QTime &timespan, const QString &projekt, const QString &subprojekt, const QString &workpackage, const QString &text)
bool Zeiterfassung::doUpdateTimeAssignment(int timeAssignmentId, int userId, const QDate &date, const QTime &time,
const QTime &timespan, const QString &projekt, const QString &subprojekt,
const QString &workpackage, const QString &text)
{
if(m_replies.updateKontierung)
if(m_replies.updateTimeAssignment)
{
qWarning() << "another updateKontierung already processing!";
qWarning() << "another updateTimeAssignment already processing!";
return false;
}
QNetworkRequest request(QUrl(QStringLiteral("%0json/azebooking/%1").arg(m_url).arg(kontierungId)));
QNetworkRequest request(QUrl(QStringLiteral("%0json/azebooking/%1").arg(m_url).arg(timeAssignmentId)));
request.setHeader(QNetworkRequest::ContentTypeHeader, QByteArrayLiteral("application/json"));
request.setRawHeader(QByteArrayLiteral("sisAppName"), QByteArrayLiteral("bookingCalendar"));
QJsonObject obj;
obj[QStringLiteral("bookingNr")] = kontierungId;
obj[QStringLiteral("bookingNr")] = timeAssignmentId;
obj[QStringLiteral("persNr")] = userId;
obj[QStringLiteral("bookingDate")] = date.toString("yyyyMMdd").toInt();
obj[QStringLiteral("bookingTime")] = time.toString("Hmmss").toInt();
@@ -299,29 +303,29 @@ bool Zeiterfassung::doUpdateKontierung(int kontierungId, int userId, const QDate
obj[QStringLiteral("koWertList")] = koWertList;
}
m_replies.updateKontierung = m_manager->put(request, QJsonDocument(obj).toJson());
connect(m_replies.updateKontierung, &QNetworkReply::finished,
this, &Zeiterfassung::updateKontierungRequestFinished);
m_replies.updateTimeAssignment = m_manager->put(request, QJsonDocument(obj).toJson());
connect(m_replies.updateTimeAssignment, &QNetworkReply::finished,
this, &Zeiterfassung::updateTimeAssignmentRequestFinished);
return true;
}
bool Zeiterfassung::doDeleteKontierung(int kontierungId)
bool Zeiterfassung::doDeleteTimeAssignment(int timeAssignmentId)
{
if(m_replies.deleteKontierung)
if(m_replies.deleteTimeAssignment)
{
qWarning() << "another deleteKontierung already processing!";
qWarning() << "another deleteTimeAssignment already processing!";
return false;
}
QNetworkRequest request(QUrl(QStringLiteral("%0json/azebooking/%1")
.arg(m_url)
.arg(kontierungId)));
.arg(timeAssignmentId)));
request.setRawHeader(QByteArrayLiteral("sisAppName"), QByteArrayLiteral("bookingCalendar"));
m_replies.deleteKontierung = m_manager->deleteResource(request);
connect(m_replies.deleteKontierung, &QNetworkReply::finished,
this, &Zeiterfassung::deleteKontierungRequestFinished);
m_replies.deleteTimeAssignment = m_manager->deleteResource(request);
connect(m_replies.deleteTimeAssignment, &QNetworkReply::finished,
this, &Zeiterfassung::deleteTimeAssignmentRequestFinished);
return true;
}
@@ -627,31 +631,31 @@ void Zeiterfassung::deleteBuchungRequestFinished()
m_replies.deleteBuchung = Q_NULLPTR;
}
void Zeiterfassung::getKontierungenRequestFinished()
void Zeiterfassung::getTimeAssignmentsRequestFinished()
{
if(m_replies.getKontierungen->error() != QNetworkReply::NoError)
if(m_replies.getTimeAssignments->error() != QNetworkReply::NoError)
{
Q_EMIT getKontierungenFinished(false, tr("Request error occured: %0").arg(m_replies.getKontierungen->error()), {});
Q_EMIT getTimeAssignmentsFinished(false, tr("Request error occured: %0").arg(m_replies.getTimeAssignments->error()), {});
goto end;
}
{
QJsonParseError error;
QJsonDocument document = QJsonDocument::fromJson(m_replies.getKontierungen->readAll(), &error);
QJsonDocument document = QJsonDocument::fromJson(m_replies.getTimeAssignments->readAll(), &error);
if(error.error != QJsonParseError::NoError)
{
Q_EMIT getKontierungenFinished(false, tr("Parsing JSON failed: %0").arg(error.errorString()), {});
Q_EMIT getTimeAssignmentsFinished(false, tr("Parsing JSON failed: %0").arg(error.errorString()), {});
goto end;
}
if(!document.isArray())
{
Q_EMIT getKontierungenFinished(false, tr("JSON document is not an array!"), {});
Q_EMIT getTimeAssignmentsFinished(false, tr("JSON document is not an array!"), {});
goto end;
}
auto arr = document.array();
QVector<Kontierung> kontierungen;
QVector<TimeAssignment> timeAssignments;
for(const auto &val : arr)
{
@@ -659,7 +663,7 @@ void Zeiterfassung::getKontierungenRequestFinished()
auto koWertList = obj.value(QStringLiteral("koWertList")).toArray();
kontierungen.append({
timeAssignments.append({
obj.value(QStringLiteral("bookingNr")).toInt(),
QDate::fromString(QString::number(obj.value(QStringLiteral("bookingDate")).toInt()), QStringLiteral("yyyyMMdd")),
QTime::fromString(QString("%0").arg(obj.value(QStringLiteral("bookingTime")).toInt(), 6, 10, QChar('0')), QStringLiteral("HHmmss")),
@@ -671,34 +675,34 @@ void Zeiterfassung::getKontierungenRequestFinished()
});
}
Q_EMIT getKontierungenFinished(true, QString(), kontierungen);
Q_EMIT getTimeAssignmentsFinished(true, QString(), timeAssignments);
}
end:
m_replies.getKontierungen->deleteLater();
m_replies.getKontierungen = Q_NULLPTR;
m_replies.getTimeAssignments->deleteLater();
m_replies.getTimeAssignments = Q_NULLPTR;
}
void Zeiterfassung::createKontierungRequestFinished()
void Zeiterfassung::createTimeAssignmentRequestFinished()
{
if(m_replies.createKontierung->error() != QNetworkReply::NoError)
if(m_replies.createTimeAssignment->error() != QNetworkReply::NoError)
{
Q_EMIT createKontierungFinished(false, tr("Request error occured: %0").arg(m_replies.createKontierung->error()), -1);
Q_EMIT createTimeAssignmentFinished(false, tr("Request error occured: %0").arg(m_replies.createTimeAssignment->error()), -1);
goto end;
}
{
QJsonParseError error;
QJsonDocument document = QJsonDocument::fromJson(m_replies.createKontierung->readAll(), &error);
QJsonDocument document = QJsonDocument::fromJson(m_replies.createTimeAssignment->readAll(), &error);
if(error.error != QJsonParseError::NoError)
{
Q_EMIT createKontierungFinished(false, tr("Parsing JSON failed: %0").arg(error.errorString()), -1);
Q_EMIT createTimeAssignmentFinished(false, tr("Parsing JSON failed: %0").arg(error.errorString()), -1);
goto end;
}
if(!document.isObject())
{
Q_EMIT createKontierungFinished(false, tr("JSON document is not an object!"), -1);
Q_EMIT createTimeAssignmentFinished(false, tr("JSON document is not an object!"), -1);
goto end;
}
@@ -706,40 +710,40 @@ void Zeiterfassung::createKontierungRequestFinished()
if(!obj.contains(QStringLiteral("bookingNr")))
{
Q_EMIT createKontierungFinished(false, tr("JSON does not contain bookingNr!"), -1);
Q_EMIT createTimeAssignmentFinished(false, tr("JSON does not contain bookingNr!"), -1);
goto end;
}
auto kontierungId = obj.value(QStringLiteral("bookingNr")).toInt();
auto timeAssignmentId = obj.value(QStringLiteral("bookingNr")).toInt();
Q_EMIT createKontierungFinished(true, QString(), kontierungId);
Q_EMIT createTimeAssignmentFinished(true, QString(), timeAssignmentId);
}
end:
m_replies.createKontierung->deleteLater();
m_replies.createKontierung = Q_NULLPTR;
m_replies.createTimeAssignment->deleteLater();
m_replies.createTimeAssignment = Q_NULLPTR;
}
void Zeiterfassung::updateKontierungRequestFinished()
void Zeiterfassung::updateTimeAssignmentRequestFinished()
{
if(m_replies.updateKontierung->error() != QNetworkReply::NoError)
if(m_replies.updateTimeAssignment->error() != QNetworkReply::NoError)
{
Q_EMIT updateKontierungFinished(false, tr("Request error occured: %0").arg(m_replies.updateKontierung->error()), -1);
Q_EMIT updateTimeAssignmentFinished(false, tr("Request error occured: %0").arg(m_replies.updateTimeAssignment->error()), -1);
goto end;
}
{
QJsonParseError error;
QJsonDocument document = QJsonDocument::fromJson(m_replies.updateKontierung->readAll(), &error);
QJsonDocument document = QJsonDocument::fromJson(m_replies.updateTimeAssignment->readAll(), &error);
if(error.error != QJsonParseError::NoError)
{
Q_EMIT updateKontierungFinished(false, tr("Parsing JSON failed: %0").arg(error.errorString()), -1);
Q_EMIT updateTimeAssignmentFinished(false, tr("Parsing JSON failed: %0").arg(error.errorString()), -1);
goto end;
}
if(!document.isObject())
{
Q_EMIT updateKontierungFinished(false, tr("JSON document is not an object!"), 0);
Q_EMIT updateTimeAssignmentFinished(false, tr("JSON document is not an object!"), 0);
goto end;
}
@@ -747,34 +751,34 @@ void Zeiterfassung::updateKontierungRequestFinished()
if(!obj.contains(QStringLiteral("bookingNr")))
{
Q_EMIT updateKontierungFinished(false, tr("JSON does not contain bookingNr!"), 0);
Q_EMIT updateTimeAssignmentFinished(false, tr("JSON does not contain bookingNr!"), 0);
goto end;
}
auto kontierungId = obj.value(QStringLiteral("bookingNr")).toInt();
auto timeAssignmentId = obj.value(QStringLiteral("bookingNr")).toInt();
Q_EMIT updateKontierungFinished(true, QString(), kontierungId);
Q_EMIT updateTimeAssignmentFinished(true, QString(), timeAssignmentId);
}
end:
m_replies.updateKontierung->deleteLater();
m_replies.updateKontierung = Q_NULLPTR;
m_replies.updateTimeAssignment->deleteLater();
m_replies.updateTimeAssignment = Q_NULLPTR;
}
void Zeiterfassung::deleteKontierungRequestFinished()
void Zeiterfassung::deleteTimeAssignmentRequestFinished()
{
if(m_replies.deleteKontierung->error() != QNetworkReply::NoError)
if(m_replies.deleteTimeAssignment->error() != QNetworkReply::NoError)
{
Q_EMIT deleteKontierungFinished(false, tr("Request error occured: %0").arg(m_replies.deleteKontierung->error()));
Q_EMIT deleteTimeAssignmentFinished(false, tr("Request error occured: %0").arg(m_replies.deleteTimeAssignment->error()));
goto end;
}
//only contains deleted id, so nothing to check here
Q_EMIT deleteKontierungFinished(true, QString());
Q_EMIT deleteTimeAssignmentFinished(true, QString());
end:
m_replies.deleteKontierung->deleteLater();
m_replies.deleteKontierung = Q_NULLPTR;
m_replies.deleteTimeAssignment->deleteLater();
m_replies.deleteTimeAssignment = Q_NULLPTR;
}
void Zeiterfassung::getProjekteRequestFinished()

View File

@@ -40,7 +40,7 @@ public:
QString text;
};
struct Kontierung
struct TimeAssignment
{
int id;
QDate date;
@@ -70,14 +70,14 @@ public Q_SLOTS:
const QTime &timespan, const QString &type, const QString &text);
bool doDeleteBuchung(int buchungId);
bool doGetKontierungen(int userId, const QDate &start, const QDate &end);
bool doCreateKontierung(int userId, const QDate &date, const QTime &time, const QTime &timespan,
bool doGetTimeAssignments(int userId, const QDate &start, const QDate &end);
bool doCreateTimeAssignment(int userId, const QDate &date, const QTime &time, const QTime &timespan,
const QString &projekt, const QString &subprojekt, const QString &workpackage,
const QString &text);
bool doUpdateKontierung(int kontierungId, int userId, const QDate &date, const QTime &time,
bool doUpdateTimeAssignment(int timeAssignmentId, int userId, const QDate &date, const QTime &time,
const QTime &timespan, const QString &projekt, const QString &subprojekt,
const QString &workpackage, const QString &text);
bool doDeleteKontierung(int kontierungId);
bool doDeleteTimeAssignment(int timeAssignmentId);
bool doGetProjekte(int userId, const QDate &date);
bool doGetAuswertung(int userId, const QDate &date);
@@ -94,10 +94,10 @@ Q_SIGNALS:
void updateBuchungFinished(bool success, const QString &message, int buchungId);
void deleteBuchungFinished(bool success, const QString &message);
void getKontierungenFinished(bool success, const QString &message, const QVector<Kontierung> &kontierungen);
void createKontierungFinished(bool success, const QString &message, int buchungId);
void updateKontierungFinished(bool success, const QString &message, int buchungId);
void deleteKontierungFinished(bool success, const QString &message);
void getTimeAssignmentsFinished(bool success, const QString &message, const QVector<TimeAssignment> &timeAssignments);
void createTimeAssignmentFinished(bool success, const QString &message, int timeAssignmentId);
void updateTimeAssignmentFinished(bool success, const QString &message, int timeAssignmentId);
void deleteTimeAssignmentFinished(bool success, const QString &message);
void getProjekteFinished(bool success, const QString &message, const QVector<Projekt> &projekte);
void getAuswertungFinished(bool success, const QString &message, const QByteArray &content);
@@ -112,10 +112,10 @@ private Q_SLOTS:
void updateBuchungRequestFinished();
void deleteBuchungRequestFinished();
void getKontierungenRequestFinished();
void createKontierungRequestFinished();
void updateKontierungRequestFinished();
void deleteKontierungRequestFinished();
void getTimeAssignmentsRequestFinished();
void createTimeAssignmentRequestFinished();
void updateTimeAssignmentRequestFinished();
void deleteTimeAssignmentRequestFinished();
void getProjekteRequestFinished();
void getAuswertungRequest0Finished();
@@ -135,10 +135,10 @@ private:
QNetworkReply *updateBuchung;
QNetworkReply *deleteBuchung;
QNetworkReply *getKontierungen;
QNetworkReply *createKontierung;
QNetworkReply *updateKontierung;
QNetworkReply *deleteKontierung;
QNetworkReply *getTimeAssignments;
QNetworkReply *createTimeAssignment;
QNetworkReply *updateTimeAssignment;
QNetworkReply *deleteTimeAssignment;
QNetworkReply *getProjekte;
QNetworkReply *getAuswertung;

View File

@@ -23,14 +23,14 @@ SOURCES += main.cpp \
dialogs/authenticationdialog.cpp \
dialogs/buchungdialog.cpp \
models/buchungenmodel.cpp \
dialogs/kontierungdialog.cpp \
models/kontierungenmodel.cpp \
eventloopwithstatus.cpp \
strips/buchungstrip.cpp \
strips/kontierungstrip.cpp \
zeiterfassungsettings.cpp \
dialogs/settingsdialog.cpp \
dialogs/languageselectiondialog.cpp
dialogs/languageselectiondialog.cpp \
dialogs/timeassignmentdialog.cpp \
models/timeassignmentsmodel.cpp \
strips/timeassignmentstrip.cpp
HEADERS += \
zeiterfassung.h \
@@ -39,25 +39,25 @@ HEADERS += \
dialogs/authenticationdialog.h \
dialogs/buchungdialog.h \
models/buchungenmodel.h \
dialogs/kontierungdialog.h \
models/kontierungenmodel.h \
eventloopwithstatus.h \
strips/buchungstrip.h \
strips/kontierungstrip.h \
zeiterfassungsettings.h \
dialogs/settingsdialog.h \
dialogs/languageselectiondialog.h
dialogs/languageselectiondialog.h \
dialogs/timeassignmentdialog.h \
models/timeassignmentsmodel.h \
strips/timeassignmentstrip.h
FORMS += \
mainwindow.ui \
dialogs/aboutmedialog.ui \
dialogs/authenticationdialog.ui \
dialogs/buchungdialog.ui \
dialogs/kontierungdialog.ui \
strips/buchungstrip.ui \
strips/kontierungstrip.ui \
dialogs/settingsdialog.ui \
dialogs/languageselectiondialog.ui
dialogs/languageselectiondialog.ui \
dialogs/timeassignmentdialog.ui \
strips/timeassignmentstrip.ui
RESOURCES += \
resources.qrc

View File

@@ -162,14 +162,14 @@ void ZeiterfassungSettings::setBuchungOtherBackgroundColor(const QString &buchun
setValue("buchungOtherBackgroundColor", buchungOtherBackgroundColor);
}
QString ZeiterfassungSettings::kontierungBackgroundColor() const
QString ZeiterfassungSettings::timeAssignmentBackgroundColor() const
{
return value("kontierungBackgroundColor", QStringLiteral("qlineargradient( x1:0 y1:0, x2:0 y2:1, stop:0 #7FFFFF, stop:1 #6FBFBF)")).toString();
return value("timeAssignmentBackgroundColor", QStringLiteral("qlineargradient( x1:0 y1:0, x2:0 y2:1, stop:0 #7FFFFF, stop:1 #6FBFBF)")).toString();
}
void ZeiterfassungSettings::setKontierungBackgroundColor(const QString kontierungBackgroundColor)
void ZeiterfassungSettings::setTimeAssignmentBackgroundColor(const QString timeAssignmentBackgroundColor)
{
setValue("kontierungBackgroundColor", kontierungBackgroundColor);
setValue("timeAssignmentBackgroundColor", timeAssignmentBackgroundColor);
}
void ZeiterfassungSettings::prepentItem(const QString &name, const QString &item)

View File

@@ -55,8 +55,8 @@ public:
QString buchungOtherBackgroundColor() const;
void setBuchungOtherBackgroundColor(const QString &buchungOtherBackgroundColor);
QString kontierungBackgroundColor() const;
void setKontierungBackgroundColor(const QString kontierungBackgroundColor);
QString timeAssignmentBackgroundColor() const;
void setTimeAssignmentBackgroundColor(const QString timeAssignmentBackgroundColor);
private:
void prepentItem(const QString &name, const QString &item);