Compare commits
21 Commits
master
...
fuchs-expe
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 OVERPAID;
|
||||
static QString const OUTSIDE_ALLOWED_PARKING_TIME;
|
||||
static QString const SUCCESS_MAXPRICE;
|
||||
|
||||
enum class State : uint8_t {
|
||||
SUCCESS,
|
||||
@ -72,8 +71,7 @@ struct CALCULATE_LIBRARY_API CalcState {
|
||||
BELOW_MIN_PARKING_PRICE,
|
||||
ABOVE_MAX_PARKING_PRICE,
|
||||
OVERPAID,
|
||||
OUTSIDE_ALLOWED_PARKING_TIME,
|
||||
SUCCESS_MAXPRICE
|
||||
OUTSIDE_ALLOWED_PARKING_TIME
|
||||
};
|
||||
|
||||
State m_status;
|
||||
@ -90,9 +88,9 @@ struct CALCULATE_LIBRARY_API CalcState {
|
||||
, m_desc(desc) {
|
||||
}
|
||||
|
||||
explicit CalcState(State state, QString desc,
|
||||
QTime const &from,
|
||||
QTime const &until)
|
||||
explicit CalcState(State state, QString desc = "",
|
||||
QTime const &from = QTime(),
|
||||
QTime const &until = QTime())
|
||||
: m_status(state)
|
||||
, m_desc(desc)
|
||||
, m_allowedTimeRange(from, until) {
|
||||
@ -108,9 +106,6 @@ struct CALCULATE_LIBRARY_API CalcState {
|
||||
case State::SUCCESS:
|
||||
s = CalcState::SUCCESS;
|
||||
break;
|
||||
case State::SUCCESS_MAXPRICE:
|
||||
s = CalcState::SUCCESS_MAXPRICE;
|
||||
break;
|
||||
case State::ERROR_PARSING_ZONE_NR:
|
||||
s = CalcState::ERROR_PARSING_ZONE_NR;
|
||||
break;
|
||||
@ -163,9 +158,6 @@ struct CALCULATE_LIBRARY_API CalcState {
|
||||
case State::SUCCESS:
|
||||
s = CalcState::SUCCESS;
|
||||
break;
|
||||
case State::SUCCESS_MAXPRICE:
|
||||
s = CalcState::SUCCESS_MAXPRICE;
|
||||
break;
|
||||
case State::ERROR_PARSING_ZONE_NR:
|
||||
s = CalcState::ERROR_PARSING_ZONE_NR;
|
||||
break;
|
||||
@ -215,9 +207,6 @@ struct CALCULATE_LIBRARY_API CalcState {
|
||||
if (desc == SUCCESS) {
|
||||
m_status = State::SUCCESS;
|
||||
} else
|
||||
if (desc == SUCCESS_MAXPRICE) {
|
||||
m_status = State::SUCCESS_MAXPRICE;
|
||||
}
|
||||
if (desc == ERROR_PARSING_ZONE_NR) {
|
||||
m_status = State::ERROR_PARSING_ZONE_NR;
|
||||
} else
|
||||
|
@ -3,7 +3,6 @@
|
||||
|
||||
#include <iostream>
|
||||
#include <optional>
|
||||
#include <utility>
|
||||
|
||||
#include "configuration.h"
|
||||
#include "calculate_price.h"
|
||||
@ -27,16 +26,16 @@ class Calculator {
|
||||
QDateTime const &start,
|
||||
int netto_parking_time,
|
||||
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:
|
||||
explicit Calculator() {
|
||||
m_state.m_timeLimitReached = false;
|
||||
m_state.m_costAtTimeLimit = ~0;
|
||||
}
|
||||
explicit Calculator() = default;
|
||||
|
||||
public:
|
||||
Calculator(Calculator const &other) = delete;
|
||||
@ -47,12 +46,6 @@ public:
|
||||
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) {
|
||||
if (m_timeSteps.size() > 0 && paymentOptionIndex < m_timeSteps.size()) {
|
||||
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="price"></param>
|
||||
/// <returns>Returns duration in seconds (data type: double)</returns>
|
||||
std::pair<std::string, QDateTime>
|
||||
GetDurationFromCost(Configuration* cfg, uint8_t vehicle_type, char const* start_datetime, double price,
|
||||
PermitType permitType, bool nextDay = false, bool prepaid = false);
|
||||
std::string GetDurationFromCost(Configuration* cfg, uint8_t vehicle_type, char const* start_datetime, double price, PermitType permitType, bool nextDay = false, bool prepaid = false);
|
||||
|
||||
/// <summary>
|
||||
/// Gets cost from duration in seconds
|
||||
@ -94,14 +85,10 @@ public:
|
||||
/// <param name="tariff_cfg">Pointer to configuration</param>
|
||||
/// <param name="vehicle_type">Type of vehicle</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="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>
|
||||
/// <returns>Returns cost (data type: double)</returns>
|
||||
double GetCostFromDuration(Configuration* cfg, uint8_t vehicle_type, QDateTime &start_datetime, QDateTime & end_datetime, int durationMin,
|
||||
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);
|
||||
double GetCostFromDuration(Configuration* cfg, uint8_t vehicle_type, QDateTime &start_datetime, QDateTime & end_datetime, int durationMin, PermitType permitType, bool nextDay = false, bool prepaid = false);
|
||||
|
||||
// Daily ticket
|
||||
QDateTime GetDailyTicketDuration(Configuration* cfg, const QDateTime start_datetime, uint8_t payment_option, bool carry_over);
|
||||
|
@ -29,8 +29,6 @@
|
||||
#include "tariff_prepaid.h"
|
||||
#include "tariff_carryover.h"
|
||||
#include "tariff_permit_type.h"
|
||||
#include "tariff_service.h"
|
||||
#include "tariff_out_of_service.h"
|
||||
|
||||
#include <QVector>
|
||||
#include <optional>
|
||||
@ -38,7 +36,6 @@
|
||||
using namespace std;
|
||||
using namespace rapidjson;
|
||||
|
||||
|
||||
class Calculator;
|
||||
class Configuration
|
||||
{
|
||||
@ -52,10 +49,6 @@ public:
|
||||
using TariffPrepaidType = std::multimap<int, ATBPrepaid>;
|
||||
using TariffCarryOverType = std::multimap<int, ATBCarryOver>;
|
||||
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;
|
||||
ATBCurrency Currency;
|
||||
@ -66,7 +59,7 @@ public:
|
||||
multimap<int, ATBPaymentRate> PaymentRate;
|
||||
SpecialDaysWorktimeType SpecialDaysWorktime;
|
||||
SpecialDaysType SpecialDays;
|
||||
multimap<Qt::DayOfWeek, ATBWeekDay> WeekDays;
|
||||
multimap<int, ATBWeekDays> WeekDays;
|
||||
multimap<int, ATBPeriodYear> YearPeriod;
|
||||
multimap<int, ATBWeekDaysWorktime> WeekDaysWorktime;
|
||||
ATBPaymentOptionType PaymentOption;
|
||||
@ -79,11 +72,6 @@ public:
|
||||
TariffInterpolationType TariffInterpolations;
|
||||
TariffPrepaidType TariffPrepaidOptions;
|
||||
TariffCarryOverType TariffCarryOverOptions;
|
||||
TariffServiceType TariffServices;
|
||||
TariffOutOfServiceType TariffOutOfServices;
|
||||
ATBTariffPrepaidType TariffPrepaids;
|
||||
ATBTariffCarryOverType TariffCarryOvers;
|
||||
QStringList TariffIncludes;
|
||||
|
||||
/// <summary>
|
||||
/// Parse JSON string
|
||||
@ -124,9 +112,6 @@ public:
|
||||
std::optional<ATBWeekDaysWorktime> getWeekDayWorkTime(QTime const &time, Qt::DayOfWeek dayOfWeek);
|
||||
std::optional<QVector<ATBWeekDaysWorktime>> getAllWeekDayWorkTimes();
|
||||
|
||||
QStringList const &getTariffIncludes() const { return TariffIncludes; }
|
||||
QStringList &getTariffIncludes() { return TariffIncludes; }
|
||||
|
||||
std::optional<QDateTime> prepaidStart(QDateTime const &start, int prepaid_option_id);
|
||||
int getPaymentOptionIndex(PERMIT_TYPE permitType);
|
||||
int getPaymentOptionIndex(PERMIT_TYPE permitType) const;
|
||||
@ -141,15 +126,3 @@ private:
|
||||
|
||||
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,
|
||||
InterpolationType = 0x10,
|
||||
PrepaidType = 0x11,
|
||||
CarryOverType = 0x12,
|
||||
IncludesType = 0x13
|
||||
CarryOverType = 0x12
|
||||
};
|
||||
|
||||
#endif // MEMBER_TYPE_H_INCLUDED
|
||||
|
@ -6,8 +6,7 @@ enum PaymentMethod {
|
||||
Progressive = 0x01,
|
||||
Degressive = 0x02,
|
||||
Linear = 0x03,
|
||||
Steps = 0x04,
|
||||
Unified = 0x05
|
||||
Steps = 0x04
|
||||
};
|
||||
|
||||
#endif // PAYMENT_METHOD_H_INCLUDED
|
||||
|
@ -25,7 +25,6 @@ public:
|
||||
pop_max_time = 0;
|
||||
pop_min_price = 0;
|
||||
pop_max_price = 0;
|
||||
pop_max_price_save = 0;
|
||||
pop_carry_over = -1;
|
||||
pop_carry_over_option_id = -1;
|
||||
pop_prepaid_option_id = -1;
|
||||
@ -42,10 +41,7 @@ public:
|
||||
pop_use_only_upto_datetime = ""; // deprecated
|
||||
pop_use_only_for_duration = 0; // deprecated
|
||||
pop_plus_steps = 1; // +: jump <x=1> steps forward
|
||||
pop_plus_steps_saved = 1;
|
||||
pop_minus_steps = 1; // -: jump <x=1> steps backward
|
||||
pop_allow_overpay = false;
|
||||
pop_apply_carry_over_to_ticket_endtime = false;
|
||||
}
|
||||
|
||||
int pop_id;
|
||||
@ -62,7 +58,6 @@ public:
|
||||
double pop_max_time;
|
||||
double pop_min_price;
|
||||
double pop_max_price;
|
||||
double pop_max_price_save;
|
||||
int pop_carry_over;
|
||||
int pop_carry_over_option_id;
|
||||
bool pop_truncate_last_interpolation_step;
|
||||
@ -77,10 +72,7 @@ public:
|
||||
bool pop_accumulate_prices;
|
||||
bool pop_accumulate_durations;
|
||||
int pop_plus_steps;
|
||||
int pop_plus_steps_saved;
|
||||
int pop_minus_steps;
|
||||
bool pop_allow_overpay;
|
||||
bool pop_apply_carry_over_to_ticket_endtime;
|
||||
|
||||
struct ATBMaxDateTime {
|
||||
int direction;
|
||||
|
@ -8,9 +8,5 @@ public:
|
||||
int pedwt_period_exc_day_id;
|
||||
std::string pedwt_time_from;
|
||||
std::string pedwt_time_to;
|
||||
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
|
||||
};
|
||||
double pedwt_price;
|
||||
};
|
@ -3,111 +3,6 @@
|
||||
|
||||
#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 week {
|
||||
int day;
|
||||
@ -120,19 +15,6 @@ struct ATBCarryOver {
|
||||
|
||||
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) {
|
||||
QDebugStateSaver saver(debug);
|
||||
|
||||
@ -149,21 +31,21 @@ struct ATBCarryOver {
|
||||
<< " day: " << co.carryover[(int)Qt::Tuesday].day << "\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"
|
||||
<< " duration: " << co.carryover[(int)Qt::Tuesday].duration << "\n"
|
||||
<< " duration: " << co.carryover[(int)Qt::Monday].duration << "\n"
|
||||
<< " anytime: " << co.carryover[(int)Qt::Tuesday].seemless << "\n"
|
||||
<< " never: " << co.carryover[(int)Qt::Tuesday].never << "\n"
|
||||
<< " **** Wednesday **** \n"
|
||||
<< " day: " << co.carryover[(int)Qt::Wednesday].day << "\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"
|
||||
<< " duration: " << co.carryover[(int)Qt::Wednesday].duration << "\n"
|
||||
<< " duration: " << co.carryover[(int)Qt::Monday].duration << "\n"
|
||||
<< " anytime: " << co.carryover[(int)Qt::Wednesday].seemless << "\n"
|
||||
<< " never: " << co.carryover[(int)Qt::Wednesday].never << "\n"
|
||||
<< " **** Thursday **** \n"
|
||||
<< " day: " << co.carryover[(int)Qt::Thursday].day << "\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"
|
||||
<< " duration: " << co.carryover[(int)Qt::Thursday].duration << "\n"
|
||||
<< " duration: " << co.carryover[(int)Qt::Monday].duration << "\n"
|
||||
<< " anytime: " << co.carryover[(int)Qt::Thursday].seemless << "\n"
|
||||
<< " never: " << co.carryover[(int)Qt::Thursday].never << "\n"
|
||||
<< " **** Friday **** \n"
|
||||
@ -176,14 +58,14 @@ struct ATBCarryOver {
|
||||
<< " day: " << co.carryover[(int)Qt::Saturday].day << "\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"
|
||||
<< " duration: " << co.carryover[(int)Qt::Saturday].duration << "\n"
|
||||
<< " duration: " << co.carryover[(int)Qt::Monday].duration << "\n"
|
||||
<< " anytime: " << co.carryover[(int)Qt::Saturday].seemless << "\n"
|
||||
<< " never: " << co.carryover[(int)Qt::Saturday].never << "\n"
|
||||
<< " **** Sunday **** \n"
|
||||
<< " day: " << co.carryover[(int)Qt::Sunday].day << "\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"
|
||||
<< " duration: " << co.carryover[(int)Qt::Sunday].duration << "\n"
|
||||
<< " duration: " << co.carryover[(int)Qt::Monday].duration << "\n"
|
||||
<< " anytime: " << co.carryover[(int)Qt::Sunday].seemless << "\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 <cstddef>
|
||||
#include <stdio.h>
|
||||
|
@ -14,8 +14,6 @@
|
||||
void setDebugLevel(int level);
|
||||
int getDebugLevel();
|
||||
|
||||
#if 0
|
||||
|
||||
static void print() {
|
||||
std::cerr << "\n";
|
||||
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
|
||||
|
@ -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,9 +19,7 @@ enum class PERMIT_TYPE : quint8 {
|
||||
SHORT_TERM_PARKING_CAMPER=12,
|
||||
DAY_TICKET_PKW=13,
|
||||
DAY_TICKET_BUS=14,
|
||||
DAY_TICKET_CAMPER=15,
|
||||
FREE_TICKET=16,
|
||||
PRODUCT_MAX
|
||||
DAY_TICKET_CAMPER=15
|
||||
};
|
||||
|
||||
struct PermitType {
|
||||
@ -75,9 +73,6 @@ struct PermitType {
|
||||
case 15:
|
||||
m_permitType = PERMIT_TYPE::DAY_TICKET_CAMPER;
|
||||
break;
|
||||
case 16:
|
||||
m_permitType = PERMIT_TYPE::FREE_TICKET;
|
||||
break;
|
||||
default:
|
||||
m_permitType = PERMIT_TYPE::INVALID;
|
||||
}
|
||||
@ -121,8 +116,6 @@ struct PermitType {
|
||||
return 14;
|
||||
case PERMIT_TYPE::DAY_TICKET_CAMPER:
|
||||
return 15;
|
||||
case PERMIT_TYPE::FREE_TICKET:
|
||||
return 16;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
@ -139,6 +132,9 @@ struct PermitType {
|
||||
if (permitTypeStr == "DAY_TICKET_CHILD") {
|
||||
return PERMIT_TYPE::DAY_TICKET_CHILD;
|
||||
} else
|
||||
if (permitTypeStr == "DAY_TICKET_ADULT") {
|
||||
return PERMIT_TYPE::DAY_TICKET_ADULT;
|
||||
} else
|
||||
if (permitTypeStr == "DAY_TICKET_TEEN") {
|
||||
return PERMIT_TYPE::DAY_TICKET_TEEN;
|
||||
} else
|
||||
@ -174,9 +170,6 @@ struct PermitType {
|
||||
} else
|
||||
if (permitTypeStr == "DAY_TICKET_CAMPER") {
|
||||
return PERMIT_TYPE::DAY_TICKET_CAMPER;
|
||||
} else
|
||||
if (permitTypeStr == "FREE_TICKET") {
|
||||
return PERMIT_TYPE::FREE_TICKET;
|
||||
}
|
||||
|
||||
return PERMIT_TYPE::INVALID;
|
||||
@ -214,8 +207,6 @@ struct PermitType {
|
||||
return QString("DAY_TICKET_BUS");
|
||||
case PERMIT_TYPE::DAY_TICKET_CAMPER:
|
||||
return QString("DAY_TICKET_CAMPER");
|
||||
case PERMIT_TYPE::FREE_TICKET:
|
||||
return QString("FREE_TICKET");
|
||||
default:
|
||||
break;
|
||||
}
|
||||
@ -254,8 +245,6 @@ struct PermitType {
|
||||
return QString("DAY_TICKET_BUS");
|
||||
case PERMIT_TYPE::DAY_TICKET_CAMPER:
|
||||
return QString("DAY_TICKET_CAMPER");
|
||||
case PERMIT_TYPE::FREE_TICKET:
|
||||
return QString("FREE_TICKET");
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
@ -1,114 +1,17 @@
|
||||
#ifndef TARIFF_PREPAID_H_INCLUDED
|
||||
#define TARIFF_PREPAID_H_INCLUDED
|
||||
|
||||
#include <QDateTime>
|
||||
#include <QTime>
|
||||
#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 {
|
||||
explicit ATBPrepaid() = default;
|
||||
int id;
|
||||
bool anytime;
|
||||
bool never;
|
||||
QTime static_start;
|
||||
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) {
|
||||
QDebugStateSaver saver(debug);
|
||||
|
||||
@ -117,41 +20,7 @@ struct ATBPrepaid {
|
||||
<< " static_start: " << pp.static_start.toString(Qt::ISODate) << "\n"
|
||||
<< " static_end: " << pp.static_end.toString(Qt::ISODate) << "\n"
|
||||
<< " anytime: " << pp.anytime << "\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";
|
||||
<< " never: " << pp.never << "\n";
|
||||
|
||||
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
|
||||
#define TIME_RANGE_H_INCLUDED
|
||||
|
||||
#include "atb_time.h"
|
||||
|
||||
#include <QString>
|
||||
|
||||
struct TimeRange {
|
||||
ATBTime m_start;
|
||||
ATBTime m_end;
|
||||
int m_duration;
|
||||
|
||||
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
|
||||
#ifndef TIME_RANGE_H_INCLUDED
|
||||
#define TIME_RANGE_H_INCLUDED
|
||||
|
||||
#include "time_range_header.h"
|
||||
|
||||
struct TimeRange {
|
||||
public:
|
||||
bool IsActive;
|
||||
ATBTimeRange TimeRangeStructure;
|
||||
};
|
||||
|
||||
#endif // TIME_RANGE_H_INCLUDED
|
||||
|
@ -1,57 +1,10 @@
|
||||
#include "tariff_settings.h"
|
||||
#include "tariff_carryover_settings.h"
|
||||
#pragma once
|
||||
#include <string>
|
||||
|
||||
#include <QString>
|
||||
#include <Qt>
|
||||
#include <QDate>
|
||||
|
||||
struct ATBWeekDay {
|
||||
enum WeekDayType {USUAL_WEEKDAY=0, HOLIDAY=1};
|
||||
|
||||
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;
|
||||
}
|
||||
};
|
||||
class ATBWeekDays
|
||||
{
|
||||
public:
|
||||
int pdiw_id;
|
||||
std::string pdiw_label;
|
||||
int pdiw_index;
|
||||
};
|
File diff suppressed because it is too large
Load Diff
@ -35,8 +35,7 @@ SOURCES += \
|
||||
src/tariff_log.cpp \
|
||||
src/calculate_price.cpp \
|
||||
src/ticket.cpp \
|
||||
src/tariff_global_defines.cpp \
|
||||
src/atb_time.cpp
|
||||
src/tariff_global_defines.cpp
|
||||
|
||||
HEADERS += \
|
||||
include/mobilisis/calculator_functions.h \
|
||||
@ -90,10 +89,7 @@ HEADERS += \
|
||||
include/mobilisis/tariff_interpolation.h \
|
||||
include/mobilisis/tariff_prepaid.h \
|
||||
include/mobilisis/tariff_carryover.h \
|
||||
include/mobilisis/tariff_global_defines.h \
|
||||
include/mobilisis/atb_time.h \
|
||||
include/mobilisis/tariff_service.h \
|
||||
include/mobilisis/tariff_out_of_service.h
|
||||
include/mobilisis/tariff_global_defines.h
|
||||
|
||||
OTHER_FILES += src/main.cpp \
|
||||
../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;
|
||||
}
|
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());
|
||||
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);
|
||||
//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";
|
||||
return false;
|
||||
@ -427,8 +421,6 @@ PaymentMethod Utilities::getPaymentMethodId(Configuration const *cfg) {
|
||||
return PaymentMethod::Degressive;
|
||||
case PaymentMethod::Progressive:
|
||||
return PaymentMethod::Progressive;
|
||||
case PaymentMethod::Unified:
|
||||
return PaymentMethod::Unified;
|
||||
}
|
||||
}
|
||||
|
||||
|
488
main/main.cpp
488
main/main.cpp
@ -39,7 +39,7 @@ extern "C" char* strptime(const char* s,
|
||||
|
||||
#define SZEGED (0)
|
||||
#define SCHOENAU_KOENIGSEE (0)
|
||||
#define NEUHAUSER_KORNEUBURG (1)
|
||||
#define NEUHAUSER_KORNEUBURG (0)
|
||||
#define NEUHAUSER_LINSINGER_MASCHINENBAU (0)
|
||||
#define NEUHAUSER_NORDISCHES_AUSBILDUNGSZENTRUM (0)
|
||||
#define NEUHAUSER_BILEXA_GALTUER (0)
|
||||
@ -52,7 +52,7 @@ extern "C" char* strptime(const char* s,
|
||||
#define SCHNALS_LEITER_KIRCHL (0)
|
||||
#define SCHNALS_STAUMAUER (SCHNALS_LEITER_KIRCHL)
|
||||
#define VALSER_ALM (0)
|
||||
#define NEUHAUSER_FORCHACH (0)
|
||||
#define FUCHS_MUEHLBACH (1)
|
||||
|
||||
#if NEUHAUSER_KIRCHDORF==1
|
||||
static bool test_neuhauser_kirchdorf(int step, double cost) {
|
||||
@ -211,73 +211,21 @@ static bool test_neuhauser_kirchdorf(int step, double cost) {
|
||||
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() {
|
||||
|
||||
qCritical() << getCalculatorLibVersion();
|
||||
isProductSupportedInCalculatorLib("FREE_TICKET");
|
||||
return 0;
|
||||
|
||||
//487 {
|
||||
// 488 "pra_payment_option_id": 1049,
|
||||
// 489 "pra_payment_unit_id": 84,
|
||||
// 490 "pra_price":"840"
|
||||
//>>491 }
|
||||
|
||||
//for (int i = 1; i < 346; ++i) {
|
||||
//printf("{\n \"pun_id\": %i,\n \"pun_duration\": %d\n},\n",
|
||||
// i, 60 + i*4);
|
||||
//for (int i = 1; i < 85; ++i) {
|
||||
//printf("{\n \"\pra_payment_option_id\": 1049,\n \"\pra_payment_unit_id\": %d,\n \"pra_price\": %d\n},\n",
|
||||
// i, i*10);
|
||||
//}
|
||||
for (int i = 1; i < 361; ++i) {
|
||||
printf("{\n \"pra_payment_option_id\": 1049,\n \"pra_payment_unit_id\": %i,\n \"pra_price\":%i\n},\n",
|
||||
i, i*10);
|
||||
}
|
||||
return 0;
|
||||
//return 0;
|
||||
#if 0
|
||||
MessageHelper msgHelp;
|
||||
// msgHelp.createLoginMessageChunksToSend(0x02);
|
||||
@ -392,20 +340,20 @@ int main() {
|
||||
cout << endl;
|
||||
|
||||
if (isParsed) {
|
||||
//pop_min_time = get_minimal_parkingtime(&cfg);
|
||||
//pop_max_time = get_maximal_parkingtime(&cfg);
|
||||
//pop_min_price = get_minimal_parkingprice(&cfg);
|
||||
//pop_max_price = get_maximal_parkingprice(&cfg);
|
||||
//pop_daily_card_price = cfg.getPaymentOptions().pop_daily_card_price;
|
||||
pop_min_time = get_minimal_parkingtime(&cfg);
|
||||
pop_max_time = get_maximal_parkingtime(&cfg);
|
||||
pop_min_price = get_minimal_parkingprice(&cfg);
|
||||
pop_max_price = get_maximal_parkingprice(&cfg);
|
||||
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;
|
||||
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;
|
||||
|
||||
|
||||
//QList<int> timeSteps = Calculator::GetInstance().GetTimeSteps(&cfg);
|
||||
//qCritical() << "TimeSteps" << timeSteps;
|
||||
QList<int> timeSteps = Calculator::GetInstance().GetTimeSteps(&cfg);
|
||||
qCritical() << "TimeSteps" << timeSteps;
|
||||
|
||||
// return 0;
|
||||
|
||||
@ -416,7 +364,8 @@ int main() {
|
||||
|
||||
// for (int day = Qt::Monday; day <= Qt::Sunday; ++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) {
|
||||
case (int)Qt::Monday:
|
||||
@ -442,30 +391,6 @@ int main() {
|
||||
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(
|
||||
@ -651,8 +576,8 @@ int main() {
|
||||
int pop_max_price;
|
||||
int pop_daily_card_price;
|
||||
|
||||
//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("/home/linux/customer_505/etc/psa_tariff/tariff01.json");
|
||||
//input.open("/opt/ptu5/opt/customer_505/etc/psa_tariff/tariff01.json");
|
||||
|
||||
std::stringstream sstr;
|
||||
while(input >> sstr.rdbuf());
|
||||
@ -664,10 +589,13 @@ int main() {
|
||||
cout << endl;
|
||||
|
||||
if (isParsed) {
|
||||
pop_min_time = get_minimal_parkingtime(&cfg);
|
||||
pop_max_time = get_maximal_parkingtime(&cfg);
|
||||
pop_min_price = get_minimal_parkingprice(&cfg);
|
||||
pop_max_price = get_maximal_parkingprice(&cfg);
|
||||
//PermitType permitType(PERMIT_TYPE::SHORT_TERM_PARKING);
|
||||
PermitType permitType(PERMIT_TYPE::DAY_TICKET_PKW);
|
||||
|
||||
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;
|
||||
@ -725,10 +653,10 @@ int main() {
|
||||
}
|
||||
|
||||
//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);
|
||||
|
||||
qCritical() << "start" << start.toString(Qt::ISODate);
|
||||
// qCritical() << "start" << start.toString(Qt::ISODate);
|
||||
|
||||
QDateTime effectiveStart = start;
|
||||
|
||||
@ -745,8 +673,136 @@ int main() {
|
||||
}
|
||||
|
||||
#if 0
|
||||
PermitType permitType(PERMIT_TYPE::SHORT_TERM_PARKING);
|
||||
for (int i = 200; i <= 200; i += 10) {
|
||||
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);
|
||||
|
||||
//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;
|
||||
|
||||
if ((cs = compute_duration_for_parking_ticket(&cfg, start, cost, end, permitType))) { // return value
|
||||
@ -763,33 +819,14 @@ int main() {
|
||||
|
||||
}
|
||||
#else
|
||||
for (int i = 700; i <= 1400; i += 700) {
|
||||
//for (int i = 2100; i <= 2100; i += 10) {
|
||||
cost = i;
|
||||
|
||||
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) {
|
||||
qCritical() << "";
|
||||
qCritical() << "compute_price_for_parking_ticket";
|
||||
qCritical() << "================================";
|
||||
|
||||
for (int netto_parking_time = 180; netto_parking_time <= (180 + 720*3); netto_parking_time += 720) {
|
||||
QDateTime end;
|
||||
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)
|
||||
<< "price" << price.netto;
|
||||
@ -808,7 +845,7 @@ int main() {
|
||||
int pop_max_price;
|
||||
int pop_daily_card_price;
|
||||
|
||||
int zone = 1;
|
||||
int zone = 3;
|
||||
|
||||
if (zone == 1) {
|
||||
input.open("/opt/ptu5/opt/customer_502/etc/psa_tariff/tariff01.json");
|
||||
@ -897,7 +934,7 @@ int main() {
|
||||
CalcState calcState;
|
||||
QDateTime s(QDateTime::currentDateTime());
|
||||
|
||||
// s.setTime(QTime(12, 0, 0));
|
||||
s.setTime(QTime(12, 0, 0));
|
||||
|
||||
//calcState = compute_duration_for_parking_ticket(&cfg, s,
|
||||
// (double)1200, end, PermitType(PERMIT_TYPE::SHORT_TERM_PARKING_PKW));
|
||||
@ -905,26 +942,9 @@ int main() {
|
||||
//qCritical() << calcState.toString();
|
||||
|
||||
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() << 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) {
|
||||
@ -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
|
||||
#if BAD_NEUENAHR_AHRWEILER==1
|
||||
std::ifstream input;
|
||||
@ -1473,7 +1470,7 @@ int main() {
|
||||
int pop_carry_over;
|
||||
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) {
|
||||
switch (zone) {
|
||||
case 1: {
|
||||
@ -1482,10 +1479,8 @@ int main() {
|
||||
//pop_max_time = 6*60;
|
||||
} break;
|
||||
case 2: {
|
||||
qCritical() << " ZONE 2: KURZZEIT 1";
|
||||
// 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/tariff05.json");
|
||||
input.open("/opt/ptu5/opt/customer_249/etc/psa_tariff/tariff02.json");
|
||||
//pop_max_time = 5*60;
|
||||
} break;
|
||||
case 3: {
|
||||
@ -1526,7 +1521,6 @@ int main() {
|
||||
cout << endl;
|
||||
|
||||
if (isParsed) {
|
||||
|
||||
// test library functions
|
||||
|
||||
if (zone == 1) {
|
||||
@ -1553,10 +1547,10 @@ int main() {
|
||||
static QList<int> const timeSteps = Calculator::GetInstance().GetTimeSteps(&cfg);
|
||||
qCritical() << "TimeSteps" << timeSteps;
|
||||
|
||||
//if (stepsConfigured != timeSteps) {
|
||||
// qCritical() << "TIME-STEPS SHOULD BE" << stepsConfigured;
|
||||
// return -1;
|
||||
//}
|
||||
if (stepsConfigured != timeSteps) {
|
||||
qCritical() << "TIME-STEPS SHOULD BE" << stepsConfigured;
|
||||
return -1;
|
||||
}
|
||||
|
||||
QDateTime start = QDateTime::currentDateTime();
|
||||
|
||||
@ -1564,8 +1558,7 @@ int main() {
|
||||
double price1 = 0;
|
||||
double price2 = 0;
|
||||
|
||||
//for (int m=0; m < 1440; ++m) {
|
||||
for (int m=480; m < 481; ++m) {
|
||||
for (int m=0; m < 1440; ++m) {
|
||||
start.setTime(QTime(0, 0, 0));
|
||||
start = start.addSecs(m*60);
|
||||
|
||||
@ -1582,7 +1575,7 @@ int main() {
|
||||
//}
|
||||
|
||||
CalcState cs;
|
||||
#if 1
|
||||
|
||||
for (int i = 0, j=timeSteps.size() ; i < timeSteps.size(); --j, ++i) {
|
||||
QDateTime end = start.addSecs(timeSteps.at(i)*60);
|
||||
|
||||
@ -1617,21 +1610,6 @@ int main() {
|
||||
// cost[i], false, true);
|
||||
//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
|
||||
if (zone == 2) {
|
||||
@ -1669,20 +1647,18 @@ int main() {
|
||||
bool fail;
|
||||
QDateTime start;
|
||||
|
||||
for (int i=1; i < 2; ++i) {
|
||||
for (int i=0; i < 4; ++i) {
|
||||
switch (i) {
|
||||
case 0:
|
||||
start = QDateTime(QDate(2024, 5, 1), QTime(16, 0, 0)); // holiday
|
||||
fail = false;
|
||||
break;
|
||||
case 1:
|
||||
//start = QDateTime(QDate(2024, 10, 3), QTime(17, 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
|
||||
start = QDateTime(QDate(2024, 4, 21), QTime(16, 0, 0)); // sunday
|
||||
fail = false;
|
||||
break;
|
||||
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;
|
||||
break;
|
||||
case 3:
|
||||
@ -1706,52 +1682,18 @@ int main() {
|
||||
|
||||
QList<int>::const_iterator 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;
|
||||
CalcState cs;
|
||||
|
||||
QDateTime s(start);
|
||||
|
||||
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)))) {
|
||||
if ((cs = compute_price_for_parking_ticket(&cfg, start, *step, end, &price, PermitType(PERMIT_TYPE::SHORT_TERM_PARKING)))) {
|
||||
cost = price.netto;
|
||||
qCritical() << __LINE__
|
||||
<< "START" << start.toString(Qt::ISODate)
|
||||
<< "<duration" << *step
|
||||
<< "cost" << cost
|
||||
<< "> end" << end.toString(Qt::ISODate);
|
||||
qCritical() << "step" << *step << ": cost" << cost;
|
||||
} else {
|
||||
if (fail == false) {
|
||||
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 {
|
||||
qCritical() << "ERROR paymentOptionIndex =" << paymentOptionIndex;
|
||||
@ -2856,62 +2798,24 @@ int main() {
|
||||
bool nextDay = false;
|
||||
bool prePaid = true;
|
||||
// zone 1 (lila)
|
||||
QDateTime s(QDate(2024, 10, 8), QTime());
|
||||
QDateTime s(QDate(2023, 11, 30), QTime());
|
||||
QDateTime end;
|
||||
|
||||
static QList<int> const timeSteps = Calculator::GetInstance().GetTimeSteps(&cfg);
|
||||
qCritical() << "TimeSteps" << timeSteps;
|
||||
|
||||
for (int duration = 30; duration <= pop_max_time; duration += 5) {
|
||||
int offset = 600;
|
||||
//for (int offset = 720; offset < 601; ++offset) {
|
||||
//if (offset > 720 && offset < 840) {
|
||||
// continue;
|
||||
//}
|
||||
for (int offset = 420; offset < 1140; ++offset) {
|
||||
if (offset > 720 && offset < 840) {
|
||||
continue;
|
||||
}
|
||||
QDateTime start = s.addSecs(offset * 60);
|
||||
//qCritical() << "start" << start.toString(Qt::ISODate);
|
||||
|
||||
CalcState cs;
|
||||
#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);
|
||||
double cost = Calculator::GetInstance().GetCostFromDuration(&cfg, 3, start, end, duration, nextDay, prePaid);
|
||||
//Q_ASSERT(cost == duration*2.5);
|
||||
//qCritical() << "";
|
||||
//qCritical() << "start" << start.toString(Qt::ISODate)
|
||||
// << "end" << end.toString(Qt::ISODate)
|
||||
// << "duration" << duration
|
||||
// << "cost" << cost;
|
||||
#if 0
|
||||
qCritical() << "start" << start.toString(Qt::ISODate)
|
||||
<< "end" << end.toString(Qt::ISODate)
|
||||
<< "duration" << duration
|
||||
<< "cost" << cost;
|
||||
|
||||
switch(duration) {
|
||||
case 30:
|
||||
if (cost == 60.0) {
|
||||
@ -3075,17 +2979,15 @@ int main() {
|
||||
<< "cost" << cost;
|
||||
exit(-1);
|
||||
}
|
||||
#endif
|
||||
|
||||
//std::string duration = Calculator::GetInstance().GetDurationFromCost(&cfg, 3, start.toString(Qt::ISODate).toStdString().c_str(), cost);
|
||||
//Q_ASSERT(cost == duration*2.5);
|
||||
//qCritical() << "start" << start.toString(Qt::ISODate)
|
||||
// << "cost" << cost
|
||||
// << "until" << duration.c_str() << start.secsTo(QDateTime::fromString(duration.c_str(), Qt::ISODate)) / 60;
|
||||
//}
|
||||
}
|
||||
}
|
||||
|
||||
#if 0
|
||||
Configuration::SpecialDaysType specialDays = cfg.SpecialDays;
|
||||
for (Configuration::SpecialDaysType::const_iterator it = specialDays.cbegin();
|
||||
it != specialDays.cend(); ++it) {
|
||||
@ -3106,7 +3008,7 @@ int main() {
|
||||
<< "duration" << duration
|
||||
<< "cost" << cost;
|
||||
}
|
||||
#endif
|
||||
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
|
@ -1,5 +1,3 @@
|
||||
QT += core
|
||||
|
||||
TEMPLATE = app
|
||||
TARGET = main
|
||||
|
||||
@ -32,16 +30,9 @@ SOURCES += main.cpp
|
||||
# HEADERS +=
|
||||
|
||||
OTHER_FILES += \
|
||||
/opt/ptu5/opt/customer_335/etc/psa_tariff/tariff01.json \
|
||||
/opt/ptu5/opt/customer_335/etc/psa_tariff/tariff02.json \
|
||||
/opt/ptu5/opt/customer_249/etc/psa_tariff/tariff01.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
|
||||
/opt/ptu5/opt/customer_502/etc/psa_tariff/tariff01.json \
|
||||
/opt/ptu5/opt/customer_502/etc/psa_tariff/tariff02.json \
|
||||
/opt/ptu5/opt/customer_502/etc/psa_tariff/tariff03.json
|
||||
|
||||
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user