Compare commits

...

3 Commits

2 changed files with 88 additions and 59 deletions

View File

@ -87,7 +87,6 @@ bool Configuration::ParseJson(Configuration* cfg, const char* json)
ATBSpecialDays SpecialDays; ATBSpecialDays SpecialDays;
ATBWeekDays WeekDays; ATBWeekDays WeekDays;
ATBWeekDaysWorktime WeekDaysWorktime; ATBWeekDaysWorktime WeekDaysWorktime;
ATBPaymentOption PaymentOption;
ATBPeriodYear YearPeriod; ATBPeriodYear YearPeriod;
ATBDailyTicket DailyTicket; ATBDailyTicket DailyTicket;
ATBTimeBase TimeBase; ATBTimeBase TimeBase;
@ -96,6 +95,7 @@ bool Configuration::ParseJson(Configuration* cfg, const char* json)
ATBTimeStepConfig TimeStepConfig; ATBTimeStepConfig TimeStepConfig;
MemberType mb_type = MemberType::UnknownType; MemberType mb_type = MemberType::UnknownType;
this->currentPaymentOptions.clear();
// Get all JSON object members // Get all JSON object members
// This code should run only once (to load JSON variables into memory) // This code should run only once (to load JSON variables into memory)
@ -320,22 +320,37 @@ bool Configuration::ParseJson(Configuration* cfg, const char* json)
else if (strcmp(inner_obj_name, "pra_price") == 0) PaymentRate.pra_price = k->value.GetDouble(); else if (strcmp(inner_obj_name, "pra_price") == 0) PaymentRate.pra_price = k->value.GetDouble();
break; break;
case MemberType::PaymentOptionType: case MemberType::PaymentOptionType:
if (strcmp(inner_obj_name, "pop_id") == 0) PaymentOption.pop_id = k->value.GetInt(); if (strcmp(inner_obj_name, "pop_id") == 0) {
else if (strcmp(inner_obj_name, "pop_label") == 0) PaymentOption.pop_label = k->value.GetString(); this->currentPaymentOptions.append(ATBPaymentOption());
else if (strcmp(inner_obj_name, "pop_payment_method_id") == 0) PaymentOption.pop_payment_method_id = k->value.GetInt(); this->currentPaymentOptions.last().reset();
else if (strcmp(inner_obj_name, "pop_day_end_time") == 0) PaymentOption.pop_day_end_time = k->value.GetString(); this->currentPaymentOptions.last().pop_id = k->value.GetInt();
else if (strcmp(inner_obj_name, "pop_day_night_end_time") == 0) PaymentOption.pop_day_night_end_time = k->value.GetString(); } else if (strcmp(inner_obj_name, "pop_label") == 0) {
else if (strcmp(inner_obj_name, "pop_price_night") == 0) PaymentOption.pop_price_night = k->value.GetDouble(); this->currentPaymentOptions.last().pop_label = k->value.GetString();
else if (strcmp(inner_obj_name, "pop_min_time") == 0) PaymentOption.pop_min_time = k->value.GetDouble(); } else if (strcmp(inner_obj_name, "pop_payment_method_id") == 0) {
else if (strcmp(inner_obj_name, "pop_max_time") == 0) PaymentOption.pop_max_time = k->value.GetDouble(); this->currentPaymentOptions.last().pop_payment_method_id = k->value.GetInt();
else if (strcmp(inner_obj_name, "pop_min_price") == 0) PaymentOption.pop_min_price = k->value.GetDouble(); } else if (strcmp(inner_obj_name, "pop_day_end_time") == 0) {
else if (strcmp(inner_obj_name, "pop_carry_over") == 0) PaymentOption.pop_carry_over = k->value.GetInt(); this->currentPaymentOptions.last().pop_day_end_time = k->value.GetString();
else if (strcmp(inner_obj_name, "pop_carry_over_time_range_id") == 0) PaymentOption.pop_carry_over_time_range_id = k->value.GetInt(); } else if (strcmp(inner_obj_name, "pop_day_night_end_time") == 0) {
else if (strcmp(inner_obj_name, "pop_daily_card_price") == 0) PaymentOption.pop_daily_card_price = k->value.GetInt(); this->currentPaymentOptions.last().pop_day_night_end_time = k->value.GetString();
else if (strcmp(inner_obj_name, "pop_business_hours") == 0) PaymentOption.pop_business_hours = k->value.GetInt(); } else if (strcmp(inner_obj_name, "pop_price_night") == 0) {
else if (strcmp(inner_obj_name, "pop_time_step_config") == 0) PaymentOption.pop_time_step_config = k->value.GetInt(); this->currentPaymentOptions.last().pop_price_night = k->value.GetDouble();
this->currentPaymentOptions.append(PaymentOption); } else if (strcmp(inner_obj_name, "pop_min_time") == 0) {
PaymentOption.reset(); this->currentPaymentOptions.last().pop_min_time = k->value.GetDouble();
} else if (strcmp(inner_obj_name, "pop_max_time") == 0) {
this->currentPaymentOptions.last().pop_max_time = k->value.GetDouble();
} else if (strcmp(inner_obj_name, "pop_min_price") == 0) {
this->currentPaymentOptions.last().pop_min_price = k->value.GetDouble();
} else if (strcmp(inner_obj_name, "pop_carry_over") == 0) {
this->currentPaymentOptions.last().pop_carry_over = k->value.GetInt();
} else if (strcmp(inner_obj_name, "pop_carry_over_time_range_id") == 0) {
this->currentPaymentOptions.last().pop_carry_over_time_range_id = k->value.GetInt();
} else if (strcmp(inner_obj_name, "pop_daily_card_price") == 0) {
this->currentPaymentOptions.last().pop_daily_card_price = k->value.GetInt();
} else if (strcmp(inner_obj_name, "pop_business_hours") == 0) {
this->currentPaymentOptions.last().pop_business_hours = k->value.GetInt();
} else if (strcmp(inner_obj_name, "pop_time_step_config") == 0) {
this->currentPaymentOptions.last().pop_time_step_config = k->value.GetInt();
}
break; break;
case MemberType::DurationType: case MemberType::DurationType:
if (strcmp(inner_obj_name, "pun_id") == 0) Duration.pun_id = k->value.GetInt(); if (strcmp(inner_obj_name, "pun_id") == 0) Duration.pun_id = k->value.GetInt();
@ -397,9 +412,12 @@ bool Configuration::ParseJson(Configuration* cfg, const char* json)
// qCritical() << "PaymentRate" << PaymentRate; // qCritical() << "PaymentRate" << PaymentRate;
cfg->PaymentRate.insert(pair<int, ATBPaymentRate>(PaymentRate.pra_payment_option_id, PaymentRate)); cfg->PaymentRate.insert(pair<int, ATBPaymentRate>(PaymentRate.pra_payment_option_id, PaymentRate));
break; break;
case MemberType::PaymentOptionType: case MemberType::PaymentOptionType: {
cfg->PaymentOption.insert(pair<int, ATBPaymentOption>(PaymentOption.pop_payment_method_id, PaymentOption)); if (!this->currentPaymentOptions.isEmpty()) {
break; ATBPaymentOption const &PaymentOption = this->currentPaymentOptions.last();
cfg->PaymentOption.insert(pair<int, ATBPaymentOption>(PaymentOption.pop_payment_method_id, PaymentOption));
}
} break;
case MemberType::DurationType: case MemberType::DurationType:
cfg->Duration.insert(pair<int, ATBDuration>(Duration.pun_id, Duration)); cfg->Duration.insert(pair<int, ATBDuration>(Duration.pun_id, Duration));
break; break;
@ -453,10 +471,12 @@ bool Configuration::ParseJson(Configuration* cfg, const char* json)
} }
ATBPaymentOption const &Configuration::getPaymentOptions() const { ATBPaymentOption const &Configuration::getPaymentOptions() const {
Q_ASSERT(!this->currentPaymentOptions.isEmpty());
return this->currentPaymentOptions.at(0); return this->currentPaymentOptions.at(0);
} }
ATBPaymentOption &Configuration::getPaymentOptions() { ATBPaymentOption &Configuration::getPaymentOptions() {
Q_ASSERT(!this->currentPaymentOptions.isEmpty());
return this->currentPaymentOptions[0]; return this->currentPaymentOptions[0];
} }
@ -479,7 +499,7 @@ Configuration::getDailyTicketsForAllKeys() const {
} }
if (tickets.size() > 0) { if (tickets.size() > 0) {
value.value_or(tickets); value = value.value_or(tickets);
} }
return value; return value;
@ -490,18 +510,14 @@ Configuration::getDailyTicketsForKey(int key) const {
QVector<ATBDailyTicket> tickets; QVector<ATBDailyTicket> tickets;
std::optional<QVector<ATBDailyTicket>> value; std::optional<QVector<ATBDailyTicket>> value;
std::pair< tickets.clear();
std::multimap<int, ATBDailyTicket>::const_iterator,
std::multimap<int, ATBDailyTicket>::const_iterator
> p = this->DailyTicket.equal_range(key);
for (std::multimap<int, ATBDailyTicket>::const_iterator it = p.first; for (auto[it, rangeEnd] = this->DailyTicket.equal_range(key); it != rangeEnd; ++it) {
it != p.second; ++it) {
tickets.append(it->second); tickets.append(it->second);
} }
if (tickets.size() > 0) { if (tickets.size() > 0) {
value.value_or(tickets); value = value.value_or(tickets);
} }
return value; return value;
@ -518,7 +534,7 @@ Configuration::getPaymentRateForAllKeys() const {
} }
if (paymentRates.size() > 0) { if (paymentRates.size() > 0) {
value.value_or(paymentRates); value = value.value_or(paymentRates);
} }
return value; return value;
@ -530,18 +546,14 @@ Configuration::getPaymentRateForKey(int key) const {
QVector<ATBPaymentRate> paymentRate; QVector<ATBPaymentRate> paymentRate;
std::optional<QVector<ATBPaymentRate>> value; std::optional<QVector<ATBPaymentRate>> value;
std::pair< paymentRate.clear();
std::multimap<int, ATBPaymentRate>::const_iterator,
std::multimap<int, ATBPaymentRate>::const_iterator
> p = this->PaymentRate.equal_range(key);
for (std::multimap<int, ATBPaymentRate>::const_iterator it = p.first; for (auto[it, rangeEnd] = this->PaymentRate.equal_range(key); it != rangeEnd; ++it) {
it != p.second; ++it) {
paymentRate.append(it->second); paymentRate.append(it->second);
} }
if (paymentRate.size() > 0) { if (paymentRate.size() > 0) {
value.value_or(paymentRate); value = value.value_or(paymentRate);
} }
return value; return value;
@ -570,7 +582,7 @@ Configuration::getWeekDayWorkTime(QTime const &time, Qt::DayOfWeek dayOfWeek) {
ATBWeekDaysWorktime const &wt = it->second; ATBWeekDaysWorktime const &wt = it->second;
if (QTime::fromString(wt.pwd_time_from.c_str(), Qt::ISODate) >= time if (QTime::fromString(wt.pwd_time_from.c_str(), Qt::ISODate) >= time
&& QTime::fromString(wt.pwd_time_to.c_str(), Qt::ISODate) < time) { && QTime::fromString(wt.pwd_time_to.c_str(), Qt::ISODate) < time) {
value.value_or(wt); value = value.value_or(wt);
} }
} }

