From de0be1d19b8e0799e6a4e1ce1c9d1c4e88a71c05 Mon Sep 17 00:00:00 2001 From: Gerhard Hoffmann Date: Wed, 23 Apr 2025 10:59:39 +0200 Subject: [PATCH 01/11] Minor: added/changed debug messages. --- library/src/calculate_price.cpp | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/library/src/calculate_price.cpp b/library/src/calculate_price.cpp index acf8980..ca9fef3 100644 --- a/library/src/calculate_price.cpp +++ b/library/src/calculate_price.cpp @@ -850,6 +850,8 @@ CalcState CALCULATE_LIBRARY_API compute_price_for_parking_ticket( QDateTime effectiveStartTime(start_parking_time); + qCritical() << __func__ << ":" << __LINE__ << "effectiveStartTime:" + << effectiveStartTime.toString(Qt::ISODate); // handle special days int const specialDayId = tariff->specialDayId(start_parking_time); @@ -880,6 +882,9 @@ CalcState CALCULATE_LIBRARY_API compute_price_for_parking_ticket( } } + qCritical() << __func__ << ":" << __LINE__ << "effectiveStartTime:" + << effectiveStartTime.toString(Qt::ISODate); + // handle prepaid option int const prepaid_option_id = tariff->getPaymentOptions(paymentOptionIndex).pop_prepaid_option_id; std::optional prepaidOption = tariff->getPrepaidType(prepaid_option_id); @@ -894,17 +899,23 @@ CalcState CALCULATE_LIBRARY_API compute_price_for_parking_ticket( if (start_parking_time.time() < p.prepaid[weekDay].static_end) { // static_end: e.g. 08:00:00 effectiveStartTime.setTime(p.prepaid[weekDay].static_end); + qCritical() << __func__ << ":" << __LINE__ << "effectiveStartTime:" + << effectiveStartTime.toString(Qt::ISODate); } else if (start_parking_time.time() > p.prepaid[weekDay].static_start) { // static_start: e.g. 22:00:00 effectiveStartTime.setTime(p.prepaid[weekDay].static_start); } } + } else { + qCritical() << __func__ << ":" << __LINE__ << "no prepaid option set"; } + // set seconds to 0 effectiveStartTime.setTime(QTime(effectiveStartTime.time().hour(), effectiveStartTime.time().minute(), 0)); - qCritical() << __func__ << ":" << __LINE__ << "effectiveStartTime:" << effectiveStartTime.toString(Qt::ISODate); + qCritical() << __func__ << ":" << __LINE__ << "effectiveStartTime:" + << effectiveStartTime.toString(Qt::ISODate); int const carryOver = tariff->getPaymentOptions(paymentOptionIndex).pop_carry_over; @@ -927,12 +938,12 @@ CalcState CALCULATE_LIBRARY_API compute_price_for_parking_ticket( s = s.addSecs(minutesUntilCarryOver * 60); s = s.addSecs(carryOverDuration * 60); end_parking_time = s.addSecs(rest * 60); + qCritical() << __func__ << ":" << __LINE__ << "end-parking-time:" << end_parking_time.toString(Qt::ISODate); } else { end_parking_time = effectiveStartTime.addSecs(netto_parking_time*60); + qCritical() << __func__ << ":" << __LINE__ << "end-parking-time:" << end_parking_time.toString(Qt::ISODate); } - qCritical() << __func__ << ":" << __LINE__ << "end-parking-time:" << end_parking_time.toString(Qt::ISODate); - weekDay = end_parking_time.date().dayOfWeek(); // musste man in einer schleife machen From 78cae243891ceb399d243e3989f22c9d04bb68b3 Mon Sep 17 00:00:00 2001 From: Gerhard Hoffmann Date: Wed, 23 Apr 2025 11:00:33 +0200 Subject: [PATCH 02/11] Fix: if start-time is out-of-range (after valid time for sell), switch to next valid time, taking into account if next valid time is on next day. --- library/src/calculate_price.cpp | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/library/src/calculate_price.cpp b/library/src/calculate_price.cpp index ca9fef3..874e975 100644 --- a/library/src/calculate_price.cpp +++ b/library/src/calculate_price.cpp @@ -903,7 +903,20 @@ CalcState CALCULATE_LIBRARY_API compute_price_for_parking_ticket( << effectiveStartTime.toString(Qt::ISODate); } else if (start_parking_time.time() > p.prepaid[weekDay].static_start) { // static_start: e.g. 22:00:00 - effectiveStartTime.setTime(p.prepaid[weekDay].static_start); + QTime const midnight(23, 59, 59); + QTime const midnight24(0, 0, 0); + + if ((p.prepaid[weekDay].static_start <= midnight && midnight24 <= p.prepaid[weekDay].static_end) + || (p.prepaid[weekDay].static_start == midnight && midnight == p.prepaid[weekDay].static_end) + || (p.prepaid[weekDay].static_start == midnight24 && midnight24 == p.prepaid[weekDay].static_end)) { + effectiveStartTime = effectiveStartTime.addDays(1); + weekDay = effectiveStartTime.date().dayOfWeek(); + qCritical() << __func__ << ":" << __LINE__ + << "effectiveStartTime: new week day [" << weekDay << "] (Mon=1, Tue=2, ..., Sun=7)"; + } + effectiveStartTime.setTime(p.prepaid[weekDay].static_end); + qCritical() << __func__ << ":" << __LINE__ << "effectiveStartTime:" + << effectiveStartTime.toString(Qt::ISODate); } } } else { From aec290fe2694fbfc0562cfed49906bf44b88cc38 Mon Sep 17 00:00:00 2001 From: Gerhard Hoffmann Date: Tue, 6 May 2025 11:52:16 +0200 Subject: [PATCH 03/11] test code --- main/main.cpp | 62 ++++++++++++++++++++++++++++++++++++++++++++++----- main/main.pro | 2 ++ 2 files changed, 59 insertions(+), 5 deletions(-) diff --git a/main/main.cpp b/main/main.cpp index cfefe7f..8de1419 100644 --- a/main/main.cpp +++ b/main/main.cpp @@ -211,21 +211,73 @@ static bool test_neuhauser_kirchdorf(int step, double cost) { return 0; */ +#include +#include +QString getCalculatorLibVersion() { + static QString v; + if (v.isEmpty()) { + QProcess shell; + QString command = QString("cat /proc/%1/maps | awk '{print $6;}' | grep 'libmobilisis_calc' | uniq").arg(QCoreApplication::applicationPid()); + + shell.start("/bin/bash", {"-c", command}); + if ( shell.waitForFinished( 5000 )) { + v = shell.readAllStandardOutput(); + // /usr/lib/libmobilisis_calc.so.2.3.99-18 + if (!v.isEmpty()) { + QStringList vlst = v.trimmed().split("/", QString::SkipEmptyParts); + if (vlst.size() > 0) { + vlst = vlst.last().split(".", QString::SkipEmptyParts); + if (vlst.size() > 4) { + v = QString("%1.%2.%3").arg(vlst[2]).arg(vlst[3]).arg(vlst[4]); + } + } + } + } + } + return v; +} + +bool isProductSupportedInCalculatorLib(QString const &product) { + bool supported{false}; + + QProcess shell; + QString command = QString("cat /proc/%1/maps | awk '{print $6;}' | grep 'libmobilisis_calc' | uniq | xargs strings | grep %2").arg(QCoreApplication::applicationPid()).arg(product); + + shell.start("/bin/bash", {"-c", command}); + if ( shell.waitForFinished( 5000 )) { + QString s = shell.readAllStandardOutput().trimmed(); + // /usr/lib/libmobilisis_calc.so.2.3.99-18 + if (!s.isEmpty() && (s == product)) { + qCritical() << "product" << s << "supported"; + supported = true; + } else { + qCritical() << "product" << product << "not supported"; + } + } + + return supported; +} int main() { - + qCritical() << getCalculatorLibVersion(); + isProductSupportedInCalculatorLib("FREE_TICKET"); + return 0; //487 { // 488 "pra_payment_option_id": 1049, // 489 "pra_payment_unit_id": 84, // 490 "pra_price":"840" //>>491 } - //for (int i = 1; i < 85; ++i) { - //printf("{\n \"\pra_payment_option_id\": 1049,\n \"\pra_payment_unit_id\": %d,\n \"pra_price\": %d\n},\n", - // i, i*10); + //for (int i = 1; i < 346; ++i) { + //printf("{\n \"pun_id\": %i,\n \"pun_duration\": %d\n},\n", + // i, 60 + i*4); //} - //return 0; + for (int i = 1; i < 361; ++i) { + printf("{\n \"pra_payment_option_id\": 1049,\n \"pra_payment_unit_id\": %i,\n \"pra_price\":%i\n},\n", + i, i*10); + } + return 0; #if 0 MessageHelper msgHelp; // msgHelp.createLoginMessageChunksToSend(0x02); diff --git a/main/main.pro b/main/main.pro index 912d6ec..84bbd5f 100644 --- a/main/main.pro +++ b/main/main.pro @@ -1,3 +1,5 @@ +QT += core + TEMPLATE = app TARGET = main From e70e9a858623311a63a2f124aa57d448c388e2af Mon Sep 17 00:00:00 2001 From: Gerhard Hoffmann Date: Tue, 6 May 2025 11:52:47 +0200 Subject: [PATCH 04/11] Add TariffIncludes: the main tariff-file will include (load) other tariff-files. --- library/include/mobilisis/configuration.h | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/library/include/mobilisis/configuration.h b/library/include/mobilisis/configuration.h index 5428c24..96b723f 100644 --- a/library/include/mobilisis/configuration.h +++ b/library/include/mobilisis/configuration.h @@ -83,6 +83,7 @@ public: TariffOutOfServiceType TariffOutOfServices; ATBTariffPrepaidType TariffPrepaids; ATBTariffCarryOverType TariffCarryOvers; + QStringList TariffIncludes; /// /// Parse JSON string @@ -123,6 +124,9 @@ public: std::optional getWeekDayWorkTime(QTime const &time, Qt::DayOfWeek dayOfWeek); std::optional> getAllWeekDayWorkTimes(); + QStringList const &getTariffIncludes() const { return TariffIncludes; } + QStringList &getTariffIncludes() { return TariffIncludes; } + std::optional prepaidStart(QDateTime const &start, int prepaid_option_id); int getPaymentOptionIndex(PERMIT_TYPE permitType); int getPaymentOptionIndex(PERMIT_TYPE permitType) const; From 4b9edb0f47a95f4da11173a8da52bd0e8accdb63 Mon Sep 17 00:00:00 2001 From: Gerhard Hoffmann Date: Tue, 6 May 2025 11:54:49 +0200 Subject: [PATCH 05/11] Minor: add IncludeType to be used by json-parser --- library/include/mobilisis/member_type.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/library/include/mobilisis/member_type.h b/library/include/mobilisis/member_type.h index dcfd012..07c6f9b 100644 --- a/library/include/mobilisis/member_type.h +++ b/library/include/mobilisis/member_type.h @@ -22,7 +22,8 @@ enum MemberType ProductType = 0x0F, InterpolationType = 0x10, PrepaidType = 0x11, - CarryOverType = 0x12 + CarryOverType = 0x12, + IncludesType = 0x13 }; #endif // MEMBER_TYPE_H_INCLUDED From 37aa10fc8576518fcd2883ef0044b9a09e91fde7 Mon Sep 17 00:00:00 2001 From: Gerhard Hoffmann Date: Tue, 6 May 2025 11:55:35 +0200 Subject: [PATCH 06/11] Add product FREE_TICKET. --- .../include/mobilisis/tariff_permit_type.h | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/library/include/mobilisis/tariff_permit_type.h b/library/include/mobilisis/tariff_permit_type.h index 4ccc675..6824ab4 100644 --- a/library/include/mobilisis/tariff_permit_type.h +++ b/library/include/mobilisis/tariff_permit_type.h @@ -19,7 +19,9 @@ enum class PERMIT_TYPE : quint8 { SHORT_TERM_PARKING_CAMPER=12, DAY_TICKET_PKW=13, DAY_TICKET_BUS=14, - DAY_TICKET_CAMPER=15 + DAY_TICKET_CAMPER=15, + FREE_TICKET=16, + PRODUCT_MAX }; struct PermitType { @@ -73,6 +75,9 @@ struct PermitType { case 15: m_permitType = PERMIT_TYPE::DAY_TICKET_CAMPER; break; + case 16: + m_permitType = PERMIT_TYPE::FREE_TICKET; + break; default: m_permitType = PERMIT_TYPE::INVALID; } @@ -116,6 +121,8 @@ struct PermitType { return 14; case PERMIT_TYPE::DAY_TICKET_CAMPER: return 15; + case PERMIT_TYPE::FREE_TICKET: + return 16; default: break; } @@ -132,9 +139,6 @@ struct PermitType { if (permitTypeStr == "DAY_TICKET_CHILD") { return PERMIT_TYPE::DAY_TICKET_CHILD; } else - if (permitTypeStr == "DAY_TICKET_ADULT") { - return PERMIT_TYPE::DAY_TICKET_ADULT; - } else if (permitTypeStr == "DAY_TICKET_TEEN") { return PERMIT_TYPE::DAY_TICKET_TEEN; } else @@ -170,6 +174,9 @@ struct PermitType { } else if (permitTypeStr == "DAY_TICKET_CAMPER") { return PERMIT_TYPE::DAY_TICKET_CAMPER; + } else + if (permitTypeStr == "FREE_TICKET") { + return PERMIT_TYPE::FREE_TICKET; } return PERMIT_TYPE::INVALID; @@ -207,6 +214,8 @@ struct PermitType { return QString("DAY_TICKET_BUS"); case PERMIT_TYPE::DAY_TICKET_CAMPER: return QString("DAY_TICKET_CAMPER"); + case PERMIT_TYPE::FREE_TICKET: + return QString("FREE_TICKET"); default: break; } @@ -245,6 +254,8 @@ struct PermitType { return QString("DAY_TICKET_BUS"); case PERMIT_TYPE::DAY_TICKET_CAMPER: return QString("DAY_TICKET_CAMPER"); + case PERMIT_TYPE::FREE_TICKET: + return QString("FREE_TICKET"); default: break; } From e172e814e7a4301a6a0466ada5066aca239d87a5 Mon Sep 17 00:00:00 2001 From: Gerhard Hoffmann Date: Tue, 6 May 2025 11:57:14 +0200 Subject: [PATCH 07/11] load and parse additional (included) tariff-files --- library/src/calculate_price.cpp | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/library/src/calculate_price.cpp b/library/src/calculate_price.cpp index acf8980..157bcd8 100644 --- a/library/src/calculate_price.cpp +++ b/library/src/calculate_price.cpp @@ -5,12 +5,15 @@ #include "utilities.h" #include "tariff_global_defines.h" #include "period_year.h" +#include "tariff_permit_type.h" #include #include #include #include #include +#include +#include QString const CalcState::SUCCESS = "SUCCESS"; QString const CalcState::ERROR_PARSING_ZONE_NR = "ERROR_PARSING_ZONE_NR"; @@ -28,6 +31,9 @@ QString const CalcState::OVERPAID = "OVERPAID"; QString const CalcState::OUTSIDE_ALLOWED_PARKING_TIME = "OUTSIDE_ALLOWED_PARKING_TIME"; QString const CalcState::SUCCESS_MAXPRICE = "SUCCESS_MAXPRICE"; + +static std::map> tariffs; + QList CALCULATE_LIBRARY_API get_time_steps(Configuration *cfg) { return Calculator::GetInstance().GetTimeSteps(cfg); } @@ -464,6 +470,31 @@ CalcState CALCULATE_LIBRARY_API init_tariff(parking_tariff_t **tariff, char cons qCritical() << "init_tariff: Parsing tariff config (" << confFile << ")"; + if ((*tariff)->TariffIncludes.size() > 0) { + qCritical() << "init_tariff: TariffIncludes" << (*tariff)->TariffIncludes; + for (int i = 0 ; i < (*tariff)->TariffIncludes.size(); ++i) { + QFile f(QString("/etc/psa_tariff/%1").arg((*tariff)->TariffIncludes.at(i))); + if (f.exists() && + f.open(QIODevice::ReadOnly | QIODevice::Text)) { + + QString json = f.readAll(); + std::unique_ptr t = std::make_unique(); + + if (! t->ParseJson(t.get(), json.toStdString().c_str())) { + qCritical() << " ... error parsing tariff in" << f.fileName(); + qCritical() << " ... json" << json; + } else { + PERMIT_TYPE pt = static_cast(t->getPaymentOptions().pop_product_id); + if (tariffs.count(pt) == 0) { + const auto [it, success] = tariffs.insert(std::make_pair(pt, std::move(t))); + qCritical() << " ... insertion" << success; + qCritical() << " ... insertion" << (int)it->first << it->second->getPaymentOptions().pop_product_name; + qCritical() << " ... insertion" << tariffs[pt]->getPaymentOptions().pop_product_name; + } + } + } + } + } return calcState; } From d95741baae559b15fe255191456a7b2099460de8 Mon Sep 17 00:00:00 2001 From: Gerhard Hoffmann Date: Tue, 6 May 2025 11:57:36 +0200 Subject: [PATCH 08/11] compute_duration_for_parking_ticket(): Switch to different tariff based on product-type/product-id. --- library/src/calculate_price.cpp | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/library/src/calculate_price.cpp b/library/src/calculate_price.cpp index 157bcd8..2d34c7b 100644 --- a/library/src/calculate_price.cpp +++ b/library/src/calculate_price.cpp @@ -1135,6 +1135,10 @@ CalcState CALCULATE_LIBRARY_API compute_duration_for_parking_ticket( QDateTime &ticketEndTime, PermitType permitType) { + if (tariffs.count(permitType) > 0) { + tariff = tariffs[permitType].get(); + } + tariff->getPaymentOptions(0).pop_max_price = tariff->getPaymentOptions(0).pop_max_price_save; @@ -1142,8 +1146,15 @@ CalcState CALCULATE_LIBRARY_API compute_duration_for_parking_ticket( bool prepaid = true; + qCritical() << __func__ << ":" << __LINE__ << " permit type (int): " << static_cast(permitType); + qCritical() << __func__ << ":" << __LINE__ << "permit type (string): " << permitType.toString(); + qCritical() << __func__ << ":" << __LINE__ << " tariff-includes: " << tariff->getTariffIncludes(); + int paymentOptionIndex = getPaymentOptionIndex(*tariff, start_parking_time); + qCritical() << __func__ << ":" << __LINE__ << "payment option index: " << paymentOptionIndex; + + if (paymentOptionIndex == -1) { paymentOptionIndex = tariff->getPaymentOptionIndex(permitType); } From edfa5dc1b1374115ce94fe1d92904758b75cd142 Mon Sep 17 00:00:00 2001 From: Gerhard Hoffmann Date: Tue, 6 May 2025 11:59:10 +0200 Subject: [PATCH 09/11] Minor: add case FREE_TICKET to prevent compiler warning. --- library/src/calculator_functions.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/library/src/calculator_functions.cpp b/library/src/calculator_functions.cpp index 4c8df6a..f889575 100644 --- a/library/src/calculator_functions.cpp +++ b/library/src/calculator_functions.cpp @@ -3696,6 +3696,9 @@ Calculator::GetDailyTicketPrice(Configuration* cfg, if (dailyTickets) { QVector const tickets = dailyTickets.value(); switch (permitType) { + case PERMIT_TYPE::FREE_TICKET: { + // TODO + } break; case PERMIT_TYPE::TWENTY_FOUR_HOURS_TICKET: { // TODO } break; From 35294e99f08df1a7dc061ed013219816ff669350 Mon Sep 17 00:00:00 2001 From: Gerhard Hoffmann Date: Tue, 6 May 2025 12:00:22 +0200 Subject: [PATCH 10/11] Parse possible Includes-section in tariff-file --- library/src/configuration.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/library/src/configuration.cpp b/library/src/configuration.cpp index 7324491..cf2dbee 100644 --- a/library/src/configuration.cpp +++ b/library/src/configuration.cpp @@ -46,6 +46,7 @@ MemberType Configuration::IdentifyJsonMember(const char* member_name) if (strcmp(member_name, "Interpolation") == 0) return MemberType::InterpolationType; if (strcmp(member_name, "Prepaid") == 0) return MemberType::PrepaidType; if (strcmp(member_name, "CarryOver") == 0) return MemberType::CarryOverType; + if (strcmp(member_name, "Includes") == 0) return MemberType::IncludesType; else return MemberType::UnknownType; } @@ -811,6 +812,7 @@ bool Configuration::ParseJson(Configuration* cfg, const char* json) ATBInterpolation TariffInterpolation; ATBPrepaid TariffPrepaidOption; ATBCarryOver TariffCarryOver; + QStringList TariffIncludes; MemberType mb_type = MemberType::UnknownType; this->currentPaymentOptions.clear(); @@ -1342,6 +1344,9 @@ bool Configuration::ParseJson(Configuration* cfg, const char* json) else if (strcmp(inner_obj_name, "pcu_minor") == 0) Currency.pcu_minor = k->value.GetString(); else if (strcmp(inner_obj_name, "pcu_active") == 0) Currency.pcu_active = k->value.GetBool(); break; + case MemberType::IncludesType: + TariffIncludes << k->value.GetString(); + break; case MemberType::PaymentMethodType: if (strcmp(inner_obj_name, "pme_id") == 0) PaymentMethod.pme_id = k->value.GetInt(); else if (strcmp(inner_obj_name, "pme_label") == 0) PaymentMethod.pme_label = k->value.GetString(); @@ -1631,6 +1636,9 @@ bool Configuration::ParseJson(Configuration* cfg, const char* json) cfg->TariffCarryOverOptions.insert(pair(TariffCarryOver.id, TariffCarryOver)); // qCritical() << TariffCarryOver; break; + case MemberType::IncludesType: + cfg->TariffIncludes = TariffIncludes; + // qCritical() << "TariffIncludes" << cfg->TariffIncludes; default: break; } From b4818a39189f49c26fafbd26ab56b86fc43de3f3 Mon Sep 17 00:00:00 2001 From: Gerhard Hoffmann Date: Thu, 8 May 2025 11:15:23 +0200 Subject: [PATCH 11/11] get_minimal_parkingtime() get_maximal_parkingtime() compute_product_price() get_maximal_parkingprice() compute_price_for_parking_ticket() compute_duration_for_parking_ticket() compute_duration_for_daily_ticket() compute_price_for_daily_ticket(): In case main-tariff file contains an Includes-section, change to the included tariff based on product-id (permit-type). --- library/src/calculate_price.cpp | 103 +++++++++++++++++++++++++++++++- 1 file changed, 100 insertions(+), 3 deletions(-) diff --git a/library/src/calculate_price.cpp b/library/src/calculate_price.cpp index 2d34c7b..0041d08 100644 --- a/library/src/calculate_price.cpp +++ b/library/src/calculate_price.cpp @@ -43,13 +43,24 @@ int CALCULATE_LIBRARY_API get_minimal_parkingtime(Configuration const *cfg, int paymentOptionIndex) { int minTime = 0; + // tariffs are only set if there is a Includes-section in the tariff-file, + // which means the code below will be executed only in such a case. + if (tariffs.count(permitType) > 0) { + Configuration *c = tariffs[permitType].get(); + if (c && c != cfg) { + cfg = c; + } + } + paymentOptionIndex = getPaymentOptionIndex(*cfg); if (paymentOptionIndex == -1) { paymentOptionIndex = cfg->getPaymentOptionIndex(permitType); } qCritical() << __func__ << __LINE__ << "paymentOptionIndex" << paymentOptionIndex; - qCritical() << __func__ << __LINE__ << "permit" << PermitType(permitType).toString(); + qCritical() << __func__ << __LINE__ << "permit" << (int)permitType << PermitType(permitType).toString(); + qCritical() << __func__ << __LINE__ << "min_time" << (int)permitType << cfg->getPaymentOptions(paymentOptionIndex).pop_min_time; + qCritical() << __func__ << __LINE__ << "min_price" << (int)permitType << cfg->getPaymentOptions(paymentOptionIndex).pop_min_price; switch(permitType) { case PERMIT_TYPE::SHORT_TERM_PARKING: { // e.g. szeged (customer_281) @@ -79,6 +90,15 @@ int CALCULATE_LIBRARY_API get_maximal_parkingtime(Configuration const *cfg, PERMIT_TYPE permitType, int paymentOptionIndex) { + // tariffs are only set if there is a Includes-section in the tariff-file, + // which means the code below will be executed only in such a case. + if (tariffs.count(permitType) > 0) { + Configuration *c = tariffs[permitType].get(); + if (c && c != cfg) { + cfg = c; + } + } + paymentOptionIndex = getPaymentOptionIndex(*cfg); if (paymentOptionIndex == -1) { paymentOptionIndex = cfg->getPaymentOptionIndex(permitType); @@ -109,6 +129,15 @@ int CALCULATE_LIBRARY_API get_minimal_parkingprice(Configuration *cfg, QDateTime const &start) { int minPrice = -1; + // tariffs are only set if there is a Includes-section in the tariff-file, + // which means the code below will be executed only in such a case. + if (tariffs.count(permitType) > 0) { + Configuration *c = tariffs[permitType].get(); + if (c && c != cfg) { + cfg = c; + } + } + if ((paymentOptionIndex = getPaymentOptionIndex(*cfg, start)) == -1) { paymentOptionIndex = cfg->getPaymentOptionIndex(permitType); } @@ -173,6 +202,14 @@ int CALCULATE_LIBRARY_API compute_product_price(Configuration const *cfg, QDateTime const &start, QDateTime *productStart, QDateTime *productEnd) { + // tariffs are only set if there is a Includes-section in the tariff-file, + // which means the code below will be executed only in such a case. + if (tariffs.count(permitType) > 0) { + Configuration *c = tariffs[permitType].get(); + if (c && c != cfg) { + cfg = c; + } + } switch(permitType) { case PERMIT_TYPE::SHORT_TERM_PARKING: { // e.g. szeged (customer_281) @@ -336,6 +373,16 @@ int CALCULATE_LIBRARY_API get_maximal_parkingprice(Configuration *cfg, PERMIT_TYPE permitType, int paymentOptionIndex) { int maxPrice = -1; + + // tariffs are only set if there is a Includes-section in the tariff-file, + // which means the code below will be executed only in such a case. + if (tariffs.count(permitType) > 0) { + Configuration *c = tariffs[permitType].get(); + if (c && c != cfg) { + cfg = c; + } + } + static const PaymentMethod paymentMethodId = Utilities::getPaymentMethodId(cfg); if ((paymentOptionIndex = getPaymentOptionIndex(*cfg)) == -1) { @@ -724,6 +771,15 @@ CalcState CALCULATE_LIBRARY_API compute_price_for_parking_ticket( start = start.toLocalTime().addSecs(start_parking_time * 60); QDateTime end(start); + // tariffs are only set if there is a Includes-section in the tariff-file, + // which means the code below will be executed only in such a case. + if (tariffs.count(permitType) > 0) { + parking_tariff_t *t = tariffs[permitType].get(); + if (t && t != tariff) { + tariff = t; + } + } + int paymentOptionIndex = getPaymentOptionIndex(*tariff, start); if (paymentOptionIndex == -1) { paymentOptionIndex = tariff->getPaymentOptionIndex(permitType.get()); @@ -799,6 +855,15 @@ CalcState CALCULATE_LIBRARY_API compute_price_for_parking_ticket( QDateTime start_parking_time(start_parking_time_); + // tariffs are only set if there is a Includes-section in the tariff-file, + // which means the code below will be executed only in such a case. + if (tariffs.count(permitType) > 0) { + parking_tariff_t *t = tariffs[permitType].get(); + if (t && t != tariff) { + tariff = t; + } + } + int paymentOptionIndex = getPaymentOptionIndex(*tariff, start_parking_time); if (paymentOptionIndex == -1) { paymentOptionIndex = tariff->getPaymentOptionIndex(permitType); @@ -1077,6 +1142,15 @@ CalcState CALCULATE_LIBRARY_API compute_duration_for_parking_ticket( QString &duration, PermitType permitType) { + // tariffs are only set if there is a Includes-section in the tariff-file, + // which means the code below will be executed only in such a case. + if (tariffs.count(permitType) > 0) { + parking_tariff_t *t = tariffs[permitType].get(); + if (t && t != tariff) { + tariff = t; + } + } + tariff->getPaymentOptions(0).pop_max_price = tariff->getPaymentOptions(0).pop_max_price_save; @@ -1135,8 +1209,13 @@ CalcState CALCULATE_LIBRARY_API compute_duration_for_parking_ticket( QDateTime &ticketEndTime, PermitType permitType) { + // tariffs are only set if there is a Includes-section in the tariff-file, + // which means the code below will be executed only in such a case. if (tariffs.count(permitType) > 0) { - tariff = tariffs[permitType].get(); + parking_tariff_t *t = tariffs[permitType].get(); + if (t && t != tariff) { + tariff = t; + } } tariff->getPaymentOptions(0).pop_max_price @@ -1474,8 +1553,17 @@ CalcState CALCULATE_LIBRARY_API compute_duration_for_parking_ticket( CalcState CALCULATE_LIBRARY_API compute_duration_for_daily_ticket(parking_tariff_t *tariff, QDateTime const &start_parking_time, QDateTime &ticketEndTime, - PermitType /* PermitType */) + PermitType permitType) { + // tariffs are only set if there is a Includes-section in the tariff-file, + // which means the code below will be executed only in such a case. + if (tariffs.count(permitType) > 0) { + parking_tariff_t *t = tariffs[permitType].get(); + if (t && t != tariff) { + tariff = t; + } + } + tariff->getPaymentOptions(0).pop_max_price = tariff->getPaymentOptions(0).pop_max_price_save; @@ -1511,6 +1599,15 @@ CalcState CALCULATE_LIBRARY_API compute_price_for_daily_ticket( PERMIT_TYPE permitType, struct price_t *price) {// return value + // tariffs are only set if there is a Includes-section in the tariff-file, + // which means the code below will be executed only in such a case. + if (tariffs.count(permitType) > 0) { + parking_tariff_t *t = tariffs[permitType].get(); + if (t && t != tariff) { + tariff = t; + } + } + tariff->getPaymentOptions(0).pop_max_price = tariff->getPaymentOptions(0).pop_max_price_save;