From 8cdeef26fc75f84a91673758ac800700cacedad6 Mon Sep 17 00:00:00 2001 From: Gerhard Hoffmann Date: Mon, 2 Sep 2024 17:11:48 +0200 Subject: [PATCH] Check if computed ticket-end-time violates a carry-over-limit defined in tariff-file. --- library/src/calculate_price.cpp | 54 +++++++++++++++++++++++++++------ 1 file changed, 45 insertions(+), 9 deletions(-) diff --git a/library/src/calculate_price.cpp b/library/src/calculate_price.cpp index f86d641..81f6514 100644 --- a/library/src/calculate_price.cpp +++ b/library/src/calculate_price.cpp @@ -554,7 +554,7 @@ int CALCULATE_LIBRARY_API compute_next_timestep(parking_tariff_t *tariff, int cu } } // max. tolerance set to 3 minutes - unsigned const tolerance = std::min(minimalDistance, (unsigned)(3)); + // unsigned const tolerance = std::min(minimalDistance, (unsigned)(3)); if (j != -1) { stepList[j] = currentTimeMinutes; } @@ -842,6 +842,24 @@ CalcState CALCULATE_LIBRARY_API compute_price_for_parking_ticket( end_parking_time = effectiveStartTime.addSecs(netto_parking_time*60); } + + end_parking_time.setTime(QTime(end_parking_time.time().hour(), + end_parking_time.time().minute(), 0)); + + qCritical() << __func__ << ":" << __LINE__ << "end-parking-time:" << end_parking_time.toString(Qt::ISODate); + + weekDay = end_parking_time.date().dayOfWeek(); + + for (auto[itr, rangeEnd] = tariff->WeekDays.equal_range((Qt::DayOfWeek)weekDay); itr != rangeEnd; ++itr) { + ATBWeekDay const &wd = itr->second; + bool const parkTimeLimitViolated = wd.getTariffCarryOverSettings().parkingTimeLimitExceeded(end_parking_time, paymentOptionIndex); + if (parkTimeLimitViolated) { + calcState.setDesc(QString("line=%1 endTime=%2: park-time-limit violated").arg(__LINE__) + .arg(end_parking_time.time().toString(Qt::ISODate))); + return calcState.set(CalcState::State::ABOVE_MAX_PARKING_TIME); + } + } + } else { cost = Calculator::GetInstance().GetCostFromDuration( tariff, @@ -1085,25 +1103,43 @@ CalcState CALCULATE_LIBRARY_API compute_duration_for_parking_ticket( } if (carryOverStart.isValid() && carryOverEnd.isValid()) { - qCritical() << __func__ << __LINE__ << "carryOverStart" << carryOverStart.toString(Qt::ISODate); - qCritical() << __func__ << __LINE__ << "carryOverEnd" << carryOverEnd.toString(Qt::ISODate); - qCritical() << __func__ << __LINE__ << "carryOverDuration" << carryOverDuration; + qCritical() << __func__ << ":" << __LINE__ << "carryOverStart" << carryOverStart.toString(Qt::ISODate); + qCritical() << __func__ << ":" << __LINE__ << "carryOverEnd" << carryOverEnd.toString(Qt::ISODate); + qCritical() << __func__ << ":" << __LINE__ << "carryOverDuration" << carryOverDuration; } if (carryOverStart.isValid() && carryOverEnd.isValid() && carryOverDuration != -1) { - qCritical() << __func__ << __LINE__ << "ticketEndTime.time():" << ticketEndTime.time().toString(Qt::ISODate); + // qCritical() << __func__ << __LINE__ << "ticketEndTime.time():" << ticketEndTime.time().toString(Qt::ISODate); if (ticketEndTime.time() > carryOverStart) { - qCritical() << __func__ << __LINE__ << "ticketEndTime.time():" << ticketEndTime.time().toString(Qt::ISODate); + // qCritical() << __func__ << __LINE__ << "ticketEndTime.time():" << ticketEndTime.time().toString(Qt::ISODate); ticketEndTime = ticketEndTime.addSecs(carryOverDuration * 60); } else { - qCritical() << __func__ << __LINE__ << "ticketEndTime.time():" << ticketEndTime.time().toString(Qt::ISODate); + // qCritical() << __func__ << __LINE__ << "ticketEndTime.time():" << ticketEndTime.time().toString(Qt::ISODate); if (ticketEndTime.time() < carryOverEnd) { - qCritical() << __func__ << __LINE__ << "ticketEndTime.time():" << ticketEndTime.time().toString(Qt::ISODate); + // qCritical() << __func__ << __LINE__ << "ticketEndTime.time():" << ticketEndTime.time().toString(Qt::ISODate); ticketEndTime = ticketEndTime.addSecs(carryOverDuration * 60); } } } else { - qCritical() << __func__ << __LINE__ << "WARNING: wrong carry-over-settings"; + qCritical() << __func__ << ":" << __LINE__ << "WARNING: wrong carry-over-settings"; + } + } + + + ticketEndTime.setTime(QTime(ticketEndTime.time().hour(), + ticketEndTime.time().minute(), 0)); + + qCritical() << __func__ << ":" << __LINE__ << "ticketEndTime:" << ticketEndTime.toString(Qt::ISODate); + + for (auto[itr, rangeEnd] = tariff->WeekDays.equal_range((Qt::DayOfWeek)(ticketEndTime.date().dayOfWeek())); + itr != rangeEnd; + ++itr) { + ATBWeekDay const &wd = itr->second; + bool const parkTimeLimitViolated = wd.getTariffCarryOverSettings().parkingTimeLimitExceeded(ticketEndTime, paymentOptionIndex); + if (parkTimeLimitViolated) { + calcState.setDesc(QString("line=%1 endTime=%2: park-time-limit violated").arg(__LINE__) + .arg(ticketEndTime.time().toString(Qt::ISODate))); + return calcState.set(CalcState::State::ABOVE_MAX_PARKING_TIME); } }