GetCostFromDuration fixed
This commit is contained in:
		| @@ -107,7 +107,7 @@ struct CALCULATE_LIBRARY_API CalcState { | |||||||
| CalcState CALCULATE_LIBRARY_API init_tariff(parking_tariff_t **tariff, | CalcState CALCULATE_LIBRARY_API init_tariff(parking_tariff_t **tariff, | ||||||
|                                             char const *config_file); |                                             char const *config_file); | ||||||
| void CALCULATE_LIBRARY_API free_tariff(parking_tariff_t *tariff); | void CALCULATE_LIBRARY_API free_tariff(parking_tariff_t *tariff); | ||||||
| int CALCULATE_LIBRARY_API get_zone_nr(); | int CALCULATE_LIBRARY_API get_zone_nr(int zone = -1); | ||||||
|  |  | ||||||
| CalcState CALCULATE_LIBRARY_API compute_price_for_parking_ticket( | CalcState CALCULATE_LIBRARY_API compute_price_for_parking_ticket( | ||||||
|                                             parking_tariff_t *tariff, |                                             parking_tariff_t *tariff, | ||||||
|   | |||||||
| @@ -10,7 +10,11 @@ | |||||||
|  |  | ||||||
| static Calculator calculator; | static Calculator calculator; | ||||||
|  |  | ||||||
| int CALCULATE_LIBRARY_API get_zone_nr() { | int CALCULATE_LIBRARY_API get_zone_nr(int zone) | ||||||
|  | { | ||||||
|  |     if(zone > -1) return zone; | ||||||
|  |     else | ||||||
|  |   { | ||||||
|         QFile zone("/etc/zone_nr"); |         QFile zone("/etc/zone_nr"); | ||||||
|         if (zone.exists()) { |         if (zone.exists()) { | ||||||
|             QFileInfo finfo(zone); |             QFileInfo finfo(zone); | ||||||
| @@ -22,6 +26,7 @@ int CALCULATE_LIBRARY_API get_zone_nr() { | |||||||
|             } |             } | ||||||
|         } |         } | ||||||
|         return -1; |         return -1; | ||||||
|  |    } | ||||||
| } | } | ||||||
|  |  | ||||||
| CalcState CALCULATE_LIBRARY_API init_tariff(parking_tariff_t **tariff, char const *config_file) { | CalcState CALCULATE_LIBRARY_API init_tariff(parking_tariff_t **tariff, char const *config_file) { | ||||||
|   | |||||||
| @@ -4,11 +4,21 @@ | |||||||
| #include "tariff_log.h" | #include "tariff_log.h" | ||||||
|  |  | ||||||
| #include <sstream> | #include <sstream> | ||||||
|  | #include <QDateTime> | ||||||
|  | #include <qdebug.h> | ||||||
|  |  | ||||||
| double total_duration_min = 0.0f; | double total_duration_min = 0.0f; | ||||||
| double total_cost = 0.0f; | double total_cost = 0.0f; | ||||||
| bool overtime = false; | bool overtime = false; | ||||||
|  |  | ||||||
|  | #ifdef _WIN32 | ||||||
|  |     inline struct tm* localtime_r(const time_t *clock, struct tm* result){ | ||||||
|  |     if(!clock || !result) return NULL; | ||||||
|  |     memcpy(result,localtime(clock),sizeof(*result)); | ||||||
|  |     return result; | ||||||
|  |     } | ||||||
|  | #endif | ||||||
|  |  | ||||||
| /// <inheritdoc/> | /// <inheritdoc/> | ||||||
| std::string Calculator::GetDurationFromCost(Configuration* cfg, | std::string Calculator::GetDurationFromCost(Configuration* cfg, | ||||||
|                                             uint8_t payment_option, |                                             uint8_t payment_option, | ||||||
| @@ -310,41 +320,40 @@ std::string Calculator::GetDurationFromCost(Configuration* cfg, | |||||||
| /// <inheritdoc/> | /// <inheritdoc/> | ||||||
| double Calculator::GetCostFromDuration(Configuration* cfg, uint8_t payment_option, const char* start_datetime, double durationMin, bool nextDay, bool prepaid) | double Calculator::GetCostFromDuration(Configuration* cfg, uint8_t payment_option, const char* start_datetime, double durationMin, bool nextDay, bool prepaid) | ||||||
| { | { | ||||||
| 	// Get current date time from input |     // Get input date | ||||||
| 	struct tm current_datetime = Utilities::DateTimeToStructTm(start_datetime); |     QDateTime inputDate = QDateTime::fromString(start_datetime,Qt::ISODate); | ||||||
| 	time_t current_datetime_t; |  | ||||||
|  |  | ||||||
|     // Get day of week |     // Get day of week | ||||||
| 	DayOfWeek weekdayId = DayOfWeek::UndefinedDay; |     int weekdayId = 0; | ||||||
| 	weekdayId = Utilities::GetDayOfWeek(¤t_datetime); |     weekdayId = Utilities::ZellersAlgorithm(inputDate.date().day(),inputDate.date().month(),inputDate.date().year()); | ||||||
| 	LOG_DEBUG("*** Input date is: ", start_datetime, " [weekday id = ", weekdayId, "]"); |  | ||||||
|  |  | ||||||
|  |     //Get min and max time defined in JSON | ||||||
|     double minMin = 0; |     double minMin = 0; | ||||||
|     minMin = cfg->PaymentOption.find(payment_option)->second.pop_min_time; |     minMin = cfg->PaymentOption.find(payment_option)->second.pop_min_time; | ||||||
| 	if (minMin < 0) minMin = 0; |  | ||||||
|  |  | ||||||
|     double maxMin = 0; |     double maxMin = 0; | ||||||
|     maxMin = cfg->PaymentOption.find(payment_option)->second.pop_max_time; |     maxMin = cfg->PaymentOption.find(payment_option)->second.pop_max_time; | ||||||
| 	if (maxMin <= 0) maxMin = 60; |  | ||||||
|  |  | ||||||
|  |     if (minMin < 0) minMin = 0; | ||||||
|  |     if (maxMin < 0) maxMin = 0; | ||||||
|     if (minMin >= maxMin) |     if (minMin >= maxMin) | ||||||
|     { |     { | ||||||
|         LOG_ERROR("Error: min_min cannot be greater or equal to max_min"); |         LOG_ERROR("Error: min_min cannot be greater or equal to max_min"); | ||||||
|         return 0.0f; |         return 0.0f; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     if (maxMin <= minMin) |     if (maxMin <= minMin) | ||||||
|     { |     { | ||||||
|         LOG_ERROR("Error: max_min cannot be lower or equal than min_min"); |         LOG_ERROR("Error: max_min cannot be lower or equal than min_min"); | ||||||
|         return 0.0f; |         return 0.0f; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     // Check overtime | ||||||
|     if (!overtime) |     if (!overtime) | ||||||
|     { |     { | ||||||
|         if (durationMin > maxMin) |         if (durationMin > maxMin) | ||||||
|         { |         { | ||||||
|             LOG_WARNING("Total duration is greater or equal to max_min"); |             LOG_WARNING("Total duration is greater or equal to max_min"); | ||||||
| 			return 0.0f; |             return maxMin; | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         if (durationMin < minMin) |         if (durationMin < minMin) | ||||||
| @@ -354,29 +363,30 @@ double Calculator::GetCostFromDuration(Configuration* cfg, uint8_t payment_optio | |||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     // Get payment method | ||||||
|     uint8_t p_method = PaymentMethod::Undefined; |     uint8_t p_method = PaymentMethod::Undefined; | ||||||
|     p_method = payment_option; |     p_method = payment_option; | ||||||
|     LOG_DEBUG("Payment method id: ", (unsigned)p_method); |     LOG_DEBUG("Payment method id: ", (unsigned)p_method); | ||||||
|  |  | ||||||
|  |     // Check special day | ||||||
|     double day_price = 0.0f; |     double day_price = 0.0f; | ||||||
|     int current_special_day_id = -1; |     int current_special_day_id = -1; | ||||||
| 	bool is_special_day = Utilities::CheckSpecialDay(cfg, start_datetime, ¤t_special_day_id, &day_price); |     bool is_special_day = Utilities::CheckSpecialDay(cfg, inputDate.toString(Qt::ISODate).toStdString().c_str(), ¤t_special_day_id, &day_price); | ||||||
|     LOG_DEBUG("Special day: ", is_special_day); |     LOG_DEBUG("Special day: ", is_special_day); | ||||||
|  |  | ||||||
|     total_duration_min = durationMin; |     total_duration_min = durationMin; | ||||||
|     LOG_DEBUG("Total min:", total_duration_min); |     LOG_DEBUG("Total min:", total_duration_min); | ||||||
|  |  | ||||||
|     double price_per_unit = 0.0f; |     double price_per_unit = 0.0f; | ||||||
|  |     QTime worktime_from; | ||||||
|  |     QTime worktime_to; | ||||||
|  |  | ||||||
| 	string worktime_from = ""; |     if(is_special_day) | ||||||
| 	string worktime_to = ""; |  | ||||||
|  |  | ||||||
| 	if (is_special_day) |  | ||||||
|     { |     { | ||||||
|         // Set special day price |         // Set special day price | ||||||
|         price_per_unit = Utilities::CalculatePricePerUnit(day_price); |         price_per_unit = Utilities::CalculatePricePerUnit(day_price); | ||||||
| 		worktime_from = cfg->SpecialDaysWorktime.find(current_special_day_id)->second.pedwt_time_from; |         worktime_from = QTime::fromString(cfg->SpecialDaysWorktime.find(current_special_day_id)->second.pedwt_time_from.c_str()); | ||||||
| 		worktime_to = cfg->SpecialDaysWorktime.find(current_special_day_id)->second.pedwt_time_to; |         worktime_to = QTime::fromString(cfg->SpecialDaysWorktime.find(current_special_day_id)->second.pedwt_time_to.c_str()); | ||||||
|     } |     } | ||||||
|     else |     else | ||||||
|     { |     { | ||||||
| @@ -388,67 +398,38 @@ double Calculator::GetCostFromDuration(Configuration* cfg, uint8_t payment_optio | |||||||
|         size_t found = 0; |         size_t found = 0; | ||||||
|         found = cfg->WeekDaysWorktime.count(weekdayId); |         found = cfg->WeekDaysWorktime.count(weekdayId); | ||||||
|  |  | ||||||
| 		if (found <= 0) |         // When no workday found, go to next available day | ||||||
|  |         if(found <=0) | ||||||
|         { |         { | ||||||
|             LOG_DEBUG("- No workday found, trying to find next available day"); |             LOG_DEBUG("- No workday found, trying to find next available day"); | ||||||
| 			current_datetime_t = mktime(¤t_datetime); |             inputDate = inputDate.addDays(1); | ||||||
| 			current_datetime_t += 86400; |             return floor(GetCostFromDuration(cfg, payment_option, inputDate.toString(Qt::ISODate).toStdString().c_str(), durationMin, true, prepaid)); | ||||||
| 			current_datetime = *localtime(¤t_datetime_t); |  | ||||||
|  |  | ||||||
| 			char buffer_datetime[80]; |  | ||||||
| 			strftime(buffer_datetime, 80, "%Y-%m-%dT%H:%M:%S", ¤t_datetime); |  | ||||||
|  |  | ||||||
| 			//Make new datetime string and call function again recursively |  | ||||||
| 			start_datetime = buffer_datetime; |  | ||||||
|             return floor(GetCostFromDuration(cfg, payment_option, start_datetime, durationMin, true, prepaid)); |  | ||||||
|         } |         } | ||||||
|  |         worktime_from = QTime::fromString(cfg->WeekDaysWorktime.find(weekdayId)->second.pwd_time_from.c_str()); | ||||||
| 		worktime_from = cfg->WeekDaysWorktime.find(weekdayId)->second.pwd_time_from; |         worktime_to = QTime::fromString(cfg->WeekDaysWorktime.find(weekdayId)->second.pwd_time_to.c_str()); | ||||||
| 		worktime_to = cfg->WeekDaysWorktime.find(weekdayId)->second.pwd_time_to; |  | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     if (price_per_unit < 0) price_per_unit = 1.0f; |     if (price_per_unit < 0) price_per_unit = 1.0f; | ||||||
|     LOG_DEBUG("Calculated price per minute: ", price_per_unit); |     LOG_DEBUG("Calculated price per minute: ", price_per_unit); | ||||||
|  |  | ||||||
| 	LOG_DEBUG("Worktime from: ", worktime_from); |     if (price_per_unit == 0) | ||||||
| 	LOG_DEBUG("Worktime to: ", worktime_to); |     { | ||||||
|  |         inputDate = inputDate.addDays(1); | ||||||
| 	struct tm from_tm; |         inputDate.setTime(worktime_from); | ||||||
| 	struct tm to_tm; |         return GetCostFromDuration(cfg, payment_option, inputDate.toString(Qt::ISODate).toStdString().c_str(), durationMin, true, prepaid); | ||||||
|  |     } | ||||||
| 	from_tm = Utilities::TimeToStructTm(worktime_from.c_str(), current_datetime.tm_year, current_datetime.tm_mon, current_datetime.tm_mday, current_datetime.tm_wday); |  | ||||||
| 	from_tm.tm_year = current_datetime.tm_year; |  | ||||||
| 	from_tm.tm_mon = current_datetime.tm_mon; |  | ||||||
| 	from_tm.tm_wday = current_datetime.tm_wday; |  | ||||||
| 	from_tm.tm_mday = current_datetime.tm_mday; |  | ||||||
|  |  | ||||||
| 	to_tm = Utilities::TimeToStructTm(worktime_to.c_str(), current_datetime.tm_year, current_datetime.tm_mon, current_datetime.tm_mday, current_datetime.tm_wday); |  | ||||||
| 	to_tm.tm_year = current_datetime.tm_year; |  | ||||||
| 	to_tm.tm_mon = current_datetime.tm_mon; |  | ||||||
| 	to_tm.tm_wday = current_datetime.tm_wday; |  | ||||||
| 	to_tm.tm_mday = current_datetime.tm_mday; |  | ||||||
|  |  | ||||||
| 	// Convert tm structures to time_t |  | ||||||
| 	current_datetime_t = mktime(¤t_datetime); |  | ||||||
|  |  | ||||||
| 	time_t from_datetime_t = mktime(&from_tm); |  | ||||||
| 	time_t to_datetime_t = mktime(&to_tm); |  | ||||||
|  |  | ||||||
|     // If overtime flag is set |     // If overtime flag is set | ||||||
|     if (overtime || nextDay) |     if (overtime || nextDay) | ||||||
|     { |     { | ||||||
| 		current_datetime.tm_hour = from_tm.tm_hour; |         inputDate.setTime(worktime_from); | ||||||
| 		current_datetime.tm_min = from_tm.tm_min; |  | ||||||
| 		current_datetime.tm_sec = from_tm.tm_sec; |  | ||||||
| 		current_datetime_t = mktime(¤t_datetime); |  | ||||||
| 		LOG_DEBUG(" *** New input date set according to worktime: ", asctime(¤t_datetime)); |  | ||||||
|         overtime = false; |         overtime = false; | ||||||
|     } |     } | ||||||
|  |  | ||||||
| 	// Validate ticket |     // Check prepaid | ||||||
|     if (!prepaid) |     if (!prepaid) | ||||||
|     { |     { | ||||||
| 		if ((current_datetime_t < from_datetime_t) || (current_datetime_t > to_datetime_t)) |         if ((inputDate.time() < worktime_from) || (inputDate.time() > worktime_to)) | ||||||
|         { |         { | ||||||
|             LOG_DEBUG("[STOP] * Ticket is not valid * "); |             LOG_DEBUG("[STOP] * Ticket is not valid * "); | ||||||
|             return 0.0f; |             return 0.0f; | ||||||
| @@ -457,90 +438,76 @@ double Calculator::GetCostFromDuration(Configuration* cfg, uint8_t payment_optio | |||||||
|     else |     else | ||||||
|     { |     { | ||||||
|         LOG_DEBUG("* PREPAID MODE ACTIVE *"); |         LOG_DEBUG("* PREPAID MODE ACTIVE *"); | ||||||
|  |         if (inputDate.time() < worktime_from) | ||||||
| 		if (current_datetime_t < from_datetime_t) |  | ||||||
|         { |         { | ||||||
| 			current_datetime.tm_hour = from_tm.tm_hour; |             inputDate.setTime(worktime_from); | ||||||
| 			current_datetime.tm_min = from_tm.tm_min; |  | ||||||
| 			current_datetime.tm_sec = from_tm.tm_sec; |  | ||||||
| 			current_datetime_t = mktime(¤t_datetime); |  | ||||||
| 			LOG_DEBUG(" *** PREPAID *** Current time is before the time range start, adjusting time to: ", asctime(¤t_datetime)); |  | ||||||
|         } |         } | ||||||
| 		else if (current_datetime_t > to_datetime_t) |         else if(inputDate.time() > worktime_to) | ||||||
|         { |         { | ||||||
|             LOG_DEBUG(" *** PREPAID *** Current time is past the time range end, searching for next available day"); |             LOG_DEBUG(" *** PREPAID *** Current time is past the time range end, searching for next available day"); | ||||||
| 			current_datetime_t = mktime(¤t_datetime); |             inputDate = inputDate.addDays(1); | ||||||
| 			current_datetime_t += 86400; |             return GetCostFromDuration(cfg, payment_option, inputDate.toString(Qt::ISODate).toStdString().c_str(), durationMin, true, prepaid); | ||||||
| 			current_datetime = *localtime(¤t_datetime_t); |  | ||||||
|  |  | ||||||
| 			char buffer_datetime[80]; |  | ||||||
| 			strftime(buffer_datetime, 80, "%Y-%m-%dT%H:%M:%S", ¤t_datetime); |  | ||||||
|  |  | ||||||
| 			//Make new datetime string and call function again recursively |  | ||||||
| 			start_datetime = buffer_datetime; |  | ||||||
| 			return floor(GetCostFromDuration(cfg, payment_option, start_datetime, durationMin, true, prepaid)); |  | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
| 	while (true) |     while(true) | ||||||
|     { |     { | ||||||
| 		if (!Utilities::IsYearPeriodActive(cfg, ¤t_datetime)) |         if(total_duration_min <= 0) break; | ||||||
|  |  | ||||||
|  |         // Check year period | ||||||
|  |         bool isYearPeriodActive = false; | ||||||
|  |  | ||||||
|  |         //// Parse input date | ||||||
|  |         int dayCurrent = inputDate.date().day(); | ||||||
|  |         int monthCurrent = inputDate.date().month(); | ||||||
|  |  | ||||||
|  |         // Current date time | ||||||
|  |         int cdt = (monthCurrent * 100) + dayCurrent; | ||||||
|  |  | ||||||
|  |         multimap<int, ATBPeriodYear>::iterator year_period_itr; | ||||||
|  |         for (year_period_itr = cfg->YearPeriod.begin(); year_period_itr != cfg->YearPeriod.end(); ++year_period_itr) | ||||||
|  |         { | ||||||
|  |             int dStart = year_period_itr->second.pye_start_day; | ||||||
|  |             int dEnd = year_period_itr->second.pye_end_day; | ||||||
|  |  | ||||||
|  |             int mStart = year_period_itr->second.pye_start_month; | ||||||
|  |             int mEnd = year_period_itr->second.pye_end_month; | ||||||
|  |  | ||||||
|  |             int start = (mStart * 100) + dStart; | ||||||
|  |             int end = (mEnd * 100) + dEnd; | ||||||
|  |  | ||||||
|  |             if (cdt >= start && cdt <= end) { | ||||||
|  |                 isYearPeriodActive = true; | ||||||
|  |                 break; | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |         if (!isYearPeriodActive) | ||||||
|         { |         { | ||||||
|             LOG_DEBUG("Year period is not valid"); |             LOG_DEBUG("Year period is not valid"); | ||||||
|             return 0.0f; |             return 0.0f; | ||||||
|         } |         } | ||||||
|  |  | ||||||
| 		// Decrement by 1 minute |         // Go to next day if minutes not spent | ||||||
| 		current_datetime_t = mktime(¤t_datetime); |         if(inputDate.time() >= worktime_to) | ||||||
| 		current_datetime_t += 60; |  | ||||||
| 		current_datetime = *localtime(¤t_datetime_t); |  | ||||||
|  |  | ||||||
| 		total_duration_min -= 1.0f; |  | ||||||
| 		total_cost += price_per_unit; |  | ||||||
|  |  | ||||||
| 		// If no minutes left (e.g. spent all of the money before reaching end of worktime) |  | ||||||
| 		if (total_duration_min <= 0) |  | ||||||
| 		{ |  | ||||||
| 			//total_duration_min -= 1.0f; |  | ||||||
| 			LOG_DEBUG("No minutes left "); |  | ||||||
| 			break; |  | ||||||
| 		} |  | ||||||
| 		else |  | ||||||
| 		{ |  | ||||||
| 			// If minutes has left but the end of worktime has been reached (go to next day) |  | ||||||
| 			if (current_datetime_t >= to_datetime_t) |  | ||||||
|         { |         { | ||||||
|             int carry_over_status = 0; |             int carry_over_status = 0; | ||||||
|             carry_over_status = cfg->PaymentOption.find(payment_option)->second.pop_carry_over; |             carry_over_status = cfg->PaymentOption.find(payment_option)->second.pop_carry_over; | ||||||
| 				total_duration_min += 1.0f; |  | ||||||
| 				total_cost -= price_per_unit; |  | ||||||
|  |  | ||||||
| 				LOG_DEBUG("Carry over status: ", carry_over_status); |  | ||||||
|             if (carry_over_status < 1) break; |             if (carry_over_status < 1) break; | ||||||
|  |  | ||||||
| 				LOG_DEBUG("Reached end of worktime"); |             LOG_DEBUG("Reached end of worktime, searching for the next working day"); | ||||||
| 				LOG_DEBUG("Trying to find next available day, min left = ", total_duration_min); |             inputDate = inputDate.addDays(1); | ||||||
| 				current_datetime_t = mktime(¤t_datetime); |  | ||||||
| 				current_datetime_t += 86400; |  | ||||||
| 				current_datetime = *localtime(¤t_datetime_t); |  | ||||||
|  |  | ||||||
| 				char buffer_datetime[80]; |  | ||||||
| 				strftime(buffer_datetime, 80, "%Y-%m-%dT%H:%M:%S", ¤t_datetime); |  | ||||||
|  |  | ||||||
| 				// Make new datetime string and call function again recursively |  | ||||||
| 				start_datetime = buffer_datetime; |  | ||||||
|             overtime = true; |             overtime = true; | ||||||
| 				return floor(GetCostFromDuration(cfg, payment_option, start_datetime, total_duration_min)); |             return GetCostFromDuration(cfg, payment_option, inputDate.toString(Qt::ISODate).toStdString().c_str(), total_duration_min); | ||||||
| 			} |  | ||||||
| 		} |  | ||||||
|         } |         } | ||||||
|  |  | ||||||
| 	time_t valid_until_datetime_t = current_datetime_t; |         // Increment input date minutes for each monetary unit | ||||||
| 	struct tm valid_until_datetime = *localtime(&valid_until_datetime_t); |         inputDate = inputDate.addSecs(60); | ||||||
| 	LOG_DEBUG("Ticket is valid until ", asctime(&valid_until_datetime)); |         total_duration_min -=1; | ||||||
|  |         total_cost += price_per_unit; | ||||||
|  |  | ||||||
|  |     } | ||||||
|  |     qDebug() << "Valid until:" << inputDate.toString(Qt::ISODate).toStdString().c_str(); | ||||||
|     double ret_val = total_cost; |     double ret_val = total_cost; | ||||||
|     total_cost = 0.0f; |     total_cost = 0.0f; | ||||||
|     return ceil(ret_val); |     return ceil(ret_val); | ||||||
|     // return floor(ret_val); |  | ||||||
| } | } | ||||||
|   | |||||||
| @@ -33,7 +33,7 @@ time_t Utilities::GetCurrentLocalTime() | |||||||
| 		memset(&tm_curr_time, '\0', sizeof(struct tm)); | 		memset(&tm_curr_time, '\0', sizeof(struct tm)); | ||||||
|  |  | ||||||
| 		tm_curr_time = *localtime(&curr_time); | 		tm_curr_time = *localtime(&curr_time); | ||||||
| 		curr_time = mktime(&tm_curr_time) - timezone; |         curr_time = mktime(&tm_curr_time); //- timezone; | ||||||
| 		return curr_time; | 		return curr_time; | ||||||
| 	} | 	} | ||||||
| 	catch (...) | 	catch (...) | ||||||
|   | |||||||
							
								
								
									
										132
									
								
								main/main.cpp
									
									
									
									
									
								
							
							
						
						
									
										132
									
								
								main/main.cpp
									
									
									
									
									
								
							| @@ -31,12 +31,12 @@ extern "C" char* strptime(const char* s, | |||||||
| int main() { | int main() { | ||||||
|  |  | ||||||
|     parking_tariff_t *tariff = 0; |     parking_tariff_t *tariff = 0; | ||||||
|     if (init_tariff(&tariff, "/etc/psa_tariff/")) { |     if (init_tariff(&tariff, "C:\\Users\\MROD\\Documents\\QtCreator\\build-MOBILISIS-Calculator-Desktop_Qt_5_12_12_MSVC2017_32bit-Debug\\main\\etc\\psa_tariff\\zone1.json")) { | ||||||
|         struct price_t price; |         struct price_t price; | ||||||
|         memset(&price, 0x00, sizeof(price)); |         memset(&price, 0x00, sizeof(price)); | ||||||
|         QDateTime start = QDateTime::currentDateTime(); |         QDateTime start = QDateTime::fromString("2023-05-11T07:50:00",Qt::ISODate); //QDateTime::currentDateTime(); | ||||||
|         time_t start_parking_time = start.toSecsSinceEpoch() / 60; |         time_t start_parking_time = start.toSecsSinceEpoch() / 60; | ||||||
|         time_t end_parking_time = start_parking_time + 60; |         time_t end_parking_time = start_parking_time + 1230; | ||||||
|  |  | ||||||
|         if (compute_price_for_parking_ticket(tariff, |         if (compute_price_for_parking_ticket(tariff, | ||||||
|                                              start_parking_time, |                                              start_parking_time, | ||||||
| @@ -45,70 +45,76 @@ int main() { | |||||||
|             qDebug() << "price=" << price.netto; |             qDebug() << "price=" << price.netto; | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         // tests | //        QString duration; | ||||||
|         struct tm now; | //        if(compute_duration_for_parking_ticket(tariff,start_parking_time,3090,duration)) | ||||||
|         memset(&now, 0, sizeof(now)); | //        { | ||||||
|  | //            qDebug() << "duration=" << duration; | ||||||
|  | //        } | ||||||
|  |  | ||||||
|         // 3.Jan 2023 -> Tuesday | //        // tests | ||||||
|         strptime("2023-01-03T14:00:00", "%Y-%m-%dT%H:%M:%S", &now); | //        struct tm now; | ||||||
|         for (int i = 0; i < 600; ++i) { | //        memset(&now, 0, sizeof(now)); | ||||||
|             start_parking_time = mktime(&now); |  | ||||||
|             end_parking_time = start_parking_time + 240; // duration == 240 |  | ||||||
|  |  | ||||||
|             if (compute_price_for_parking_ticket(tariff, | //        // 3.Jan 2023 -> Tuesday | ||||||
|                                                  start_parking_time, | //        strptime("2023-01-03T14:00:00", "%Y-%m-%dT%H:%M:%S", &now); | ||||||
|                                                  end_parking_time, | //        for (int i = 0; i < 600; ++i) { | ||||||
|                                                  &price)) { | //            start_parking_time = mktime(&now); | ||||||
|                 int const zone = get_zone_nr(); | //            end_parking_time = start_parking_time + 240; // duration == 240 | ||||||
|                 switch (zone) { |  | ||||||
|                 case 1: |  | ||||||
|                     assert(price.netto == 879);    // expected value: 880 |  | ||||||
|                     break; |  | ||||||
|                 case 2: |  | ||||||
|                     /* fall through */ |  | ||||||
|                 case 3: |  | ||||||
|                     assert(price.netto == 1920); |  | ||||||
|                     break; |  | ||||||
|                 } |  | ||||||
|             } |  | ||||||
|             time_t t = start_parking_time + 60; |  | ||||||
|             now = *localtime(&t); |  | ||||||
|         } |  | ||||||
|         // |  | ||||||
|         // test May 1st 2023 |  | ||||||
|         // |  | ||||||
|         memset(&now, 0, sizeof(now)); |  | ||||||
|         strptime("2023-04-30T06:00:00", "%Y-%m-%dT%H:%M:%S", &now); |  | ||||||
|         now.tm_hour -= 1; // for ctime |  | ||||||
|         // for (int i=0; i<6*24; ++i) { |  | ||||||
|         for (int i=0; i<1; ++i) { |  | ||||||
|             int const duration = 120; |  | ||||||
|             time_t t = mktime(&now); |  | ||||||
|             start_parking_time = t / 60; |  | ||||||
|             end_parking_time = start_parking_time + duration; |  | ||||||
|  |  | ||||||
|             if (compute_price_for_parking_ticket(tariff, | //            if (compute_price_for_parking_ticket(tariff, | ||||||
|                                                  start_parking_time, | //                                                 start_parking_time, | ||||||
|                                                  end_parking_time, | //                                                 end_parking_time, | ||||||
|                                                  &price)) { | //                                                 &price)) { | ||||||
|                 int const zone = get_zone_nr(); | //                int const zone = get_zone_nr(1); | ||||||
|                 switch (zone) { | //                switch (zone) { | ||||||
|                 case 1: | //                case 1: | ||||||
|                     qDebug() << i << zone << ctime(&t) << price.netto << " FT"; | //                    assert(price.netto == 879);    // expected value: 880 | ||||||
|                     assert(price.netto == 440); | //                    break; | ||||||
|                     break; | //                case 2: | ||||||
|                 case 2: | //                    /* fall through */ | ||||||
|                     /* fall through */ | //                case 3: | ||||||
|                 case 3: | //                    assert(price.netto == 1920); | ||||||
|                     qDebug() << i << zone << ctime(&t) << price.netto << " FT"; | //                    break; | ||||||
|                     assert(price.netto == 960); | //                } | ||||||
|                     break; | //            } | ||||||
|                 } | //            time_t t = start_parking_time + 60; | ||||||
|             } | //            now = *localtime(&t); | ||||||
|  | //        } | ||||||
|  | //        // | ||||||
|  | //        // test May 1st 2023 | ||||||
|  | //        // | ||||||
|  | //        memset(&now, 0, sizeof(now)); | ||||||
|  | //        strptime("2023-04-30T06:00:00", "%Y-%m-%dT%H:%M:%S", &now); | ||||||
|  | //        now.tm_hour -= 1; // for ctime | ||||||
|  | //        // for (int i=0; i<6*24; ++i) { | ||||||
|  | //        for (int i=0; i<1; ++i) { | ||||||
|  | //            int const duration = 120; | ||||||
|  | //            time_t t = mktime(&now); | ||||||
|  | //            start_parking_time = t / 60; | ||||||
|  | //            end_parking_time = start_parking_time + duration; | ||||||
|  |  | ||||||
|             t = (start_parking_time + 60)*60; | //            if (compute_price_for_parking_ticket(tariff, | ||||||
|             now = *localtime(&t); | //                                                 start_parking_time, | ||||||
|         } | //                                                 end_parking_time, | ||||||
|  | //                                                 &price)) { | ||||||
|  | //                int const zone = get_zone_nr(); | ||||||
|  | //                switch (zone) { | ||||||
|  | //                case 1: | ||||||
|  | //                    qDebug() << i << zone << ctime(&t) << price.netto << " FT"; | ||||||
|  | //                    assert(price.netto == 440); | ||||||
|  | //                    break; | ||||||
|  | //                case 2: | ||||||
|  | //                    /* fall through */ | ||||||
|  | //                case 3: | ||||||
|  | //                    qDebug() << i << zone << ctime(&t) << price.netto << " FT"; | ||||||
|  | //                    assert(price.netto == 960); | ||||||
|  | //                    break; | ||||||
|  | //                } | ||||||
|  | //            } | ||||||
|  |  | ||||||
|  | //            t = (start_parking_time + 60)*60; | ||||||
|  | //            now = *localtime(&t); | ||||||
|  | //        } | ||||||
|  |  | ||||||
|         free_tariff(tariff); |         free_tariff(tariff); | ||||||
|     } |     } | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user