195 lines
8.4 KiB
C
195 lines
8.4 KiB
C
#ifndef TARIFF_CARRYOVER_H_INCLUDED
|
|
#define TARIFF_CARRYOVER_H_INCLUDED
|
|
|
|
#include <QTime>
|
|
|
|
#include "time_range.h"
|
|
|
|
enum class ApplyCarryOver {
|
|
NEVER = 0,
|
|
MATCH_PREV_DAY = 1,
|
|
MATCH_NEXT_DAY = 2,
|
|
ALWAYS = 3
|
|
};
|
|
|
|
struct ATBTariffCarryOver {
|
|
int m_id;
|
|
QString m_weekDay;
|
|
TimeRange m_range;
|
|
QDate m_date;
|
|
ApplyCarryOver m_carryOverIf;
|
|
|
|
explicit ATBTariffCarryOver()
|
|
: m_id(-1)
|
|
, m_carryOverIf(ApplyCarryOver::NEVER) {
|
|
}
|
|
|
|
void setCarryOverIf(QString const &coif) {
|
|
if (coif == "never") {
|
|
m_carryOverIf = ApplyCarryOver::NEVER;
|
|
} else
|
|
if (coif == "match_prev_day") {
|
|
m_carryOverIf = ApplyCarryOver::MATCH_PREV_DAY;
|
|
} else
|
|
if (coif == "match_next_day") {
|
|
m_carryOverIf = ApplyCarryOver::MATCH_NEXT_DAY;
|
|
} else
|
|
if (coif == "always") {
|
|
m_carryOverIf = ApplyCarryOver::ALWAYS;
|
|
} else {
|
|
qCritical() << "ERROR unknown carry over application" << coif;
|
|
}
|
|
}
|
|
|
|
ApplyCarryOver carryOverIf() const {
|
|
return m_carryOverIf;
|
|
}
|
|
|
|
QString carryOverIfStr() const {
|
|
if (m_carryOverIf == ApplyCarryOver::NEVER) {
|
|
return "never";
|
|
}
|
|
if (m_carryOverIf == ApplyCarryOver::ALWAYS) {
|
|
return "always";
|
|
}
|
|
if (m_carryOverIf == ApplyCarryOver::MATCH_PREV_DAY) {
|
|
return "match prev day";
|
|
}
|
|
if (m_carryOverIf == ApplyCarryOver::MATCH_NEXT_DAY) {
|
|
return "match next day";
|
|
}
|
|
return QString("ERROR unknown carry over application: %1").arg(static_cast<int>(m_carryOverIf));
|
|
}
|
|
|
|
int computeMinutesUntilCarryOverEnd(QDateTime const &dt) {
|
|
int minutes = 0;
|
|
QString end = m_range.m_end.toString(Qt::ISODate);
|
|
if (end == "24:00:00") {
|
|
// note: this did not work
|
|
// QDateTime t(dt.addDays(1));
|
|
// t.setTime(QTime(0,0,0));
|
|
// dt: 2024-10-27T00:00:00 EEST, but t: 2024-10-28T00:00:00 EET (!)
|
|
// so the difference is 1500 instead of 1440
|
|
// reason: change from summer to winter time
|
|
|
|
// compute minutes directly
|
|
if (dt.time().isValid()) {
|
|
minutes = 1440 - (dt.time().hour() * 60 + dt.time().minute());
|
|
}
|
|
} else {
|
|
QTime t(QTime::fromString(end, Qt::ISODate));
|
|
if (t.isValid() && dt.time().isValid()) {
|
|
minutes = (t.hour() * 60 + t.minute()) - (dt.time().hour() * 60 + dt.time().minute());
|
|
}
|
|
}
|
|
|
|
if (minutes < 0 || minutes > m_range.m_duration) {
|
|
minutes = 0;
|
|
}
|
|
|
|
// qCritical() << __func__ << ":" << __LINE__ << "minutes" << minutes;
|
|
|
|
return minutes;
|
|
}
|
|
|
|
friend QDebug operator<<(QDebug debug, ATBTariffCarryOver const &co) {
|
|
QDebugStateSaver saver(debug);
|
|
|
|
debug.nospace()
|
|
<< "\nTariffCarryOver:\n"
|
|
<< " week day: " << co.m_weekDay << "\n"
|
|
<< " date: " << co.m_date.toString(Qt::ISODate) << "\n"
|
|
<< " id: " << co.m_id << "\n"
|
|
<< " start: " << co.m_range.m_start << "\n"
|
|
<< " end: " << co.m_range.m_end << "\n"
|
|
<< " duration: " << co.m_range.m_duration << "\n"
|
|
<< " carry over if: " << co.carryOverIfStr() << endl;
|
|
return debug;
|
|
}
|
|
};
|
|
|
|
struct ATBCarryOver {
|
|
struct week {
|
|
int day;
|
|
bool seemless;
|
|
bool never;
|
|
QTime static_start;
|
|
QTime static_end;
|
|
int duration;
|
|
} carryover[8];
|
|
|
|
int id;
|
|
|
|
explicit ATBCarryOver()
|
|
: id(-1) {
|
|
|
|
for (int i = 0 ; i < 8; ++i) {
|
|
carryover[i].day = -1;
|
|
carryover[i].seemless = false;
|
|
carryover[i].never = false;
|
|
carryover[i].static_start = QTime(23, 59, 59);
|
|
carryover[i].static_end = QTime(0, 0, 0);
|
|
carryover[i].duration = -1;
|
|
}
|
|
}
|
|
|
|
friend QDebug operator<<(QDebug debug, ATBCarryOver const &co) {
|
|
QDebugStateSaver saver(debug);
|
|
|
|
debug.nospace()
|
|
<< " id:" << co.id << "\n"
|
|
<< " **** Monday **** \n"
|
|
<< " day: " << co.carryover[(int)Qt::Monday].day << "\n"
|
|
<< " static_start: " << co.carryover[(int)Qt::Monday].static_start.toString(Qt::ISODate) << "\n"
|
|
<< " static_end: " << co.carryover[(int)Qt::Monday].static_end.toString(Qt::ISODate) << "\n"
|
|
<< " duration: " << co.carryover[(int)Qt::Monday].duration << "\n"
|
|
<< " anytime: " << co.carryover[(int)Qt::Monday].seemless << "\n"
|
|
<< " never: " << co.carryover[(int)Qt::Monday].never << "\n"
|
|
<< " **** Tuesday **** \n"
|
|
<< " day: " << co.carryover[(int)Qt::Tuesday].day << "\n"
|
|
<< " static_start: " << co.carryover[(int)Qt::Tuesday].static_start.toString(Qt::ISODate) << "\n"
|
|
<< " static_end: " << co.carryover[(int)Qt::Tuesday].static_end.toString(Qt::ISODate) << "\n"
|
|
<< " duration: " << co.carryover[(int)Qt::Tuesday].duration << "\n"
|
|
<< " anytime: " << co.carryover[(int)Qt::Tuesday].seemless << "\n"
|
|
<< " never: " << co.carryover[(int)Qt::Tuesday].never << "\n"
|
|
<< " **** Wednesday **** \n"
|
|
<< " day: " << co.carryover[(int)Qt::Wednesday].day << "\n"
|
|
<< " static_start: " << co.carryover[(int)Qt::Wednesday].static_start.toString(Qt::ISODate) << "\n"
|
|
<< " static_end: " << co.carryover[(int)Qt::Wednesday].static_end.toString(Qt::ISODate) << "\n"
|
|
<< " duration: " << co.carryover[(int)Qt::Wednesday].duration << "\n"
|
|
<< " anytime: " << co.carryover[(int)Qt::Wednesday].seemless << "\n"
|
|
<< " never: " << co.carryover[(int)Qt::Wednesday].never << "\n"
|
|
<< " **** Thursday **** \n"
|
|
<< " day: " << co.carryover[(int)Qt::Thursday].day << "\n"
|
|
<< " static_start: " << co.carryover[(int)Qt::Thursday].static_start.toString(Qt::ISODate) << "\n"
|
|
<< " static_end: " << co.carryover[(int)Qt::Thursday].static_end.toString(Qt::ISODate) << "\n"
|
|
<< " duration: " << co.carryover[(int)Qt::Thursday].duration << "\n"
|
|
<< " anytime: " << co.carryover[(int)Qt::Thursday].seemless << "\n"
|
|
<< " never: " << co.carryover[(int)Qt::Thursday].never << "\n"
|
|
<< " **** Friday **** \n"
|
|
<< " day: " << co.carryover[(int)Qt::Friday].day << "\n"
|
|
<< " static_start: " << co.carryover[(int)Qt::Friday].static_start.toString(Qt::ISODate) << "\n"
|
|
<< " static_end: " << co.carryover[(int)Qt::Friday].static_end.toString(Qt::ISODate) << "\n"
|
|
<< " anytime: " << co.carryover[(int)Qt::Friday].seemless << "\n"
|
|
<< " never: " << co.carryover[(int)Qt::Friday].never << "\n"
|
|
<< " **** Saturday **** \n"
|
|
<< " day: " << co.carryover[(int)Qt::Saturday].day << "\n"
|
|
<< " static_start: " << co.carryover[(int)Qt::Saturday].static_start.toString(Qt::ISODate) << "\n"
|
|
<< " static_end: " << co.carryover[(int)Qt::Saturday].static_end.toString(Qt::ISODate) << "\n"
|
|
<< " duration: " << co.carryover[(int)Qt::Saturday].duration << "\n"
|
|
<< " anytime: " << co.carryover[(int)Qt::Saturday].seemless << "\n"
|
|
<< " never: " << co.carryover[(int)Qt::Saturday].never << "\n"
|
|
<< " **** Sunday **** \n"
|
|
<< " day: " << co.carryover[(int)Qt::Sunday].day << "\n"
|
|
<< " static_start: " << co.carryover[(int)Qt::Sunday].static_start.toString(Qt::ISODate) << "\n"
|
|
<< " static_end: " << co.carryover[(int)Qt::Sunday].static_end.toString(Qt::ISODate) << "\n"
|
|
<< " duration: " << co.carryover[(int)Qt::Sunday].duration << "\n"
|
|
<< " anytime: " << co.carryover[(int)Qt::Sunday].seemless << "\n"
|
|
<< " never: " << co.carryover[(int)Qt::Sunday].never << "\n";
|
|
|
|
return debug;
|
|
}
|
|
};
|
|
|
|
#endif // TARIFF_CARRYOVER_H_INCLUDED
|