Compare commits

..

No commits in common. "b43fa274bd149d2ad1f7a99f4a7b3f2dc01590c9" and "0671a6dde65e96f7ef00ecc57c798033c5d45c77" have entirely different histories.

4 changed files with 67 additions and 75 deletions

View File

@ -111,8 +111,7 @@ int CALCULATE_LIBRARY_API get_zone_nr(int zone = -1);
int CALCULATE_LIBRARY_API compute_next_timestep(parking_tariff_t *tariff, int currentTimeMinutes, int UpDown); int CALCULATE_LIBRARY_API compute_next_timestep(parking_tariff_t *tariff, int currentTimeMinutes, int UpDown);
QList<int> CALCULATE_LIBRARY_API get_time_steps(Configuration *cfg); QList<int> CALCULATE_LIBRARY_API get_time_steps(Configuration *cfg, qint64 startInMinutes = QDateTime::currentSecsSinceEpoch() / 60);
int CALCULATE_LIBRARY_API get_minimum_parkingtime(Configuration *cfg);
CalcState CALCULATE_LIBRARY_API compute_price_for_parking_ticket( // deprecated CalcState CALCULATE_LIBRARY_API compute_price_for_parking_ticket( // deprecated
parking_tariff_t *tariff, parking_tariff_t *tariff,

View File

@ -44,7 +44,7 @@ public:
// helper function to find time steps for a tariff with PaymentMethod::Steps // helper function to find time steps for a tariff with PaymentMethod::Steps
// (e.g. Schoenau/Koenigsee) // (e.g. Schoenau/Koenigsee)
// //
QList<int> GetTimeSteps(Configuration *cfg) const; QList<int> GetTimeSteps(Configuration *cfg, quint64 startInMinutes = QDateTime::currentSecsSinceEpoch() / 60) const;
QList<int> GetSteps(Configuration *cfg) const { return GetTimeSteps(cfg); } QList<int> GetSteps(Configuration *cfg) const { return GetTimeSteps(cfg); }
// additional helper functions // additional helper functions

View File

@ -12,15 +12,8 @@
static Calculator calculator; static Calculator calculator;
QList<int> CALCULATE_LIBRARY_API get_time_steps(Configuration *cfg) { QList<int> CALCULATE_LIBRARY_API get_time_steps(Configuration *cfg, qint64 startInMinutes) {
return calculator.GetTimeSteps(cfg); return calculator.GetTimeSteps(cfg, startInMinutes);
}
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) int CALCULATE_LIBRARY_API get_zone_nr(int zone)

View File

@ -695,86 +695,86 @@ Ticket Calculator::private_GetDurationFromCost(Configuration *cfg,
cost, Ticket::s[VALID]); cost, Ticket::s[VALID]);
} }
QList<int> Calculator::GetTimeSteps(Configuration *cfg) const { QList<int> Calculator::GetTimeSteps(Configuration *cfg, quint64 startInMinutes) const {
QList<int> timeSteps; static QList<int> timeSteps;
QDateTime start = QDateTime::currentDateTime(); if (timeSteps.size() == 0) {
start.setTime(QTime(start.time().hour(), start.time().minute(), 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;
int const pop_id = cfg->getPaymentOptions().pop_id; qCritical() << " payment option id:" << pop_id;
int const pop_carry_over = cfg->getPaymentOptions().pop_carry_over; qCritical() << " payment option carry over:" << pop_carry_over;
int const pop_time_step_config = cfg->getPaymentOptions().pop_time_step_config; qCritical() << "payment option time step config:" << pop_time_step_config;
qCritical() << " start parking time:" << start.toString(Qt::ISODate); if (pop_time_step_config == (int)ATBTimeStepConfig::TimeStepConfig::DYNAMIC) {
qCritical() << " payment option id:" << pop_id; QDateTime start;
qCritical() << " payment option carry over:" << pop_carry_over; start.setSecsSinceEpoch(startInMinutes * 60);
qCritical() << "payment option time step config:" << pop_time_step_config; uint16_t timeStepCompensation = 0;
if (pop_time_step_config == (int)ATBTimeStepConfig::TimeStepConfig::DYNAMIC) { if (pop_carry_over) {
uint16_t timeStepCompensation = 0; 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_carry_over) { if (carryOverTimeRangeFrom.secsTo(carryOverTimeRangeTo) <= 60) { // carry over time point, usually 00:00:00
int const pop_carry_over_time_range_id = cfg->getPaymentOptions().pop_carry_over_time_range_id; if (carryOverTimeRangeFrom == QTime(0, 0, 0)) {
QTime const carryOverTimeRangeFrom = cfg->TimeRange.find(pop_carry_over_time_range_id)->second.time_range_from; for (auto[itr, rangeEnd] = cfg->PaymentRate.equal_range(pop_id); itr != rangeEnd; ++itr) {
QTime const carryOverTimeRangeTo = cfg->TimeRange.find(pop_carry_over_time_range_id)->second.time_range_to; 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 (carryOverTimeRangeFrom.secsTo(carryOverTimeRangeTo) <= 60) { // carry over time point, usually 00:00:00 int const timeStep = std::ceil(start.secsTo(carryOver) / 60.0);
if (carryOverTimeRangeFrom == QTime(0, 0, 0)) { if (timeStep < duration.pun_duration_min || timeStep > duration.pun_duration_max) {
for (auto[itr, rangeEnd] = cfg->PaymentRate.equal_range(pop_id); itr != rangeEnd; ++itr) { qCritical()
int const durationId = itr->second.pra_payment_unit_id; << QString("ERROR timeStep (%1) < durationMin (%2) || timeStep (%3)) > durationMax (%4)")
auto search = cfg->Duration.find(durationId); .arg(timeStep).arg(duration.pun_duration_min)
if (search != cfg->Duration.end()) { .arg(timeStep).arg(duration.pun_duration_max);
ATBDuration duration = search->second; break;
if (durationId == 1) { }
QDateTime carryOver = start; qCritical() << "configured minimal parking time:" << cfg->getPaymentOptions().pop_min_time;
carryOver = carryOver.addDays(1);
carryOver.setTime(QTime(0, 0, 0));
int const timeStep = std::ceil(start.secsTo(carryOver) / 60.0); // set dynamic minimal parking time
if (timeStep < duration.pun_duration_min || timeStep > duration.pun_duration_max) { cfg->getPaymentOptions().pop_min_time = timeStep;
qCritical()
<< QString("ERROR timeStep (%1) < durationMin (%2) || timeStep (%3)) > durationMax (%4)") qCritical() << " computed minimal parking time:" << cfg->getPaymentOptions().pop_min_time;
.arg(timeStep).arg(duration.pun_duration_min)
.arg(timeStep).arg(duration.pun_duration_max); duration.pun_duration = timeStep;
break; 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;;
} }
qCritical() << "configured minimal parking time:" << cfg->getPaymentOptions().pop_min_time;
// set dynamic minimal parking time cfg->Duration.erase(search);
cfg->getPaymentOptions().pop_min_time = timeStep; cfg->Duration.insert(pair<int, ATBDuration>(duration.pun_id, duration));
qCritical() << " computed minimal parking time:" << cfg->getPaymentOptions().pop_min_time; } else { // if (search != cfg->Duration.end()) {
// TODO
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 == QTime(0, 0, 0)) { } else { // if (carryOverTimeRangeFrom == carryOverTimeRangeTo) {
// TODO // TODO
} }
} else { // if (carryOverTimeRangeFrom == carryOverTimeRangeTo) { } else { // if (pop_carry_over) {
// TODO // TODO
} }
} else { // if (pop_carry_over) { } else {
// TODO for (auto[itr, rangeEnd] = cfg->PaymentRate.equal_range(pop_id); itr != rangeEnd; ++itr)
} {
} else { int const durationId = itr->second.pra_payment_unit_id;
for (auto[itr, rangeEnd] = cfg->PaymentRate.equal_range(pop_id); itr != rangeEnd; ++itr) int const durationUnit = cfg->Duration.find(durationId)->second.pun_duration;
{ timeSteps << durationUnit;
int const durationId = itr->second.pra_payment_unit_id; }
int const durationUnit = cfg->Duration.find(durationId)->second.pun_duration;
timeSteps << durationUnit;
} }
} }