Added parsing for Interpolation, CarryOver and Prepaid-options. Has to be formatted.w
This commit is contained in:
		| @@ -6,6 +6,7 @@ | ||||
| #include "tariff_permit_type.h" | ||||
| #include "tariff_business_hours.h" | ||||
| #include "tariff_global_defines.h" | ||||
| #include "tariff_carryover.h" | ||||
|  | ||||
| #include <QString> | ||||
| #include <QDebug> | ||||
| @@ -14,75 +15,78 @@ | ||||
| /// <inheritdoc/> | ||||
| 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; | ||||
| } | ||||
|  | ||||
| /// <inheritdoc/> | ||||
| 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<int, ATBPaymentMethod>(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<int, ATBPaymentMethod>(PaymentMethod.pme_id, PaymentMethod)); | ||||
|                                         break; | ||||
|                 case MemberType::PaymentRateType: | ||||
|                     // qCritical() << "PaymentRate" << PaymentRate; | ||||
|                     cfg->PaymentRate.insert(pair<int, ATBPaymentRate>(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<int, ATBPaymentOption>(PaymentOption.pop_payment_method_id, PaymentOption)); | ||||
|                     } | ||||
|                 } break; | ||||
| 				case MemberType::DurationType: | ||||
| 					cfg->Duration.insert(pair<int, ATBDuration>(Duration.pun_id, Duration)); | ||||
| 					break; | ||||
| 				case MemberType::SpecialDaysWorktimeType: | ||||
| 					cfg->SpecialDaysWorktime.insert(pair<int, ATBSpecialDaysWorktime>(SpecialDaysWorktime.pedwt_period_exc_day_id, SpecialDaysWorktime)); | ||||
| 					break; | ||||
| 				//case MemberType::WeekDaysType: | ||||
| 				//	cfg->WeekDays.insert(pair<int, ATBWeekDays>(WeekDays.pdiw_index, WeekDays)); | ||||
| 				//	break; | ||||
| 				case MemberType::WeekDaysWorkTimeType: | ||||
| 					cfg->WeekDaysWorktime.insert(pair<int, ATBWeekDaysWorktime>(WeekDaysWorktime.pwd_period_day_in_week_id, WeekDaysWorktime)); | ||||
| 					break; | ||||
| 				case MemberType::SpecialDaysType: | ||||
| 					cfg->SpecialDays.insert(pair<int, ATBSpecialDays>(SpecialDays.ped_id, SpecialDays)); | ||||
| 					break; | ||||
| 				case MemberType::PeriodYearType: | ||||
| 					cfg->YearPeriod.insert(pair<int, ATBPeriodYear>(YearPeriod.pye_id, YearPeriod)); | ||||
| 					break; | ||||
|                                 case MemberType::DurationType: | ||||
|                                         cfg->Duration.insert(pair<int, ATBDuration>(Duration.pun_id, Duration)); | ||||
|                     // qCritical() << Duration; | ||||
|                     break; | ||||
|                                 case MemberType::SpecialDaysWorktimeType: | ||||
|                                         cfg->SpecialDaysWorktime.insert(pair<int, ATBSpecialDaysWorktime>(SpecialDaysWorktime.pedwt_period_exc_day_id, SpecialDaysWorktime)); | ||||
|                                         break; | ||||
|                                 //case MemberType::WeekDaysType: | ||||
|                                 //      cfg->WeekDays.insert(pair<int, ATBWeekDays>(WeekDays.pdiw_index, WeekDays)); | ||||
|                                 //      break; | ||||
|                                 case MemberType::WeekDaysWorkTimeType: | ||||
|                                         cfg->WeekDaysWorktime.insert(pair<int, ATBWeekDaysWorktime>(WeekDaysWorktime.pwd_period_day_in_week_id, WeekDaysWorktime)); | ||||
|                                         break; | ||||
|                                 case MemberType::SpecialDaysType: | ||||
|                                         cfg->SpecialDays.insert(pair<int, ATBSpecialDays>(SpecialDays.ped_id, SpecialDays)); | ||||
|                                         break; | ||||
|                                 case MemberType::PeriodYearType: | ||||
|                                         cfg->YearPeriod.insert(pair<int, ATBPeriodYear>(YearPeriod.pye_id, YearPeriod)); | ||||
|                                         break; | ||||
|                 case MemberType::DailyTicketType: | ||||
|                     cfg->DailyTicket.insert(pair<int, ATBDailyTicket>(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<int, ATBTariffProduct>(TariffProduct.m_tariff_product_id, TariffProduct)); | ||||
|                     qCritical() << TariffProduct; | ||||
|                     break; | ||||
|                 case MemberType::InterpolationType: | ||||
|                     cfg->TariffInterpolations.insert(pair<int, ATBInterpolation>(TariffInterpolation.id, TariffInterpolation)); | ||||
|                     qCritical() << TariffInterpolation; | ||||
|                     break; | ||||
|                 case MemberType::PrepaidType: | ||||
|                     cfg->TariffPrepaidOptions.insert(pair<int, ATBPrepaid>(TariffPrepaidOption.id, TariffPrepaidOption)); | ||||
|                     qCritical() << TariffPrepaidOption; | ||||
|                     break; | ||||
|                 case MemberType::CarryOverType: | ||||
|                     cfg->TariffCarryOverOptions.insert(pair<int, ATBCarryOver>(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<ATBInterpolation> Configuration::getInterpolationType(int key) const { | ||||
|     std::optional<ATBInterpolation> value; | ||||
|     for (auto[it, rangeEnd] = this->TariffInterpolations.equal_range(key); it != rangeEnd; ++it) { | ||||
|         value = value.value_or(it->second); | ||||
|     } | ||||
|     return value; | ||||
| } | ||||
|  | ||||
| std::optional<ATBPrepaid> Configuration::getPrepaidType(int key) const { | ||||
|     std::optional<ATBPrepaid> value; | ||||
|     for (auto[it, rangeEnd] = this->TariffPrepaidOptions.equal_range(key); it != rangeEnd; ++it) { | ||||
|         value = value.value_or(it->second); | ||||
|     } | ||||
|     return value; | ||||
| } | ||||
|  | ||||
| std::optional<QDateTime> Configuration::adaptStart(QDateTime const &start, int prepaid_option_id) { | ||||
|     std::optional<QDateTime> value; | ||||
|     QDateTime s = start; | ||||
|  | ||||
|     std::optional<ATBPrepaid> 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<QVector<ATBDailyTicket>> | ||||
| Configuration::getDailyTicketsForKey(int key) const { | ||||
|     QVector<ATBDailyTicket> tickets; | ||||
|   | ||||
		Reference in New Issue
	
	Block a user