From 84dbfc72343c29d71d001b500e1b74861f2a2160 Mon Sep 17 00:00:00 2001 From: Gerhard Hoffmann Date: Thu, 15 Aug 2024 21:41:09 +0200 Subject: [PATCH] GetTimeSteps(): compute time steps and duration values. For each element in the duration list (and for a given start-date-time) check if there is a prepaid-option or an carry-over-option to compute the correct values. --- library/src/calculator_functions.cpp | 159 +++++++++++++++++++++++++++ 1 file changed, 159 insertions(+) diff --git a/library/src/calculator_functions.cpp b/library/src/calculator_functions.cpp index 0778f4e..a845a79 100644 --- a/library/src/calculator_functions.cpp +++ b/library/src/calculator_functions.cpp @@ -2773,6 +2773,165 @@ QList &Calculator::GetTimeSteps(Configuration *cfg, int paymentOptionIndex, qCritical() << "(" << __func__ << ":" << __LINE__ << ") TODO"; } } + } else + if (pop_time_step_config == (int)ATBTimeStepConfig::TimeStepConfig::RECOMPUTE_SOME) { + // some durations / timesteps have to be recomputed + qCritical() << "(" << __func__ << ":" << __LINE__ << ") payment option time step config:" << "TimeStepConfig::RECOMPUTE_SOME"; + int size = m_timeSteps.size(); + + while (size <= paymentOptionIndex) { + m_timeSteps.push_back(QList()); + size = m_timeSteps.size(); + } + + int const pop_accumulate_durations = cfg->getPaymentOptions(paymentOptionIndex).pop_accumulate_durations; + + m_timeSteps[paymentOptionIndex].clear(); + Configuration::TariffDurationType::iterator prev_it = cfg->Duration.end(); + + start = s; + start.setTime(QTime(s.time().hour(), s.time().minute(), 0)); + + // qCritical() << "(" << __func__ << ":" << __LINE__ << ") start:" << start.toString(Qt::ISODate); + + for (Configuration::TariffDurationType::iterator it = cfg->Duration.begin(); + it != cfg->Duration.end(); + ++it) { + it->second.pun_duration = it->second.pun_duration_saved; + if (it->second.pun_requires_change) { + if (it->second.pun_netto && !it->second.pun_brutto) { + + int weekDay = start.date().dayOfWeek(); + bool casePrepay = false; + if (m_timeSteps[paymentOptionIndex].isEmpty()) { + // handle possible prepay-condition, which applies only + // for the very first step + + int const pop_prepay_option_id = cfg->getPaymentOptions(paymentOptionIndex).pop_prepay_option_id; + QDateTime prepayStart(start); + QDateTime prepayEnd(start); + + prepayStart.setTime(cfg->TariffPrepayOptions.find(pop_prepay_option_id)->second.prepay[weekDay].start); + prepayEnd.setTime(cfg->TariffPrepayOptions.find(pop_prepay_option_id)->second.prepay[weekDay].end); + + if (start <= prepayEnd) { + prepayStart = prepayStart.addDays(-1); + } else { + prepayEnd = prepayEnd.addDays(1); + } + + qCritical() << "(" << __func__ << ":" << __LINE__ << ")" << start.toString(Qt::ISODate); + qCritical() << "(" << __func__ << ":" << __LINE__ << ")" << prepayStart.toString(Qt::ISODate); + qCritical() << "(" << __func__ << ":" << __LINE__ << ")" << prepayEnd.toString(Qt::ISODate); + + if (prepayStart <= start && start <= prepayEnd) { + it->second.pun_duration = start.secsTo(prepayEnd) / 60; + it->second.pun_duration += it->second.pun_duration_saved ; + casePrepay = true; + } + //if (start >= prepayStart && ) { + // it->second.pun_duration = start.secsTo(prepayEnd) / 60; + // it->second.pun_duration += it->second.pun_duration_saved ; + // casePrepay = true; + //} + + qCritical() << "(" << __func__ << ":" << __LINE__ << ")" << it->second.pun_duration; + } + + if (!casePrepay) { + // handle possible carryover-condition + int const pop_carry_over_option_id = cfg->getPaymentOptions(paymentOptionIndex).pop_carry_over_option_id; + QDateTime carryOverStart(start); + QDateTime carryOverEnd(start); + + qCritical() << "(" << __func__ << ":" << __LINE__ << ")" << carryOverStart.toString(Qt::ISODate); + + carryOverStart.setTime(cfg->TariffCarryOverOptions.find(pop_carry_over_option_id)->second.carryover[weekDay].static_start); + carryOverEnd.setTime(cfg->TariffCarryOverOptions.find(pop_carry_over_option_id)->second.carryover[weekDay].static_end); + + //while (carryOverStart > carryOverEnd) { + // carryOverEnd = carryOverEnd.addDays(1); + //} + + if (start <= carryOverEnd) { + carryOverStart = carryOverStart.addDays(-1); + } else { + carryOverEnd = carryOverEnd.addDays(1); + } + + int durationInSecs = it->second.pun_duration_saved * 60; + + //qCritical() << "(" << __func__ << ":" << __LINE__ << ")" << durationInSecs; + //qCritical() << "(" << __func__ << ":" << __LINE__ << ")" << start.addSecs(durationInSecs).toString(Qt::ISODate); + //qCritical() << "(" << __func__ << ":" << __LINE__ << ")" << carryOverStart.toString(Qt::ISODate); + + it->second.pun_duration = it->second.pun_duration_saved; + if (start >= carryOverStart) { + it->second.pun_duration += start.secsTo(carryOverEnd) / 60; + } else { + // start < carryOverStart + if (start.addSecs(durationInSecs) >= carryOverStart) { + // cross carry over section + it->second.pun_next_step_correction = carryOverStart.secsTo(carryOverEnd) / 60; + it->second.pun_duration += it->second.pun_next_step_correction; + prev_it = it; + } + } + } + + if (pop_accumulate_durations) { + if (!m_timeSteps[paymentOptionIndex].isEmpty()) { + int d = m_timeSteps[paymentOptionIndex].last(); + m_timeSteps[paymentOptionIndex] << (d + it->second.pun_duration); + } else { + m_timeSteps[paymentOptionIndex] << it->second.pun_duration; + } + } + + } else { + qCritical() << "(" << __func__ << ":" << __LINE__ << ")" + << "no change required, but set to brutto, which does not have to be changed"; + } + } else { + if (it->second.pun_fixed) { // no change required: must be true + if (it->second.pun_brutto) { // no handling for prepay and carry-over + if (pop_accumulate_durations) { + int correction = 0; + if (prev_it != cfg->Duration.end()) { + correction = prev_it->second.pun_next_step_correction; + prev_it->second.pun_next_step_correction = 0; + } + if (!m_timeSteps[paymentOptionIndex].isEmpty()) { + int d = m_timeSteps[paymentOptionIndex].last(); + it->second.pun_duration -= correction; + m_timeSteps[paymentOptionIndex] << (d + it->second.pun_duration); + } else { + it->second.pun_duration -= correction; + m_timeSteps[paymentOptionIndex] << it->second.pun_duration; + } + } + } else + if (it->second.pun_netto) { + qCritical() << "(" << __func__ << ":" << __LINE__ << ")" << "TODO"; + } + } else { + qCritical() << "(" << __func__ << ":" << __LINE__ << ")" << "fixed is false, but no change required"; + } + } + } + +#if 0 + for (int i = 0; i < m_timeSteps[paymentOptionIndex].size(); ++i) { + QDateTime nextTime = start; + // nextTime.setTime(QTime(0, 0, 0)); + int const secs = m_timeSteps[paymentOptionIndex][i] * 60; + nextTime = nextTime.addSecs(secs); + qCritical() << "(" << __func__ << ":" << __LINE__ << ") step" + << i << secs << m_timeSteps[0][i] << "->" << nextTime.toString(Qt::ISODate); + + } +#endif + } else { qCritical() << "(" << __func__ << ":" << __LINE__ << ") payment option time step config:" << "TimeStepConfig::STATIC";