Files
QtZeiterfassung/mainwindow.cpp
T

938 lines
38 KiB
C++
Raw Normal View History

2017-12-02 10:50:30 +01:00
#include "mainwindow.h"
#include "ui_mainwindow.h"
2017-12-02 18:46:46 +01:00
#include <QUrl>
2017-12-02 10:50:30 +01:00
#include <QLineEdit>
#include <QMessageBox>
#include <QStandardItem>
#include <QStringBuilder>
#include <QMenu>
#include <QLabel>
2017-12-02 18:46:46 +01:00
#include <QDir>
#include <QTemporaryFile>
#include <QDesktopServices>
2017-12-02 19:03:43 +01:00
#include <QRegularExpression>
2017-12-02 10:50:30 +01:00
#include <QDebug>
2017-12-09 01:48:18 +01:00
#include "timeutils.h"
2017-12-03 22:22:07 +01:00
#include "zeiterfassungsettings.h"
2017-12-09 04:33:52 +01:00
#include "stripfactory.h"
2017-12-09 01:48:18 +01:00
#include "stripswidget.h"
2017-12-02 10:50:30 +01:00
#include "dialogs/aboutmedialog.h"
#include "dialogs/bookingdialog.h"
#include "dialogs/timeassignmentdialog.h"
2017-12-04 20:11:11 +01:00
#include "dialogs/settingsdialog.h"
2017-12-07 00:27:39 +01:00
#include "dialogs/updatedialog.h"
#include "models/bookingsmodel.h"
#include "models/timeassignmentsmodel.h"
2017-12-02 10:50:30 +01:00
2017-12-10 11:56:00 +01:00
MainWindow::MainWindow(ZeiterfassungSettings &settings, ZeiterfassungApi &erfassung, const ZeiterfassungApi::UserInfo &userInfo, QWidget *parent) :
2017-12-02 10:50:30 +01:00
QMainWindow(parent),
ui(new Ui::MainWindow),
m_settings(settings),
m_erfassung(erfassung),
m_userInfo(userInfo),
2017-12-09 01:48:18 +01:00
m_flag(false),
m_bookingsModel(new BookingsModel(erfassung, this)),
2017-12-09 04:33:52 +01:00
m_timeAssignmentsModel(new TimeAssignmentsModel(erfassung, this)),
m_stripFactory(new StripFactory(this))
2017-12-02 10:50:30 +01:00
{
ui->setupUi(this);
2017-12-09 01:48:18 +01:00
quint8 i = 0;
for(const auto &dayName : QStringList { tr("Monday"), tr("Tuesday"), tr("Wednesday"), tr("Thursday"),
tr("Friday"), tr("Saturday"), tr("Sunday")})
{
auto widget = new QWidget(ui->widgetWeek);
auto layout = new QVBoxLayout(widget);
{
auto label = new QLabel(dayName, widget);
auto font = label->font();
font.setBold(true);
label->setFont(font);
layout->addWidget(label);
}
2017-12-09 04:33:52 +01:00
m_stripsWidgets[i] = new StripsWidget(m_stripFactory, m_projects, widget);
2017-12-09 01:48:18 +01:00
layout->addWidget(m_stripsWidgets[i++]);
layout->addStretch(1);
widget->setLayout(layout);
ui->layoutWeek->addWidget(widget, 1);
}
2017-12-08 08:28:22 +01:00
2017-12-02 19:26:40 +01:00
setWindowTitle(tr("Zeiterfassung - %0 (%1)").arg(m_userInfo.text).arg(m_userInfo.email));
2017-12-02 10:50:30 +01:00
ui->actionQuit->setShortcut(QKeySequence::Quit);
connect(ui->actionToday, &QAction::triggered, [=](){ ui->dateEditDate->setDate(QDate::currentDate()); });
ui->actionRefresh->setShortcut(QKeySequence::Refresh);
2017-12-04 20:25:33 +01:00
connect(ui->actionRefresh, &QAction::triggered, this, [=](){ refresh(true); });
2017-12-02 10:50:30 +01:00
2017-12-02 18:46:46 +01:00
connect(ui->actionAuswertung, &QAction::triggered, [=](){
QTemporaryFile file(QDir::temp().absoluteFilePath("auswertungXXXXXX.pdf"));
file.setAutoRemove(false);
if(!file.open())
{
QMessageBox::warning(this, tr("Could not open auswertung!"), tr("Could not open auswertung!") % "\n\n" % file.errorString());
2017-12-02 18:46:46 +01:00
return;
}
file.write(m_auswertung);
file.close();
if(!QDesktopServices::openUrl(QUrl::fromLocalFile(file.fileName())))
{
QMessageBox::warning(this, tr("Could not open auswertung!"), tr("Could not open default PDF viewer!"));
return;
}
});
2017-12-02 10:50:30 +01:00
connect(ui->actionAboutMe, &QAction::triggered, [=](){ AboutMeDialog(userInfo, this).exec(); });
2017-12-04 20:11:11 +01:00
connect(ui->actionSettings, &QAction::triggered, [=](){ SettingsDialog(m_settings, this).exec(); });
2017-12-02 10:50:30 +01:00
connect(ui->actionAboutQt, &QAction::triggered, [=](){ QMessageBox::aboutQt(this); });
ui->dateEditDate->setDate(QDate::currentDate());
2017-12-04 20:25:33 +01:00
connect(ui->dateEditDate, &QDateTimeEdit::dateChanged, this, [=](){ refresh(); });
2017-12-02 10:50:30 +01:00
2017-12-04 20:11:11 +01:00
connect(ui->pushButtonPrev, &QAbstractButton::pressed, [=](){ ui->dateEditDate->setDate(ui->dateEditDate->date().addDays(-1)); });
connect(ui->pushButtonNext, &QAbstractButton::pressed, [=](){ ui->dateEditDate->setDate(ui->dateEditDate->date().addDays(1)); });
2017-12-02 10:50:30 +01:00
ui->timeEditTime->setTime(timeNormalise(QTime::currentTime()));
2017-12-10 11:56:00 +01:00
connect(&m_erfassung, &ZeiterfassungApi::getProjectsFinished,
2017-12-05 21:16:46 +01:00
this, &MainWindow::getProjekctsFinished);
erfassung.doGetProjects(userInfo.userId, QDate::currentDate());
2017-12-02 10:50:30 +01:00
2017-12-05 21:16:46 +01:00
ui->comboBoxProject->setMaxVisibleItems(10);
2017-12-02 10:50:30 +01:00
2017-12-05 21:16:46 +01:00
ui->comboBoxSubproject->lineEdit()->setPlaceholderText(tr("Subproject"));
2017-12-02 10:50:30 +01:00
ui->comboBoxWorkpackage->lineEdit()->setPlaceholderText(tr("Workpackage"));
ui->comboBoxText->lineEdit()->setPlaceholderText(tr("Text"));
updateComboboxes();
connect(ui->pushButtonStart, &QAbstractButton::pressed, this, &MainWindow::pushButtonStartPressed);
connect(ui->pushButtonEnd, &QAbstractButton::pressed, this, &MainWindow::pushButtonEndPressed);
ui->treeViewBookings->setModel(m_bookingsModel);
ui->treeViewTimeAssignments->setModel(m_timeAssignmentsModel);
2017-12-02 10:50:30 +01:00
connect(ui->treeViewBookings, &QWidget::customContextMenuRequested,
this, &MainWindow::contextMenuBooking);
connect(ui->treeViewTimeAssignments, &QWidget::customContextMenuRequested,
this, &MainWindow::contextMenuTimeAssignment);
2017-12-02 18:25:32 +01:00
2017-12-05 20:46:41 +01:00
ui->statusbar->addPermanentWidget(m_workingTimeLabel = new QLabel(ui->statusbar));
m_workingTimeLabel->setFrameShape(QFrame::Panel);
m_workingTimeLabel->setFrameShadow(QFrame::Sunken);
ui->statusbar->addPermanentWidget(m_balanceLabel = new QLabel(ui->statusbar));
m_balanceLabel->setFrameShape(QFrame::Panel);
m_balanceLabel->setFrameShadow(QFrame::Sunken);
ui->statusbar->addPermanentWidget(m_holidaysLabel = new QLabel(ui->statusbar));
m_holidaysLabel->setFrameShape(QFrame::Panel);
m_holidaysLabel->setFrameShadow(QFrame::Sunken);
2017-12-02 19:03:43 +01:00
2017-12-09 04:33:52 +01:00
if(!m_stripFactory->load(QDir(QCoreApplication::applicationDirPath()).absoluteFilePath("strips")))
{
QMessageBox::warning(this, tr("Could not load strips!"), tr("Could not load strips!") % "\n\n" % m_stripFactory->errorString());
qApp->exit(-1);
return;
}
2017-12-04 20:25:33 +01:00
refresh(true);
2017-12-07 00:27:39 +01:00
if(settings.lastUpdateCheck().isNull() || settings.lastUpdateCheck() < QDate::currentDate())
new UpdateDialog(settings, erfassung.manager(), this);
2017-12-02 10:50:30 +01:00
}
MainWindow::~MainWindow()
{
delete ui;
}
2017-12-04 20:25:33 +01:00
void MainWindow::refresh(bool forceAuswertung)
2017-12-02 10:50:30 +01:00
{
ui->actionToday->setEnabled(false);
ui->actionRefresh->setEnabled(false);
ui->dateEditDate->setReadOnly(true);
2017-12-02 12:48:09 +01:00
ui->pushButtonPrev->setEnabled(false);
ui->pushButtonNext->setEnabled(false);
2017-12-02 13:03:19 +01:00
ui->timeEditTime->setEnabled(false);
2017-12-05 21:16:46 +01:00
ui->comboBoxProject->setEnabled(false);
ui->comboBoxSubproject->setEnabled(false);
2017-12-02 10:50:30 +01:00
ui->comboBoxWorkpackage->setEnabled(false);
ui->comboBoxText->setEnabled(false);
ui->pushButtonStart->setEnabled(false);
ui->pushButtonEnd->setEnabled(false);
ui->treeViewBookings->setEnabled(false);
ui->treeViewTimeAssignments->setEnabled(false);
2017-12-02 10:50:30 +01:00
2017-12-05 21:16:46 +01:00
m_workingTimeLabel->setText(tr("%0: %1").arg(tr("Assigned time")).arg(tr("???")));
2017-12-05 20:28:12 +01:00
auto waitForBookings = m_bookingsModel->refresh(m_userInfo.userId, ui->dateEditDate->date(), ui->dateEditDate->date());
if(waitForBookings)
2017-12-02 10:50:30 +01:00
{
connect(m_bookingsModel, &BookingsModel::refreshFinished,
this, &MainWindow::refreshBookingsFinished);
2017-12-02 10:50:30 +01:00
}
auto waitForTimeAssignments = m_timeAssignmentsModel->refresh(m_userInfo.userId, ui->dateEditDate->date(), ui->dateEditDate->date());
if(waitForTimeAssignments)
2017-12-02 10:50:30 +01:00
{
connect(m_timeAssignmentsModel, &TimeAssignmentsModel::refreshFinished,
this, &MainWindow::refreshTimeAssignmentsFinished);
2017-12-02 10:50:30 +01:00
}
if(!waitForBookings || !waitForTimeAssignments)
QMessageBox::warning(this, tr("Unknown error occured!"), tr("Unknown error occured!"));
2017-12-02 10:50:30 +01:00
if(waitForBookings || waitForTimeAssignments)
m_flag = waitForBookings == waitForTimeAssignments;
2017-12-02 10:50:30 +01:00
else
{
ui->actionToday->setEnabled(true);
ui->actionRefresh->setEnabled(true);
ui->dateEditDate->setReadOnly(false);
2017-12-02 13:03:19 +01:00
ui->pushButtonPrev->setEnabled(true);
ui->pushButtonNext->setEnabled(true);
2017-12-02 10:50:30 +01:00
}
2017-12-02 11:43:38 +01:00
2017-12-09 01:48:18 +01:00
for(quint8 i = 0; i < 7; i++)
m_stripsWidgets[i]->clearStrips();
2017-12-04 20:25:33 +01:00
auto auswertungDate = QDate(ui->dateEditDate->date().year(), ui->dateEditDate->date().month(), 1);
if(forceAuswertung || m_auswertungDate != auswertungDate)
{
m_balanceLabel->setText(tr("%0: %1").arg(tr("Balance")).arg(tr("???")));
m_holidaysLabel->setText(tr("%0: %1").arg(tr("Holidays")).arg(tr("???")));
2017-12-04 20:25:33 +01:00
ui->actionAuswertung->setEnabled(false);
m_auswertung.clear();
if(m_erfassung.doGetAuswertung(m_userInfo.userId, auswertungDate))
{
m_auswertungDate = auswertungDate;
2017-12-10 11:56:00 +01:00
connect(&m_erfassung, &ZeiterfassungApi::getAuswertungFinished,
2017-12-04 20:25:33 +01:00
this, &MainWindow::getAuswertungFinished);
}
else
{
m_auswertungDate = QDate();
QMessageBox::warning(this, tr("Unknown error occured!"), tr("Unknown error occured!"));
2017-12-04 20:25:33 +01:00
}
}
2017-12-02 10:50:30 +01:00
}
2017-12-10 11:56:00 +01:00
void MainWindow::getProjekctsFinished(bool success, const QString &message, const QVector<ZeiterfassungApi::Project> &projects)
2017-12-02 10:50:30 +01:00
{
2017-12-10 11:56:00 +01:00
disconnect(&m_erfassung, &ZeiterfassungApi::getProjectsFinished,
2017-12-05 21:16:46 +01:00
this, &MainWindow::getProjekctsFinished);
2017-12-02 10:50:30 +01:00
if(!success)
{
QMessageBox::warning(this, tr("Could not load bookings!"), tr("Could not load bookings!") % "\n\n" % message);
2017-12-02 10:50:30 +01:00
return;
}
2017-12-05 21:16:46 +01:00
m_projects.clear();
2017-12-02 19:11:49 +01:00
2017-12-05 21:16:46 +01:00
for(const auto &project : projects)
m_projects.insert(project.value, project.label);
2017-12-02 10:50:30 +01:00
updateComboboxes();
}
2017-12-02 18:46:46 +01:00
void MainWindow::getAuswertungFinished(bool success, const QString &message, const QByteArray &content)
{
2017-12-10 11:56:00 +01:00
disconnect(&m_erfassung, &ZeiterfassungApi::getAuswertungFinished,
2017-12-02 18:46:46 +01:00
this, &MainWindow::getAuswertungFinished);
if(!success)
{
2017-12-04 20:25:33 +01:00
m_auswertungDate = QDate();
QMessageBox::warning(this, tr("Could not load Auswertung!"), tr("Could not load Auswertung!") % "\n\n" % message);
2017-12-02 18:46:46 +01:00
return;
}
ui->actionAuswertung->setEnabled(true);
m_auswertung = content;
2017-12-05 20:46:41 +01:00
auto urlaubsAnspruch = tr("???");
auto gleitzeit = tr("???");
2017-12-02 19:03:43 +01:00
{
2017-12-05 20:46:41 +01:00
static QRegularExpression regex(QStringLiteral("Urlaubsanspruch +([0-9]+\\.[0-9]+\\-?) +([0-9]+\\.[0-9]+\\-?)"));
2017-12-02 19:03:43 +01:00
auto match = regex.match(content);
if(match.hasMatch())
urlaubsAnspruch = match.captured(2);
else
qWarning() << "Urlaubsanspruch not found";
}
{
2017-12-05 20:46:41 +01:00
static QRegularExpression regex(QStringLiteral("Gleitzeit +([0-9]+\\:[0-9]+\\-?) +([0-9]+\\:[0-9]+\\-?)"));
2017-12-02 19:03:43 +01:00
auto match = regex.match(content);
if(match.hasMatch())
{
2017-12-02 19:03:43 +01:00
gleitzeit = match.captured(2);
if(gleitzeit.endsWith(QChar('-')))
{
gleitzeit.chop(1);
gleitzeit = QChar('-') % gleitzeit;
}
gleitzeit = tr("%0h").arg(gleitzeit);
}
2017-12-02 19:03:43 +01:00
else
qWarning() << "Gleitzeit not found";
}
m_balanceLabel->setText(tr("%0: %1").arg(tr("Balance")).arg(gleitzeit));
m_holidaysLabel->setText(tr("%0: %1").arg(tr("Holidays")).arg(urlaubsAnspruch));
2017-12-02 18:46:46 +01:00
}
void MainWindow::refreshBookingsFinished(bool success, const QString &message)
2017-12-02 10:50:30 +01:00
{
disconnect(m_bookingsModel, &BookingsModel::refreshFinished,
this, &MainWindow::refreshBookingsFinished);
2017-12-02 10:50:30 +01:00
if(success)
ui->treeViewBookings->setEnabled(true);
2017-12-02 10:50:30 +01:00
if(m_flag)
m_flag = false;
else
2017-12-09 01:48:18 +01:00
{
createStrips();
}
2017-12-02 10:50:30 +01:00
if(!success)
QMessageBox::warning(Q_NULLPTR, tr("Could not load bookings!"), tr("Could not load bookings!") % "\n\n" % message);
2017-12-02 10:50:30 +01:00
}
void MainWindow::refreshTimeAssignmentsFinished(bool success, const QString &message)
2017-12-02 10:50:30 +01:00
{
disconnect(m_timeAssignmentsModel, &TimeAssignmentsModel::refreshFinished,
this, &MainWindow::refreshTimeAssignmentsFinished);
2017-12-02 10:50:30 +01:00
if(success)
ui->treeViewTimeAssignments->setEnabled(true);
2017-12-02 10:50:30 +01:00
if(m_flag)
m_flag = false;
else
2017-12-09 01:48:18 +01:00
{
createStrips();
}
2017-12-02 10:50:30 +01:00
if(!success)
QMessageBox::warning(Q_NULLPTR, tr("Could not load time assignments!"), tr("Could not load time assignments!") % "\n\n" % message);
2017-12-02 10:50:30 +01:00
}
void MainWindow::contextMenuBooking(const QPoint &pos)
2017-12-02 10:50:30 +01:00
{
auto index = ui->treeViewBookings->indexAt(pos);
2017-12-02 10:50:30 +01:00
if(index.isValid())
{
auto booking = m_bookingsModel->getBooking(index);
2017-12-02 10:50:30 +01:00
QMenu menu;
auto editAction = menu.addAction(tr("Edit booking"));
auto deleteAction = menu.addAction(tr("Delete booking"));
auto selectedAction = menu.exec(ui->treeViewBookings->viewport()->mapToGlobal(pos));
2017-12-02 10:50:30 +01:00
if(selectedAction == editAction)
{
BookingDialog dialog(this);
dialog.setTime(booking.time);
dialog.setTimespan(booking.timespan);
dialog.setType(booking.type);
dialog.setText(booking.text);
2017-12-02 10:50:30 +01:00
again1:
if(dialog.exec() == QDialog::Accepted)
{
EventLoopWithStatus eventLoop;
2017-12-10 11:56:00 +01:00
connect(&m_erfassung, &ZeiterfassungApi::updateBookingFinished, &eventLoop, &EventLoopWithStatus::quitWithStatus);
2017-12-02 10:50:30 +01:00
m_erfassung.doUpdateBooking(booking.id, m_userInfo.userId, ui->dateEditDate->date(),
2017-12-02 10:50:30 +01:00
dialog.getTime(), dialog.getTimespan(),
dialog.getType(), dialog.getText());
eventLoop.exec();
if(eventLoop.success())
{
ui->actionToday->setEnabled(false);
ui->actionRefresh->setEnabled(false);
ui->dateEditDate->setReadOnly(true);
2017-12-02 12:48:09 +01:00
ui->pushButtonPrev->setEnabled(false);
ui->pushButtonNext->setEnabled(false);
2017-12-02 13:03:19 +01:00
ui->timeEditTime->setEnabled(false);
2017-12-05 21:16:46 +01:00
ui->comboBoxProject->setEnabled(false);
ui->comboBoxSubproject->setEnabled(false);
2017-12-02 10:50:30 +01:00
ui->comboBoxWorkpackage->setEnabled(false);
ui->comboBoxText->setEnabled(false);
ui->pushButtonStart->setEnabled(false);
ui->pushButtonEnd->setEnabled(false);
ui->treeViewBookings->setEnabled(false);
2017-12-02 10:50:30 +01:00
2017-12-09 01:48:18 +01:00
for(quint8 i = 0; i < 7; i++)
m_stripsWidgets[i]->clearStrips();
2017-12-02 11:43:38 +01:00
if(m_bookingsModel->refresh(m_userInfo.userId, ui->dateEditDate->date(), ui->dateEditDate->date()))
2017-12-02 10:50:30 +01:00
{
connect(m_bookingsModel, &BookingsModel::refreshFinished,
this, &MainWindow::refreshBookingsFinished);
2017-12-02 10:50:30 +01:00
m_flag = false;
}
else
{
ui->actionToday->setEnabled(true);
ui->actionRefresh->setEnabled(true);
ui->dateEditDate->setReadOnly(false);
2017-12-02 13:03:19 +01:00
ui->pushButtonPrev->setEnabled(true);
ui->pushButtonNext->setEnabled(true);
2017-12-02 10:50:30 +01:00
}
}
else
{
QMessageBox::warning(this, tr("Could not edit booking!"), tr("Could not edit booking!") % "\n\n" % eventLoop.message());
2017-12-02 10:50:30 +01:00
goto again1;
}
}
}
else if(selectedAction == deleteAction)
{
QMessageBox msgBox;
msgBox.setText("Do you really want to delete the booking?");
2017-12-02 10:50:30 +01:00
msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::Cancel);
msgBox.setDefaultButton(QMessageBox::Cancel);
if(msgBox.exec() == QMessageBox::Yes)
{
EventLoopWithStatus eventLoop;
2017-12-10 11:56:00 +01:00
connect(&m_erfassung, &ZeiterfassungApi::deleteBookingFinished, &eventLoop, &EventLoopWithStatus::quitWithStatus);
2017-12-02 10:50:30 +01:00
m_erfassung.doDeleteBooking(booking.id);
2017-12-02 10:50:30 +01:00
eventLoop.exec();
if(eventLoop.success())
{
ui->actionToday->setEnabled(false);
ui->actionRefresh->setEnabled(false);
ui->dateEditDate->setReadOnly(true);
2017-12-02 12:48:09 +01:00
ui->pushButtonPrev->setEnabled(false);
ui->pushButtonNext->setEnabled(false);
2017-12-02 13:03:19 +01:00
ui->timeEditTime->setEnabled(false);
2017-12-05 21:16:46 +01:00
ui->comboBoxProject->setEnabled(false);
ui->comboBoxSubproject->setEnabled(false);
2017-12-02 10:50:30 +01:00
ui->comboBoxWorkpackage->setEnabled(false);
ui->comboBoxText->setEnabled(false);
ui->pushButtonStart->setEnabled(false);
ui->pushButtonEnd->setEnabled(false);
ui->treeViewBookings->setEnabled(false);
2017-12-02 10:50:30 +01:00
2017-12-09 01:48:18 +01:00
for(quint8 i = 0; i < 7; i++)
m_stripsWidgets[i]->clearStrips();
2017-12-02 11:43:38 +01:00
if(m_bookingsModel->refresh(m_userInfo.userId, ui->dateEditDate->date(), ui->dateEditDate->date()))
2017-12-02 10:50:30 +01:00
{
connect(m_bookingsModel, &BookingsModel::refreshFinished,
this, &MainWindow::refreshBookingsFinished);
2017-12-02 10:50:30 +01:00
m_flag = false;
}
else
{
ui->actionToday->setEnabled(true);
ui->actionRefresh->setEnabled(true);
ui->dateEditDate->setReadOnly(false);
2017-12-02 13:03:19 +01:00
ui->pushButtonPrev->setEnabled(true);
ui->pushButtonNext->setEnabled(true);
2017-12-02 10:50:30 +01:00
}
}
else
QMessageBox::warning(this, tr("Could not delete booking!"), tr("Could not delete booking!") % "\n\n" % eventLoop.message());
2017-12-02 10:50:30 +01:00
}
}
}
else
{
QMenu menu;
auto createAction = menu.addAction(tr("Create booking"));
auto selectedAction = menu.exec(ui->treeViewBookings->viewport()->mapToGlobal(pos));
2017-12-02 10:50:30 +01:00
if(selectedAction == createAction)
{
BookingDialog dialog(this);
dialog.setTime(timeNormalise(QTime::currentTime()));
2017-12-02 10:50:30 +01:00
again2:
if(dialog.exec() == QDialog::Accepted)
{
EventLoopWithStatus eventLoop;
2017-12-10 11:56:00 +01:00
connect(&m_erfassung, &ZeiterfassungApi::createBookingFinished, &eventLoop, &EventLoopWithStatus::quitWithStatus);
2017-12-02 10:50:30 +01:00
m_erfassung.doCreateBooking(m_userInfo.userId, ui->dateEditDate->date(),
2017-12-02 10:50:30 +01:00
dialog.getTime(), dialog.getTimespan(),
dialog.getType(), dialog.getText());
eventLoop.exec();
if(eventLoop.success())
{
ui->actionToday->setEnabled(false);
ui->actionRefresh->setEnabled(false);
ui->dateEditDate->setReadOnly(true);
2017-12-02 12:48:09 +01:00
ui->pushButtonPrev->setEnabled(false);
ui->pushButtonNext->setEnabled(false);
2017-12-02 13:03:19 +01:00
ui->timeEditTime->setEnabled(false);
2017-12-05 21:16:46 +01:00
ui->comboBoxProject->setEnabled(false);
ui->comboBoxSubproject->setEnabled(false);
2017-12-02 10:50:30 +01:00
ui->comboBoxWorkpackage->setEnabled(false);
ui->comboBoxText->setEnabled(false);
ui->pushButtonStart->setEnabled(false);
ui->pushButtonEnd->setEnabled(false);
ui->treeViewBookings->setEnabled(false);
2017-12-02 10:50:30 +01:00
2017-12-09 01:48:18 +01:00
for(quint8 i = 0; i < 7; i++)
m_stripsWidgets[i]->clearStrips();
2017-12-02 11:43:38 +01:00
if(m_bookingsModel->refresh(m_userInfo.userId, ui->dateEditDate->date(), ui->dateEditDate->date()))
2017-12-02 10:50:30 +01:00
{
connect(m_bookingsModel, &BookingsModel::refreshFinished,
this, &MainWindow::refreshBookingsFinished);
2017-12-02 10:50:30 +01:00
m_flag = false;
}
else
{
ui->actionToday->setEnabled(true);
ui->actionRefresh->setEnabled(true);
ui->dateEditDate->setReadOnly(false);
2017-12-02 13:03:19 +01:00
ui->pushButtonPrev->setEnabled(true);
ui->pushButtonNext->setEnabled(true);
2017-12-02 10:50:30 +01:00
}
}
else
{
QMessageBox::warning(this, tr("Could not create booking!"), tr("Could not create booking!") % "\n\n" % eventLoop.message());
2017-12-02 10:50:30 +01:00
goto again2;
}
}
}
}
}
void MainWindow::contextMenuTimeAssignment(const QPoint &pos)
2017-12-02 10:50:30 +01:00
{
auto index = ui->treeViewTimeAssignments->indexAt(pos);
2017-12-02 10:50:30 +01:00
if(index.isValid())
{
auto timeAssignment = m_timeAssignmentsModel->getTimeAssignment(index);
2017-12-02 10:50:30 +01:00
QMenu menu;
auto editAction = menu.addAction(tr("Edit time assignment"));
auto deleteAction = menu.addAction(tr("Delete time assignment"));
auto selectedAction = menu.exec(ui->treeViewTimeAssignments->viewport()->mapToGlobal(pos));
2017-12-02 10:50:30 +01:00
if(selectedAction == editAction)
{
2017-12-05 21:16:46 +01:00
TimeAssignmentDialog dialog(m_projects, m_settings, this);
dialog.setTime(timeAssignment.time);
dialog.setTimespan(timeAssignment.timespan);
2017-12-05 21:16:46 +01:00
dialog.setProject(timeAssignment.project);
dialog.setSubproject(timeAssignment.subproject);
dialog.setWorkpackage(timeAssignment.workpackage);
dialog.setText(timeAssignment.text);
2017-12-02 10:50:30 +01:00
again1:
if(dialog.exec() == QDialog::Accepted)
{
EventLoopWithStatus eventLoop;
2017-12-10 11:56:00 +01:00
connect(&m_erfassung, &ZeiterfassungApi::updateTimeAssignmentFinished, &eventLoop, &EventLoopWithStatus::quitWithStatus);
2017-12-02 10:50:30 +01:00
m_erfassung.doUpdateTimeAssignment(timeAssignment.id, m_userInfo.userId, ui->dateEditDate->date(),
2017-12-02 10:50:30 +01:00
dialog.getTime(), dialog.getTimespan(),
2017-12-05 21:16:46 +01:00
dialog.getProject(), dialog.getSubproject(),
2017-12-02 10:50:30 +01:00
dialog.getWorkpackage(), dialog.getText());
eventLoop.exec();
if(eventLoop.success())
{
ui->actionToday->setEnabled(false);
ui->actionRefresh->setEnabled(false);
ui->dateEditDate->setReadOnly(true);
2017-12-02 12:48:09 +01:00
ui->pushButtonPrev->setEnabled(false);
ui->pushButtonNext->setEnabled(false);
2017-12-02 13:03:19 +01:00
ui->timeEditTime->setEnabled(false);
2017-12-05 21:16:46 +01:00
ui->comboBoxProject->setEnabled(false);
ui->comboBoxSubproject->setEnabled(false);
2017-12-02 10:50:30 +01:00
ui->comboBoxWorkpackage->setEnabled(false);
ui->comboBoxText->setEnabled(false);
ui->pushButtonStart->setEnabled(false);
ui->pushButtonEnd->setEnabled(false);
ui->treeViewTimeAssignments->setEnabled(false);
2017-12-02 10:50:30 +01:00
2017-12-05 21:16:46 +01:00
m_settings.prependProject(dialog.getProject());
m_settings.prependSubproject(dialog.getSubproject());
2017-12-03 22:22:07 +01:00
m_settings.prependWorkpackage(dialog.getWorkpackage());
m_settings.prependText(dialog.getText());
2017-12-09 01:48:18 +01:00
for(quint8 i = 0; i < 7; i++)
m_stripsWidgets[i]->clearStrips();
2017-12-02 11:43:38 +01:00
if(m_timeAssignmentsModel->refresh(m_userInfo.userId, ui->dateEditDate->date(), ui->dateEditDate->date()))
2017-12-02 10:50:30 +01:00
{
connect(m_timeAssignmentsModel, &TimeAssignmentsModel::refreshFinished,
this, &MainWindow::refreshTimeAssignmentsFinished);
2017-12-02 10:50:30 +01:00
m_flag = false;
}
else
{
ui->actionToday->setEnabled(true);
ui->actionRefresh->setEnabled(true);
ui->dateEditDate->setReadOnly(false);
2017-12-02 13:03:19 +01:00
ui->pushButtonPrev->setEnabled(true);
ui->pushButtonNext->setEnabled(true);
2017-12-02 10:50:30 +01:00
}
}
else
{
QMessageBox::warning(this, tr("Could not edit time assignment!"), tr("Could not edit time assignment!") % "\n\n" % eventLoop.message());
2017-12-02 10:50:30 +01:00
goto again1;
}
}
}
else if(selectedAction == deleteAction)
{
QMessageBox msgBox;
msgBox.setText("Do you really want to delete the time assignment?");
2017-12-02 10:50:30 +01:00
msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::Cancel);
msgBox.setDefaultButton(QMessageBox::Cancel);
if(msgBox.exec() == QMessageBox::Yes)
{
EventLoopWithStatus eventLoop;
2017-12-10 11:56:00 +01:00
connect(&m_erfassung, &ZeiterfassungApi::deleteTimeAssignmentFinished, &eventLoop, &EventLoopWithStatus::quitWithStatus);
2017-12-02 10:50:30 +01:00
m_erfassung.doDeleteTimeAssignment(timeAssignment.id);
2017-12-02 10:50:30 +01:00
eventLoop.exec();
if(eventLoop.success())
{
ui->actionToday->setEnabled(false);
ui->actionRefresh->setEnabled(false);
ui->dateEditDate->setReadOnly(true);
2017-12-02 12:48:09 +01:00
ui->pushButtonPrev->setEnabled(false);
ui->pushButtonNext->setEnabled(false);
2017-12-02 13:03:19 +01:00
ui->timeEditTime->setEnabled(false);
2017-12-05 21:16:46 +01:00
ui->comboBoxProject->setEnabled(false);
ui->comboBoxSubproject->setEnabled(false);
2017-12-02 10:50:30 +01:00
ui->comboBoxWorkpackage->setEnabled(false);
ui->comboBoxText->setEnabled(false);
ui->pushButtonStart->setEnabled(false);
ui->pushButtonEnd->setEnabled(false);
ui->treeViewTimeAssignments->setEnabled(false);
2017-12-02 10:50:30 +01:00
2017-12-09 01:48:18 +01:00
for(quint8 i = 0; i < 7; i++)
m_stripsWidgets[i]->clearStrips();
2017-12-02 11:43:38 +01:00
if(m_timeAssignmentsModel->refresh(m_userInfo.userId, ui->dateEditDate->date(), ui->dateEditDate->date()))
2017-12-02 10:50:30 +01:00
{
connect(m_timeAssignmentsModel, &TimeAssignmentsModel::refreshFinished,
this, &MainWindow::refreshTimeAssignmentsFinished);
2017-12-02 10:50:30 +01:00
m_flag = false;
}
else
{
ui->actionToday->setEnabled(true);
ui->actionRefresh->setEnabled(true);
ui->dateEditDate->setReadOnly(false);
2017-12-02 13:03:19 +01:00
ui->pushButtonPrev->setEnabled(true);
ui->pushButtonNext->setEnabled(true);
2017-12-02 10:50:30 +01:00
}
}
else
QMessageBox::warning(this, tr("Could not delete time assignment!"), tr("Could not delete time assignment!") % "\n\n" % eventLoop.message());
2017-12-02 10:50:30 +01:00
}
}
}
else
{
QMenu menu;
auto createAction = menu.addAction(tr("Create time assignment"));
auto selectedAction = menu.exec(ui->treeViewTimeAssignments->viewport()->mapToGlobal(pos));
2017-12-02 10:50:30 +01:00
if(selectedAction == createAction)
{
2017-12-05 21:16:46 +01:00
TimeAssignmentDialog dialog(m_projects, m_settings, this);
2017-12-02 10:50:30 +01:00
again2:
if(dialog.exec() == QDialog::Accepted)
{
EventLoopWithStatus eventLoop;
2017-12-10 11:56:00 +01:00
connect(&m_erfassung, &ZeiterfassungApi::createTimeAssignmentFinished, &eventLoop, &EventLoopWithStatus::quitWithStatus);
2017-12-02 10:50:30 +01:00
m_erfassung.doCreateTimeAssignment(m_userInfo.userId, ui->dateEditDate->date(),
2017-12-02 10:50:30 +01:00
dialog.getTime(), dialog.getTimespan(),
2017-12-05 21:16:46 +01:00
dialog.getProject(), dialog.getSubproject(),
2017-12-02 10:50:30 +01:00
dialog.getWorkpackage(), dialog.getText());
eventLoop.exec();
if(eventLoop.success())
{
ui->actionToday->setEnabled(false);
ui->actionRefresh->setEnabled(false);
ui->dateEditDate->setReadOnly(true);
2017-12-02 12:48:09 +01:00
ui->pushButtonPrev->setEnabled(false);
ui->pushButtonNext->setEnabled(false);
2017-12-02 13:03:19 +01:00
ui->timeEditTime->setEnabled(false);
2017-12-05 21:16:46 +01:00
ui->comboBoxProject->setEnabled(false);
ui->comboBoxSubproject->setEnabled(false);
2017-12-02 10:50:30 +01:00
ui->comboBoxWorkpackage->setEnabled(false);
ui->comboBoxText->setEnabled(false);
ui->pushButtonStart->setEnabled(false);
ui->pushButtonEnd->setEnabled(false);
ui->treeViewTimeAssignments->setEnabled(false);
2017-12-02 10:50:30 +01:00
2017-12-05 21:16:46 +01:00
m_settings.prependProject(dialog.getProject());
m_settings.prependSubproject(dialog.getSubproject());
2017-12-03 22:22:07 +01:00
m_settings.prependWorkpackage(dialog.getWorkpackage());
m_settings.prependText(dialog.getText());
2017-12-09 01:48:18 +01:00
for(quint8 i = 0; i < 7; i++)
m_stripsWidgets[i]->clearStrips();
2017-12-02 11:43:38 +01:00
if(m_timeAssignmentsModel->refresh(m_userInfo.userId, ui->dateEditDate->date(), ui->dateEditDate->date()))
2017-12-02 10:50:30 +01:00
{
connect(m_timeAssignmentsModel, &TimeAssignmentsModel::refreshFinished,
this, &MainWindow::refreshTimeAssignmentsFinished);
2017-12-02 10:50:30 +01:00
m_flag = false;
}
else
{
ui->actionToday->setEnabled(true);
ui->actionRefresh->setEnabled(true);
ui->dateEditDate->setReadOnly(false);
2017-12-02 13:03:19 +01:00
ui->pushButtonPrev->setEnabled(true);
ui->pushButtonNext->setEnabled(true);
2017-12-02 10:50:30 +01:00
}
}
else
{
QMessageBox::warning(this, tr("Could not create time assignment!"), tr("Could not create time assignment!") % "\n\n" % eventLoop.message());
2017-12-02 10:50:30 +01:00
goto again2;
}
}
}
}
}
void MainWindow::pushButtonStartPressed()
{
2017-12-09 01:48:18 +01:00
if(m_bookingsModel->bookings().rbegin() == m_bookingsModel->bookings().rend() ||
m_bookingsModel->bookings().rbegin()->type == QStringLiteral("G"))
2017-12-02 10:50:30 +01:00
{
EventLoopWithStatus eventLoop;
2017-12-10 11:56:00 +01:00
connect(&m_erfassung, &ZeiterfassungApi::createBookingFinished, &eventLoop, &EventLoopWithStatus::quitWithStatus);
2017-12-02 10:50:30 +01:00
m_erfassung.doCreateBooking(m_userInfo.userId, ui->dateEditDate->date(),
2017-12-02 10:50:30 +01:00
timeNormalise(ui->timeEditTime->time()), QTime(0, 0),
QStringLiteral("K"), QStringLiteral(""));
eventLoop.exec();
if(!eventLoop.success())
{
QMessageBox::warning(this, tr("Could not create booking!"), tr("Could not create booking!") % "\n\n" % eventLoop.message());
2017-12-04 20:25:33 +01:00
refresh(true);
2017-12-02 10:50:30 +01:00
return;
}
}
2017-12-09 01:48:18 +01:00
auto timeAssignmentTime = m_stripsWidgets[0]->timeAssignmentTime();
if(m_timeAssignmentsModel->timeAssignments().rbegin() != m_timeAssignmentsModel->timeAssignments().rend())
2017-12-02 10:50:30 +01:00
{
2017-12-09 01:48:18 +01:00
auto timeAssignment = *m_timeAssignmentsModel->timeAssignments().rbegin();
if(timeAssignment.timespan == QTime(0, 0))
2017-12-02 10:50:30 +01:00
{
EventLoopWithStatus eventLoop;
2017-12-10 11:56:00 +01:00
connect(&m_erfassung, &ZeiterfassungApi::updateTimeAssignmentFinished, &eventLoop, &EventLoopWithStatus::quitWithStatus);
2017-12-02 10:50:30 +01:00
2017-12-09 01:48:18 +01:00
auto timespan = timeBetween(m_stripsWidgets[0]->lastTimeAssignmentStart(), ui->timeEditTime->time());
2017-12-02 10:50:30 +01:00
m_erfassung.doUpdateTimeAssignment(timeAssignment.id, m_userInfo.userId, timeAssignment.date,
timeAssignment.time, timespan,
2017-12-05 21:16:46 +01:00
timeAssignment.project, timeAssignment.subproject,
timeAssignment.workpackage, timeAssignment.text);
2017-12-02 10:50:30 +01:00
eventLoop.exec();
if(eventLoop.success())
2017-12-09 01:48:18 +01:00
timeAssignmentTime = timeAdd(timeAssignmentTime, timespan);
2017-12-02 10:50:30 +01:00
else
{
QMessageBox::warning(this, tr("Could not edit time assignment!"), tr("Could not edit time assignment!") % "\n\n" % eventLoop.message());
2017-12-04 20:25:33 +01:00
refresh(true);
2017-12-02 10:50:30 +01:00
return;
}
}
}
EventLoopWithStatus eventLoop;
2017-12-10 11:56:00 +01:00
connect(&m_erfassung, &ZeiterfassungApi::createTimeAssignmentFinished, &eventLoop, &EventLoopWithStatus::quitWithStatus);
2017-12-02 10:50:30 +01:00
m_erfassung.doCreateTimeAssignment(m_userInfo.userId, ui->dateEditDate->date(),
2017-12-09 01:48:18 +01:00
timeAssignmentTime, QTime(0, 0),
2017-12-05 21:16:46 +01:00
ui->comboBoxProject->currentData().toString(), ui->comboBoxSubproject->currentText(),
2017-12-02 10:50:30 +01:00
ui->comboBoxWorkpackage->currentText(), ui->comboBoxText->currentText());
eventLoop.exec();
if(!eventLoop.success())
{
QMessageBox::warning(this, tr("Could not create time assignment!"), tr("Could not create time assignment!") % "\n\n" % eventLoop.message());
2017-12-04 20:25:33 +01:00
refresh(true);
2017-12-02 10:50:30 +01:00
return;
}
2017-12-05 21:16:46 +01:00
m_settings.prependProject(ui->comboBoxProject->currentData().toString());
m_settings.prependSubproject(ui->comboBoxSubproject->currentText());
2017-12-03 22:22:07 +01:00
m_settings.prependWorkpackage(ui->comboBoxWorkpackage->currentText());
m_settings.prependText(ui->comboBoxText->currentText());
2017-12-02 10:50:30 +01:00
updateComboboxes();
2017-12-04 20:25:33 +01:00
refresh(true);
2017-12-02 10:50:30 +01:00
}
void MainWindow::pushButtonEndPressed()
{
2017-12-09 01:48:18 +01:00
{
auto timeAssignment = *m_timeAssignmentsModel->timeAssignments().rbegin();
Q_ASSERT(timeAssignment.timespan == QTime(0, 0));
EventLoopWithStatus eventLoop;
2017-12-10 11:56:00 +01:00
connect(&m_erfassung, &ZeiterfassungApi::updateTimeAssignmentFinished, &eventLoop, &EventLoopWithStatus::quitWithStatus);
2017-12-09 01:48:18 +01:00
auto timespan = timeBetween(m_stripsWidgets[0]->lastTimeAssignmentStart(), ui->timeEditTime->time());
m_erfassung.doUpdateTimeAssignment(timeAssignment.id, m_userInfo.userId, timeAssignment.date,
timeAssignment.time, timespan,
timeAssignment.project, timeAssignment.subproject,
timeAssignment.workpackage, timeAssignment.text);
eventLoop.exec();
if(!eventLoop.success())
{
QMessageBox::warning(this, tr("Could not edit time assignment!"), tr("Could not edit time assignment!") % "\n\n" % eventLoop.message());
refresh(true);
return;
}
}
2017-12-02 10:50:30 +01:00
{
EventLoopWithStatus eventLoop;
2017-12-10 11:56:00 +01:00
connect(&m_erfassung, &ZeiterfassungApi::createBookingFinished, &eventLoop, &EventLoopWithStatus::quitWithStatus);
2017-12-02 10:50:30 +01:00
m_erfassung.doCreateBooking(m_userInfo.userId, ui->dateEditDate->date(),
2017-12-02 10:50:30 +01:00
timeNormalise(ui->timeEditTime->time()), QTime(0, 0),
QStringLiteral("G"), QStringLiteral(""));
eventLoop.exec();
if(!eventLoop.success())
{
QMessageBox::warning(this, tr("Could not create booking!"), tr("Could not create booking!") % "\n\n" % eventLoop.message());
2017-12-04 20:25:33 +01:00
refresh(true);
2017-12-02 10:50:30 +01:00
return;
}
}
2017-12-04 20:25:33 +01:00
refresh(true);
2017-12-02 10:50:30 +01:00
}
void MainWindow::updateComboboxes()
{
2017-12-05 21:16:46 +01:00
ui->comboBoxProject->clear();
2017-12-02 10:50:30 +01:00
{
2017-12-05 21:16:46 +01:00
auto preferedProjects = m_settings.projects();
2017-12-02 10:50:30 +01:00
2017-12-05 21:16:46 +01:00
for(const auto &preferedProject : preferedProjects)
2017-12-02 10:50:30 +01:00
{
2017-12-05 21:16:46 +01:00
if(!m_projects.contains(preferedProject))
2017-12-02 10:50:30 +01:00
{
2017-12-05 21:16:46 +01:00
qWarning() << "cannot find project" << preferedProject;
2017-12-02 19:11:49 +01:00
continue;
2017-12-02 10:50:30 +01:00
}
2017-12-02 19:11:49 +01:00
2017-12-05 21:16:46 +01:00
ui->comboBoxProject->addItem(m_projects.value(preferedProject) % " (" % preferedProject % ')', preferedProject);
2017-12-02 10:50:30 +01:00
}
2017-12-05 21:16:46 +01:00
if(preferedProjects.count())
ui->comboBoxProject->insertSeparator(ui->comboBoxProject->count());
2017-12-02 10:50:30 +01:00
2017-12-05 21:16:46 +01:00
for(auto iter = m_projects.constBegin(); iter != m_projects.constEnd(); iter++)
2017-12-02 10:50:30 +01:00
{
2017-12-05 21:16:46 +01:00
if(!preferedProjects.contains(iter.key()))
ui->comboBoxProject->addItem(iter.value() % " (" % iter.key() % ')', iter.key());
2017-12-02 10:50:30 +01:00
}
}
2017-12-05 21:16:46 +01:00
ui->comboBoxSubproject->clear();
2017-12-02 10:50:30 +01:00
{
2017-12-05 21:16:46 +01:00
auto subprojects = m_settings.subprojects();
for(const auto &subproject : subprojects)
ui->comboBoxSubproject->addItem(subproject);
if(subprojects.count())
ui->comboBoxSubproject->setCurrentText(QString());
2017-12-02 10:50:30 +01:00
}
ui->comboBoxWorkpackage->clear();
{
2017-12-03 22:22:07 +01:00
auto workpackages = m_settings.workpackages();
2017-12-02 10:50:30 +01:00
for(const auto &workpackage : workpackages)
ui->comboBoxWorkpackage->addItem(workpackage);
if(workpackages.count())
ui->comboBoxWorkpackage->setCurrentText(QString());
}
ui->comboBoxText->clear();
{
2017-12-03 22:22:07 +01:00
auto texte = m_settings.texte();
2017-12-02 10:50:30 +01:00
for(const auto &text : texte)
ui->comboBoxText->addItem(text);
if(texte.count())
ui->comboBoxText->setCurrentText(QString());
}
}
2017-12-09 01:48:18 +01:00
void MainWindow::createStrips()
2017-12-02 10:50:30 +01:00
{
2017-12-09 01:48:18 +01:00
ui->timeEditTime->setMinimumTime(QTime(0, 0));
ui->actionToday->setEnabled(true);
ui->actionRefresh->setEnabled(true);
ui->dateEditDate->setReadOnly(false);
ui->pushButtonPrev->setEnabled(true);
ui->pushButtonNext->setEnabled(true);
ui->pushButtonStart->setText(tr("Start"));
2017-12-02 19:17:10 +01:00
2017-12-09 01:48:18 +01:00
if(!ui->treeViewBookings->isEnabled())
return;
if(!ui->treeViewTimeAssignments->isEnabled())
return;
for(quint8 i = 0; i < 7; i++)
if(!m_stripsWidgets[i]->createStrips(m_bookingsModel->bookings(), m_timeAssignmentsModel->timeAssignments()))
return;
m_workingTimeLabel->setText(tr("%0: %1")
.arg(tr("Assigned time"))
.arg(tr("%0h").arg(m_stripsWidgets[0]->timeAssignmentTime().toString(QStringLiteral("HH:mm")))));
ui->timeEditTime->setEnabled(true);
ui->comboBoxProject->setEnabled(true);
ui->comboBoxSubproject->setEnabled(true);
ui->comboBoxWorkpackage->setEnabled(true);
ui->comboBoxText->setEnabled(true);
ui->pushButtonStart->setEnabled(true);
2017-12-02 19:17:10 +01:00
}