diff --git a/library/src/calculator_functions.cpp b/library/src/calculator_functions.cpp index 6995743..6c223fe 100644 --- a/library/src/calculator_functions.cpp +++ b/library/src/calculator_functions.cpp @@ -695,72 +695,86 @@ Ticket Calculator::private_GetDurationFromCost(Configuration *cfg, cost, Ticket::s[VALID]); } -QList Calculator::GetTimeSteps(Configuration *cfg) const { - QList timeSteps; +QList Calculator::GetTimeSteps(Configuration *cfg, quint64 startInMinutes) const { + static QList timeSteps; - 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 (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; - if (pop_time_step_config == (int)ATBTimeStepConfig::TimeStepConfig::DYNAMIC) { - 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; + 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 (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) { - //duration.pun_duration_min = search->second.pun_duration_min; - //duration.pun_duration_max = search->second.pun_duration_max; + if (pop_time_step_config == (int)ATBTimeStepConfig::TimeStepConfig::DYNAMIC) { + QDateTime start; + start.setSecsSinceEpoch(startInMinutes * 60); + uint16_t timeStepCompensation = 0; - QDateTime carryOver = m_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(m_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; + 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)); + + 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; + + // 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;; } - duration.pun_duration = timeStep; - m_timeStepCompensation = duration.pun_duration_max - duration.pun_duration; - timeSteps << duration.pun_duration; - } else { - duration.pun_duration = duration.pun_duration_max - m_timeStepCompensation; - timeSteps << duration.pun_duration;; + + cfg->Duration.erase(search); + cfg->Duration.insert(pair(duration.pun_id, duration)); + + } else { // if (search != cfg->Duration.end()) { + // TODO } - - 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 == QTime(0, 0, 0)) { + } else { // if (carryOverTimeRangeFrom == carryOverTimeRangeTo) { // TODO } - } else { // if (carryOverTimeRangeFrom == carryOverTimeRangeTo) { + } else { // if (pop_carry_over) { // TODO } - } 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; + } 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; + } } }