View File

@ -31,13 +31,13 @@ extern "C" char* strptime(const char* s,
#include <fstream> #include <fstream>
#include <sstream> #include <sstream>
#include "calculator_functions.h" #include "calculator_functions.h"
#include <calculate_price.h> #include "calculate_price.h"
#define SZEGED (0) #define SZEGED (1)
#define SCHOENAU_KOENIGSEE (0) #define SCHOENAU_KOENIGSEE (0)
#define NEUHAUSER_KORNEUBURG (0) #define NEUHAUSER_KORNEUBURG (0)
#define NEUHAUSER_LINSINGER_MASCHINENBAU (0) #define NEUHAUSER_LINSINGER_MASCHINENBAU (0)
#define NEUHAUSER_NORDISCHES_AUSBILDUNGSZENTRUM (1) #define NEUHAUSER_NORDISCHES_AUSBILDUNGSZENTRUM (0)
#define NEUHAUSER_BILEXA_GALTUER (0) #define NEUHAUSER_BILEXA_GALTUER (0)
@ -230,33 +230,37 @@ int main() {
#elif SZEGED==1 #elif SZEGED==1
std::ifstream input; std::ifstream input;
int pop_min_time;
int pop_max_time; int pop_max_time;
int pop_min_price;
int pop_max_price;
for (int t=6; t < 7; t+=20) { for (int t=2; t < 3; ++t) {
//for (int t=6; t < 7; t+=20) {
switch (t) { switch (t) {
case 1: { case 1: {
input.open("/opt/ptu5/opt/customer_281/etc/psa_tariff/tariff01.json"); input.open("/opt/ptu5/opt/customer_281/etc/psa_tariff/tariff01.json");
pop_max_time = 6*60; //pop_max_time = 6*60;
} break; } break;
case 2: { case 2: {
input.open("/opt/ptu5/opt/customer_281/etc/psa_tariff/tariff02.json"); input.open("/opt/ptu5/opt/customer_281/etc/psa_tariff/tariff02.json");
pop_max_time = 5*60; //pop_max_time = 5*60;
} break; } break;
case 3: { case 3: {
input.open("/opt/ptu5/opt/customer_281/etc/psa_tariff/tariff03.json"); input.open("/opt/ptu5/opt/customer_281/etc/psa_tariff/tariff03.json");
pop_max_time = 6*60; //pop_max_time = 6*60;
} break; } break;
case 4: { case 4: {
input.open("/opt/ptu5/opt/customer_281/etc/psa_tariff/tariff04.json"); input.open("/opt/ptu5/opt/customer_281/etc/psa_tariff/tariff04.json");
pop_max_time = 4*60; //pop_max_time = 4*60;
} break; } break;
case 5: { case 5: {
input.open("/opt/ptu5/opt/customer_281/etc/psa_tariff/tariff05.json"); input.open("/opt/ptu5/opt/customer_281/etc/psa_tariff/tariff05.json");
pop_max_time = 6*60; //pop_max_time = 6*60;
} break; } break;
case 6: { case 6: {
input.open("/opt/ptu5/opt/customer_281/etc/psa_tariff/tariff06.json"); input.open("/opt/ptu5/opt/customer_281/etc/psa_tariff/tariff06.json");
pop_max_time = 4*60; //pop_max_time = 4*60;
} break; } break;
default: default:
continue; continue;
@ -265,13 +269,24 @@ int main() {
while(input >> sstr.rdbuf()); while(input >> sstr.rdbuf());
std::string json(sstr.str()); std::string json(sstr.str());
Calculator calculator;
Configuration cfg; Configuration cfg;
bool isParsed = cfg.ParseJson(&cfg, json.c_str()); bool isParsed = cfg.ParseJson(&cfg, json.c_str());
cout << endl; cout << endl;
if (isParsed) { if (isParsed) {
// test library functions
pop_min_time = get_minimal_parkingtime(&cfg);
pop_max_time = get_maximal_parkingtime(&cfg);
pop_min_price = get_minimal_parkingprice(&cfg);
pop_max_price = get_maximal_parkingprice(&cfg);
qCritical() << " pop_min_time: " << pop_min_time;
qCritical() << " pop_max_time: " << pop_max_time;
qCritical() << "pop_min_price: " << pop_min_price;
qCritical() << "pop_max_price: " << pop_max_price;
{ {
// zone 1 (lila) // zone 1 (lila)
QDateTime s(QDate(2023, 11, 30), QTime()); QDateTime s(QDate(2023, 11, 30), QTime());
@ -279,17 +294,17 @@ int main() {
for (int duration = 15; duration <= pop_max_time; duration += 5) { for (int duration = 15; duration <= pop_max_time; duration += 5) {
for (int offset = 480; offset < 1080; ++offset) { for (int offset = 480; offset < 1080; ++offset) {
QDateTime start = s.addSecs(offset * 60); QDateTime start = s.addSecs(offset * 60);
//qCritical() << "start" << start.toString(Qt::ISODate); // qCritical() << "start" << start.toString(Qt::ISODate);
double cost = calculator.GetCostFromDuration(&cfg, 3, start, end, duration); double cost = Calculator::GetInstance().GetCostFromDuration(&cfg, 3, start, end, duration);
//Q_ASSERT(cost == duration*2.5); // Q_ASSERT(cost == duration*2.5);
//qCritical() << ""; qCritical() << "";
//qCritical() << "start" << start.toString(Qt::ISODate) qCritical() << "start" << start.toString(Qt::ISODate)
// << "end" << end.toString(Qt::ISODate) << "end" << end.toString(Qt::ISODate)
// << "duration" << duration << "duration" << duration
// << "cost" << cost; << "cost" << cost;
std::string duration = calculator.GetDurationFromCost(&cfg, 3, start.toString(Qt::ISODate).toStdString().c_str(), cost); std::string duration = Calculator::GetInstance().GetDurationFromCost(&cfg, 3, start.toString(Qt::ISODate).toStdString().c_str(), cost);
//Q_ASSERT(cost == duration*2.5); //Q_ASSERT(cost == duration*2.5);
qCritical() << "start" << start.toString(Qt::ISODate) qCritical() << "start" << start.toString(Qt::ISODate)
<< "cost" << cost << "cost" << cost
@ -297,20 +312,22 @@ int main() {
} }
} }
} }
#if 0
{ {
QDateTime start(QDate(2023, 12, 1), QTime(18, 0)); QDateTime start(QDate(2023, 12, 1), QTime(18, 0));
QDateTime end; QDateTime end;
double cost = calculator.GetCostFromDuration(&cfg, 3, start, end, 60); double cost = Calculator::GetInstance().GetCostFromDuration(&cfg, 3, start, end, 60);
// Q_ASSERT(cost == 150); // Q_ASSERT(cost == 150);
qCritical() << "end" << end.toString(Qt::ISODate) << "cost" << cost; qCritical() << "end" << end.toString(Qt::ISODate) << "cost" << cost;
} }
{ {
QDateTime start(QDate(2023, 10, 31), QTime(18, 0)); QDateTime start(QDate(2023, 10, 31), QTime(18, 0));
QDateTime end; QDateTime end;
double cost = calculator.GetCostFromDuration(&cfg, 3, start, end, 60); double cost = Calculator::GetInstance().GetCostFromDuration(&cfg, 3, start, end, 60);
//Q_ASSERT(cost == 150); //Q_ASSERT(cost == 150);
qCritical() << "end" << end.toString(Qt::ISODate) << "cost" << cost; qCritical() << "end" << end.toString(Qt::ISODate) << "cost" << cost;
} }
#endif
} }
} }