You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

559 lines
10 KiB
C++

#include "common.h"
#include "cbooking.h"
#include <QSqlQuery>
#include <QSqlError>
#include <QDebug>
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);
}
qint32 cBooking::pauseSecs()
{
int w = totalWork();
int p = totalPause();
if(w > 21600 && w < 23400 && p < 1800)
{
int p1 = w-21600;
p1 -= p;
if(p1 > 0)
return(p1);
}
if(w <= 21600)
return(0);
if(p < 1800)
return(1800-p);
return(0);
}
QTime cBooking::pause()
{
return(QTime(0, 0, 0).addSecs(pauseSecs()));
}
qint32 cBooking::istSecs()
{
int w = totalWork();
int p = pauseSecs();
// if(w < 21600)
// return(w);
// if(p < 1800)
// return(w - (1800-p));
// return(w);
return(w-p);
}
QTime cBooking::ist()
{
return(QTime(0, 0, 0).addSecs(istSecs()));
}
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() == "K" ||
code() == "U" ||
code() == "SU")
return(QTime(0, 0, 0));
return(m_soll);
}
qint32 cBooking::diff()
{
int i = istSecs();
QTime t = soll();
int s = t.hour()*3600+t.minute()*60+t.second();
int d = i-s;
return(d);
}
QString cBooking::diffString()
{
qint32 d = diff();
return(secs2String(d));
}
void cBooking::setPrevDiff(qint32 diff)
{
m_prevDiff = diff;
}
qint32 cBooking::prevDiff()
{
return(m_prevDiff);
}
QString cBooking::prevDiffString()
{
qint32 d = prevDiff();
return(secs2String(d));
}
qint32 cBooking::currentDiff()
{
return(prevDiff()+diff());
}
QString cBooking::currentDiffString()
{
qint32 d = currentDiff();
return(secs2String(d));
}
qreal cBooking::hoursDecimal()
{
int w = istSecs();
return(static_cast<qreal>(w)/3600);
}
void cBooking::setVacation(qint16 vac)
{
m_vacation = vac;
}
qint16 cBooking::vacation()
{
return(m_vacation);
}
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());
bind(query, ":kommt1", kommt1());
bind(query, ":geht1", geht1());
bind(query, ":kommt2", kommt2());
bind(query, ":geht2", geht2());
bind(query, ":kommt3", kommt3());
bind(query, ":geht3", geht3());
bind(query, ":kommt4", kommt4());
bind(query, ":geht4", geht4());
bind(query, ":kommt5", kommt5());
bind(query, ":geht5", geht5());
query.bindValue(":code", code());
query.bindValue(":information", information());
if(!query.exec())
{
qDebug() << "Save: " << query.lastError().text();
return(false);
}
qDebug() << "saved.";
return(true);
}
void cBooking::bind(QSqlQuery& query, const QString& variable, const QTime& time)
{
if(time == QTime(0, 0, 0))
query.bindValue(variable, QVariant(QVariant::Time));
else
query.bindValue(variable, time);
}
int cBooking::totalWork()
{
return(kommt1().secsTo(geht1()) + kommt2().secsTo(geht2()) + kommt3().secsTo(geht3()) + kommt4().secsTo(geht4()) + kommt5().secsTo(geht5()));
}
int cBooking::totalPause()
{
return(geht1().secsTo(kommt2()) + geht2().secsTo(kommt3()) + geht3().secsTo(kommt4()) + geht4().secsTo(kommt5()));
}
cBookingList::cBookingList(cMonthlyBookingList* lpMonthlyBookingList, cPublicHoliday* lpPublicHoliday, cDailyWorkingList* lpDailyWorkingList, cVacationList* lpVacationList) :
m_lpMonthlyBookingList(lpMonthlyBookingList),
m_lpPublicHoliday(lpPublicHoliday),
m_lpDailyWorkingList(lpDailyWorkingList),
m_lpVacationList(lpVacationList)
{
}
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);
}
qint16 year = 0;
while(query.next())
{
cBooking* lpBooking = add(query.value("datum").toDate());
if(year != lpBooking->date().year())
{
year = static_cast<qint16>(lpBooking->date().year());
m_lpPublicHoliday->setYear(year);
}
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());
if(!m_lpPublicHoliday->isPublicHoliday(lpBooking->date()))
{
cDailyWorking* lpDailyWorking = m_lpDailyWorkingList->get(lpBooking->date());
if(lpDailyWorking)
lpBooking->setSoll(lpDailyWorking->soll(static_cast<qint16>(lpBooking->date().dayOfWeek())));
}
else
lpBooking->setSoll(QTime(0, 0, 0));
}
}
recalculate();
return(true);
}
bool sortAsc(cBooking* &v1, cBooking* &v2)
{
return(v1->date() < v2->date());
}
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);
}
void cBookingList::sort()
{
std::sort(begin(), end(), sortAsc);
}
void cBookingList::recalculate(const QDate& date)
{
sort();
bool bFirst = false;
cBookingList::iterator i = begin();
qint16 oldVacation = 0;
if(!date.isNull() && date.isValid())
{
for(;i != end(); i++)
{
if((*i)->date() >= date)
break;
oldVacation = (*i)->vacation();
}
}
if(i == end())
return;
if(i == begin())
bFirst = true;
qint32 ueberstunden = 0;
qint32 correction = 0;
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;
(*i)->setPrevDiff(0);
}
else
(*i)->setPrevDiff((*(i-1))->currentDiff()-ueberstunden+correction);
cMonthlyBooking* lpMonthlyBooking = m_lpMonthlyBookingList->find((*i)->date());
if(lpMonthlyBooking)
{
correction = lpMonthlyBooking->correction();
ueberstunden = lpMonthlyBooking->ueberstunden();
}
else
{
correction = 0;
ueberstunden = 0;
}
oldVacation = (*i)->vacation();
if((*i)->code() == "U")
oldVacation--;
}
}