Compare commits

..

No commits in common. "275c3ec869650a89102934af29631bf6ee7e41df" and "f47695de8b953f2a8bbe9589043a7712c418e3b3" have entirely different histories.

3 changed files with 110 additions and 131 deletions

View File

@ -10,9 +10,7 @@ struct ATBTariffCarryOverSettings {
// parking time limit not violated: return false, otherwise: return true. // parking time limit not violated: return false, otherwise: return true.
using ParkingTimeLimitChecker = std::function<bool(ATBTariffCarryOverSettings const&, using ParkingTimeLimitChecker = std::function<bool(ATBTariffCarryOverSettings const&,
QDateTime const &startTime, QDateTime const &endTime, int paymentOptionIndex)>;
QDateTime const &endTime,
int paymentOptionIndex)>;
int m_duration; int m_duration;
QTime m_start; QTime m_start;
@ -26,8 +24,7 @@ struct ATBTariffCarryOverSettings {
: m_duration(0) : m_duration(0)
, m_start(QTime()) , m_start(QTime())
, m_end(QTime()) , m_end(QTime())
, m_parkingTimeLimitChecker([](ATBTariffCarryOverSettings const&, , m_parkingTimeLimitChecker([](ATBTariffCarryOverSettings const&, QDateTime const &, int) { return false; })
QDateTime const&, QDateTime const&, int) { return false; })
, m_parking_time_limit(QTime()) , m_parking_time_limit(QTime())
, m_about_to_exceed_parking_time_limit(QTime()) {} , m_about_to_exceed_parking_time_limit(QTime()) {}
@ -44,10 +41,8 @@ struct ATBTariffCarryOverSettings {
, m_about_to_exceed_parking_time_limit(about_to_exceed_parking_time_limit) { , m_about_to_exceed_parking_time_limit(about_to_exceed_parking_time_limit) {
} }
bool parkingTimeLimitExceeded(QDateTime const &startTime, bool parkingTimeLimitExceeded(QDateTime const &endTime, int paymentOptionIndex) const {
QDateTime const &endTime, return m_parkingTimeLimitChecker(*this, endTime, paymentOptionIndex);
int paymentOptionIndex) const {
return m_parkingTimeLimitChecker(*this, startTime, endTime, paymentOptionIndex);
} }
friend QDebug operator<<(QDebug debug, ATBTariffCarryOverSettings const &co) { friend QDebug operator<<(QDebug debug, ATBTariffCarryOverSettings const &co) {

View File

@ -852,9 +852,7 @@ CalcState CALCULATE_LIBRARY_API compute_price_for_parking_ticket(
for (auto[itr, rangeEnd] = tariff->WeekDays.equal_range((Qt::DayOfWeek)weekDay); itr != rangeEnd; ++itr) { for (auto[itr, rangeEnd] = tariff->WeekDays.equal_range((Qt::DayOfWeek)weekDay); itr != rangeEnd; ++itr) {
ATBWeekDay const &wd = itr->second; ATBWeekDay const &wd = itr->second;
bool const parkTimeLimitViolated = wd.getTariffCarryOverSettings().parkingTimeLimitExceeded(effectiveStartTime, bool const parkTimeLimitViolated = wd.getTariffCarryOverSettings().parkingTimeLimitExceeded(end_parking_time, paymentOptionIndex);
end_parking_time,
paymentOptionIndex);
if (parkTimeLimitViolated) { if (parkTimeLimitViolated) {
calcState.setDesc(QString("line=%1 endTime=%2: park-time-limit violated").arg(__LINE__) calcState.setDesc(QString("line=%1 endTime=%2: park-time-limit violated").arg(__LINE__)
.arg(end_parking_time.time().toString(Qt::ISODate))); .arg(end_parking_time.time().toString(Qt::ISODate)));
@ -1140,9 +1138,7 @@ CalcState CALCULATE_LIBRARY_API compute_duration_for_parking_ticket(
itr != rangeEnd; itr != rangeEnd;
++itr) { ++itr) {
ATBWeekDay const &wd = itr->second; ATBWeekDay const &wd = itr->second;
bool const parkTimeLimitViolated = wd.getTariffCarryOverSettings().parkingTimeLimitExceeded(start_parking_time, bool const parkTimeLimitViolated = wd.getTariffCarryOverSettings().parkingTimeLimitExceeded(ticketEndTime, paymentOptionIndex);
ticketEndTime,
paymentOptionIndex);
if (parkTimeLimitViolated) { if (parkTimeLimitViolated) {
calcState.setDesc(QString("line=%1 endTime=%2: park-time-limit violated").arg(__LINE__) calcState.setDesc(QString("line=%1 endTime=%2: park-time-limit violated").arg(__LINE__)
.arg(ticketEndTime.time().toString(Qt::ISODate))); .arg(ticketEndTime.time().toString(Qt::ISODate)));

View File

@ -112,7 +112,7 @@ ATBWeekDay parseWeekDay(Configuration &cfg,
for (auto l = o.MemberBegin(); l != o.MemberEnd(); ++l) { for (auto l = o.MemberBegin(); l != o.MemberEnd(); ++l) {
if (l->name.IsString()) { if (l->name.IsString()) {
QString const &member = QString::fromStdString(l->name.GetString()); QString const &member = QString::fromStdString(l->name.GetString());
if (member == "prev_day_sunday?") { if (member == "default") {
if (l->value.IsArray()) { if (l->value.IsArray()) {
auto limits = l->value.GetArray(); auto limits = l->value.GetArray();
if (limits.Size() >= 2) { if (limits.Size() >= 2) {
@ -120,26 +120,23 @@ ATBWeekDay parseWeekDay(Configuration &cfg,
parking_time_limit = QTime::fromString(QString::fromStdString(limits[1].GetString()), Qt::ISODate); parking_time_limit = QTime::fromString(QString::fromStdString(limits[1].GetString()), Qt::ISODate);
} }
parkTimeLimitChecker = [&cfg, weekDay, weekDayName](ATBTariffCarryOverSettings const& cs, parkTimeLimitChecker = [&cfg, weekDay, weekDayName](ATBTariffCarryOverSettings const& cs,
QDateTime const &startTime, QDateTime const &endTime,
QDateTime const &endTime, int paymentOptionIndex) {
int paymentOptionIndex) { if (endTime.date().dayOfWeek() == (int)weekDay) {
if (startTime.date() < endTime.date()) { // start end end on different days if (endTime.time() > cs.m_parking_time_limit) {
if (endTime.date().dayOfWeek() == (int)weekDay) { qCritical() << __func__ << ":" << __LINE__
if (endTime.time() > cs.m_parking_time_limit) { << QString("ERROR time limit for end-time violated: [%1, %2 end-time=%3], but time-limit=%4")
qCritical() << __func__ << ":" << __LINE__ .arg(weekDayName)
<< QString("ERROR time limit for end-time violated: [%1, %2 end-time=%3], but time-limit=%4") .arg(endTime.date().toString(Qt::ISODate))
.arg(weekDayName) .arg(endTime.time().toString(Qt::ISODate))
.arg(endTime.date().toString(Qt::ISODate)) .arg(cs.m_parking_time_limit.toString(Qt::ISODate));
.arg(endTime.time().toString(Qt::ISODate)) return true;
.arg(cs.m_parking_time_limit.toString(Qt::ISODate)); }
return true; if (endTime.time() >= cs.m_about_to_exceed_parking_time_limit) {
} cfg.getPaymentOptions(paymentOptionIndex).pop_plus_steps = 1;
if (endTime.time() >= cs.m_about_to_exceed_parking_time_limit) { } else {
cfg.getPaymentOptions(paymentOptionIndex).pop_plus_steps = 1; cfg.getPaymentOptions(paymentOptionIndex).pop_plus_steps =
} else { cfg.getPaymentOptions(paymentOptionIndex).pop_plus_steps_saved;
cfg.getPaymentOptions(paymentOptionIndex).pop_plus_steps =
cfg.getPaymentOptions(paymentOptionIndex).pop_plus_steps_saved;
}
} }
} }
return false; return false;
@ -154,26 +151,23 @@ ATBWeekDay parseWeekDay(Configuration &cfg,
parking_time_limit = QTime::fromString(QString::fromStdString(limits[1].GetString()), Qt::ISODate); parking_time_limit = QTime::fromString(QString::fromStdString(limits[1].GetString()), Qt::ISODate);
} }
parkTimeLimitChecker = [&cfg, weekDayName](ATBTariffCarryOverSettings const& cs, parkTimeLimitChecker = [&cfg, weekDayName](ATBTariffCarryOverSettings const& cs,
QDateTime const &startTime, QDateTime const &endTime,
QDateTime const &endTime, int paymentOptionIndex) {
int paymentOptionIndex) { if (previousDayHoliday(cfg, endTime)) {
if (startTime.date() < endTime.date()) { // start end end on different days if (endTime.time() > cs.m_parking_time_limit) {
if (previousDayHoliday(cfg, endTime)) { qCritical() << __func__ << ":" << __LINE__
if (endTime.time() > cs.m_parking_time_limit) { << QString("ERROR time limit for end-time violated: [%1, %2, end-time=%3], but time-limit=%4")
qCritical() << __func__ << ":" << __LINE__ .arg(weekDayName)
<< QString("ERROR time limit for end-time violated: [%1, %2, end-time=%3], but time-limit=%4") .arg(endTime.date().toString(Qt::ISODate))
.arg(weekDayName) .arg(endTime.time().toString(Qt::ISODate))
.arg(endTime.date().toString(Qt::ISODate)) .arg(cs.m_parking_time_limit.toString(Qt::ISODate));
.arg(endTime.time().toString(Qt::ISODate)) return true;
.arg(cs.m_parking_time_limit.toString(Qt::ISODate)); }
return true; if (endTime.time() >= cs.m_about_to_exceed_parking_time_limit) {
} cfg.getPaymentOptions(paymentOptionIndex).pop_plus_steps = 1;
if (endTime.time() >= cs.m_about_to_exceed_parking_time_limit) { } else {
cfg.getPaymentOptions(paymentOptionIndex).pop_plus_steps = 1; cfg.getPaymentOptions(paymentOptionIndex).pop_plus_steps =
} else { cfg.getPaymentOptions(paymentOptionIndex).pop_plus_steps_saved;
cfg.getPaymentOptions(paymentOptionIndex).pop_plus_steps =
cfg.getPaymentOptions(paymentOptionIndex).pop_plus_steps_saved;
}
} }
} }
return false; return false;
@ -257,24 +251,21 @@ ATBWeekDay parseWeekDay(Configuration &cfg,
} }
parkTimeLimitChecker = [&cfg, weekDay](ATBTariffCarryOverSettings const& cs, parkTimeLimitChecker = [&cfg, weekDay](ATBTariffCarryOverSettings const& cs,
QDateTime const &startTime, QDateTime const &endTime,
QDateTime const &endTime, int paymentOptionIndex) {
int paymentOptionIndex) { if (endTime.date().dayOfWeek() == (int)weekDay) {
if (startTime.date() < endTime.date()) { // start end end on different days if (endTime.time() > cs.m_parking_time_limit) {
if (endTime.date().dayOfWeek() == (int)weekDay) { qCritical() << __func__ << ":" << __LINE__
if (endTime.time() > cs.m_parking_time_limit) { << QString("ERROR time limit for end-time violated: end-time=%1, but time-limit=%2")
qCritical() << __func__ << ":" << __LINE__ .arg(endTime.time().toString(Qt::ISODate))
<< QString("ERROR time limit for end-time violated: end-time=%1, but time-limit=%2") .arg(cs.m_parking_time_limit.toString(Qt::ISODate));
.arg(endTime.time().toString(Qt::ISODate)) return true;
.arg(cs.m_parking_time_limit.toString(Qt::ISODate)); }
return true; if (endTime.time() >= cs.m_about_to_exceed_parking_time_limit) {
} cfg.getPaymentOptions(paymentOptionIndex).pop_plus_steps = 1;
if (endTime.time() >= cs.m_about_to_exceed_parking_time_limit) { } else {
cfg.getPaymentOptions(paymentOptionIndex).pop_plus_steps = 1; cfg.getPaymentOptions(paymentOptionIndex).pop_plus_steps =
} else { cfg.getPaymentOptions(paymentOptionIndex).pop_plus_steps_saved;
cfg.getPaymentOptions(paymentOptionIndex).pop_plus_steps =
cfg.getPaymentOptions(paymentOptionIndex).pop_plus_steps_saved;
}
} }
} }
return false; return false;
@ -289,24 +280,21 @@ ATBWeekDay parseWeekDay(Configuration &cfg,
} }
} }
parkTimeLimitChecker = [&cfg](ATBTariffCarryOverSettings const& cs, parkTimeLimitChecker = [&cfg](ATBTariffCarryOverSettings const& cs,
QDateTime const &startTime, QDateTime const &endTime,
QDateTime const &endTime, int paymentOptionIndex) {
int paymentOptionIndex) { if (previousDayHoliday(cfg, endTime)) {
if (startTime.date() < endTime.date()) { // start end end on different days if (endTime.time() > cs.m_parking_time_limit) {
if (previousDayHoliday(cfg, endTime)) { qCritical() << __func__ << ":" << __LINE__
if (endTime.time() > cs.m_parking_time_limit) { << QString("ERROR time limit for end-time violated: end-time=%1, but time-limit=%2")
qCritical() << __func__ << ":" << __LINE__ .arg(endTime.time().toString(Qt::ISODate))
<< QString("ERROR time limit for end-time violated: end-time=%1, but time-limit=%2") .arg(cs.m_parking_time_limit.toString(Qt::ISODate));
.arg(endTime.time().toString(Qt::ISODate)) return true;
.arg(cs.m_parking_time_limit.toString(Qt::ISODate)); }
return true; if (endTime.time() >= cs.m_about_to_exceed_parking_time_limit) {
} cfg.getPaymentOptions(paymentOptionIndex).pop_plus_steps = 1;
if (endTime.time() >= cs.m_about_to_exceed_parking_time_limit) { } else {
cfg.getPaymentOptions(paymentOptionIndex).pop_plus_steps = 1; cfg.getPaymentOptions(paymentOptionIndex).pop_plus_steps =
} else { cfg.getPaymentOptions(paymentOptionIndex).pop_plus_steps_saved;
cfg.getPaymentOptions(paymentOptionIndex).pop_plus_steps =
cfg.getPaymentOptions(paymentOptionIndex).pop_plus_steps_saved;
}
} }
} }
return false; return false;
@ -1535,6 +1523,7 @@ int Configuration::getPaymentOptionIndex(PERMIT_TYPE permitType) const {
int getPaymentOptionIndex(Configuration const &cfg) { int getPaymentOptionIndex(Configuration const &cfg) {
int const numOptions = cfg.getAllPaymentOptions().size(); int const numOptions = cfg.getAllPaymentOptions().size();
for (int opt=0; opt < numOptions; ++opt) { for (int opt=0; opt < numOptions; ++opt) {
@ -1547,48 +1536,48 @@ int getPaymentOptionIndex(Configuration const &cfg) {
QDateTime const dt = QDateTime::currentDateTime(); QDateTime const dt = QDateTime::currentDateTime();
int const dayOfWeek = dt.date().dayOfWeek(); int const dayOfWeek = dt.date().dayOfWeek();
switch (dayOfWeek) {
case (int)Qt::Monday: {
if (pop_business_hours & BusinessHours::MON) {
return opt;
}
} break;
case (int)Qt::Tuesday: {
if (pop_business_hours & BusinessHours::TUE) {
return opt;
}
} break;
case (int)Qt::Wednesday: {
if (pop_business_hours & BusinessHours::WED) {
return opt;
}
} break;
case (int)Qt::Thursday: {
if (pop_business_hours & BusinessHours::THU) {
return opt;
}
} break;
case (int)Qt::Friday: {
if (pop_business_hours & BusinessHours::FRI) {
return opt;
}
} break;
case (int)Qt::Saturday: {
if (pop_business_hours & BusinessHours::SAT) {
return opt;
}
} break;
case (int)Qt::Sunday: {
if (pop_business_hours & BusinessHours::SUN) {
return opt;
}
} break;
}
if (isHoliday(cfg, dt)) { if (isHoliday(cfg, dt)) {
if (pop_business_hours & BusinessHours::OFFICIAL_HOLIDAY) { if (pop_business_hours & BusinessHours::OFFICIAL_HOLIDAY) {
return opt; return opt;
} }
} else {
switch (dayOfWeek) {
case (int)Qt::Monday: {
if (pop_business_hours & BusinessHours::MON) {
return opt;
}
} break;
case (int)Qt::Tuesday: {
if (pop_business_hours & BusinessHours::TUE) {
return opt;
}
} break;
case (int)Qt::Wednesday: {
if (pop_business_hours & BusinessHours::WED) {
return opt;
}
} break;
case (int)Qt::Thursday: {
if (pop_business_hours & BusinessHours::THU) {
return opt;
}
} break;
case (int)Qt::Friday: {
if (pop_business_hours & BusinessHours::FRI) {
return opt;
}
} break;
case (int)Qt::Saturday: {
if (pop_business_hours & BusinessHours::SAT) {
return opt;
}
} break;
case (int)Qt::Sunday: {
if (pop_business_hours & BusinessHours::SUN) {
return opt;
}
} break;
}
} }
} }
@ -1852,7 +1841,6 @@ Configuration::getWeekDayWorkTime(QTime const &time, Qt::DayOfWeek dayOfWeek) {
bool isHoliday(Configuration const &cfg, QDateTime const &t) { bool isHoliday(Configuration const &cfg, QDateTime const &t) {
int const weekDay = t.date().dayOfWeek(); int const weekDay = t.date().dayOfWeek();
for (auto[iter, rEnd] = cfg.WeekDays.equal_range(static_cast<Qt::DayOfWeek>(weekDay)); for (auto[iter, rEnd] = cfg.WeekDays.equal_range(static_cast<Qt::DayOfWeek>(weekDay));
iter != rEnd; iter != rEnd;
++iter) { ++iter) {