Compare commits
10 Commits
3a2e521345
...
2.0.0
Author | SHA1 | Date | |
---|---|---|---|
9bfea0f46d
|
|||
7ee90a9e8a
|
|||
8f2609c4ae
|
|||
453ca266a5
|
|||
0217bb8918 | |||
4b35b1ffb7 | |||
80e228b498 | |||
574161ff76 | |||
b80cd5e6ef | |||
ccbf07a654
|
@@ -109,6 +109,8 @@ CalcState CALCULATE_LIBRARY_API init_tariff(parking_tariff_t **tariff,
|
|||||||
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 zone = -1);
|
int CALCULATE_LIBRARY_API get_zone_nr(int zone = -1);
|
||||||
|
|
||||||
|
int CALCULATE_LIBRARY_API compute_next_timestep(parking_tariff_t *tariff, int currentTimeMinutes, int UpDown);
|
||||||
|
|
||||||
CalcState CALCULATE_LIBRARY_API compute_price_for_parking_ticket( // deprecated
|
CalcState CALCULATE_LIBRARY_API compute_price_for_parking_ticket( // deprecated
|
||||||
parking_tariff_t *tariff,
|
parking_tariff_t *tariff,
|
||||||
time_t start_parking_time,
|
time_t start_parking_time,
|
||||||
|
@@ -32,18 +32,17 @@ public:
|
|||||||
// Daily ticket
|
// Daily ticket
|
||||||
QDateTime GetDailyTicketDuration(Configuration* cfg, const QDateTime start_datetime, uint8_t payment_option, bool carry_over);
|
QDateTime GetDailyTicketDuration(Configuration* cfg, const QDateTime start_datetime, uint8_t payment_option, bool carry_over);
|
||||||
|
|
||||||
|
//
|
||||||
|
// helper function to find time steps for a tariff with PaymentMethod::Steps
|
||||||
|
// (e.g. Schoenau/Koenigsee)
|
||||||
|
//
|
||||||
|
QList<int> GetTimeSteps(Configuration *cfg) const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
// Introduced for PaymentMethod::Steps (e.g. Schoenau)
|
// Introduced for PaymentMethod::Steps (e.g. Schoenau)
|
||||||
// For tariff of following structure: only steps, no special days, nonstop.
|
// For tariff of following structure: only steps, no special days, nonstop.
|
||||||
uint32_t GetCostFromDuration(Configuration const* cfg, QDateTime const &start, quint64 durationMinutes, uint8_t paymentMethod = PaymentMethod::Steps);
|
uint32_t GetCostFromDuration(Configuration *cfg, QDateTime const &start, quint64 durationMinutes) const;
|
||||||
uint32_t GetCostFromDuration(Configuration const* cfg, QDateTime const &start, QDateTime const &end, uint8_t paymentMethod = PaymentMethod::Steps);
|
uint32_t GetCostFromDuration(Configuration *cfg, QDateTime const &start, QDateTime const &end) const;
|
||||||
|
uint32_t GetPriceForTimeStep(Configuration *cfg, int timeStep) const;
|
||||||
|
uint32_t GetDurationForPrice(Configuration *cfg, int price) const;
|
||||||
//
|
|
||||||
// helper functions for PaymentMethod::Steps
|
|
||||||
//
|
|
||||||
QList<int> GetTimeSteps(Configuration const *cfg, int paymentMethod);
|
|
||||||
//
|
|
||||||
uint32_t GetPriceForTimeStep(Configuration const *cfg, uint8_t paymentMethod, int timeStep);
|
|
||||||
};
|
};
|
||||||
|
@@ -93,6 +93,44 @@ void CALCULATE_LIBRARY_API free_tariff(parking_tariff_t *tariff) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//
|
||||||
|
// UpDown 1 -> up; 0 -> down
|
||||||
|
int CALCULATE_LIBRARY_API compute_next_timestep(parking_tariff_t *tariff, int currentTimeMinutes, int UpDown)
|
||||||
|
{
|
||||||
|
static const QList<int> stepList = calculator.GetTimeSteps(tariff);
|
||||||
|
|
||||||
|
int currentStepIndex = stepList.indexOf(currentTimeMinutes);
|
||||||
|
|
||||||
|
if (currentStepIndex == -1) {
|
||||||
|
qCritical() << "compute_next_timestep() *NO STEP* for currentTimeMinutes (" << currentTimeMinutes << ")";
|
||||||
|
return currentTimeMinutes;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (UpDown == 1) { // UP
|
||||||
|
if (stepList[currentStepIndex] == stepList.last()) {
|
||||||
|
qCritical() << "compute_next_timestep() *NO NEXT STEP* for currentTimeMinutes (" << currentTimeMinutes << ")";
|
||||||
|
return currentTimeMinutes;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return stepList[currentStepIndex + 1];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (UpDown == 0) { // DOWN
|
||||||
|
if (stepList[currentStepIndex] == stepList.first()) {
|
||||||
|
qCritical() << "compute_next_timestep() *NO PREVIOUS STEP* for currentTimeMinutes (" << currentTimeMinutes << ")";
|
||||||
|
return currentTimeMinutes;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return stepList[currentStepIndex - 1];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
qCritical() << "compute_next_timestep() *CAN NOT COMPUTE* for currentTimeMinutes (" << currentTimeMinutes << ")";
|
||||||
|
return currentTimeMinutes;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// this is currently not used
|
// this is currently not used
|
||||||
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,
|
||||||
|
@@ -118,22 +118,35 @@ std::string Calculator::GetDurationFromCost(Configuration* cfg,
|
|||||||
bool nextDay,
|
bool nextDay,
|
||||||
bool prepaid)
|
bool prepaid)
|
||||||
{
|
{
|
||||||
|
|
||||||
// Get input date
|
// Get input date
|
||||||
QDateTime inputDate = QDateTime::fromString(start_datetime,Qt::ISODate);
|
QDateTime inputDate = QDateTime::fromString(start_datetime,Qt::ISODate);
|
||||||
|
|
||||||
|
// use tariff with structure as for instance Schnau, Koenigsee:
|
||||||
|
// without given YearPeriod, SpecialDays and SpecialDaysWorktime
|
||||||
|
if (cfg->YearPeriod.size() == 0
|
||||||
|
&& cfg->SpecialDays.size() == 0
|
||||||
|
&& cfg->SpecialDaysWorktime.size() == 0)
|
||||||
|
{
|
||||||
|
inputDate = inputDate.addSecs(GetDurationForPrice(cfg, price) * 60);
|
||||||
|
|
||||||
|
return inputDate.toString(Qt::ISODate).toStdString();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// Get day of week
|
// Get day of week
|
||||||
int weekdayId = 0;
|
int weekdayId = 0;
|
||||||
weekdayId = Utilities::ZellersAlgorithm(inputDate.date().day(),inputDate.date().month(),inputDate.date().year());
|
weekdayId = Utilities::ZellersAlgorithm(inputDate.date().day(),inputDate.date().month(),inputDate.date().year());
|
||||||
|
|
||||||
//Get min and max time defined in JSON
|
//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->getPaymentOptions().pop_min_time;
|
||||||
|
|
||||||
double maxMin = 0;
|
double maxMin = 0;
|
||||||
maxMin = cfg->PaymentOption.find(payment_option)->second.pop_max_time;
|
maxMin = cfg->getPaymentOptions().pop_max_time;
|
||||||
|
|
||||||
double min_price = 0;
|
double min_price = 0;
|
||||||
min_price = cfg->PaymentOption.find(payment_option)->second.pop_min_price;
|
min_price = cfg->getPaymentOptions().pop_min_price;
|
||||||
|
|
||||||
if(price < min_price)
|
if(price < min_price)
|
||||||
{
|
{
|
||||||
@@ -341,30 +354,28 @@ std::string Calculator::GetDurationFromCost(Configuration* cfg,
|
|||||||
/// <inheritdoc/>
|
/// <inheritdoc/>
|
||||||
///
|
///
|
||||||
|
|
||||||
uint32_t Calculator::GetCostFromDuration(Configuration const* cfg,
|
uint32_t Calculator::GetCostFromDuration(Configuration *cfg,
|
||||||
QDateTime const &start,
|
QDateTime const &start,
|
||||||
quint64 timeStepInMinutes,
|
quint64 timeStepInMinutes) const {
|
||||||
uint8_t paymentMethod) {
|
|
||||||
// for instance, a tariff as used in Schoenau, Koenigssee: only steps, no
|
// for instance, a tariff as used in Schoenau, Koenigssee: only steps, no
|
||||||
// special days, nonstop.
|
// special days, nonstop.
|
||||||
if (paymentMethod == PaymentMethod::Steps
|
if (cfg->YearPeriod.size() == 0
|
||||||
&& cfg->SpecialDays.size() == 0
|
&& cfg->SpecialDays.size() == 0
|
||||||
&& cfg->SpecialDaysWorktime.size() == 0) {
|
&& cfg->SpecialDaysWorktime.size() == 0) {
|
||||||
QDateTime const end = start.addSecs(timeStepInMinutes*60);
|
QDateTime const end = start.addSecs(timeStepInMinutes*60);
|
||||||
return GetCostFromDuration(cfg, start, end, paymentMethod);
|
return GetCostFromDuration(cfg, start, end);
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t Calculator::GetCostFromDuration(Configuration const* cfg,
|
uint32_t Calculator::GetCostFromDuration(Configuration * cfg,
|
||||||
QDateTime const &start,
|
QDateTime const &start,
|
||||||
QDateTime const &end,
|
QDateTime const &end) const {
|
||||||
uint8_t paymentMethod) {
|
if (cfg->YearPeriod.size() == 0
|
||||||
if (paymentMethod == PaymentMethod::Steps
|
|
||||||
&& cfg->SpecialDays.size() == 0
|
&& cfg->SpecialDays.size() == 0
|
||||||
&& cfg->SpecialDaysWorktime.size() == 0) {
|
&& cfg->SpecialDaysWorktime.size() == 0) {
|
||||||
int const timeStepInMinutes = start.secsTo(end) / 60;
|
int const timeStepInMinutes = start.secsTo(end) / 60;
|
||||||
return GetPriceForTimeStep(cfg, paymentMethod, timeStepInMinutes);
|
return GetPriceForTimeStep(cfg, timeStepInMinutes);
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@@ -377,12 +388,12 @@ uint32_t Calculator::GetCostFromDuration(Configuration const* cfg,
|
|||||||
/// <inheritdoc/>
|
/// <inheritdoc/>
|
||||||
double Calculator::GetCostFromDuration(Configuration* cfg, uint8_t payment_option, const QDateTime start_datetime, QDateTime & end_datetime, double durationMin, bool nextDay, bool prepaid)
|
double Calculator::GetCostFromDuration(Configuration* cfg, uint8_t payment_option, const QDateTime start_datetime, QDateTime & end_datetime, double durationMin, bool nextDay, bool prepaid)
|
||||||
{
|
{
|
||||||
// condition for 'PaymentMethod::Steps' (e.g. 332/Schoenau):
|
if (cfg->YearPeriod.size() == 0
|
||||||
if (cfg->SpecialDays.size() == 0
|
&& cfg->SpecialDays.size() == 0
|
||||||
&& cfg->SpecialDaysWorktime.size() == 0)
|
&& cfg->SpecialDaysWorktime.size() == 0)
|
||||||
{
|
{
|
||||||
end_datetime = start_datetime.addSecs(durationMin*60);
|
end_datetime = start_datetime.addSecs(durationMin*60);
|
||||||
return GetCostFromDuration(cfg, start_datetime, end_datetime, PaymentMethod::Steps);
|
return GetCostFromDuration(cfg, start_datetime, end_datetime);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get input date
|
// Get input date
|
||||||
@@ -588,10 +599,10 @@ double Calculator::GetCostFromDuration(Configuration* cfg, uint8_t payment_optio
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
QList<int> Calculator::GetTimeSteps(Configuration const *cfg, int paymentOption) {
|
QList<int> Calculator::GetTimeSteps(Configuration *cfg) const {
|
||||||
QList<int> timeSteps;
|
QList<int> timeSteps;
|
||||||
|
|
||||||
int const pop_id = cfg->PaymentOption.find(paymentOption)->second.pop_id;
|
int const pop_id = cfg->getPaymentOptions().pop_id;
|
||||||
|
|
||||||
for (auto[itr, rangeEnd] = cfg->PaymentRate.equal_range(pop_id); itr != rangeEnd; ++itr)
|
for (auto[itr, rangeEnd] = cfg->PaymentRate.equal_range(pop_id); itr != rangeEnd; ++itr)
|
||||||
{
|
{
|
||||||
@@ -603,9 +614,9 @@ QList<int> Calculator::GetTimeSteps(Configuration const *cfg, int paymentOption)
|
|||||||
return timeSteps;
|
return timeSteps;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t Calculator::GetPriceForTimeStep(Configuration const *cfg, uint8_t paymentOption, int timeStep) {
|
uint32_t Calculator::GetPriceForTimeStep(Configuration *cfg, int timeStep) const {
|
||||||
|
|
||||||
int const pop_id = cfg->PaymentOption.find(paymentOption)->second.pop_id;
|
int const pop_id = cfg->getPaymentOptions().pop_id;
|
||||||
|
|
||||||
for (auto[itr, rangeEnd] = cfg->PaymentRate.equal_range(pop_id); itr != rangeEnd; ++itr)
|
for (auto[itr, rangeEnd] = cfg->PaymentRate.equal_range(pop_id); itr != rangeEnd; ++itr)
|
||||||
{
|
{
|
||||||
@@ -616,9 +627,36 @@ uint32_t Calculator::GetPriceForTimeStep(Configuration const *cfg, uint8_t payme
|
|||||||
|
|
||||||
int const pun_duration = cfg->Duration.find(payment_unit_id)->second.pun_duration;
|
int const pun_duration = cfg->Duration.find(payment_unit_id)->second.pun_duration;
|
||||||
if (timeStep == pun_duration) {
|
if (timeStep == pun_duration) {
|
||||||
return (uint32_t)(itr->second.pra_price);
|
return (uint32_t)(itr->second.pra_price);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* private: read price directly from config file (used with PaymentMethod::Steps)
|
||||||
|
*
|
||||||
|
* return duration in minutes for greatest pra_price < price
|
||||||
|
*/
|
||||||
|
|
||||||
|
uint32_t Calculator::GetDurationForPrice(Configuration *cfg, int price) const {
|
||||||
|
int const pop_id = cfg->getPaymentOptions().pop_id;
|
||||||
|
uint32_t duration = 0;
|
||||||
|
|
||||||
|
for (auto[itr, rangeEnd] = cfg->PaymentRate.equal_range(pop_id); itr != rangeEnd; ++itr)
|
||||||
|
{
|
||||||
|
int const durationId = itr->second.pra_payment_unit_id;
|
||||||
|
int const pra_price = itr->second.pra_price;
|
||||||
|
uint32_t const durationUnit = cfg->Duration.find(durationId)->second.pun_duration;
|
||||||
|
|
||||||
|
if (price == pra_price) {
|
||||||
|
return durationUnit;
|
||||||
|
}
|
||||||
|
if (pra_price < price) {
|
||||||
|
duration = durationUnit;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return duration;
|
||||||
|
}
|
||||||
|
Reference in New Issue
Block a user