#ifndef TARIFF_CARRYOVER_H_INCLUDED #define TARIFF_CARRYOVER_H_INCLUDED #include #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(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