Compare commits

...

5 Commits

4 changed files with 65 additions and 15 deletions

View File

@@ -109,6 +109,8 @@ CalcState CALCULATE_LIBRARY_API init_tariff(parking_tariff_t **tariff,
void CALCULATE_LIBRARY_API free_tariff(parking_tariff_t *tariff);
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);
CalcState CALCULATE_LIBRARY_API compute_price_for_parking_ticket( // deprecated
parking_tariff_t *tariff,
time_t start_parking_time,

View File

@@ -43,9 +43,6 @@ private:
// For tariff of following structure: only steps, no special days, nonstop.
uint32_t GetCostFromDuration(Configuration *cfg, QDateTime const &start, quint64 durationMinutes) const;
uint32_t GetCostFromDuration(Configuration *cfg, QDateTime const &start, QDateTime const &end) const;
//
uint32_t GetPriceForTimeStep(Configuration *cfg, int timeStep) const;
uint32_t GetDurationForPrice(Configuration *cfg, int price) const;
};

View File

@@ -93,6 +93,44 @@ void CALCULATE_LIBRARY_API free_tariff(parking_tariff_t *tariff) {
}
//
// UpDown 1 -> up; 0 -> down
int CALCULATE_LIBRARY_API compute_next_timestep(parking_tariff_t *tariff, int currentTimeMinutes, int UpDown)
{
static const QList<int> stepList = calculator.GetTimeSteps(tariff);
int currentStepIndex = stepList.indexOf(currentTimeMinutes);
if (currentStepIndex == -1) {
qCritical() << "compute_next_timestep() *NO STEP* for currentTimeMinutes (" << currentTimeMinutes << ")";
return currentTimeMinutes;
}
if (UpDown == 1) { // UP
if (stepList[currentStepIndex] == stepList.last()) {
qCritical() << "compute_next_timestep() *NO NEXT STEP* for currentTimeMinutes (" << currentTimeMinutes << ")";
return currentTimeMinutes;
}
else {
return stepList[currentStepIndex + 1];
}
}
if (UpDown == 0) { // DOWN
if (stepList[currentStepIndex] == stepList.first()) {
qCritical() << "compute_next_timestep() *NO PREVIOUS STEP* for currentTimeMinutes (" << currentTimeMinutes << ")";
return currentTimeMinutes;
}
else {
return stepList[currentStepIndex - 1];
}
}
qCritical() << "compute_next_timestep() *CAN NOT COMPUTE* for currentTimeMinutes (" << currentTimeMinutes << ")";
return currentTimeMinutes;
}
// this is currently not used
CalcState CALCULATE_LIBRARY_API compute_price_for_parking_ticket(
parking_tariff_t *tariff,

View File

@@ -118,17 +118,21 @@ std::string Calculator::GetDurationFromCost(Configuration* cfg,
bool nextDay,
bool prepaid)
{
// Get input date
QDateTime inputDate = QDateTime::fromString(start_datetime,Qt::ISODate);
// use tariff with structure as for instance Schnau, Koenigsee:
// without given YearPeriod, SpecialDays and SpecialDaysWorktime
if (cfg->YearPeriod.size() == 0
&& cfg->SpecialDays.size() == 0
&& cfg->SpecialDaysWorktime.size() == 0)
{
return QString().setNum(GetDurationForPrice(cfg, price)).toStdString();
inputDate = inputDate.addSecs(GetDurationForPrice(cfg, price) * 60);
return inputDate.toString(Qt::ISODate).toStdString();
}
// Get input date
QDateTime inputDate = QDateTime::fromString(start_datetime,Qt::ISODate);
// Get day of week
int weekdayId = 0;
@@ -136,13 +140,13 @@ std::string Calculator::GetDurationFromCost(Configuration* cfg,
//Get min and max time defined in JSON
double minMin = 0;
minMin = cfg->PaymentOption.find(payment_option)->second.pop_min_time;
minMin = cfg->getPaymentOptions().pop_min_time;
double maxMin = 0;
maxMin = cfg->PaymentOption.find(payment_option)->second.pop_max_time;
maxMin = cfg->getPaymentOptions().pop_max_time;
double min_price = 0;
min_price = cfg->PaymentOption.find(payment_option)->second.pop_min_price;
min_price = cfg->getPaymentOptions().pop_min_price;
if(price < min_price)
{
@@ -630,20 +634,29 @@ uint32_t Calculator::GetPriceForTimeStep(Configuration *cfg, int timeStep) const
return 0;
}
/**
* private: read price directly from config file (used with PaymentMethod::Steps)
*
* return duration in minutes for greatest pra_price < price
*/
uint32_t Calculator::GetDurationForPrice(Configuration *cfg, int price) const {
int const pop_id = cfg->getPaymentOptions().pop_id;
int const pop_id = cfg->getPaymentOptions().pop_id;
uint32_t duration = 0;
for (auto[itr, rangeEnd] = cfg->PaymentRate.equal_range(pop_id); itr != rangeEnd; ++itr)
{
int const payment_unit_id = itr->second.pra_payment_unit_id;
int const pra_price = cfg->PaymentRate.find(payment_unit_id)->second.pra_price;
int const durationId = itr->second.pra_payment_unit_id;
int const pra_price = itr->second.pra_price;
uint32_t const durationUnit = cfg->Duration.find(durationId)->second.pun_duration;
if (price == pra_price) {
int const durationId = itr->second.pra_payment_unit_id;
int const durationUnit = cfg->Duration.find(durationId)->second.pun_duration;
return durationUnit;
}
if (pra_price < price) {
duration = durationUnit;
}
}
return 0;
return duration;
}