diff --git a/library/src/configuration.cpp b/library/src/configuration.cpp index 6b00a2c..c9f9353 100644 --- a/library/src/configuration.cpp +++ b/library/src/configuration.cpp @@ -10,6 +10,9 @@ #include "tariff_global_defines.h" #include "tariff_settings.h" #include "tariff_carryover_settings.h" +#include "atb_time.h" +#include "tariff_prepaid.h" +#include "tariff_carryover.h" #include #include @@ -61,6 +64,405 @@ ATBWeekDay parseWeekDay(Configuration &cfg, ATBWeekDay WeekDay; QTime start, end, parking_time_limit, about_to_exceed_limit; ATBTariffCarryOverSettings::ParkingTimeLimitChecker parkTimeLimitChecker; + QDate const &d = QDate::fromString(innerObjName, Qt::ISODate); + if (innerObjName == QString("default") || + (!d.isNull() && d.isValid())) { // special day, given in date-format + // start with new implementation of tariff-calculator + // see for instance: bad neuenahr (249), Zone5 + + // qCritical() << __func__ << ":" << __LINE__ << innerObjName; + + if (k->value.IsObject()) { + auto obj = k->value.GetObject(); + for (auto m = obj.MemberBegin(); m != obj.MemberEnd(); ++m) { + QString const &name = m->name.GetString(); + if (name == "payment_settings") { + if (m->value.IsArray()) { + auto payment = m->value.GetArray(); + if (payment.Size() == 0) { + qCritical() << __func__ << ":" << __LINE__ << "no payment settings for" << weekDayName; + } else { + for (rapidjson::SizeType j = 0; j < payment.Size(); ++j) { + if (payment[j].IsObject()) { + auto paymentSetting = payment[j].GetObject(); + for (auto n = paymentSetting.MemberBegin(); n != paymentSetting.MemberEnd(); ++n) { + QString const &name = QString::fromStdString(n->name.GetString()); + if (name == "min_time") { + if (n->value.IsInt()) { min_time = n->value.GetInt(); } + } else if (name == "max_time") { + if (n->value.IsInt()) { max_time = n->value.GetInt(); } + } else if (name == "min_price") { + if (n->value.IsInt()) { min_price = n->value.GetInt(); } + } else if (name == "max_price") { + if (n->value.IsInt()) { max_price = n->value.GetInt(); } + } + } + } + } + } + } + + } else + if (name == "prepaid_settings") { + if (m->value.IsArray()) { + auto prepaid = m->value.GetArray(); + if (prepaid.Size() == 0) { + qCritical() << __func__ << ":" << __LINE__ << "no prepaid-settings for" << weekDayName; + } else { + ATBTariffPrepaid TariffPrepaid; + for (rapidjson::SizeType j = 0; j < prepaid.Size(); ++j) { + if (prepaid[j].IsObject()) { + auto prepaidSetting = prepaid[j].GetObject(); + for (auto n = prepaidSetting.MemberBegin(); n != prepaidSetting.MemberEnd(); ++n) { + QString const &name = QString::fromStdString(n->name.GetString()); + if (name == "prepaid_ranges") { + if (n->value.IsArray()) { + auto prepaidRanges = n->value.GetArray(); + if (prepaidRanges.Size() == 0) { + qCritical() << __func__ << ":" << __LINE__ << "no prepaid-ranges for" << weekDayName; + } else { + QString prepaidStartStr; + QString prepaidEndStr; + QString prepaidIf; + int prepaidDuration = -1; + for (rapidjson::SizeType i = 0; i < prepaidRanges.Size(); ++i) { + if (prepaidRanges[j].IsObject()) { + auto prepaidRange = prepaidRanges[i].GetObject(); + for (auto r = prepaidRange.MemberBegin(); r != prepaidRange.MemberEnd(); ++r) { + QString const &memName = QString::fromStdString(r->name.GetString()); + if (memName == "prepaid_id") { + if (r->value.IsInt()) { + TariffPrepaid.m_id = r->value.GetInt(); + } else { + qCritical() << __func__ << ":" << __LINE__ << "prepaidId not an integer"; + } + } else + if (memName == "prepaid_duration") { + if (r->value.IsInt()) { + prepaidDuration = r->value.GetInt(); + } + } else + if (memName == "prepaid_start") { + if (r->value.IsString()) { + prepaidStartStr = QString::fromStdString(r->value.GetString()); + } + } else + if (memName == "prepaid_end") { + if (r->value.IsString()) { + prepaidEndStr = QString::fromStdString(r->value.GetString()); + } + } else + if (memName == "prepaid_if") { + if (r->value.IsString()) { + prepaidIf = QString::fromStdString(r->value.GetString()); + } + } else { + qCritical() << __func__ << ":" << __LINE__ << "WARNING unknown prepaid setting" << memName; + } + } + } + + if (!prepaidStartStr.isEmpty() && !prepaidEndStr.isEmpty() && prepaidDuration != -1) { + ATBTime prepaidStart(prepaidStartStr); + ATBTime prepaidEnd(prepaidEndStr); + if (prepaidStart.isValid() && prepaidEnd.isValid()) { + TariffPrepaid.m_range = TimeRange(prepaidStart, prepaidEnd, prepaidDuration); + TariffPrepaid.m_weekDay = weekDayName; + if (!d.isNull() && d.isValid()) { + TariffPrepaid.m_date = d; + } + TariffPrepaid.setPrepaidIf(prepaidIf); + + qCritical() << TariffPrepaid; + + cfg.TariffPrepaids.insert(std::pair(weekDay, TariffPrepaid)); + } + } + } + } + } + } else { + + } + } + } + } + } + } + } else + if (name == "carry_over_settings") { + if (m->value.IsArray()) { + auto carryOver = m->value.GetArray(); + if (carryOver.Size() == 0) { + qCritical() << __func__ << ":" << __LINE__ << "no carry-over-settings for" << weekDayName; + } else { + ATBTariffCarryOver TariffCarryOver; + for (rapidjson::SizeType j = 0; j < carryOver.Size(); ++j) { + if (carryOver[j].IsObject()) { + auto carryOverSetting = carryOver[j].GetObject(); + for (auto n = carryOverSetting.MemberBegin(); n != carryOverSetting.MemberEnd(); ++n) { + QString const &name = QString::fromStdString(n->name.GetString()); + if (name == "carry_over_ranges") { + if (n->value.IsArray()) { + auto carryOverRanges = n->value.GetArray(); + if (carryOverRanges.Size() == 0) { + qCritical() << __func__ << ":" << __LINE__ << "no carry-over-ranges for" << weekDayName; + } else { + QString carryOverStartStr; + QString carryOverEndStr; + QString carryOverIf; + int carryOverDuration = -1; + for (rapidjson::SizeType i = 0; i < carryOverRanges.Size(); ++i) { + if (carryOverRanges[j].IsObject()) { + auto carryOverRange = carryOverRanges[i].GetObject(); + for (auto r = carryOverRange.MemberBegin(); r != carryOverRange.MemberEnd(); ++r) { + QString const &memName = QString::fromStdString(r->name.GetString()); + if (memName == "carry_over_id") { + if (r->value.IsInt()) { + TariffCarryOver.m_id = r->value.GetInt(); + } else { + qCritical() << __func__ << ":" << __LINE__ << "carryOverId not an integer"; + } + } else + if (memName == "carry_over_duration") { + if (r->value.IsInt()) { + carryOverDuration = r->value.GetInt(); + } + } else + if (memName == "carry_over_start") { + if (r->value.IsString()) { + carryOverStartStr = QString::fromStdString(r->value.GetString()); + } + } else + if (memName == "carry_over_end") { + if (r->value.IsString()) { + carryOverEndStr = QString::fromStdString(r->value.GetString()); + } + } else + if (memName == "carry_over_if") { + if (r->value.IsString()) { + carryOverIf = QString::fromStdString(r->value.GetString()); + } + } else { + qCritical() << __func__ << ":" << __LINE__ << "WARNING unknown carry-over setting" << memName; + } + } + } + + if (!carryOverStartStr.isEmpty() && !carryOverEndStr.isEmpty() && carryOverDuration != -1) { + ATBTime carryOverStart(carryOverStartStr); + ATBTime carryOverEnd(carryOverEndStr); + if (carryOverStart.isValid() && carryOverEnd.isValid()) { + TariffCarryOver.m_range = TimeRange(carryOverStart, carryOverEnd, carryOverDuration); + TariffCarryOver.m_weekDay = weekDayName; + if (!d.isNull() && d.isValid()) { + TariffCarryOver.m_date = d; + } + if (!carryOverIf.isEmpty()) { + TariffCarryOver.setCarryOverIf(carryOverIf); + } + + // qCritical() << TariffCarryOver; + + cfg.TariffCarryOvers.insert(std::pair(weekDay, TariffCarryOver)); + } + } + } + } + } + } else { + + } + } + } + } + } + } + } else + if (name == "service_settings") { + ATBTariffService TariffService; + if (m->value.IsArray()) { + auto service = m->value.GetArray(); + if (service.Size() == 0) { + qCritical() << __func__ << ":" << __LINE__ << "no service settings for" << weekDayName; + } else { + for (rapidjson::SizeType j = 0; j < service.Size(); ++j) { + if (service[j].IsObject()) { + auto serviceSetting = service[j].GetObject(); + for (auto n = serviceSetting.MemberBegin(); n != serviceSetting.MemberEnd(); ++n) { + QString const &name = QString::fromStdString(n->name.GetString()); + if (name == "service_ranges") { + if (n->value.IsArray()) { + auto serviceRanges = n->value.GetArray(); + if (serviceRanges.Size() == 0) { + qCritical() << __func__ << ":" << __LINE__ << "no service ranges for" << weekDayName; + } else { + QString serviceStartStr; + QString serviceEndStr; + QString serviceIf; + int serviceDuration = -1; + for (rapidjson::SizeType i = 0; i < serviceRanges.Size(); ++i) { + if (serviceRanges[j].IsObject()) { + auto serviceRange = serviceRanges[i].GetObject(); + for (auto r = serviceRange.MemberBegin(); r != serviceRange.MemberEnd(); ++r) { + QString const &memName = QString::fromStdString(r->name.GetString()); + if (memName == "service_id") { + if (r->value.IsInt()) { + TariffService.m_id = r->value.GetInt(); + } else { + qCritical() << __func__ << ":" << __LINE__ << "serviceId not an integer"; + } + } else + if (memName == "service_duration") { + if (r->value.IsInt()) { + serviceDuration = r->value.GetInt(); + } + } else + if (memName == "service_start") { + if (r->value.IsString()) { + serviceStartStr = QString::fromStdString(r->value.GetString()); + } + } else + if (memName == "service_end") { + if (r->value.IsString()) { + serviceEndStr = QString::fromStdString(r->value.GetString()); + } + } else + if (memName == "service_if") { + if (r->value.IsString()) { + serviceIf = QString::fromStdString(r->value.GetString()); + } + + } else { + qCritical() << __func__ << ":" << __LINE__ << "WARNING unknown service setting" << memName; + } + } + } + + if (!serviceStartStr.isEmpty() && !serviceEndStr.isEmpty() && serviceDuration != -1) { + ATBTime serviceStart(serviceStartStr); + ATBTime serviceEnd(serviceEndStr); + if (serviceStart.isValid() && serviceEnd.isValid()) { + TariffService.m_range = TimeRange(serviceStart, serviceEnd, serviceDuration); + TariffService.m_weekDay = weekDayName; + if (!d.isNull() && d.isValid()) { + TariffService.m_date = d; + } + if (!serviceIf.isEmpty()) { + TariffService.setServiceIf(serviceIf); + } + + // qCritical() << TariffService; + + cfg.TariffServices.insert(std::pair(weekDay, TariffService)); + } + } + } + } + } + } else { + + } + } + } + } + } + } + } else + if (name == "out_of_service_settings") { + ATBTariffOutOfService TariffOutOfService; + if (m->value.IsArray()) { + auto outOfService = m->value.GetArray(); + if (outOfService.Size() == 0) { + qCritical() << __func__ << ":" << __LINE__ << "no out of service settings for" << weekDayName; + } else { + for (rapidjson::SizeType j = 0; j < outOfService.Size(); ++j) { + if (outOfService[j].IsObject()) { + auto outOfServiceSetting = outOfService[j].GetObject(); + for (auto n = outOfServiceSetting.MemberBegin(); n != outOfServiceSetting.MemberEnd(); ++n) { + QString const &name = QString::fromStdString(n->name.GetString()); + if (name == "out_of_service_ranges") { + if (n->value.IsArray()) { + auto outOfServiceRanges = n->value.GetArray(); + if (outOfServiceRanges.Size() == 0) { + qCritical() << __func__ << ":" << __LINE__ << "no out of service ranges for" << weekDayName; + } else { + QString outOfServiceStartStr; + QString outOfServiceEndStr; + QString outOfServiceIf; + int outOfServiceDuration = -1; + for (rapidjson::SizeType i = 0; i < outOfServiceRanges.Size(); ++i) { + if (outOfServiceRanges[j].IsObject()) { + auto outOfServiceRange = outOfServiceRanges[i].GetObject(); + for (auto r = outOfServiceRange.MemberBegin(); r != outOfServiceRange.MemberEnd(); ++r) { + QString const &memName = QString::fromStdString(r->name.GetString()); + if (memName == "out_of_service_id") { + if (r->value.IsInt()) { + TariffOutOfService.m_id = r->value.GetInt(); + } else { + qCritical() << __func__ << ":" << __LINE__ << "outOfServiceId not an integer"; + } + } else + if (memName == "out_of_service_duration") { + if (r->value.IsInt()) { + outOfServiceDuration = r->value.GetInt(); + } + } else + if (memName == "out_of_service_start") { + if (r->value.IsString()) { + outOfServiceStartStr = QString::fromStdString(r->value.GetString()); + } + } else + if (memName == "out_of_service_end") { + if (r->value.IsString()) { + outOfServiceEndStr = QString::fromStdString(r->value.GetString()); + } + } else + if (memName == "out_of_service_if") { + if (r->value.IsString()) { + outOfServiceIf = QString::fromStdString(r->value.GetString()); + } + } else { + qCritical() << __func__ << ":" << __LINE__ << "WARNING unknown out of service setting" << memName; + } + } + } + + if (!outOfServiceStartStr.isEmpty() && !outOfServiceEndStr.isEmpty() && outOfServiceDuration != -1) { + ATBTime outOfServiceStart(outOfServiceStartStr); + ATBTime outOfServiceEnd(outOfServiceEndStr); + if (outOfServiceStart.isValid() && outOfServiceEnd.isValid()) { + TariffOutOfService.m_range = TimeRange(outOfServiceStart, outOfServiceEnd, outOfServiceDuration); + TariffOutOfService.m_weekDay = weekDayName; + if (!d.isNull() && d.isValid()) { + TariffOutOfService.m_date = d; + } + if (!outOfServiceIf.isEmpty()) { + TariffOutOfService.setOutOfServiceIf(outOfServiceIf); + } + + // qCritical() << TariffOutOfService; + + cfg.TariffOutOfServices.insert(std::pair(weekDay, TariffOutOfService)); + } + } + } + } + } + } else { + + } + } + } + } + } + } + } else { + + } + } + } + } else if (innerObjName == QString("week_day_default")) { if (k->value.IsObject()) { auto obj = k->value.GetObject();