diff --git a/cbooking.cpp b/cbooking.cpp index c8cf2c8..b0888d8 100644 --- a/cbooking.cpp +++ b/cbooking.cpp @@ -195,12 +195,19 @@ void cBooking::setSoll(const QTime& time) m_soll = time; } +qint32 cBooking::sollSecs() +{ + QTime t = soll(); + int s = t.hour()*3600+t.minute()*60+t.second(); + + return(s); +} + QTime cBooking::soll() { - if(code() == "G" || - code() == "K" || - code() == "U" || - code() == "SU") + if(code() == "K" || + code() == "U" || + code() == "SU") return(QTime(0, 0, 0)); return(m_soll); @@ -218,19 +225,8 @@ qint32 cBooking::diff() QString cBooking::diffString() { - QTime t; qint32 d = diff(); - bool bNeg = false; - - if(d < 0) - { - t = QTime(0, 0, 0).addSecs(-d); - bNeg = true; - } - else - t = QTime(0, 0, 0).addSecs(d); - - return((bNeg ? "-" : "") + t.toString("hh:mm:ss")); + return(secs2String(d)); } void cBooking::setPrevDiff(qint32 diff) @@ -243,6 +239,12 @@ qint32 cBooking::prevDiff() return(m_prevDiff); } +QString cBooking::prevDiffString() +{ + qint32 d = prevDiff(); + return(secs2String(d)); +} + qint32 cBooking::currentDiff() { return(prevDiff()+diff()); @@ -250,21 +252,8 @@ qint32 cBooking::currentDiff() QString cBooking::currentDiffString() { - QTime t; qint32 d = currentDiff(); - bool bNeg = false; - - if(d < 0) - { - t = QTime(0, 0, 0).addSecs(-d); - bNeg = true; - } - else - t = QTime(0, 0, 0).addSecs(d); - - qint32 h = d / 3600; - - return(QString::number(h) + t.toString(":mm:ss")); + return(secs2String(d)); } qreal cBooking::hoursDecimal() @@ -274,6 +263,16 @@ qreal cBooking::hoursDecimal() return(static_cast(w)/3600); } +void cBooking::setVacation(qint16 vac) +{ + m_vacation = vac; +} + +qint16 cBooking::vacation() +{ + return(m_vacation); +} + bool cBooking::save() { QSqlQuery query; @@ -377,9 +376,10 @@ int cBooking::totalPause() return(geht1().secsTo(kommt2()) + geht2().secsTo(kommt3()) + geht3().secsTo(kommt4()) + geht4().secsTo(kommt5())); } -cBookingList::cBookingList(cPublicHoliday* lpPublicHoliday, cDailyWorkingList* lpDailyWorkingList) : +cBookingList::cBookingList(cPublicHoliday* lpPublicHoliday, cDailyWorkingList* lpDailyWorkingList, cVacationList* lpVacationList) : m_lpPublicHoliday(lpPublicHoliday), - m_lpDailyWorkingList(lpDailyWorkingList) + m_lpDailyWorkingList(lpDailyWorkingList), + m_lpVacationList(lpVacationList) { } @@ -487,8 +487,9 @@ void cBookingList::recalculate(const QDate& date) { sort(); - bool bFirst = false; - cBookingList::iterator i = begin(); + bool bFirst = false; + cBookingList::iterator i = begin(); + qint16 oldVacation = 0; if(!date.isNull() && date.isValid()) { @@ -496,6 +497,8 @@ void cBookingList::recalculate(const QDate& date) { if((*i)->date() >= date) break; + + oldVacation = (*i)->vacation(); } } @@ -507,6 +510,12 @@ void cBookingList::recalculate(const QDate& date) for(;i != end(); i++) { + cVacation* lpVacation = m_lpVacationList->find((*i)->date()); + if(lpVacation) + (*i)->setVacation(oldVacation + lpVacation->days()); + else + (*i)->setVacation(oldVacation); + if(bFirst) { bFirst = false; @@ -514,5 +523,10 @@ void cBookingList::recalculate(const QDate& date) } else (*i)->setPrevDiff((*(i-1))->currentDiff()); + + oldVacation = (*i)->vacation(); + + if((*i)->code() == "U") + oldVacation--; } } diff --git a/cbooking.h b/cbooking.h index da82bbc..b0aa81a 100644 --- a/cbooking.h +++ b/cbooking.h @@ -4,6 +4,7 @@ #include "cpublicholiday.h" #include "cdailyworking.h" +#include "cvacation.h" #include #include @@ -66,6 +67,7 @@ public: QTime ist(); void setSoll(const QTime& time); + qint32 sollSecs(); QTime soll(); qint32 diff(); @@ -73,12 +75,16 @@ public: void setPrevDiff(qint32 diff); qint32 prevDiff(); + QString prevDiffString(); qint32 currentDiff(); QString currentDiffString(); qreal hoursDecimal(); + void setVacation(qint16 vac); + qint16 vacation(); + bool save(); private: QDate m_date; @@ -96,6 +102,7 @@ private: QString m_information; QTime m_soll; qint32 m_prevDiff; + qint16 m_vacation; void bind(QSqlQuery& query, const QString& variable, const QTime& time); @@ -108,7 +115,7 @@ Q_DECLARE_METATYPE(cBooking*) class cBookingList : public QList { public: - explicit cBookingList(cPublicHoliday* lpPublicHoliday, cDailyWorkingList* lpDailyWorkingList); + explicit cBookingList(cPublicHoliday* lpPublicHoliday, cDailyWorkingList* lpDailyWorkingList, cVacationList* lpVacationList); bool load(); cBooking* add(const QDate& date); cBooking* find(const QDate& date); @@ -118,6 +125,7 @@ public: private: cPublicHoliday* m_lpPublicHoliday; cDailyWorkingList* m_lpDailyWorkingList; + cVacationList* m_lpVacationList; }; #endif // CBOOKING_H diff --git a/cmainwindow.cpp b/cmainwindow.cpp index 2dc0b31..d98d871 100644 --- a/cmainwindow.cpp +++ b/cmainwindow.cpp @@ -21,8 +21,9 @@ cMainWindow::cMainWindow(QWidget *parent) : { openDB(); m_dailyWorkingList.load(); + m_vacationList.load(); - m_lpBookingList = new cBookingList(&m_publicHoliday, &m_dailyWorkingList); + m_lpBookingList = new cBookingList(&m_publicHoliday, &m_dailyWorkingList, &m_vacationList); m_lpBookingList->load(); initUI(); @@ -149,4 +150,20 @@ void cMainWindow::openDB() } qDebug() << "CREATE TABLE booking"; } + + if(!m_db.tables().contains("vacation")) + { + query.prepare("CREATE TABLE vacation " + "( " + " ab DATE PRIMARY KEY UNIQUE, " + " days INTEGER " + ");"); + + if(!query.exec()) + { + qDebug() << "CREATE TABLE vacation: " << query.lastError().text(); + return; + } + qDebug() << "CREATE TABLE vacation"; + } } diff --git a/cmainwindow.h b/cmainwindow.h index feff0ad..2cf6398 100644 --- a/cmainwindow.h +++ b/cmainwindow.h @@ -4,6 +4,7 @@ #include "cmonthlyview.h" #include "cdailyworking.h" +#include "cvacation.h" #include "cpublicholiday.h" #include "cbooking.h" @@ -31,6 +32,7 @@ private: QSqlDatabase m_db; cPublicHoliday m_publicHoliday; cDailyWorkingList m_dailyWorkingList; + cVacationList m_vacationList; cBookingList* m_lpBookingList; diff --git a/cmonthlyview.cpp b/cmonthlyview.cpp index 25d1a46..0298d1c 100644 --- a/cmonthlyview.cpp +++ b/cmonthlyview.cpp @@ -186,7 +186,8 @@ void cMonthlyView::setDate(const QDate& date) 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"))); + + displaySummary(); m_loading = false; } @@ -349,4 +350,56 @@ void cMonthlyView::recalculate(int day, int /*field*/) cBooking* lpCurrentBooking = lpCurrentDiffItem->data(DATA_BOOKING).value(); lpCurrentDiffItem->setText(lpCurrentBooking->currentDiffString()); } + + displaySummary(); +} + +void cMonthlyView::displaySummary() +{ + QStandardItem* lpFirstItem = m_lpMonthlyListModel->item(0, COL_DAY1); +// QStandardItem* lpLastItem = m_lpMonthlyListModel->item(m_lpMonthlyListModel->rowCount()-1, COL_DAY1); + + cBooking* lpFirstBooking = lpFirstItem->data(DATA_BOOKING).value(); +// cBooking* lpLastBooking = lpLastItem->data(DATA_BOOKING).value(); + + ui->m_lpUebertrag->setText(lpFirstBooking->prevDiffString()); + + qint32 soll = 0; + qint32 ist = 0; + qint16 g = 0; + qint16 k = 0; + qint16 u = 0; + qint16 su = 0; + qint16 t = 0; + for(int i = 0;i < m_lpMonthlyListModel->rowCount();i++) + { + cBooking* lpBooking = m_lpMonthlyListModel->item(i, 0)->data(DATA_BOOKING).value(); + + soll += lpBooking->sollSecs(); + ist += lpBooking->istSecs(); + + if(lpBooking->code() == "G") + g++; + else if(lpBooking->code() == "K") + k++; + else if(lpBooking->code() == "U") + u++; + else if(lpBooking->code() == "SU") + su++; + else if(lpBooking->code() == "T") + t++; + } + + ui->m_lpShould->setText(secs2String(soll)); + ui->m_lpIs->setText(secs2String(ist)); + ui->m_lpSaldo->setText(secs2String(ist-soll)); + ui->m_lpUebertragNaechsterMonat->setText(secs2String(lpFirstBooking->prevDiff()+ist-soll)); + ui->m_lpResturlaub->setText(QString::number(lpFirstBooking->vacation())); + ui->m_lpUebertragUrlaub->setText(QString::number(lpFirstBooking->vacation()-u)); + + ui->m_lpGleitzeit->setText(QString::number(g)); + ui->m_lpKrank->setText(QString::number(k)); + ui->m_lpUrlaub->setText(QString::number(u)); + ui->m_lpSonderurlaub->setText(QString::number(su)); + ui->m_lpTraining->setText(QString::number(t)); } diff --git a/cmonthlyview.h b/cmonthlyview.h index cf30ce9..dd1524f 100644 --- a/cmonthlyview.h +++ b/cmonthlyview.h @@ -39,6 +39,7 @@ private: void setText(QStandardItem* lpItem, const QTime& time); void recalculate(int day, int field); + void displaySummary(); private slots: void onTimeChanged(const int day, const int field, const QTime& time); diff --git a/cmonthlyview.ui b/cmonthlyview.ui index b9dfcd2..0885835 100644 --- a/cmonthlyview.ui +++ b/cmonthlyview.ui @@ -83,7 +83,7 @@ 0 0 861 - 211 + 263 @@ -103,10 +103,157 @@ - - + + - Resturlaub: + Sonderurlaub + + + + + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + QAbstractSpinBox::NoButtons + + + HH:mm:ss + + + + + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + true + + + + + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + true + + + + + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + true + + + + + + + SOLL: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + true + + + + + + + Übertrag: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + true + + + + + + + Übertrag nächster Monat: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + true + + + + + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + true + + + + + + + ausbezahlte Überstunden: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + true + + + + + + + Training + + + + + + + Übertrag Urlaub: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter @@ -120,31 +267,44 @@ - - - - true - - - - - - - true - - - - - - - true - - - - - + + - ausbezahlte Überstunden: + Urlaub + + + + + + + Gleitzeit + + + + + + + IST: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + true + + + + + + + Saldo: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter @@ -164,191 +324,46 @@ - - - - Übertrag nächster Monat: - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + true - - - - IST: - + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - - - - Sonderurlaub: - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - - - - - Übertrag Urlaub: - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - - - - - Saldo: - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - - - true - - + + - Gleitzeit - - - - - - - Krank - - - - - - - SOLL: + Resturlaub: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - - Urlaub - - - - - - - true - - - - - - - Übertrag: - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - - - - - true - - - - - - - true - - - - - - - Sonderurlaub - - - - - - - Übertrag Sonderurlaub: - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - - - - - true - - - - - - - true - - - + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + true - - - - true - - - - - - - true - - - - - - - HH:mm:ss - - - @@ -356,13 +371,10 @@ - - - - - + + - Training + Krank diff --git a/common.cpp b/common.cpp new file mode 100644 index 0000000..6f7b489 --- /dev/null +++ b/common.cpp @@ -0,0 +1,23 @@ +#ifndef COMMON_H +#define COMMON_H + + +#include "common.h" + +#include + + +QString secs2String(const qint32& secs) +{ + QTime t; + qint32 h = secs/3600; + + if(secs < 0) + t = QTime(0, 0, 0).addSecs(-secs); + else + t = QTime(0, 0, 0).addSecs(secs); + + return(QString::number(h) + t.toString(":mm:ss")); +} + +#endif //COMMON_H diff --git a/common.h b/common.h index c41de68..70293ec 100644 --- a/common.h +++ b/common.h @@ -2,6 +2,7 @@ #define COMMON_H +#include #include @@ -37,4 +38,8 @@ #define COLOR_TRAINING QColor(Qt::red) #define COLOR_WEEKEND QColor(255, 165, 0) + +QString secs2String(const qint32& secs); + + #endif // COMMON_H diff --git a/cvacation.cpp b/cvacation.cpp new file mode 100644 index 0000000..2741e53 --- /dev/null +++ b/cvacation.cpp @@ -0,0 +1,87 @@ +#include "cvacation.h" + +#include +#include +#include + + +cVacation::cVacation(const QDate& date, QObject *parent) : + QObject(parent), + m_date(date), + m_days(0) +{ +} + + +QDate cVacation::date() +{ + return(m_date); +} + +void cVacation::setDays(qint16 days) +{ + m_days = days; +} + +qint16 cVacation::days() +{ + return(m_days); +} + +bool cVacationList::load() +{ + QSqlQuery query; + + query.prepare("SELECT ab, " + " days " + "FROM vacation " + "ORDER BY ab;"); + + if(!query.exec()) + { + qDebug() << "SELECT FROM vacation: " << query.lastError().text(); + return(false); + } + + while(query.next()) + { + cVacation* lpVacation = add(query.value("ab").toDate()); + + if(lpVacation) + { + lpVacation->setDays(static_cast(query.value("days").toInt())); + } + } + + return(true); +} + +cVacation* cVacationList::add(const QDate& date) +{ + if(find(date)) + return(nullptr); + + cVacation* lpVacation = new cVacation(date); + append(lpVacation); + return(lpVacation); +} + +cVacation* cVacationList::find(const QDate& date) +{ + for(cVacationList::iterator i = begin();i != end(); i++) + { + if((*i)->date() == date) + return(*i); + } + return(nullptr); +} + +cVacation* cVacationList::get(const QDate& date) +{ + for(cVacationList::iterator i = begin();i != end(); i++) + { + if((*i)->date() <= date) + return(*i); + } + return(nullptr); +} diff --git a/cvacation.h b/cvacation.h new file mode 100644 index 0000000..607e973 --- /dev/null +++ b/cvacation.h @@ -0,0 +1,42 @@ +#ifndef CVACATION_H +#define CVACATION_H + + +#include +#include +#include +#include + + +class cVacation : public QObject +{ + Q_OBJECT +public: + explicit cVacation(const QDate& date, QObject *parent = nullptr); + + QDate date(); + + void setDays(qint16 days); + qint16 days(); + +private: + QDate m_date; + qint16 m_days; + +signals: + +public slots: +}; + +Q_DECLARE_METATYPE(cVacation*) + +class cVacationList : public QList +{ +public: + bool load(); + cVacation* add(const QDate& date); + cVacation* find(const QDate& date); + cVacation* get(const QDate& date); +}; + +#endif // CVACATION_H diff --git a/workingHours.pro b/workingHours.pro index 93a061c..6daf418 100644 --- a/workingHours.pro +++ b/workingHours.pro @@ -29,7 +29,9 @@ SOURCES += \ cdailyworking.cpp \ cmonthlyitemdelegate.cpp \ cmonthlyview.cpp \ + common.cpp \ cpublicholiday.cpp \ + cvacation.cpp \ main.cpp \ cmainwindow.cpp @@ -40,7 +42,8 @@ HEADERS += \ cmonthlyitemdelegate.h \ cmonthlyview.h \ common.h \ - cpublicholiday.h + cpublicholiday.h \ + cvacation.h FORMS += \ cmainwindow.ui \