From b43fa274bd149d2ad1f7a99f4a7b3f2dc01590c9 Mon Sep 17 00:00:00 2001 From: Gerhard Hoffmann Date: Mon, 22 Jan 2024 15:41:20 +0100 Subject: [PATCH] Implement get_minimal_parkingtime() and get_time_steps(). --- .../include/mobilisis/calculator_functions.h | 2 +- library/src/calculate_price.cpp | 11 +- library/src/calculator_functions.cpp | 126 +++++++++--------- 3 files changed, 73 insertions(+), 66 deletions(-) diff --git a/library/include/mobilisis/calculator_functions.h b/library/include/mobilisis/calculator_functions.h index 601053a..942d70c 100644 --- a/library/include/mobilisis/calculator_functions.h +++ b/library/include/mobilisis/calculator_functions.h @@ -44,7 +44,7 @@ public: // helper function to find time steps for a tariff with PaymentMethod::Steps // (e.g. Schoenau/Koenigsee) // - QList GetTimeSteps(Configuration *cfg, quint64 startInMinutes = QDateTime::currentSecsSinceEpoch() / 60) const; + QList GetTimeSteps(Configuration *cfg) const; QList GetSteps(Configuration *cfg) const { return GetTimeSteps(cfg); } // additional helper functions diff --git a/library/src/calculate_price.cpp b/library/src/calculate_price.cpp index 5d026c7..3fb59ed 100644 --- a/library/src/calculate_price.cpp +++ b/library/src/calculate_price.cpp @@ -12,8 +12,15 @@ static Calculator calculator; -QList CALCULATE_LIBRARY_API get_time_steps(Configuration *cfg, qint64 startInMinutes) { - return calculator.GetTimeSteps(cfg, startInMinutes); +QList CALCULATE_LIBRARY_API get_time_steps(Configuration *cfg) { + return calculator.GetTimeSteps(cfg); +} + +int CALCULATE_LIBRARY_API get_minimum_parkingtime(Configuration *cfg) { + // get_time_steps() possibly re-computes pop_min_time: see + // calculator.GetTimeSteps() + get_time_steps(cfg); + return qRound(cfg->getPaymentOptions().pop_min_time); } int CALCULATE_LIBRARY_API get_zone_nr(int zone) diff --git a/library/src/calculator_functions.cpp b/library/src/calculator_functions.cpp index 6c223fe..e0c2fdd 100644 --- a/library/src/calculator_functions.cpp +++ b/library/src/calculator_functions.cpp @@ -695,86 +695,86 @@ Ticket Calculator::private_GetDurationFromCost(Configuration *cfg, cost, Ticket::s[VALID]); } -QList Calculator::GetTimeSteps(Configuration *cfg, quint64 startInMinutes) const { - static QList timeSteps; +QList Calculator::GetTimeSteps(Configuration *cfg) const { + QList timeSteps; - if (timeSteps.size() == 0) { - int const pop_id = cfg->getPaymentOptions().pop_id; - int const pop_carry_over = cfg->getPaymentOptions().pop_carry_over; - int const pop_time_step_config = cfg->getPaymentOptions().pop_time_step_config; + QDateTime start = QDateTime::currentDateTime(); + start.setTime(QTime(start.time().hour(), start.time().minute(), 0)); - qCritical() << " payment option id:" << pop_id; - qCritical() << " payment option carry over:" << pop_carry_over; - qCritical() << "payment option time step config:" << pop_time_step_config; + int const pop_id = cfg->getPaymentOptions().pop_id; + int const pop_carry_over = cfg->getPaymentOptions().pop_carry_over; + int const pop_time_step_config = cfg->getPaymentOptions().pop_time_step_config; - if (pop_time_step_config == (int)ATBTimeStepConfig::TimeStepConfig::DYNAMIC) { - QDateTime start; - start.setSecsSinceEpoch(startInMinutes * 60); - uint16_t timeStepCompensation = 0; + qCritical() << " start parking time:" << start.toString(Qt::ISODate); + qCritical() << " payment option id:" << pop_id; + qCritical() << " payment option carry over:" << pop_carry_over; + qCritical() << "payment option time step config:" << pop_time_step_config; - if (pop_carry_over) { - int const pop_carry_over_time_range_id = cfg->getPaymentOptions().pop_carry_over_time_range_id; - QTime const carryOverTimeRangeFrom = cfg->TimeRange.find(pop_carry_over_time_range_id)->second.time_range_from; - QTime const carryOverTimeRangeTo = cfg->TimeRange.find(pop_carry_over_time_range_id)->second.time_range_to; + if (pop_time_step_config == (int)ATBTimeStepConfig::TimeStepConfig::DYNAMIC) { + uint16_t timeStepCompensation = 0; - if (carryOverTimeRangeFrom.secsTo(carryOverTimeRangeTo) <= 60) { // carry over time point, usually 00:00:00 - if (carryOverTimeRangeFrom == QTime(0, 0, 0)) { - for (auto[itr, rangeEnd] = cfg->PaymentRate.equal_range(pop_id); itr != rangeEnd; ++itr) { - int const durationId = itr->second.pra_payment_unit_id; - auto search = cfg->Duration.find(durationId); - if (search != cfg->Duration.end()) { - ATBDuration duration = search->second; - if (durationId == 1) { - QDateTime carryOver = start; - carryOver = carryOver.addDays(1); - carryOver.setTime(QTime(0, 0, 0)); + if (pop_carry_over) { + int const pop_carry_over_time_range_id = cfg->getPaymentOptions().pop_carry_over_time_range_id; + QTime const carryOverTimeRangeFrom = cfg->TimeRange.find(pop_carry_over_time_range_id)->second.time_range_from; + QTime const carryOverTimeRangeTo = cfg->TimeRange.find(pop_carry_over_time_range_id)->second.time_range_to; - int const timeStep = std::ceil(start.secsTo(carryOver) / 60.0); - if (timeStep < duration.pun_duration_min || timeStep > duration.pun_duration_max) { - qCritical() - << QString("ERROR timeStep (%1) < durationMin (%2) || timeStep (%3)) > durationMax (%4)") - .arg(timeStep).arg(duration.pun_duration_min) - .arg(timeStep).arg(duration.pun_duration_max); - break; - } - qCritical() << "configured minimal parking time:" << cfg->getPaymentOptions().pop_min_time; + if (carryOverTimeRangeFrom.secsTo(carryOverTimeRangeTo) <= 60) { // carry over time point, usually 00:00:00 + if (carryOverTimeRangeFrom == QTime(0, 0, 0)) { + for (auto[itr, rangeEnd] = cfg->PaymentRate.equal_range(pop_id); itr != rangeEnd; ++itr) { + int const durationId = itr->second.pra_payment_unit_id; + auto search = cfg->Duration.find(durationId); + if (search != cfg->Duration.end()) { + ATBDuration duration = search->second; + if (durationId == 1) { + QDateTime carryOver = start; + carryOver = carryOver.addDays(1); + carryOver.setTime(QTime(0, 0, 0)); - // set dynamic minimal parking time - cfg->getPaymentOptions().pop_min_time = timeStep; - - qCritical() << " computed minimal parking time:" << cfg->getPaymentOptions().pop_min_time; - - duration.pun_duration = timeStep; - timeStepCompensation = duration.pun_duration_max - duration.pun_duration; - timeSteps << duration.pun_duration; - } else { - duration.pun_duration = duration.pun_duration_max - timeStepCompensation; - timeSteps << duration.pun_duration;; + int const timeStep = std::ceil(start.secsTo(carryOver) / 60.0); + if (timeStep < duration.pun_duration_min || timeStep > duration.pun_duration_max) { + qCritical() + << QString("ERROR timeStep (%1) < durationMin (%2) || timeStep (%3)) > durationMax (%4)") + .arg(timeStep).arg(duration.pun_duration_min) + .arg(timeStep).arg(duration.pun_duration_max); + break; } + qCritical() << "configured minimal parking time:" << cfg->getPaymentOptions().pop_min_time; - cfg->Duration.erase(search); - cfg->Duration.insert(pair(duration.pun_id, duration)); + // set dynamic minimal parking time + cfg->getPaymentOptions().pop_min_time = timeStep; - } else { // if (search != cfg->Duration.end()) { - // TODO + qCritical() << " computed minimal parking time:" << cfg->getPaymentOptions().pop_min_time; + + duration.pun_duration = timeStep; + timeStepCompensation = duration.pun_duration_max - duration.pun_duration; + timeSteps << duration.pun_duration; + } else { + duration.pun_duration = duration.pun_duration_max - timeStepCompensation; + timeSteps << duration.pun_duration;; } + + cfg->Duration.erase(search); + cfg->Duration.insert(pair(duration.pun_id, duration)); + + } else { // if (search != cfg->Duration.end()) { + // TODO } - } else { // if (carryOverTimeRangeFrom == QTime(0, 0, 0)) { - // TODO } - } else { // if (carryOverTimeRangeFrom == carryOverTimeRangeTo) { + } else { // if (carryOverTimeRangeFrom == QTime(0, 0, 0)) { // TODO } - } else { // if (pop_carry_over) { + } else { // if (carryOverTimeRangeFrom == carryOverTimeRangeTo) { // TODO } - } else { - for (auto[itr, rangeEnd] = cfg->PaymentRate.equal_range(pop_id); itr != rangeEnd; ++itr) - { - int const durationId = itr->second.pra_payment_unit_id; - int const durationUnit = cfg->Duration.find(durationId)->second.pun_duration; - timeSteps << durationUnit; - } + } else { // if (pop_carry_over) { + // TODO + } + } else { + for (auto[itr, rangeEnd] = cfg->PaymentRate.equal_range(pop_id); itr != rangeEnd; ++itr) + { + int const durationId = itr->second.pra_payment_unit_id; + int const durationUnit = cfg->Duration.find(durationId)->second.pun_duration; + timeSteps << durationUnit; } }