diff --git a/cbooking.cpp b/cbooking.cpp new file mode 100644 index 0000000..fce66e0 --- /dev/null +++ b/cbooking.cpp @@ -0,0 +1,387 @@ +#include "cbooking.h" + +#include +#include + +#include + + +cBooking::cBooking(const QDate& date, QObject* parent) : + QObject(parent), + m_date(date), + m_kommt1(QTime()), + m_geht1(QTime()), + m_kommt2(QTime()), + m_geht2(QTime()), + m_kommt3(QTime()), + m_geht3(QTime()), + m_kommt4(QTime()), + m_geht4(QTime()), + m_kommt5(QTime()), + m_geht5(QTime()), + m_code(""), + m_information(""), + m_soll(QTime()), + m_prevDiff(0) + +{ +} + +QDate cBooking::date() +{ + return(m_date); +} + +void cBooking::setKommt1(const QTime& time) +{ + m_kommt1 = time; +} + +QTime cBooking::kommt1() +{ + return(m_kommt1); +} + +void cBooking::setGeht1(const QTime& time) +{ + m_geht1 = time; +} + +QTime cBooking::geht1() +{ + return(m_geht1); +} + +void cBooking::setKommt2(const QTime& time) +{ + m_kommt2 = time; +} + +QTime cBooking::kommt2() +{ + return(m_kommt2); +} + +void cBooking::setGeht2(const QTime& time) +{ + m_geht2 = time; +} + +QTime cBooking::geht2() +{ + return(m_geht2); +} + +void cBooking::setKommt3(const QTime& time) +{ + m_kommt3 = time; +} + +QTime cBooking::kommt3() +{ + return(m_kommt3); +} + +void cBooking::setGeht3(const QTime& time) +{ + m_geht3 = time; +} + +QTime cBooking::geht3() +{ + return(m_geht3); +} + +void cBooking::setKommt4(const QTime& time) +{ + m_kommt4 = time; +} + +QTime cBooking::kommt4() +{ + return(m_kommt4); +} + +void cBooking::setGeht4(const QTime& time) +{ + m_geht4 = time; +} + +QTime cBooking::geht4() +{ + return(m_geht4); +} + +void cBooking::setKommt5(const QTime& time) +{ + m_kommt5 = time; +} + +QTime cBooking::kommt5() +{ + return(m_kommt5); +} + +void cBooking::setGeht5(const QTime& time) +{ + m_geht5 = time; +} + +QTime cBooking::geht5() +{ + return(m_geht5); +} + +void cBooking::setCode(const QString& code) +{ + m_code = code; +} + +QString cBooking::code() +{ + return(m_code); +} + +void cBooking::setInformation(const QString& information) +{ + m_information = information; +} + +QString cBooking::information() +{ + return(m_information); +} + +QTime cBooking::pause() +{ + return(QTime(0, 0, 0)); +} + +QTime cBooking::ist() +{ + return(QTime(0, 0, 0)); +} + +void cBooking::setSoll() +{ + m_soll = QTime(0, 0, 0); +} + +QTime cBooking::soll() +{ + return(m_soll); +} + +qint32 cBooking::diff() +{ + return(0); +} + +QString cBooking::diffString() +{ + QTime t; + qint32 d = diff(); + bool bNeg = false; + + if(d < 0) + { + t = QTime(0, 0, 0, d*1000); + bNeg = true; + } + else + t = QTime(0, 0, 0, d*1000); + + return(bNeg ? "-" : "" + t.toString("hh:mm:ss")); +} + +void cBooking::setPrevDiff(qint32 diff) +{ + m_prevDiff = diff; +} + +qint32 cBooking::prevDiff() +{ + return(m_prevDiff); +} + +qint32 cBooking::currentDiff() +{ + return(0); +} + +QString cBooking::currentDiffString() +{ + QTime t; + qint32 d = currentDiff(); + bool bNeg = false; + + if(d < 0) + { + t = QTime(0, 0, 0, d*1000); + bNeg = true; + } + else + t = QTime(0, 0, 0, d*1000); + + return(bNeg ? "-" : "" + t.toString("hh:mm:ss")); +} + +qreal cBooking::hoursDecimal() +{ + return(0); +} + +bool cBooking::save() +{ + QSqlQuery query; + + query.prepare("SELECT datum FROM booking WHERE datum=:datum;"); + query.bindValue(":datum", m_date); + + if(!query.exec()) + { + qDebug() << "Save: " << query.lastError().text(); + return(false); + } + + if(query.next()) + query.prepare("UPDATE booking " + "SET kommt1=:kommt1, " + " geht1=:geht1, " + " kommt2=:kommt2, " + " geht2=:geht2, " + " kommt3=:kommt3, " + " geht3=:geht3, " + " kommt4=:kommt4, " + " geht4=:geht4, " + " kommt5=:kommt5, " + " geht5=:geht5, " + " code=:code, " + " information=:information " + "WHERE datum=:datum;"); + else + query.prepare("INSERT INTO booking ( " + " datum, " + " kommt1, " + " geht1, " + " kommt2, " + " geht2, " + " kommt3, " + " geht3, " + " kommt4, " + " geht4, " + " kommt5, " + " geht5, " + " code, " + " information" + " ) " + "VALUES " + " ( " + " :datum, " + " :kommt1, " + " :geht1, " + " :kommt2, " + " :geht2, " + " :kommt3, " + " :geht3, " + " :kommt4, " + " :geht4, " + " :kommt5, " + " :geht5, " + " :code, " + " :information" + " );"); + + query.bindValue(":datum", date()); + query.bindValue(":kommt1", kommt1()); + query.bindValue(":geht1", geht1()); + query.bindValue(":kommt2", kommt2()); + query.bindValue(":geht2", geht2()); + query.bindValue(":kommt3", kommt3()); + query.bindValue(":geht3", geht3()); + query.bindValue(":kommt4", kommt4()); + query.bindValue(":geht4", geht4()); + query.bindValue(":kommt5", kommt5()); + query.bindValue(":geht5", geht5()); + query.bindValue(":code", code()); + query.bindValue(":information", information()); + + if(!query.exec()) + { + qDebug() << "Save: " << query.lastError().text(); + return(false); + } + + qDebug() << "saved."; + return(true); +} + +bool cBookingList::load() +{ + QSqlQuery query; + + query.prepare("SELECT datum, " + " kommt1, " + " geht1, " + " kommt2, " + " geht2, " + " kommt3, " + " geht3, " + " kommt4, " + " geht4, " + " kommt5, " + " geht5, " + " code, " + " information " + "FROM booking " + "ORDER BY datum;"); + + if(!query.exec()) + { + qDebug() << "SELECT FROM booking: " << query.lastError().text(); + return(false); + } + + while(query.next()) + { + cBooking* lpBooking = add(query.value("datum").toDate()); + + if(lpBooking) + { + lpBooking->setKommt1(query.value("kommt1").toTime()); + lpBooking->setGeht1(query.value("geht1").toTime()); + lpBooking->setKommt2(query.value("kommt2").toTime()); + lpBooking->setGeht2(query.value("geht2").toTime()); + lpBooking->setKommt3(query.value("kommt3").toTime()); + lpBooking->setGeht3(query.value("geht3").toTime()); + lpBooking->setKommt4(query.value("kommt4").toTime()); + lpBooking->setGeht4(query.value("geht4").toTime()); + lpBooking->setKommt5(query.value("kommt5").toTime()); + lpBooking->setGeht5(query.value("geht5").toTime()); + lpBooking->setCode(query.value("code").toString()); + lpBooking->setInformation(query.value("information").toString()); + } + } + + return(true); +} + +cBooking* cBookingList::add(const QDate& date) +{ + if(find(date)) + return(nullptr); + + cBooking* lpBooking = new cBooking(date); + append(lpBooking); + return(lpBooking); +} + +cBooking* cBookingList::find(const QDate& date) +{ + for(cBookingList::iterator i = begin();i != end(); i++) + { + if((*i)->date() == date) + return(*i); + } + return(nullptr); +} diff --git a/cbooking.h b/cbooking.h new file mode 100644 index 0000000..f9318f9 --- /dev/null +++ b/cbooking.h @@ -0,0 +1,104 @@ +#ifndef CBOOKING_H +#define CBOOKING_H + + +#include +#include +#include +#include +#include + + +class cBooking : public QObject +{ + Q_OBJECT + +public: + explicit cBooking(const QDate& date, QObject* parent = nullptr); + + QDate date(); + + void setKommt1(const QTime& time); + QTime kommt1(); + + void setGeht1(const QTime& time); + QTime geht1(); + + void setKommt2(const QTime& time); + QTime kommt2(); + + void setGeht2(const QTime& time); + QTime geht2(); + + void setKommt3(const QTime& time); + QTime kommt3(); + + void setGeht3(const QTime& time); + QTime geht3(); + + void setKommt4(const QTime& time); + QTime kommt4(); + + void setGeht4(const QTime& time); + QTime geht4(); + + void setKommt5(const QTime& time); + QTime kommt5(); + + void setGeht5(const QTime& time); + QTime geht5(); + + void setCode(const QString& code); + QString code(); + + void setInformation(const QString& information); + QString information(); + + QTime pause(); + + QTime ist(); + + void setSoll(); + QTime soll(); + + qint32 diff(); + QString diffString(); + + void setPrevDiff(qint32 diff); + qint32 prevDiff(); + + qint32 currentDiff(); + QString currentDiffString(); + + qreal hoursDecimal(); + + bool save(); +private: + QDate m_date; + QTime m_kommt1; + QTime m_geht1; + QTime m_kommt2; + QTime m_geht2; + QTime m_kommt3; + QTime m_geht3; + QTime m_kommt4; + QTime m_geht4; + QTime m_kommt5; + QTime m_geht5; + QString m_code; + QString m_information; + QTime m_soll; + qint32 m_prevDiff; +}; + +Q_DECLARE_METATYPE(cBooking*) + +class cBookingList : public QList +{ +public: + bool load(); + cBooking* add(const QDate& date); + cBooking* find(const QDate& date); +}; + +#endif // CBOOKING_H diff --git a/cmainwindow.cpp b/cmainwindow.cpp index 8a00d3e..d35eb87 100644 --- a/cmainwindow.cpp +++ b/cmainwindow.cpp @@ -2,34 +2,35 @@ #include "ui_cmainwindow.h" #include +#include #include +#include +#include + +#include +#include + cMainWindow::cMainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::cMainWindow), m_lpMonthlyView(nullptr) { - ui->setupUi(this); + openDB(); + m_bookingList.load(); - QSettings settings; - qint32 iX = settings.value("main/x", QVariant::fromValue(-1)).toInt(); - qint32 iY = settings.value("main/y", QVariant::fromValue(-1)).toInt(); - qint32 iWidth = settings.value("main/width", QVariant::fromValue(-1)).toInt(); - qint32 iHeight = settings.value("main/height", QVariant::fromValue(-1)).toInt(); + initUI(); - if(iWidth != -1 && iHeight != -1) - resize(iWidth, iHeight); - if(iX != -1 && iY != -1) - move(iX, iY); - - m_lpMonthlyView = new cMonthlyView(QDate(2019, 10, 8), this); - ui->m_lpMainTab->addTab(m_lpMonthlyView, "Monthly"); + qDebug() << "count: " << m_bookingList.count(); } cMainWindow::~cMainWindow() { + if(m_db.isOpen()) + m_db.close(); + if(m_lpMonthlyView) delete m_lpMonthlyView; @@ -50,3 +51,83 @@ void cMainWindow::closeEvent(QCloseEvent *event) event->accept(); } + +void cMainWindow::initUI() +{ + ui->setupUi(this); + + QSettings settings; + qint32 iX = settings.value("main/x", QVariant::fromValue(-1)).toInt(); + qint32 iY = settings.value("main/y", QVariant::fromValue(-1)).toInt(); + qint32 iWidth = settings.value("main/width", QVariant::fromValue(-1)).toInt(); + qint32 iHeight = settings.value("main/height", QVariant::fromValue(-1)).toInt(); + + if(iWidth != -1 && iHeight != -1) + resize(iWidth, iHeight); + if(iX != -1 && iY != -1) + move(iX, iY); + + m_lpMonthlyView = new cMonthlyView(QDate::currentDate(), &m_bookingList, this); + ui->m_lpMainTab->addTab(m_lpMonthlyView, "Monthly"); +} + +void cMainWindow::openDB() +{ + QSettings settings; + + if(!settings.contains("db/file")) + settings.setValue("db/file", QDir::homePath() + "/workingHours.db"); + + QString szDB = settings.value("db/file", QDir::homePath() + "/workingHours.db").toString(); + qDebug() << "Database: " << szDB; + + m_db = QSqlDatabase::addDatabase("QSQLITE"); + m_db.setHostName("localhost"); + m_db.setDatabaseName(szDB); + + if(!m_db.open()) + { + QMessageBox::critical(this, tr("Database Open"), "Database cannot be opened!\n" + m_db.lastError().text()); + qDebug() << "Database Open error: " << m_db.lastError().text(); + return; + } + + qDebug() << "Database opened"; + +// if(!m_db.tables().contains("config")) +// { +// QSqlQuery query; + +// query.prepare("CREATE TABLE config " +// " ") +// } + + if(!m_db.tables().contains("booking")) + { + QSqlQuery query; + + query.prepare("CREATE TABLE booking " + "( " + " datum DATE PRIMARY KEY UNIQE, " + " kommt1 TIME, " + " geht1 TIME, " + " kommt2 TIME, " + " geht2 TIME, " + " kommt3 TIME, " + " geht3 TIME, " + " kommt4 TIME, " + " geht4 TIME, " + " kommt5 TIME, " + " geht5 TIME, " + " code INTEGER, " + " information STRING " + ");"); + + if(!query.exec()) + { + qDebug() << "CREATE TABLE booking: " << query.lastError().text(); + return; + } + qDebug() << "CREATE TABLE booking"; + } +} diff --git a/cmainwindow.h b/cmainwindow.h index 74c9625..d801ce6 100644 --- a/cmainwindow.h +++ b/cmainwindow.h @@ -3,10 +3,13 @@ #include "cmonthlyview.h" +#include "cbooking.h" #include #include +#include + namespace Ui { class cMainWindow; @@ -23,6 +26,11 @@ public: private: Ui::cMainWindow* ui; cMonthlyView* m_lpMonthlyView; + QSqlDatabase m_db; + cBookingList m_bookingList; + + void initUI(); + void openDB(); protected: void closeEvent(QCloseEvent* event); diff --git a/cmonthlyitemdelegate.cpp b/cmonthlyitemdelegate.cpp index 58cffa6..19e3d6b 100644 --- a/cmonthlyitemdelegate.cpp +++ b/cmonthlyitemdelegate.cpp @@ -22,7 +22,10 @@ QWidget* cMonthlyItemDelegate::createEditor( QWidget *parent, const QStyleOption case COL_GO2: case COL_COME3: case COL_GO3: - case COL_BREAK: + case COL_COME4: + case COL_GO4: + case COL_COME5: + case COL_GO5: { QTimeEdit* lpTimeEdit = new QTimeEdit(parent); lpTimeEdit->setDisplayFormat("HH:mm:ss"); @@ -56,7 +59,10 @@ void cMonthlyItemDelegate::setEditorData ( QWidget *editor, const QModelIndex &i case COL_GO2: case COL_COME3: case COL_GO3: - case COL_BREAK: + case COL_COME4: + case COL_GO4: + case COL_COME5: + case COL_GO5: { QTimeEdit* lpTimeEdit = qobject_cast(editor); lpTimeEdit->setTime(QTime::fromString(index.data(Qt::EditRole).toString())); @@ -91,7 +97,10 @@ void cMonthlyItemDelegate::setModelData ( QWidget *editor, QAbstractItemModel *m case COL_GO2: case COL_COME3: case COL_GO3: - case COL_BREAK: + case COL_COME4: + case COL_GO4: + case COL_COME5: + case COL_GO5: { QTimeEdit* lpTimeEdit = qobject_cast(editor); if(!lpTimeEdit->time().hour() && diff --git a/cmonthlyview.cpp b/cmonthlyview.cpp index 70e039f..ca637b9 100644 --- a/cmonthlyview.cpp +++ b/cmonthlyview.cpp @@ -6,9 +6,11 @@ #include -cMonthlyView::cMonthlyView(const QDate& date, QWidget *parent) : +cMonthlyView::cMonthlyView(const QDate& date, cBookingList* lpBookingList, QWidget *parent) : QWidget(parent), - ui(new Ui::cMonthlyView) + ui(new Ui::cMonthlyView), + m_loading(true), + m_lpBookingList(lpBookingList) { m_code.insert(" ", tr("")); m_code.insert("G", tr("Gleitzeit")); @@ -32,18 +34,25 @@ cMonthlyView::cMonthlyView(const QDate& date, QWidget *parent) : ui->m_lpSonderurlaubLabel->setAutoFillBackground(true); ui->m_lpSonderurlaubLabel->setStyleSheet(QString("QLabel { background-color: rgba(%1, %2, %3, 255); }").arg(COLOR_SONDERURLAUB.red()).arg(COLOR_SONDERURLAUB.green()).arg(COLOR_SONDERURLAUB.blue())); + ui->m_lpMonth->setDate(date); setDate(date); connect(static_cast(ui->m_lpMonthlyList->itemDelegate()), &cMonthlyItemDelegate::timeChanged, this, &cMonthlyView::onTimeChanged); connect(static_cast(ui->m_lpMonthlyList->itemDelegate()), &cMonthlyItemDelegate::textChanged, this, &cMonthlyView::onTextChanged); + + connect(ui->m_lpMonth, &QDateEdit::dateChanged, this, &cMonthlyView::onDateChanged); } void cMonthlyView::setDate(const QDate& date) { + m_loading = true; + + m_publicHoliday.setYear(static_cast(date.year())); + m_lpMonthlyListModel->clear(); QStringList header; - header << tr("day") << tr("public holiday") << tr("come1") << tr("go1") << tr("come2") << tr("go2") << tr("come3") << tr("go3") << tr("break") << tr("code") << tr("is") << tr("should") << tr("+/-") << tr("information") << tr("current +/-") << tr("hours dec") << tr("day"); + header << tr("Tag") << tr("Feiertag") << tr("kommt 1") << tr("geht 1") << tr("kommt 2") << tr("geht 2") << tr("kommt 3") << tr("geht 3") << tr("kommt 4") << tr("geht 4") << tr("kommt 5") << tr("geht 5") << tr("Pause") << tr("Kode") << tr("ist") << tr("soll") << tr("+/-") << tr("information") << tr("aktuell +/-") << tr("dezimal") << tr("Tag"); m_lpMonthlyListModel->setHorizontalHeaderLabels(header); QList items; @@ -58,6 +67,10 @@ void cMonthlyView::setDate(const QDate& date) items[COL_GO2]->setText("00:00:00"); items[COL_COME3]->setText("00:00:00"); items[COL_GO3]->setText("00:00:00"); + items[COL_COME4]->setText("00:00:00"); + items[COL_GO4]->setText("00:00:00"); + items[COL_COME5]->setText("00:00:00"); + items[COL_GO5]->setText("00:00:00"); items[COL_BREAK]->setText("00:00:00"); items[COL_CODE]->setText(""); items[COL_IS]->setText("00:00:00"); @@ -81,29 +94,42 @@ void cMonthlyView::setDate(const QDate& date) for(;date1.month() == date.month();date1 = date1.addDays(1)) { + cBooking* lpBooking = m_lpBookingList->find(date1); + + if(!lpBooking) + { + lpBooking = m_lpBookingList->add(date1); + lpBooking->save(); + } + items.clear(); for(int y = 0;y < header.count();y++) items.append(new QStandardItem); items[COL_DAY1]->setText(date1.toString("dddd dd")); - items[COL_PUBLIC_HOLIDAY]->setText(""); - items[COL_COME1]->setText(""); - items[COL_GO1]->setText(""); - items[COL_COME2]->setText(""); - items[COL_GO2]->setText(""); - items[COL_COME3]->setText(""); - items[COL_GO3]->setText(""); - items[COL_BREAK]->setText("00:00:00"); - items[COL_CODE]->setText(""); - items[COL_IS]->setText("00:00:00"); - items[COL_SHOULD]->setText("00:00:00"); - items[COL_DIFF]->setText("00:00:00"); - items[COL_INFORMATION]->setText(""); - items[COL_CURRENT]->setText("00:00:00"); - items[COL_HOURS_DEC]->setText("0.0"); + items[COL_PUBLIC_HOLIDAY]->setText(m_publicHoliday.name(date1)); items[COL_DAY2]->setText(date1.toString("dd dddd")); + items[COL_COME1]->setText(lpBooking->kommt1().toString("hh:mm:ss")); + items[COL_GO1]->setText(lpBooking->geht1().toString("hh:mm:ss")); + items[COL_COME2]->setText(lpBooking->kommt2().toString("hh:mm:ss")); + items[COL_GO2]->setText(lpBooking->geht2().toString("hh:mm:ss")); + items[COL_COME3]->setText(lpBooking->kommt3().toString("hh:mm:ss")); + items[COL_GO3]->setText(lpBooking->geht3().toString("hh:mm:ss")); + items[COL_COME4]->setText(lpBooking->kommt4().toString("hh:mm:ss")); + items[COL_GO4]->setText(lpBooking->geht4().toString("hh:mm:ss")); + items[COL_COME5]->setText(lpBooking->kommt5().toString("hh:mm:ss")); + items[COL_GO5]->setText(lpBooking->geht5().toString("hh:mm:ss")); + items[COL_BREAK]->setText(lpBooking->pause().toString("hh:mm:ss")); + items[COL_CODE]->setText(lpBooking->code()); + items[COL_IS]->setText(lpBooking->ist().toString("hh:mm:ss")); + items[COL_SHOULD]->setText(lpBooking->soll().toString("hh:mm:ss")); + items[COL_DIFF]->setText(lpBooking->diffString()); + items[COL_INFORMATION]->setText(lpBooking->information()); + items[COL_CURRENT]->setText(lpBooking->currentDiffString()); + items[COL_HOURS_DEC]->setText(QString::number(lpBooking->hoursDecimal())); + items[COL_DAY1]->setTextAlignment(Qt::AlignRight); items[COL_PUBLIC_HOLIDAY]->setTextAlignment(Qt::AlignHCenter); items[COL_COME1]->setTextAlignment(Qt::AlignHCenter); @@ -112,6 +138,10 @@ void cMonthlyView::setDate(const QDate& date) items[COL_GO2]->setTextAlignment(Qt::AlignHCenter); items[COL_COME3]->setTextAlignment(Qt::AlignHCenter); items[COL_GO3]->setTextAlignment(Qt::AlignHCenter); + items[COL_COME4]->setTextAlignment(Qt::AlignHCenter); + items[COL_GO4]->setTextAlignment(Qt::AlignHCenter); + items[COL_COME5]->setTextAlignment(Qt::AlignHCenter); + items[COL_GO5]->setTextAlignment(Qt::AlignHCenter); items[COL_BREAK]->setTextAlignment(Qt::AlignHCenter); items[COL_CODE]->setTextAlignment(Qt::AlignHCenter); items[COL_IS]->setTextAlignment(Qt::AlignHCenter); @@ -124,25 +154,33 @@ void cMonthlyView::setDate(const QDate& date) for(int z = 0;z < items.count();z++) { - if(date1.dayOfWeek() >= 6) + if(date1.dayOfWeek() >= 6 || m_publicHoliday.isPublicHoliday(date1)) { items[z]->setData(QVariant::fromValue(true), Qt::UserRole+1); items[z]->setBackground(weekend); } else items[z]->setData(QVariant::fromValue(false), Qt::UserRole+1); + + items[z]->setData(QVariant::fromValue(lpBooking), Qt::UserRole+2); } m_lpMonthlyListModel->appendRow(items); + + if(date1.dayOfWeek() < 6 && !m_publicHoliday.isPublicHoliday(date1)) + setBackground(date1.day(), lpBooking->code()); } ui->m_lpMonthlyList->resizeColumnToContents(COL_DAY1); ui->m_lpMonthlyList->resizeColumnToContents(COL_DAY2); + ui->m_lpMonthlyList->resizeColumnToContents(COL_PUBLIC_HOLIDAY); ui->m_lpUebertragLabel->setText(QString(tr("Übertrag %1:")).arg(date.addMonths(-1).toString("MMMM yyyy"))); ui->m_lpShouldLabel->setText(QString(tr("SOLL Arbeitszeit (%1):")).arg(date.toString("MMMM yyyy"))); ui->m_lpIsLabel->setText(QString(tr("IST Arbeitszeit (%1):")).arg(date.toString("MMMM yyyy"))); ui->m_lpResturlaubLabel->setText(QString(tr("Resturlaub %1:")).arg(date.addMonths(-1).toString("MMMM yyyy"))); ui->m_lpRestSonderurlaubLabel->setText(QString(tr("Sonderurlaub %1:")).arg(date.addMonths(-1).toString("MMMM yyyy"))); + + m_loading = false; } cMonthlyView::~cMonthlyView() @@ -152,35 +190,108 @@ cMonthlyView::~cMonthlyView() void cMonthlyView::onTimeChanged(const int day, const int field, const QTime& time) { - qDebug() << "Day: " << day; - qDebug() << "field: " << field; - qDebug() << "time: " << time; + QStandardItem* lpItem = m_lpMonthlyListModel->item(day-1, field); + if(!lpItem) + return; + + cBooking* lpBooking = lpItem->data(Qt::UserRole+2).value(); + if(!lpBooking) + return; + + switch(field) + { + case COL_COME1: + lpBooking->setKommt1(time); + lpBooking->save(); + break; + case COL_GO1: + lpBooking->setGeht1(time); + lpBooking->save(); + break; + case COL_COME2: + lpBooking->setKommt2(time); + lpBooking->save(); + break; + case COL_GO2: + lpBooking->setGeht2(time); + lpBooking->save(); + break; + case COL_COME3: + lpBooking->setKommt3(time); + lpBooking->save(); + break; + case COL_GO3: + lpBooking->setGeht3(time); + lpBooking->save(); + break; + case COL_COME4: + lpBooking->setKommt4(time); + lpBooking->save(); + break; + case COL_GO4: + lpBooking->setGeht4(time); + lpBooking->save(); + break; + case COL_COME5: + lpBooking->setKommt5(time); + lpBooking->save(); + break; + case COL_GO5: + lpBooking->setGeht5(time); + lpBooking->save(); + break; + } } void cMonthlyView::onTextChanged(const int day, const int field, const QString& text) { - qDebug() << "Day: " << day; - qDebug() << "field: " << field; - qDebug() << "time: " << text; + QStandardItem* lpItem = m_lpMonthlyListModel->item(day-1, field); + if(!lpItem) + return; - if(field == COL_CODE) + cBooking* lpBooking = lpItem->data(Qt::UserRole+2).value(); + if(!lpBooking) + return; + + switch(field) + { + case COL_CODE: { - QBrush brush; QString code = m_code.key(text); - if(code == "G") - brush = QBrush(COLOR_GLEITZEIT); - else if(code == "U") - brush = QBrush(COLOR_URLAUB); - else if(code == "K") - brush = QBrush(COLOR_KRANK); - else if(code == "SU") - brush = QBrush(COLOR_SONDERURLAUB); + setBackground(day, code); + lpBooking->setCode(code); + lpBooking->save(); + break; + } + case COL_INFORMATION: + lpBooking->setInformation(text); + lpBooking->save(); + break; + } +} - for(int x = 0;x < m_lpMonthlyListModel->columnCount();x++) - { - QStandardItem* lpItem = m_lpMonthlyListModel->item(day-1, x); - lpItem->setBackground(brush); - } +void cMonthlyView::onDateChanged(const QDate& date) +{ + setDate(date); +} + +void cMonthlyView::setBackground(const int day, const QString& code) +{ + QBrush brush; + + if(code == "G") + brush = QBrush(COLOR_GLEITZEIT); + else if(code == "U") + brush = QBrush(COLOR_URLAUB); + else if(code == "K") + brush = QBrush(COLOR_KRANK); + else if(code == "SU") + brush = QBrush(COLOR_SONDERURLAUB); + + for(int x = 0;x < m_lpMonthlyListModel->columnCount();x++) + { + QStandardItem* lpItem = m_lpMonthlyListModel->item(day-1, x); + lpItem->setBackground(brush); } } diff --git a/cmonthlyview.h b/cmonthlyview.h index e66b004..9d3355b 100644 --- a/cmonthlyview.h +++ b/cmonthlyview.h @@ -3,6 +3,9 @@ #include "cmonthlyitemdelegate.h" +#include "cpublicholiday.h" + +#include "cbooking.h" #include #include @@ -19,18 +22,24 @@ class cMonthlyView : public QWidget Q_OBJECT public: - explicit cMonthlyView(const QDate& date, QWidget *parent = nullptr); + explicit cMonthlyView(const QDate& date, cBookingList* lpBookingList, QWidget *parent = nullptr); ~cMonthlyView(); void setDate(const QDate& date); private: Ui::cMonthlyView* ui; + bool m_loading; QStandardItemModel* m_lpMonthlyListModel; QMap m_code; + cPublicHoliday m_publicHoliday; + cBookingList* m_lpBookingList; + + void setBackground(const int day, const QString& code); private slots: void onTimeChanged(const int day, const int field, const QTime& time); void onTextChanged(const int day, const int field, const QString& text); + void onDateChanged(const QDate& date); }; #endif // CMONTHLYVIEW_H diff --git a/cmonthlyview.ui b/cmonthlyview.ui index 09546b9..15b6fda 100644 --- a/cmonthlyview.ui +++ b/cmonthlyview.ui @@ -16,6 +16,16 @@ + + + + QDateTimeEdit::MonthSection + + + MM.yyyy + + + @@ -27,11 +37,11 @@ 0 0 861 - 241 + 215 - + true diff --git a/common.h b/common.h index 763df28..8f8c3e9 100644 --- a/common.h +++ b/common.h @@ -13,15 +13,19 @@ #define COL_GO2 5 #define COL_COME3 6 #define COL_GO3 7 -#define COL_BREAK 8 -#define COL_CODE 9 -#define COL_IS 10 -#define COL_SHOULD 11 -#define COL_DIFF 12 -#define COL_INFORMATION 13 -#define COL_CURRENT 14 -#define COL_HOURS_DEC 15 -#define COL_DAY2 16 +#define COL_COME4 8 +#define COL_GO4 9 +#define COL_COME5 10 +#define COL_GO5 11 +#define COL_BREAK 12 +#define COL_CODE 13 +#define COL_IS 14 +#define COL_SHOULD 15 +#define COL_DIFF 16 +#define COL_INFORMATION 17 +#define COL_CURRENT 18 +#define COL_HOURS_DEC 19 +#define COL_DAY2 20 #define COLOR_GLEITZEIT QColor(191, 191, 255) #define COLOR_URLAUB QColor(127, 127, 255) diff --git a/cpublicholiday.cpp b/cpublicholiday.cpp index 0858e47..fd1fa6b 100644 --- a/cpublicholiday.cpp +++ b/cpublicholiday.cpp @@ -6,9 +6,68 @@ cPublicHoliday::cPublicHoliday(qint16 year) : m_year(year) { - m_holidays.insert(ostersonntag(), QObject::tr("Ostersonntag")); + calculate(); } +void cPublicHoliday::setYear(qint16 year) +{ + m_year = year; + calculate(); +} + +qint16 cPublicHoliday::year() +{ + return(m_year); +} + +void cPublicHoliday::calculate() +{ + m_holidays.clear(); + + m_holidays.insert(neujahr(), QObject::tr("Neujahr")); + m_holidays.insert(heilige3koenige(), QObject::tr("Heilige 3 Könige")); + m_holidays.insert(karfreitag(), QObject::tr("Karfreitag")); + m_holidays.insert(ostersonntag(), QObject::tr("Ostersonntag")); + m_holidays.insert(ostermontag(), QObject::tr("OsterMontag")); + m_holidays.insert(staatsfeiertag1(), QObject::tr("Staatsfeiertag")); + m_holidays.insert(christihimmelfahrt(), QObject::tr("Christi Himmelfahrt")); + m_holidays.insert(pfingstsonntag(), QObject::tr("Pfingstsonntag")); + m_holidays.insert(pfingstmontag(), QObject::tr("Pfingstmontag")); + m_holidays.insert(fronleichnam(), QObject::tr("Fronleichnam")); + m_holidays.insert(mariahimmelfahrt(), QObject::tr("Maria Himmelfahrt")); + m_holidays.insert(staatsfeiertag(), QObject::tr("Staatsfeiertag")); + m_holidays.insert(allerheiligen(), QObject::tr("Allerheiligen")); + m_holidays.insert(ersteradvent(), QObject::tr("1. Advent")); + m_holidays.insert(mariaempfaengnis(), QObject::tr("Maria Emphängnis")); + m_holidays.insert(ersterweihnachtstag(), QObject::tr("1. Weihnachtstag")); + m_holidays.insert(zweiterweihnachtstag(), QObject::tr("2. Weihnachtstag")); + m_holidays.insert(silvester(), QObject::tr("Silvester")); +} + +/* +1,1,jahr, "Neujahr (18 Uhr)" +6,1,jahr, "Hl. Drei Könige" +14,7,jahr, "Sel. Bernhard" +15,8,jahr, "Mariä Himmelfahrt" +1,11,jahr, "Allerheiligen" +8,12,jahr, "Maria Empfängnis" +24,12,jahr, "Heilig Abend" +25,12,jahr, "1.Weihnachtsfeiertag" +26,12,jahr, "2.Weihnachtsfeiertag" +// von Ostern abhängige Feiertage +Ostern-46, "Aschermittwoch" +Ostern-7, "Palmsonntag" +Ostern-3, "Gründonnerstag" +Ostern-2, "Karfreitag" +Ostern-1, "Karsamstag" +Ostern, "Ostersonntag" +Ostern+1, "Ostermontag" +Ostern+39, "Christi Himmelfahrt" +Ostern+49, "Pfingstsonntag" +Ostern+50, "Pfingstmontag" +Ostern+60, "Fronleichnam" +*/ + bool cPublicHoliday::isPublicHoliday(const QDate& date) { return(m_holidays.contains(date)); @@ -19,6 +78,21 @@ QString cPublicHoliday::name(const QDate& date) return(m_holidays.value(date, "")); } +QDate cPublicHoliday::neujahr() +{ + return(QDate(m_year, 1, 1)); +} + +QDate cPublicHoliday::heilige3koenige() +{ + return(QDate(m_year, 1, 6)); +} + +QDate cPublicHoliday::karfreitag() +{ + return(ostersonntag().addDays(-2)); +} + QDate cPublicHoliday::ostersonntag() { int a = m_year % 19; @@ -36,3 +110,79 @@ QDate cPublicHoliday::ostersonntag() return(QDate(m_year, nMonth, nDay)); } + +QDate cPublicHoliday::ostermontag() +{ + return(ostersonntag().addDays(1)); +} + +QDate cPublicHoliday::staatsfeiertag1() +{ + return(QDate(m_year, 5, 1)); +} + +QDate cPublicHoliday::christihimmelfahrt() +{ + return(ostersonntag().addDays(39)); +} + +QDate cPublicHoliday::pfingstsonntag() +{ + return(ostersonntag().addDays(49)); +} + +QDate cPublicHoliday::pfingstmontag() +{ + return(ostersonntag().addDays(50)); +} + +QDate cPublicHoliday::fronleichnam() +{ + return(ostersonntag().addDays(60)); +} + +QDate cPublicHoliday::mariahimmelfahrt() +{ + return(QDate(m_year, 8, 15)); +} + +QDate cPublicHoliday::staatsfeiertag() +{ + return(QDate(m_year, 10, 26)); +} + +QDate cPublicHoliday::allerheiligen() +{ + return(QDate(m_year, 11, 1)); +} + +QDate cPublicHoliday::ersteradvent() +{ + QDate date(m_year, 11, 27); + return(date.addDays(7-date.dayOfWeek())); +} + +QDate cPublicHoliday::mariaempfaengnis() +{ + return(QDate(m_year, 12, 8)); +} + +QDate cPublicHoliday::ersterweihnachtstag() +{ + return(QDate(m_year, 12, 25)); +} + +QDate cPublicHoliday::zweiterweihnachtstag() +{ + return(QDate(m_year, 12, 26)); +} + +QDate cPublicHoliday::silvester() +{ + return(QDate(m_year, 12, 31)); +} + +QMap cPublicHoliday::list() +{ + return(m_holidays); +} diff --git a/cpublicholiday.h b/cpublicholiday.h index 99162e4..0521a0a 100644 --- a/cpublicholiday.h +++ b/cpublicholiday.h @@ -11,28 +11,38 @@ class cPublicHoliday { public: - cPublicHoliday(qint16 year); + cPublicHoliday(qint16 year = 2000); + + void setYear(qint16 year); + qint16 year(); bool isPublicHoliday(const QDate& date); QString name(const QDate& date); + QMap list(); private: qint16 m_year; QMap m_holidays; + void calculate(); + QDate neujahr(); - QDate heilige3Koenige(); + QDate heilige3koenige(); QDate karfreitag(); QDate ostersonntag(); QDate ostermontag(); QDate staatsfeiertag1(); - QDate christiHimmelfahrt(); + QDate christihimmelfahrt(); QDate pfingstsonntag(); - QDate pfingstMontag(); + QDate pfingstmontag(); QDate fronleichnam(); - QDate mariaHimmelfahrt(); + QDate mariahimmelfahrt(); QDate staatsfeiertag(); QDate allerheiligen(); + QDate ersteradvent(); + QDate mariaempfaengnis(); + QDate ersterweihnachtstag(); + QDate zweiterweihnachtstag(); QDate silvester(); }; /* diff --git a/workingHours.pro b/workingHours.pro index 96b6153..6e3d3eb 100644 --- a/workingHours.pro +++ b/workingHours.pro @@ -4,7 +4,7 @@ # #------------------------------------------------- -QT += core gui +QT += core gui sql greaterThan(QT_MAJOR_VERSION, 4): QT += widgets @@ -25,6 +25,7 @@ DEFINES += QT_DEPRECATED_WARNINGS CONFIG += c++11 SOURCES += \ + cbooking.cpp \ cmonthlyitemdelegate.cpp \ cmonthlyview.cpp \ cpublicholiday.cpp \ @@ -32,6 +33,7 @@ SOURCES += \ cmainwindow.cpp HEADERS += \ + cbooking.h \ cmainwindow.h \ cmonthlyitemdelegate.h \ cmonthlyview.h \