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