Compare commits
21 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| b05950fc37 | |||
| 1c6c9f934d | |||
| 9baaca1c80 | |||
| 18f2895250 | |||
| fc78eff0a4 | |||
| b303a59964 | |||
| 77ca6a4736 | |||
| 8b65bb3e2c | |||
| 82ca274c45 | |||
| 75c98c18ad | |||
| 21534ba153 | |||
| 8d9119ac83 | |||
| da7a3cf67b | |||
| 449fb163bd | |||
| 19032349ae | |||
| 2c2fd3845b | |||
| 5131892744 | |||
| 6d6615b81e | |||
| eafbfd60c3 | |||
| 41fc924a7c | |||
| cbcf8391b3 |
@@ -1,83 +0,0 @@
|
|||||||
#ifndef ATB_TIME_H_INCLUDED
|
|
||||||
#define ATB_TIME_H_INCLUDED
|
|
||||||
|
|
||||||
#include <QDateTime>
|
|
||||||
|
|
||||||
class ATBTime {
|
|
||||||
static QDateTime const m_end;
|
|
||||||
mutable QDateTime m_time;
|
|
||||||
|
|
||||||
public:
|
|
||||||
explicit ATBTime();
|
|
||||||
explicit ATBTime(int h, int m, int s = 0, int ms = 0);
|
|
||||||
explicit ATBTime(QString const &time);
|
|
||||||
explicit ATBTime(QTime const &time);
|
|
||||||
|
|
||||||
explicit ATBTime(ATBTime const &atbTime) {
|
|
||||||
m_time = atbTime.m_time;
|
|
||||||
}
|
|
||||||
|
|
||||||
ATBTime &operator=(ATBTime && atbTime) {
|
|
||||||
m_time = std::move(atbTime.m_time);
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
ATBTime &operator=(ATBTime const &atbTime) {
|
|
||||||
m_time = atbTime.m_time;
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
int hour() const { return m_time.time().hour(); }
|
|
||||||
int minute() const { return m_time.time().minute(); }
|
|
||||||
int second() const { return m_time.time().second(); }
|
|
||||||
int msec() const { return m_time.time().msec(); }
|
|
||||||
|
|
||||||
int secsTo(QString const &t) const {
|
|
||||||
if (t == "24:00:00") {
|
|
||||||
return m_time.secsTo(m_end);
|
|
||||||
}
|
|
||||||
return m_time.time().secsTo(QTime::fromString(t, Qt::ISODate));
|
|
||||||
}
|
|
||||||
|
|
||||||
int msecsTo(QTime t) const { return m_time.time().msecsTo(t); }
|
|
||||||
|
|
||||||
bool setHMS(int h, int m, int s, int ms = 0);
|
|
||||||
|
|
||||||
bool isNull() const { return m_time.time().isNull(); }
|
|
||||||
bool isValid() const { return m_time.time().isValid(); }
|
|
||||||
|
|
||||||
|
|
||||||
QTime addMSecs(int ms) const;
|
|
||||||
QTime addMSecs(int ms);
|
|
||||||
|
|
||||||
QTime addSecs(int s) const;
|
|
||||||
QTime addSecs(int s);
|
|
||||||
|
|
||||||
int msecsSinceStartOfDay() const;
|
|
||||||
QString toString(Qt::DateFormat format = Qt::TextDate) const;
|
|
||||||
|
|
||||||
|
|
||||||
static bool isValid(int h, int m, int s, int ms = 0);
|
|
||||||
|
|
||||||
static QTime currentTime() { return QDateTime::currentDateTime().time(); }
|
|
||||||
|
|
||||||
static constexpr QTime fromMSecsSinceStartOfDay(int msecs);
|
|
||||||
|
|
||||||
static QTime fromString(QString const &string, Qt::DateFormat format = Qt::TextDate);
|
|
||||||
static QTime fromString(QString const &string, const QString &format);
|
|
||||||
|
|
||||||
friend bool operator!=(const ATBTime &lhs, const ATBTime &rhs) noexcept;
|
|
||||||
friend bool operator<(const ATBTime &lhs, const ATBTime &rhs) noexcept;
|
|
||||||
friend bool operator<=(const ATBTime &lhs, const ATBTime &rhs) noexcept;
|
|
||||||
friend bool operator>=(const ATBTime &lhs, const ATBTime &rhs) noexcept;
|
|
||||||
friend bool operator<(const ATBTime &lhs, const ATBTime &rhs) noexcept;
|
|
||||||
friend bool operator>(const ATBTime &lhs, const ATBTime &rhs) noexcept;
|
|
||||||
friend bool operator==(const ATBTime &lhs, const ATBTime &rhs) noexcept;
|
|
||||||
friend QDataStream &operator<<(QDataStream &out, ATBTime const &time);
|
|
||||||
friend QDebug &operator<<(QDebug &out, ATBTime const &time);
|
|
||||||
friend QDataStream &operator>>(QDataStream &in, ATBTime &time);
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
#endif // ATB_TIME_H_INCLUDED
|
|
||||||
@@ -56,7 +56,6 @@ struct CALCULATE_LIBRARY_API CalcState {
|
|||||||
static QString const ABOVE_MAX_PARKING_PRICE;
|
static QString const ABOVE_MAX_PARKING_PRICE;
|
||||||
static QString const OVERPAID;
|
static QString const OVERPAID;
|
||||||
static QString const OUTSIDE_ALLOWED_PARKING_TIME;
|
static QString const OUTSIDE_ALLOWED_PARKING_TIME;
|
||||||
static QString const SUCCESS_MAXPRICE;
|
|
||||||
|
|
||||||
enum class State : uint8_t {
|
enum class State : uint8_t {
|
||||||
SUCCESS,
|
SUCCESS,
|
||||||
@@ -72,8 +71,7 @@ struct CALCULATE_LIBRARY_API CalcState {
|
|||||||
BELOW_MIN_PARKING_PRICE,
|
BELOW_MIN_PARKING_PRICE,
|
||||||
ABOVE_MAX_PARKING_PRICE,
|
ABOVE_MAX_PARKING_PRICE,
|
||||||
OVERPAID,
|
OVERPAID,
|
||||||
OUTSIDE_ALLOWED_PARKING_TIME,
|
OUTSIDE_ALLOWED_PARKING_TIME
|
||||||
SUCCESS_MAXPRICE
|
|
||||||
};
|
};
|
||||||
|
|
||||||
State m_status;
|
State m_status;
|
||||||
@@ -90,9 +88,9 @@ struct CALCULATE_LIBRARY_API CalcState {
|
|||||||
, m_desc(desc) {
|
, m_desc(desc) {
|
||||||
}
|
}
|
||||||
|
|
||||||
explicit CalcState(State state, QString desc,
|
explicit CalcState(State state, QString desc = "",
|
||||||
QTime const &from,
|
QTime const &from = QTime(),
|
||||||
QTime const &until)
|
QTime const &until = QTime())
|
||||||
: m_status(state)
|
: m_status(state)
|
||||||
, m_desc(desc)
|
, m_desc(desc)
|
||||||
, m_allowedTimeRange(from, until) {
|
, m_allowedTimeRange(from, until) {
|
||||||
@@ -108,9 +106,6 @@ struct CALCULATE_LIBRARY_API CalcState {
|
|||||||
case State::SUCCESS:
|
case State::SUCCESS:
|
||||||
s = CalcState::SUCCESS;
|
s = CalcState::SUCCESS;
|
||||||
break;
|
break;
|
||||||
case State::SUCCESS_MAXPRICE:
|
|
||||||
s = CalcState::SUCCESS_MAXPRICE;
|
|
||||||
break;
|
|
||||||
case State::ERROR_PARSING_ZONE_NR:
|
case State::ERROR_PARSING_ZONE_NR:
|
||||||
s = CalcState::ERROR_PARSING_ZONE_NR;
|
s = CalcState::ERROR_PARSING_ZONE_NR;
|
||||||
break;
|
break;
|
||||||
@@ -163,9 +158,6 @@ struct CALCULATE_LIBRARY_API CalcState {
|
|||||||
case State::SUCCESS:
|
case State::SUCCESS:
|
||||||
s = CalcState::SUCCESS;
|
s = CalcState::SUCCESS;
|
||||||
break;
|
break;
|
||||||
case State::SUCCESS_MAXPRICE:
|
|
||||||
s = CalcState::SUCCESS_MAXPRICE;
|
|
||||||
break;
|
|
||||||
case State::ERROR_PARSING_ZONE_NR:
|
case State::ERROR_PARSING_ZONE_NR:
|
||||||
s = CalcState::ERROR_PARSING_ZONE_NR;
|
s = CalcState::ERROR_PARSING_ZONE_NR;
|
||||||
break;
|
break;
|
||||||
@@ -215,9 +207,6 @@ struct CALCULATE_LIBRARY_API CalcState {
|
|||||||
if (desc == SUCCESS) {
|
if (desc == SUCCESS) {
|
||||||
m_status = State::SUCCESS;
|
m_status = State::SUCCESS;
|
||||||
} else
|
} else
|
||||||
if (desc == SUCCESS_MAXPRICE) {
|
|
||||||
m_status = State::SUCCESS_MAXPRICE;
|
|
||||||
}
|
|
||||||
if (desc == ERROR_PARSING_ZONE_NR) {
|
if (desc == ERROR_PARSING_ZONE_NR) {
|
||||||
m_status = State::ERROR_PARSING_ZONE_NR;
|
m_status = State::ERROR_PARSING_ZONE_NR;
|
||||||
} else
|
} else
|
||||||
@@ -277,12 +266,6 @@ 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 isOutOfService(Configuration const *cfg,
|
|
||||||
QDateTime const &dt);
|
|
||||||
|
|
||||||
int CALCULATE_LIBRARY_API isOutOfService(QDateTime const &dt);
|
|
||||||
|
|
||||||
int CALCULATE_LIBRARY_API compute_next_timestep(parking_tariff_t *tariff, int currentTimeMinutes,
|
int CALCULATE_LIBRARY_API compute_next_timestep(parking_tariff_t *tariff, int currentTimeMinutes,
|
||||||
int UpDown, PermitType const &permitType);
|
int UpDown, PermitType const &permitType);
|
||||||
|
|
||||||
|
|||||||
@@ -3,7 +3,6 @@
|
|||||||
|
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <optional>
|
#include <optional>
|
||||||
#include <utility>
|
|
||||||
|
|
||||||
#include "configuration.h"
|
#include "configuration.h"
|
||||||
#include "calculate_price.h"
|
#include "calculate_price.h"
|
||||||
@@ -27,16 +26,16 @@ class Calculator {
|
|||||||
QDateTime const &start,
|
QDateTime const &start,
|
||||||
int netto_parking_time,
|
int netto_parking_time,
|
||||||
int paymentOptionIndex);
|
int paymentOptionIndex);
|
||||||
struct State {
|
|
||||||
bool m_timeLimitReached;
|
|
||||||
uint32_t m_costAtTimeLimit;
|
|
||||||
} m_state;
|
|
||||||
|
|
||||||
|
int computeBruttoDurationInSecs(Configuration const *cfg,
|
||||||
|
QDateTime const &from,
|
||||||
|
int durationInSecs, bool maxBrutto = false);
|
||||||
|
|
||||||
|
QDateTime computeBruttoDateTime(Configuration const *cfg,
|
||||||
|
QDateTime const &from,
|
||||||
|
int durationInSecs, bool maxBrutto = false);
|
||||||
protected:
|
protected:
|
||||||
explicit Calculator() {
|
explicit Calculator() = default;
|
||||||
m_state.m_timeLimitReached = false;
|
|
||||||
m_state.m_costAtTimeLimit = ~0;
|
|
||||||
}
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
Calculator(Calculator const &other) = delete;
|
Calculator(Calculator const &other) = delete;
|
||||||
@@ -47,12 +46,6 @@ public:
|
|||||||
return c;
|
return c;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool timeLimitReached() const { return m_state.m_timeLimitReached; }
|
|
||||||
void setTimeLimitReached(bool timeLimitReached) { m_state.m_timeLimitReached = timeLimitReached; }
|
|
||||||
bool costAtTimeLimit() const { return m_state.m_costAtTimeLimit; }
|
|
||||||
void setCostAtTimeLimit(uint32_t cost) { if (m_state.m_costAtTimeLimit > cost) m_state.m_costAtTimeLimit = cost; }
|
|
||||||
void resetCostAtTimeLimit() { m_state.m_costAtTimeLimit = ~0; }
|
|
||||||
|
|
||||||
void ResetTimeSteps(int paymentOptionIndex) {
|
void ResetTimeSteps(int paymentOptionIndex) {
|
||||||
if (m_timeSteps.size() > 0 && paymentOptionIndex < m_timeSteps.size()) {
|
if (m_timeSteps.size() > 0 && paymentOptionIndex < m_timeSteps.size()) {
|
||||||
m_timeSteps[paymentOptionIndex].clear();
|
m_timeSteps[paymentOptionIndex].clear();
|
||||||
@@ -84,9 +77,7 @@ public:
|
|||||||
/// <param name="start_datetime">Date/time of payment to be conducted in ISO8601 format (e.g. 2022-12-25T08:00:00Z)</param>
|
/// <param name="start_datetime">Date/time of payment to be conducted in ISO8601 format (e.g. 2022-12-25T08:00:00Z)</param>
|
||||||
/// <param name="price"></param>
|
/// <param name="price"></param>
|
||||||
/// <returns>Returns duration in seconds (data type: double)</returns>
|
/// <returns>Returns duration in seconds (data type: double)</returns>
|
||||||
std::pair<std::string, QDateTime>
|
std::string GetDurationFromCost(Configuration* cfg, uint8_t vehicle_type, char const* start_datetime, double price, PermitType permitType, bool nextDay = false, bool prepaid = false);
|
||||||
GetDurationFromCost(Configuration* cfg, uint8_t vehicle_type, char const* start_datetime, double price,
|
|
||||||
PermitType permitType, bool nextDay = false, bool prepaid = false);
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets cost from duration in seconds
|
/// Gets cost from duration in seconds
|
||||||
@@ -97,11 +88,7 @@ public:
|
|||||||
/// <param name="end_datetime">Date/time of park end to be conducted in ISO8601 format (e.g. 2022-12-25T08:00:00Z) </param>
|
/// <param name="end_datetime">Date/time of park end to be conducted in ISO8601 format (e.g. 2022-12-25T08:00:00Z) </param>
|
||||||
/// <param name="durationMin">Duration of parking in minutes</param>
|
/// <param name="durationMin">Duration of parking in minutes</param>
|
||||||
/// <returns>Returns cost (data type: double)</returns>
|
/// <returns>Returns cost (data type: double)</returns>
|
||||||
double GetCostFromDuration(Configuration* cfg, uint8_t vehicle_type, QDateTime &start_datetime, QDateTime & end_datetime, int durationMin,
|
double GetCostFromDuration(Configuration* cfg, uint8_t vehicle_type, QDateTime &start_datetime, QDateTime & end_datetime, int durationMin, PermitType permitType, bool nextDay = false, bool prepaid = false);
|
||||||
PermitType permitType, bool nextDay = false, bool prepaid = false);
|
|
||||||
|
|
||||||
std::pair<CalcState, QDateTime> ComputeDurationFromCost(Configuration *cfg, QDateTime const &startDatetimePassed, int cost);
|
|
||||||
std::pair<CalcState, std::optional<int>> ComputeCostFromDuration(Configuration *cfg, QDateTime const &startDatetime, QDateTime &endDatetime, int nettoParkingTime);
|
|
||||||
|
|
||||||
// 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);
|
||||||
|
|||||||
@@ -29,18 +29,13 @@
|
|||||||
#include "tariff_prepaid.h"
|
#include "tariff_prepaid.h"
|
||||||
#include "tariff_carryover.h"
|
#include "tariff_carryover.h"
|
||||||
#include "tariff_permit_type.h"
|
#include "tariff_permit_type.h"
|
||||||
#include "tariff_service.h"
|
|
||||||
#include "tariff_out_of_service.h"
|
|
||||||
|
|
||||||
#include <QVector>
|
#include <QVector>
|
||||||
#include <optional>
|
#include <optional>
|
||||||
#include <QList>
|
|
||||||
#include <QPair>
|
|
||||||
|
|
||||||
using namespace std;
|
using namespace std;
|
||||||
using namespace rapidjson;
|
using namespace rapidjson;
|
||||||
|
|
||||||
|
|
||||||
class Calculator;
|
class Calculator;
|
||||||
class Configuration
|
class Configuration
|
||||||
{
|
{
|
||||||
@@ -54,10 +49,6 @@ public:
|
|||||||
using TariffPrepaidType = std::multimap<int, ATBPrepaid>;
|
using TariffPrepaidType = std::multimap<int, ATBPrepaid>;
|
||||||
using TariffCarryOverType = std::multimap<int, ATBCarryOver>;
|
using TariffCarryOverType = std::multimap<int, ATBCarryOver>;
|
||||||
using TariffDurationType = std::multimap<int, ATBDuration>;
|
using TariffDurationType = std::multimap<int, ATBDuration>;
|
||||||
using TariffServiceType = std::multimap<int, ATBTariffService>;
|
|
||||||
using TariffOutOfServiceType = std::multimap<int, ATBTariffOutOfService>;
|
|
||||||
using ATBTariffPrepaidType = std::multimap<int, ATBTariffPrepaid>;
|
|
||||||
using ATBTariffCarryOverType = std::multimap<int, ATBTariffCarryOver>;
|
|
||||||
|
|
||||||
ATBProject project;
|
ATBProject project;
|
||||||
ATBCurrency Currency;
|
ATBCurrency Currency;
|
||||||
@@ -68,7 +59,7 @@ public:
|
|||||||
multimap<int, ATBPaymentRate> PaymentRate;
|
multimap<int, ATBPaymentRate> PaymentRate;
|
||||||
SpecialDaysWorktimeType SpecialDaysWorktime;
|
SpecialDaysWorktimeType SpecialDaysWorktime;
|
||||||
SpecialDaysType SpecialDays;
|
SpecialDaysType SpecialDays;
|
||||||
multimap<Qt::DayOfWeek, ATBWeekDay> WeekDays;
|
multimap<int, ATBWeekDays> WeekDays;
|
||||||
multimap<int, ATBPeriodYear> YearPeriod;
|
multimap<int, ATBPeriodYear> YearPeriod;
|
||||||
multimap<int, ATBWeekDaysWorktime> WeekDaysWorktime;
|
multimap<int, ATBWeekDaysWorktime> WeekDaysWorktime;
|
||||||
ATBPaymentOptionType PaymentOption;
|
ATBPaymentOptionType PaymentOption;
|
||||||
@@ -81,15 +72,6 @@ public:
|
|||||||
TariffInterpolationType TariffInterpolations;
|
TariffInterpolationType TariffInterpolations;
|
||||||
TariffPrepaidType TariffPrepaidOptions;
|
TariffPrepaidType TariffPrepaidOptions;
|
||||||
TariffCarryOverType TariffCarryOverOptions;
|
TariffCarryOverType TariffCarryOverOptions;
|
||||||
TariffServiceType TariffServices;
|
|
||||||
TariffOutOfServiceType TariffOutOfServices;
|
|
||||||
ATBTariffPrepaidType TariffPrepaids;
|
|
||||||
ATBTariffCarryOverType TariffCarryOvers;
|
|
||||||
QList<QPair<QString, QString>> TariffIncludes;
|
|
||||||
|
|
||||||
QTime ValidFrom;
|
|
||||||
int ValidForWeekDay{};
|
|
||||||
QStringList tariffFileName{};
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Parse JSON string
|
/// Parse JSON string
|
||||||
@@ -130,9 +112,6 @@ public:
|
|||||||
std::optional<ATBWeekDaysWorktime> getWeekDayWorkTime(QTime const &time, Qt::DayOfWeek dayOfWeek);
|
std::optional<ATBWeekDaysWorktime> getWeekDayWorkTime(QTime const &time, Qt::DayOfWeek dayOfWeek);
|
||||||
std::optional<QVector<ATBWeekDaysWorktime>> getAllWeekDayWorkTimes();
|
std::optional<QVector<ATBWeekDaysWorktime>> getAllWeekDayWorkTimes();
|
||||||
|
|
||||||
QList<QPair<QString, QString>> const &getTariffIncludes() const { return TariffIncludes; }
|
|
||||||
QList<QPair<QString, QString>> &getTariffIncludes() { return TariffIncludes; }
|
|
||||||
|
|
||||||
std::optional<QDateTime> prepaidStart(QDateTime const &start, int prepaid_option_id);
|
std::optional<QDateTime> prepaidStart(QDateTime const &start, int prepaid_option_id);
|
||||||
int getPaymentOptionIndex(PERMIT_TYPE permitType);
|
int getPaymentOptionIndex(PERMIT_TYPE permitType);
|
||||||
int getPaymentOptionIndex(PERMIT_TYPE permitType) const;
|
int getPaymentOptionIndex(PERMIT_TYPE permitType) const;
|
||||||
@@ -147,15 +126,3 @@ private:
|
|||||||
|
|
||||||
QVector<ATBPaymentOption> currentPaymentOptions;
|
QVector<ATBPaymentOption> currentPaymentOptions;
|
||||||
};
|
};
|
||||||
|
|
||||||
bool previousDayHoliday(Configuration const &cfg, QDateTime const &t);
|
|
||||||
bool isHoliday(Configuration const &cfg, QDateTime const &t);
|
|
||||||
int getPaymentOptionIndex(Configuration const &cfg, QDateTime const& dt = QDateTime::currentDateTime());
|
|
||||||
|
|
||||||
ATBWeekDay parseWeekDay(Configuration &cfg,
|
|
||||||
rapidjson::GenericMemberIterator<false,
|
|
||||||
rapidjson::UTF8<char>,
|
|
||||||
rapidjson::MemoryPoolAllocator<rapidjson::CrtAllocator>> k,
|
|
||||||
QString const &innerObjName,
|
|
||||||
Qt::DayOfWeek weekDay,
|
|
||||||
QString const &weekDayName);
|
|
||||||
|
|||||||
@@ -22,8 +22,7 @@ enum MemberType
|
|||||||
ProductType = 0x0F,
|
ProductType = 0x0F,
|
||||||
InterpolationType = 0x10,
|
InterpolationType = 0x10,
|
||||||
PrepaidType = 0x11,
|
PrepaidType = 0x11,
|
||||||
CarryOverType = 0x12,
|
CarryOverType = 0x12
|
||||||
IncludesType = 0x13
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // MEMBER_TYPE_H_INCLUDED
|
#endif // MEMBER_TYPE_H_INCLUDED
|
||||||
|
|||||||
@@ -6,8 +6,7 @@ enum PaymentMethod {
|
|||||||
Progressive = 0x01,
|
Progressive = 0x01,
|
||||||
Degressive = 0x02,
|
Degressive = 0x02,
|
||||||
Linear = 0x03,
|
Linear = 0x03,
|
||||||
Steps = 0x04,
|
Steps = 0x04
|
||||||
Unified = 0x05
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // PAYMENT_METHOD_H_INCLUDED
|
#endif // PAYMENT_METHOD_H_INCLUDED
|
||||||
|
|||||||
@@ -25,7 +25,6 @@ public:
|
|||||||
pop_max_time = 0;
|
pop_max_time = 0;
|
||||||
pop_min_price = 0;
|
pop_min_price = 0;
|
||||||
pop_max_price = 0;
|
pop_max_price = 0;
|
||||||
pop_max_price_save = 0;
|
|
||||||
pop_carry_over = -1;
|
pop_carry_over = -1;
|
||||||
pop_carry_over_option_id = -1;
|
pop_carry_over_option_id = -1;
|
||||||
pop_prepaid_option_id = -1;
|
pop_prepaid_option_id = -1;
|
||||||
@@ -42,10 +41,7 @@ public:
|
|||||||
pop_use_only_upto_datetime = ""; // deprecated
|
pop_use_only_upto_datetime = ""; // deprecated
|
||||||
pop_use_only_for_duration = 0; // deprecated
|
pop_use_only_for_duration = 0; // deprecated
|
||||||
pop_plus_steps = 1; // +: jump <x=1> steps forward
|
pop_plus_steps = 1; // +: jump <x=1> steps forward
|
||||||
pop_plus_steps_saved = 1;
|
|
||||||
pop_minus_steps = 1; // -: jump <x=1> steps backward
|
pop_minus_steps = 1; // -: jump <x=1> steps backward
|
||||||
pop_allow_overpay = false;
|
|
||||||
pop_apply_carry_over_to_ticket_endtime = false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int pop_id;
|
int pop_id;
|
||||||
@@ -62,7 +58,6 @@ public:
|
|||||||
double pop_max_time;
|
double pop_max_time;
|
||||||
double pop_min_price;
|
double pop_min_price;
|
||||||
double pop_max_price;
|
double pop_max_price;
|
||||||
double pop_max_price_save;
|
|
||||||
int pop_carry_over;
|
int pop_carry_over;
|
||||||
int pop_carry_over_option_id;
|
int pop_carry_over_option_id;
|
||||||
bool pop_truncate_last_interpolation_step;
|
bool pop_truncate_last_interpolation_step;
|
||||||
@@ -77,10 +72,7 @@ public:
|
|||||||
bool pop_accumulate_prices;
|
bool pop_accumulate_prices;
|
||||||
bool pop_accumulate_durations;
|
bool pop_accumulate_durations;
|
||||||
int pop_plus_steps;
|
int pop_plus_steps;
|
||||||
int pop_plus_steps_saved;
|
|
||||||
int pop_minus_steps;
|
int pop_minus_steps;
|
||||||
bool pop_allow_overpay;
|
|
||||||
bool pop_apply_carry_over_to_ticket_endtime;
|
|
||||||
|
|
||||||
struct ATBMaxDateTime {
|
struct ATBMaxDateTime {
|
||||||
int direction;
|
int direction;
|
||||||
|
|||||||
@@ -9,8 +9,4 @@ public:
|
|||||||
std::string pedwt_time_from;
|
std::string pedwt_time_from;
|
||||||
std::string pedwt_time_to;
|
std::string pedwt_time_to;
|
||||||
double pedwt_price;
|
double pedwt_price;
|
||||||
int pedwt_paid; // 00: not paid (i.e. free)
|
|
||||||
// 01: not paid in winter term, piad in summer term
|
|
||||||
// 10: paid in winter term, not paid in summer term
|
|
||||||
// 11: paid in winter and in summer term
|
|
||||||
};
|
};
|
||||||
@@ -3,111 +3,6 @@
|
|||||||
|
|
||||||
#include <QTime>
|
#include <QTime>
|
||||||
|
|
||||||
#include "time_range.h"
|
|
||||||
|
|
||||||
enum class ApplyCarryOver {
|
|
||||||
NEVER = 0,
|
|
||||||
MATCH_PREV_DAY = 1,
|
|
||||||
MATCH_NEXT_DAY = 2,
|
|
||||||
ALWAYS = 3
|
|
||||||
};
|
|
||||||
|
|
||||||
struct ATBTariffCarryOver {
|
|
||||||
int m_id;
|
|
||||||
QString m_weekDay;
|
|
||||||
TimeRange m_range;
|
|
||||||
QDate m_date;
|
|
||||||
ApplyCarryOver m_carryOverIf;
|
|
||||||
|
|
||||||
explicit ATBTariffCarryOver()
|
|
||||||
: m_id(-1)
|
|
||||||
, m_carryOverIf(ApplyCarryOver::NEVER) {
|
|
||||||
}
|
|
||||||
|
|
||||||
void setCarryOverIf(QString const &coif) {
|
|
||||||
if (coif == "never") {
|
|
||||||
m_carryOverIf = ApplyCarryOver::NEVER;
|
|
||||||
} else
|
|
||||||
if (coif == "match_prev_day") {
|
|
||||||
m_carryOverIf = ApplyCarryOver::MATCH_PREV_DAY;
|
|
||||||
} else
|
|
||||||
if (coif == "match_next_day") {
|
|
||||||
m_carryOverIf = ApplyCarryOver::MATCH_NEXT_DAY;
|
|
||||||
} else
|
|
||||||
if (coif == "always") {
|
|
||||||
m_carryOverIf = ApplyCarryOver::ALWAYS;
|
|
||||||
} else {
|
|
||||||
qCritical() << __func__ << ":" << __LINE__ << "ERROR unknown carry over application" << coif;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
ApplyCarryOver carryOverIf() const {
|
|
||||||
return m_carryOverIf;
|
|
||||||
}
|
|
||||||
|
|
||||||
QString carryOverIfStr() const {
|
|
||||||
if (m_carryOverIf == ApplyCarryOver::NEVER) {
|
|
||||||
return "never";
|
|
||||||
}
|
|
||||||
if (m_carryOverIf == ApplyCarryOver::ALWAYS) {
|
|
||||||
return "always";
|
|
||||||
}
|
|
||||||
if (m_carryOverIf == ApplyCarryOver::MATCH_PREV_DAY) {
|
|
||||||
return "match prev day";
|
|
||||||
}
|
|
||||||
if (m_carryOverIf == ApplyCarryOver::MATCH_NEXT_DAY) {
|
|
||||||
return "match next day";
|
|
||||||
}
|
|
||||||
return QString("ERROR unknown carry over application: %1").arg(static_cast<int>(m_carryOverIf));
|
|
||||||
}
|
|
||||||
|
|
||||||
int computeMinutesUntilCarryOverEnd(QDateTime const &dt) {
|
|
||||||
int minutes = 0;
|
|
||||||
QString end = m_range.m_end.toString(Qt::ISODate);
|
|
||||||
if (end == "24:00:00") {
|
|
||||||
// note: this did not work
|
|
||||||
// QDateTime t(dt.addDays(1));
|
|
||||||
// t.setTime(QTime(0,0,0));
|
|
||||||
// dt: 2024-10-27T00:00:00 EEST, but t: 2024-10-28T00:00:00 EET (!)
|
|
||||||
// so the difference is 1500 instead of 1440
|
|
||||||
// reason: change from summer to winter time
|
|
||||||
|
|
||||||
// compute minutes directly
|
|
||||||
if (dt.time().isValid()) {
|
|
||||||
minutes = 1440 - (dt.time().hour() * 60 + dt.time().minute());
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
QTime t(QTime::fromString(end, Qt::ISODate));
|
|
||||||
if (t.isValid() && dt.time().isValid()) {
|
|
||||||
minutes = (t.hour() * 60 + t.minute()) - (dt.time().hour() * 60 + dt.time().minute());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (minutes < 0 || minutes > m_range.m_duration) {
|
|
||||||
minutes = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// qCritical() << __func__ << ":" << __LINE__ << "minutes" << minutes;
|
|
||||||
|
|
||||||
return minutes;
|
|
||||||
}
|
|
||||||
|
|
||||||
friend QDebug operator<<(QDebug debug, ATBTariffCarryOver const &co) {
|
|
||||||
QDebugStateSaver saver(debug);
|
|
||||||
|
|
||||||
debug.nospace()
|
|
||||||
<< "\nTariffCarryOver:\n"
|
|
||||||
<< " week day: " << co.m_weekDay << "\n"
|
|
||||||
<< " date: " << co.m_date.toString(Qt::ISODate) << "\n"
|
|
||||||
<< " id: " << co.m_id << "\n"
|
|
||||||
<< " start: " << co.m_range.m_start << "\n"
|
|
||||||
<< " end: " << co.m_range.m_end << "\n"
|
|
||||||
<< " duration: " << co.m_range.m_duration << "\n"
|
|
||||||
<< " carry over if: " << co.carryOverIfStr() << endl;
|
|
||||||
return debug;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
struct ATBCarryOver {
|
struct ATBCarryOver {
|
||||||
struct week {
|
struct week {
|
||||||
int day;
|
int day;
|
||||||
@@ -120,19 +15,6 @@ struct ATBCarryOver {
|
|||||||
|
|
||||||
int id;
|
int id;
|
||||||
|
|
||||||
explicit ATBCarryOver()
|
|
||||||
: id(-1) {
|
|
||||||
|
|
||||||
for (int i = 0 ; i < 8; ++i) {
|
|
||||||
carryover[i].day = -1;
|
|
||||||
carryover[i].seemless = false;
|
|
||||||
carryover[i].never = false;
|
|
||||||
carryover[i].static_start = QTime(23, 59, 59);
|
|
||||||
carryover[i].static_end = QTime(0, 0, 0);
|
|
||||||
carryover[i].duration = -1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
friend QDebug operator<<(QDebug debug, ATBCarryOver const &co) {
|
friend QDebug operator<<(QDebug debug, ATBCarryOver const &co) {
|
||||||
QDebugStateSaver saver(debug);
|
QDebugStateSaver saver(debug);
|
||||||
|
|
||||||
@@ -149,21 +31,21 @@ struct ATBCarryOver {
|
|||||||
<< " day: " << co.carryover[(int)Qt::Tuesday].day << "\n"
|
<< " day: " << co.carryover[(int)Qt::Tuesday].day << "\n"
|
||||||
<< " static_start: " << co.carryover[(int)Qt::Tuesday].static_start.toString(Qt::ISODate) << "\n"
|
<< " static_start: " << co.carryover[(int)Qt::Tuesday].static_start.toString(Qt::ISODate) << "\n"
|
||||||
<< " static_end: " << co.carryover[(int)Qt::Tuesday].static_end.toString(Qt::ISODate) << "\n"
|
<< " static_end: " << co.carryover[(int)Qt::Tuesday].static_end.toString(Qt::ISODate) << "\n"
|
||||||
<< " duration: " << co.carryover[(int)Qt::Tuesday].duration << "\n"
|
<< " duration: " << co.carryover[(int)Qt::Monday].duration << "\n"
|
||||||
<< " anytime: " << co.carryover[(int)Qt::Tuesday].seemless << "\n"
|
<< " anytime: " << co.carryover[(int)Qt::Tuesday].seemless << "\n"
|
||||||
<< " never: " << co.carryover[(int)Qt::Tuesday].never << "\n"
|
<< " never: " << co.carryover[(int)Qt::Tuesday].never << "\n"
|
||||||
<< " **** Wednesday **** \n"
|
<< " **** Wednesday **** \n"
|
||||||
<< " day: " << co.carryover[(int)Qt::Wednesday].day << "\n"
|
<< " day: " << co.carryover[(int)Qt::Wednesday].day << "\n"
|
||||||
<< " static_start: " << co.carryover[(int)Qt::Wednesday].static_start.toString(Qt::ISODate) << "\n"
|
<< " static_start: " << co.carryover[(int)Qt::Wednesday].static_start.toString(Qt::ISODate) << "\n"
|
||||||
<< " static_end: " << co.carryover[(int)Qt::Wednesday].static_end.toString(Qt::ISODate) << "\n"
|
<< " static_end: " << co.carryover[(int)Qt::Wednesday].static_end.toString(Qt::ISODate) << "\n"
|
||||||
<< " duration: " << co.carryover[(int)Qt::Wednesday].duration << "\n"
|
<< " duration: " << co.carryover[(int)Qt::Monday].duration << "\n"
|
||||||
<< " anytime: " << co.carryover[(int)Qt::Wednesday].seemless << "\n"
|
<< " anytime: " << co.carryover[(int)Qt::Wednesday].seemless << "\n"
|
||||||
<< " never: " << co.carryover[(int)Qt::Wednesday].never << "\n"
|
<< " never: " << co.carryover[(int)Qt::Wednesday].never << "\n"
|
||||||
<< " **** Thursday **** \n"
|
<< " **** Thursday **** \n"
|
||||||
<< " day: " << co.carryover[(int)Qt::Thursday].day << "\n"
|
<< " day: " << co.carryover[(int)Qt::Thursday].day << "\n"
|
||||||
<< " static_start: " << co.carryover[(int)Qt::Thursday].static_start.toString(Qt::ISODate) << "\n"
|
<< " static_start: " << co.carryover[(int)Qt::Thursday].static_start.toString(Qt::ISODate) << "\n"
|
||||||
<< " static_end: " << co.carryover[(int)Qt::Thursday].static_end.toString(Qt::ISODate) << "\n"
|
<< " static_end: " << co.carryover[(int)Qt::Thursday].static_end.toString(Qt::ISODate) << "\n"
|
||||||
<< " duration: " << co.carryover[(int)Qt::Thursday].duration << "\n"
|
<< " duration: " << co.carryover[(int)Qt::Monday].duration << "\n"
|
||||||
<< " anytime: " << co.carryover[(int)Qt::Thursday].seemless << "\n"
|
<< " anytime: " << co.carryover[(int)Qt::Thursday].seemless << "\n"
|
||||||
<< " never: " << co.carryover[(int)Qt::Thursday].never << "\n"
|
<< " never: " << co.carryover[(int)Qt::Thursday].never << "\n"
|
||||||
<< " **** Friday **** \n"
|
<< " **** Friday **** \n"
|
||||||
@@ -176,14 +58,14 @@ struct ATBCarryOver {
|
|||||||
<< " day: " << co.carryover[(int)Qt::Saturday].day << "\n"
|
<< " day: " << co.carryover[(int)Qt::Saturday].day << "\n"
|
||||||
<< " static_start: " << co.carryover[(int)Qt::Saturday].static_start.toString(Qt::ISODate) << "\n"
|
<< " static_start: " << co.carryover[(int)Qt::Saturday].static_start.toString(Qt::ISODate) << "\n"
|
||||||
<< " static_end: " << co.carryover[(int)Qt::Saturday].static_end.toString(Qt::ISODate) << "\n"
|
<< " static_end: " << co.carryover[(int)Qt::Saturday].static_end.toString(Qt::ISODate) << "\n"
|
||||||
<< " duration: " << co.carryover[(int)Qt::Saturday].duration << "\n"
|
<< " duration: " << co.carryover[(int)Qt::Monday].duration << "\n"
|
||||||
<< " anytime: " << co.carryover[(int)Qt::Saturday].seemless << "\n"
|
<< " anytime: " << co.carryover[(int)Qt::Saturday].seemless << "\n"
|
||||||
<< " never: " << co.carryover[(int)Qt::Saturday].never << "\n"
|
<< " never: " << co.carryover[(int)Qt::Saturday].never << "\n"
|
||||||
<< " **** Sunday **** \n"
|
<< " **** Sunday **** \n"
|
||||||
<< " day: " << co.carryover[(int)Qt::Sunday].day << "\n"
|
<< " day: " << co.carryover[(int)Qt::Sunday].day << "\n"
|
||||||
<< " static_start: " << co.carryover[(int)Qt::Sunday].static_start.toString(Qt::ISODate) << "\n"
|
<< " static_start: " << co.carryover[(int)Qt::Sunday].static_start.toString(Qt::ISODate) << "\n"
|
||||||
<< " static_end: " << co.carryover[(int)Qt::Sunday].static_end.toString(Qt::ISODate) << "\n"
|
<< " static_end: " << co.carryover[(int)Qt::Sunday].static_end.toString(Qt::ISODate) << "\n"
|
||||||
<< " duration: " << co.carryover[(int)Qt::Sunday].duration << "\n"
|
<< " duration: " << co.carryover[(int)Qt::Monday].duration << "\n"
|
||||||
<< " anytime: " << co.carryover[(int)Qt::Sunday].seemless << "\n"
|
<< " anytime: " << co.carryover[(int)Qt::Sunday].seemless << "\n"
|
||||||
<< " never: " << co.carryover[(int)Qt::Sunday].never << "\n";
|
<< " never: " << co.carryover[(int)Qt::Sunday].never << "\n";
|
||||||
|
|
||||||
|
|||||||
@@ -1,69 +0,0 @@
|
|||||||
#ifndef ATB_TARIFF_CARRYOVER_SETTINGS_H_INCLUDED
|
|
||||||
#define ATB_TARIFF_CARRYOVER_SETTINGS_H_INCLUDED
|
|
||||||
|
|
||||||
#include <QDebug>
|
|
||||||
#include <QDateTime>
|
|
||||||
|
|
||||||
#include <functional>
|
|
||||||
|
|
||||||
struct ATBTariffCarryOverSettings {
|
|
||||||
|
|
||||||
// parking time limit not violated: return false, otherwise: return true.
|
|
||||||
using ParkingTimeLimitChecker = std::function<bool(ATBTariffCarryOverSettings const&,
|
|
||||||
QDateTime const &startTime,
|
|
||||||
QDateTime const &endTime,
|
|
||||||
int paymentOptionIndex)>;
|
|
||||||
|
|
||||||
int m_duration;
|
|
||||||
QTime m_start;
|
|
||||||
QTime m_end;
|
|
||||||
ParkingTimeLimitChecker m_parkingTimeLimitChecker;
|
|
||||||
|
|
||||||
QTime m_parking_time_limit;
|
|
||||||
QTime m_about_to_exceed_parking_time_limit;
|
|
||||||
|
|
||||||
explicit ATBTariffCarryOverSettings()
|
|
||||||
: m_duration(0)
|
|
||||||
, m_start(QTime())
|
|
||||||
, m_end(QTime())
|
|
||||||
, m_parkingTimeLimitChecker([](ATBTariffCarryOverSettings const&,
|
|
||||||
QDateTime const&, QDateTime const&, int) { return false; })
|
|
||||||
, m_parking_time_limit(QTime())
|
|
||||||
, m_about_to_exceed_parking_time_limit(QTime()) {}
|
|
||||||
|
|
||||||
explicit ATBTariffCarryOverSettings(int duration, QTime const &start,
|
|
||||||
QTime const &end,
|
|
||||||
QTime const &parking_time_limit,
|
|
||||||
QTime const &about_to_exceed_parking_time_limit,
|
|
||||||
ParkingTimeLimitChecker parkingTimeLimitChecker)
|
|
||||||
: m_duration(duration)
|
|
||||||
, m_start(start)
|
|
||||||
, m_end(end)
|
|
||||||
, m_parkingTimeLimitChecker(std::move(parkingTimeLimitChecker))
|
|
||||||
, m_parking_time_limit(parking_time_limit)
|
|
||||||
, m_about_to_exceed_parking_time_limit(about_to_exceed_parking_time_limit) {
|
|
||||||
}
|
|
||||||
|
|
||||||
bool parkingTimeLimitExceeded(QDateTime const &startTime,
|
|
||||||
QDateTime const &endTime,
|
|
||||||
int paymentOptionIndex) const {
|
|
||||||
return m_parkingTimeLimitChecker(*this, startTime, endTime, paymentOptionIndex);
|
|
||||||
}
|
|
||||||
|
|
||||||
QTime const &parkingTimeLimit() const { return m_parking_time_limit; }
|
|
||||||
QTime &parkingTimeLimit() { return m_parking_time_limit; }
|
|
||||||
|
|
||||||
friend QDebug operator<<(QDebug debug, ATBTariffCarryOverSettings const &co) {
|
|
||||||
QDebugStateSaver saver(debug);
|
|
||||||
|
|
||||||
debug.nospace()
|
|
||||||
<< " duration: " << co.m_duration << "\n"
|
|
||||||
<< " start: " << co.m_start.toString(Qt::ISODate) << "\n"
|
|
||||||
<< " end: " << co.m_end.toString(Qt::ISODate) << "\n"
|
|
||||||
<< " parking_time_limit: " << co.m_parking_time_limit.toString(Qt::ISODate) << endl;
|
|
||||||
|
|
||||||
return debug;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif // ATB_TARIFF_CARRYOVER_SETTINGS_H_INCLUDED
|
|
||||||
@@ -1,3 +1,4 @@
|
|||||||
|
#pragma once
|
||||||
#include <variant>
|
#include <variant>
|
||||||
#include <cstddef>
|
#include <cstddef>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|||||||
@@ -14,8 +14,6 @@
|
|||||||
void setDebugLevel(int level);
|
void setDebugLevel(int level);
|
||||||
int getDebugLevel();
|
int getDebugLevel();
|
||||||
|
|
||||||
#if 0
|
|
||||||
|
|
||||||
static void print() {
|
static void print() {
|
||||||
std::cerr << "\n";
|
std::cerr << "\n";
|
||||||
if (getDebugLevel() == DBG_LEVEL_FATAL) {
|
if (getDebugLevel() == DBG_LEVEL_FATAL) {
|
||||||
@@ -77,6 +75,4 @@ static void LOG_FATAL(const Arg1& arg1, const Args&&... args) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif // TARIFF_LOG_INCLUDED_H
|
#endif // TARIFF_LOG_INCLUDED_H
|
||||||
|
|||||||
@@ -1,79 +0,0 @@
|
|||||||
#ifndef TARIFF_OUT_OF_SERVICE_H_INCLUDED
|
|
||||||
#define TARIFF_OUT_OF_SERVICE_H_INCLUDED
|
|
||||||
|
|
||||||
#include <QDateTime>
|
|
||||||
#include <QString>
|
|
||||||
|
|
||||||
#include "time_range.h"
|
|
||||||
|
|
||||||
enum class ApplyOutOfService {
|
|
||||||
NEVER = 0,
|
|
||||||
MATCH_PREV_DAY = 1,
|
|
||||||
MATCH_NEXT_DAY = 2,
|
|
||||||
ALWAYS = 3
|
|
||||||
};
|
|
||||||
|
|
||||||
struct ATBTariffOutOfService {
|
|
||||||
int m_id;
|
|
||||||
QString m_weekDay;
|
|
||||||
QDate m_date;
|
|
||||||
TimeRange m_range;
|
|
||||||
ApplyOutOfService m_outOfServiceIf;
|
|
||||||
|
|
||||||
explicit ATBTariffOutOfService()
|
|
||||||
: m_id(-1)
|
|
||||||
, m_outOfServiceIf(ApplyOutOfService::NEVER) {
|
|
||||||
}
|
|
||||||
|
|
||||||
void setOutOfServiceIf(QString const &oosif) {
|
|
||||||
if (oosif == "never") {
|
|
||||||
m_outOfServiceIf = ApplyOutOfService::NEVER;
|
|
||||||
} else
|
|
||||||
if (oosif == "match_prev_day") {
|
|
||||||
m_outOfServiceIf = ApplyOutOfService::MATCH_PREV_DAY;
|
|
||||||
} else
|
|
||||||
if (oosif == "match_next_day") {
|
|
||||||
m_outOfServiceIf = ApplyOutOfService::MATCH_NEXT_DAY;
|
|
||||||
} else
|
|
||||||
if (oosif == "always") {
|
|
||||||
m_outOfServiceIf = ApplyOutOfService::ALWAYS;
|
|
||||||
} else {
|
|
||||||
qCritical() << "ERROR unknown servcie application" << oosif;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
ApplyOutOfService outOfServiceIf() const {
|
|
||||||
return m_outOfServiceIf;
|
|
||||||
}
|
|
||||||
|
|
||||||
QString outOfServiceIfStr() const {
|
|
||||||
if (m_outOfServiceIf == ApplyOutOfService::NEVER) {
|
|
||||||
return "never";
|
|
||||||
}
|
|
||||||
if (m_outOfServiceIf == ApplyOutOfService::ALWAYS) {
|
|
||||||
return "always";
|
|
||||||
}
|
|
||||||
if (m_outOfServiceIf == ApplyOutOfService::MATCH_PREV_DAY) {
|
|
||||||
return "match prev day";
|
|
||||||
}
|
|
||||||
if (m_outOfServiceIf == ApplyOutOfService::MATCH_NEXT_DAY) {
|
|
||||||
return "match next day";
|
|
||||||
}
|
|
||||||
return QString("ERROR unknown out of service application: %1").arg(static_cast<int>(m_outOfServiceIf));
|
|
||||||
}
|
|
||||||
friend QDebug operator<<(QDebug debug, ATBTariffOutOfService const &oos) {
|
|
||||||
QDebugStateSaver saver(debug);
|
|
||||||
|
|
||||||
debug.nospace()
|
|
||||||
<< "\nTariffOutOfService:\n"
|
|
||||||
<< " week day: " << oos.m_weekDay << "\n"
|
|
||||||
<< " date: " << oos.m_date.toString(Qt::ISODate) << "\n"
|
|
||||||
<< " id: " << oos.m_id << "\n"
|
|
||||||
<< " start: " << oos.m_range.m_start << "\n"
|
|
||||||
<< " end: " << oos.m_range.m_end << "\n"
|
|
||||||
<< " duration: " << oos.m_range.m_duration << endl;
|
|
||||||
return debug;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif // TARIFF_SERVICE_H_INCLUDED
|
|
||||||
@@ -19,12 +19,7 @@ enum class PERMIT_TYPE : quint8 {
|
|||||||
SHORT_TERM_PARKING_CAMPER=12,
|
SHORT_TERM_PARKING_CAMPER=12,
|
||||||
DAY_TICKET_PKW=13,
|
DAY_TICKET_PKW=13,
|
||||||
DAY_TICKET_BUS=14,
|
DAY_TICKET_BUS=14,
|
||||||
DAY_TICKET_CAMPER=15,
|
DAY_TICKET_CAMPER=15
|
||||||
FREE_TICKET=16,
|
|
||||||
|
|
||||||
TEST_PRODUCT_1=17,
|
|
||||||
TEST_PRODUCT_2=18,
|
|
||||||
PRODUCT_MAX
|
|
||||||
};
|
};
|
||||||
|
|
||||||
struct PermitType {
|
struct PermitType {
|
||||||
@@ -78,15 +73,6 @@ struct PermitType {
|
|||||||
case 15:
|
case 15:
|
||||||
m_permitType = PERMIT_TYPE::DAY_TICKET_CAMPER;
|
m_permitType = PERMIT_TYPE::DAY_TICKET_CAMPER;
|
||||||
break;
|
break;
|
||||||
case 16:
|
|
||||||
m_permitType = PERMIT_TYPE::FREE_TICKET;
|
|
||||||
break;
|
|
||||||
case 17:
|
|
||||||
m_permitType = PERMIT_TYPE::TEST_PRODUCT_1;
|
|
||||||
break;
|
|
||||||
case 18:
|
|
||||||
m_permitType = PERMIT_TYPE::TEST_PRODUCT_2;
|
|
||||||
break;
|
|
||||||
default:
|
default:
|
||||||
m_permitType = PERMIT_TYPE::INVALID;
|
m_permitType = PERMIT_TYPE::INVALID;
|
||||||
}
|
}
|
||||||
@@ -130,12 +116,6 @@ struct PermitType {
|
|||||||
return 14;
|
return 14;
|
||||||
case PERMIT_TYPE::DAY_TICKET_CAMPER:
|
case PERMIT_TYPE::DAY_TICKET_CAMPER:
|
||||||
return 15;
|
return 15;
|
||||||
case PERMIT_TYPE::FREE_TICKET:
|
|
||||||
return 16;
|
|
||||||
case PERMIT_TYPE::TEST_PRODUCT_1:
|
|
||||||
return 17;
|
|
||||||
case PERMIT_TYPE::TEST_PRODUCT_2:
|
|
||||||
return 18;
|
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -152,6 +132,9 @@ struct PermitType {
|
|||||||
if (permitTypeStr == "DAY_TICKET_CHILD") {
|
if (permitTypeStr == "DAY_TICKET_CHILD") {
|
||||||
return PERMIT_TYPE::DAY_TICKET_CHILD;
|
return PERMIT_TYPE::DAY_TICKET_CHILD;
|
||||||
} else
|
} else
|
||||||
|
if (permitTypeStr == "DAY_TICKET_ADULT") {
|
||||||
|
return PERMIT_TYPE::DAY_TICKET_ADULT;
|
||||||
|
} else
|
||||||
if (permitTypeStr == "DAY_TICKET_TEEN") {
|
if (permitTypeStr == "DAY_TICKET_TEEN") {
|
||||||
return PERMIT_TYPE::DAY_TICKET_TEEN;
|
return PERMIT_TYPE::DAY_TICKET_TEEN;
|
||||||
} else
|
} else
|
||||||
@@ -187,15 +170,6 @@ struct PermitType {
|
|||||||
} else
|
} else
|
||||||
if (permitTypeStr == "DAY_TICKET_CAMPER") {
|
if (permitTypeStr == "DAY_TICKET_CAMPER") {
|
||||||
return PERMIT_TYPE::DAY_TICKET_CAMPER;
|
return PERMIT_TYPE::DAY_TICKET_CAMPER;
|
||||||
} else
|
|
||||||
if (permitTypeStr == "FREE_TICKET") {
|
|
||||||
return PERMIT_TYPE::FREE_TICKET;
|
|
||||||
} else
|
|
||||||
if (permitTypeStr == "TEST_PRODUCT_1") {
|
|
||||||
return PERMIT_TYPE::TEST_PRODUCT_1;
|
|
||||||
} else
|
|
||||||
if (permitTypeStr == "TEST_PRODUCT_2") {
|
|
||||||
return PERMIT_TYPE::TEST_PRODUCT_2;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return PERMIT_TYPE::INVALID;
|
return PERMIT_TYPE::INVALID;
|
||||||
@@ -233,12 +207,6 @@ struct PermitType {
|
|||||||
return QString("DAY_TICKET_BUS");
|
return QString("DAY_TICKET_BUS");
|
||||||
case PERMIT_TYPE::DAY_TICKET_CAMPER:
|
case PERMIT_TYPE::DAY_TICKET_CAMPER:
|
||||||
return QString("DAY_TICKET_CAMPER");
|
return QString("DAY_TICKET_CAMPER");
|
||||||
case PERMIT_TYPE::FREE_TICKET:
|
|
||||||
return QString("FREE_TICKET");
|
|
||||||
case PERMIT_TYPE::TEST_PRODUCT_1:
|
|
||||||
return QString("TEST_PRODUCT_1");
|
|
||||||
case PERMIT_TYPE::TEST_PRODUCT_2:
|
|
||||||
return QString("TEST_PRODUCT_2");
|
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -277,12 +245,6 @@ struct PermitType {
|
|||||||
return QString("DAY_TICKET_BUS");
|
return QString("DAY_TICKET_BUS");
|
||||||
case PERMIT_TYPE::DAY_TICKET_CAMPER:
|
case PERMIT_TYPE::DAY_TICKET_CAMPER:
|
||||||
return QString("DAY_TICKET_CAMPER");
|
return QString("DAY_TICKET_CAMPER");
|
||||||
case PERMIT_TYPE::FREE_TICKET:
|
|
||||||
return QString("FREE_TICKET");
|
|
||||||
case PERMIT_TYPE::TEST_PRODUCT_1:
|
|
||||||
return QString("TEST_PRODUCT_1");
|
|
||||||
case PERMIT_TYPE::TEST_PRODUCT_2:
|
|
||||||
return QString("TEST_PRODUCT_2");
|
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,114 +1,17 @@
|
|||||||
#ifndef TARIFF_PREPAID_H_INCLUDED
|
#ifndef TARIFF_PREPAID_H_INCLUDED
|
||||||
#define TARIFF_PREPAID_H_INCLUDED
|
#define TARIFF_PREPAID_H_INCLUDED
|
||||||
|
|
||||||
#include <QDateTime>
|
#include <QTime>
|
||||||
#include <QString>
|
#include <QString>
|
||||||
|
|
||||||
#include "time_range.h"
|
|
||||||
|
|
||||||
enum class ApplyPrepaid {
|
|
||||||
NEVER = 0,
|
|
||||||
MATCH_PREV_DAY = 1,
|
|
||||||
MATCH_NEXT_DAY = 2,
|
|
||||||
ALWAYS = 3
|
|
||||||
};
|
|
||||||
|
|
||||||
struct ATBTariffPrepaid {
|
|
||||||
int m_id;
|
|
||||||
QString m_weekDay;
|
|
||||||
QDate m_date;
|
|
||||||
TimeRange m_range;
|
|
||||||
ApplyPrepaid m_prepaidIf;
|
|
||||||
|
|
||||||
explicit ATBTariffPrepaid()
|
|
||||||
: m_id(-1)
|
|
||||||
, m_prepaidIf(ApplyPrepaid::NEVER) {
|
|
||||||
}
|
|
||||||
|
|
||||||
void setPrepaidIf(QString const &ppif) {
|
|
||||||
if (ppif == "never") {
|
|
||||||
m_prepaidIf = ApplyPrepaid::NEVER;
|
|
||||||
} else
|
|
||||||
if (ppif == "match_prev_day") {
|
|
||||||
m_prepaidIf = ApplyPrepaid::MATCH_PREV_DAY;
|
|
||||||
} else
|
|
||||||
if (ppif == "match_next_day") {
|
|
||||||
m_prepaidIf = ApplyPrepaid::MATCH_NEXT_DAY;
|
|
||||||
} else
|
|
||||||
if (ppif == "always") {
|
|
||||||
m_prepaidIf = ApplyPrepaid::ALWAYS;
|
|
||||||
} else {
|
|
||||||
qCritical() << __func__ << ":" << __LINE__ << "ERROR unknown carry over application" << ppif;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
ApplyPrepaid prepaidIf() const {
|
|
||||||
return m_prepaidIf;
|
|
||||||
}
|
|
||||||
|
|
||||||
QString prepaidIfStr() const {
|
|
||||||
if (m_prepaidIf == ApplyPrepaid::NEVER) {
|
|
||||||
return "never";
|
|
||||||
}
|
|
||||||
if (m_prepaidIf == ApplyPrepaid::ALWAYS) {
|
|
||||||
return "always";
|
|
||||||
}
|
|
||||||
if (m_prepaidIf == ApplyPrepaid::MATCH_PREV_DAY) {
|
|
||||||
return "match prev day";
|
|
||||||
}
|
|
||||||
if (m_prepaidIf == ApplyPrepaid::MATCH_NEXT_DAY) {
|
|
||||||
return "match next day";
|
|
||||||
}
|
|
||||||
return QString("ERROR unknown prepaid application: %1").arg(static_cast<int>(m_prepaidIf));
|
|
||||||
}
|
|
||||||
|
|
||||||
friend QDebug operator<<(QDebug debug, ATBTariffPrepaid const &pp) {
|
|
||||||
QDebugStateSaver saver(debug);
|
|
||||||
|
|
||||||
debug.nospace()
|
|
||||||
<< "\nTariffPrepaid:\n"
|
|
||||||
<< " week day: " << pp.m_weekDay << "\n"
|
|
||||||
<< " date: " << pp.m_date.toString(Qt::ISODate) << "\n"
|
|
||||||
<< " id: " << pp.m_id << "\n"
|
|
||||||
<< " start: " << pp.m_range.m_start << "\n"
|
|
||||||
<< " end: " << pp.m_range.m_end << "\n"
|
|
||||||
<< " duration: " << pp.m_range.m_duration << "\n"
|
|
||||||
<< " prepaid if: " << pp.prepaidIfStr() << endl;
|
|
||||||
return debug;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
// deprecated
|
|
||||||
|
|
||||||
struct ATBPrepaid {
|
struct ATBPrepaid {
|
||||||
|
explicit ATBPrepaid() = default;
|
||||||
int id;
|
int id;
|
||||||
bool anytime;
|
bool anytime;
|
||||||
bool never;
|
bool never;
|
||||||
QTime static_start;
|
QTime static_start;
|
||||||
QTime static_end;
|
QTime static_end;
|
||||||
|
|
||||||
struct week {
|
|
||||||
int day;
|
|
||||||
QTime static_start;
|
|
||||||
QTime static_end;
|
|
||||||
int duration;
|
|
||||||
} prepaid[8];
|
|
||||||
|
|
||||||
explicit ATBPrepaid()
|
|
||||||
: id(-1)
|
|
||||||
, anytime(false)
|
|
||||||
, never(false)
|
|
||||||
, static_start(QTime(23, 59, 59))
|
|
||||||
, static_end(QTime(0, 0, 0)) {
|
|
||||||
|
|
||||||
for (int i = 0 ; i < 8; ++i) {
|
|
||||||
prepaid[i].day = -1;
|
|
||||||
prepaid[i].static_start = QTime(23, 59, 59);
|
|
||||||
prepaid[i].static_end = QTime(0, 0, 0);
|
|
||||||
prepaid[i].duration = -1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
friend QDebug operator<<(QDebug debug, ATBPrepaid const &pp) {
|
friend QDebug operator<<(QDebug debug, ATBPrepaid const &pp) {
|
||||||
QDebugStateSaver saver(debug);
|
QDebugStateSaver saver(debug);
|
||||||
|
|
||||||
@@ -117,41 +20,7 @@ struct ATBPrepaid {
|
|||||||
<< " static_start: " << pp.static_start.toString(Qt::ISODate) << "\n"
|
<< " static_start: " << pp.static_start.toString(Qt::ISODate) << "\n"
|
||||||
<< " static_end: " << pp.static_end.toString(Qt::ISODate) << "\n"
|
<< " static_end: " << pp.static_end.toString(Qt::ISODate) << "\n"
|
||||||
<< " anytime: " << pp.anytime << "\n"
|
<< " anytime: " << pp.anytime << "\n"
|
||||||
<< " never: " << pp.never << "\n"
|
<< " never: " << pp.never << "\n";
|
||||||
<< " **** Monday **** \n"
|
|
||||||
<< " day: " << pp.prepaid[(int)Qt::Monday].day << "\n"
|
|
||||||
<< " static_start: " << pp.prepaid[(int)Qt::Monday].static_start.toString(Qt::ISODate) << "\n"
|
|
||||||
<< " static_end: " << pp.prepaid[(int)Qt::Monday].static_end.toString(Qt::ISODate) << "\n"
|
|
||||||
<< " duration: " << pp.prepaid[(int)Qt::Monday].duration << "\n"
|
|
||||||
<< " **** Tuesday **** \n"
|
|
||||||
<< " day: " << pp.prepaid[(int)Qt::Tuesday].day << "\n"
|
|
||||||
<< " static_start: " << pp.prepaid[(int)Qt::Tuesday].static_start.toString(Qt::ISODate) << "\n"
|
|
||||||
<< " static_end: " << pp.prepaid[(int)Qt::Tuesday].static_end.toString(Qt::ISODate) << "\n"
|
|
||||||
<< " duration: " << pp.prepaid[(int)Qt::Tuesday].duration << "\n"
|
|
||||||
<< " **** Wednesday **** \n"
|
|
||||||
<< " day: " << pp.prepaid[(int)Qt::Wednesday].day << "\n"
|
|
||||||
<< " static_start: " << pp.prepaid[(int)Qt::Wednesday].static_start.toString(Qt::ISODate) << "\n"
|
|
||||||
<< " static_end: " << pp.prepaid[(int)Qt::Wednesday].static_end.toString(Qt::ISODate) << "\n"
|
|
||||||
<< " duration: " << pp.prepaid[(int)Qt::Wednesday].duration << "\n"
|
|
||||||
<< " **** Thursday **** \n"
|
|
||||||
<< " day: " << pp.prepaid[(int)Qt::Thursday].day << "\n"
|
|
||||||
<< " static_start: " << pp.prepaid[(int)Qt::Thursday].static_start.toString(Qt::ISODate) << "\n"
|
|
||||||
<< " static_end: " << pp.prepaid[(int)Qt::Thursday].static_end.toString(Qt::ISODate) << "\n"
|
|
||||||
<< " duration: " << pp.prepaid[(int)Qt::Thursday].duration << "\n"
|
|
||||||
<< " **** Friday **** \n"
|
|
||||||
<< " day: " << pp.prepaid[(int)Qt::Friday].day << "\n"
|
|
||||||
<< " static_start: " << pp.prepaid[(int)Qt::Friday].static_start.toString(Qt::ISODate) << "\n"
|
|
||||||
<< " static_end: " << pp.prepaid[(int)Qt::Friday].static_end.toString(Qt::ISODate) << "\n"
|
|
||||||
<< " **** Saturday **** \n"
|
|
||||||
<< " day: " << pp.prepaid[(int)Qt::Saturday].day << "\n"
|
|
||||||
<< " static_start: " << pp.prepaid[(int)Qt::Saturday].static_start.toString(Qt::ISODate) << "\n"
|
|
||||||
<< " static_end: " << pp.prepaid[(int)Qt::Saturday].static_end.toString(Qt::ISODate) << "\n"
|
|
||||||
<< " duration: " << pp.prepaid[(int)Qt::Saturday].duration << "\n"
|
|
||||||
<< " **** Sunday **** \n"
|
|
||||||
<< " day: " << pp.prepaid[(int)Qt::Sunday].day << "\n"
|
|
||||||
<< " static_start: " << pp.prepaid[(int)Qt::Sunday].static_start.toString(Qt::ISODate) << "\n"
|
|
||||||
<< " static_end: " << pp.prepaid[(int)Qt::Sunday].static_end.toString(Qt::ISODate) << "\n"
|
|
||||||
<< " duration: " << pp.prepaid[(int)Qt::Sunday].duration << "\n";
|
|
||||||
|
|
||||||
return debug;
|
return debug;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,81 +0,0 @@
|
|||||||
#ifndef TARIFF_SERVICE_H_INCLUDED
|
|
||||||
#define TARIFF_SERVICE_H_INCLUDED
|
|
||||||
|
|
||||||
#include <QDateTime>
|
|
||||||
#include <QString>
|
|
||||||
|
|
||||||
#include "time_range.h"
|
|
||||||
|
|
||||||
enum class ApplyService {
|
|
||||||
NEVER = 0,
|
|
||||||
MATCH_PREV_DAY = 1,
|
|
||||||
MATCH_NEXT_DAY = 2,
|
|
||||||
ALWAYS = 3
|
|
||||||
};
|
|
||||||
|
|
||||||
struct ATBTariffService {
|
|
||||||
int m_id;
|
|
||||||
QString m_weekDay;
|
|
||||||
QDate m_date;
|
|
||||||
TimeRange m_range;
|
|
||||||
ApplyService m_serviceIf;
|
|
||||||
|
|
||||||
explicit ATBTariffService()
|
|
||||||
: m_id(-1)
|
|
||||||
, m_serviceIf(ApplyService::NEVER) {
|
|
||||||
}
|
|
||||||
|
|
||||||
void setServiceIf(QString const &sif) {
|
|
||||||
if (sif == "never") {
|
|
||||||
m_serviceIf = ApplyService::NEVER;
|
|
||||||
} else
|
|
||||||
if (sif == "match_prev_day") {
|
|
||||||
m_serviceIf = ApplyService::MATCH_PREV_DAY;
|
|
||||||
} else
|
|
||||||
if (sif == "match_next_day") {
|
|
||||||
m_serviceIf = ApplyService::MATCH_NEXT_DAY;
|
|
||||||
} else
|
|
||||||
if (sif == "always") {
|
|
||||||
m_serviceIf = ApplyService::ALWAYS;
|
|
||||||
} else {
|
|
||||||
qCritical() << "ERROR unknown servcie application" << sif;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
ApplyService serviceIf() const {
|
|
||||||
return m_serviceIf;
|
|
||||||
}
|
|
||||||
|
|
||||||
QString serviceIfStr() const {
|
|
||||||
if (m_serviceIf == ApplyService::NEVER) {
|
|
||||||
return "never";
|
|
||||||
}
|
|
||||||
if (m_serviceIf == ApplyService::ALWAYS) {
|
|
||||||
return "always";
|
|
||||||
}
|
|
||||||
if (m_serviceIf == ApplyService::MATCH_PREV_DAY) {
|
|
||||||
return "match prev day";
|
|
||||||
}
|
|
||||||
if (m_serviceIf == ApplyService::MATCH_NEXT_DAY) {
|
|
||||||
return "match next day";
|
|
||||||
}
|
|
||||||
return QString("ERROR unknown service application: %1").arg(static_cast<int>(m_serviceIf));
|
|
||||||
}
|
|
||||||
|
|
||||||
friend QDebug operator<<(QDebug debug, ATBTariffService const &ts) {
|
|
||||||
QDebugStateSaver saver(debug);
|
|
||||||
|
|
||||||
debug.nospace()
|
|
||||||
<< "\nTariffService:\n"
|
|
||||||
<< " week day: " << ts.m_weekDay << "\n"
|
|
||||||
<< " date: " << ts.m_date.toString(Qt::ISODate) << "\n"
|
|
||||||
<< " id: " << ts.m_id << "\n"
|
|
||||||
<< " start: " << ts.m_range.m_start << "\n"
|
|
||||||
<< " end: " << ts.m_range.m_end << "\n"
|
|
||||||
<< " duration: " << ts.m_range.m_duration << "\n"
|
|
||||||
<< " prepaid if: " << ts.serviceIfStr() << endl;
|
|
||||||
return debug;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif // TARIFF_SERVICE_H_INCLUDED
|
|
||||||
@@ -1,40 +0,0 @@
|
|||||||
#ifndef ATB_TARIFF_SETTINGS_H_INCLUDED
|
|
||||||
#define ATB_TARIFF_SETTINGS_H_INCLUDED
|
|
||||||
|
|
||||||
#include <QDebug>
|
|
||||||
|
|
||||||
struct ATBTariffSettings {
|
|
||||||
int m_max_price;
|
|
||||||
int m_min_price;
|
|
||||||
int m_max_time;
|
|
||||||
int m_min_time;
|
|
||||||
|
|
||||||
explicit ATBTariffSettings()
|
|
||||||
: m_max_price(0)
|
|
||||||
, m_min_price(0)
|
|
||||||
, m_max_time(0)
|
|
||||||
, m_min_time(0) {
|
|
||||||
}
|
|
||||||
|
|
||||||
explicit ATBTariffSettings(int max_price, int min_price, int max_time, int min_time)
|
|
||||||
: m_max_price(max_price)
|
|
||||||
, m_min_price(min_price)
|
|
||||||
, m_max_time(max_time)
|
|
||||||
, m_min_time(min_time) {
|
|
||||||
}
|
|
||||||
|
|
||||||
friend QDebug operator<<(QDebug debug, ATBTariffSettings const &ts) {
|
|
||||||
QDebugStateSaver saver(debug);
|
|
||||||
|
|
||||||
debug.nospace()
|
|
||||||
<< " max_price: " << ts.m_max_price << "\n"
|
|
||||||
<< " min_price: " << ts.m_min_price << "\n"
|
|
||||||
<< " max_time: " << ts.m_max_time << "\n"
|
|
||||||
<< " min_time: " << ts.m_min_time << endl;
|
|
||||||
|
|
||||||
return debug;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
#endif // ATB_TARIFF_SETTINGS_H_INCLUDED
|
|
||||||
@@ -1,46 +1,12 @@
|
|||||||
#ifndef TIME_RANGE_H_INCLUDED
|
#ifndef TIME_RANGE_H_INCLUDED
|
||||||
#define TIME_RANGE_H_INCLUDED
|
#define TIME_RANGE_H_INCLUDED
|
||||||
|
|
||||||
#include "atb_time.h"
|
#include "time_range_header.h"
|
||||||
|
|
||||||
#include <QString>
|
|
||||||
|
|
||||||
struct TimeRange {
|
struct TimeRange {
|
||||||
ATBTime m_start;
|
public:
|
||||||
ATBTime m_end;
|
bool IsActive;
|
||||||
int m_duration;
|
ATBTimeRange TimeRangeStructure;
|
||||||
|
|
||||||
explicit TimeRange() = default;
|
|
||||||
explicit TimeRange(QString const &start, QString const &end, int duration)
|
|
||||||
: m_start(start)
|
|
||||||
, m_end(end)
|
|
||||||
, m_duration(duration) {
|
|
||||||
}
|
|
||||||
explicit TimeRange(ATBTime const &start, ATBTime const &end, int duration)
|
|
||||||
: m_start(start)
|
|
||||||
, m_end(end)
|
|
||||||
, m_duration(duration) {
|
|
||||||
}
|
|
||||||
|
|
||||||
explicit TimeRange(TimeRange const &timeRange) {
|
|
||||||
m_start = timeRange.m_start;
|
|
||||||
m_end = timeRange.m_end;
|
|
||||||
m_duration = timeRange.m_duration;
|
|
||||||
}
|
|
||||||
|
|
||||||
TimeRange &operator=(TimeRange && timeRange) {
|
|
||||||
m_start = std::move(timeRange.m_start);
|
|
||||||
m_end = std::move(timeRange.m_end);
|
|
||||||
m_duration = timeRange.m_duration;
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
TimeRange &operator=(TimeRange const &timeRange) {
|
|
||||||
m_start = timeRange.m_start;
|
|
||||||
m_end = timeRange.m_end;
|
|
||||||
m_duration = timeRange.m_duration;
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // TIME_RANGE_H_INCLUDED
|
#endif // TIME_RANGE_H_INCLUDED
|
||||||
|
|||||||
@@ -1,57 +1,10 @@
|
|||||||
#include "tariff_settings.h"
|
#pragma once
|
||||||
#include "tariff_carryover_settings.h"
|
#include <string>
|
||||||
|
|
||||||
#include <QString>
|
class ATBWeekDays
|
||||||
#include <Qt>
|
{
|
||||||
#include <QDate>
|
public:
|
||||||
|
int pdiw_id;
|
||||||
struct ATBWeekDay {
|
std::string pdiw_label;
|
||||||
enum WeekDayType {USUAL_WEEKDAY=0, HOLIDAY=1};
|
int pdiw_index;
|
||||||
|
|
||||||
Qt::DayOfWeek m_id;
|
|
||||||
QString m_name;
|
|
||||||
QDate m_date;
|
|
||||||
WeekDayType m_type;
|
|
||||||
ATBTariffSettings m_tariffSettings;
|
|
||||||
ATBTariffCarryOverSettings m_tariffCarryOverSettings;
|
|
||||||
|
|
||||||
explicit ATBWeekDay()
|
|
||||||
: m_id(Qt::Monday)
|
|
||||||
, m_name("")
|
|
||||||
, m_date(QDate())
|
|
||||||
, m_type(USUAL_WEEKDAY)
|
|
||||||
, m_tariffSettings()
|
|
||||||
, m_tariffCarryOverSettings() {}
|
|
||||||
|
|
||||||
explicit ATBWeekDay(Qt::DayOfWeek id, QString const &name, WeekDayType type,
|
|
||||||
QDate const &date,
|
|
||||||
ATBTariffSettings const &tariffSettings,
|
|
||||||
ATBTariffCarryOverSettings const &tariffCarryOverSettings)
|
|
||||||
: m_id(id)
|
|
||||||
, m_name(name)
|
|
||||||
, m_date(date)
|
|
||||||
, m_type(type)
|
|
||||||
, m_tariffSettings(tariffSettings)
|
|
||||||
, m_tariffCarryOverSettings(tariffCarryOverSettings) {}
|
|
||||||
|
|
||||||
ATBTariffCarryOverSettings &getTariffCarryOverSettings() { return m_tariffCarryOverSettings; }
|
|
||||||
ATBTariffCarryOverSettings const &getTariffCarryOverSettings() const { return m_tariffCarryOverSettings; }
|
|
||||||
|
|
||||||
ATBTariffSettings &getTariffSettings() { return m_tariffSettings; }
|
|
||||||
ATBTariffSettings const &getTariffSettings() const { return m_tariffSettings; }
|
|
||||||
|
|
||||||
friend QDebug operator<<(QDebug debug, ATBWeekDay const &wd) {
|
|
||||||
QDebugStateSaver saver(debug);
|
|
||||||
|
|
||||||
debug.nospace()
|
|
||||||
<< " id: " << (int)wd.m_id << "\n"
|
|
||||||
<< " name: " << wd.m_name << "\n"
|
|
||||||
<< " type: " << (int)wd.m_type << "\n\n"
|
|
||||||
<< " tariff settings: " << "\n"
|
|
||||||
<< wd.m_tariffSettings << "\n"
|
|
||||||
<< "tariff carryover settings: " << "\n"
|
|
||||||
<< wd.m_tariffCarryOverSettings << endl;
|
|
||||||
|
|
||||||
return debug;
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
File diff suppressed because it is too large
Load Diff
+2
-6
@@ -35,8 +35,7 @@ SOURCES += \
|
|||||||
src/tariff_log.cpp \
|
src/tariff_log.cpp \
|
||||||
src/calculate_price.cpp \
|
src/calculate_price.cpp \
|
||||||
src/ticket.cpp \
|
src/ticket.cpp \
|
||||||
src/tariff_global_defines.cpp \
|
src/tariff_global_defines.cpp
|
||||||
src/atb_time.cpp
|
|
||||||
|
|
||||||
HEADERS += \
|
HEADERS += \
|
||||||
include/mobilisis/calculator_functions.h \
|
include/mobilisis/calculator_functions.h \
|
||||||
@@ -90,10 +89,7 @@ HEADERS += \
|
|||||||
include/mobilisis/tariff_interpolation.h \
|
include/mobilisis/tariff_interpolation.h \
|
||||||
include/mobilisis/tariff_prepaid.h \
|
include/mobilisis/tariff_prepaid.h \
|
||||||
include/mobilisis/tariff_carryover.h \
|
include/mobilisis/tariff_carryover.h \
|
||||||
include/mobilisis/tariff_global_defines.h \
|
include/mobilisis/tariff_global_defines.h
|
||||||
include/mobilisis/atb_time.h \
|
|
||||||
include/mobilisis/tariff_service.h \
|
|
||||||
include/mobilisis/tariff_out_of_service.h
|
|
||||||
|
|
||||||
OTHER_FILES += src/main.cpp \
|
OTHER_FILES += src/main.cpp \
|
||||||
../tariffs/tariff_korneuburg.json \
|
../tariffs/tariff_korneuburg.json \
|
||||||
|
|||||||
@@ -1,151 +0,0 @@
|
|||||||
#include "atb_time.h"
|
|
||||||
#include <QDebugStateSaver>
|
|
||||||
|
|
||||||
QDateTime const ATBTime::m_end(QDateTime::fromString("1970-01-02T00:00:00", Qt::ISODate));
|
|
||||||
|
|
||||||
ATBTime::ATBTime()
|
|
||||||
: m_time(QDateTime::fromString("1970-01-01T00:00:00", Qt::ISODate)) {
|
|
||||||
}
|
|
||||||
|
|
||||||
ATBTime::ATBTime(int h, int m, int /*s*/, int /*ms*/)
|
|
||||||
: m_time(QDateTime::fromString("1970-01-01T00:00:00", Qt::ISODate)) {
|
|
||||||
|
|
||||||
if (h == 24 && m == 0) {
|
|
||||||
m_time = m_end;
|
|
||||||
} else {
|
|
||||||
QTime const t(h, m, 0, 0);
|
|
||||||
m_time.setTime(t);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
ATBTime::ATBTime(QString const &t)
|
|
||||||
: m_time(QDateTime::fromString("1970-01-01T00:00:00")) {
|
|
||||||
|
|
||||||
if (t == "24:00:00") {
|
|
||||||
m_time = m_end;
|
|
||||||
} else {
|
|
||||||
QTime tmp = QTime::fromString(t, Qt::ISODate);
|
|
||||||
if (tmp.isValid()) {
|
|
||||||
m_time.setTime(tmp);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
ATBTime::ATBTime(QTime const &t)
|
|
||||||
: m_time(QDateTime::fromString("1970-01-01T00:00:00")) {
|
|
||||||
m_time.setTime(t);
|
|
||||||
}
|
|
||||||
|
|
||||||
QTime ATBTime::addMSecs(int ms) const {
|
|
||||||
return m_time.time().addMSecs(ms);
|
|
||||||
}
|
|
||||||
|
|
||||||
QTime ATBTime::addMSecs(int ms) {
|
|
||||||
QTime t = m_time.time();
|
|
||||||
t = t.addMSecs(ms);
|
|
||||||
m_time.setTime(t);
|
|
||||||
return t;
|
|
||||||
}
|
|
||||||
|
|
||||||
QTime ATBTime::addSecs(int s) const {
|
|
||||||
return m_time.time().addSecs(s);
|
|
||||||
}
|
|
||||||
|
|
||||||
QTime ATBTime::addSecs(int s) {
|
|
||||||
QTime t = m_time.time();
|
|
||||||
t = t.addSecs(s);
|
|
||||||
m_time.setTime(t);
|
|
||||||
return t;
|
|
||||||
}
|
|
||||||
|
|
||||||
constexpr QTime ATBTime::fromMSecsSinceStartOfDay(int msecs) {
|
|
||||||
return QTime::fromMSecsSinceStartOfDay(msecs);
|
|
||||||
}
|
|
||||||
|
|
||||||
QTime ATBTime::fromString(QString const &string, Qt::DateFormat format) {
|
|
||||||
return QTime::fromString(string, format);
|
|
||||||
}
|
|
||||||
|
|
||||||
QTime ATBTime::fromString(QString const &string, QString const &format) {
|
|
||||||
return QTime::fromString(string, format);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool ATBTime::isValid(int h, int m, int s, int ms) {
|
|
||||||
return QTime(h, m, s, ms).isValid();
|
|
||||||
}
|
|
||||||
|
|
||||||
int ATBTime::msecsSinceStartOfDay() const {
|
|
||||||
return m_time.time().msecsSinceStartOfDay();
|
|
||||||
}
|
|
||||||
|
|
||||||
bool ATBTime::setHMS(int h, int m, int s, int ms) {
|
|
||||||
if (isValid(h, m, s, ms)) {
|
|
||||||
QTime t(h, m, s, ms);
|
|
||||||
m_time.setTime(t);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
QString ATBTime::toString(Qt::DateFormat format) const {
|
|
||||||
if (m_time == m_end) {
|
|
||||||
return "24:00:00";
|
|
||||||
}
|
|
||||||
return m_time.time().toString(format);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool operator!=(const ATBTime &lhs, const ATBTime &rhs) noexcept {
|
|
||||||
return lhs.m_time.time() != rhs.m_time.time();
|
|
||||||
}
|
|
||||||
|
|
||||||
bool operator<=(const ATBTime &lhs, const ATBTime &rhs) noexcept {
|
|
||||||
if (rhs.m_time == rhs.m_end) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return lhs.m_time.time() <= rhs.m_time.time();
|
|
||||||
}
|
|
||||||
|
|
||||||
bool operator>=(const ATBTime &lhs, const ATBTime &rhs) noexcept {
|
|
||||||
return lhs.m_time.time() >= rhs.m_time.time();
|
|
||||||
}
|
|
||||||
|
|
||||||
bool operator<(const ATBTime &lhs, const ATBTime &rhs) noexcept {
|
|
||||||
if (rhs.m_time == rhs.m_end) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return lhs.m_time.time() < rhs.m_time.time();
|
|
||||||
}
|
|
||||||
|
|
||||||
bool operator>(const ATBTime &lhs, const ATBTime &rhs) noexcept {
|
|
||||||
return lhs.m_time.time() > rhs.m_time.time();
|
|
||||||
}
|
|
||||||
|
|
||||||
bool operator==(const ATBTime &lhs, const ATBTime &rhs) noexcept {
|
|
||||||
return lhs.m_time.time() == rhs.m_time.time();
|
|
||||||
}
|
|
||||||
|
|
||||||
QDebug &operator<<(QDebug &debug, ATBTime const &time) {
|
|
||||||
QDebugStateSaver saver(debug);
|
|
||||||
if (time.m_time == time.m_end) {
|
|
||||||
debug.nospace() << QString("24:00:00");
|
|
||||||
} else {
|
|
||||||
debug.nospace() << time.m_time.time().toString(Qt::ISODate);
|
|
||||||
}
|
|
||||||
return debug;
|
|
||||||
}
|
|
||||||
|
|
||||||
QDataStream &operator<<(QDataStream &out, ATBTime const &time) {
|
|
||||||
if (time.m_time == time.m_end) {
|
|
||||||
out << QString("24:00:00");
|
|
||||||
} else {
|
|
||||||
out << time.m_time.time();
|
|
||||||
}
|
|
||||||
return out;
|
|
||||||
}
|
|
||||||
|
|
||||||
QDataStream &operator>>(QDataStream &in, ATBTime &time) {
|
|
||||||
QTime t;
|
|
||||||
in >> t;
|
|
||||||
time.m_time.setTime(t);
|
|
||||||
return in;
|
|
||||||
}
|
|
||||||
+63
-1147
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -1,762 +0,0 @@
|
|||||||
#include "calculate_price.h"
|
|
||||||
#include "configuration.h"
|
|
||||||
#include "calculator_functions.h"
|
|
||||||
#include "payment_option.h"
|
|
||||||
#include "utilities.h"
|
|
||||||
|
|
||||||
#include <QFile>
|
|
||||||
#include <QFileInfo>
|
|
||||||
#include <QDateTime>
|
|
||||||
#include <QDebug>
|
|
||||||
#include <QList>
|
|
||||||
|
|
||||||
QString const CalcState::SUCCESS = "SUCCESS";
|
|
||||||
QString const CalcState::ERROR_PARSING_ZONE_NR = "ERROR_PARSING_ZONE_NR";
|
|
||||||
QString const CalcState::ERROR_LOADING_TARIFF = "ERROR_LOADING_TARIFF";
|
|
||||||
QString const CalcState::ERROR_PARSING_TARIFF = "ERROR_PARSING_TARIFF";
|
|
||||||
QString const CalcState::NEGATIVE_PARKING_TIME = "NEGATIVE_PARKING_TIME";
|
|
||||||
QString const CalcState::INVALID_START_DATE = "INVALID_START_DATE";
|
|
||||||
QString const CalcState::WRONG_PARAM_VALUES = "WRONG_PARAM_VALUES";
|
|
||||||
QString const CalcState::WRONG_ISO_TIME_FORMAT = "WRONG_ISO_TIME_FORMAT";
|
|
||||||
QString const CalcState::ABOVE_MAX_PARKING_TIME = "ABOVE_MAX_PARKING_TIME";
|
|
||||||
QString const CalcState::BELOW_MIN_PARKING_TIME = "BELOW_MIN_PARKING_TIME";
|
|
||||||
QString const CalcState::BELOW_MIN_PARKING_PRICE = "BELOW_MIN_PARKING_PRICE";
|
|
||||||
QString const CalcState::ABOVE_MAX_PARKING_PRICE = "ABOVE_MAX_PARKING_PRICE";
|
|
||||||
QString const CalcState::OVERPAID = "OVERPAID";
|
|
||||||
QString const CalcState::OUTSIDE_ALLOWED_PARKING_TIME = "OUTSIDE_ALLOWED_PARKING_TIME";
|
|
||||||
|
|
||||||
QList<int> CALCULATE_LIBRARY_API get_time_steps(Configuration *cfg) {
|
|
||||||
return Calculator::GetInstance().GetTimeSteps(cfg);
|
|
||||||
}
|
|
||||||
|
|
||||||
int CALCULATE_LIBRARY_API get_minimal_parkingtime(Configuration const *cfg,
|
|
||||||
PERMIT_TYPE permitType,
|
|
||||||
int paymentOptionIndex) {
|
|
||||||
int minTime = 0;
|
|
||||||
|
|
||||||
switch(permitType) {
|
|
||||||
case PERMIT_TYPE::SHORT_TERM_PARKING: { // e.g. szeged (customer_281)
|
|
||||||
QList<int> const tsteps = Calculator::GetInstance().GetTimeSteps((Configuration *)cfg, paymentOptionIndex);
|
|
||||||
Q_UNUSED(tsteps);
|
|
||||||
minTime = cfg->getPaymentOptions(paymentOptionIndex).pop_min_time;
|
|
||||||
} break;
|
|
||||||
case PERMIT_TYPE::DAY_TICKET_ADULT: {
|
|
||||||
} break;
|
|
||||||
case PERMIT_TYPE::DAY_TICKET_TEEN: {
|
|
||||||
} break;
|
|
||||||
case PERMIT_TYPE::DAY_TICKET_CHILD: {
|
|
||||||
} break;
|
|
||||||
default:
|
|
||||||
// for each new sell-procedure, recomute the timesteps. implicitly, set
|
|
||||||
// the minimal parking time.
|
|
||||||
Calculator::GetInstance().ResetTimeSteps(paymentOptionIndex);
|
|
||||||
Calculator::GetInstance().GetTimeSteps((Configuration *)cfg, paymentOptionIndex);
|
|
||||||
minTime = qRound(cfg->getPaymentOptions(paymentOptionIndex).pop_min_time);
|
|
||||||
}
|
|
||||||
|
|
||||||
return minTime;
|
|
||||||
}
|
|
||||||
|
|
||||||
int CALCULATE_LIBRARY_API get_maximal_parkingtime(Configuration const *cfg,
|
|
||||||
PERMIT_TYPE permitType,
|
|
||||||
int paymentOptionIndex) {
|
|
||||||
int maxTime = 0;
|
|
||||||
|
|
||||||
switch(permitType) {
|
|
||||||
case PERMIT_TYPE::SHORT_TERM_PARKING: { // e.g. szeged (customer_281)
|
|
||||||
maxTime = cfg->getPaymentOptions(paymentOptionIndex).pop_max_time;
|
|
||||||
} break;
|
|
||||||
case PERMIT_TYPE::DAY_TICKET_ADULT: {
|
|
||||||
} break;
|
|
||||||
case PERMIT_TYPE::DAY_TICKET_TEEN: {
|
|
||||||
} break;
|
|
||||||
case PERMIT_TYPE::DAY_TICKET_CHILD: {
|
|
||||||
} break;
|
|
||||||
default: ;
|
|
||||||
}
|
|
||||||
|
|
||||||
return maxTime;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
int CALCULATE_LIBRARY_API get_minimal_parkingprice(Configuration *cfg,
|
|
||||||
PERMIT_TYPE permitType,
|
|
||||||
int paymentOptionIndex,
|
|
||||||
QDateTime const &start) {
|
|
||||||
int minPrice = -1;
|
|
||||||
|
|
||||||
switch(permitType) {
|
|
||||||
case PERMIT_TYPE::SHORT_TERM_PARKING: { // e.g. szeged (customer_281)
|
|
||||||
minPrice = cfg->getPaymentOptions(paymentOptionIndex).pop_min_price;
|
|
||||||
} break;
|
|
||||||
case PERMIT_TYPE::DAY_TICKET_ADULT: {
|
|
||||||
} break;
|
|
||||||
case PERMIT_TYPE::DAY_TICKET_TEEN: {
|
|
||||||
} break;
|
|
||||||
case PERMIT_TYPE::DAY_TICKET_CHILD: {
|
|
||||||
} break;
|
|
||||||
case PERMIT_TYPE::DAY_TICKET: {
|
|
||||||
minPrice = compute_product_price(cfg, permitType, start);
|
|
||||||
} break;
|
|
||||||
default: ;
|
|
||||||
}
|
|
||||||
|
|
||||||
return minPrice;
|
|
||||||
}
|
|
||||||
|
|
||||||
int CALCULATE_LIBRARY_API compute_product_price(Configuration const *cfg,
|
|
||||||
PERMIT_TYPE permitType,
|
|
||||||
QDateTime const &start,
|
|
||||||
QDateTime *productStart,
|
|
||||||
QDateTime *productEnd) {
|
|
||||||
|
|
||||||
switch(permitType) {
|
|
||||||
case PERMIT_TYPE::SHORT_TERM_PARKING: { // e.g. szeged (customer_281)
|
|
||||||
} break;
|
|
||||||
case PERMIT_TYPE::DAY_TICKET_CHILD:
|
|
||||||
// [[fallthrough]];
|
|
||||||
case PERMIT_TYPE::DAY_TICKET_TEEN:
|
|
||||||
// [[fallthrough]];
|
|
||||||
case PERMIT_TYPE::FOOD_STAMP:
|
|
||||||
// [[fallthrough]];
|
|
||||||
case PERMIT_TYPE::DAY_TICKET_ADULT: {
|
|
||||||
std::optional<QVector<ATBTariffProduct>> products = cfg->getTariffProductForProductId(permitType);
|
|
||||||
if (products) {
|
|
||||||
QVector<ATBTariffProduct> product = products.value();
|
|
||||||
if (product.size() > 0) {
|
|
||||||
ATBTariffProduct const &p = product[0];
|
|
||||||
return p.m_tariff_product_price;
|
|
||||||
#if 0
|
|
||||||
// in case we do not have prepaid-option
|
|
||||||
QTime const ¤tTime = QDateTime::currentDateTime().time();
|
|
||||||
|
|
||||||
if (p.m_tariff_product_start <= currentTime && currentTime <= p.m_tariff_product_end) {
|
|
||||||
return p.m_tariff_product_price;
|
|
||||||
} else {
|
|
||||||
qCritical() << "(" << __func__ << ":" << __LINE__ << ")"
|
|
||||||
<< "ERROR currentTime"
|
|
||||||
<< currentTime.toString(Qt::ISODate)
|
|
||||||
<< "INVALID ("
|
|
||||||
<< p.m_tariff_product_start.toString(Qt::ISODate)
|
|
||||||
<< p.m_tariff_product_end.toString(Qt::ISODate) << ")";
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} break;
|
|
||||||
case PERMIT_TYPE::INVALID:
|
|
||||||
// [[fallthrough]];
|
|
||||||
case PERMIT_TYPE::DAY_TICKET: {
|
|
||||||
std::optional<QVector<ATBTariffProduct>> products = cfg->getTariffProductForProductId(permitType);
|
|
||||||
if (products) {
|
|
||||||
QVector<ATBTariffProduct> product = products.value();
|
|
||||||
int product_price = 0;
|
|
||||||
|
|
||||||
if (productStart && productEnd) {
|
|
||||||
*productStart = start;
|
|
||||||
*productEnd = start;
|
|
||||||
if (product.size() > 0) {
|
|
||||||
productStart->setTime(product[0].getTimeStart());
|
|
||||||
productEnd->setTime(product[0].getTimeEnd());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for (QVector<ATBTariffProduct>::size_type i=0; i<product.size(); ++i) {
|
|
||||||
ATBTariffProduct const &p = product[i];
|
|
||||||
QTime const &startTime = p.getTimeStart();
|
|
||||||
QTime const &endTime = p.getTimeEnd();
|
|
||||||
|
|
||||||
// qCritical() << __LINE__ << startTime.toString(Qt::ISODate);
|
|
||||||
// qCritical() << __LINE__ << endTime.toString(Qt::ISODate);
|
|
||||||
// qCritical() << __LINE__ << start.toString(Qt::ISODate);
|
|
||||||
|
|
||||||
if (start.time() >= startTime && start.time() < endTime) {
|
|
||||||
product_price = p.getProductPrice();
|
|
||||||
if (productStart && productEnd) {
|
|
||||||
productStart->setTime(startTime);
|
|
||||||
productEnd->setTime(endTime);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return product_price;
|
|
||||||
} else {
|
|
||||||
// SZEGED
|
|
||||||
int const pop_daily_card_price = cfg->getPaymentOptions().pop_daily_card_price;
|
|
||||||
|
|
||||||
qDebug() << QString("(%1:%2) no products defined in tariff-file").arg(__func__).arg(__LINE__);
|
|
||||||
qDebug() << QString("(%1:%2) pop_daily_card_price=%3").arg(__func__).arg(__LINE__).arg(pop_daily_card_price);
|
|
||||||
|
|
||||||
// static const PaymentMethod paymentMethodId = Utilities::getPaymentMethodId(cfg);
|
|
||||||
// return Utilities::getDailyTicketCardPrice(cfg, paymentMethodId);
|
|
||||||
|
|
||||||
return pop_daily_card_price;
|
|
||||||
}
|
|
||||||
} break;
|
|
||||||
case PERMIT_TYPE::TWENTY_FOUR_HOURS_TICKET: {
|
|
||||||
std::optional<QVector<ATBTariffProduct>> products = cfg->getTariffProductForProductId(permitType);
|
|
||||||
if (products) {
|
|
||||||
int product_price = 0;
|
|
||||||
QVector<ATBTariffProduct> product = products.value();
|
|
||||||
|
|
||||||
if (product.size() > 0) {
|
|
||||||
if (productStart && productEnd) {
|
|
||||||
int pop_min_time = get_minimal_parkingtime(cfg); // in minutes
|
|
||||||
int pop_max_time = get_maximal_parkingtime(cfg); // in minutes
|
|
||||||
if (pop_max_time >= pop_min_time) {
|
|
||||||
*productStart = start;
|
|
||||||
*productEnd = start.addSecs(pop_max_time*60);
|
|
||||||
product_price = product[0].getProductPrice();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return product_price;
|
|
||||||
}
|
|
||||||
|
|
||||||
} break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int CALCULATE_LIBRARY_API get_maximal_parkingprice(Configuration *cfg,
|
|
||||||
PERMIT_TYPE permitType,
|
|
||||||
int paymentOptionIndex) {
|
|
||||||
int maxPrice = -1;
|
|
||||||
static const PaymentMethod paymentMethodId = Utilities::getPaymentMethodId(cfg);
|
|
||||||
|
|
||||||
switch(permitType) {
|
|
||||||
case PERMIT_TYPE::SHORT_TERM_PARKING: { // e.g. szeged (customer_281)
|
|
||||||
if (paymentMethodId == PaymentMethod::Progressive || paymentMethodId == PaymentMethod::Steps) {
|
|
||||||
maxPrice = Utilities::getMaximalParkingPrice(cfg, paymentMethodId);
|
|
||||||
} else { // PaymentMethod::Linear -> e.g. szeged
|
|
||||||
int const key = cfg->getPaymentOptions(paymentOptionIndex).pop_id;
|
|
||||||
int const maxTime = cfg->getPaymentOptions(paymentOptionIndex).pop_max_time; // maxTime is given in minutes
|
|
||||||
std::optional<QVector<ATBPaymentRate>> const &pv = cfg->getPaymentRateForKey(key);
|
|
||||||
if (pv) {
|
|
||||||
QVector<ATBPaymentRate> const &paymentRate = pv.value();
|
|
||||||
if (paymentRate.size() > 0) {
|
|
||||||
int const price = paymentRate.last().pra_price; // price is given per hour
|
|
||||||
maxPrice = qRound((maxTime * price) / 60.0f);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} break;
|
|
||||||
case PERMIT_TYPE::DAY_TICKET_ADULT:
|
|
||||||
break;
|
|
||||||
case PERMIT_TYPE::DAY_TICKET_TEEN:
|
|
||||||
break;
|
|
||||||
case PERMIT_TYPE::DAY_TICKET_CHILD:
|
|
||||||
break;
|
|
||||||
default: ;
|
|
||||||
}
|
|
||||||
|
|
||||||
return maxPrice;
|
|
||||||
}
|
|
||||||
|
|
||||||
int CALCULATE_LIBRARY_API get_zone_nr(int zone)
|
|
||||||
{
|
|
||||||
if(zone > -1) return zone;
|
|
||||||
else
|
|
||||||
{
|
|
||||||
QFile zone("/etc/zone_nr");
|
|
||||||
if (zone.exists()) {
|
|
||||||
QFileInfo finfo(zone);
|
|
||||||
if (finfo.size() <= 4) { // decimal 000\n
|
|
||||||
if (zone.open(QIODevice::ReadOnly | QIODevice::Text)) {
|
|
||||||
QTextStream in(&zone);
|
|
||||||
return in.readLine(100).toInt();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
CalcState CALCULATE_LIBRARY_API init_tariff(parking_tariff_t **tariff, char const *config_file) {
|
|
||||||
*tariff = new Configuration();
|
|
||||||
|
|
||||||
CalcState calcState;
|
|
||||||
#if __linux__
|
|
||||||
|
|
||||||
int const zone = get_zone_nr();
|
|
||||||
|
|
||||||
// DEBUG
|
|
||||||
qCritical() << "init_tariff:";
|
|
||||||
qCritical() << " ... zone = " << zone;
|
|
||||||
|
|
||||||
if (zone <= 0) {
|
|
||||||
delete *tariff;
|
|
||||||
*tariff = nullptr;
|
|
||||||
return calcState.set(CalcState::State::ERROR_PARSING_ZONE_NR);
|
|
||||||
}
|
|
||||||
|
|
||||||
QString confFile(config_file);
|
|
||||||
if (!confFile.endsWith(QChar('/'))) {
|
|
||||||
confFile += "/";
|
|
||||||
}
|
|
||||||
|
|
||||||
char buffer[32];
|
|
||||||
memset(buffer, 0x00, sizeof(buffer));
|
|
||||||
snprintf(buffer, sizeof(buffer)-1, "tariff%02d.json", zone);
|
|
||||||
confFile += buffer;
|
|
||||||
#else // windows
|
|
||||||
QString confFile(config_file);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// DEBUG
|
|
||||||
qCritical() << " ... confFile = " << confFile;
|
|
||||||
|
|
||||||
QFile fname(confFile);
|
|
||||||
if (fname.exists() &&
|
|
||||||
fname.open(QIODevice::ReadOnly | QIODevice::Text)) {
|
|
||||||
// DEBUG
|
|
||||||
qCritical() << " ... confFile is open";
|
|
||||||
|
|
||||||
QString json = fname.readAll();
|
|
||||||
if (! (*tariff)->ParseJson(*tariff, json.toStdString().c_str())) {
|
|
||||||
delete *tariff;
|
|
||||||
*tariff = nullptr;
|
|
||||||
return calcState.set(CalcState::State::ERROR_PARSING_TARIFF);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
delete *tariff;
|
|
||||||
*tariff = nullptr;
|
|
||||||
return calcState.set(CalcState::State::ERROR_LOADING_TARIFF);
|
|
||||||
}
|
|
||||||
|
|
||||||
qCritical() << "init_tariff: Parsing tariff config (" << confFile << ")";
|
|
||||||
|
|
||||||
return calcState;
|
|
||||||
}
|
|
||||||
|
|
||||||
void CALCULATE_LIBRARY_API free_tariff(parking_tariff_t *tariff) {
|
|
||||||
if (tariff != nullptr) {
|
|
||||||
delete tariff;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// UpDown 1 -> up; 0 -> down
|
|
||||||
int CALCULATE_LIBRARY_API compute_next_timestep(parking_tariff_t *tariff, int currentTimeMinutes, int UpDown)
|
|
||||||
{
|
|
||||||
qCritical() << " compute_next_timestep() currentTimeMinutes: " << currentTimeMinutes;
|
|
||||||
qCritical() << " compute_next_timestep() up/down (1=up, 0=down): " << UpDown;
|
|
||||||
|
|
||||||
Configuration const *cfg = tariff;
|
|
||||||
|
|
||||||
// compute payment method id (e.g. Linear=3, Steps=4)
|
|
||||||
PaymentMethod const paymentMethodId = Utilities::getPaymentMethodId(cfg);
|
|
||||||
switch (paymentMethodId) {
|
|
||||||
case PaymentMethod::Progressive:
|
|
||||||
qCritical() << " compute_next_timestep() paymentMethodId: Progressive";
|
|
||||||
break;
|
|
||||||
case PaymentMethod::Degressive:
|
|
||||||
qCritical() << " compute_next_timestep() paymentMethodId: Degressive";
|
|
||||||
break;
|
|
||||||
case PaymentMethod::Linear:
|
|
||||||
qCritical() << " compute_next_timestep() paymentMethodId: Linear";
|
|
||||||
break;
|
|
||||||
case PaymentMethod::Steps:
|
|
||||||
qCritical() << " compute_next_timestep() paymentMethodId: Steps";
|
|
||||||
break;
|
|
||||||
case PaymentMethod::Undefined:
|
|
||||||
qCritical() << " compute_next_timestep() paymentMethodId: Undefined";
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
// use tariff with structure as for instance Schnau, Koenigsee:
|
|
||||||
// without given YearPeriod, SpecialDays and SpecialDaysWorktime
|
|
||||||
if ((paymentMethodId == PaymentMethod::Steps) ||
|
|
||||||
// progressive tariff: e.g. Neuhauser, Kirchdorf (743)
|
|
||||||
(paymentMethodId == PaymentMethod::Progressive))
|
|
||||||
{
|
|
||||||
const QList<int> stepList = Calculator::GetInstance().GetTimeSteps(tariff);
|
|
||||||
qCritical() << " compute_next_timestep() timeSteps:" << stepList;
|
|
||||||
|
|
||||||
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];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else
|
|
||||||
if (paymentMethodId == PaymentMethod::Linear) {
|
|
||||||
|
|
||||||
// currentTimeMinutes is the number of minutes actually used. This
|
|
||||||
// value is an offset from the start time and cannot be used as a
|
|
||||||
// QDateTime.
|
|
||||||
|
|
||||||
qCritical() << "compute_next_timestep() up/down (1=up, 0=down):" << UpDown;
|
|
||||||
|
|
||||||
// get minimal and maximal parking times
|
|
||||||
int const minParkingTime = Utilities::getMinimalParkingTime(cfg, paymentMethodId);
|
|
||||||
int const maxParkingTime = Utilities::getMaximalParkingTime(cfg, paymentMethodId);
|
|
||||||
|
|
||||||
qCritical() << " compute_next_timestep() maxParkingTime:" << maxParkingTime;
|
|
||||||
qCritical() << " compute_next_timestep() minParkingTime:" << minParkingTime;
|
|
||||||
|
|
||||||
// use the first (i.e. main duration step contained in the tariff json-file)
|
|
||||||
int firstDurationStep = Utilities::getFirstDurationStep(cfg, paymentMethodId);
|
|
||||||
firstDurationStep = ((UpDown == 1) ? firstDurationStep : -firstDurationStep);
|
|
||||||
|
|
||||||
qCritical() << " compute_next_timestep() firstDurationStep:" << firstDurationStep;
|
|
||||||
|
|
||||||
int const nextTimeStep = currentTimeMinutes + firstDurationStep;
|
|
||||||
|
|
||||||
if (nextTimeStep >= minParkingTime && nextTimeStep <= maxParkingTime) {
|
|
||||||
qCritical() << " compute_next_timestep() nextTimeStep:" << nextTimeStep;
|
|
||||||
return nextTimeStep;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
qCritical() << "compute_next_timestep() *CAN NOT COMPUTE* for currentTimeMinutes (" << currentTimeMinutes << ")";
|
|
||||||
return currentTimeMinutes;
|
|
||||||
}
|
|
||||||
|
|
||||||
// this is currently not used
|
|
||||||
CalcState CALCULATE_LIBRARY_API compute_price_for_parking_ticket(
|
|
||||||
parking_tariff_t *tariff,
|
|
||||||
time_t start_parking_time, // in minutes
|
|
||||||
time_t end_parking_time, // netto time in minutes
|
|
||||||
struct price_t *price) {
|
|
||||||
CalcState calcState;
|
|
||||||
double minMin = tariff->PaymentOption.find(tariff->getPaymentOptions().pop_payment_method_id)->second.pop_min_time;
|
|
||||||
double maxMin = tariff->PaymentOption.find(tariff->getPaymentOptions().pop_payment_method_id)->second.pop_max_time;
|
|
||||||
|
|
||||||
if (minMin < 0 || maxMin < 0 || maxMin < minMin) {
|
|
||||||
calcState.setDesc(QString("minMin=%1, maxMin=%2").arg(minMin).arg(maxMin));
|
|
||||||
return calcState.set(CalcState::State::WRONG_PARAM_VALUES);
|
|
||||||
}
|
|
||||||
|
|
||||||
int const duration = end_parking_time - start_parking_time;
|
|
||||||
if (duration < 0) {
|
|
||||||
calcState.setDesc(QString("end=%1, start=%2")
|
|
||||||
.arg(end_parking_time, start_parking_time));
|
|
||||||
return calcState.set(CalcState::State::NEGATIVE_PARKING_TIME);
|
|
||||||
}
|
|
||||||
if (duration > maxMin) {
|
|
||||||
calcState.setDesc(QString("duration=%1, maxMin=%2").arg(duration).arg(maxMin));
|
|
||||||
return calcState.set(CalcState::State::ABOVE_MAX_PARKING_TIME);
|
|
||||||
}
|
|
||||||
if (duration < minMin) {
|
|
||||||
calcState.setDesc(QString("duration=%1, minMin=%2").arg(duration).arg(minMin));
|
|
||||||
return calcState.set(CalcState::State::BELOW_MIN_PARKING_TIME);
|
|
||||||
}
|
|
||||||
if (duration == 0) {
|
|
||||||
return calcState.set(CalcState::State::SUCCESS);
|
|
||||||
}
|
|
||||||
|
|
||||||
QDate const d(1970, 1, 1);
|
|
||||||
QTime const t(0, 0, 0);
|
|
||||||
QDateTime start(d, t, Qt::UTC);
|
|
||||||
start = start.toLocalTime().addSecs(start_parking_time * 60);
|
|
||||||
QDateTime end(start);
|
|
||||||
if (start.isValid()) {
|
|
||||||
double cost = Calculator::GetInstance().GetCostFromDuration(
|
|
||||||
tariff,
|
|
||||||
tariff->getPaymentOptions().pop_payment_method_id,
|
|
||||||
start,
|
|
||||||
end,
|
|
||||||
duration, false, true);
|
|
||||||
double minCost = tariff->PaymentOption.find(tariff->getPaymentOptions().pop_payment_method_id)->second.pop_min_price;
|
|
||||||
if (cost < minCost) {
|
|
||||||
calcState.setDesc(QString("minCost=%1, cost=%2").arg(minCost).arg(cost));
|
|
||||||
return calcState.set(CalcState::State::BELOW_MIN_PARKING_PRICE);
|
|
||||||
}
|
|
||||||
price->units = cost;
|
|
||||||
price->netto = cost;
|
|
||||||
} else {
|
|
||||||
return calcState.set(CalcState::State::INVALID_START_DATE);
|
|
||||||
}
|
|
||||||
|
|
||||||
return calcState.set(CalcState::State::SUCCESS);
|
|
||||||
}
|
|
||||||
|
|
||||||
CalcState CALCULATE_LIBRARY_API compute_price_for_parking_ticket(
|
|
||||||
parking_tariff_t *tariff,
|
|
||||||
QDateTime &start_parking_time,
|
|
||||||
int netto_parking_time,
|
|
||||||
QDateTime &end_parking_time,
|
|
||||||
struct price_t *price,
|
|
||||||
bool prepaid)
|
|
||||||
{
|
|
||||||
CalcState calcState;
|
|
||||||
|
|
||||||
int paymentOptionIndex = tariff->getPaymentOptionIndex(start_parking_time);
|
|
||||||
|
|
||||||
double minMin = tariff->getPaymentOptions(paymentOptionIndex).pop_min_time;
|
|
||||||
double maxMin = tariff->getPaymentOptions(paymentOptionIndex).pop_max_time;
|
|
||||||
|
|
||||||
// DEBUG
|
|
||||||
qCritical() << "compute_price_for_parking_ticket() " << endl
|
|
||||||
<< " paymentOptionIndex: " << paymentOptionIndex << endl
|
|
||||||
<< " start_parking_time: " << start_parking_time << endl
|
|
||||||
<< " netto_parking_time: " << netto_parking_time << endl
|
|
||||||
<< " minMin: " << minMin << endl
|
|
||||||
<< " maxMin: " << maxMin;
|
|
||||||
|
|
||||||
|
|
||||||
if (netto_parking_time < 0) {
|
|
||||||
calcState.setDesc(QString("end=%1, start=%2")
|
|
||||||
.arg(end_parking_time.toString(Qt::ISODate),
|
|
||||||
start_parking_time.toString(Qt::ISODate)));
|
|
||||||
return calcState.set(CalcState::State::NEGATIVE_PARKING_TIME);
|
|
||||||
}
|
|
||||||
if (netto_parking_time > maxMin) {
|
|
||||||
calcState.setDesc(QString("duration=%1, maxMin=%2").arg(netto_parking_time).arg(maxMin));
|
|
||||||
return calcState.set(CalcState::State::ABOVE_MAX_PARKING_TIME);
|
|
||||||
}
|
|
||||||
if (netto_parking_time < minMin) {
|
|
||||||
calcState.setDesc(QString("duration=%1, minMin=%2").arg(netto_parking_time).arg(minMin));
|
|
||||||
return calcState.set(CalcState::State::BELOW_MIN_PARKING_TIME);
|
|
||||||
}
|
|
||||||
if (netto_parking_time == 0) {
|
|
||||||
return calcState.set(CalcState::State::SUCCESS);
|
|
||||||
}
|
|
||||||
|
|
||||||
double cost = -1;
|
|
||||||
if (start_parking_time.isValid()) {
|
|
||||||
if (tariff->getPaymentOptions(paymentOptionIndex).pop_payment_method_id == PaymentMethod::Steps) {
|
|
||||||
// hier muesste man unterscheiden: uebertrag oder nicht?
|
|
||||||
calcState = Calculator::GetInstance().isParkingAllowed(tariff, start_parking_time,
|
|
||||||
netto_parking_time, paymentOptionIndex);
|
|
||||||
if (calcState.getStatus() == CalcState::State::OUTSIDE_ALLOWED_PARKING_TIME) {
|
|
||||||
// qCritical() << "(" << __func__ << ":" << __LINE__ << ")"
|
|
||||||
// << calcState.toString();
|
|
||||||
return calcState;
|
|
||||||
}
|
|
||||||
cost = Calculator::GetInstance().GetCostFromDuration(tariff, start_parking_time, netto_parking_time, paymentOptionIndex);
|
|
||||||
end_parking_time = start_parking_time.addSecs(netto_parking_time*60);
|
|
||||||
|
|
||||||
// qCritical() << "(" << __func__ << ":" << __LINE__ << ")"
|
|
||||||
// << "end_parking_time" << end_parking_time.toString(Qt::ISODate);
|
|
||||||
|
|
||||||
} else {
|
|
||||||
cost = Calculator::GetInstance().GetCostFromDuration(
|
|
||||||
tariff,
|
|
||||||
tariff->getPaymentOptions().pop_payment_method_id,
|
|
||||||
start_parking_time, // starting time
|
|
||||||
end_parking_time, // return value: end time
|
|
||||||
netto_parking_time, // minutes, netto
|
|
||||||
false, prepaid);
|
|
||||||
}
|
|
||||||
double minCost = tariff->getPaymentOptions(paymentOptionIndex).pop_min_price;
|
|
||||||
if (cost < minCost) {
|
|
||||||
calcState.setDesc(QString("minCost=%1, cost=%2").arg(minCost, cost));
|
|
||||||
return calcState.set(CalcState::State::BELOW_MIN_PARKING_PRICE);
|
|
||||||
}
|
|
||||||
|
|
||||||
// DEBUG
|
|
||||||
qCritical() << " end_parking_time: " << end_parking_time;
|
|
||||||
qCritical() << " -> calculated cost (netto): " << cost;
|
|
||||||
|
|
||||||
price->brutto = price->vat = price->vat_percentage = 0;
|
|
||||||
price->units = cost;
|
|
||||||
price->netto = cost;
|
|
||||||
|
|
||||||
} else {
|
|
||||||
return calcState.set(CalcState::State::INVALID_START_DATE);
|
|
||||||
}
|
|
||||||
|
|
||||||
return calcState.set(CalcState::State::SUCCESS);
|
|
||||||
}
|
|
||||||
|
|
||||||
CalcState CALCULATE_LIBRARY_API compute_duration_for_parking_ticket(
|
|
||||||
parking_tariff_t *tariff,
|
|
||||||
time_t start_parking_time,
|
|
||||||
double price,
|
|
||||||
QString &duration) {
|
|
||||||
CalcState calcState;
|
|
||||||
QDate const d(1970, 1, 1);
|
|
||||||
QTime const t(0, 0, 0);
|
|
||||||
QDateTime start(d, t, Qt::UTC);
|
|
||||||
start = start.toLocalTime().addSecs(start_parking_time * 60);
|
|
||||||
if (start.isValid()) {
|
|
||||||
QString cs = start.toString(Qt::ISODate);
|
|
||||||
|
|
||||||
// DEBUG
|
|
||||||
qCritical() << "compute_duration_for_parking_ticket(): ";
|
|
||||||
qCritical() << " start (cs): " << cs;
|
|
||||||
qCritical() << " price: " << price;
|
|
||||||
|
|
||||||
duration = Calculator::GetInstance().GetDurationFromCost(tariff,
|
|
||||||
tariff->getPaymentOptions().pop_payment_method_id,
|
|
||||||
cs.toLocal8Bit().constData(),
|
|
||||||
price, false, true).c_str();
|
|
||||||
QDateTime d = QDateTime::fromString(duration, Qt::ISODate);
|
|
||||||
if (!d.isValid()) {
|
|
||||||
calcState.setDesc(QString("ticketEndTime=%1").arg(duration));
|
|
||||||
return calcState.set(CalcState::State::WRONG_ISO_TIME_FORMAT);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
return calcState.set(CalcState::State::INVALID_START_DATE);
|
|
||||||
}
|
|
||||||
|
|
||||||
return calcState.set(CalcState::State::SUCCESS);
|
|
||||||
}
|
|
||||||
|
|
||||||
CalcState CALCULATE_LIBRARY_API compute_duration_for_parking_ticket(
|
|
||||||
parking_tariff_t *tariff,
|
|
||||||
QDateTime const &start_parking_time,
|
|
||||||
double price,
|
|
||||||
QDateTime &ticketEndTime)
|
|
||||||
{
|
|
||||||
CalcState calcState;
|
|
||||||
if (start_parking_time.isValid()) {
|
|
||||||
QString cs = start_parking_time.toString(Qt::ISODate);
|
|
||||||
QString endTime = Calculator::GetInstance().GetDurationFromCost(
|
|
||||||
tariff,
|
|
||||||
tariff->getPaymentOptions().pop_payment_method_id,
|
|
||||||
cs.toLocal8Bit().constData(),
|
|
||||||
price, false, true).c_str();
|
|
||||||
|
|
||||||
if (endTime == CalcState::SUCCESS) {
|
|
||||||
calcState.setDesc(QString("SUCCESS"));
|
|
||||||
calcState.setStatus(endTime);
|
|
||||||
} else
|
|
||||||
if (endTime == CalcState::ERROR_PARSING_ZONE_NR) {
|
|
||||||
calcState.setStatus(endTime);
|
|
||||||
return calcState;
|
|
||||||
} else
|
|
||||||
if (endTime == CalcState::ERROR_LOADING_TARIFF) {
|
|
||||||
calcState.setStatus(endTime);
|
|
||||||
return calcState;
|
|
||||||
} else
|
|
||||||
if (endTime == CalcState::ERROR_PARSING_TARIFF) {
|
|
||||||
calcState.setStatus(endTime);
|
|
||||||
return calcState;
|
|
||||||
} else
|
|
||||||
if (endTime == CalcState::NEGATIVE_PARKING_TIME) {
|
|
||||||
calcState.setStatus(endTime);
|
|
||||||
return calcState;
|
|
||||||
} else
|
|
||||||
if (endTime == CalcState::INVALID_START_DATE) {
|
|
||||||
calcState.setStatus(endTime);
|
|
||||||
return calcState;
|
|
||||||
} else
|
|
||||||
if (endTime == CalcState::WRONG_PARAM_VALUES) {
|
|
||||||
calcState.setStatus(endTime);
|
|
||||||
return calcState;
|
|
||||||
} else
|
|
||||||
if (endTime == CalcState::WRONG_ISO_TIME_FORMAT) {
|
|
||||||
calcState.setStatus(endTime);
|
|
||||||
return calcState;
|
|
||||||
} else
|
|
||||||
if (endTime == CalcState::ABOVE_MAX_PARKING_TIME) {
|
|
||||||
calcState.setStatus(endTime);
|
|
||||||
return calcState;
|
|
||||||
} else
|
|
||||||
if (endTime == CalcState::BELOW_MIN_PARKING_TIME) {
|
|
||||||
calcState.setStatus(endTime);
|
|
||||||
return calcState;
|
|
||||||
} else
|
|
||||||
if (endTime == CalcState::BELOW_MIN_PARKING_PRICE) {
|
|
||||||
calcState.setStatus(endTime);
|
|
||||||
return calcState;
|
|
||||||
} else
|
|
||||||
if (endTime == CalcState::ABOVE_MAX_PARKING_PRICE) {
|
|
||||||
calcState.setDesc(CalcState::ABOVE_MAX_PARKING_PRICE);
|
|
||||||
calcState.setStatus(CalcState::ABOVE_MAX_PARKING_PRICE);
|
|
||||||
return calcState;
|
|
||||||
} else
|
|
||||||
if (endTime == CalcState::OVERPAID) {
|
|
||||||
calcState.setDesc(CalcState::OVERPAID);
|
|
||||||
calcState.setStatus(CalcState::OVERPAID);
|
|
||||||
return calcState;
|
|
||||||
} else
|
|
||||||
if (endTime == CalcState::OUTSIDE_ALLOWED_PARKING_TIME) {
|
|
||||||
calcState.setStatus(endTime);
|
|
||||||
return calcState;
|
|
||||||
} else {
|
|
||||||
ticketEndTime = QDateTime::fromString(endTime,Qt::ISODate);
|
|
||||||
|
|
||||||
// DEBUG
|
|
||||||
//qCritical() << "compute_duration_for_parking_ticket(): ";
|
|
||||||
//qCritical() << " endTime: " << endTime;
|
|
||||||
//qCritical() << " ticketEndTime: " << ticketEndTime;
|
|
||||||
|
|
||||||
if (!ticketEndTime.isValid()) {
|
|
||||||
calcState.setDesc(QString("ticketEndTime=%1").arg(endTime));
|
|
||||||
return calcState.set(CalcState::State::WRONG_ISO_TIME_FORMAT);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
return calcState.set(CalcState::State::INVALID_START_DATE);
|
|
||||||
}
|
|
||||||
|
|
||||||
return calcState.set(CalcState::State::SUCCESS);
|
|
||||||
}
|
|
||||||
|
|
||||||
CalcState CALCULATE_LIBRARY_API compute_duration_for_daily_ticket(parking_tariff_t *tariff, QDateTime const &start_parking_time, QDateTime &ticketEndTime)
|
|
||||||
{
|
|
||||||
CalcState calcState;
|
|
||||||
if (start_parking_time.isValid()) {
|
|
||||||
|
|
||||||
ticketEndTime = Calculator::GetInstance().GetDailyTicketDuration(tariff,
|
|
||||||
start_parking_time,
|
|
||||||
tariff->getPaymentOptions().pop_payment_method_id,
|
|
||||||
false); // carry over
|
|
||||||
|
|
||||||
// DEBUG
|
|
||||||
qCritical() << "compute_duration_for_daily_ticket(): ";
|
|
||||||
qCritical() << " ticketEndTime: " << ticketEndTime;
|
|
||||||
|
|
||||||
if (!ticketEndTime.isValid()) {
|
|
||||||
calcState.setDesc(QString("ticketEndTime=%1").arg(ticketEndTime.toString(Qt::ISODate)));
|
|
||||||
return calcState.set(CalcState::State::WRONG_ISO_TIME_FORMAT);
|
|
||||||
}
|
|
||||||
|
|
||||||
} else {
|
|
||||||
return calcState.set(CalcState::State::INVALID_START_DATE);
|
|
||||||
}
|
|
||||||
|
|
||||||
return calcState.set(CalcState::State::SUCCESS);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
CalcState CALCULATE_LIBRARY_API compute_price_for_daily_ticket(
|
|
||||||
parking_tariff_t *tariff,
|
|
||||||
QDateTime const &startDatetime,
|
|
||||||
QDateTime &endDatetime,
|
|
||||||
PERMIT_TYPE permitType,
|
|
||||||
struct price_t *price) {// return value
|
|
||||||
CalcState calcState;
|
|
||||||
|
|
||||||
|
|
||||||
if (startDatetime.isValid()) {
|
|
||||||
if (std::optional<struct price_t> p =
|
|
||||||
Calculator::GetInstance().GetDailyTicketPrice(tariff,
|
|
||||||
startDatetime,
|
|
||||||
endDatetime,
|
|
||||||
permitType)) {
|
|
||||||
*price = p.value();
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
return calcState.set(CalcState::State::INVALID_START_DATE);
|
|
||||||
}
|
|
||||||
return calcState.set(CalcState::State::SUCCESS);
|
|
||||||
}
|
|
||||||
|
|
||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -207,13 +207,7 @@ bool Utilities::IsYearPeriodActive(Configuration const *cfg, QDateTime const &dt
|
|||||||
dt.date().day());
|
dt.date().day());
|
||||||
QDate const s(2004, year.second.pye_start_month, year.second.pye_start_day);
|
QDate const s(2004, year.second.pye_start_month, year.second.pye_start_day);
|
||||||
QDate const e(2004, year.second.pye_end_month, year.second.pye_end_day);
|
QDate const e(2004, year.second.pye_end_month, year.second.pye_end_day);
|
||||||
//qCritical() << __func__ << __LINE__ << " d" << d.toString(Qt::ISODate);
|
|
||||||
//qCritical() << __func__ << __LINE__ << "start" << s.toString(Qt::ISODate);
|
|
||||||
//qCritical() << __func__ << __LINE__ << " end" << e.toString(Qt::ISODate);
|
|
||||||
if (s <= e) {
|
|
||||||
return (d >= s && d <= e);
|
return (d >= s && d <= e);
|
||||||
}
|
|
||||||
return (d >= s || d <= e);
|
|
||||||
})) {
|
})) {
|
||||||
qCritical() << "NO VALID YEAR PERIOD";
|
qCritical() << "NO VALID YEAR PERIOD";
|
||||||
return false;
|
return false;
|
||||||
@@ -427,8 +421,6 @@ PaymentMethod Utilities::getPaymentMethodId(Configuration const *cfg) {
|
|||||||
return PaymentMethod::Degressive;
|
return PaymentMethod::Degressive;
|
||||||
case PaymentMethod::Progressive:
|
case PaymentMethod::Progressive:
|
||||||
return PaymentMethod::Progressive;
|
return PaymentMethod::Progressive;
|
||||||
case PaymentMethod::Unified:
|
|
||||||
return PaymentMethod::Unified;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+194
-292
@@ -39,7 +39,7 @@ extern "C" char* strptime(const char* s,
|
|||||||
|
|
||||||
#define SZEGED (0)
|
#define SZEGED (0)
|
||||||
#define SCHOENAU_KOENIGSEE (0)
|
#define SCHOENAU_KOENIGSEE (0)
|
||||||
#define NEUHAUSER_KORNEUBURG (1)
|
#define NEUHAUSER_KORNEUBURG (0)
|
||||||
#define NEUHAUSER_LINSINGER_MASCHINENBAU (0)
|
#define NEUHAUSER_LINSINGER_MASCHINENBAU (0)
|
||||||
#define NEUHAUSER_NORDISCHES_AUSBILDUNGSZENTRUM (0)
|
#define NEUHAUSER_NORDISCHES_AUSBILDUNGSZENTRUM (0)
|
||||||
#define NEUHAUSER_BILEXA_GALTUER (0)
|
#define NEUHAUSER_BILEXA_GALTUER (0)
|
||||||
@@ -52,7 +52,7 @@ extern "C" char* strptime(const char* s,
|
|||||||
#define SCHNALS_LEITER_KIRCHL (0)
|
#define SCHNALS_LEITER_KIRCHL (0)
|
||||||
#define SCHNALS_STAUMAUER (SCHNALS_LEITER_KIRCHL)
|
#define SCHNALS_STAUMAUER (SCHNALS_LEITER_KIRCHL)
|
||||||
#define VALSER_ALM (0)
|
#define VALSER_ALM (0)
|
||||||
#define NEUHAUSER_FORCHACH (0)
|
#define FUCHS_MUEHLBACH (1)
|
||||||
|
|
||||||
#if NEUHAUSER_KIRCHDORF==1
|
#if NEUHAUSER_KIRCHDORF==1
|
||||||
static bool test_neuhauser_kirchdorf(int step, double cost) {
|
static bool test_neuhauser_kirchdorf(int step, double cost) {
|
||||||
@@ -211,73 +211,21 @@ static bool test_neuhauser_kirchdorf(int step, double cost) {
|
|||||||
return 0;
|
return 0;
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <QProcess>
|
|
||||||
#include <QCoreApplication>
|
|
||||||
QString getCalculatorLibVersion() {
|
|
||||||
static QString v;
|
|
||||||
if (v.isEmpty()) {
|
|
||||||
QProcess shell;
|
|
||||||
QString command = QString("cat /proc/%1/maps | awk '{print $6;}' | grep 'libmobilisis_calc' | uniq").arg(QCoreApplication::applicationPid());
|
|
||||||
|
|
||||||
shell.start("/bin/bash", {"-c", command});
|
|
||||||
if ( shell.waitForFinished( 5000 )) {
|
|
||||||
v = shell.readAllStandardOutput();
|
|
||||||
// /usr/lib/libmobilisis_calc.so.2.3.99-18
|
|
||||||
if (!v.isEmpty()) {
|
|
||||||
QStringList vlst = v.trimmed().split("/", QString::SkipEmptyParts);
|
|
||||||
if (vlst.size() > 0) {
|
|
||||||
vlst = vlst.last().split(".", QString::SkipEmptyParts);
|
|
||||||
if (vlst.size() > 4) {
|
|
||||||
v = QString("%1.%2.%3").arg(vlst[2]).arg(vlst[3]).arg(vlst[4]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return v;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool isProductSupportedInCalculatorLib(QString const &product) {
|
|
||||||
bool supported{false};
|
|
||||||
|
|
||||||
QProcess shell;
|
|
||||||
QString command = QString("cat /proc/%1/maps | awk '{print $6;}' | grep 'libmobilisis_calc' | uniq | xargs strings | grep %2").arg(QCoreApplication::applicationPid()).arg(product);
|
|
||||||
|
|
||||||
shell.start("/bin/bash", {"-c", command});
|
|
||||||
if ( shell.waitForFinished( 5000 )) {
|
|
||||||
QString s = shell.readAllStandardOutput().trimmed();
|
|
||||||
// /usr/lib/libmobilisis_calc.so.2.3.99-18
|
|
||||||
if (!s.isEmpty() && (s == product)) {
|
|
||||||
qCritical() << "product" << s << "supported";
|
|
||||||
supported = true;
|
|
||||||
} else {
|
|
||||||
qCritical() << "product" << product << "not supported";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return supported;
|
|
||||||
}
|
|
||||||
|
|
||||||
int main() {
|
int main() {
|
||||||
|
|
||||||
qCritical() << getCalculatorLibVersion();
|
|
||||||
isProductSupportedInCalculatorLib("FREE_TICKET");
|
|
||||||
return 0;
|
|
||||||
//487 {
|
//487 {
|
||||||
// 488 "pra_payment_option_id": 1049,
|
// 488 "pra_payment_option_id": 1049,
|
||||||
// 489 "pra_payment_unit_id": 84,
|
// 489 "pra_payment_unit_id": 84,
|
||||||
// 490 "pra_price":"840"
|
// 490 "pra_price":"840"
|
||||||
//>>491 }
|
//>>491 }
|
||||||
|
|
||||||
//for (int i = 1; i < 346; ++i) {
|
//for (int i = 1; i < 85; ++i) {
|
||||||
//printf("{\n \"pun_id\": %i,\n \"pun_duration\": %d\n},\n",
|
//printf("{\n \"\pra_payment_option_id\": 1049,\n \"\pra_payment_unit_id\": %d,\n \"pra_price\": %d\n},\n",
|
||||||
// i, 60 + i*4);
|
// i, i*10);
|
||||||
//}
|
//}
|
||||||
for (int i = 1; i < 361; ++i) {
|
//return 0;
|
||||||
printf("{\n \"pra_payment_option_id\": 1049,\n \"pra_payment_unit_id\": %i,\n \"pra_price\":%i\n},\n",
|
|
||||||
i, i*10);
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
#if 0
|
#if 0
|
||||||
MessageHelper msgHelp;
|
MessageHelper msgHelp;
|
||||||
// msgHelp.createLoginMessageChunksToSend(0x02);
|
// msgHelp.createLoginMessageChunksToSend(0x02);
|
||||||
@@ -392,20 +340,20 @@ int main() {
|
|||||||
cout << endl;
|
cout << endl;
|
||||||
|
|
||||||
if (isParsed) {
|
if (isParsed) {
|
||||||
//pop_min_time = get_minimal_parkingtime(&cfg);
|
pop_min_time = get_minimal_parkingtime(&cfg);
|
||||||
//pop_max_time = get_maximal_parkingtime(&cfg);
|
pop_max_time = get_maximal_parkingtime(&cfg);
|
||||||
//pop_min_price = get_minimal_parkingprice(&cfg);
|
pop_min_price = get_minimal_parkingprice(&cfg);
|
||||||
//pop_max_price = get_maximal_parkingprice(&cfg);
|
pop_max_price = get_maximal_parkingprice(&cfg);
|
||||||
//pop_daily_card_price = cfg.getPaymentOptions().pop_daily_card_price;
|
pop_daily_card_price = cfg.getPaymentOptions().pop_daily_card_price;
|
||||||
|
|
||||||
//qCritical() << " pop_min_time: " << pop_min_time;
|
qCritical() << " pop_min_time: " << pop_min_time;
|
||||||
//qCritical() << " pop_max_time: " << pop_max_time;
|
qCritical() << " pop_max_time: " << pop_max_time;
|
||||||
//qCritical() << " pop_min_price: " << pop_min_price;
|
qCritical() << " pop_min_price: " << pop_min_price;
|
||||||
//qCritical() << " pop_max_price: " << pop_max_price;
|
qCritical() << " pop_max_price: " << pop_max_price;
|
||||||
|
|
||||||
|
|
||||||
//QList<int> timeSteps = Calculator::GetInstance().GetTimeSteps(&cfg);
|
QList<int> timeSteps = Calculator::GetInstance().GetTimeSteps(&cfg);
|
||||||
//qCritical() << "TimeSteps" << timeSteps;
|
qCritical() << "TimeSteps" << timeSteps;
|
||||||
|
|
||||||
// return 0;
|
// return 0;
|
||||||
|
|
||||||
@@ -416,7 +364,8 @@ int main() {
|
|||||||
|
|
||||||
// for (int day = Qt::Monday; day <= Qt::Sunday; ++day) {
|
// for (int day = Qt::Monday; day <= Qt::Sunday; ++day) {
|
||||||
for (int day = Qt::Monday; day <= Qt::Monday; ++day) {
|
for (int day = Qt::Monday; day <= Qt::Monday; ++day) {
|
||||||
QDateTime s(QDate(2024, 8, 19 + day), QTime()); // 20: (whit) monday,..., 26: sunday
|
QDateTime s(QDate(2024, 7, 29 + day), QTime()); // 20: (whit) monday,..., 26: sunday
|
||||||
|
QDateTime end;
|
||||||
|
|
||||||
switch (day) {
|
switch (day) {
|
||||||
case (int)Qt::Monday:
|
case (int)Qt::Monday:
|
||||||
@@ -442,30 +391,6 @@ int main() {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
QDateTime start(s);
|
|
||||||
start.setTime(QTime(21, 30, 0));
|
|
||||||
|
|
||||||
QDateTime end;
|
|
||||||
int netto_parking_time = 14 * 60;
|
|
||||||
struct price_t costs;
|
|
||||||
PermitType pt(PERMIT_TYPE::SHORT_TERM_PARKING);
|
|
||||||
|
|
||||||
double cost = 150;
|
|
||||||
|
|
||||||
//cs = compute_price_for_parking_ticket(&cfg, start, netto_parking_time,
|
|
||||||
// end, &costs, pt);
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//qCritical() << "start" << start.toString(Qt::ISODate) << "< cost" << costs.netto
|
|
||||||
// << "> end" << end.toString(Qt::ISODate);
|
|
||||||
|
|
||||||
cs = compute_duration_for_parking_ticket(&cfg, start, cost, end, PermitType(PERMIT_TYPE::SHORT_TERM_PARKING));
|
|
||||||
qCritical() << "start" << start.toString(Qt::ISODate) << "< cost" << cost
|
|
||||||
<< "> end" << end.toString(Qt::ISODate);
|
|
||||||
//}
|
|
||||||
|
|
||||||
exit(0);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
CalcState CALCULATE_LIBRARY_API compute_price_for_parking_ticket(
|
CalcState CALCULATE_LIBRARY_API compute_price_for_parking_ticket(
|
||||||
@@ -651,8 +576,8 @@ int main() {
|
|||||||
int pop_max_price;
|
int pop_max_price;
|
||||||
int pop_daily_card_price;
|
int pop_daily_card_price;
|
||||||
|
|
||||||
//input.open("/home/linux/customer_505/etc/psa_tariff/tariff01.json");
|
input.open("/home/linux/customer_505/etc/psa_tariff/tariff01.json");
|
||||||
input.open("/opt/ptu5/opt/customer_505/etc/psa_tariff/tariff01.json");
|
//input.open("/opt/ptu5/opt/customer_505/etc/psa_tariff/tariff01.json");
|
||||||
|
|
||||||
std::stringstream sstr;
|
std::stringstream sstr;
|
||||||
while(input >> sstr.rdbuf());
|
while(input >> sstr.rdbuf());
|
||||||
@@ -664,10 +589,13 @@ int main() {
|
|||||||
cout << endl;
|
cout << endl;
|
||||||
|
|
||||||
if (isParsed) {
|
if (isParsed) {
|
||||||
pop_min_time = get_minimal_parkingtime(&cfg);
|
//PermitType permitType(PERMIT_TYPE::SHORT_TERM_PARKING);
|
||||||
pop_max_time = get_maximal_parkingtime(&cfg);
|
PermitType permitType(PERMIT_TYPE::DAY_TICKET_PKW);
|
||||||
pop_min_price = get_minimal_parkingprice(&cfg);
|
|
||||||
pop_max_price = get_maximal_parkingprice(&cfg);
|
pop_min_time = get_minimal_parkingtime(&cfg, permitType);
|
||||||
|
pop_max_time = get_maximal_parkingtime(&cfg, permitType);
|
||||||
|
pop_min_price = get_minimal_parkingprice(&cfg, permitType);
|
||||||
|
pop_max_price = get_maximal_parkingprice(&cfg, permitType);
|
||||||
pop_daily_card_price = cfg.getPaymentOptions().pop_daily_card_price;
|
pop_daily_card_price = cfg.getPaymentOptions().pop_daily_card_price;
|
||||||
|
|
||||||
qCritical() << " pop_min_time: " << pop_min_time;
|
qCritical() << " pop_min_time: " << pop_min_time;
|
||||||
@@ -725,10 +653,10 @@ int main() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
//for (int minutes = 0; minutes < 1440; ++minutes) {
|
//for (int minutes = 0; minutes < 1440; ++minutes) {
|
||||||
for (int minutes = 1020; minutes <= 1020; minutes += 1) {
|
for (int minutes = 480; minutes <= 480; minutes += 1) {
|
||||||
QDateTime start = s.addSecs(minutes * 60);
|
QDateTime start = s.addSecs(minutes * 60);
|
||||||
|
|
||||||
qCritical() << "start" << start.toString(Qt::ISODate);
|
// qCritical() << "start" << start.toString(Qt::ISODate);
|
||||||
|
|
||||||
QDateTime effectiveStart = start;
|
QDateTime effectiveStart = start;
|
||||||
|
|
||||||
@@ -745,8 +673,136 @@ int main() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
|
for (int i = 700; i <= 1400; i += 700) {
|
||||||
|
cost = i;
|
||||||
|
|
||||||
|
if ((cs = compute_duration_for_parking_ticket(&cfg, start, cost, end, permitType))) { // return value
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!cs) {
|
||||||
|
qCritical() << "ERROR CalcState" << cs.toString() << endl;
|
||||||
|
} else {
|
||||||
|
// qCritical() << cs.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
//qCritical() << "start" << start.toString(Qt::ISODate) << "< cost" << cost
|
||||||
|
// << "> end" << end.toString(Qt::ISODate);
|
||||||
|
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
|
||||||
|
start = QDateTime::currentDateTime();
|
||||||
|
//start.setTime(QTime(9, 57, 0));
|
||||||
|
|
||||||
|
for (int netto_parking_time = 60; netto_parking_time <= 60; netto_parking_time += 60) {
|
||||||
|
|
||||||
|
QDateTime end;
|
||||||
|
struct price_t price;
|
||||||
|
cs = compute_price_for_parking_ticket(&cfg, start, netto_parking_time, end, &price, permitType, true);
|
||||||
|
|
||||||
|
qCritical() << "start" << start.toString(Qt::ISODate) << "end" << end.toString(Qt::ISODate)
|
||||||
|
<< "price" << price.netto;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if FUCHS_MUEHLBACH==1
|
||||||
|
std::ifstream input;
|
||||||
|
int pop_min_time;
|
||||||
|
int pop_max_time;
|
||||||
|
int pop_min_price;
|
||||||
|
int pop_max_price;
|
||||||
|
int pop_daily_card_price;
|
||||||
|
|
||||||
|
input.open("/home/linux/customer_504/etc/psa_tariff/tariff01.json");
|
||||||
|
//input.open("/opt/ptu5/opt/customer_505/etc/psa_tariff/tariff01.json");
|
||||||
|
|
||||||
|
std::stringstream sstr;
|
||||||
|
while(input >> sstr.rdbuf());
|
||||||
|
std::string json(sstr.str());
|
||||||
|
|
||||||
|
Configuration cfg;
|
||||||
|
|
||||||
|
bool isParsed = cfg.ParseJson(&cfg, json.c_str());
|
||||||
|
cout << endl;
|
||||||
|
|
||||||
|
if (isParsed) {
|
||||||
PermitType permitType(PERMIT_TYPE::SHORT_TERM_PARKING);
|
PermitType permitType(PERMIT_TYPE::SHORT_TERM_PARKING);
|
||||||
for (int i = 200; i <= 200; i += 10) {
|
|
||||||
|
//pop_min_time = get_minimal_parkingtime(&cfg, permitType);
|
||||||
|
//pop_max_time = get_maximal_parkingtime(&cfg, permitType);
|
||||||
|
//pop_min_price = get_minimal_parkingprice(&cfg, permitType);
|
||||||
|
//pop_max_price = get_maximal_parkingprice(&cfg, permitType);
|
||||||
|
//pop_daily_card_price = cfg.getPaymentOptions().pop_daily_card_price;
|
||||||
|
|
||||||
|
//qCritical() << " pop_min_time: " << pop_min_time;
|
||||||
|
//qCritical() << " pop_max_time: " << pop_max_time;
|
||||||
|
//qCritical() << " pop_min_price: " << pop_min_price;
|
||||||
|
//qCritical() << " pop_max_price: " << pop_max_price;
|
||||||
|
|
||||||
|
CalcState cs;
|
||||||
|
double cost;
|
||||||
|
int durationInMinutes = 0;
|
||||||
|
int offsetInMinutes = 0;
|
||||||
|
|
||||||
|
// for (int day = Qt::Monday; day <= Qt::Sunday; ++day) {
|
||||||
|
for (int day = Qt::Wednesday; day <= Qt::Wednesday; ++day) {
|
||||||
|
QDateTime s(QDate(2024, 8, 11 + day), QTime(0, 0, 0));
|
||||||
|
QDateTime end;
|
||||||
|
|
||||||
|
switch (day) {
|
||||||
|
case (int)Qt::Monday:
|
||||||
|
qCritical() << "Monday";
|
||||||
|
break;
|
||||||
|
case (int)Qt::Tuesday:
|
||||||
|
qCritical() << "Tuesday";
|
||||||
|
break;
|
||||||
|
case (int)Qt::Wednesday:
|
||||||
|
qCritical() << "Wednesday";
|
||||||
|
break;
|
||||||
|
case (int)Qt::Thursday:
|
||||||
|
qCritical() << "Thursday";
|
||||||
|
break;
|
||||||
|
case (int)Qt::Friday:
|
||||||
|
qCritical() << "Friday";
|
||||||
|
break;
|
||||||
|
case (int)Qt::Saturday:
|
||||||
|
qCritical() << "Saturday";
|
||||||
|
break;
|
||||||
|
case (int)Qt::Sunday:
|
||||||
|
qCritical() << "Sunday";
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
//for (int minutes = 0; minutes < 1440; ++minutes) {
|
||||||
|
for (int minutes = 491; minutes <= 491; minutes += 1) {
|
||||||
|
QDateTime start = s.addSecs(minutes * 60);
|
||||||
|
|
||||||
|
//qCritical() << "start" << start.toString(Qt::ISODate);
|
||||||
|
|
||||||
|
QDateTime effectiveStart = start;
|
||||||
|
|
||||||
|
// hier sollte man auch testen was passiert, falls man ausserhalb
|
||||||
|
// der verkaufsdaten steht
|
||||||
|
if (start.time() < QTime(7, 0, 0)) {
|
||||||
|
effectiveStart.setTime(QTime(7, 0, 0));
|
||||||
|
} else
|
||||||
|
if (start.time() <= QTime(20, 0, 0)) {
|
||||||
|
effectiveStart = start;
|
||||||
|
} else {
|
||||||
|
effectiveStart = start.addDays(1);
|
||||||
|
effectiveStart.setTime(QTime(7, 0, 0)); // next day
|
||||||
|
}
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
qCritical() << "";
|
||||||
|
qCritical() << "compute_duration_for_parking_ticket";
|
||||||
|
qCritical() << "===================================";
|
||||||
|
|
||||||
|
for (int i = 0; i <= 600; i += 10) {
|
||||||
cost = i;
|
cost = i;
|
||||||
|
|
||||||
if ((cs = compute_duration_for_parking_ticket(&cfg, start, cost, end, permitType))) { // return value
|
if ((cs = compute_duration_for_parking_ticket(&cfg, start, cost, end, permitType))) { // return value
|
||||||
@@ -763,33 +819,14 @@ int main() {
|
|||||||
|
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
for (int i = 700; i <= 1400; i += 700) {
|
qCritical() << "";
|
||||||
//for (int i = 2100; i <= 2100; i += 10) {
|
qCritical() << "compute_price_for_parking_ticket";
|
||||||
cost = i;
|
qCritical() << "================================";
|
||||||
|
|
||||||
if ((cs = compute_duration_for_parking_ticket(&cfg, start, cost, end, PermitType(PERMIT_TYPE::SHORT_TERM_PARKING_PKW)))) { // return value
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!cs) {
|
|
||||||
qCritical() << "ERROR CalcState" << cs.toString() << endl;
|
|
||||||
} else {
|
|
||||||
// qCritical() << cs.toString();
|
|
||||||
}
|
|
||||||
|
|
||||||
qCritical() << "start" << start.toString(Qt::ISODate) << "< cost" << cost
|
|
||||||
<< "> end" << end.toString(Qt::ISODate);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
#if 0
|
|
||||||
|
|
||||||
start = QDateTime::currentDateTime();
|
|
||||||
start.setTime(QTime(9, 57, 0));
|
|
||||||
|
|
||||||
for (int i = 66; i <= 66; i += 6) {
|
|
||||||
|
|
||||||
|
for (int netto_parking_time = 180; netto_parking_time <= (180 + 720*3); netto_parking_time += 720) {
|
||||||
QDateTime end;
|
QDateTime end;
|
||||||
struct price_t price;
|
struct price_t price;
|
||||||
cs = compute_price_for_parking_ticket(&cfg, start, i, end, &price);
|
cs = compute_price_for_parking_ticket(&cfg, start, netto_parking_time, end, &price, permitType, true);
|
||||||
|
|
||||||
qCritical() << "start" << start.toString(Qt::ISODate) << "end" << end.toString(Qt::ISODate)
|
qCritical() << "start" << start.toString(Qt::ISODate) << "end" << end.toString(Qt::ISODate)
|
||||||
<< "price" << price.netto;
|
<< "price" << price.netto;
|
||||||
@@ -808,7 +845,7 @@ int main() {
|
|||||||
int pop_max_price;
|
int pop_max_price;
|
||||||
int pop_daily_card_price;
|
int pop_daily_card_price;
|
||||||
|
|
||||||
int zone = 1;
|
int zone = 3;
|
||||||
|
|
||||||
if (zone == 1) {
|
if (zone == 1) {
|
||||||
input.open("/opt/ptu5/opt/customer_502/etc/psa_tariff/tariff01.json");
|
input.open("/opt/ptu5/opt/customer_502/etc/psa_tariff/tariff01.json");
|
||||||
@@ -897,7 +934,7 @@ int main() {
|
|||||||
CalcState calcState;
|
CalcState calcState;
|
||||||
QDateTime s(QDateTime::currentDateTime());
|
QDateTime s(QDateTime::currentDateTime());
|
||||||
|
|
||||||
// s.setTime(QTime(12, 0, 0));
|
s.setTime(QTime(12, 0, 0));
|
||||||
|
|
||||||
//calcState = compute_duration_for_parking_ticket(&cfg, s,
|
//calcState = compute_duration_for_parking_ticket(&cfg, s,
|
||||||
// (double)1200, end, PermitType(PERMIT_TYPE::SHORT_TERM_PARKING_PKW));
|
// (double)1200, end, PermitType(PERMIT_TYPE::SHORT_TERM_PARKING_PKW));
|
||||||
@@ -905,26 +942,9 @@ int main() {
|
|||||||
//qCritical() << calcState.toString();
|
//qCritical() << calcState.toString();
|
||||||
|
|
||||||
calcState = compute_duration_for_parking_ticket(&cfg, s,
|
calcState = compute_duration_for_parking_ticket(&cfg, s,
|
||||||
(double)9000, end, PermitType(PERMIT_TYPE::SHORT_TERM_PARKING_BUS));
|
(double)50, end, PermitType(PERMIT_TYPE::SHORT_TERM_PARKING_BUS));
|
||||||
qCritical() << end.toString(Qt::ISODate);
|
qCritical() << end.toString(Qt::ISODate);
|
||||||
qCritical() << calcState.toString();
|
qCritical() << calcState.toString();
|
||||||
|
|
||||||
struct price_t costs;
|
|
||||||
|
|
||||||
CalcState cs;
|
|
||||||
|
|
||||||
for (int i = 0, j=timeSteps.size() ; i < timeSteps.size(); --j, ++i) {
|
|
||||||
QDateTime end = start.addSecs(timeSteps.at(i)*60);
|
|
||||||
|
|
||||||
qCritical() << "XXXXX end" << end.toString(Qt::ISODate);
|
|
||||||
|
|
||||||
cs = compute_price_for_parking_ticket(&cfg, s, timeSteps.at(i), end, &costs,
|
|
||||||
PermitType(PERMIT_TYPE::SHORT_TERM_PARKING));
|
|
||||||
if (cs.getStatus() != CalcState::State::SUCCESS) {
|
|
||||||
qCritical() << "ERROR STATUS" << costs.netto;
|
|
||||||
exit(-1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (zone == 2) {
|
if (zone == 2) {
|
||||||
@@ -1439,29 +1459,6 @@ int main() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
|
||||||
#if NEUHAUSER_FORCHACH==1
|
|
||||||
std::ifstream input;
|
|
||||||
input.open("/opt/ptu5/opt/customer_749/etc/psa_tariff/tariff01.json");
|
|
||||||
|
|
||||||
std::stringstream sstr;
|
|
||||||
while(input >> sstr.rdbuf());
|
|
||||||
std::string json(sstr.str());
|
|
||||||
|
|
||||||
Configuration cfg;
|
|
||||||
|
|
||||||
bool isParsed = cfg.ParseJson(&cfg, json.c_str());
|
|
||||||
cout << endl;
|
|
||||||
|
|
||||||
if (isParsed) {
|
|
||||||
compute_product_price(&cfg, PermitType(PERMIT_TYPE::DAY_TICKET_PKW));
|
|
||||||
compute_product_price(&cfg, PermitType(PERMIT_TYPE::DAY_TICKET_CAMPER));
|
|
||||||
|
|
||||||
QDateTime start = QDateTime::currentDateTime();
|
|
||||||
QDateTime ticketEndTime;
|
|
||||||
compute_duration_for_daily_ticket(&cfg, start, ticketEndTime, PermitType(PERMIT_TYPE::DAY_TICKET));
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
#if BAD_NEUENAHR_AHRWEILER==1
|
#if BAD_NEUENAHR_AHRWEILER==1
|
||||||
std::ifstream input;
|
std::ifstream input;
|
||||||
@@ -1473,7 +1470,7 @@ int main() {
|
|||||||
int pop_carry_over;
|
int pop_carry_over;
|
||||||
int pop_carry_over_time_range_id;
|
int pop_carry_over_time_range_id;
|
||||||
|
|
||||||
for (int zone=2; zone < 3; ++zone) {
|
for (int zone=1; zone < 2; ++zone) {
|
||||||
//for (int t=6; t < 7; t+=20) {
|
//for (int t=6; t < 7; t+=20) {
|
||||||
switch (zone) {
|
switch (zone) {
|
||||||
case 1: {
|
case 1: {
|
||||||
@@ -1482,10 +1479,8 @@ int main() {
|
|||||||
//pop_max_time = 6*60;
|
//pop_max_time = 6*60;
|
||||||
} break;
|
} break;
|
||||||
case 2: {
|
case 2: {
|
||||||
qCritical() << " ZONE 2: KURZZEIT 1";
|
|
||||||
// kuzzeit-1-tarif
|
// kuzzeit-1-tarif
|
||||||
//input.open("/opt/ptu5/opt/customer_249/etc/psa_tariff/tariff02.json");
|
input.open("/opt/ptu5/opt/customer_249/etc/psa_tariff/tariff02.json");
|
||||||
input.open("/opt/ptu5/opt/customer_249/etc/psa_tariff/tariff05.json");
|
|
||||||
//pop_max_time = 5*60;
|
//pop_max_time = 5*60;
|
||||||
} break;
|
} break;
|
||||||
case 3: {
|
case 3: {
|
||||||
@@ -1526,7 +1521,6 @@ int main() {
|
|||||||
cout << endl;
|
cout << endl;
|
||||||
|
|
||||||
if (isParsed) {
|
if (isParsed) {
|
||||||
|
|
||||||
// test library functions
|
// test library functions
|
||||||
|
|
||||||
if (zone == 1) {
|
if (zone == 1) {
|
||||||
@@ -1553,10 +1547,10 @@ int main() {
|
|||||||
static QList<int> const timeSteps = Calculator::GetInstance().GetTimeSteps(&cfg);
|
static QList<int> const timeSteps = Calculator::GetInstance().GetTimeSteps(&cfg);
|
||||||
qCritical() << "TimeSteps" << timeSteps;
|
qCritical() << "TimeSteps" << timeSteps;
|
||||||
|
|
||||||
//if (stepsConfigured != timeSteps) {
|
if (stepsConfigured != timeSteps) {
|
||||||
// qCritical() << "TIME-STEPS SHOULD BE" << stepsConfigured;
|
qCritical() << "TIME-STEPS SHOULD BE" << stepsConfigured;
|
||||||
// return -1;
|
return -1;
|
||||||
//}
|
}
|
||||||
|
|
||||||
QDateTime start = QDateTime::currentDateTime();
|
QDateTime start = QDateTime::currentDateTime();
|
||||||
|
|
||||||
@@ -1564,8 +1558,7 @@ int main() {
|
|||||||
double price1 = 0;
|
double price1 = 0;
|
||||||
double price2 = 0;
|
double price2 = 0;
|
||||||
|
|
||||||
//for (int m=0; m < 1440; ++m) {
|
for (int m=0; m < 1440; ++m) {
|
||||||
for (int m=480; m < 481; ++m) {
|
|
||||||
start.setTime(QTime(0, 0, 0));
|
start.setTime(QTime(0, 0, 0));
|
||||||
start = start.addSecs(m*60);
|
start = start.addSecs(m*60);
|
||||||
|
|
||||||
@@ -1582,7 +1575,7 @@ int main() {
|
|||||||
//}
|
//}
|
||||||
|
|
||||||
CalcState cs;
|
CalcState cs;
|
||||||
#if 1
|
|
||||||
for (int i = 0, j=timeSteps.size() ; i < timeSteps.size(); --j, ++i) {
|
for (int i = 0, j=timeSteps.size() ; i < timeSteps.size(); --j, ++i) {
|
||||||
QDateTime end = start.addSecs(timeSteps.at(i)*60);
|
QDateTime end = start.addSecs(timeSteps.at(i)*60);
|
||||||
|
|
||||||
@@ -1617,21 +1610,6 @@ int main() {
|
|||||||
// cost[i], false, true);
|
// cost[i], false, true);
|
||||||
//qCritical() << "duration" << duration.c_str();
|
//qCritical() << "duration" << duration.c_str();
|
||||||
}
|
}
|
||||||
#else
|
|
||||||
|
|
||||||
double cost = 80;
|
|
||||||
qCritical() << "START" << start.toString(Qt::ISODate) << "cost" << cost;
|
|
||||||
QDateTime end;
|
|
||||||
|
|
||||||
cs = compute_duration_for_parking_ticket(&cfg, start, cost, end,
|
|
||||||
PermitType(PERMIT_TYPE::SHORT_TERM_PARKING));
|
|
||||||
qCritical() << __LINE__ << cs.toString()
|
|
||||||
<< "START" << start.toString(Qt::ISODate)
|
|
||||||
<< "<duration" << start.secsTo(end) / 60
|
|
||||||
<< "cost" << cost
|
|
||||||
<< "> end" << end.toString(Qt::ISODate);
|
|
||||||
//}
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
} // zone == 1
|
} // zone == 1
|
||||||
if (zone == 2) {
|
if (zone == 2) {
|
||||||
@@ -1669,20 +1647,18 @@ int main() {
|
|||||||
bool fail;
|
bool fail;
|
||||||
QDateTime start;
|
QDateTime start;
|
||||||
|
|
||||||
for (int i=1; i < 2; ++i) {
|
for (int i=0; i < 4; ++i) {
|
||||||
switch (i) {
|
switch (i) {
|
||||||
case 0:
|
case 0:
|
||||||
start = QDateTime(QDate(2024, 5, 1), QTime(16, 0, 0)); // holiday
|
start = QDateTime(QDate(2024, 5, 1), QTime(16, 0, 0)); // holiday
|
||||||
fail = false;
|
fail = false;
|
||||||
break;
|
break;
|
||||||
case 1:
|
case 1:
|
||||||
//start = QDateTime(QDate(2024, 10, 3), QTime(17, 0, 0)); // sunday
|
start = QDateTime(QDate(2024, 4, 21), QTime(16, 0, 0)); // sunday
|
||||||
//start = QDateTime(QDate(2025, 4, 20), QTime(18, 0, 0)); // sunday
|
|
||||||
start = QDateTime(QDate(2024, 9, 27), QTime(17, 0, 0)); // friday
|
|
||||||
fail = false;
|
fail = false;
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
start = QDateTime(QDate(2024, 4, 22), QTime(17, 30, 0)); // monday
|
start = QDateTime(QDate(2024, 4, 22), QTime(8, 0, 0)); // monday
|
||||||
fail = false;
|
fail = false;
|
||||||
break;
|
break;
|
||||||
case 3:
|
case 3:
|
||||||
@@ -1706,52 +1682,18 @@ int main() {
|
|||||||
|
|
||||||
QList<int>::const_iterator step;
|
QList<int>::const_iterator step;
|
||||||
for (step = timeSteps.cbegin(); step != timeSteps.cend(); ++step) {
|
for (step = timeSteps.cbegin(); step != timeSteps.cend(); ++step) {
|
||||||
//qCritical() << __LINE__
|
|
||||||
// << "START" << start.toString(Qt::ISODate)
|
|
||||||
// << "<duration" << *step;
|
|
||||||
|
|
||||||
if (*step != 180)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
|
|
||||||
double cost = 0;
|
double cost = 0;
|
||||||
CalcState cs;
|
CalcState cs;
|
||||||
|
|
||||||
QDateTime s(start);
|
if ((cs = compute_price_for_parking_ticket(&cfg, start, *step, end, &price, PermitType(PERMIT_TYPE::SHORT_TERM_PARKING)))) {
|
||||||
|
|
||||||
qCritical() << __LINE__
|
|
||||||
<< "START" << start.toString(Qt::ISODate)
|
|
||||||
<< "<duration" << *step;
|
|
||||||
|
|
||||||
#if 1
|
|
||||||
if ((cs = compute_price_for_parking_ticket(&cfg, s, *step, end, &price,
|
|
||||||
PermitType(PERMIT_TYPE::SHORT_TERM_PARKING)))) {
|
|
||||||
cost = price.netto;
|
cost = price.netto;
|
||||||
qCritical() << __LINE__
|
qCritical() << "step" << *step << ": cost" << cost;
|
||||||
<< "START" << start.toString(Qt::ISODate)
|
|
||||||
<< "<duration" << *step
|
|
||||||
<< "cost" << cost
|
|
||||||
<< "> end" << end.toString(Qt::ISODate);
|
|
||||||
} else {
|
} else {
|
||||||
if (fail == false) {
|
if (fail == false) {
|
||||||
qCritical() << "<<<ERROR>>> cs =" << QString(cs);
|
qCritical() << "<<<ERROR>>> cs =" << QString(cs);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#else
|
|
||||||
cost = 200;
|
|
||||||
qCritical() << "START" << start.toString(Qt::ISODate) << "cost" << cost;
|
|
||||||
|
|
||||||
cs = compute_duration_for_parking_ticket(&cfg, start, cost, end,
|
|
||||||
PermitType(PERMIT_TYPE::SHORT_TERM_PARKING));
|
|
||||||
qCritical() << __LINE__ << cs.toString()
|
|
||||||
<< "START" << start.toString(Qt::ISODate)
|
|
||||||
<< "<duration" << start.secsTo(end) / 60
|
|
||||||
<< "cost" << cost
|
|
||||||
<< "> end" << end.toString(Qt::ISODate);
|
|
||||||
break;
|
|
||||||
//}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
qCritical() << "ERROR paymentOptionIndex =" << paymentOptionIndex;
|
qCritical() << "ERROR paymentOptionIndex =" << paymentOptionIndex;
|
||||||
@@ -2856,62 +2798,24 @@ int main() {
|
|||||||
bool nextDay = false;
|
bool nextDay = false;
|
||||||
bool prePaid = true;
|
bool prePaid = true;
|
||||||
// zone 1 (lila)
|
// zone 1 (lila)
|
||||||
QDateTime s(QDate(2024, 10, 8), QTime());
|
QDateTime s(QDate(2023, 11, 30), QTime());
|
||||||
QDateTime end;
|
QDateTime end;
|
||||||
|
|
||||||
static QList<int> const timeSteps = Calculator::GetInstance().GetTimeSteps(&cfg);
|
|
||||||
qCritical() << "TimeSteps" << timeSteps;
|
|
||||||
|
|
||||||
for (int duration = 30; duration <= pop_max_time; duration += 5) {
|
for (int duration = 30; duration <= pop_max_time; duration += 5) {
|
||||||
int offset = 600;
|
for (int offset = 420; offset < 1140; ++offset) {
|
||||||
//for (int offset = 720; offset < 601; ++offset) {
|
if (offset > 720 && offset < 840) {
|
||||||
//if (offset > 720 && offset < 840) {
|
continue;
|
||||||
// continue;
|
}
|
||||||
//}
|
|
||||||
QDateTime start = s.addSecs(offset * 60);
|
QDateTime start = s.addSecs(offset * 60);
|
||||||
//qCritical() << "start" << start.toString(Qt::ISODate);
|
//qCritical() << "start" << start.toString(Qt::ISODate);
|
||||||
|
|
||||||
CalcState cs;
|
double cost = Calculator::GetInstance().GetCostFromDuration(&cfg, 3, start, end, duration, nextDay, prePaid);
|
||||||
#if 1
|
|
||||||
struct price_t costs;
|
|
||||||
for (int i = 0, j=timeSteps.size() ; i < timeSteps.size(); --j, ++i) {
|
|
||||||
QDateTime end = start.addSecs(timeSteps.at(i)*60);
|
|
||||||
|
|
||||||
// if (i != 2) continue;
|
|
||||||
|
|
||||||
cs = compute_price_for_parking_ticket(&cfg, start, timeSteps.at(i), end, &costs, PermitType(PERMIT_TYPE::SHORT_TERM_PARKING));
|
|
||||||
int price1 = costs.netto;
|
|
||||||
|
|
||||||
qCritical() << "compute_price_for_parking_ticket()/GetCostFromDuration() TIME: "
|
|
||||||
<< timeSteps.at(i) << "ZZZZZZZZZZZZZ PRICE=" << price1 << "end=" << end.toString(Qt::ISODate);
|
|
||||||
}
|
|
||||||
exit(0);
|
|
||||||
#else
|
|
||||||
|
|
||||||
double cost = 360;
|
|
||||||
qCritical() << "XXXXXXXX START" << start.toString(Qt::ISODate) << "cost" << cost;
|
|
||||||
QDateTime end;
|
|
||||||
|
|
||||||
cs = compute_duration_for_parking_ticket(&cfg, start, cost, end,
|
|
||||||
PermitType(PERMIT_TYPE::SHORT_TERM_PARKING));
|
|
||||||
qCritical() << __LINE__ << cs.toString()
|
|
||||||
<< "START" << start.toString(Qt::ISODate)
|
|
||||||
<< "<duration" << start.secsTo(end) / 60
|
|
||||||
<< "cost" << cost
|
|
||||||
<< "> end" << end.toString(Qt::ISODate);
|
|
||||||
//}
|
|
||||||
|
|
||||||
exit(0);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
//double cost = Calculator::GetInstance().GetCostFromDuration(&cfg, 3, start, end, duration, nextDay, prePaid);
|
|
||||||
//Q_ASSERT(cost == duration*2.5);
|
//Q_ASSERT(cost == duration*2.5);
|
||||||
//qCritical() << "";
|
//qCritical() << "";
|
||||||
//qCritical() << "start" << start.toString(Qt::ISODate)
|
qCritical() << "start" << start.toString(Qt::ISODate)
|
||||||
// << "end" << end.toString(Qt::ISODate)
|
<< "end" << end.toString(Qt::ISODate)
|
||||||
// << "duration" << duration
|
<< "duration" << duration
|
||||||
// << "cost" << cost;
|
<< "cost" << cost;
|
||||||
#if 0
|
|
||||||
switch(duration) {
|
switch(duration) {
|
||||||
case 30:
|
case 30:
|
||||||
if (cost == 60.0) {
|
if (cost == 60.0) {
|
||||||
@@ -3075,17 +2979,15 @@ int main() {
|
|||||||
<< "cost" << cost;
|
<< "cost" << cost;
|
||||||
exit(-1);
|
exit(-1);
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
//std::string duration = Calculator::GetInstance().GetDurationFromCost(&cfg, 3, start.toString(Qt::ISODate).toStdString().c_str(), cost);
|
//std::string duration = Calculator::GetInstance().GetDurationFromCost(&cfg, 3, start.toString(Qt::ISODate).toStdString().c_str(), cost);
|
||||||
//Q_ASSERT(cost == duration*2.5);
|
//Q_ASSERT(cost == duration*2.5);
|
||||||
//qCritical() << "start" << start.toString(Qt::ISODate)
|
//qCritical() << "start" << start.toString(Qt::ISODate)
|
||||||
// << "cost" << cost
|
// << "cost" << cost
|
||||||
// << "until" << duration.c_str() << start.secsTo(QDateTime::fromString(duration.c_str(), Qt::ISODate)) / 60;
|
// << "until" << duration.c_str() << start.secsTo(QDateTime::fromString(duration.c_str(), Qt::ISODate)) / 60;
|
||||||
//}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#if 0
|
|
||||||
Configuration::SpecialDaysType specialDays = cfg.SpecialDays;
|
Configuration::SpecialDaysType specialDays = cfg.SpecialDays;
|
||||||
for (Configuration::SpecialDaysType::const_iterator it = specialDays.cbegin();
|
for (Configuration::SpecialDaysType::const_iterator it = specialDays.cbegin();
|
||||||
it != specialDays.cend(); ++it) {
|
it != specialDays.cend(); ++it) {
|
||||||
@@ -3106,7 +3008,7 @@ int main() {
|
|||||||
<< "duration" << duration
|
<< "duration" << duration
|
||||||
<< "cost" << cost;
|
<< "cost" << cost;
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
|
|||||||
+3
-12
@@ -1,5 +1,3 @@
|
|||||||
QT += core
|
|
||||||
|
|
||||||
TEMPLATE = app
|
TEMPLATE = app
|
||||||
TARGET = main
|
TARGET = main
|
||||||
|
|
||||||
@@ -32,16 +30,9 @@ SOURCES += main.cpp
|
|||||||
# HEADERS +=
|
# HEADERS +=
|
||||||
|
|
||||||
OTHER_FILES += \
|
OTHER_FILES += \
|
||||||
/opt/ptu5/opt/customer_335/etc/psa_tariff/tariff01.json \
|
/opt/ptu5/opt/customer_502/etc/psa_tariff/tariff01.json \
|
||||||
/opt/ptu5/opt/customer_335/etc/psa_tariff/tariff02.json \
|
/opt/ptu5/opt/customer_502/etc/psa_tariff/tariff02.json \
|
||||||
/opt/ptu5/opt/customer_249/etc/psa_tariff/tariff01.json \
|
/opt/ptu5/opt/customer_502/etc/psa_tariff/tariff03.json
|
||||||
/opt/ptu5/opt/customer_249/etc/psa_tariff/tariff02.json \
|
|
||||||
/opt/ptu5/opt/customer_249/etc/psa_tariff/tariff03.json \
|
|
||||||
/opt/ptu5/opt/customer_249/etc/psa_tariff/tariff04.json \
|
|
||||||
/opt/ptu5/opt/customer_249/etc/psa_tariff/tariff05.json \
|
|
||||||
/opt/ptu5/opt/customer_249/etc/psa_tariff/tariff06.json \
|
|
||||||
/opt/ptu5/opt/customer_249/etc/psa_tariff/tariff07.json \
|
|
||||||
/opt/ptu5/opt/customer_249/etc/psa_tariff/tariff08.json
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user