diff --git a/calculate_parking_tickets/calculate_parking_tickets_tariff.cpp b/calculate_parking_tickets/calculate_parking_tickets_tariff.cpp index 68cd89d..097e6ba 100644 --- a/calculate_parking_tickets/calculate_parking_tickets_tariff.cpp +++ b/calculate_parking_tickets/calculate_parking_tickets_tariff.cpp @@ -17,18 +17,26 @@ using namespace rapidjson; -#define FREE_OF_CHARGE "free_of_charge" -#define UNIT_SCALE_FACTOR "unit_scale_factor" -#define UNIT_DEFINITION "unit_definition" -#define VAT "vat" -#define MAX_PARKING_PRICE "max_parking_price" -#define MAX_PRICE_FOR_24_HOURS "max_price_for_24_hours" -#define MAX_PARKING_TIME "max_parking_time" -#define TARIFF_VERSION "version" -#define TARIFF_FEATURES "tariff_features" -#define WAITING_PERIOD "waiting_period" -#define PARKING_TIME_MIN "parking_time_min" -#define PARKING_TIME_MAX "parking_time_max" +#define DAY_TARIFF_START "day_tariff_start" +#define DAY_TARIFF_END "day_tariff_end" +#define NIGHT_TARIFF_START "night_tariff_start" +#define NIGHT_TARIFF_END "night_tariff_end" +#define FREE_OF_CHARGE_DAY_TARIFF "free_of_charge_day_tariff" +#define FREE_OF_CHARGE_NIGHT_TARIFF "free_of_charge_night_tariff" +#define UNIT_SCALE_FACTOR "unit_scale_factor" +#define UNIT_DEFINITION "unit_definition" +#define VAT "vat" +#define MAX_PARKING_PRICE "max_parking_price" +#define MAX_PRICE_FOR_24_HOURS "max_price_for_24_hours" +#define MAX_PARKING_TIME "max_parking_time" +#define TARIFF_VERSION "version" +#define TARIFF_FEATURES "tariff_features" +#define WAITING_PERIOD "waiting_period" +#define PARKING_TIME_MIN "parking_time_min" +#define PARKING_TIME_MAX "parking_time_max" +#define BASIC_TARIFF "basic_tariff" +#define MAX_PRICE_24H_AFTER_ARRIVAL "max_price_24h_after_arrival" +#define MAX_PRICE_AT_MIDNIGHT "max_price_at_midnight" static const char *weekStr[] { "week1", "week2", "week3" @@ -89,6 +97,34 @@ parking_tariff_t *parking_tariff_t::parseTariff(const char *confFile) { sizeof(tariff->_tariff_features)); } } + if (d.HasMember(DAY_TARIFF_START)) { + Value::MemberIterator o = d.FindMember(DAY_TARIFF_START); + assert(o != d.MemberEnd()); + assert(o->value.IsString()); + std::string s = o->value.GetString(); + tariff->day_tariff_start = std::stoi(s); + } + if (d.HasMember(DAY_TARIFF_END)) { + Value::MemberIterator o = d.FindMember(DAY_TARIFF_END); + assert(o != d.MemberEnd()); + assert(o->value.IsString()); + std::string s = o->value.GetString(); + tariff->day_tariff_end = std::stoi(s); + } + if (d.HasMember(NIGHT_TARIFF_START)) { + Value::MemberIterator o = d.FindMember(NIGHT_TARIFF_START); + assert(o != d.MemberEnd()); + assert(o->value.IsString()); + std::string s = o->value.GetString(); + tariff->night_tariff_start = std::stoi(s); + } + if (d.HasMember(NIGHT_TARIFF_END)) { + Value::MemberIterator o = d.FindMember(NIGHT_TARIFF_END); + assert(o != d.MemberEnd()); + assert(o->value.IsString()); + std::string s = o->value.GetString(); + tariff->night_tariff_end = std::stoi(s); + } if (d.HasMember(WAITING_PERIOD)) { Value::MemberIterator o = d.FindMember(WAITING_PERIOD); assert(o != d.MemberEnd()); @@ -96,12 +132,19 @@ parking_tariff_t *parking_tariff_t::parseTariff(const char *confFile) { std::string wp = o->value.GetString(); tariff->waiting_period = std::stoi(wp); } - if (d.HasMember(FREE_OF_CHARGE)) { - Value::MemberIterator o = d.FindMember(FREE_OF_CHARGE); + if (d.HasMember(FREE_OF_CHARGE_DAY_TARIFF)) { + Value::MemberIterator o = d.FindMember(FREE_OF_CHARGE_DAY_TARIFF); assert(o != d.MemberEnd()); assert(o->value.IsString()); std::string foc = o->value.GetString(); - tariff->free_of_charge = std::stoi(foc); + tariff->free_of_charge_day_tariff = std::stoi(foc); + } + if (d.HasMember(FREE_OF_CHARGE_NIGHT_TARIFF)) { + Value::MemberIterator o = d.FindMember(FREE_OF_CHARGE_NIGHT_TARIFF); + assert(o != d.MemberEnd()); + assert(o->value.IsString()); + std::string foc = o->value.GetString(); + tariff->free_of_charge_night_tariff = std::stoi(foc); } if (d.HasMember(UNIT_SCALE_FACTOR)) { Value::MemberIterator o = d.FindMember(UNIT_SCALE_FACTOR); @@ -160,18 +203,40 @@ parking_tariff_t *parking_tariff_t::parseTariff(const char *confFile) { std::string mp = o->value.GetString(); if (mp == "unlimited") { tariff->max_price_for_24_hours = ~0; + } else if (mp == "n/a") { + tariff->max_price_for_24_hours = 0; } else { tariff->max_price_for_24_hours = (uint32_t)std::stoul(mp); } } + if (d.HasMember(BASIC_TARIFF)) { + Value::MemberIterator o = d.FindMember(BASIC_TARIFF); + assert(o != d.MemberEnd()); + assert(o->value.IsString()); + std::string s = o->value.GetString(); + tariff->basic_tariff = (s == "1"); + } + if (d.HasMember(MAX_PRICE_24H_AFTER_ARRIVAL)) { + Value::MemberIterator o = d.FindMember(MAX_PRICE_24H_AFTER_ARRIVAL); + assert(o != d.MemberEnd()); + assert(o->value.IsString()); + std::string s = o->value.GetString(); + tariff->max_price_24h_after_arrival = (uint32_t)std::stoul(s); + } + if (d.HasMember(MAX_PRICE_AT_MIDNIGHT)) { + Value::MemberIterator o = d.FindMember(MAX_PRICE_AT_MIDNIGHT); + assert(o != d.MemberEnd()); + assert(o->value.IsString()); + std::string s = o->value.GetString(); + tariff->max_price_at_midnight = (uint32_t)std::stoul(s); + } QDate today = QDate::currentDate(); int const todayWeekDay = today.dayOfWeek(); // qt: 1 (mon) - 7 (sun) if (todayWeekDay > Qt::Monday) { - int day = today.day(); - day -= (todayWeekDay - Qt::Monday); - if (!today.setDate(today.year(), today.month(), day)) { + today = today.addDays(Qt::Monday - todayWeekDay); + if (!today.isValid()) { qFatal("Setting today failed"); } }