Implement get_minimal_parkingtime() and get_time_steps().
This commit is contained in:
		| @@ -44,7 +44,7 @@ public: | ||||
|     // helper function to find time steps for a tariff with PaymentMethod::Steps | ||||
|     // (e.g. Schoenau/Koenigsee) | ||||
|     // | ||||
|     QList<int> GetTimeSteps(Configuration *cfg, quint64 startInMinutes = QDateTime::currentSecsSinceEpoch() / 60) const; | ||||
|     QList<int> GetTimeSteps(Configuration *cfg) const; | ||||
|     QList<int> GetSteps(Configuration *cfg) const { return GetTimeSteps(cfg); } | ||||
|  | ||||
|     // additional helper functions | ||||
|   | ||||
| @@ -12,8 +12,15 @@ | ||||
|  | ||||
| static Calculator calculator; | ||||
|  | ||||
| QList<int> CALCULATE_LIBRARY_API get_time_steps(Configuration *cfg, qint64 startInMinutes) { | ||||
|     return calculator.GetTimeSteps(cfg, startInMinutes); | ||||
| QList<int> 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) | ||||
|   | ||||
| @@ -695,86 +695,86 @@ Ticket Calculator::private_GetDurationFromCost(Configuration *cfg, | ||||
|                cost, Ticket::s[VALID]); | ||||
| } | ||||
|  | ||||
| QList<int> Calculator::GetTimeSteps(Configuration *cfg, quint64 startInMinutes) const { | ||||
|     static QList<int> timeSteps; | ||||
| QList<int> Calculator::GetTimeSteps(Configuration *cfg) const { | ||||
|     QList<int> 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<int, ATBDuration>(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<int, ATBDuration>(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; | ||||
|         } | ||||
|     } | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user