Reformat to Unix.

Add overload for IsYearPeriodActive().
Add several helpers.
This commit is contained in:
Gerhard Hoffmann 2023-11-27 16:12:07 +01:00
parent e9047f995a
commit 684de4acd1

View File

@ -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(&current_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(&current_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 &currentDateTime, *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 &currentDateTime,
(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;
}