Reformat to Unix.
Add overload for IsYearPeriodActive(). Add several helpers.
This commit is contained in:
		@@ -1,319 +1,375 @@
 | 
				
			|||||||
#include "utilities.h"
 | 
					#include "utilities.h"
 | 
				
			||||||
#include "tariff_log.h"
 | 
					#include "tariff_log.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <QDebug>
 | 
					#include <QDebug>
 | 
				
			||||||
 | 
					#include <algorithm>
 | 
				
			||||||
static int protection_counter = 0;
 | 
					
 | 
				
			||||||
 | 
					static int protection_counter = 0;
 | 
				
			||||||
/// <summary>
 | 
					
 | 
				
			||||||
/// Helper function
 | 
					/// <summary>
 | 
				
			||||||
/// </summary>
 | 
					/// Helper function
 | 
				
			||||||
/// <param name="pra_price"></param>
 | 
					/// </summary>
 | 
				
			||||||
/// <returns></returns>
 | 
					/// <param name="pra_price"></param>
 | 
				
			||||||
double Utilities::CalculatePricePerUnit(double pra_price, double durationUnit)
 | 
					/// <returns></returns>
 | 
				
			||||||
{
 | 
					double Utilities::CalculatePricePerUnit(double pra_price, double durationUnit)
 | 
				
			||||||
	try
 | 
					{
 | 
				
			||||||
	{
 | 
						try
 | 
				
			||||||
		double price_per_unit = pra_price;
 | 
						{
 | 
				
			||||||
        double unit = durationUnit;
 | 
							double price_per_unit = pra_price;
 | 
				
			||||||
 | 
					        double unit = durationUnit;
 | 
				
			||||||
        if(unit < 0 || unit > 65535 ) unit = 60.0f;
 | 
					
 | 
				
			||||||
        price_per_unit /= unit; // Divided by 60 because price per unit is set per hour and we are using minutes
 | 
					        if(unit < 0 || unit > 65535 ) unit = 60.0f;
 | 
				
			||||||
		//printf("Price per unit (min) is: %lf\n", price_per_unit);
 | 
					        price_per_unit /= unit; // Divided by 60 because price per unit is set per hour and we are using minutes
 | 
				
			||||||
		return price_per_unit;
 | 
							//printf("Price per unit (min) is: %lf\n", price_per_unit);
 | 
				
			||||||
	}
 | 
							return price_per_unit;
 | 
				
			||||||
	catch (...)
 | 
						}
 | 
				
			||||||
	{
 | 
						catch (...)
 | 
				
			||||||
		throw std::invalid_argument("An error has occurred in CalculatePricePerUnit() function\n");
 | 
						{
 | 
				
			||||||
	}
 | 
							throw std::invalid_argument("An error has occurred in CalculatePricePerUnit() function\n");
 | 
				
			||||||
}
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
/// <inheritdoc/>
 | 
					
 | 
				
			||||||
time_t Utilities::GetCurrentLocalTime()
 | 
					/// <inheritdoc/>
 | 
				
			||||||
{
 | 
					time_t Utilities::GetCurrentLocalTime()
 | 
				
			||||||
	try
 | 
					{
 | 
				
			||||||
	{
 | 
						try
 | 
				
			||||||
		time_t curr_time = time(NULL);
 | 
						{
 | 
				
			||||||
		tm tm_curr_time = {};
 | 
							time_t curr_time = time(NULL);
 | 
				
			||||||
		memset(&tm_curr_time, '\0', sizeof(struct tm));
 | 
							tm tm_curr_time = {};
 | 
				
			||||||
 | 
							memset(&tm_curr_time, '\0', sizeof(struct tm));
 | 
				
			||||||
		tm_curr_time = *localtime(&curr_time);
 | 
					
 | 
				
			||||||
        curr_time = mktime(&tm_curr_time); //- timezone;
 | 
							tm_curr_time = *localtime(&curr_time);
 | 
				
			||||||
		return curr_time;
 | 
					        curr_time = mktime(&tm_curr_time); //- timezone;
 | 
				
			||||||
	}
 | 
							return curr_time;
 | 
				
			||||||
	catch (...)
 | 
						}
 | 
				
			||||||
	{
 | 
						catch (...)
 | 
				
			||||||
		throw std::invalid_argument("An error has occurred in GetCurrentLocalTime() function\n");
 | 
						{
 | 
				
			||||||
	}
 | 
							throw std::invalid_argument("An error has occurred in GetCurrentLocalTime() function\n");
 | 
				
			||||||
}
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
/// <inheritdoc/>
 | 
					
 | 
				
			||||||
int Utilities::ZellersAlgorithm(int day, int month, int year)
 | 
					/// <inheritdoc/>
 | 
				
			||||||
{
 | 
					int Utilities::ZellersAlgorithm(int day, int month, int year)
 | 
				
			||||||
	int mon;
 | 
					{
 | 
				
			||||||
	if (month > 2) mon = month; //for march to december month code is same as month
 | 
						int mon;
 | 
				
			||||||
	else {
 | 
						if (month > 2) mon = month; //for march to december month code is same as month
 | 
				
			||||||
		mon = (12 + month); //for Jan and Feb, month code will be 13 and 14
 | 
						else {
 | 
				
			||||||
		year--; //decrease year for month Jan and Feb
 | 
							mon = (12 + month); //for Jan and Feb, month code will be 13 and 14
 | 
				
			||||||
	}
 | 
							year--; //decrease year for month Jan and Feb
 | 
				
			||||||
	int y = year % 100; //last two digit
 | 
						}
 | 
				
			||||||
	int c = year / 100; //first two digit
 | 
						int y = year % 100; //last two digit
 | 
				
			||||||
	int w = (day + floor((13 * (mon + 1)) / 5) + y + floor(y / 4) + floor(c / 4) + (5 * c));
 | 
						int c = year / 100; //first two digit
 | 
				
			||||||
	w = ((w + 5) % 7) + 1; //w % 7;
 | 
						int w = (day + floor((13 * (mon + 1)) / 5) + y + floor(y / 4) + floor(c / 4) + (5 * c));
 | 
				
			||||||
	return w;
 | 
						w = ((w + 5) % 7) + 1; //w % 7;
 | 
				
			||||||
}
 | 
						return w;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
/// <inheritdoc/>
 | 
					
 | 
				
			||||||
struct tm Utilities::DateToStructTm(const char* dateStr)
 | 
					/// <inheritdoc/>
 | 
				
			||||||
{
 | 
					struct tm Utilities::DateToStructTm(const char* dateStr)
 | 
				
			||||||
	struct tm t = {};
 | 
					{
 | 
				
			||||||
	memset(&t, '\0', sizeof(struct tm));
 | 
						struct tm t = {};
 | 
				
			||||||
 | 
						memset(&t, '\0', sizeof(struct tm));
 | 
				
			||||||
	if (dateStr == nullptr || strlen(dateStr) <= 0) throw std::invalid_argument("DateToStructTm has failed parsing date string (null or empty)\n");
 | 
					
 | 
				
			||||||
	try
 | 
						if (dateStr == nullptr || strlen(dateStr) <= 0) throw std::invalid_argument("DateToStructTm has failed parsing date string (null or empty)\n");
 | 
				
			||||||
	{
 | 
						try
 | 
				
			||||||
		int success = sscanf(dateStr, "%d-%d-%d", &t.tm_year, &t.tm_mon, &t.tm_mday);
 | 
						{
 | 
				
			||||||
		if (success != 3) throw std::invalid_argument("DateToStructTm() has failed parsing datetime string\n");
 | 
							int success = sscanf(dateStr, "%d-%d-%d", &t.tm_year, &t.tm_mon, &t.tm_mday);
 | 
				
			||||||
 | 
							if (success != 3) throw std::invalid_argument("DateToStructTm() has failed parsing datetime string\n");
 | 
				
			||||||
		t.tm_year = t.tm_year - 1900;
 | 
					
 | 
				
			||||||
		t.tm_mon = t.tm_mon - 1;
 | 
							t.tm_year = t.tm_year - 1900;
 | 
				
			||||||
		t.tm_isdst = 0;
 | 
							t.tm_mon = t.tm_mon - 1;
 | 
				
			||||||
		return t;
 | 
							t.tm_isdst = 0;
 | 
				
			||||||
	}
 | 
							return t;
 | 
				
			||||||
	catch (...)
 | 
						}
 | 
				
			||||||
	{
 | 
						catch (...)
 | 
				
			||||||
		throw std::invalid_argument("An error has occurred in DateToStructTm() function\n");
 | 
						{
 | 
				
			||||||
	}
 | 
							throw std::invalid_argument("An error has occurred in DateToStructTm() function\n");
 | 
				
			||||||
}
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
/// <inheritdoc/>
 | 
					
 | 
				
			||||||
struct tm Utilities::TimeToStructTm(const char* timeStr, int year, int mon, int mday, int wday)
 | 
					/// <inheritdoc/>
 | 
				
			||||||
{
 | 
					struct tm Utilities::TimeToStructTm(const char* timeStr, int year, int mon, int mday, int wday)
 | 
				
			||||||
	struct tm t = {};
 | 
					{
 | 
				
			||||||
	memset(&t, '\0', sizeof(struct tm));
 | 
						struct tm t = {};
 | 
				
			||||||
 | 
						memset(&t, '\0', sizeof(struct tm));
 | 
				
			||||||
	if (timeStr == nullptr || strlen(timeStr) <= 0) throw std::invalid_argument("TimeToStructTm() has failed parsing time string (null or empty)\n");
 | 
					
 | 
				
			||||||
	try
 | 
						if (timeStr == nullptr || strlen(timeStr) <= 0) throw std::invalid_argument("TimeToStructTm() has failed parsing time string (null or empty)\n");
 | 
				
			||||||
	{
 | 
						try
 | 
				
			||||||
		int success_time = sscanf(timeStr, "%d:%d:%d", &t.tm_hour, &t.tm_min, &t.tm_sec);
 | 
						{
 | 
				
			||||||
		if (success_time != 3) throw std::invalid_argument("TimeToStructTm() has failed parsing time string\n");
 | 
							int success_time = sscanf(timeStr, "%d:%d:%d", &t.tm_hour, &t.tm_min, &t.tm_sec);
 | 
				
			||||||
 | 
							if (success_time != 3) throw std::invalid_argument("TimeToStructTm() has failed parsing time string\n");
 | 
				
			||||||
		struct tm tm_struct;
 | 
					
 | 
				
			||||||
		t.tm_year = year;
 | 
							struct tm tm_struct;
 | 
				
			||||||
		t.tm_mon = mon;
 | 
							t.tm_year = year;
 | 
				
			||||||
		t.tm_mday = mday;
 | 
							t.tm_mon = mon;
 | 
				
			||||||
		t.tm_wday = wday;
 | 
							t.tm_mday = mday;
 | 
				
			||||||
		t.tm_isdst = 0;
 | 
							t.tm_wday = wday;
 | 
				
			||||||
		return t;
 | 
							t.tm_isdst = 0;
 | 
				
			||||||
	}
 | 
							return t;
 | 
				
			||||||
	catch (...)
 | 
						}
 | 
				
			||||||
	{
 | 
						catch (...)
 | 
				
			||||||
		throw std::invalid_argument("An error has occurred in TimeToStructTm() function\n");
 | 
						{
 | 
				
			||||||
	}
 | 
							throw std::invalid_argument("An error has occurred in TimeToStructTm() function\n");
 | 
				
			||||||
}
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
/// <inheritdoc/>
 | 
					
 | 
				
			||||||
struct tm Utilities::DateTimeToStructTm(const char* dateTimeStr)
 | 
					/// <inheritdoc/>
 | 
				
			||||||
{
 | 
					struct tm Utilities::DateTimeToStructTm(const char* dateTimeStr)
 | 
				
			||||||
	struct tm t = {};
 | 
					{
 | 
				
			||||||
	memset(&t, '\0', sizeof(struct tm));
 | 
						struct tm t = {};
 | 
				
			||||||
 | 
						memset(&t, '\0', sizeof(struct tm));
 | 
				
			||||||
	if (dateTimeStr == nullptr || strlen(dateTimeStr) <= 0) throw std::invalid_argument("DateTimeToStructTm() has failed parsing date string (null or empty)");
 | 
					
 | 
				
			||||||
	try
 | 
						if (dateTimeStr == nullptr || strlen(dateTimeStr) <= 0) throw std::invalid_argument("DateTimeToStructTm() has failed parsing date string (null or empty)");
 | 
				
			||||||
	{
 | 
						try
 | 
				
			||||||
		int success = sscanf(dateTimeStr, "%d-%d-%dT%d:%d:%dZ", &t.tm_year, &t.tm_mon, &t.tm_mday, &t.tm_hour, &t.tm_min, &t.tm_sec);
 | 
						{
 | 
				
			||||||
		if (success != 6) throw std::invalid_argument("DateTimeToStructTm() has failed parsing datetime string\n");
 | 
							int success = sscanf(dateTimeStr, "%d-%d-%dT%d:%d:%dZ", &t.tm_year, &t.tm_mon, &t.tm_mday, &t.tm_hour, &t.tm_min, &t.tm_sec);
 | 
				
			||||||
 | 
							if (success != 6) throw std::invalid_argument("DateTimeToStructTm() has failed parsing datetime string\n");
 | 
				
			||||||
		t.tm_year = t.tm_year - 1900;
 | 
					
 | 
				
			||||||
		t.tm_mon = t.tm_mon - 1;
 | 
							t.tm_year = t.tm_year - 1900;
 | 
				
			||||||
		t.tm_isdst = 0;
 | 
							t.tm_mon = t.tm_mon - 1;
 | 
				
			||||||
		return t;
 | 
							t.tm_isdst = 0;
 | 
				
			||||||
	}
 | 
							return t;
 | 
				
			||||||
	catch (...)
 | 
						}
 | 
				
			||||||
	{
 | 
						catch (...)
 | 
				
			||||||
		throw std::invalid_argument("An error has occurred in DateTimeToStructTm() function\n");
 | 
						{
 | 
				
			||||||
	}
 | 
							throw std::invalid_argument("An error has occurred in DateTimeToStructTm() function\n");
 | 
				
			||||||
}
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
/// <inheritdoc/>
 | 
					
 | 
				
			||||||
DayOfWeek Utilities::GetDayOfWeek(struct tm* t)
 | 
					/// <inheritdoc/>
 | 
				
			||||||
{
 | 
					DayOfWeek Utilities::GetDayOfWeek(struct tm* t)
 | 
				
			||||||
	if (t == nullptr) throw std::invalid_argument("GetDayOfWeekFromDate() => parameter 't' is null\n");
 | 
					{
 | 
				
			||||||
	try
 | 
						if (t == nullptr) throw std::invalid_argument("GetDayOfWeekFromDate() => parameter 't' is null\n");
 | 
				
			||||||
	{
 | 
						try
 | 
				
			||||||
		int d = t->tm_mday;
 | 
						{
 | 
				
			||||||
		int m = t->tm_mon + 1;
 | 
							int d = t->tm_mday;
 | 
				
			||||||
		int y = t->tm_year + 1900;
 | 
							int m = t->tm_mon + 1;
 | 
				
			||||||
 | 
							int y = t->tm_year + 1900;
 | 
				
			||||||
		int wd = Utilities::ZellersAlgorithm(d, m, y);
 | 
					
 | 
				
			||||||
		return static_cast<DayOfWeek>(wd);
 | 
							int wd = Utilities::ZellersAlgorithm(d, m, y);
 | 
				
			||||||
	}
 | 
							return static_cast<DayOfWeek>(wd);
 | 
				
			||||||
	catch (...)
 | 
						}
 | 
				
			||||||
	{
 | 
						catch (...)
 | 
				
			||||||
		throw std::invalid_argument("An error has occurred in GetDayOfWeekFromDate() function\n");
 | 
						{
 | 
				
			||||||
	}
 | 
							throw std::invalid_argument("An error has occurred in GetDayOfWeekFromDate() function\n");
 | 
				
			||||||
}
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
/// <inheritdoc/>
 | 
					
 | 
				
			||||||
bool Utilities::IsYearPeriodActive(Configuration* cfg, struct tm* currentDateTime_tm)
 | 
					/// <inheritdoc/>
 | 
				
			||||||
{
 | 
					bool Utilities::IsYearPeriodActive(Configuration* cfg, struct tm* currentDateTime_tm)
 | 
				
			||||||
	if (cfg == nullptr) throw std::invalid_argument("IsYearPeriodActive() = > Configuration not set\n");
 | 
					{
 | 
				
			||||||
	if (currentDateTime_tm == nullptr) throw std::invalid_argument("IsYearPeriodActive() = > Current datetime not set\n");
 | 
						if (cfg == nullptr) throw std::invalid_argument("IsYearPeriodActive() = > Configuration not set\n");
 | 
				
			||||||
 | 
						if (currentDateTime_tm == nullptr) throw std::invalid_argument("IsYearPeriodActive() = > Current datetime not set\n");
 | 
				
			||||||
	try
 | 
					
 | 
				
			||||||
	{
 | 
						try
 | 
				
			||||||
		//// Parse input date
 | 
						{
 | 
				
			||||||
		int dayCurrent = currentDateTime_tm->tm_mday;
 | 
							//// Parse input date
 | 
				
			||||||
		int monthCurrent = currentDateTime_tm->tm_mon + 1;
 | 
							int dayCurrent = currentDateTime_tm->tm_mday;
 | 
				
			||||||
 | 
							int monthCurrent = currentDateTime_tm->tm_mon + 1;
 | 
				
			||||||
		// Current date time
 | 
					
 | 
				
			||||||
		int cdt = (monthCurrent * 100) + dayCurrent;
 | 
							// 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)
 | 
							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 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 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;
 | 
								int start = (mStart * 100) + dStart;
 | 
				
			||||||
 | 
								int end = (mEnd * 100) + dEnd;
 | 
				
			||||||
			if (cdt >= start && cdt <= end)
 | 
					
 | 
				
			||||||
			{
 | 
								if (cdt >= start && cdt <= end)
 | 
				
			||||||
				return true;
 | 
								{
 | 
				
			||||||
			}
 | 
									return true;
 | 
				
			||||||
		}
 | 
								}
 | 
				
			||||||
		return false;
 | 
							}
 | 
				
			||||||
	}
 | 
							return false;
 | 
				
			||||||
	catch (...)
 | 
						}
 | 
				
			||||||
	{
 | 
						catch (...)
 | 
				
			||||||
		cout << "IsYearPeriodActive() => An exception has occurred, ignoring check, returning true" << endl;
 | 
						{
 | 
				
			||||||
		return true;
 | 
							cout << "IsYearPeriodActive() => An exception has occurred, ignoring check, returning true" << endl;
 | 
				
			||||||
	}
 | 
							return true;
 | 
				
			||||||
}
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
/// <inheritdoc/>
 | 
					
 | 
				
			||||||
bool Utilities::CheckSpecialDay(Configuration* cfg, const char* currentDateTimeStr, int* specialDayId, double* specialDayPrice)
 | 
					bool Utilities::IsYearPeriodActive(Configuration const *cfg, QDateTime const &dt) {
 | 
				
			||||||
{
 | 
					    if (std::none_of(cfg->YearPeriod.cbegin(),
 | 
				
			||||||
	try
 | 
					                     cfg->YearPeriod.cend(),
 | 
				
			||||||
	{
 | 
					            [&dt](std::pair<int, ATBPeriodYear> const &year) {
 | 
				
			||||||
		*specialDayId = -1;
 | 
					                QDate const d(2004, // 2004 is a leap year
 | 
				
			||||||
		*specialDayPrice = 0.0f;
 | 
					                              dt.date().month(),
 | 
				
			||||||
 | 
					                              dt.date().day());
 | 
				
			||||||
		if (cfg == nullptr) throw std::invalid_argument("CheckSpecialDay() => configuration is not set\n");
 | 
					                QDate const s(2004, year.second.pye_start_month, year.second.pye_start_day);
 | 
				
			||||||
		if (currentDateTimeStr == nullptr) throw std::invalid_argument("CheckSpecialDay() => invalid date/time string set\n");
 | 
					                QDate const e(2004, year.second.pye_end_month, year.second.pye_end_day);
 | 
				
			||||||
 | 
					                return (d >= s && d <= e);
 | 
				
			||||||
 | 
					            })) {
 | 
				
			||||||
		struct tm current_tm = Utilities::DateTimeToStructTm(currentDateTimeStr);
 | 
					        qCritical() << "NO VALID YEAR PERIOD";
 | 
				
			||||||
		//cout << "CheckSpecialDay() => Current: " << asctime(¤t_tm) << endl;
 | 
					        return false;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
		multimap<int, ATBSpecialDays>::iterator spec_days_itr;
 | 
					    return true;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
		for (spec_days_itr = cfg->SpecialDays.begin(); spec_days_itr != cfg->SpecialDays.end(); spec_days_itr++)
 | 
					
 | 
				
			||||||
		{
 | 
					/// <inheritdoc/>
 | 
				
			||||||
			int repeat_every_year = 0;
 | 
					bool Utilities::CheckSpecialDay(Configuration* cfg, const char* currentDateTimeStr, int* specialDayId, double* specialDayPrice)
 | 
				
			||||||
			repeat_every_year = spec_days_itr->second.ped_year;
 | 
					{
 | 
				
			||||||
 | 
						try
 | 
				
			||||||
			string start = spec_days_itr->second.ped_date_start;
 | 
						{
 | 
				
			||||||
			if (start.length() <= 0) continue;
 | 
							*specialDayId = -1;
 | 
				
			||||||
			//cout << "CheckSpecialDay() => Start: " << start << endl;
 | 
							*specialDayPrice = 0.0f;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			string end = spec_days_itr->second.ped_date_end;
 | 
							if (cfg == nullptr) throw std::invalid_argument("CheckSpecialDay() => configuration is not set\n");
 | 
				
			||||||
			if (end.length() <= 0) continue;
 | 
							if (currentDateTimeStr == nullptr) throw std::invalid_argument("CheckSpecialDay() => invalid date/time string set\n");
 | 
				
			||||||
			//cout << "CheckSpecialDay() => End: " << end << endl;
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			struct tm start_tm = Utilities::DateToStructTm(start.c_str());
 | 
							struct tm current_tm = Utilities::DateTimeToStructTm(currentDateTimeStr);
 | 
				
			||||||
			//cout << "CheckSpecialDay() => Start: " << asctime(&start_tm) << endl;
 | 
							//cout << "CheckSpecialDay() => Current: " << asctime(¤t_tm) << endl;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			struct tm end_tm = Utilities::DateToStructTm(end.c_str());
 | 
							multimap<int, ATBSpecialDays>::iterator spec_days_itr;
 | 
				
			||||||
			//cout << "CheckSpecialDay() => End: " << asctime(&end_tm) << endl;
 | 
					
 | 
				
			||||||
 | 
							for (spec_days_itr = cfg->SpecialDays.begin(); spec_days_itr != cfg->SpecialDays.end(); spec_days_itr++)
 | 
				
			||||||
			if (repeat_every_year <= 0)
 | 
							{
 | 
				
			||||||
			{
 | 
								int repeat_every_year = 0;
 | 
				
			||||||
				//cout << "CheckSpecialDay() => Repeat every year is: 0" << endl;
 | 
								repeat_every_year = spec_days_itr->second.ped_year;
 | 
				
			||||||
				if ((current_tm.tm_year == start_tm.tm_year) && (current_tm.tm_year == end_tm.tm_year))
 | 
					
 | 
				
			||||||
				{
 | 
								string start = spec_days_itr->second.ped_date_start;
 | 
				
			||||||
					if ((current_tm.tm_mon >= start_tm.tm_mon) && (current_tm.tm_mon <= end_tm.tm_mon))
 | 
								if (start.length() <= 0) continue;
 | 
				
			||||||
					{
 | 
								//cout << "CheckSpecialDay() => Start: " << start << endl;
 | 
				
			||||||
						//cout << "CheckSpecialDay() => Month is in range between start and end" << endl;
 | 
					
 | 
				
			||||||
						if ((current_tm.tm_mday >= start_tm.tm_mday) && (current_tm.tm_mday <= end_tm.tm_mday))
 | 
								string end = spec_days_itr->second.ped_date_end;
 | 
				
			||||||
						{
 | 
								if (end.length() <= 0) continue;
 | 
				
			||||||
							LOG_DEBUG("CheckSpecialDay() => SPECIAL DAY");
 | 
								//cout << "CheckSpecialDay() => End: " << end << endl;
 | 
				
			||||||
							*specialDayId = spec_days_itr->second.ped_id;
 | 
					
 | 
				
			||||||
							*specialDayPrice = cfg->SpecialDaysWorktime.find(*specialDayId)->second.pedwt_price;
 | 
								struct tm start_tm = Utilities::DateToStructTm(start.c_str());
 | 
				
			||||||
							return true;
 | 
								//cout << "CheckSpecialDay() => Start: " << asctime(&start_tm) << endl;
 | 
				
			||||||
						}
 | 
					
 | 
				
			||||||
					}
 | 
								struct tm end_tm = Utilities::DateToStructTm(end.c_str());
 | 
				
			||||||
				}
 | 
								//cout << "CheckSpecialDay() => End: " << asctime(&end_tm) << endl;
 | 
				
			||||||
			}
 | 
					
 | 
				
			||||||
			else
 | 
								if (repeat_every_year <= 0)
 | 
				
			||||||
			{
 | 
								{
 | 
				
			||||||
				if ((current_tm.tm_mon >= start_tm.tm_mon) && (current_tm.tm_mon <= end_tm.tm_mon))
 | 
									//cout << "CheckSpecialDay() => Repeat every year is: 0" << endl;
 | 
				
			||||||
				{
 | 
									if ((current_tm.tm_year == start_tm.tm_year) && (current_tm.tm_year == end_tm.tm_year))
 | 
				
			||||||
					//cout << "CheckSpecialDay() => Month is in range between start and end" << endl;
 | 
									{
 | 
				
			||||||
					if ((current_tm.tm_mday >= start_tm.tm_mday) && (current_tm.tm_mday <= end_tm.tm_mday))
 | 
										if ((current_tm.tm_mon >= start_tm.tm_mon) && (current_tm.tm_mon <= end_tm.tm_mon))
 | 
				
			||||||
					{
 | 
										{
 | 
				
			||||||
						LOG_DEBUG("CheckSpecialDay() => SPECIAL DAY");
 | 
											//cout << "CheckSpecialDay() => Month is in range between start and end" << endl;
 | 
				
			||||||
						*specialDayId = spec_days_itr->second.ped_id;
 | 
											if ((current_tm.tm_mday >= start_tm.tm_mday) && (current_tm.tm_mday <= end_tm.tm_mday))
 | 
				
			||||||
						*specialDayPrice = cfg->SpecialDaysWorktime.find(*specialDayId)->second.pedwt_price;
 | 
											{
 | 
				
			||||||
						return true;
 | 
												LOG_DEBUG("CheckSpecialDay() => SPECIAL DAY");
 | 
				
			||||||
					}
 | 
												*specialDayId = spec_days_itr->second.ped_id;
 | 
				
			||||||
				}
 | 
												*specialDayPrice = cfg->SpecialDaysWorktime.find(*specialDayId)->second.pedwt_price;
 | 
				
			||||||
			}
 | 
												return true;
 | 
				
			||||||
		}
 | 
											}
 | 
				
			||||||
		//cout << "CheckSpecialDay() => NOT SPECIAL DAY" << endl;
 | 
										}
 | 
				
			||||||
		return false;
 | 
									}
 | 
				
			||||||
	}
 | 
								}
 | 
				
			||||||
	catch (...)
 | 
								else
 | 
				
			||||||
	{
 | 
								{
 | 
				
			||||||
		throw std::invalid_argument("CheckSpecialDay() => An error has occurred\n");
 | 
									if ((current_tm.tm_mon >= start_tm.tm_mon) && (current_tm.tm_mon <= end_tm.tm_mon))
 | 
				
			||||||
		return false;
 | 
									{
 | 
				
			||||||
	}
 | 
										//cout << "CheckSpecialDay() => Month is in range between start and end" << endl;
 | 
				
			||||||
}
 | 
										if ((current_tm.tm_mday >= start_tm.tm_mday) && (current_tm.tm_mday <= end_tm.tm_mday))
 | 
				
			||||||
 | 
										{
 | 
				
			||||||
bool Utilities::CheckSpecialDay(Configuration const *cfg,
 | 
											LOG_DEBUG("CheckSpecialDay() => SPECIAL DAY");
 | 
				
			||||||
                                QDateTime const ¤tDateTime,
 | 
											*specialDayId = spec_days_itr->second.ped_id;
 | 
				
			||||||
                                int* specialDayId,
 | 
											*specialDayPrice = cfg->SpecialDaysWorktime.find(*specialDayId)->second.pedwt_price;
 | 
				
			||||||
                                uint32_t *specialDayPrice) {
 | 
											return true;
 | 
				
			||||||
    *specialDayId = -1;
 | 
										}
 | 
				
			||||||
    *specialDayPrice = 0;
 | 
									}
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
    std::multimap<int, ATBSpecialDays>::const_iterator spec_days_itr;
 | 
							}
 | 
				
			||||||
 | 
							//cout << "CheckSpecialDay() => NOT SPECIAL DAY" << endl;
 | 
				
			||||||
    for (spec_days_itr = cfg->SpecialDays.cbegin(); spec_days_itr != cfg->SpecialDays.cend(); ++spec_days_itr) {
 | 
							return false;
 | 
				
			||||||
        int repeat_every_year = spec_days_itr->second.ped_year;
 | 
						}
 | 
				
			||||||
        QDate start = QDate::fromString(spec_days_itr->second.ped_date_start.c_str(), Qt::ISODate);
 | 
						catch (...)
 | 
				
			||||||
        QDate end = QDate::fromString(spec_days_itr->second.ped_date_end.c_str(), Qt::ISODate);
 | 
						{
 | 
				
			||||||
        if (start.isValid() && end.isValid()) {
 | 
							throw std::invalid_argument("CheckSpecialDay() => An error has occurred\n");
 | 
				
			||||||
            if ((currentDateTime.date().month() >= start.month()) &&
 | 
							return false;
 | 
				
			||||||
                (currentDateTime.date().month() <= end.month())) {
 | 
						}
 | 
				
			||||||
                if ((currentDateTime.date().day() >= start.day()) &&
 | 
					}
 | 
				
			||||||
                    (currentDateTime.date().day() <= end.day())) {
 | 
					
 | 
				
			||||||
                    if (repeat_every_year <= 0) {
 | 
					bool Utilities::CheckSpecialDay(Configuration const *cfg,
 | 
				
			||||||
                        if ((currentDateTime.date().year() != start.year()) ||
 | 
					                                QDateTime const ¤tDateTime,
 | 
				
			||||||
                            (currentDateTime.date().year() != end.year())) {
 | 
					                                int* specialDayId,
 | 
				
			||||||
                            continue;
 | 
					                                uint32_t *specialDayPrice) {
 | 
				
			||||||
                        }
 | 
					    *specialDayId = -1;
 | 
				
			||||||
                    }
 | 
					    *specialDayPrice = 0;
 | 
				
			||||||
                    qDebug() << "CheckSpecialDay() => SPECIAL DAY";
 | 
					
 | 
				
			||||||
                    *specialDayId = spec_days_itr->second.ped_id;
 | 
					    std::multimap<int, ATBSpecialDays>::const_iterator spec_days_itr;
 | 
				
			||||||
                    *specialDayPrice = cfg->SpecialDaysWorktime.find(*specialDayId)->second.pedwt_price;
 | 
					
 | 
				
			||||||
                    return true;
 | 
					    for (spec_days_itr = cfg->SpecialDays.cbegin(); spec_days_itr != cfg->SpecialDays.cend(); ++spec_days_itr) {
 | 
				
			||||||
                }
 | 
					        int repeat_every_year = spec_days_itr->second.ped_year;
 | 
				
			||||||
            }
 | 
					        QDate start = QDate::fromString(spec_days_itr->second.ped_date_start.c_str(), Qt::ISODate);
 | 
				
			||||||
        }
 | 
					        QDate end = QDate::fromString(spec_days_itr->second.ped_date_end.c_str(), Qt::ISODate);
 | 
				
			||||||
    }
 | 
					        if (start.isValid() && end.isValid()) {
 | 
				
			||||||
 | 
					            if ((currentDateTime.date().month() >= start.month()) &&
 | 
				
			||||||
    return false;
 | 
					                (currentDateTime.date().month() <= end.month())) {
 | 
				
			||||||
}
 | 
					                if ((currentDateTime.date().day() >= start.day()) &&
 | 
				
			||||||
 | 
					                    (currentDateTime.date().day() <= end.day())) {
 | 
				
			||||||
QTime Utilities::SpecialDaysWorkTimeFrom(Configuration const *cfg, int specialDayId) {
 | 
					                    if (repeat_every_year <= 0) {
 | 
				
			||||||
    return QTime::fromString(cfg->SpecialDaysWorktime.find(specialDayId)->second.pedwt_time_from.c_str(), Qt::ISODate);
 | 
					                        if ((currentDateTime.date().year() != start.year()) ||
 | 
				
			||||||
}
 | 
					                            (currentDateTime.date().year() != end.year())) {
 | 
				
			||||||
 | 
					                            continue;
 | 
				
			||||||
QTime Utilities::SpecialDaysWorkTimeUntil(Configuration const *cfg, int specialDayId) {
 | 
					                        }
 | 
				
			||||||
    return QTime::fromString(cfg->SpecialDaysWorktime.find(specialDayId)->second.pedwt_time_to.c_str(), Qt::ISODate);
 | 
					                    }
 | 
				
			||||||
}
 | 
					                    qDebug() << "CheckSpecialDay() => SPECIAL DAY";
 | 
				
			||||||
 | 
					                    *specialDayId = spec_days_itr->second.ped_id;
 | 
				
			||||||
 | 
					                    *specialDayPrice = cfg->SpecialDaysWorktime.find(*specialDayId)->second.pedwt_price;
 | 
				
			||||||
 | 
					                    return true;
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return false;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					QTime Utilities::SpecialDaysWorkTimeFrom(Configuration const *cfg, int specialDayId) {
 | 
				
			||||||
 | 
					    return QTime::fromString(cfg->SpecialDaysWorktime.find(specialDayId)->second.pedwt_time_from.c_str(), Qt::ISODate);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					QTime Utilities::SpecialDaysWorkTimeUntil(Configuration const *cfg, int specialDayId) {
 | 
				
			||||||
 | 
					    return QTime::fromString(cfg->SpecialDaysWorktime.find(specialDayId)->second.pedwt_time_to.c_str(), Qt::ISODate);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					QTime Utilities::WeekDaysWorkTimeFrom(std::multimap<int, ATBWeekDaysWorktime>::const_iterator itr) {
 | 
				
			||||||
 | 
					    return QTime::fromString(itr->second.pwd_time_from.c_str(), Qt::ISODate);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					QTime Utilities::WeekDaysWorkTimeUntil(std::multimap<int, ATBWeekDaysWorktime>::const_iterator itr) {
 | 
				
			||||||
 | 
					    return QTime::fromString(itr->second.pwd_time_to.c_str(), Qt::ISODate);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					bool Utilities::isCarryOverSet(Configuration const *cfg, PaymentMethod paymentMethodId) {
 | 
				
			||||||
 | 
					    return !isCarryOverNotSet(cfg, paymentMethodId);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					bool Utilities::isCarryOverNotSet(Configuration const *cfg, PaymentMethod paymentMethodId) {
 | 
				
			||||||
 | 
					    return (cfg->PaymentOption.find(paymentMethodId)->second.pop_carry_over < 1);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					PaymentMethod Utilities::getPaymentMethodId(Configuration const *cfg) {
 | 
				
			||||||
 | 
					    if (cfg->PaymentOption.size() != 1) {
 | 
				
			||||||
 | 
					        return PaymentMethod::Undefined;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    std::multimap<int, ATBPaymentOption>::const_iterator it =
 | 
				
			||||||
 | 
					        cfg->PaymentOption.cbegin();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    switch (it->first) {
 | 
				
			||||||
 | 
					    case PaymentMethod::Linear:
 | 
				
			||||||
 | 
					        return PaymentMethod::Linear;
 | 
				
			||||||
 | 
					    case PaymentMethod::Steps:
 | 
				
			||||||
 | 
					        return PaymentMethod::Steps;
 | 
				
			||||||
 | 
					    case PaymentMethod::Degressive:
 | 
				
			||||||
 | 
					        return PaymentMethod::Degressive;
 | 
				
			||||||
 | 
					    case PaymentMethod::Progressive:
 | 
				
			||||||
 | 
					        return PaymentMethod::Progressive;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return PaymentMethod::Undefined;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user