From 4271c0fb318de9e3cc057429096582fc53efa0a8 Mon Sep 17 00:00:00 2001 From: Gerhard Hoffmann Date: Fri, 2 Aug 2024 10:50:25 +0200 Subject: [PATCH 1/7] Fixed compute_next_timestep() for degressive tariff: compute_next_timestep() was actually never called for such a tariff. --- library/src/calculate_price.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/library/src/calculate_price.cpp b/library/src/calculate_price.cpp index 6aca26e..2165055 100644 --- a/library/src/calculate_price.cpp +++ b/library/src/calculate_price.cpp @@ -508,10 +508,12 @@ int CALCULATE_LIBRARY_API compute_next_timestep(parking_tariff_t *tariff, int cu // without given YearPeriod, SpecialDays and SpecialDaysWorktime if ((paymentMethodId == PaymentMethod::Steps) || // progressive tariff: e.g. Neuhauser, Kirchdorf (743) - (paymentMethodId == PaymentMethod::Progressive)) - // (paymentMethodId == PaymentMethod::Degressive)) degressive tariff: e.g. Fuchs Technik (500) + (paymentMethodId == PaymentMethod::Progressive) || + // degressive tariff: e.g. Fuchs Technik (500) + (paymentMethodId == PaymentMethod::Degressive)) { QList &stepList = Calculator::GetInstance().GetTimeSteps(tariff, paymentOptionIndex); + int const size = stepList.size(); if (size == 0) { qCritical() << "compute_next_timestep() *ERROR empty step-list*"; From 1152c3824e09d3ae45224f7aa9bdff24e756743b Mon Sep 17 00:00:00 2001 From: Gerhard Hoffmann Date: Fri, 2 Aug 2024 11:08:32 +0200 Subject: [PATCH 2/7] Minor: add some debug output. --- library/src/calculate_price.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/library/src/calculate_price.cpp b/library/src/calculate_price.cpp index 2165055..1ded7ed 100644 --- a/library/src/calculate_price.cpp +++ b/library/src/calculate_price.cpp @@ -771,17 +771,19 @@ CalcState CALCULATE_LIBRARY_API compute_price_for_parking_ticket( QList tlist = Calculator::GetInstance().GetTimeSteps(tariff); Q_UNUSED(tlist); + // compute cost (price) cost = Calculator::GetInstance().GetCostFromDuration(tariff, start_parking_time, netto_parking_time, paymentOptionIndex); int weekDay = start_parking_time.date().dayOfWeek(); int pop_carry_over_option_id = tariff->getPaymentOptions(paymentOptionIndex).pop_carry_over_option_id; + qCritical() << __func__ << __LINE__ << "configured carry-over-id" << pop_carry_over_option_id; std::optional yperiod = Utilities::GetYearPeriodActive(tariff, start_parking_time); if (yperiod.has_value()) { ATBPeriodYear const &period = yperiod.value(); pop_carry_over_option_id = period.pye_id; + qCritical() << __func__ << __LINE__ << "re-computed carry-over-id" << pop_carry_over_option_id; } - qCritical() << __func__ << __LINE__ << "carryOver-id" << pop_carry_over_option_id; QTime const carryOverStart = tariff->TariffCarryOverOptions.find(pop_carry_over_option_id)->second.carryover[weekDay].static_start; int const carryOverDuration = tariff->TariffCarryOverOptions.find(pop_carry_over_option_id)->second.carryover[weekDay].duration; From 3dda2d8355f117e9724a084266f83efc9ff3e5e5 Mon Sep 17 00:00:00 2001 From: Gerhard Hoffmann Date: Fri, 2 Aug 2024 11:08:52 +0200 Subject: [PATCH 3/7] Check if prepaid-option is set. --- library/src/calculate_price.cpp | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/library/src/calculate_price.cpp b/library/src/calculate_price.cpp index 1ded7ed..d85043a 100644 --- a/library/src/calculate_price.cpp +++ b/library/src/calculate_price.cpp @@ -797,11 +797,15 @@ CalcState CALCULATE_LIBRARY_API compute_price_for_parking_ticket( std::optional prepaidOption = tariff->getPrepaidType(prepaid_option_id); if (prepaidOption.has_value()) { ATBPrepaid const &p = prepaidOption.value(); - if (start_parking_time.time() < p.static_end) { // static_end: e.g. 08:00:00 - effectiveStartTime.setTime(p.static_end); - } else - if (start_parking_time.time() > p.static_start) { // static_start: e.g. 22:00:00 - effectiveStartTime.setTime(p.static_start); + if (p.never) { + qCritical() << __func__ << __LINE__ << "prepaid: no"; + } else { + if (start_parking_time.time() < p.static_end) { // static_end: e.g. 08:00:00 + effectiveStartTime.setTime(p.static_end); + } else + if (start_parking_time.time() > p.static_start) { // static_start: e.g. 22:00:00 + effectiveStartTime.setTime(p.static_start); + } } } From b394ed46ccf39149fbde302e83cc4b7f5df530af Mon Sep 17 00:00:00 2001 From: Gerhard Hoffmann Date: Fri, 2 Aug 2024 11:09:20 +0200 Subject: [PATCH 4/7] In case end-parking-time ends with 00:00, set it to 23:59. --- library/src/calculate_price.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/library/src/calculate_price.cpp b/library/src/calculate_price.cpp index d85043a..d14eea7 100644 --- a/library/src/calculate_price.cpp +++ b/library/src/calculate_price.cpp @@ -849,6 +849,12 @@ CalcState CALCULATE_LIBRARY_API compute_price_for_parking_ticket( return calcState.set(CalcState::State::INVALID_START_DATE); } + if (end_parking_time.time().hour() == 0 && end_parking_time.time().minute() == 0) { + end_parking_time = end_parking_time.addDays(-1); + end_parking_time.setTime(QTime(23, 59, 0)); + } + qCritical() << __func__ << __LINE__ << "end_parking_time" << end_parking_time.toString(Qt::ISODate); + return calcState.set(CalcState::State::SUCCESS); } From 36b3e85d1b130a4cd88c5cb5e537a844b6c380f9 Mon Sep 17 00:00:00 2001 From: Gerhard Hoffmann Date: Fri, 2 Aug 2024 11:11:20 +0200 Subject: [PATCH 5/7] GetCostFromDuration(): recompute timestep list to make sure that time step is found in it. --- library/src/calculator_functions.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/library/src/calculator_functions.cpp b/library/src/calculator_functions.cpp index 36085d9..0273e63 100644 --- a/library/src/calculator_functions.cpp +++ b/library/src/calculator_functions.cpp @@ -1018,7 +1018,8 @@ uint32_t Calculator::GetCostFromDuration(Configuration * cfg, if (paymentMethodId == PaymentMethod::Steps || paymentMethodId == PaymentMethod::Degressive) { int const timeStepInMinutes = start.secsTo(end) / 60; - + QList tlist = Calculator::GetInstance().GetTimeSteps(cfg, paymentOptionIndex, start); + qCritical() << DBG_HEADER << "timeStepList" << timeStepInMinutes << tlist; qCritical() << DBG_HEADER << "timeStepInMinutes" << timeStepInMinutes << start.toString(Qt::ISODate); return GetPriceForTimeStep(cfg, timeStepInMinutes, paymentOptionIndex); From 1023f6ede166f39ba82da1c208be058a53be3383 Mon Sep 17 00:00:00 2001 From: Gerhard Hoffmann Date: Fri, 2 Aug 2024 11:12:07 +0200 Subject: [PATCH 6/7] GetPriceForTimeStep(): Use "pop_accumulate_durations" setting to sum up the durations. Otherwise time-step will not be found in time-step-list. --- library/src/calculator_functions.cpp | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/library/src/calculator_functions.cpp b/library/src/calculator_functions.cpp index 0273e63..9c908de 100644 --- a/library/src/calculator_functions.cpp +++ b/library/src/calculator_functions.cpp @@ -2810,11 +2810,13 @@ uint32_t Calculator::GetPriceForTimeStep(Configuration *cfg, int timeStep, int p // paymentOptionIndex = 1; int const pop_id = cfg->getPaymentOptions(paymentOptionIndex).pop_id; + int const pop_accumulate_durations = cfg->getPaymentOptions(paymentOptionIndex).pop_accumulate_durations; int const pop_accumulate_prices = cfg->getPaymentOptions(paymentOptionIndex).pop_accumulate_prices; uint32_t price = 0; + int pun_duration = 0; - //qCritical() << "(" << __func__ << ":" << __LINE__ << ") paymentOptionIndex" << paymentOptionIndex; + qCritical() << "(" << __func__ << ":" << __LINE__ << ") paymentOptionIndex" << paymentOptionIndex; //qCritical() << "(" << __func__ << ":" << __LINE__ << ") timeStep" << timeStep; //qCritical() << "(" << __func__ << ":" << __LINE__ << ") pop_id" << pop_id; @@ -2828,19 +2830,25 @@ uint32_t Calculator::GetPriceForTimeStep(Configuration *cfg, int timeStep, int p //qCritical() << "(" << __func__ << ":" << __LINE__ << ") pun_id" << pun_id; //qCritical() << "(" << __func__ << ":" << __LINE__ << ") pun_unit_id" << payment_unit_id; - int const pun_duration = cfg->Duration.find(payment_unit_id)->second.pun_duration; - //int const pun_duration = cfg->Duration.find(2)->second.pun_duration; + if (pop_accumulate_durations) { + pun_duration += cfg->Duration.find(payment_unit_id)->second.pun_duration; + } else { + pun_duration = cfg->Duration.find(payment_unit_id)->second.pun_duration; + } + if (pop_accumulate_prices) { price += itr->second.pra_price; } else { price = (uint32_t)(itr->second.pra_price); } - //qCritical() << "(" << __func__ << ":" << __LINE__ << ") price" << price; - //qCritical() << "(" << __func__ << ":" << __LINE__ << ") pun_id" << pun_id; - //qCritical() << "(" << __func__ << ":" << __LINE__ << ") pun_unit_id" << payment_unit_id; - //qCritical() << "(" << __func__ << ":" << __LINE__ << ") pun_duration" << pun_duration; - //qCritical() << "(" << __func__ << ":" << __LINE__ << ") timeStep" << timeStep; + if (DBG_LEVEL >= DBG_DEBUG) { + qCritical() << "(" << __func__ << ":" << __LINE__ << ") price" << price; + qCritical() << "(" << __func__ << ":" << __LINE__ << ") pun_id" << pun_id; + qCritical() << "(" << __func__ << ":" << __LINE__ << ") pun_unit_id" << payment_unit_id; + qCritical() << "(" << __func__ << ":" << __LINE__ << ") pun_duration" << pun_duration; + qCritical() << "(" << __func__ << ":" << __LINE__ << ") timeStep" << timeStep; + } if (timeStep == pun_duration) { qCritical() << "(" << __func__ << ":" << __LINE__ << ") return price" << price; From 62c52fd580a4d9d1075a3636857a122697d2f6e7 Mon Sep 17 00:00:00 2001 From: Gerhard Hoffmann Date: Fri, 2 Aug 2024 11:13:50 +0200 Subject: [PATCH 7/7] test case for fuchs, fane alm. --- main/main.cpp | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/main/main.cpp b/main/main.cpp index b557d6d..6539b4d 100644 --- a/main/main.cpp +++ b/main/main.cpp @@ -47,11 +47,11 @@ extern "C" char* strptime(const char* s, #define NEUHAUSER_CHRISTOPH_REISEN (0) #define NEUHAUSER_PERNEGG_AN_DER_MUR (0) #define NEUHAUSER_STOCKERAU (0) -#define KLEIPEDA_LITAUEN (1) +#define KLEIPEDA_LITAUEN (0) #define SEXTEN (0) #define SCHNALS_LEITER_KIRCHL (0) #define SCHNALS_STAUMAUER (SCHNALS_LEITER_KIRCHL) -#define VALSER_ALM (0) +#define VALSER_ALM (1) #if NEUHAUSER_KIRCHDORF==1 static bool test_neuhauser_kirchdorf(int step, double cost) { @@ -919,22 +919,24 @@ int main() { s.setTime(QTime(12, 0, 0)); int minimal_parking_price = get_minimal_parkingprice(&cfg, - PermitType(PERMIT_TYPE::SHORT_TERM_PARKING), + PermitType(PERMIT_TYPE::SHORT_TERM_PARKING_PKW), paymentOptionIndex, s); +#if 0 qCritical() << "minimal parking price" << minimal_parking_price; for (int i = 0; i < 8; ++i) { calcState = compute_duration_for_parking_ticket(&cfg, s, (double)minimal_parking_price + i*800, - end, PermitType(PERMIT_TYPE::SHORT_TERM_PARKING)); + end, PermitType(PERMIT_TYPE::SHORT_TERM_PARKING_PKW)); qCritical() << "RUN" << i << end.toString(Qt::ISODate) << calcState.toString(); } +#else s.setTime(QTime(15, 0, 0)); minimal_parking_price = get_minimal_parkingprice(&cfg, - PermitType(PERMIT_TYPE::SHORT_TERM_PARKING), + PermitType(PERMIT_TYPE::SHORT_TERM_PARKING_PKW), paymentOptionIndex, s); qCritical() << "minimal parking price" << minimal_parking_price; @@ -942,9 +944,10 @@ int main() { for (int i = 0; i < 8; ++i) { calcState = compute_duration_for_parking_ticket(&cfg, s, (double)minimal_parking_price + i*800, - end, PermitType(PERMIT_TYPE::SHORT_TERM_PARKING)); + end, PermitType(PERMIT_TYPE::SHORT_TERM_PARKING_PKW)); qCritical() << "RUN" << i << end.toString(Qt::ISODate) << calcState.toString(); } +#endif } } #endif