diff --git a/library/src/configuration.cpp b/library/src/configuration.cpp index a1370a7..fc42b5d 100644 --- a/library/src/configuration.cpp +++ b/library/src/configuration.cpp @@ -6,6 +6,7 @@ #include "tariff_permit_type.h" #include "tariff_business_hours.h" #include "tariff_global_defines.h" +#include "tariff_carryover.h" #include #include @@ -14,75 +15,78 @@ /// MemberType Configuration::IdentifyJsonMember(const char* member_name) { - if (strcmp(member_name, "Currency") == 0) return MemberType::CurrencyType; - if (strcmp(member_name, "PaymentMethod") == 0) return MemberType::PaymentMethodType; - if (strcmp(member_name, "PaymentRate") == 0) return MemberType::PaymentRateType; - if (strcmp(member_name, "PaymentOption") == 0) return MemberType::PaymentOptionType; - if (strcmp(member_name, "Duration") == 0) return MemberType::DurationType; - //if (strcmp(member_name, "WeekDays") == 0) return MemberType::WeekDaysType; - if (strcmp(member_name, "WeekDaysWorktime") == 0) return MemberType::WeekDaysWorkTimeType; - if (strcmp(member_name, "SpecialDaysWorktime") == 0) return MemberType::SpecialDaysWorktimeType; - if (strcmp(member_name, "SpecialDays") == 0) return MemberType::SpecialDaysType; - if (strcmp(member_name, "PeriodYear") == 0) return MemberType::PeriodYearType; + if (strcmp(member_name, "Currency") == 0) return MemberType::CurrencyType; + if (strcmp(member_name, "PaymentMethod") == 0) return MemberType::PaymentMethodType; + if (strcmp(member_name, "PaymentRate") == 0) return MemberType::PaymentRateType; + if (strcmp(member_name, "PaymentOption") == 0) return MemberType::PaymentOptionType; + if (strcmp(member_name, "Duration") == 0) return MemberType::DurationType; + //if (strcmp(member_name, "WeekDays") == 0) return MemberType::WeekDaysType; + if (strcmp(member_name, "WeekDaysWorktime") == 0) return MemberType::WeekDaysWorkTimeType; + if (strcmp(member_name, "SpecialDaysWorktime") == 0) return MemberType::SpecialDaysWorktimeType; + if (strcmp(member_name, "SpecialDays") == 0) return MemberType::SpecialDaysType; + if (strcmp(member_name, "PeriodYear") == 0) return MemberType::PeriodYearType; if (strcmp(member_name, "DailyTicket") == 0) return MemberType::DailyTicketType; if (strcmp(member_name, "TimeBase") == 0) return MemberType::TimeBaseType; if (strcmp(member_name, "Customer") == 0) return MemberType::CustomerType; if (strcmp(member_name, "TimeRange") == 0) return MemberType::TimeRangeType; if (strcmp(member_name, "TimeStepConfig") == 0) return MemberType::TimeStepConfigType; if (strcmp(member_name, "Product") == 0) return MemberType::ProductType; + 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; else return MemberType::UnknownType; } /// bool Configuration::ParseJson(Configuration* cfg, const char* json) { - try - { - if (cfg == nullptr) - { - printf("TariffConfiguration pointer not set\n"); - return false; - } - if (json == NULL) - { - printf("%s", "Input JSON string is NULL\n"); - return false; - } + try + { + if (cfg == nullptr) + { + printf("TariffConfiguration pointer not set\n"); + return false; + } + if (json == NULL) + { + printf("%s", "Input JSON string is NULL\n"); + return false; + } - // Parse JSON to document - Document document; - document.Parse(json); + // Parse JSON to document + Document document; + document.Parse(json); - // Return if parse error has been found - ParseErrorCode err = document.GetParseError(); - if (err != 0) - { - printf("%s %d (%s)\n", "Unable to parse JSON, error code:", err, GetParseError_En(err)); - return false; - } + // Return if parse error has been found + ParseErrorCode err = document.GetParseError(); + if (err != 0) + { + printf("%s %d (%s)\n", "Unable to parse JSON, error code:", err, GetParseError_En(err)); + return false; + } - // Validate JSON, check if it's a JSON object + // Validate JSON, check if it's a JSON object qCritical() << "JSON parsing has been successful"; - if (!document.IsObject()) { - printf("%s", "Error: not a (valid) JSON object\n"); - return false; - } + if (!document.IsObject()) { + printf("%s", "Error: not a (valid) JSON object\n"); + return false; + } qCritical() << "Valid JSON object identified"; - // Validate JSON, check configuration members - if (!document.HasMember("Currency") - || !document.HasMember("PaymentMethod") - || !document.HasMember("PaymentOption") - || !document.HasMember("PaymentRate") - || !document.HasMember("Duration") - //|| !document.HasMember("WeekDays") + // Validate JSON, check configuration members + if (!document.HasMember("Currency") + || !document.HasMember("PaymentMethod") + || !document.HasMember("PaymentOption") + || !document.HasMember("PaymentRate") + || !document.HasMember("Duration") + //|| !document.HasMember("WeekDays") //|| !document.HasMember("SpecialDaysWorktime") //|| !document.HasMember("SpecialDays") ) - { - printf("%s", "Error: not a valid configuration JSON\n"); - return false; - } + { + printf("%s", "Error: not a valid configuration JSON\n"); + return false; + } qCritical() << "Valid JSON configuration identified"; ATBCurrency Currency; @@ -100,16 +104,19 @@ bool Configuration::ParseJson(Configuration* cfg, const char* json) ATBTimeRange TimeRange; ATBTimeStepConfig TimeStepConfig; ATBTariffProduct TariffProduct; + ATBInterpolation TariffInterpolation; + ATBPrepaid TariffPrepaidOption; + ATBCarryOver TariffCarryOver; MemberType mb_type = MemberType::UnknownType; this->currentPaymentOptions.clear(); - // Get all JSON object members - // This code should run only once (to load JSON variables into memory) - for (auto i = document.MemberBegin(); i != document.MemberEnd(); i++) - { - // Get name of all general members of JSON, don't print name if NULL - const char* mb_name = i->name.GetString(); + // Get all JSON object members + // This code should run only once (to load JSON variables into memory) + for (auto i = document.MemberBegin(); i != document.MemberEnd(); i++) + { + // Get name of all general members of JSON, don't print name if NULL + const char* mb_name = i->name.GetString(); if (mb_name == NULL) continue; if (document[mb_name].IsString()) { @@ -135,35 +142,196 @@ bool Configuration::ParseJson(Configuration* cfg, const char* json) qCritical() << " -" << mb_name; - // Get array for each JSON object member - auto mb_array = document[mb_name].GetArray(); - if (mb_array.Size() <= 0) break; + // Get array for each JSON object member + auto mb_array = document[mb_name].GetArray(); + if (mb_array.Size() <= 0) break; - //Iterate over provided array + //Iterate over provided array for (rapidjson::SizeType j = 0; j < mb_array.Size(); j++) - { - // Get all inner objects, don't print name if NULL - auto inner_obj = mb_array[j].GetObject(); - if (inner_obj.MemberCount() <= 0) break; + { + // Get all inner objects, don't print name if NULL + auto inner_obj = mb_array[j].GetObject(); + if (inner_obj.MemberCount() <= 0) break; - // Iterate over inner object JSON members - for (auto k = inner_obj.MemberBegin(); k != inner_obj.MemberEnd(); k++) - { - // Get inner object JSON member, don't print name if NULL - const char* inner_obj_name = k->name.GetString(); - if (inner_obj_name == NULL) - { - printf("Inner object name is NULL\n"); - continue; - } + // Iterate over inner object JSON members + for (auto k = inner_obj.MemberBegin(); k != inner_obj.MemberEnd(); k++) + { + // Get inner object JSON member, don't print name if NULL + const char* inner_obj_name = k->name.GetString(); + if (inner_obj_name == NULL) + { + printf("Inner object name is NULL\n"); + continue; + } - // Identify member type - mb_type = IdentifyJsonMember(mb_name); + // Identify member type + mb_type = IdentifyJsonMember(mb_name); - switch (mb_type) - { - case MemberType::UnknownType: - break; + switch (mb_type) + { + case MemberType::UnknownType: + break; + case MemberType::CarryOverType: { + if (QString(inner_obj_name) == QString("carry_over_id")) { + if (k->value.IsInt()) { + int const &x = k->value.GetInt(); + TariffCarryOver.id = x; + } + } else + if (QString(inner_obj_name) == QString("carry_over_week")) { + if (k->value.IsArray()) { + auto days = k->value.GetArray(); + for (rapidjson::SizeType j=0; j < days.Size(); ++j) { + if (days[j].IsObject()) { + auto weekday = days[j].GetObject(); + for (auto w = weekday.MemberBegin(); w != weekday.MemberEnd(); ++w) { + int day = j+1; // 8 entries + QString member(QString::fromStdString(w->name.GetString())); + if (member == "carry_over_day") { + if (w->value.IsInt()) { + rapidjson::SizeType const d = w->value.GetInt(); + if (d != (j+1)) { + qCritical() << "ERROR: misconfigured jsonfile" << d << "!=" << (j+1); + } + TariffCarryOver.carryover[day].day = day; + } + } else + if (member == "carry_over_seemless") { + if (w->value.IsBool()) { + bool b = w->value.GetBool(); + TariffCarryOver.carryover[day].seemless = b; + } + } else + if (member == "carry_over_never") { + if (w->value.IsBool()) { + bool b = w->value.GetBool(); + TariffCarryOver.carryover[day].never = b; + } + } else + if (member == "carry_over_static_start") { + if (w->value.IsString()) { + QTime const &t = QTime::fromString(w->value.GetString(), Qt::ISODate); + TariffCarryOver.carryover[day].static_start = t; + } + } else + if (member == "carry_over_static_end") { + if (w->value.IsString()) { + QTime const &t = QTime::fromString(w->value.GetString(), Qt::ISODate); + TariffCarryOver.carryover[day].static_end = t; + } + } + } + } + } + } + } + } break; + case MemberType::PrepaidType: { + if (QString(inner_obj_name) == QString("prepaid_id")) { + if (k->value.IsInt()) { + int const &x = k->value.GetInt(); + TariffPrepaidOption.id = x; + } + } else + if (QString(inner_obj_name) == QString("prepaid_anytime")) { + if (k->value.IsBool()) { + bool const &x = k->value.GetBool(); + TariffPrepaidOption.anytime = x; + } + } else + if (QString(inner_obj_name) == QString("prepaid_never")) { + if (k->value.IsBool()) { + bool const &x = k->value.GetBool(); + TariffPrepaidOption.never = x; + } + } else + if (QString(inner_obj_name) == QString("prepaid_static_start")) { + if (k->value.IsString()) { + QTime const &t = QTime::fromString(k->value.GetString(), Qt::ISODate); + TariffPrepaidOption.static_start = t; + } + } else + if (QString(inner_obj_name) == QString("prepaid_static_end")) { + if (k->value.IsString()) { + QTime const &t = QTime::fromString(k->value.GetString(), Qt::ISODate); + TariffPrepaidOption.static_end = t; + } + } + } break; + case MemberType::InterpolationType: { + if (QString(inner_obj_name) == QString("interpol_id")) { + if (k->value.IsInt()) { + int const &x = k->value.GetInt(); + TariffInterpolation.id = x; + } + } else + if (QString(inner_obj_name) == QString("interpol_static_start")) { + if (k->value.IsString()) { + QTime const &t = QTime::fromString(k->value.GetString(), Qt::ISODate); + TariffInterpolation.static_start = t; + } + } else + if (QString(inner_obj_name) == QString("interpol_static_end")) { + if (k->value.IsString()) { + QTime const &t = QTime::fromString(k->value.GetString(), Qt::ISODate); + TariffInterpolation.static_end = t; + } + } else + if (QString(inner_obj_name) == QString("interpol_static_start_str")) { + if (k->value.IsString()) { + QString const &s = k->value.GetString(); + TariffInterpolation.static_start_str = s; + } + } else + if (QString(inner_obj_name) == QString("interpol_static_end_str")) { + if (k->value.IsString()) { + QString const &s = k->value.GetString(); + TariffInterpolation.static_end_str = s; + } + } else + if (QString(inner_obj_name) == QString("interpol_static_duration")) { + if (k->value.IsInt()) { + int const x = k->value.GetInt(); + TariffInterpolation.static_duration = x; + } + } else + if (QString(inner_obj_name) == QString("interpol_dynamic_start")) { + if (k->value.IsString()) { + QTime const &t = QTime::fromString(k->value.GetString(), Qt::ISODate); + TariffInterpolation.dynamic_start = t; + } + } else + if (QString(inner_obj_name) == QString("interpol_dynamic_end")) { + if (k->value.IsString()) { + QTime const &t = QTime::fromString(k->value.GetString(), Qt::ISODate); + TariffInterpolation.dynamic_end = t; + } + } else + if (QString(inner_obj_name) == QString("interpol_dynamic_start_str")) { + if (k->value.IsString()) { + QString const &s = k->value.GetString(); + TariffInterpolation.dynamic_start_str = s; + } + } else + if (QString(inner_obj_name) == QString("interpol_dynamic_end_str")) { + if (k->value.IsString()) { + QString const &s = k->value.GetString(); + TariffInterpolation.dynamic_end_str = s; + } + } else + if (QString(inner_obj_name) == QString("interpol_dynamic_duration")) { + if (k->value.IsInt()) { + int const x = k->value.GetInt(); + TariffInterpolation.dynamic_duration = x; + } + } else + if (QString(inner_obj_name) == QString("interpol_dynamic_until_price")) { + if (k->value.IsInt()) { + int const x = k->value.GetInt(); + TariffInterpolation.dynamic_until_price = x; + } + } + } break; case MemberType::ProductType: { if (QString(inner_obj_name) == QString("tariff_product_id")) { if (k->value.IsInt()) { @@ -375,22 +543,22 @@ bool Configuration::ParseJson(Configuration* cfg, const char* json) } break; case MemberType::CurrencyType: - if (strcmp(inner_obj_name, "pcu_id") == 0) Currency.pcu_id = k->value.GetInt(); - else if (strcmp(inner_obj_name, "pcu_sign") == 0) Currency.pcu_sign = k->value.GetString(); - else if (strcmp(inner_obj_name, "pcu_major") == 0) Currency.pcu_major = k->value.GetString(); - 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::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(); - break; - case MemberType::PaymentRateType: - if (strcmp(inner_obj_name, "pra_payment_option_id") == 0) PaymentRate.pra_payment_option_id = k->value.GetInt(); - else if (strcmp(inner_obj_name, "pra_payment_unit_id") == 0) PaymentRate.pra_payment_unit_id = k->value.GetInt(); - else if (strcmp(inner_obj_name, "pra_price") == 0) PaymentRate.pra_price = k->value.GetDouble(); - break; - case MemberType::PaymentOptionType: + if (strcmp(inner_obj_name, "pcu_id") == 0) Currency.pcu_id = k->value.GetInt(); + else if (strcmp(inner_obj_name, "pcu_sign") == 0) Currency.pcu_sign = k->value.GetString(); + else if (strcmp(inner_obj_name, "pcu_major") == 0) Currency.pcu_major = k->value.GetString(); + 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::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(); + break; + case MemberType::PaymentRateType: + if (strcmp(inner_obj_name, "pra_payment_option_id") == 0) PaymentRate.pra_payment_option_id = k->value.GetInt(); + else if (strcmp(inner_obj_name, "pra_payment_unit_id") == 0) PaymentRate.pra_payment_unit_id = k->value.GetInt(); + else if (strcmp(inner_obj_name, "pra_price") == 0) PaymentRate.pra_price = k->value.GetDouble(); + break; + case MemberType::PaymentOptionType: if (strcmp(inner_obj_name, "pop_id") == 0) { this->currentPaymentOptions.append(ATBPaymentOption()); this->currentPaymentOptions.last().reset(); @@ -413,6 +581,10 @@ bool Configuration::ParseJson(Configuration* cfg, const char* json) 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_prepaid_option_id") == 0) { + this->currentPaymentOptions.last().pop_prepaid_option_id = k->value.GetInt(); + } else if (strcmp(inner_obj_name, "pop_carry_over_option_id") == 0) { + this->currentPaymentOptions.last().pop_carry_over_option_id = k->value.GetInt(); } 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) { @@ -493,91 +665,93 @@ bool Configuration::ParseJson(Configuration* cfg, const char* json) } } break; - case MemberType::DurationType: - if (strcmp(inner_obj_name, "pun_id") == 0) Duration.pun_id = k->value.GetInt(); - else if (strcmp(inner_obj_name, "pun_label") == 0) Duration.pun_label = k->value.GetString(); - else if (strcmp(inner_obj_name, "pun_duration") == 0) Duration.pun_duration = k->value.GetDouble(); + case MemberType::DurationType: + if (strcmp(inner_obj_name, "pun_id") == 0) Duration.pun_id = k->value.GetInt(); + else if (strcmp(inner_obj_name, "pun_label") == 0) Duration.pun_label = k->value.GetString(); + else if (strcmp(inner_obj_name, "pun_duration") == 0) Duration.pun_duration = k->value.GetDouble(); else if (strcmp(inner_obj_name, "pun_duration_min") == 0) Duration.pun_duration_min = k->value.GetInt(); else if (strcmp(inner_obj_name, "pun_duration_max") == 0) Duration.pun_duration_max = k->value.GetInt(); + else if (strcmp(inner_obj_name, "pun_interpolation_id") == 0) Duration.pun_interpolation_id = k->value.GetInt(); break; - case MemberType::SpecialDaysWorktimeType: - if (strcmp(inner_obj_name, "pedwt_id") == 0) SpecialDaysWorktime.pedwt_id = k->value.GetInt(); - else if (strcmp(inner_obj_name, "pedwt_period_exc_day_id") == 0) SpecialDaysWorktime.pedwt_period_exc_day_id = k->value.GetInt(); - else if (strcmp(inner_obj_name, "pedwt_time_from") == 0) SpecialDaysWorktime.pedwt_time_from = k->value.GetString(); - else if (strcmp(inner_obj_name, "pedwt_time_to") == 0) SpecialDaysWorktime.pedwt_time_to = k->value.GetString(); - else if (strcmp(inner_obj_name, "pedwt_price") == 0) SpecialDaysWorktime.pedwt_price = k->value.GetDouble(); - break; - /*case MemberType::WeekDaysType: - if (strcmp(inner_obj_name, "pdiw_id") == 0) WeekDays.pdiw_id = k->value.GetInt(); - else if (strcmp(inner_obj_name, "pdiw_label") == 0) WeekDays.pdiw_label = k->value.GetString(); - else if (strcmp(inner_obj_name, "pdiw_index") == 0) WeekDays.pdiw_index = k->value.GetInt(); - break;*/ - case MemberType::WeekDaysWorkTimeType: - if (strcmp(inner_obj_name, "pwd_id") == 0) WeekDaysWorktime.pwd_id = k->value.GetInt(); - else if (strcmp(inner_obj_name, "pwd_period_week_day_id") == 0) WeekDaysWorktime.pwd_period_week_day_id = k->value.GetInt(); - else if (strcmp(inner_obj_name, "pwd_period_day_in_week_id") == 0) WeekDaysWorktime.pwd_period_day_in_week_id = k->value.GetInt(); - else if (strcmp(inner_obj_name, "pwd_time_from") == 0) WeekDaysWorktime.pwd_time_from = k->value.GetString(); + case MemberType::SpecialDaysWorktimeType: + if (strcmp(inner_obj_name, "pedwt_id") == 0) SpecialDaysWorktime.pedwt_id = k->value.GetInt(); + else if (strcmp(inner_obj_name, "pedwt_period_exc_day_id") == 0) SpecialDaysWorktime.pedwt_period_exc_day_id = k->value.GetInt(); + else if (strcmp(inner_obj_name, "pedwt_time_from") == 0) SpecialDaysWorktime.pedwt_time_from = k->value.GetString(); + else if (strcmp(inner_obj_name, "pedwt_time_to") == 0) SpecialDaysWorktime.pedwt_time_to = k->value.GetString(); + else if (strcmp(inner_obj_name, "pedwt_price") == 0) SpecialDaysWorktime.pedwt_price = k->value.GetDouble(); + break; + /*case MemberType::WeekDaysType: + if (strcmp(inner_obj_name, "pdiw_id") == 0) WeekDays.pdiw_id = k->value.GetInt(); + else if (strcmp(inner_obj_name, "pdiw_label") == 0) WeekDays.pdiw_label = k->value.GetString(); + else if (strcmp(inner_obj_name, "pdiw_index") == 0) WeekDays.pdiw_index = k->value.GetInt(); + break;*/ + case MemberType::WeekDaysWorkTimeType: + if (strcmp(inner_obj_name, "pwd_id") == 0) WeekDaysWorktime.pwd_id = k->value.GetInt(); + else if (strcmp(inner_obj_name, "pwd_period_week_day_id") == 0) WeekDaysWorktime.pwd_period_week_day_id = k->value.GetInt(); + else if (strcmp(inner_obj_name, "pwd_period_day_in_week_id") == 0) WeekDaysWorktime.pwd_period_day_in_week_id = k->value.GetInt(); + else if (strcmp(inner_obj_name, "pwd_time_from") == 0) WeekDaysWorktime.pwd_time_from = k->value.GetString(); else if (strcmp(inner_obj_name, "pwd_time_to") == 0) WeekDaysWorktime.pwd_time_to = k->value.GetString(); break; - case MemberType::SpecialDaysType: - if (strcmp(inner_obj_name, "ped_id") == 0) SpecialDays.ped_id = k->value.GetInt(); - else if (strcmp(inner_obj_name, "ped_label") == 0) SpecialDays.ped_label = k->value.GetString(); - else if (strcmp(inner_obj_name, "ped_date_start") == 0) SpecialDays.ped_date_start = k->value.GetString(); - else if (strcmp(inner_obj_name, "ped_date_end") == 0) SpecialDays.ped_date_end = k->value.GetString(); - else if (strcmp(inner_obj_name, "ped_period_special_day_id") == 0) SpecialDays.ped_period_special_day_id = k->value.GetInt(); + case MemberType::SpecialDaysType: + if (strcmp(inner_obj_name, "ped_id") == 0) SpecialDays.ped_id = k->value.GetInt(); + else if (strcmp(inner_obj_name, "ped_label") == 0) SpecialDays.ped_label = k->value.GetString(); + else if (strcmp(inner_obj_name, "ped_date_start") == 0) SpecialDays.ped_date_start = k->value.GetString(); + else if (strcmp(inner_obj_name, "ped_date_end") == 0) SpecialDays.ped_date_end = k->value.GetString(); + else if (strcmp(inner_obj_name, "ped_period_special_day_id") == 0) SpecialDays.ped_period_special_day_id = k->value.GetInt(); else if (strcmp(inner_obj_name, "ped_payment_option_id") == 0) SpecialDays.ped_payment_option_id = k->value.GetInt(); else if (strcmp(inner_obj_name, "ped_year") == 0) SpecialDays.ped_year = k->value.GetInt(); - break; - case MemberType::PeriodYearType: - if (strcmp(inner_obj_name, "pye_id") == 0) YearPeriod.pye_id = k->value.GetInt(); - else if (strcmp(inner_obj_name, "pye_label") == 0) YearPeriod.pye_label = k->value.GetString(); - else if (strcmp(inner_obj_name, "pye_start_month") == 0) YearPeriod.pye_start_month = k->value.GetInt(); - else if (strcmp(inner_obj_name, "pye_start_day") == 0) YearPeriod.pye_start_day = k->value.GetInt(); - else if (strcmp(inner_obj_name, "pye_end_month") == 0) YearPeriod.pye_end_month = k->value.GetInt(); - else if (strcmp(inner_obj_name, "pye_end_day") == 0) YearPeriod.pye_end_day = k->value.GetInt(); - break; - default: - break; - } + break; + case MemberType::PeriodYearType: + if (strcmp(inner_obj_name, "pye_id") == 0) YearPeriod.pye_id = k->value.GetInt(); + else if (strcmp(inner_obj_name, "pye_label") == 0) YearPeriod.pye_label = k->value.GetString(); + else if (strcmp(inner_obj_name, "pye_start_month") == 0) YearPeriod.pye_start_month = k->value.GetInt(); + else if (strcmp(inner_obj_name, "pye_start_day") == 0) YearPeriod.pye_start_day = k->value.GetInt(); + else if (strcmp(inner_obj_name, "pye_end_month") == 0) YearPeriod.pye_end_month = k->value.GetInt(); + else if (strcmp(inner_obj_name, "pye_end_day") == 0) YearPeriod.pye_end_day = k->value.GetInt(); + break; + default: + break; + } //#pragma endregion - } + } - // Push to specific list depending on member type - switch (mb_type) - { - case MemberType::UnknownType: - break; - case MemberType::PaymentMethodType: - cfg->PaymentMethod.insert(pair(PaymentMethod.pme_id, PaymentMethod)); - break; + // Push to specific list depending on member type + switch (mb_type) + { + case MemberType::UnknownType: + break; + case MemberType::PaymentMethodType: + cfg->PaymentMethod.insert(pair(PaymentMethod.pme_id, PaymentMethod)); + break; case MemberType::PaymentRateType: // qCritical() << "PaymentRate" << PaymentRate; cfg->PaymentRate.insert(pair(PaymentRate.pra_payment_option_id, PaymentRate)); - break; + break; case MemberType::PaymentOptionType: { if (!this->currentPaymentOptions.isEmpty()) { ATBPaymentOption const &PaymentOption = this->currentPaymentOptions.last(); cfg->PaymentOption.insert(pair(PaymentOption.pop_payment_method_id, PaymentOption)); } } break; - case MemberType::DurationType: - cfg->Duration.insert(pair(Duration.pun_id, Duration)); - break; - case MemberType::SpecialDaysWorktimeType: - cfg->SpecialDaysWorktime.insert(pair(SpecialDaysWorktime.pedwt_period_exc_day_id, SpecialDaysWorktime)); - break; - //case MemberType::WeekDaysType: - // cfg->WeekDays.insert(pair(WeekDays.pdiw_index, WeekDays)); - // break; - case MemberType::WeekDaysWorkTimeType: - cfg->WeekDaysWorktime.insert(pair(WeekDaysWorktime.pwd_period_day_in_week_id, WeekDaysWorktime)); - break; - case MemberType::SpecialDaysType: - cfg->SpecialDays.insert(pair(SpecialDays.ped_id, SpecialDays)); - break; - case MemberType::PeriodYearType: - cfg->YearPeriod.insert(pair(YearPeriod.pye_id, YearPeriod)); - break; + case MemberType::DurationType: + cfg->Duration.insert(pair(Duration.pun_id, Duration)); + // qCritical() << Duration; + break; + case MemberType::SpecialDaysWorktimeType: + cfg->SpecialDaysWorktime.insert(pair(SpecialDaysWorktime.pedwt_period_exc_day_id, SpecialDaysWorktime)); + break; + //case MemberType::WeekDaysType: + // cfg->WeekDays.insert(pair(WeekDays.pdiw_index, WeekDays)); + // break; + case MemberType::WeekDaysWorkTimeType: + cfg->WeekDaysWorktime.insert(pair(WeekDaysWorktime.pwd_period_day_in_week_id, WeekDaysWorktime)); + break; + case MemberType::SpecialDaysType: + cfg->SpecialDays.insert(pair(SpecialDays.ped_id, SpecialDays)); + break; + case MemberType::PeriodYearType: + cfg->YearPeriod.insert(pair(YearPeriod.pye_id, YearPeriod)); + break; case MemberType::DailyTicketType: cfg->DailyTicket.insert(pair(DailyTicket.daily_ticket_id, DailyTicket)); qCritical() << DailyTicket; @@ -602,17 +776,30 @@ bool Configuration::ParseJson(Configuration* cfg, const char* json) case MemberType::ProductType: cfg->TariffProduct.insert(pair(TariffProduct.m_tariff_product_id, TariffProduct)); qCritical() << TariffProduct; + break; + case MemberType::InterpolationType: + cfg->TariffInterpolations.insert(pair(TariffInterpolation.id, TariffInterpolation)); + qCritical() << TariffInterpolation; + break; + case MemberType::PrepaidType: + cfg->TariffPrepaidOptions.insert(pair(TariffPrepaidOption.id, TariffPrepaidOption)); + qCritical() << TariffPrepaidOption; + break; + case MemberType::CarryOverType: + cfg->TariffCarryOverOptions.insert(pair(TariffCarryOver.id, TariffCarryOver)); + qCritical() << TariffCarryOver; + break; default: - break; - } - } - } - return true; - } - catch (...) { - printf("%s\n", "General exception has occurred while parsing JSON\n"); - return false; - } + break; + } + } + } + return true; + } + catch (...) { + printf("%s\n", "General exception has occurred while parsing JSON\n"); + return false; + } } int Configuration::getPaymentOptionIndexIfSpecialDay(QDateTime const &dt) const { @@ -840,6 +1027,47 @@ Configuration::getDailyTicketsForAllKeys() const { return value; } +std::optional Configuration::getInterpolationType(int key) const { + std::optional value; + for (auto[it, rangeEnd] = this->TariffInterpolations.equal_range(key); it != rangeEnd; ++it) { + value = value.value_or(it->second); + } + return value; +} + +std::optional Configuration::getPrepaidType(int key) const { + std::optional value; + for (auto[it, rangeEnd] = this->TariffPrepaidOptions.equal_range(key); it != rangeEnd; ++it) { + value = value.value_or(it->second); + } + return value; +} + +std::optional Configuration::adaptStart(QDateTime const &start, int prepaid_option_id) { + std::optional value; + QDateTime s = start; + + std::optional prepaid_option = getPrepaidType(prepaid_option_id); + if (prepaid_option.has_value()) { + ATBPrepaid prepaid = prepaid_option.value(); + if (prepaid.anytime == true) { + int const weekdayId = s.date().dayOfWeek(); + QTime worktime_from = QTime::fromString(WeekDaysWorktime.find(weekdayId)->second.pwd_time_from.c_str(), Qt::ISODate); + QTime worktime_to = QTime::fromString(WeekDaysWorktime.find(weekdayId)->second.pwd_time_to.c_str(), Qt::ISODate); + if (s.time() < worktime_from) { + s.setTime(worktime_from); + } else + if (worktime_to < s.time()) { + s = start.addDays(1); + s.setTime(worktime_from); + } + s.setTime(QTime(s.time().hour(), s.time().minute(), 0)); + value = value.value_or(s); + } + } + return value; +} + std::optional> Configuration::getDailyTicketsForKey(int key) const { QVector tickets;