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