Compare commits
2 Commits
4c268e6693
...
moransBran
Author | SHA1 | Date | |
---|---|---|---|
6ea58be34d | |||
8a7828c1e6 |
@@ -1,13 +0,0 @@
|
|||||||
#ifndef ATB_PROJECT_H_INCLUDED
|
|
||||||
#define ATB_PROJECT_H_INCLUDED
|
|
||||||
|
|
||||||
#include <QString>
|
|
||||||
|
|
||||||
class ATBProject {
|
|
||||||
public:
|
|
||||||
QString project;
|
|
||||||
QString version;
|
|
||||||
QString info;
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif // ATB_PROJECT_H_INCLUDED
|
|
@@ -109,7 +109,7 @@ CalcState CALCULATE_LIBRARY_API init_tariff(parking_tariff_t **tariff,
|
|||||||
void CALCULATE_LIBRARY_API free_tariff(parking_tariff_t *tariff);
|
void CALCULATE_LIBRARY_API free_tariff(parking_tariff_t *tariff);
|
||||||
int CALCULATE_LIBRARY_API get_zone_nr(int zone = -1);
|
int CALCULATE_LIBRARY_API get_zone_nr(int zone = -1);
|
||||||
|
|
||||||
CalcState CALCULATE_LIBRARY_API compute_price_for_parking_ticket( // deprecated
|
CalcState CALCULATE_LIBRARY_API compute_price_for_parking_ticket(
|
||||||
parking_tariff_t *tariff,
|
parking_tariff_t *tariff,
|
||||||
time_t start_parking_time,
|
time_t start_parking_time,
|
||||||
time_t end_parking_time,
|
time_t end_parking_time,
|
||||||
@@ -118,11 +118,10 @@ CalcState CALCULATE_LIBRARY_API compute_price_for_parking_ticket( // depre
|
|||||||
CalcState CALCULATE_LIBRARY_API compute_price_for_parking_ticket(
|
CalcState CALCULATE_LIBRARY_API compute_price_for_parking_ticket(
|
||||||
parking_tariff_t *tariff,
|
parking_tariff_t *tariff,
|
||||||
QDateTime const &start_parking_time,
|
QDateTime const &start_parking_time,
|
||||||
int netto_parking_time,
|
QDateTime const &end_parking_time,
|
||||||
QDateTime &end_parking_time, // return value
|
struct price_t *price);
|
||||||
struct price_t *price); // return value
|
|
||||||
|
|
||||||
CalcState CALCULATE_LIBRARY_API compute_duration_for_parking_ticket( // deprecated
|
CalcState CALCULATE_LIBRARY_API compute_duration_for_parking_ticket(
|
||||||
parking_tariff_t *tariff,
|
parking_tariff_t *tariff,
|
||||||
time_t start_parking_time,
|
time_t start_parking_time,
|
||||||
double cost,
|
double cost,
|
||||||
@@ -132,12 +131,17 @@ CalcState CALCULATE_LIBRARY_API compute_duration_for_parking_ticket(
|
|||||||
parking_tariff_t *tariff,
|
parking_tariff_t *tariff,
|
||||||
QDateTime const &start_parking_time,
|
QDateTime const &start_parking_time,
|
||||||
double cost,
|
double cost,
|
||||||
QDateTime &ticketEndTime); // return value
|
QDateTime &ticketEndTime);
|
||||||
|
|
||||||
CalcState CALCULATE_LIBRARY_API compute_duration_for_daily_ticket(
|
CalcState CALCULATE_LIBRARY_API compute_duration_for_daily_ticket(
|
||||||
parking_tariff_t *tariff,
|
parking_tariff_t *tariff,
|
||||||
QDateTime const &start_parking_time,
|
QString const &start_parking_time,
|
||||||
QDateTime &ticketEndTime);
|
uint8_t paymentMethod);
|
||||||
|
|
||||||
|
CalcState CALCULATE_LIBRARY_API compute_duration_for_24hour_daily_ticket(
|
||||||
|
parking_tariff_t *tariff,
|
||||||
|
QString const &start_parking_time,
|
||||||
|
uint8_t paymentMethod);
|
||||||
//#ifdef __cplusplus
|
//#ifdef __cplusplus
|
||||||
//} // extern "C"
|
//} // extern "C"
|
||||||
//#endif
|
//#endif
|
||||||
|
@@ -1,21 +1,12 @@
|
|||||||
#ifndef CALCULATOR_FUNCTIONS_H_INCLUDED
|
#pragma once
|
||||||
#define CALCULATOR_FUNCTIONS_H_INCLUDED
|
|
||||||
|
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <optional>
|
|
||||||
|
|
||||||
#include "configuration.h"
|
#include "configuration.h"
|
||||||
#include "payment_method.h"
|
|
||||||
#include "ticket.h"
|
|
||||||
#include "tariff_time_range.h"
|
|
||||||
|
|
||||||
#include <QDateTime>
|
#include <QDateTime>
|
||||||
using namespace std;
|
using namespace std;
|
||||||
|
|
||||||
class Calculator
|
class Calculator
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets duration in seconds from cost
|
/// Gets duration in seconds from cost
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -32,56 +23,13 @@ public:
|
|||||||
/// <param name="tariff_cfg">Pointer to configuration</param>
|
/// <param name="tariff_cfg">Pointer to configuration</param>
|
||||||
/// <param name="vehicle_type">Type of vehicle</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="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="durationMin">Duration of parking in minutes</param>
|
/// <param name="durationMin">Duration of parking in minutes</param>
|
||||||
/// <returns>Returns cost (data type: double)</returns>
|
/// <returns>Returns cost (data type: double)</returns>
|
||||||
double GetCostFromDuration(Configuration* cfg, uint8_t vehicle_type, const QDateTime start_datetime, QDateTime & end_datetime, int durationMin, bool nextDay = false, bool prepaid = false);
|
double GetCostFromDuration(Configuration* cfg, uint8_t vehicle_type, char const* start_datetime, double durationMin, bool nextDay = false, bool prepaid = false);
|
||||||
|
|
||||||
// Daily ticket
|
// Daily ticket
|
||||||
QDateTime GetDailyTicketDuration(Configuration* cfg, const QDateTime start_datetime, uint8_t payment_option, bool carry_over);
|
QString GetDailyTicketDuration(Configuration* cfg, QString start_datetime, uint8_t payment_option, bool carry_over);
|
||||||
|
|
||||||
//
|
// 24-hour daily ticket
|
||||||
// helper function to find time steps for a tariff with PaymentMethod::Steps
|
QString Get24HourTicketDuration(Configuration* cfg, QString start_datetime, uint8_t payment_option);
|
||||||
// (e.g. Schoenau/Koenigsee)
|
|
||||||
//
|
|
||||||
QList<int> GetTimeSteps(Configuration *cfg) const;
|
|
||||||
|
|
||||||
private:
|
|
||||||
// Introduced for PaymentMethod::Steps (e.g. Schoenau)
|
|
||||||
// For tariff of following structure: only steps, no special days, nonstop.
|
|
||||||
uint32_t GetCostFromDuration(Configuration *cfg, QDateTime const &start, quint64 durationMinutes) const;
|
|
||||||
uint32_t GetCostFromDuration(Configuration *cfg, QDateTime const &start, QDateTime const &end) const;
|
|
||||||
|
|
||||||
PaymentMethod getPaymentMethodId(Configuration const *cfg);
|
|
||||||
int getMinimalParkingTime(Configuration const *cfg, PaymentMethod methodId);
|
|
||||||
int getMaximalParkingTime(Configuration const *cfg, PaymentMethod methodId);
|
|
||||||
uint32_t getMinimalParkingPrice(Configuration const *cfg, PaymentMethod methodId);
|
|
||||||
|
|
||||||
Ticket private_GetCostFromDuration(Configuration const* cfg,
|
|
||||||
QDateTime const &start,
|
|
||||||
int durationMinutes,
|
|
||||||
bool prepaid = false);
|
|
||||||
Ticket private_GetDurationFromCost(Configuration *cfg,
|
|
||||||
QDateTime const &start,
|
|
||||||
uint32_t price,
|
|
||||||
bool prepaid = false);
|
|
||||||
|
|
||||||
bool checkDurationMinutes(int minParkingTime, int maxParkingTime,
|
|
||||||
int durationMinutes);
|
|
||||||
|
|
||||||
//
|
|
||||||
uint32_t GetPriceForTimeStep(Configuration *cfg, int timeStep) const;
|
|
||||||
uint32_t GetDurationForPrice(Configuration *cfg, int price) const;
|
|
||||||
|
|
||||||
int findWorkTimeRange(QDateTime const &dt,
|
|
||||||
QScopedArrayPointer<TariffTimeRange> const &worktime,
|
|
||||||
size_t size);
|
|
||||||
int findNextWorkTimeRange(QDateTime const &dt,
|
|
||||||
QScopedArrayPointer<TariffTimeRange> const &worktime,
|
|
||||||
size_t size);
|
|
||||||
|
|
||||||
uint32_t computeWeekDaysPrice(Configuration const *cfg, PaymentMethod id) const;
|
|
||||||
double computeWeekDaysDurationUnit(Configuration const *cfg, PaymentMethod id) const;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // CALCULATOR_FUNCTIONS_H_INCLUDED
|
|
||||||
|
@@ -20,7 +20,6 @@
|
|||||||
#include "member_type.h"
|
#include "member_type.h"
|
||||||
#include "period_year.h"
|
#include "period_year.h"
|
||||||
#include "payment_rate.h"
|
#include "payment_rate.h"
|
||||||
#include "atb_project.h"
|
|
||||||
|
|
||||||
using namespace std;
|
using namespace std;
|
||||||
using namespace rapidjson;
|
using namespace rapidjson;
|
||||||
@@ -28,7 +27,7 @@ using namespace rapidjson;
|
|||||||
class Configuration
|
class Configuration
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
ATBProject project;
|
|
||||||
ATBCurrency Currency;
|
ATBCurrency Currency;
|
||||||
ATBDuration duration;
|
ATBDuration duration;
|
||||||
|
|
||||||
@@ -49,8 +48,6 @@ public:
|
|||||||
/// <returns>Returns operation status bool (OK | FAIL) </returns>
|
/// <returns>Returns operation status bool (OK | FAIL) </returns>
|
||||||
bool ParseJson(Configuration* cfg, const char* json);
|
bool ParseJson(Configuration* cfg, const char* json);
|
||||||
|
|
||||||
ATBPaymentOption const & getPaymentOptions();
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Identify type of JSON member
|
/// Identify type of JSON member
|
||||||
@@ -58,6 +55,4 @@ private:
|
|||||||
/// <param name="member_name"></param>
|
/// <param name="member_name"></param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
MemberType IdentifyJsonMember(const char* member_name);
|
MemberType IdentifyJsonMember(const char* member_name);
|
||||||
|
|
||||||
ATBPaymentOption currentPaymentOptions;
|
|
||||||
};
|
};
|
||||||
|
@@ -2,12 +2,12 @@
|
|||||||
|
|
||||||
enum DayOfWeek
|
enum DayOfWeek
|
||||||
{
|
{
|
||||||
Monday = 0x01,
|
Saturday = 0x06,
|
||||||
|
Sunday = 0x01,
|
||||||
|
Monday = 0x02,
|
||||||
Tuesday = 0x02,
|
Tuesday = 0x02,
|
||||||
Wednesday = 0x03,
|
Wednesday = 0x03,
|
||||||
Thursday = 0x04,
|
Thursday = 0x04,
|
||||||
Friday = 0x05,
|
Friday = 0x05,
|
||||||
Saturday = 0x06,
|
|
||||||
Sunday = 0x07,
|
|
||||||
UndefinedDay = 0xFF
|
UndefinedDay = 0xFF
|
||||||
};
|
};
|
@@ -1,12 +1,10 @@
|
|||||||
#ifndef PAYMENT_METHOD_H_INCLUDED
|
#pragma once
|
||||||
#define PAYMENT_METHOD_H_INCLUDED
|
|
||||||
|
|
||||||
enum PaymentMethod {
|
enum PaymentMethod
|
||||||
|
{
|
||||||
Undefined = 0xFF,
|
Undefined = 0xFF,
|
||||||
Progressive = 0x01,
|
Progressive = 0x01,
|
||||||
Degressive = 0x02,
|
Degressive = 0x02,
|
||||||
Linear = 0x03,
|
Linear = 0x03,
|
||||||
Steps = 0x04
|
Steps = 0x04
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // PAYMENT_METHOD_H_INCLUDED
|
|
||||||
|
@@ -15,4 +15,5 @@ public:
|
|||||||
double pop_min_price;
|
double pop_min_price;
|
||||||
int pop_carry_over;
|
int pop_carry_over;
|
||||||
int pop_daily_card_price;
|
int pop_daily_card_price;
|
||||||
|
int pop_multi_hour_price;
|
||||||
};
|
};
|
||||||
|
@@ -1,28 +1,17 @@
|
|||||||
|
// #pragma once
|
||||||
#ifndef TARIFF_TIME_RANGE_H_INCLUDED
|
#ifndef TARIFF_TIME_RANGE_H_INCLUDED
|
||||||
#define TARIFF_TIME_RANGE_H_INCLUDED
|
#define TARIFF_TIME_RANGE_H_INCLUDED
|
||||||
|
|
||||||
#include <QTime>
|
#include <ctime>
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Time range definition
|
/// Time range definition
|
||||||
/// </summary>
|
/// </summary>
|
||||||
class TariffTimeRange {
|
class TariffTimeRange {
|
||||||
QTime m_time_from;
|
|
||||||
QTime m_time_until;
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
time_t time_from;
|
||||||
TariffTimeRange()
|
time_t time_to;
|
||||||
: m_time_from(QTime())
|
TariffTimeRange() : time_from(0), time_to(0) {}
|
||||||
, m_time_until(QTime()) {}
|
|
||||||
|
|
||||||
void setTimeRange(QTime const& from, QTime const &until) {
|
|
||||||
m_time_from = from;
|
|
||||||
m_time_until = until;
|
|
||||||
}
|
|
||||||
|
|
||||||
QTime const &getTimeFrom() const { return m_time_from; }
|
|
||||||
QTime const &getTimeUntil() const { return m_time_until; }
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // TARIFF_TIME_RANGE_H_INCLUDED
|
#endif // TARIFF_TIME_RANGE_H_INCLUDED
|
||||||
|
@@ -1,66 +0,0 @@
|
|||||||
#ifndef TICKET_H_INCLUDED
|
|
||||||
#define TICKET_H_INCLUDED
|
|
||||||
|
|
||||||
#include <tuple>
|
|
||||||
#include <vector>
|
|
||||||
|
|
||||||
#include <QDebug>
|
|
||||||
#include <QDebugStateSaver>
|
|
||||||
#include <QStringList>
|
|
||||||
#include <QDateTime>
|
|
||||||
|
|
||||||
#define NOT_INITIALIZED (0)
|
|
||||||
#define VALID (1)
|
|
||||||
#define INVALID_FROM_DATETIME (2)
|
|
||||||
#define INVALID_UNTIL_DATETIME (3)
|
|
||||||
#define INVALID_PRICE (4)
|
|
||||||
#define STATUS_END (5)
|
|
||||||
|
|
||||||
class Ticket {
|
|
||||||
enum {CODE=0, CODE_STR=1, CODE_DESC=3};
|
|
||||||
public:
|
|
||||||
using Status = std::tuple<int, char const*, char const*>;
|
|
||||||
|
|
||||||
explicit Ticket();
|
|
||||||
explicit Ticket(QDateTime const &s, QDateTime const &e,
|
|
||||||
int durationMinutesNetto, int durationMinutesBrutto,
|
|
||||||
uint32_t price, Status status);
|
|
||||||
|
|
||||||
explicit operator bool() { return std::get<CODE>(m_status) == VALID; }
|
|
||||||
operator QString();
|
|
||||||
|
|
||||||
Status getStatus() const;
|
|
||||||
QDateTime getValidFrom() const;
|
|
||||||
QDateTime getValidUntil() const;
|
|
||||||
uint32_t getPrice() const;
|
|
||||||
|
|
||||||
Status setStatus(Status status);
|
|
||||||
void setValidFrom(QDateTime const &validFrom);
|
|
||||||
void setValidUntil(QDateTime const &validUnil);
|
|
||||||
void setPrice(uint32_t price);
|
|
||||||
|
|
||||||
bool isValid() { return operator bool(); }
|
|
||||||
|
|
||||||
static constexpr const Status s[STATUS_END] = {
|
|
||||||
{NOT_INITIALIZED , "NOT_INITIALIZED" , "Ticket not initialized" },
|
|
||||||
{VALID , "VALID" , "Ticket is valid" },
|
|
||||||
{INVALID_FROM_DATETIME , "INVALID_FROM_DATETIME" , "Ticket has invalid start datetime"},
|
|
||||||
{INVALID_UNTIL_DATETIME, "INVALID_UNTIL_DATETIME", "Ticket has invalid end datetime" },
|
|
||||||
{INVALID_PRICE , "INVALID_PRICE" , "PARKING NOT ALLOWED: Ticket has invalid price" }
|
|
||||||
};
|
|
||||||
|
|
||||||
private:
|
|
||||||
Status m_status;
|
|
||||||
|
|
||||||
QDateTime m_validFrom;
|
|
||||||
QDateTime m_validUntil;
|
|
||||||
|
|
||||||
int m_durationMinutesNetto;
|
|
||||||
int m_durationMinutesBrutto;
|
|
||||||
|
|
||||||
uint32_t m_price;
|
|
||||||
};
|
|
||||||
|
|
||||||
QDebug operator<<(QDebug debug, Ticket::Status const &status);
|
|
||||||
|
|
||||||
#endif // TICKET_H_INCLUDED
|
|
@@ -8,48 +8,47 @@
|
|||||||
#include "day_of_week.h"
|
#include "day_of_week.h"
|
||||||
#include "configuration.h"
|
#include "configuration.h"
|
||||||
#include "time_range.h"
|
#include "time_range.h"
|
||||||
#include "payment_method.h"
|
|
||||||
|
|
||||||
#include <QDateTime>
|
|
||||||
|
|
||||||
using namespace std;
|
using namespace std;
|
||||||
|
|
||||||
namespace Utilities {
|
class Utilities {
|
||||||
|
public:
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Get day of week from current date (Zeller's Algorithm), starting day is Sunday
|
/// Get day of week from current date (Zeller's Algorithm), starting day is Sunday
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="date"></param>
|
/// <param name="date"></param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
DayOfWeek GetDayOfWeek(struct tm* tm);
|
static DayOfWeek GetDayOfWeek(struct tm* tm);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Date and time parse helper function
|
/// Date and time parse helper function
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <returns>Returns time (tm) structure</returns>
|
/// <returns>Returns time (tm) structure</returns>
|
||||||
struct tm DateTimeToStructTm(const char* dateTimeStr);
|
static struct tm DateTimeToStructTm(const char* dateTimeStr);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Date parse helper function
|
/// Date parse helper function
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <returns>Returns time (tm) structure</returns>
|
/// <returns>Returns time (tm) structure</returns>
|
||||||
struct tm DateToStructTm(const char* dateStr);
|
static struct tm DateToStructTm(const char* dateStr);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Time parse helper function
|
/// Time parse helper function
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <returns>Returns time (tm) structure</returns>
|
/// <returns>Returns time (tm) structure</returns>
|
||||||
struct tm TimeToStructTm(const char* timeStr, int year, int mon, int mday, int wday);
|
static struct tm TimeToStructTm(const char* timeStr, int year, int mon, int mday, int wday);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Get current local time
|
/// Get current local time
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <returns>Returns time_t structure</returns>
|
/// <returns>Returns time_t structure</returns>
|
||||||
time_t GetCurrentLocalTime();
|
static time_t GetCurrentLocalTime();
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Zeller's algorithm for determining day of week
|
/// Zeller's algorithm for determining day of week
|
||||||
/// </summary>
|
/// </summary>
|
||||||
int ZellersAlgorithm(int day, int month, int year);
|
static int ZellersAlgorithm(int day, int month, int year);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Checks if current datetime is in range between start and end month of parking worktime
|
/// Checks if current datetime is in range between start and end month of parking worktime
|
||||||
@@ -57,29 +56,18 @@ namespace Utilities {
|
|||||||
/// <param name="tariff_cfg"></param>
|
/// <param name="tariff_cfg"></param>
|
||||||
/// <param name="currentDateTime"></param>
|
/// <param name="currentDateTime"></param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
bool IsYearPeriodActive(Configuration* cfg, struct tm* currentDateTime);
|
static bool IsYearPeriodActive(Configuration* cfg, struct tm* currentDateTime);
|
||||||
bool IsYearPeriodActive(Configuration const *cfg, QDateTime const ¤tDateTime);
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Check permissions
|
/// Check permissions
|
||||||
/// </summary>
|
/// </summary>
|
||||||
bool CheckSpecialDay(Configuration* cfg, const char* currentDateTimeStr, int* specialDayId, double* specialDayPrice);
|
static bool CheckSpecialDay(Configuration* cfg, const char* currentDateTimeStr, int* specialDayId, double* specialDayPrice);
|
||||||
bool CheckSpecialDay(Configuration const *cfg,
|
|
||||||
QDateTime const ¤tDateTimeS,
|
|
||||||
int* specialDayId, uint32_t *specialDayPrice);
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Calculates price per unit
|
/// Calculates price per unit
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="pra_price"></param>
|
/// <param name="pra_price"></param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
double CalculatePricePerUnit(double pra_price, double durationUnit = -1);
|
static double CalculatePricePerUnit(double pra_price, double durationUnit = -1);
|
||||||
|
|
||||||
QTime SpecialDaysWorkTimeFrom(Configuration const *cfg, int specialDayId);
|
};
|
||||||
QTime SpecialDaysWorkTimeUntil(Configuration const *cfg, int specialDayId);
|
|
||||||
QTime WeekDaysWorkTimeFrom(std::multimap<int, ATBWeekDaysWorktime>::const_iterator itr);
|
|
||||||
QTime WeekDaysWorkTimeUntil(std::multimap<int, ATBWeekDaysWorktime>::const_iterator itr);
|
|
||||||
bool isCarryOverSet(Configuration const *cfg, PaymentMethod paymentMethodId);
|
|
||||||
bool isCarryOverNotSet(Configuration const *cfg, PaymentMethod paymentMethodId);
|
|
||||||
PaymentMethod getPaymentMethodId(Configuration const *cfg);
|
|
||||||
}
|
|
||||||
|
@@ -25,8 +25,7 @@ SOURCES += \
|
|||||||
src/utilities.cpp \
|
src/utilities.cpp \
|
||||||
src/configuration.cpp \
|
src/configuration.cpp \
|
||||||
src/tariff_log.cpp \
|
src/tariff_log.cpp \
|
||||||
src/calculate_price.cpp \
|
src/calculate_price.cpp
|
||||||
src/ticket.cpp
|
|
||||||
|
|
||||||
HEADERS += \
|
HEADERS += \
|
||||||
include/mobilisis/calculator_functions.h \
|
include/mobilisis/calculator_functions.h \
|
||||||
@@ -66,9 +65,7 @@ HEADERS += \
|
|||||||
include/mobilisis/tariff_period_year.h \
|
include/mobilisis/tariff_period_year.h \
|
||||||
include/mobilisis/tariff_payment_rate.h \
|
include/mobilisis/tariff_payment_rate.h \
|
||||||
include/mobilisis/tariff_log.h \
|
include/mobilisis/tariff_log.h \
|
||||||
include/mobilisis/calculate_price.h \
|
include/mobilisis/calculate_price.h
|
||||||
include/mobilisis/atb_project.h \
|
|
||||||
include/mobilisis/ticket.h
|
|
||||||
|
|
||||||
OTHER_FILES += src/main.cpp
|
OTHER_FILES += src/main.cpp
|
||||||
|
|
||||||
|
@@ -92,16 +92,14 @@ void CALCULATE_LIBRARY_API free_tariff(parking_tariff_t *tariff) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// this is currently not used
|
|
||||||
CalcState CALCULATE_LIBRARY_API compute_price_for_parking_ticket(
|
CalcState CALCULATE_LIBRARY_API compute_price_for_parking_ticket(
|
||||||
parking_tariff_t *tariff,
|
parking_tariff_t *tariff,
|
||||||
time_t start_parking_time, // in minutes
|
time_t start_parking_time, // in minutes
|
||||||
time_t end_parking_time, // netto time in minutes
|
time_t end_parking_time, // in minutes
|
||||||
struct price_t *price) {
|
struct price_t *price) {
|
||||||
CalcState calcState;
|
CalcState calcState;
|
||||||
double minMin = tariff->PaymentOption.find(tariff->getPaymentOptions().pop_payment_method_id)->second.pop_min_time;
|
double minMin = tariff->PaymentOption.find(PaymentOption::Option1)->second.pop_min_time;
|
||||||
double maxMin = tariff->PaymentOption.find(tariff->getPaymentOptions().pop_payment_method_id)->second.pop_max_time;
|
double maxMin = tariff->PaymentOption.find(PaymentOption::Option1)->second.pop_max_time;
|
||||||
|
|
||||||
if (minMin < 0 || maxMin < 0 || maxMin < minMin) {
|
if (minMin < 0 || maxMin < 0 || maxMin < minMin) {
|
||||||
calcState.setDesc(QString("minMin=%1, maxMin=%2").arg(minMin).arg(maxMin));
|
calcState.setDesc(QString("minMin=%1, maxMin=%2").arg(minMin).arg(maxMin));
|
||||||
@@ -131,15 +129,13 @@ CalcState CALCULATE_LIBRARY_API compute_price_for_parking_ticket(
|
|||||||
QTime const t(0, 0, 0);
|
QTime const t(0, 0, 0);
|
||||||
QDateTime start(d, t, Qt::UTC);
|
QDateTime start(d, t, Qt::UTC);
|
||||||
start = start.toLocalTime().addSecs(start_parking_time * 60);
|
start = start.toLocalTime().addSecs(start_parking_time * 60);
|
||||||
QDateTime end(start);
|
|
||||||
if (start.isValid()) {
|
if (start.isValid()) {
|
||||||
|
QString cs = start.toString(Qt::ISODate);
|
||||||
double cost = calculator.GetCostFromDuration(
|
double cost = calculator.GetCostFromDuration(
|
||||||
tariff,
|
tariff, PaymentOption::Option1,
|
||||||
tariff->getPaymentOptions().pop_payment_method_id,
|
cs.toLocal8Bit().constData(),
|
||||||
start,
|
|
||||||
end,
|
|
||||||
duration, false, true);
|
duration, false, true);
|
||||||
double minCost = tariff->PaymentOption.find(tariff->getPaymentOptions().pop_payment_method_id)->second.pop_min_price;
|
double minCost = tariff->PaymentOption.find(PaymentOption::Option1)->second.pop_min_price;
|
||||||
if (cost < minCost) {
|
if (cost < minCost) {
|
||||||
calcState.setDesc(QString("minCost=%1, cost=%2").arg(minCost).arg(cost));
|
calcState.setDesc(QString("minCost=%1, cost=%2").arg(minCost).arg(cost));
|
||||||
return calcState.set(CalcState::State::BELOW_MIN_PARKING_PRICE);
|
return calcState.set(CalcState::State::BELOW_MIN_PARKING_PRICE);
|
||||||
@@ -156,50 +152,49 @@ CalcState CALCULATE_LIBRARY_API compute_price_for_parking_ticket(
|
|||||||
CalcState CALCULATE_LIBRARY_API compute_price_for_parking_ticket(
|
CalcState CALCULATE_LIBRARY_API compute_price_for_parking_ticket(
|
||||||
parking_tariff_t *tariff,
|
parking_tariff_t *tariff,
|
||||||
QDateTime const &start_parking_time,
|
QDateTime const &start_parking_time,
|
||||||
int netto_parking_time,
|
QDateTime const &end_parking_time,
|
||||||
QDateTime &end_parking_time,
|
struct price_t *price) {
|
||||||
struct price_t *price)
|
|
||||||
{
|
|
||||||
CalcState calcState;
|
CalcState calcState;
|
||||||
double minMin = tariff->getPaymentOptions().pop_min_time;
|
double minMin = tariff->PaymentOption.find(PaymentOption::Option1)->second.pop_min_time;
|
||||||
double maxMin = tariff->getPaymentOptions().pop_max_time;
|
double maxMin = tariff->PaymentOption.find(PaymentOption::Option1)->second.pop_max_time;
|
||||||
|
|
||||||
// DEBUG
|
// DEBUG
|
||||||
qCritical() << "compute_price_for_parking_ticket() " << endl
|
qCritical() << "compute_price_for_parking_ticket() " << endl
|
||||||
<< " start_parking_time: " << start_parking_time << endl
|
<< " start_parking_time: " << start_parking_time << endl
|
||||||
<< " netto_parking_time: " << netto_parking_time << endl
|
<< " end_parking_time: " << end_parking_time << endl
|
||||||
<< " minMin: " << minMin << endl
|
<< " minMin: " << minMin << endl
|
||||||
<< " maxMin: " << maxMin;
|
<< " maxMin: " << maxMin;
|
||||||
|
|
||||||
|
|
||||||
if (netto_parking_time < 0) {
|
int const duration = (end_parking_time.toSecsSinceEpoch() -
|
||||||
|
start_parking_time.toSecsSinceEpoch()) / 60;
|
||||||
|
|
||||||
|
if (duration < 0) {
|
||||||
calcState.setDesc(QString("end=%1, start=%2")
|
calcState.setDesc(QString("end=%1, start=%2")
|
||||||
.arg(end_parking_time.toString(Qt::ISODate),
|
.arg(end_parking_time.toString(Qt::ISODate),
|
||||||
start_parking_time.toString(Qt::ISODate)));
|
start_parking_time.toString(Qt::ISODate)));
|
||||||
return calcState.set(CalcState::State::NEGATIVE_PARING_TIME);
|
return calcState.set(CalcState::State::NEGATIVE_PARING_TIME);
|
||||||
}
|
}
|
||||||
if (netto_parking_time > maxMin) {
|
if (duration > maxMin) {
|
||||||
calcState.setDesc(QString("duration=%1, maxMin=%2").arg(netto_parking_time).arg(maxMin));
|
calcState.setDesc(QString("duration=%1, maxMin=%2").arg(duration, maxMin));
|
||||||
return calcState.set(CalcState::State::ABOVE_MAX_PARKING_TIME);
|
return calcState.set(CalcState::State::ABOVE_MAX_PARKING_TIME);
|
||||||
}
|
}
|
||||||
if (netto_parking_time < minMin) {
|
if (duration < minMin) {
|
||||||
calcState.setDesc(QString("duration=%1, minMin=%2").arg(netto_parking_time).arg(minMin));
|
calcState.setDesc(QString("duration=%1, minMin=%2").arg(duration, minMin));
|
||||||
return calcState.set(CalcState::State::BELOW_MIN_PARKING_TIME);
|
return calcState.set(CalcState::State::BELOW_MIN_PARKING_TIME);
|
||||||
}
|
}
|
||||||
if (netto_parking_time == 0) {
|
if (duration == 0) {
|
||||||
memset(price, 0x00, sizeof(*price));
|
memset(price, 0x00, sizeof(*price));
|
||||||
return calcState.set(CalcState::State::SUCCESS);
|
return calcState.set(CalcState::State::SUCCESS);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (start_parking_time.isValid()) {
|
if (start_parking_time.isValid()) {
|
||||||
|
QString cs = start_parking_time.toString(Qt::ISODate);
|
||||||
double cost = calculator.GetCostFromDuration(
|
double cost = calculator.GetCostFromDuration(
|
||||||
tariff,
|
tariff, PaymentOption::Option1,
|
||||||
tariff->getPaymentOptions().pop_payment_method_id,
|
cs.toLocal8Bit().constData(),
|
||||||
start_parking_time, // starting time
|
duration, false, true);
|
||||||
end_parking_time, // return value: end time
|
double minCost = tariff->PaymentOption.find(PaymentOption::Option1)->second.pop_min_price;
|
||||||
netto_parking_time, // minutes, netto
|
|
||||||
false, true);
|
|
||||||
double minCost = tariff->getPaymentOptions().pop_min_price;
|
|
||||||
if (cost < minCost) {
|
if (cost < minCost) {
|
||||||
calcState.setDesc(QString("minCost=%1, cost=%2").arg(minCost, cost));
|
calcState.setDesc(QString("minCost=%1, cost=%2").arg(minCost, cost));
|
||||||
return calcState.set(CalcState::State::BELOW_MIN_PARKING_PRICE);
|
return calcState.set(CalcState::State::BELOW_MIN_PARKING_PRICE);
|
||||||
@@ -235,11 +230,10 @@ CalcState CALCULATE_LIBRARY_API compute_duration_for_parking_ticket(
|
|||||||
qCritical() << " start (cs): " << cs;
|
qCritical() << " start (cs): " << cs;
|
||||||
qCritical() << " price: " << price;
|
qCritical() << " price: " << price;
|
||||||
|
|
||||||
duration = calculator.GetDurationFromCost(tariff,
|
duration = calculator.GetDurationFromCost(tariff, PaymentOption::Option1,
|
||||||
tariff->getPaymentOptions().pop_payment_method_id,
|
|
||||||
cs.toLocal8Bit().constData(),
|
cs.toLocal8Bit().constData(),
|
||||||
price, false, true).c_str();
|
price, false, true).c_str();
|
||||||
QDateTime d = QDateTime::fromString(duration, Qt::ISODate);
|
QDateTime d = QDateTime::fromString(duration);
|
||||||
if (!d.isValid()) {
|
if (!d.isValid()) {
|
||||||
calcState.setDesc(QString("ticketEndTime=%1").arg(duration));
|
calcState.setDesc(QString("ticketEndTime=%1").arg(duration));
|
||||||
return calcState.set(CalcState::State::WRONG_ISO_TIME_FORMAT);
|
return calcState.set(CalcState::State::WRONG_ISO_TIME_FORMAT);
|
||||||
@@ -255,14 +249,12 @@ CalcState CALCULATE_LIBRARY_API compute_duration_for_parking_ticket(
|
|||||||
parking_tariff_t *tariff,
|
parking_tariff_t *tariff,
|
||||||
QDateTime const &start_parking_time,
|
QDateTime const &start_parking_time,
|
||||||
double price,
|
double price,
|
||||||
QDateTime &ticketEndTime)
|
QDateTime &ticketEndTime) {
|
||||||
{
|
|
||||||
CalcState calcState;
|
CalcState calcState;
|
||||||
if (start_parking_time.isValid()) {
|
if (start_parking_time.isValid()) {
|
||||||
QString cs = start_parking_time.toString(Qt::ISODate);
|
QString cs = start_parking_time.toString(Qt::ISODate);
|
||||||
QString endTime = calculator.GetDurationFromCost(
|
QString endTime = calculator.GetDurationFromCost(
|
||||||
tariff,
|
tariff, PaymentOption::Option1,
|
||||||
tariff->getPaymentOptions().pop_payment_method_id,
|
|
||||||
cs.toLocal8Bit().constData(),
|
cs.toLocal8Bit().constData(),
|
||||||
price, false, true).c_str();
|
price, false, true).c_str();
|
||||||
ticketEndTime = QDateTime::fromString(endTime,Qt::ISODate);
|
ticketEndTime = QDateTime::fromString(endTime,Qt::ISODate);
|
||||||
@@ -283,28 +275,20 @@ CalcState CALCULATE_LIBRARY_API compute_duration_for_parking_ticket(
|
|||||||
return calcState.set(CalcState::State::SUCCESS);
|
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 CALCULATE_LIBRARY_API compute_duration_for_daily_ticket(parking_tariff_t *tariff, QString const &start_parking_time,uint8_t paymentMethod)
|
||||||
{
|
{
|
||||||
CalcState calcState;
|
CalcState calcState;
|
||||||
if (start_parking_time.isValid()) {
|
QString result = calculator.GetDailyTicketDuration(tariff, start_parking_time, PaymentOption::Option1,false);
|
||||||
|
qDebug() << "DailyTicket() => " + result;
|
||||||
ticketEndTime = calculator.GetDailyTicketDuration(tariff,
|
|
||||||
start_parking_time,
|
return calcState.set(CalcState::State::SUCCESS);
|
||||||
tariff->getPaymentOptions().pop_payment_method_id,
|
}
|
||||||
false); // carry over
|
|
||||||
|
CalcState CALCULATE_LIBRARY_API compute_duration_for_24hour_daily_ticket(parking_tariff_t *tariff, QString const &start_parking_time,uint8_t paymentMethod)
|
||||||
// DEBUG
|
{
|
||||||
qCritical() << "compute_duration_for_daily_ticket(): ";
|
CalcState calcState;
|
||||||
qCritical() << " ticketEndTime: " << ticketEndTime;
|
QString result = calculator.Get24HourTicketDuration(tariff, start_parking_time, PaymentOption::Option1,false);
|
||||||
|
qDebug() << "24HourDailyTicket() => " + result;
|
||||||
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);
|
return calcState.set(CalcState::State::SUCCESS);
|
||||||
}
|
}
|
||||||
|
@@ -1,19 +1,16 @@
|
|||||||
#include "calculator_functions.h"
|
#include "calculator_functions.h"
|
||||||
#include "payment_option.h"
|
#include "payment_method.h"
|
||||||
#include "utilities.h"
|
#include "utilities.h"
|
||||||
#include "tariff_log.h"
|
#include "tariff_log.h"
|
||||||
#include "tariff_time_range.h"
|
|
||||||
#include "ticket.h"
|
|
||||||
|
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
#include <algorithm>
|
|
||||||
#include <QDateTime>
|
#include <QDateTime>
|
||||||
#include <QScopedArrayPointer>
|
#include <qdebug.h>
|
||||||
#include <QDebug>
|
|
||||||
|
|
||||||
double total_duration_min = 0.0f;
|
double total_duration_min = 0.0f;
|
||||||
double total_cost = 0.0f;
|
double total_cost = 0.0f;
|
||||||
bool overtime = false;
|
bool overtime = false;
|
||||||
|
int protection_counter = 0;
|
||||||
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
inline struct tm* localtime_r(const time_t *clock, struct tm* result){
|
inline struct tm* localtime_r(const time_t *clock, struct tm* result){
|
||||||
@@ -23,25 +20,55 @@ inline struct tm* localtime_r(const time_t *clock, struct tm* result){
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
QDateTime Calculator::GetDailyTicketDuration(Configuration* cfg, const QDateTime start_datetime, uint8_t payment_option, bool carry_over)
|
QString Calculator::Get24HourTicketDuration(Configuration *cfg, QString start_datetime, uint8_t payment_option)
|
||||||
{
|
{
|
||||||
if(!start_datetime.isValid()) {
|
if(start_datetime.isNull() || start_datetime.isEmpty()) return "Invalid date-time";
|
||||||
return QDateTime();
|
protection_counter = 0;
|
||||||
}
|
|
||||||
|
|
||||||
double day_price = 0.0f;
|
double day_price = 0.0f;
|
||||||
int current_special_day_id = -1;
|
int current_special_day_id = -1;
|
||||||
bool is_special_day = Utilities::CheckSpecialDay(cfg, start_datetime.toString(Qt::ISODate).toStdString().c_str(), ¤t_special_day_id, &day_price);
|
|
||||||
|
|
||||||
QDateTime inputDateTime = start_datetime;
|
QDateTime inputDateTime = QDateTime::fromString(start_datetime, Qt::ISODate);
|
||||||
|
QTime worktime_from;
|
||||||
|
QTime worktime_to;
|
||||||
|
|
||||||
|
int daily_24hour_card_price = cfg->PaymentOption.find(payment_option)->second.pop_multi_hour_price;
|
||||||
|
if(daily_24hour_card_price <= 0) return "24-hour daily ticket: price zero or less";
|
||||||
|
|
||||||
|
bool is_special_day = Utilities::CheckSpecialDay(cfg, start_datetime.toStdString().c_str(), ¤t_special_day_id, &day_price);
|
||||||
|
|
||||||
|
if(is_special_day)
|
||||||
|
{
|
||||||
|
worktime_from = QTime::fromString(cfg->SpecialDaysWorktime.find(current_special_day_id)->second.pedwt_time_from.c_str(), Qt::ISODate);
|
||||||
|
worktime_to = QTime::fromString(cfg->SpecialDaysWorktime.find(current_special_day_id)->second.pedwt_time_to.c_str(),Qt::ISODate);
|
||||||
|
return "24-hour ticket cannot be bought on special day";
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check next special day
|
||||||
|
inputDateTime = inputDateTime.addSecs(86400);
|
||||||
|
while(Utilities::CheckSpecialDay(cfg, inputDateTime.toString(Qt::ISODate).toLocal8Bit(), ¤t_special_day_id, &day_price))
|
||||||
|
{
|
||||||
|
protection_counter++;
|
||||||
|
if(protection_counter >=7) return NULL;
|
||||||
|
inputDateTime = inputDateTime.addSecs(86400);
|
||||||
|
}
|
||||||
|
return inputDateTime.toString(Qt::ISODate) + ", price = " + to_string(daily_24hour_card_price).c_str();
|
||||||
|
}
|
||||||
|
|
||||||
|
QString Calculator::GetDailyTicketDuration(Configuration* cfg, QString start_datetime, uint8_t payment_option, bool carry_over)
|
||||||
|
{
|
||||||
|
if(start_datetime.isNull() || start_datetime.isEmpty()) return NULL;
|
||||||
|
|
||||||
|
double day_price = 0.0f;
|
||||||
|
int current_special_day_id = -1;
|
||||||
|
bool is_special_day = Utilities::CheckSpecialDay(cfg, start_datetime.toStdString().c_str(), ¤t_special_day_id, &day_price);
|
||||||
|
|
||||||
|
QDateTime inputDateTime = QDateTime::fromString(start_datetime, Qt::ISODate);
|
||||||
QTime worktime_from;
|
QTime worktime_from;
|
||||||
QTime worktime_to;
|
QTime worktime_to;
|
||||||
|
|
||||||
int daily_card_price = cfg->PaymentOption.find(payment_option)->second.pop_daily_card_price;
|
int daily_card_price = cfg->PaymentOption.find(payment_option)->second.pop_daily_card_price;
|
||||||
if(daily_card_price <= 0) {
|
if(daily_card_price <= 0) return "Daily ticket price zero or less";
|
||||||
LOG_ERROR("Calculator::GetDailyTicketDuration(): Daily ticket price zero or less");
|
|
||||||
return QDateTime();
|
|
||||||
}
|
|
||||||
|
|
||||||
if(is_special_day)
|
if(is_special_day)
|
||||||
{
|
{
|
||||||
@@ -55,21 +82,21 @@ QDateTime Calculator::GetDailyTicketDuration(Configuration* cfg, const QDateTime
|
|||||||
{
|
{
|
||||||
// Go to next day if outside worktime
|
// Go to next day if outside worktime
|
||||||
inputDateTime = inputDateTime.addSecs(86400);
|
inputDateTime = inputDateTime.addSecs(86400);
|
||||||
return GetDailyTicketDuration(cfg,inputDateTime, payment_option,true);
|
return GetDailyTicketDuration(cfg,inputDateTime.toString(Qt::ISODate), payment_option,true);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(day_price <=0)
|
if(day_price <=0)
|
||||||
{
|
{
|
||||||
// Go to next day if special day price is 0
|
// Go to next day if special day price is 0
|
||||||
inputDateTime = inputDateTime.addSecs(86400);
|
inputDateTime = inputDateTime.addSecs(86400);
|
||||||
return GetDailyTicketDuration(cfg,inputDateTime, payment_option,true);
|
return GetDailyTicketDuration(cfg,inputDateTime.toString(Qt::ISODate), payment_option,true);
|
||||||
}
|
}
|
||||||
|
|
||||||
int diff = abs(inputDateTime.time().secsTo(worktime_to));
|
int diff = abs(inputDateTime.time().secsTo(worktime_to));
|
||||||
inputDateTime = inputDateTime.addSecs(diff);
|
inputDateTime = inputDateTime.addSecs(diff);
|
||||||
|
|
||||||
//qDebug() << "Ticket is valid until: " << inputDateTime.toString(Qt::ISODate) << "price = " << daily_card_price << ", duration = " << diff / 60;
|
//qDebug() << "Ticket is valid until: " << inputDateTime.toString(Qt::ISODate) << "price = " << daily_card_price << ", duration = " << diff / 60;
|
||||||
return inputDateTime;
|
return inputDateTime.toString(Qt::ISODate) + ", price = " + to_string(daily_card_price).c_str() + ", duration = " + to_string((diff/60)).c_str();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -85,7 +112,7 @@ QDateTime Calculator::GetDailyTicketDuration(Configuration* cfg, const QDateTime
|
|||||||
if(found <=0)
|
if(found <=0)
|
||||||
{
|
{
|
||||||
inputDateTime = inputDateTime.addSecs(86400);
|
inputDateTime = inputDateTime.addSecs(86400);
|
||||||
return GetDailyTicketDuration(cfg,inputDateTime, payment_option,true);
|
return GetDailyTicketDuration(cfg,inputDateTime.toString(Qt::ISODate), payment_option,true);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -101,18 +128,18 @@ QDateTime Calculator::GetDailyTicketDuration(Configuration* cfg, const QDateTime
|
|||||||
{
|
{
|
||||||
// Go to next day if outside worktime
|
// Go to next day if outside worktime
|
||||||
inputDateTime = inputDateTime.addSecs(86400);
|
inputDateTime = inputDateTime.addSecs(86400);
|
||||||
return GetDailyTicketDuration(cfg,inputDateTime, payment_option,true);
|
return GetDailyTicketDuration(cfg,inputDateTime.toString(Qt::ISODate), payment_option,true);
|
||||||
}
|
}
|
||||||
|
|
||||||
int diff = abs(inputDateTime.time().secsTo(worktime_to));
|
int diff = abs(inputDateTime.time().secsTo(worktime_to));
|
||||||
inputDateTime = inputDateTime.addSecs(diff);
|
inputDateTime = inputDateTime.addSecs(diff);
|
||||||
|
|
||||||
//qDebug() << "Ticket is valid until: " << inputDateTime.toString(Qt::ISODate) << "price = " << daily_card_price << ", duration = " << diff / 60;
|
//qDebug() << "Ticket is valid until: " << inputDateTime.toString(Qt::ISODate) << "price = " << daily_card_price << ", duration = " << diff / 60;
|
||||||
return inputDateTime;
|
return inputDateTime.toString(Qt::ISODate) + ", price = " + to_string(daily_card_price).c_str() + ", duration = " + to_string((diff/60)).c_str();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return QDateTime();
|
return NULL;
|
||||||
}
|
}
|
||||||
/// <inheritdoc/>
|
/// <inheritdoc/>
|
||||||
std::string Calculator::GetDurationFromCost(Configuration* cfg,
|
std::string Calculator::GetDurationFromCost(Configuration* cfg,
|
||||||
@@ -126,31 +153,19 @@ std::string Calculator::GetDurationFromCost(Configuration* cfg,
|
|||||||
// Get input date
|
// Get input date
|
||||||
QDateTime inputDate = QDateTime::fromString(start_datetime,Qt::ISODate);
|
QDateTime inputDate = QDateTime::fromString(start_datetime,Qt::ISODate);
|
||||||
|
|
||||||
// use tariff with structure as for instance Schnau, Koenigsee:
|
|
||||||
// without given YearPeriod, SpecialDays and SpecialDaysWorktime
|
|
||||||
if (cfg->YearPeriod.size() == 0
|
|
||||||
&& cfg->SpecialDays.size() == 0
|
|
||||||
&& cfg->SpecialDaysWorktime.size() == 0)
|
|
||||||
{
|
|
||||||
inputDate = inputDate.addSecs(GetDurationForPrice(cfg, price) * 60);
|
|
||||||
|
|
||||||
return inputDate.toString(Qt::ISODate).toStdString();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Get day of week
|
// Get day of week
|
||||||
int weekdayId = 0;
|
int weekdayId = 0;
|
||||||
weekdayId = Utilities::ZellersAlgorithm(inputDate.date().day(),inputDate.date().month(),inputDate.date().year());
|
weekdayId = Utilities::ZellersAlgorithm(inputDate.date().day(),inputDate.date().month(),inputDate.date().year());
|
||||||
|
|
||||||
//Get min and max time defined in JSON
|
//Get min and max time defined in JSON
|
||||||
double minMin = 0;
|
double minMin = 0;
|
||||||
minMin = cfg->getPaymentOptions().pop_min_time;
|
minMin = cfg->PaymentOption.find(payment_option)->second.pop_min_time;
|
||||||
|
|
||||||
double maxMin = 0;
|
double maxMin = 0;
|
||||||
maxMin = cfg->getPaymentOptions().pop_max_time;
|
maxMin = cfg->PaymentOption.find(payment_option)->second.pop_max_time;
|
||||||
|
|
||||||
double min_price = 0;
|
double min_price = 0;
|
||||||
min_price = cfg->getPaymentOptions().pop_min_price;
|
min_price = cfg->PaymentOption.find(payment_option)->second.pop_min_price;
|
||||||
|
|
||||||
if(price < min_price)
|
if(price < min_price)
|
||||||
{
|
{
|
||||||
@@ -223,9 +238,19 @@ std::string Calculator::GetDurationFromCost(Configuration* cfg,
|
|||||||
|
|
||||||
if (price_per_unit < 0) price_per_unit = 1.0f;
|
if (price_per_unit < 0) price_per_unit = 1.0f;
|
||||||
|
|
||||||
// if((price/price_per_unit) < minMin) return "PARKING NOT ALLOWED";
|
// Commented on 07.06.2023
|
||||||
|
//if((price/price_per_unit) < minMin)
|
||||||
|
// return "PARKING NOT ALLOWED";
|
||||||
|
|
||||||
LOG_DEBUG("Calculated price per minute: ", price_per_unit);
|
LOG_DEBUG("Calculated price per minute: ", price_per_unit);
|
||||||
|
|
||||||
|
if (price_per_unit < 0)
|
||||||
|
{
|
||||||
|
inputDate = inputDate.addDays(1);
|
||||||
|
inputDate.setTime(worktime_from);
|
||||||
|
return GetDurationFromCost(cfg, payment_option, inputDate.toString(Qt::ISODate).toStdString().c_str(), money_left, true);
|
||||||
|
}
|
||||||
|
|
||||||
// If overtime flag is set
|
// If overtime flag is set
|
||||||
if (overtime || nextDay)
|
if (overtime || nextDay)
|
||||||
{
|
{
|
||||||
@@ -329,15 +354,15 @@ std::string Calculator::GetDurationFromCost(Configuration* cfg,
|
|||||||
// }
|
// }
|
||||||
|
|
||||||
double ret_val = 0;
|
double ret_val = 0;
|
||||||
// double calc_price = (int)total_duration_min - (int)price / price_per_unit;
|
double calc_price = (int)total_duration_min - (int)price / price_per_unit;
|
||||||
|
|
||||||
//if (calc_price > 0 && total_duration_min > 0)
|
if (calc_price > 0 && total_duration_min > 0)
|
||||||
//{
|
{
|
||||||
// inputDate = inputDate.addSecs(-(int)ceil(calc_price) * 60);
|
inputDate.addSecs(-(int)ceil(calc_price) * 60);
|
||||||
//}
|
}
|
||||||
|
|
||||||
if(price >= min_price && total_duration_min >= minMin)
|
if(price >= min_price && total_duration_min >= minMin)
|
||||||
qDebug() << "GetDurationFromCost(): Valid until: " << inputDate.toString(Qt::ISODate);
|
qDebug() << "Valid until: " << inputDate.toString(Qt::ISODate);
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
qDebug() << "Parking not allowed";
|
qDebug() << "Parking not allowed";
|
||||||
@@ -356,579 +381,202 @@ std::string Calculator::GetDurationFromCost(Configuration* cfg,
|
|||||||
///////////////////////////////////////
|
///////////////////////////////////////
|
||||||
|
|
||||||
/// <inheritdoc/>
|
/// <inheritdoc/>
|
||||||
///
|
double Calculator::GetCostFromDuration(Configuration* cfg, uint8_t payment_option, const char* start_datetime, double durationMin, bool nextDay, bool prepaid)
|
||||||
|
|
||||||
uint32_t Calculator::GetCostFromDuration(Configuration *cfg,
|
|
||||||
QDateTime const &start,
|
|
||||||
quint64 timeStepInMinutes) const {
|
|
||||||
// for instance, a tariff as used in Schoenau, Koenigssee: only steps, no
|
|
||||||
// special days, nonstop.
|
|
||||||
if (cfg->YearPeriod.size() == 0
|
|
||||||
&& cfg->SpecialDays.size() == 0
|
|
||||||
&& cfg->SpecialDaysWorktime.size() == 0) {
|
|
||||||
QDateTime const end = start.addSecs(timeStepInMinutes*60);
|
|
||||||
return GetCostFromDuration(cfg, start, end);
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
uint32_t Calculator::GetCostFromDuration(Configuration * cfg,
|
|
||||||
QDateTime const &start,
|
|
||||||
QDateTime const &end) const {
|
|
||||||
if (cfg->YearPeriod.size() == 0
|
|
||||||
&& cfg->SpecialDays.size() == 0
|
|
||||||
&& cfg->SpecialDaysWorktime.size() == 0) {
|
|
||||||
int const timeStepInMinutes = start.secsTo(end) / 60;
|
|
||||||
return GetPriceForTimeStep(cfg, timeStepInMinutes);
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
///////////////////////////////////////
|
|
||||||
|
|
||||||
/// <inheritdoc/>
|
|
||||||
double Calculator::GetCostFromDuration(Configuration* cfg,
|
|
||||||
uint8_t payment_option,
|
|
||||||
const QDateTime start_datetime,
|
|
||||||
QDateTime &end_datetime,
|
|
||||||
int durationMinutes,
|
|
||||||
bool nextDay,
|
|
||||||
bool prepaid) {
|
|
||||||
if (cfg->YearPeriod.size() == 0
|
|
||||||
&& cfg->SpecialDays.size() == 0
|
|
||||||
&& cfg->SpecialDaysWorktime.size() == 0)
|
|
||||||
{
|
{
|
||||||
end_datetime = start_datetime.addSecs(durationMinutes*60);
|
|
||||||
return GetCostFromDuration(cfg, start_datetime, end_datetime);
|
|
||||||
}
|
|
||||||
|
|
||||||
QDateTime start = start_datetime;
|
|
||||||
|
|
||||||
Ticket t = private_GetCostFromDuration(cfg, start,
|
|
||||||
durationMinutes,
|
|
||||||
prepaid);
|
|
||||||
if (t) {
|
|
||||||
qCritical().noquote() << t;
|
|
||||||
}
|
|
||||||
|
|
||||||
end_datetime = t.getValidUntil();
|
|
||||||
|
|
||||||
return t.getPrice();
|
|
||||||
}
|
|
||||||
|
|
||||||
int Calculator::getMinimalParkingTime(Configuration const *cfg, PaymentMethod methodId) {
|
|
||||||
return std::max((int)cfg->PaymentOption.find(methodId)->second.pop_min_time, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
int Calculator::getMaximalParkingTime(Configuration const *cfg, PaymentMethod methodId) {
|
|
||||||
return std::max((int)cfg->PaymentOption.find(methodId)->second.pop_max_time, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
uint32_t Calculator::getMinimalParkingPrice(Configuration const *cfg, PaymentMethod methodId) {
|
|
||||||
return std::max((int)cfg->PaymentOption.find(methodId)->second.pop_min_price, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool Calculator::checkDurationMinutes(int minParkingTime,
|
|
||||||
int maxParkingTime,
|
|
||||||
int durationMinutes) {
|
|
||||||
if (durationMinutes > maxParkingTime) {
|
|
||||||
qWarning() << QString("Total duration >= max_min (%1 >= %2)").arg(durationMinutes).arg(maxParkingTime);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
if (durationMinutes < minParkingTime) {
|
|
||||||
qWarning() << QString("Total duration <= minMin (%1 <= %2)").arg(durationMinutes).arg(minParkingTime);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
int Calculator::findWorkTimeRange(QDateTime const &dt,
|
|
||||||
QScopedArrayPointer<TariffTimeRange> const &worktime,
|
|
||||||
size_t size) {
|
|
||||||
for (size_t w = 0; w < size; ++w) {
|
|
||||||
QTime const &worktime_from = worktime[w].getTimeFrom();
|
|
||||||
QTime const &worktime_to = worktime[w].getTimeUntil();
|
|
||||||
|
|
||||||
if ((dt.time() >= worktime_from) && (dt.time() < worktime_to)) {
|
|
||||||
return w;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
int Calculator::findNextWorkTimeRange(QDateTime const &dt,
|
|
||||||
QScopedArrayPointer<TariffTimeRange> const &worktime,
|
|
||||||
size_t size) {
|
|
||||||
int nextWorkTimeRange = -1;
|
|
||||||
for (size_t w = 0; w < size; ++w) {
|
|
||||||
QTime const &worktime_from = worktime[w].getTimeFrom();
|
|
||||||
|
|
||||||
if (dt.time() < worktime_from) {
|
|
||||||
nextWorkTimeRange = w;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return nextWorkTimeRange;
|
|
||||||
}
|
|
||||||
|
|
||||||
uint32_t Calculator::computeWeekDaysPrice(Configuration const *cfg, PaymentMethod id) const {
|
|
||||||
int pop_id = cfg->PaymentOption.find(id)->second.pop_id;
|
|
||||||
return cfg->PaymentRate.find(pop_id)->second.pra_price;
|
|
||||||
}
|
|
||||||
|
|
||||||
double Calculator::computeWeekDaysDurationUnit(Configuration const *cfg, PaymentMethod id) const {
|
|
||||||
int pop_id = cfg->PaymentOption.find(id)->second.pop_id;
|
|
||||||
int durationId = cfg->PaymentRate.find(pop_id)->second.pra_payment_unit_id;
|
|
||||||
return (double)(cfg->Duration.find(durationId)->second.pun_duration);
|
|
||||||
}
|
|
||||||
|
|
||||||
using namespace Utilities;
|
|
||||||
|
|
||||||
Ticket Calculator::private_GetCostFromDuration(Configuration const* cfg,
|
|
||||||
QDateTime const &start,
|
|
||||||
int durationMinutes, // Netto
|
|
||||||
bool prepaid) {
|
|
||||||
|
|
||||||
static const PaymentMethod paymentMethodId = Utilities::getPaymentMethodId(cfg);
|
|
||||||
static const bool carryOverNotSet = isCarryOverNotSet(cfg, paymentMethodId);
|
|
||||||
static const int minParkingTimeMinutes = getMinimalParkingTime(cfg, paymentMethodId);
|
|
||||||
static const int maxParkingTimeMinutes = getMaximalParkingTime(cfg, paymentMethodId);
|
|
||||||
static const bool checkMinMaxMinutes = (minParkingTimeMinutes < maxParkingTimeMinutes);
|
|
||||||
static const int durationMinutesNetto = durationMinutes;
|
|
||||||
static const uint32_t weekDaysPrice = computeWeekDaysPrice(cfg, paymentMethodId);
|
|
||||||
static const double weekDaysDurationUnit = computeWeekDaysDurationUnit(cfg, paymentMethodId);
|
|
||||||
static const double specialDaysDurationUnit = 60.0;
|
|
||||||
|
|
||||||
if (!checkMinMaxMinutes) {
|
|
||||||
qCritical() << QString(
|
|
||||||
"ERROR: CONDITION minMin < maxMin (%1 < %2) IS NOT VALID")
|
|
||||||
.arg(minParkingTimeMinutes).arg(maxParkingTimeMinutes);
|
|
||||||
return Ticket();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!checkDurationMinutes(minParkingTimeMinutes,
|
|
||||||
maxParkingTimeMinutes, durationMinutes)) {
|
|
||||||
return Ticket();
|
|
||||||
}
|
|
||||||
|
|
||||||
uint32_t price = 0;
|
|
||||||
uint32_t costFromDuration = 0;
|
|
||||||
double durationUnit = 0.0;
|
|
||||||
int specialDayId = -1;
|
|
||||||
bool isSpecialDay = false;
|
|
||||||
Ticket ticket;
|
|
||||||
QDateTime end = start;
|
|
||||||
QDateTime current;
|
|
||||||
int totalTimeRanges = 0;
|
|
||||||
|
|
||||||
for (current = start; durationMinutes > 0; current = current.addDays(1)) {
|
|
||||||
int const weekdayId = current.date().dayOfWeek();
|
|
||||||
|
|
||||||
specialDayId = -1;
|
|
||||||
|
|
||||||
// find worktime ranges for the current day
|
|
||||||
int const timeRanges = std::max((int)cfg->WeekDaysWorktime.count(weekdayId), 1);
|
|
||||||
QScopedArrayPointer<TariffTimeRange> worktime(new TariffTimeRange[timeRanges]);
|
|
||||||
int ranges = 0;
|
|
||||||
|
|
||||||
if((isSpecialDay = Utilities::CheckSpecialDay(cfg, current, &specialDayId, &price))) {
|
|
||||||
// Set special day price:
|
|
||||||
durationUnit = specialDaysDurationUnit;
|
|
||||||
worktime[ranges].setTimeRange(SpecialDaysWorkTimeFrom(cfg, specialDayId),
|
|
||||||
SpecialDaysWorkTimeUntil(cfg, specialDayId));
|
|
||||||
ranges = 1;
|
|
||||||
} else {
|
|
||||||
// Set new price for the normal day: do not use a floating-point type
|
|
||||||
// for the price, rather compute with integers. Only at the very end of
|
|
||||||
// the computation the price is divided by durationUnit.
|
|
||||||
price = weekDaysPrice;
|
|
||||||
durationUnit = weekDaysDurationUnit;
|
|
||||||
|
|
||||||
// If no working day found, skip it (epsecially Sundays!)
|
|
||||||
if (cfg->WeekDaysWorktime.count(weekdayId) <= 0) {
|
|
||||||
qDebug() << "No workday found, trying to find next available day";
|
|
||||||
end = current;
|
|
||||||
current.setTime(QTime()); // start at midnight on the next day
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
using WTIterator = std::multimap<int, ATBWeekDaysWorktime>::const_iterator;
|
|
||||||
std::pair<WTIterator, WTIterator> p = cfg->WeekDaysWorktime.equal_range(weekdayId);
|
|
||||||
|
|
||||||
for (WTIterator itr = p.first; itr != p.second; ++itr) {
|
|
||||||
worktime[ranges].setTimeRange(WeekDaysWorkTimeFrom(itr),
|
|
||||||
WeekDaysWorkTimeUntil(itr));
|
|
||||||
ranges += 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
QTime const &lastWorktimeTo = worktime[ranges-1].getTimeUntil();
|
|
||||||
|
|
||||||
// find worktime range to start with
|
|
||||||
|
|
||||||
int currentRange = 0;
|
|
||||||
if (!isSpecialDay) {
|
|
||||||
if (start != current) { // on next day
|
|
||||||
current.setTime(worktime[currentRange].getTimeFrom());
|
|
||||||
} else {
|
|
||||||
// check if inputDate is located inside a valid worktime-range...
|
|
||||||
currentRange = findWorkTimeRange(current, worktime, ranges);
|
|
||||||
if (currentRange == -1) { // no...
|
|
||||||
if (!prepaid) { // parking is not allowed
|
|
||||||
return Ticket(start, QDateTime(), durationMinutesNetto, 0,
|
|
||||||
0, Ticket::s[INVALID_FROM_DATETIME]);
|
|
||||||
}
|
|
||||||
// find the next worktime-range (on the same day), and start from there
|
|
||||||
currentRange = findNextWorkTimeRange(current, worktime, ranges);
|
|
||||||
current.setTime(worktime[currentRange].getTimeFrom());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for (int w = currentRange; w < ranges; ++w, ++totalTimeRanges) {
|
|
||||||
if (durationMinutes > 0) {
|
|
||||||
QTime const &worktime_from = worktime[w].getTimeFrom();
|
|
||||||
QTime const &worktime_to = worktime[w].getTimeUntil();
|
|
||||||
|
|
||||||
if (totalTimeRanges) {
|
|
||||||
// durationMinutes are always meant as netto time and
|
|
||||||
// the time between worktime-ranges are free.
|
|
||||||
current.setTime(worktime_from);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (price == 0) {
|
|
||||||
// inputDate = inputDate.addDays(1);
|
|
||||||
// inputDate.setTime(worktime_from);
|
|
||||||
end = current;
|
|
||||||
current.setTime(QTime());
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (current.time() == worktime_to) {
|
|
||||||
end = current;
|
|
||||||
current.setTime(QTime());
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Check prepaid
|
|
||||||
if (!prepaid) {
|
|
||||||
if ((current.time() < worktime_from) || (current.time() > worktime_to)) {
|
|
||||||
qDebug() << "[STOP] * Ticket is not valid * ";
|
|
||||||
return Ticket();
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
qDebug() << "* PREPAID MODE ACTIVE *";
|
|
||||||
if (current.time() < worktime_from) {
|
|
||||||
current.setTime(worktime_from);
|
|
||||||
end = current;
|
|
||||||
} else if(current.time() > lastWorktimeTo) {
|
|
||||||
qDebug() << " *** PREPAID *** Current time is past the time range end, searching for next available day";
|
|
||||||
end = current;
|
|
||||||
current.setTime(QTime());
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
while(durationMinutes > 0) {
|
|
||||||
// Check for active year period
|
|
||||||
if (!IsYearPeriodActive(cfg, current)) {
|
|
||||||
return Ticket();
|
|
||||||
}
|
|
||||||
if(current.time() >= lastWorktimeTo) {
|
|
||||||
// Go to next day if minutes not spent
|
|
||||||
if (carryOverNotSet) {
|
|
||||||
// no carry_over, so stop computation
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
current.setTime(QTime());
|
|
||||||
break; // stop while, and continue in outer loop
|
|
||||||
} else {
|
|
||||||
if(current.time() < worktime_to) {
|
|
||||||
// Increment input date minutes for each monetary unit
|
|
||||||
current = current.addSecs(60);
|
|
||||||
end = current;
|
|
||||||
durationMinutes -= 1;
|
|
||||||
//costFromDuration += price_per_unit;
|
|
||||||
costFromDuration += price;
|
|
||||||
} else break;
|
|
||||||
}
|
|
||||||
} // while(durationMinutes > 0) {
|
|
||||||
} // if (durationMinutes > 0) {
|
|
||||||
} // for (int w = currentRange; w < ranges; ++w, ++totalTimeRanges) {
|
|
||||||
} // for (current = start; durationMinutes > 0; current = current.addDays(1)) {
|
|
||||||
|
|
||||||
int durationMinutesBrutto = start.secsTo(end) / 60;
|
|
||||||
|
|
||||||
return
|
|
||||||
Ticket(start, end, durationMinutesNetto, durationMinutesBrutto,
|
|
||||||
llround(Utilities::CalculatePricePerUnit(costFromDuration, durationUnit)),
|
|
||||||
Ticket::s[VALID]);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
Ticket Calculator::private_GetDurationFromCost(Configuration *cfg,
|
|
||||||
QDateTime const &start,
|
|
||||||
uint32_t price,
|
|
||||||
bool prepaid) {
|
|
||||||
// Get input date
|
// Get input date
|
||||||
QDateTime current = start;
|
QDateTime inputDate = QDateTime::fromString(start_datetime,Qt::ISODate);
|
||||||
|
|
||||||
// use tariff with structure as for instance Schnau, Koenigsee:
|
// Get day of week
|
||||||
// without given YearPeriod, SpecialDays and SpecialDaysWorktime
|
int weekdayId = 0;
|
||||||
if (cfg->YearPeriod.size() == 0
|
weekdayId = Utilities::ZellersAlgorithm(inputDate.date().day(),inputDate.date().month(),inputDate.date().year());
|
||||||
&& cfg->SpecialDays.size() == 0
|
|
||||||
&& cfg->SpecialDaysWorktime.size() == 0)
|
//Get min and max time defined in JSON
|
||||||
|
double minMin = 0;
|
||||||
|
minMin = cfg->PaymentOption.find(payment_option)->second.pop_min_time;
|
||||||
|
|
||||||
|
double maxMin = 0;
|
||||||
|
maxMin = cfg->PaymentOption.find(payment_option)->second.pop_max_time;
|
||||||
|
|
||||||
|
if (minMin < 0) minMin = 0;
|
||||||
|
if (maxMin < 0) maxMin = 0;
|
||||||
|
if (minMin >= maxMin)
|
||||||
{
|
{
|
||||||
uint64_t const durationMinutes = GetDurationForPrice(cfg, price);
|
LOG_ERROR("Error: min_min cannot be greater or equal to max_min");
|
||||||
uint64_t const durationSeconds = durationMinutes * 60;
|
return 0.0f;
|
||||||
current = current.addSecs(durationSeconds);
|
}
|
||||||
|
if (maxMin <= minMin)
|
||||||
return
|
{
|
||||||
Ticket(start, current, durationMinutes, durationMinutes,
|
LOG_ERROR("Error: max_min cannot be lower or equal than min_min");
|
||||||
price, Ticket::s[VALID]);
|
return 0.0f;
|
||||||
}
|
}
|
||||||
|
|
||||||
static const PaymentMethod paymentMethodId = Utilities::getPaymentMethodId(cfg);
|
// Check overtime
|
||||||
static const bool carryOverNotSet = isCarryOverNotSet(cfg, paymentMethodId);
|
if (!overtime)
|
||||||
static const uint32_t minParkingTimeMinutes = std::max(getMinimalParkingTime(cfg, paymentMethodId), 0);
|
{
|
||||||
static const uint32_t maxParkingTimeMinutes = std::max(getMaximalParkingTime(cfg, paymentMethodId), 0);
|
if (durationMin > maxMin)
|
||||||
static const uint32_t minParkingPrice = getMinimalParkingPrice(cfg, paymentMethodId);
|
{
|
||||||
static const bool checkMinMaxMinutes = (minParkingTimeMinutes < maxParkingTimeMinutes);
|
LOG_WARNING("Total duration is greater or equal to max_min");
|
||||||
static const uint32_t weekDaysPrice = computeWeekDaysPrice(cfg, paymentMethodId);
|
return maxMin;
|
||||||
static const double weekDaysDurationUnit = computeWeekDaysDurationUnit(cfg, paymentMethodId);
|
|
||||||
static const double specialDaysDurationUnit = 60.0;
|
|
||||||
|
|
||||||
if(price < minParkingPrice) {
|
|
||||||
uint64_t const durationMinutes = GetDurationForPrice(cfg, price);
|
|
||||||
return Ticket(start, current, durationMinutes, durationMinutes,
|
|
||||||
price, Ticket::s[INVALID_PRICE]);
|
|
||||||
}
|
|
||||||
if (minParkingTimeMinutes >= maxParkingTimeMinutes) {
|
|
||||||
// TODO
|
|
||||||
return Ticket();
|
|
||||||
}
|
|
||||||
if (maxParkingTimeMinutes <= minParkingTimeMinutes) {
|
|
||||||
// TODO
|
|
||||||
return Ticket();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t durationMinutesNetto = 0;
|
if (durationMin < minMin)
|
||||||
int moneyLeft = price;
|
{
|
||||||
//double durationUnit = 0.0;
|
LOG_WARNING("Total duration is lower or equal to min_min");
|
||||||
int specialDayId = -1;
|
return 0.0f;
|
||||||
bool isSpecialDay = false;
|
|
||||||
QDateTime end = start;
|
|
||||||
int totalTimeRanges = 0;
|
|
||||||
|
|
||||||
for (current = start; moneyLeft > 0; current = current.addDays(1)) {
|
|
||||||
int const weekdayId = current.date().dayOfWeek();
|
|
||||||
|
|
||||||
specialDayId = -1;
|
|
||||||
|
|
||||||
// find worktime ranges for the current day
|
|
||||||
int const timeRanges = std::max((int)cfg->WeekDaysWorktime.count(weekdayId), 1);
|
|
||||||
QScopedArrayPointer<TariffTimeRange> worktime(new TariffTimeRange[timeRanges]);
|
|
||||||
int ranges = 0;
|
|
||||||
|
|
||||||
if((isSpecialDay = Utilities::CheckSpecialDay(cfg, current, &specialDayId, &price))) {
|
|
||||||
// Set special day price:
|
|
||||||
// durationUnit = specialDaysDurationUnit;
|
|
||||||
worktime[ranges].setTimeRange(SpecialDaysWorkTimeFrom(cfg, specialDayId),
|
|
||||||
SpecialDaysWorkTimeUntil(cfg, specialDayId));
|
|
||||||
ranges = 1;
|
|
||||||
} else {
|
|
||||||
// Set new price for the normal day: do not use a floating-point type
|
|
||||||
// for the price, rather compute with integers. Only at the very end of
|
|
||||||
// the computation the price is divided by durationUnit.
|
|
||||||
price = weekDaysPrice;
|
|
||||||
// durationUnit = weekDaysDurationUnit;
|
|
||||||
|
|
||||||
// If no working day found, skip it (epsecially Sundays!)
|
|
||||||
if (cfg->WeekDaysWorktime.count(weekdayId) <= 0) {
|
|
||||||
qDebug() << "No workday found, trying to find next available day";
|
|
||||||
end = current;
|
|
||||||
current.setTime(QTime()); // start at midnight on the next day
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
using WTIterator = std::multimap<int, ATBWeekDaysWorktime>::const_iterator;
|
|
||||||
std::pair<WTIterator, WTIterator> p = cfg->WeekDaysWorktime.equal_range(weekdayId);
|
|
||||||
|
|
||||||
for (WTIterator itr = p.first; itr != p.second; ++itr) {
|
|
||||||
worktime[ranges].setTimeRange(WeekDaysWorkTimeFrom(itr),
|
|
||||||
WeekDaysWorkTimeUntil(itr));
|
|
||||||
ranges += 1;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
QTime const &lastWorktimeTo = worktime[ranges-1].getTimeUntil();
|
// Get payment method
|
||||||
|
uint8_t p_method = PaymentMethod::Undefined;
|
||||||
|
p_method = payment_option;
|
||||||
|
LOG_DEBUG("Payment method id: ", (unsigned)p_method);
|
||||||
|
|
||||||
// find worktime range to start with
|
// Check special day
|
||||||
|
double day_price = 0.0f;
|
||||||
|
int current_special_day_id = -1;
|
||||||
|
bool is_special_day = Utilities::CheckSpecialDay(cfg, inputDate.toString(Qt::ISODate).toStdString().c_str(), ¤t_special_day_id, &day_price);
|
||||||
|
LOG_DEBUG("Special day: ", is_special_day);
|
||||||
|
|
||||||
int currentRange = 0;
|
total_duration_min = durationMin;
|
||||||
if (!isSpecialDay) {
|
LOG_DEBUG("Total min:", total_duration_min);
|
||||||
if (start != current) { // on next day
|
|
||||||
current.setTime(worktime[currentRange].getTimeFrom());
|
double price_per_unit = 0.0f;
|
||||||
} else {
|
QTime worktime_from;
|
||||||
// check if inputDate is located inside a valid worktime-range...
|
QTime worktime_to;
|
||||||
currentRange = findWorkTimeRange(current, worktime, ranges);
|
|
||||||
if (currentRange == -1) { // no...
|
if(is_special_day)
|
||||||
if (!prepaid) { // parking is not allowed
|
{
|
||||||
return Ticket(start, QDateTime(), durationMinutesNetto, 0,
|
// Set special day price
|
||||||
0, Ticket::s[INVALID_FROM_DATETIME]);
|
price_per_unit = Utilities::CalculatePricePerUnit(day_price);
|
||||||
}
|
worktime_from = QTime::fromString(cfg->SpecialDaysWorktime.find(current_special_day_id)->second.pedwt_time_from.c_str());
|
||||||
// find the next worktime-range (on the same day), and start from there
|
worktime_to = QTime::fromString(cfg->SpecialDaysWorktime.find(current_special_day_id)->second.pedwt_time_to.c_str());
|
||||||
currentRange = findNextWorkTimeRange(current, worktime, ranges);
|
|
||||||
current.setTime(worktime[currentRange].getTimeFrom());
|
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Set new price for the normal day
|
||||||
|
|
||||||
|
int pop_id = cfg->PaymentOption.find(payment_option)->second.pop_id;
|
||||||
|
day_price = cfg->PaymentRate.find(pop_id)->second.pra_price;
|
||||||
|
|
||||||
|
int durationId = cfg->PaymentRate.find(pop_id)->second.pra_payment_unit_id;
|
||||||
|
double durationUnit = cfg->Duration.find(durationId)->second.pun_duration;
|
||||||
|
price_per_unit = Utilities::CalculatePricePerUnit(day_price,durationUnit);
|
||||||
|
|
||||||
|
// If no working day found, skip it (recursively call method again)
|
||||||
|
size_t found = 0;
|
||||||
|
found = cfg->WeekDaysWorktime.count(weekdayId);
|
||||||
|
|
||||||
|
// When no workday found, go to next available day
|
||||||
|
if(found <=0)
|
||||||
|
{
|
||||||
|
LOG_DEBUG("- No workday found, trying to find next available day");
|
||||||
|
inputDate = inputDate.addDays(1);
|
||||||
|
return floor(GetCostFromDuration(cfg, payment_option, inputDate.toString(Qt::ISODate).toStdString().c_str(), durationMin, true, prepaid));
|
||||||
}
|
}
|
||||||
|
worktime_from = QTime::fromString(cfg->WeekDaysWorktime.find(weekdayId)->second.pwd_time_from.c_str());
|
||||||
|
worktime_to = QTime::fromString(cfg->WeekDaysWorktime.find(weekdayId)->second.pwd_time_to.c_str());
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int w = currentRange; w < ranges; ++w, ++totalTimeRanges) {
|
if (price_per_unit < 0) price_per_unit = 1.0f;
|
||||||
if (moneyLeft > 0) {
|
LOG_DEBUG("Calculated price per minute: ", price_per_unit);
|
||||||
QTime const &worktime_from = worktime[w].getTimeFrom();
|
|
||||||
QTime const &worktime_to = worktime[w].getTimeUntil();
|
|
||||||
|
|
||||||
if (totalTimeRanges) {
|
if (price_per_unit == 0)
|
||||||
// durationMinutes are always meant as netto time and
|
{
|
||||||
// the time between worktime-ranges are free.
|
inputDate = inputDate.addDays(1);
|
||||||
current.setTime(worktime_from);
|
inputDate.setTime(worktime_from);
|
||||||
|
return GetCostFromDuration(cfg, payment_option, inputDate.toString(Qt::ISODate).toStdString().c_str(), durationMin, true, prepaid);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (price == 0) {
|
// If overtime flag is set
|
||||||
// inputDate = inputDate.addDays(1);
|
if (overtime || nextDay)
|
||||||
// inputDate.setTime(worktime_from);
|
{
|
||||||
end = current;
|
inputDate.setTime(worktime_from);
|
||||||
current.setTime(QTime());
|
overtime = false;
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (current.time() == worktime_to) {
|
|
||||||
end = current;
|
|
||||||
current.setTime(QTime());
|
|
||||||
continue;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check prepaid
|
// Check prepaid
|
||||||
if (!prepaid) {
|
if (!prepaid)
|
||||||
if ((current.time() < worktime_from) || (current.time() > worktime_to)) {
|
{
|
||||||
qDebug() << "[STOP] * Ticket is not valid * ";
|
if ((inputDate.time() < worktime_from) || (inputDate.time() > worktime_to))
|
||||||
return Ticket();
|
{
|
||||||
|
LOG_DEBUG("[STOP] * Ticket is not valid * ");
|
||||||
|
return 0.0f;
|
||||||
}
|
}
|
||||||
} else {
|
}
|
||||||
qDebug() << "* PREPAID MODE ACTIVE *";
|
else
|
||||||
if (current.time() < worktime_from) {
|
{
|
||||||
current.setTime(worktime_from);
|
LOG_DEBUG("* PREPAID MODE ACTIVE *");
|
||||||
end = current;
|
if (inputDate.time() < worktime_from)
|
||||||
} else if(current.time() > lastWorktimeTo) {
|
{
|
||||||
qDebug() << " *** PREPAID *** Current time is past the time range end, searching for next available day";
|
inputDate.setTime(worktime_from);
|
||||||
end = current;
|
}
|
||||||
current.setTime(QTime());
|
else if(inputDate.time() > worktime_to)
|
||||||
continue;
|
{
|
||||||
|
LOG_DEBUG(" *** PREPAID *** Current time is past the time range end, searching for next available day");
|
||||||
|
inputDate = inputDate.addDays(1);
|
||||||
|
return GetCostFromDuration(cfg, payment_option, inputDate.toString(Qt::ISODate).toStdString().c_str(), durationMin, true, prepaid);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
while(moneyLeft > 0) {
|
while(true)
|
||||||
// Check for active year period
|
{
|
||||||
if (!IsYearPeriodActive(cfg, current)) {
|
if(total_duration_min <= 0) break;
|
||||||
return Ticket();
|
|
||||||
}
|
// Check year period
|
||||||
if(durationMinutesNetto > maxParkingTimeMinutes) {
|
bool isYearPeriodActive = false;
|
||||||
durationMinutesNetto = maxParkingTimeMinutes;
|
|
||||||
|
//// Parse input date
|
||||||
|
int dayCurrent = inputDate.date().day();
|
||||||
|
int monthCurrent = inputDate.date().month();
|
||||||
|
|
||||||
|
// Current date time
|
||||||
|
int cdt = (monthCurrent * 100) + dayCurrent;
|
||||||
|
|
||||||
|
multimap<int, ATBPeriodYear>::iterator year_period_itr;
|
||||||
|
for (year_period_itr = cfg->YearPeriod.begin(); year_period_itr != cfg->YearPeriod.end(); ++year_period_itr)
|
||||||
|
{
|
||||||
|
int dStart = year_period_itr->second.pye_start_day;
|
||||||
|
int dEnd = year_period_itr->second.pye_end_day;
|
||||||
|
|
||||||
|
int mStart = year_period_itr->second.pye_start_month;
|
||||||
|
int mEnd = year_period_itr->second.pye_end_month;
|
||||||
|
|
||||||
|
int start = (mStart * 100) + dStart;
|
||||||
|
int end = (mEnd * 100) + dEnd;
|
||||||
|
|
||||||
|
if (cdt >= start && cdt <= end) {
|
||||||
|
isYearPeriodActive = true;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if(current.time() >= lastWorktimeTo) {
|
}
|
||||||
|
if (!isYearPeriodActive)
|
||||||
|
{
|
||||||
|
LOG_DEBUG("Year period is not valid");
|
||||||
|
return 0.0f;
|
||||||
|
}
|
||||||
|
|
||||||
|
int carry_over_status = 0;
|
||||||
|
carry_over_status = cfg->PaymentOption.find(payment_option)->second.pop_carry_over;
|
||||||
|
|
||||||
// Go to next day if minutes not spent
|
// Go to next day if minutes not spent
|
||||||
if (carryOverNotSet) {
|
if(inputDate.time() >= worktime_to)
|
||||||
// no carry_over, so stop computation
|
{
|
||||||
break;
|
if (carry_over_status < 1) break;
|
||||||
|
|
||||||
|
LOG_DEBUG("Reached end of worktime, searching for the next working day");
|
||||||
|
inputDate = inputDate.addDays(1);
|
||||||
|
overtime = true;
|
||||||
|
return GetCostFromDuration(cfg, payment_option, inputDate.toString(Qt::ISODate).toStdString().c_str(), total_duration_min);
|
||||||
}
|
}
|
||||||
current.setTime(QTime());
|
|
||||||
break; // stop while, and continue in outer loop
|
|
||||||
} else {
|
|
||||||
if(current.time() < worktime_to) {
|
|
||||||
// Increment input date minutes for each monetary unit
|
// Increment input date minutes for each monetary unit
|
||||||
if(moneyLeft > 1) {
|
inputDate = inputDate.addSecs(60);
|
||||||
current = current.addSecs(60);
|
total_duration_min -=1;
|
||||||
|
total_cost += price_per_unit;
|
||||||
|
|
||||||
}
|
}
|
||||||
end = current;
|
qDebug() << "Valid until:" << inputDate.toString(Qt::ISODate).toStdString().c_str();
|
||||||
if(price > 0) {
|
double ret_val = total_cost;
|
||||||
durationMinutesNetto +=1;
|
total_cost = 0.0f;
|
||||||
}
|
return ceil(ret_val);
|
||||||
moneyLeft -= price;
|
|
||||||
} else break;
|
|
||||||
}
|
|
||||||
} // while(durationMinutes > 0) {
|
|
||||||
} // if (durationMinutes > 0) {
|
|
||||||
} // for (int w = currentRange; w < ranges; ++w, ++totalTimeRanges) {
|
|
||||||
} // for (current = start; durationMinutes > 0; current = current.addDays(1)) {
|
|
||||||
|
|
||||||
int durationMinutesBrutto = start.secsTo(end) / 60;
|
|
||||||
|
|
||||||
return
|
|
||||||
Ticket(start, end, durationMinutesNetto, durationMinutesBrutto,
|
|
||||||
price, Ticket::s[VALID]);
|
|
||||||
}
|
|
||||||
|
|
||||||
QList<int> Calculator::GetTimeSteps(Configuration *cfg) const {
|
|
||||||
QList<int> timeSteps;
|
|
||||||
|
|
||||||
int const pop_id = cfg->getPaymentOptions().pop_id;
|
|
||||||
|
|
||||||
for (auto[itr, rangeEnd] = cfg->PaymentRate.equal_range(pop_id); itr != rangeEnd; ++itr)
|
|
||||||
{
|
|
||||||
int const durationId = itr->second.pra_payment_unit_id;
|
|
||||||
int const durationUnit = cfg->Duration.find(durationId)->second.pun_duration;
|
|
||||||
timeSteps << durationUnit;
|
|
||||||
}
|
|
||||||
|
|
||||||
return timeSteps;
|
|
||||||
}
|
|
||||||
|
|
||||||
uint32_t Calculator::GetPriceForTimeStep(Configuration *cfg, int timeStep) const {
|
|
||||||
|
|
||||||
int const pop_id = cfg->getPaymentOptions().pop_id;
|
|
||||||
|
|
||||||
for (auto[itr, rangeEnd] = cfg->PaymentRate.equal_range(pop_id); itr != rangeEnd; ++itr)
|
|
||||||
{
|
|
||||||
int const payment_unit_id = itr->second.pra_payment_unit_id;
|
|
||||||
int const pun_id = cfg->Duration.find(payment_unit_id)->second.pun_id;
|
|
||||||
|
|
||||||
Q_ASSERT(pun_id == payment_unit_id);
|
|
||||||
|
|
||||||
int const pun_duration = cfg->Duration.find(payment_unit_id)->second.pun_duration;
|
|
||||||
if (timeStep == pun_duration) {
|
|
||||||
return (uint32_t)(itr->second.pra_price);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
uint32_t Calculator::GetDurationForPrice(Configuration *cfg, int price) const {
|
|
||||||
int const pop_id = cfg->getPaymentOptions().pop_id;
|
|
||||||
|
|
||||||
uint32_t duration = 0;
|
|
||||||
|
|
||||||
for (auto[itr, rangeEnd] = cfg->PaymentRate.equal_range(pop_id); itr != rangeEnd; ++itr)
|
|
||||||
{
|
|
||||||
int const durationId = itr->second.pra_payment_unit_id;
|
|
||||||
int const pra_price = itr->second.pra_price;
|
|
||||||
|
|
||||||
uint32_t const durationUnit = cfg->Duration.find(durationId)->second.pun_duration;
|
|
||||||
|
|
||||||
if (pra_price == price) {
|
|
||||||
return durationUnit;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (pra_price < price) {
|
|
||||||
duration = durationUnit;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return duration;
|
|
||||||
}
|
}
|
||||||
|
@@ -59,9 +59,8 @@ bool Configuration::ParseJson(Configuration* cfg, const char* json)
|
|||||||
|| !document.HasMember("PaymentRate")
|
|| !document.HasMember("PaymentRate")
|
||||||
|| !document.HasMember("Duration")
|
|| !document.HasMember("Duration")
|
||||||
//|| !document.HasMember("WeekDays")
|
//|| !document.HasMember("WeekDays")
|
||||||
//|| !document.HasMember("SpecialDaysWorktime")
|
|| !document.HasMember("SpecialDaysWorktime")
|
||||||
//|| !document.HasMember("SpecialDays")
|
|| !document.HasMember("SpecialDays"))
|
||||||
)
|
|
||||||
{
|
{
|
||||||
printf("%s", "Error: not a valid configuration JSON\n");
|
printf("%s", "Error: not a valid configuration JSON\n");
|
||||||
return false;
|
return false;
|
||||||
@@ -88,26 +87,13 @@ bool Configuration::ParseJson(Configuration* cfg, const char* json)
|
|||||||
const char* mb_name = i->name.GetString();
|
const char* mb_name = i->name.GetString();
|
||||||
if (mb_name == NULL) continue;
|
if (mb_name == NULL) continue;
|
||||||
|
|
||||||
if (document[mb_name].IsString()) {
|
// if (!document[mb_name].IsArray()) {
|
||||||
QString const _mb_name(mb_name);
|
std::string const _mb_name(mb_name);
|
||||||
if (_mb_name.startsWith("Project", Qt::CaseInsensitive)) {
|
if (_mb_name == "version" || _mb_name == "project" ||
|
||||||
cfg->project.project = document[mb_name].GetString();
|
_mb_name == "zone" || _mb_name == "info") {
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if (_mb_name.startsWith("Version", Qt::CaseInsensitive)) {
|
|
||||||
cfg->project.version = document[mb_name].GetString();
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if (_mb_name.startsWith("Info", Qt::CaseInsensitive)) {
|
|
||||||
cfg->project.info = document[mb_name].GetString();
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// ... everything else should be an array
|
|
||||||
if (!document[mb_name].IsArray()) {
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
// }
|
||||||
|
|
||||||
//printf(" -%s\n", mb_name);
|
//printf(" -%s\n", mb_name);
|
||||||
|
|
||||||
@@ -169,7 +155,7 @@ bool Configuration::ParseJson(Configuration* cfg, const char* json)
|
|||||||
else if (strcmp(inner_obj_name, "pop_min_price") == 0) PaymentOption.pop_min_price = k->value.GetDouble();
|
else if (strcmp(inner_obj_name, "pop_min_price") == 0) PaymentOption.pop_min_price = k->value.GetDouble();
|
||||||
else if (strcmp(inner_obj_name, "pop_carry_over") == 0) PaymentOption.pop_carry_over = k->value.GetInt();
|
else if (strcmp(inner_obj_name, "pop_carry_over") == 0) PaymentOption.pop_carry_over = k->value.GetInt();
|
||||||
else if (strcmp(inner_obj_name, "pop_daily_card_price") == 0) PaymentOption.pop_daily_card_price = k->value.GetInt();
|
else if (strcmp(inner_obj_name, "pop_daily_card_price") == 0) PaymentOption.pop_daily_card_price = k->value.GetInt();
|
||||||
this->currentPaymentOptions = PaymentOption;
|
else if (strcmp(inner_obj_name, "pop_multi_hour_price") == 0) PaymentOption.pop_multi_hour_price = k->value.GetInt();
|
||||||
break;
|
break;
|
||||||
case MemberType::DurationType:
|
case MemberType::DurationType:
|
||||||
if (strcmp(inner_obj_name, "pun_id") == 0) Duration.pun_id = k->value.GetInt();
|
if (strcmp(inner_obj_name, "pun_id") == 0) Duration.pun_id = k->value.GetInt();
|
||||||
@@ -260,10 +246,3 @@ bool Configuration::ParseJson(Configuration* cfg, const char* json)
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
const ATBPaymentOption & Configuration::getPaymentOptions()
|
|
||||||
{
|
|
||||||
return this->currentPaymentOptions;
|
|
||||||
}
|
|
||||||
|
@@ -1,85 +0,0 @@
|
|||||||
#include "ticket.h"
|
|
||||||
|
|
||||||
Ticket::Ticket()
|
|
||||||
: m_status(Ticket::s[NOT_INITIALIZED])
|
|
||||||
, m_validFrom()
|
|
||||||
, m_validUntil()
|
|
||||||
, m_durationMinutesNetto(0)
|
|
||||||
, m_durationMinutesBrutto(0)
|
|
||||||
, m_price() {
|
|
||||||
}
|
|
||||||
|
|
||||||
Ticket::Ticket(QDateTime const &s, QDateTime const &e,
|
|
||||||
int durationMinutesNetto, int durationMinutesBrutto,
|
|
||||||
uint32_t price, Ticket::Status status)
|
|
||||||
: m_status(status)
|
|
||||||
, m_validFrom(s)
|
|
||||||
, m_validUntil(e)
|
|
||||||
, m_durationMinutesNetto(durationMinutesNetto)
|
|
||||||
, m_durationMinutesBrutto(durationMinutesBrutto)
|
|
||||||
, m_price(price) {
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
Ticket::Status Ticket::setStatus(Status status) {
|
|
||||||
Status old = m_status;
|
|
||||||
m_status = status;
|
|
||||||
return old;
|
|
||||||
}
|
|
||||||
|
|
||||||
Ticket::Status Ticket::getStatus() const {
|
|
||||||
return m_status;
|
|
||||||
}
|
|
||||||
|
|
||||||
void Ticket::setValidFrom(QDateTime const &validFrom) {
|
|
||||||
m_validFrom = validFrom;
|
|
||||||
}
|
|
||||||
|
|
||||||
void Ticket::setValidUntil(QDateTime const &validUntil) {
|
|
||||||
m_validUntil = validUntil;
|
|
||||||
}
|
|
||||||
|
|
||||||
QDateTime Ticket::getValidFrom() const {
|
|
||||||
if (std::get<CODE>(m_status) == VALID) {
|
|
||||||
return m_validFrom;
|
|
||||||
}
|
|
||||||
return QDateTime();
|
|
||||||
}
|
|
||||||
|
|
||||||
QDateTime Ticket::getValidUntil() const {
|
|
||||||
if (std::get<CODE>(m_status) == VALID) {
|
|
||||||
return m_validFrom;
|
|
||||||
}
|
|
||||||
return QDateTime();
|
|
||||||
}
|
|
||||||
|
|
||||||
uint32_t Ticket::getPrice() const {
|
|
||||||
return m_price;
|
|
||||||
}
|
|
||||||
|
|
||||||
void Ticket::setPrice(uint32_t price) {
|
|
||||||
m_price = price;
|
|
||||||
}
|
|
||||||
|
|
||||||
Ticket::operator QString() {
|
|
||||||
QStringList status;
|
|
||||||
status << QString("**********************");
|
|
||||||
status << QString("Status ............. : %1 (%2)")
|
|
||||||
.arg(std::get<0>(m_status))
|
|
||||||
.arg(std::get<2>(m_status));
|
|
||||||
status << QString("Valid from ......... : %1").arg(m_validFrom.toString(Qt::ISODate));
|
|
||||||
status << QString("Valid until ........ : %1").arg(m_validUntil.toString(Qt::ISODate));
|
|
||||||
status << QString("Duration (netto) ... : %1").arg(m_durationMinutesNetto);
|
|
||||||
status << QString("Duration (brutto)... : %1").arg(m_durationMinutesBrutto);
|
|
||||||
status << QString("Price .............. : %1").arg(m_price);
|
|
||||||
status << QString("**********************");
|
|
||||||
|
|
||||||
return status.join('\n');
|
|
||||||
}
|
|
||||||
|
|
||||||
QDebug operator<<(QDebug debug, Ticket::Status const &status) {
|
|
||||||
QDebugStateSaver saver(debug);
|
|
||||||
debug << "Ticket-Status: " << std::get<1>(status)
|
|
||||||
<< "(" << std::get<2>(status) << ")";
|
|
||||||
return debug;
|
|
||||||
}
|
|
@@ -1,9 +1,6 @@
|
|||||||
#include "utilities.h"
|
#include "utilities.h"
|
||||||
#include "tariff_log.h"
|
#include "tariff_log.h"
|
||||||
|
|
||||||
#include <QDebug>
|
|
||||||
#include <algorithm>
|
|
||||||
|
|
||||||
static int protection_counter = 0;
|
static int protection_counter = 0;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -196,23 +193,6 @@ bool Utilities::IsYearPeriodActive(Configuration* cfg, struct tm* currentDateTim
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Utilities::IsYearPeriodActive(Configuration const *cfg, QDateTime const &dt) {
|
|
||||||
if (std::none_of(cfg->YearPeriod.cbegin(),
|
|
||||||
cfg->YearPeriod.cend(),
|
|
||||||
[&dt](std::pair<int, ATBPeriodYear> const &year) {
|
|
||||||
QDate const d(2004, // 2004 is a leap year
|
|
||||||
dt.date().month(),
|
|
||||||
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);
|
|
||||||
return (d >= s && d <= e);
|
|
||||||
})) {
|
|
||||||
qCritical() << "NO VALID YEAR PERIOD";
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <inheritdoc/>
|
/// <inheritdoc/>
|
||||||
bool Utilities::CheckSpecialDay(Configuration* cfg, const char* currentDateTimeStr, int* specialDayId, double* specialDayPrice)
|
bool Utilities::CheckSpecialDay(Configuration* cfg, const char* currentDateTimeStr, int* specialDayId, double* specialDayPrice)
|
||||||
{
|
{
|
||||||
@@ -291,85 +271,3 @@ bool Utilities::CheckSpecialDay(Configuration* cfg, const char* currentDateTimeS
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Utilities::CheckSpecialDay(Configuration const *cfg,
|
|
||||||
QDateTime const ¤tDateTime,
|
|
||||||
int* specialDayId,
|
|
||||||
uint32_t *specialDayPrice) {
|
|
||||||
*specialDayId = -1;
|
|
||||||
*specialDayPrice = 0;
|
|
||||||
|
|
||||||
std::multimap<int, ATBSpecialDays>::const_iterator spec_days_itr;
|
|
||||||
|
|
||||||
for (spec_days_itr = cfg->SpecialDays.cbegin(); spec_days_itr != cfg->SpecialDays.cend(); ++spec_days_itr) {
|
|
||||||
int repeat_every_year = spec_days_itr->second.ped_year;
|
|
||||||
QDate start = QDate::fromString(spec_days_itr->second.ped_date_start.c_str(), Qt::ISODate);
|
|
||||||
QDate end = QDate::fromString(spec_days_itr->second.ped_date_end.c_str(), Qt::ISODate);
|
|
||||||
if (start.isValid() && end.isValid()) {
|
|
||||||
if ((currentDateTime.date().month() >= start.month()) &&
|
|
||||||
(currentDateTime.date().month() <= end.month())) {
|
|
||||||
if ((currentDateTime.date().day() >= start.day()) &&
|
|
||||||
(currentDateTime.date().day() <= end.day())) {
|
|
||||||
if (repeat_every_year <= 0) {
|
|
||||||
if ((currentDateTime.date().year() != start.year()) ||
|
|
||||||
(currentDateTime.date().year() != end.year())) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
qDebug() << "CheckSpecialDay() => SPECIAL DAY";
|
|
||||||
*specialDayId = spec_days_itr->second.ped_id;
|
|
||||||
*specialDayPrice = cfg->SpecialDaysWorktime.find(*specialDayId)->second.pedwt_price;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
QTime Utilities::SpecialDaysWorkTimeFrom(Configuration const *cfg, int specialDayId) {
|
|
||||||
return QTime::fromString(cfg->SpecialDaysWorktime.find(specialDayId)->second.pedwt_time_from.c_str(), Qt::ISODate);
|
|
||||||
}
|
|
||||||
|
|
||||||
QTime Utilities::SpecialDaysWorkTimeUntil(Configuration const *cfg, int specialDayId) {
|
|
||||||
return QTime::fromString(cfg->SpecialDaysWorktime.find(specialDayId)->second.pedwt_time_to.c_str(), Qt::ISODate);
|
|
||||||
}
|
|
||||||
|
|
||||||
QTime Utilities::WeekDaysWorkTimeFrom(std::multimap<int, ATBWeekDaysWorktime>::const_iterator itr) {
|
|
||||||
return QTime::fromString(itr->second.pwd_time_from.c_str(), Qt::ISODate);
|
|
||||||
}
|
|
||||||
|
|
||||||
QTime Utilities::WeekDaysWorkTimeUntil(std::multimap<int, ATBWeekDaysWorktime>::const_iterator itr) {
|
|
||||||
return QTime::fromString(itr->second.pwd_time_to.c_str(), Qt::ISODate);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool Utilities::isCarryOverSet(Configuration const *cfg, PaymentMethod paymentMethodId) {
|
|
||||||
return !isCarryOverNotSet(cfg, paymentMethodId);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool Utilities::isCarryOverNotSet(Configuration const *cfg, PaymentMethod paymentMethodId) {
|
|
||||||
return (cfg->PaymentOption.find(paymentMethodId)->second.pop_carry_over < 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
PaymentMethod Utilities::getPaymentMethodId(Configuration const *cfg) {
|
|
||||||
if (cfg->PaymentOption.size() != 1) {
|
|
||||||
return PaymentMethod::Undefined;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::multimap<int, ATBPaymentOption>::const_iterator it =
|
|
||||||
cfg->PaymentOption.cbegin();
|
|
||||||
|
|
||||||
switch (it->first) {
|
|
||||||
case PaymentMethod::Linear:
|
|
||||||
return PaymentMethod::Linear;
|
|
||||||
case PaymentMethod::Steps:
|
|
||||||
return PaymentMethod::Steps;
|
|
||||||
case PaymentMethod::Degressive:
|
|
||||||
return PaymentMethod::Degressive;
|
|
||||||
case PaymentMethod::Progressive:
|
|
||||||
return PaymentMethod::Progressive;
|
|
||||||
}
|
|
||||||
|
|
||||||
return PaymentMethod::Undefined;
|
|
||||||
}
|
|
||||||
|
@@ -26,72 +26,36 @@ extern "C" char* strptime(const char* s,
|
|||||||
|
|
||||||
#include <QDebug>
|
#include <QDebug>
|
||||||
#include <QDateTime>
|
#include <QDateTime>
|
||||||
#include <QDir>
|
|
||||||
|
|
||||||
#include <fstream>
|
|
||||||
#include <sstream>
|
|
||||||
#include "calculator_functions.h"
|
|
||||||
#include <calculate_price.h>
|
|
||||||
|
|
||||||
|
|
||||||
int main() {
|
int main() {
|
||||||
|
|
||||||
std::ifstream input("/tmp/tariff_korneuburg.json");
|
|
||||||
std::stringstream sstr;
|
|
||||||
while(input >> sstr.rdbuf());
|
|
||||||
std::string json(sstr.str());
|
|
||||||
|
|
||||||
Calculator calculator;
|
|
||||||
Configuration cfg;
|
|
||||||
|
|
||||||
bool isParsed = cfg.ParseJson(&cfg, json.c_str());
|
|
||||||
cout << endl;
|
|
||||||
|
|
||||||
|
|
||||||
if (isParsed)
|
|
||||||
{
|
|
||||||
QDateTime start = QDateTime::fromString("2023-11-27T17:50:00",Qt::ISODate);
|
|
||||||
//QDateTime start = QDateTime::currentDateTime();
|
|
||||||
QDateTime end = start.addSecs(120);
|
|
||||||
uint32_t cost = calculator.GetCostFromDuration(&cfg, 3, start, end, 60);
|
|
||||||
qCritical() << "cost=" << cost;
|
|
||||||
qCritical() << "end=" << end;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
parking_tariff_t *tariff = 0;
|
parking_tariff_t *tariff = 0;
|
||||||
if (init_tariff(&tariff, "/etc/psa_tariff/")) {
|
if (init_tariff(&tariff, "C:\\Users\\MROD\\Documents\\QtCreator\\Old\\build-MOBILISIS-Calculator-Desktop_Qt_5_12_12_MSVC2017_32bit-Debug\\main\\etc\\psa_tariff\\tariff01.json"))
|
||||||
|
{
|
||||||
struct price_t price;
|
struct price_t price;
|
||||||
memset(&price, 0x00, sizeof(price));
|
memset(&price, 0x00, sizeof(price));
|
||||||
|
QDateTime start = QDateTime::fromString("2023-06-01T07:50:00.000Z",Qt::ISODate); //QDateTime::currentDateTime();
|
||||||
QDateTime start = QDateTime::fromString("2023-05-11T07:50:00",Qt::ISODate); //QDateTime::currentDateTime();
|
|
||||||
time_t start_parking_time = start.toSecsSinceEpoch() / 60;
|
time_t start_parking_time = start.toSecsSinceEpoch() / 60;
|
||||||
time_t end_parking_time = start_parking_time + 615;
|
time_t end_parking_time = start_parking_time + 1230;
|
||||||
|
|
||||||
if (compute_price_for_parking_ticket(tariff,
|
// if (compute_price_for_parking_ticket(tariff,
|
||||||
start_parking_time,
|
// start_parking_time,
|
||||||
end_parking_time,
|
// end_parking_time,
|
||||||
&price))
|
// &price))
|
||||||
{
|
// {
|
||||||
qDebug() << "GetCostFromDuration() => price=" << price.netto;
|
// qDebug() << "GetCostFromDuration() => price=" << price.netto;
|
||||||
}
|
// }
|
||||||
|
|
||||||
QString duration;
|
// QString duration;
|
||||||
if(compute_duration_for_parking_ticket(tariff,start_parking_time,3090,duration))
|
// if(compute_duration_for_parking_ticket(tariff,start_parking_time,1650,duration))
|
||||||
{
|
// {
|
||||||
qDebug() << "GetDurationFromCost() => duration=" << duration;
|
// qDebug() << "GetDurationFromCost() => duration=" << duration;
|
||||||
}
|
// }
|
||||||
|
|
||||||
// Daily ticket
|
// Daily ticket
|
||||||
// compute_duration_for_daily_ticket(tariff,start.toString(Qt::ISODate),3);
|
// compute_duration_for_daily_ticket(tariff,start.toString(Qt::ISODate),3);
|
||||||
|
|
||||||
|
compute_duration_for_24hour_daily_ticket(tariff,start.toString(Qt::ISODate),3);
|
||||||
|
|
||||||
//Configuration* cfg, QString start_datetime, uint8_t payment_option, bool carry_over
|
//Configuration* cfg, QString start_datetime, uint8_t payment_option, bool carry_over
|
||||||
// // tests
|
// // tests
|
||||||
// struct tm now;
|
// struct tm now;
|
||||||
|
@@ -7,8 +7,6 @@ QMAKE_CFLAGS = -c -pipe -std=c11 -g -O0 -Wall -Wno-attributes -W -DDEBUG -D_REEN
|
|||||||
QMAKE_CXX_FLAGS += -std=c11
|
QMAKE_CXX_FLAGS += -std=c11
|
||||||
|
|
||||||
INCLUDEPATH += $$_PRO_FILE_PWD_/../../MOBILISIS-Calculator/library/include/mobilisis/
|
INCLUDEPATH += $$_PRO_FILE_PWD_/../../MOBILISIS-Calculator/library/include/mobilisis/
|
||||||
INCLUDEPATH += $$_PRO_FILE_PWD_/../../MOBILISIS-Calculator/library/include/rapidjson/
|
|
||||||
INCLUDEPATH += $$_PRO_FILE_PWD_/../../MOBILISIS-Calculator/library/include/
|
|
||||||
INCLUDEPATH += .
|
INCLUDEPATH += .
|
||||||
|
|
||||||
unix {
|
unix {
|
||||||
|
@@ -1,12 +1,9 @@
|
|||||||
{
|
{
|
||||||
"Project" : "Korneuburg",
|
|
||||||
"Version" : "1.0.0",
|
|
||||||
"Info" : "",
|
|
||||||
"Currency": [
|
"Currency": [
|
||||||
{
|
{
|
||||||
"pcu_id": 2,
|
"pcu_id": 2,
|
||||||
"pcu_sign": "€",
|
"pcu_sign": "Ft",
|
||||||
"pcu_major": "EUR",
|
"pcu_major": "HUF",
|
||||||
"pcu_minor": "",
|
"pcu_minor": "",
|
||||||
"pcu_active": true
|
"pcu_active": true
|
||||||
}
|
}
|
||||||
@@ -32,30 +29,32 @@
|
|||||||
"PaymentOption": [
|
"PaymentOption": [
|
||||||
{
|
{
|
||||||
"pop_id": 1049,
|
"pop_id": 1049,
|
||||||
"pop_label": "Zone 1",
|
"pop_label": "Zone Lila",
|
||||||
"pop_payment_method_id": 3,
|
"pop_payment_method_id": 3,
|
||||||
"pop_day_end_time": "00:00:00",
|
"pop_day_end_time": "16:25:00",
|
||||||
"pop_day_night_end_time": "00:00:00",
|
"pop_day_night_end_time": "16:25:00",
|
||||||
"pop_price_night": 0,
|
"pop_price_night": 0,
|
||||||
"pop_min_time": 30,
|
"pop_min_time": 15,
|
||||||
"pop_max_time": 180,
|
"pop_max_time": 300,
|
||||||
"pop_min_price": 60,
|
"pop_min_price": 0,
|
||||||
"pop_carry_over": 1,
|
"pop_carry_over": 1,
|
||||||
"pop_daily_card_price": 0
|
"pop_daily_card_price": 900,
|
||||||
|
"pop_multi_hour_price":500
|
||||||
|
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"PaymentRate": [
|
"PaymentRate": [
|
||||||
{
|
{
|
||||||
"pra_payment_option_id": 1049,
|
"pra_payment_option_id": 1049,
|
||||||
"pra_payment_unit_id": 1,
|
"pra_payment_unit_id": 1,
|
||||||
"pra_price": 10
|
"pra_price": 150
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"Duration": [
|
"Duration": [
|
||||||
{
|
{
|
||||||
"pun_id": 1,
|
"pun_id": 1,
|
||||||
"pun_label": "5 min",
|
"pun_label": "1h",
|
||||||
"pun_duration": 5
|
"pun_duration": 60
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"pun_id": 3,
|
"pun_id": 3,
|
||||||
@@ -74,13 +73,6 @@
|
|||||||
"pwd_period_week_day_id": 36,
|
"pwd_period_week_day_id": 36,
|
||||||
"pwd_period_day_in_week_id": 1,
|
"pwd_period_day_in_week_id": 1,
|
||||||
"pwd_time_from": "08:00:00",
|
"pwd_time_from": "08:00:00",
|
||||||
"pwd_time_to": "12:00:00"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"pwd_id": 621,
|
|
||||||
"pwd_period_week_day_id": 36,
|
|
||||||
"pwd_period_day_in_week_id": 1,
|
|
||||||
"pwd_time_from": "14:00:00",
|
|
||||||
"pwd_time_to": "18:00:00"
|
"pwd_time_to": "18:00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -88,13 +80,6 @@
|
|||||||
"pwd_period_week_day_id": 36,
|
"pwd_period_week_day_id": 36,
|
||||||
"pwd_period_day_in_week_id": 2,
|
"pwd_period_day_in_week_id": 2,
|
||||||
"pwd_time_from": "08:00:00",
|
"pwd_time_from": "08:00:00",
|
||||||
"pwd_time_to": "12:00:00"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"pwd_id": 622,
|
|
||||||
"pwd_period_week_day_id": 36,
|
|
||||||
"pwd_period_day_in_week_id": 2,
|
|
||||||
"pwd_time_from": "14:00:00",
|
|
||||||
"pwd_time_to": "18:00:00"
|
"pwd_time_to": "18:00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -102,13 +87,6 @@
|
|||||||
"pwd_period_week_day_id": 36,
|
"pwd_period_week_day_id": 36,
|
||||||
"pwd_period_day_in_week_id": 3,
|
"pwd_period_day_in_week_id": 3,
|
||||||
"pwd_time_from": "08:00:00",
|
"pwd_time_from": "08:00:00",
|
||||||
"pwd_time_to": "12:00:00"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"pwd_id": 623,
|
|
||||||
"pwd_period_week_day_id": 36,
|
|
||||||
"pwd_period_day_in_week_id": 3,
|
|
||||||
"pwd_time_from": "14:00:00",
|
|
||||||
"pwd_time_to": "18:00:00"
|
"pwd_time_to": "18:00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -116,13 +94,6 @@
|
|||||||
"pwd_period_week_day_id": 36,
|
"pwd_period_week_day_id": 36,
|
||||||
"pwd_period_day_in_week_id": 4,
|
"pwd_period_day_in_week_id": 4,
|
||||||
"pwd_time_from": "08:00:00",
|
"pwd_time_from": "08:00:00",
|
||||||
"pwd_time_to": "12:00:00"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"pwd_id": 624,
|
|
||||||
"pwd_period_week_day_id": 36,
|
|
||||||
"pwd_period_day_in_week_id": 4,
|
|
||||||
"pwd_time_from": "14:00:00",
|
|
||||||
"pwd_time_to": "18:00:00"
|
"pwd_time_to": "18:00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -130,21 +101,73 @@
|
|||||||
"pwd_period_week_day_id": 36,
|
"pwd_period_week_day_id": 36,
|
||||||
"pwd_period_day_in_week_id": 5,
|
"pwd_period_day_in_week_id": 5,
|
||||||
"pwd_time_from": "08:00:00",
|
"pwd_time_from": "08:00:00",
|
||||||
"pwd_time_to": "12:00:00"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"pwd_id": 625,
|
|
||||||
"pwd_period_week_day_id": 36,
|
|
||||||
"pwd_period_day_in_week_id": 5,
|
|
||||||
"pwd_time_from": "14:00:00",
|
|
||||||
"pwd_time_to": "18:00:00"
|
"pwd_time_to": "18:00:00"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"PeriodYear": [
|
||||||
|
{
|
||||||
|
"pye_id": 8,
|
||||||
|
"pye_label": "Whole year",
|
||||||
|
"pye_start_month": 1,
|
||||||
|
"pye_start_day": 1,
|
||||||
|
"pye_end_month": 12,
|
||||||
|
"pye_end_day": 31
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"pwd_id": 626,
|
"pye_id": 9,
|
||||||
"pwd_period_week_day_id": 36,
|
"pye_label": "Whole year",
|
||||||
"pwd_period_day_in_week_id": 6,
|
"pye_start_month": 1,
|
||||||
"pwd_time_from": "08:00:00",
|
"pye_start_day": 1,
|
||||||
"pwd_time_to": "12:00:00"
|
"pye_end_month": 12,
|
||||||
|
"pye_end_day": 31
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"pye_id": 10,
|
||||||
|
"pye_label": "Whole year",
|
||||||
|
"pye_start_month": 1,
|
||||||
|
"pye_start_day": 1,
|
||||||
|
"pye_end_month": 12,
|
||||||
|
"pye_end_day": 31
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"pye_id": 11,
|
||||||
|
"pye_label": "Whole Year",
|
||||||
|
"pye_start_month": 1,
|
||||||
|
"pye_start_day": 1,
|
||||||
|
"pye_end_month": 12,
|
||||||
|
"pye_end_day": 31
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"pye_id": 12,
|
||||||
|
"pye_label": "Whole Year",
|
||||||
|
"pye_start_month": 1,
|
||||||
|
"pye_start_day": 1,
|
||||||
|
"pye_end_month": 12,
|
||||||
|
"pye_end_day": 31
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"pye_id": 13,
|
||||||
|
"pye_label": "Whole Year",
|
||||||
|
"pye_start_month": 1,
|
||||||
|
"pye_start_day": 1,
|
||||||
|
"pye_end_month": 12,
|
||||||
|
"pye_end_day": 31
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"pye_id": 14,
|
||||||
|
"pye_label": "Whole Year",
|
||||||
|
"pye_start_month": 1,
|
||||||
|
"pye_start_day": 1,
|
||||||
|
"pye_end_month": 12,
|
||||||
|
"pye_end_day": 31
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"pye_id": 15,
|
||||||
|
"pye_label": "Whole year",
|
||||||
|
"pye_start_month": 1,
|
||||||
|
"pye_start_day": 1,
|
||||||
|
"pye_end_month": 12,
|
||||||
|
"pye_end_day": 31
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"SpecialDaysWorktime": [
|
"SpecialDaysWorktime": [
|
||||||
@@ -364,266 +387,421 @@
|
|||||||
"pedwt_time_from": "00:00:00",
|
"pedwt_time_from": "00:00:00",
|
||||||
"pedwt_time_to": "00:00:00",
|
"pedwt_time_to": "00:00:00",
|
||||||
"pedwt_price": 0
|
"pedwt_price": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"pedwt_id": 2260,
|
||||||
|
"pedwt_period_exc_day_id": 2061,
|
||||||
|
"pedwt_time_from": "00:00:00",
|
||||||
|
"pedwt_time_to": "00:00:00",
|
||||||
|
"pedwt_price": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"pedwt_id": 2261,
|
||||||
|
"pedwt_period_exc_day_id": 2062,
|
||||||
|
"pedwt_time_from": "00:00:00",
|
||||||
|
"pedwt_time_to": "00:00:00",
|
||||||
|
"pedwt_price": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"pedwt_id": 2262,
|
||||||
|
"pedwt_period_exc_day_id": 2063,
|
||||||
|
"pedwt_time_from": "00:00:00",
|
||||||
|
"pedwt_time_to": "00:00:00",
|
||||||
|
"pedwt_price": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"pedwt_id": 2263,
|
||||||
|
"pedwt_period_exc_day_id": 2064,
|
||||||
|
"pedwt_time_from": "00:00:00",
|
||||||
|
"pedwt_time_to": "00:00:00",
|
||||||
|
"pedwt_price": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"pedwt_id": 2264,
|
||||||
|
"pedwt_period_exc_day_id": 2065,
|
||||||
|
"pedwt_time_from": "00:00:00",
|
||||||
|
"pedwt_time_to": "00:00:00",
|
||||||
|
"pedwt_price": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"pedwt_id": 2265,
|
||||||
|
"pedwt_period_exc_day_id": 2066,
|
||||||
|
"pedwt_time_from": "00:00:00",
|
||||||
|
"pedwt_time_to": "00:00:00",
|
||||||
|
"pedwt_price": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"pedwt_id": 2266,
|
||||||
|
"pedwt_period_exc_day_id": 2067,
|
||||||
|
"pedwt_time_from": "00:00:00",
|
||||||
|
"pedwt_time_to": "00:00:00",
|
||||||
|
"pedwt_price": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"pedwt_id": 2267,
|
||||||
|
"pedwt_period_exc_day_id": 2068,
|
||||||
|
"pedwt_time_from": "00:00:00",
|
||||||
|
"pedwt_time_to": "00:00:00",
|
||||||
|
"pedwt_price": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"pedwt_id": 2268,
|
||||||
|
"pedwt_period_exc_day_id": 2069,
|
||||||
|
"pedwt_time_from": "00:00:00",
|
||||||
|
"pedwt_time_to": "00:00:00",
|
||||||
|
"pedwt_price": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"pedwt_id": 2269,
|
||||||
|
"pedwt_period_exc_day_id": 2070,
|
||||||
|
"pedwt_time_from": "00:00:00",
|
||||||
|
"pedwt_time_to": "00:00:00",
|
||||||
|
"pedwt_price": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"pedwt_id": 2270,
|
||||||
|
"pedwt_period_exc_day_id": 2071,
|
||||||
|
"pedwt_time_from": "00:00:00",
|
||||||
|
"pedwt_time_to": "00:00:00",
|
||||||
|
"pedwt_price": 0
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"SpecialDays": [
|
"SpecialDays": [
|
||||||
{
|
{
|
||||||
"ped_id": 11,
|
"ped_id": 11,
|
||||||
"ped_label": "Mariae Empfaengnis",
|
"ped_label": "Christmas 1st day",
|
||||||
"ped_date_start": "2023-12-08",
|
"ped_date_start": "2022-12-25",
|
||||||
"ped_date_end": "2023-12-08",
|
"ped_date_end": "2022-12-25",
|
||||||
"ped_period_special_day_id": 1,
|
"ped_period_special_day_id": 2,
|
||||||
"ped_year": 0
|
"ped_year": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"ped_id": 13,
|
"ped_id": 13,
|
||||||
"ped_label": "Christtag",
|
"ped_label": "Christmas 2nd day",
|
||||||
"ped_date_start": "2023-12-25",
|
"ped_date_start": "2022-12-26",
|
||||||
"ped_date_end": "2023-12-25",
|
"ped_date_end": "2022-12-26",
|
||||||
"ped_period_special_day_id": 1,
|
"ped_period_special_day_id": 2,
|
||||||
"ped_year": 0
|
"ped_year": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"ped_id": 14,
|
"ped_id": 14,
|
||||||
"ped_label": "Stefanitag",
|
"ped_label": "Republic Day (Hungary)",
|
||||||
"ped_date_start": "2023-12-26",
|
"ped_date_start": "2022-10-23",
|
||||||
"ped_date_end": "2023-12-26",
|
"ped_date_end": "2022-10-23",
|
||||||
"ped_period_special_day_id": 1,
|
"ped_period_special_day_id": 2,
|
||||||
"ped_year": 0
|
"ped_year": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"ped_id": 2016,
|
"ped_id": 2016,
|
||||||
"ped_label": "Neujahr",
|
"ped_label": "Christmas (Sunday)",
|
||||||
"ped_date_start": "2024-01-01",
|
"ped_date_start": "2022-12-24",
|
||||||
"ped_date_end": "2024-01-01",
|
"ped_date_end": "2022-12-24",
|
||||||
"ped_period_special_day_id": 1,
|
"ped_period_special_day_id": 2,
|
||||||
"ped_year": 0
|
"ped_year": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"ped_id": 2021,
|
"ped_id": 2021,
|
||||||
"ped_label": "Heilig Drei Koenige",
|
"ped_label": "Holiday (Hungary)",
|
||||||
"ped_date_start": "2024-01-06",
|
"ped_date_start": "2022-12-31",
|
||||||
"ped_date_end": "2024-01-06",
|
"ped_date_end": "2022-12-31",
|
||||||
"ped_period_special_day_id": 1,
|
"ped_period_special_day_id": 1,
|
||||||
"ped_year": 0
|
"ped_year": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"ped_id": 2022,
|
"ped_id": 2022,
|
||||||
"ped_label": "Ostermontag",
|
"ped_label": "NewYear",
|
||||||
"ped_date_start": "2024-01-04",
|
"ped_date_start": "2023-01-01",
|
||||||
"ped_date_end": "2024-01-04",
|
"ped_date_end": "2023-01-01",
|
||||||
"ped_period_special_day_id": 1,
|
"ped_period_special_day_id": 2,
|
||||||
"ped_year": 2024
|
"ped_year": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"ped_id": 2024,
|
"ped_id": 2024,
|
||||||
"ped_label": "Staatsfeiertag",
|
"ped_label": "Good Friday",
|
||||||
"ped_date_start": "2024-05-01",
|
"ped_date_start": "2023-04-07",
|
||||||
"ped_date_end": "2024-05-01",
|
"ped_date_end": "2023-04-07",
|
||||||
"ped_period_special_day_id": 1,
|
"ped_period_special_day_id": 2,
|
||||||
"ped_year": 0
|
"ped_year": 2023
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"ped_id": 2025,
|
"ped_id": 2025,
|
||||||
"ped_label": "Christi Himmelfahrt",
|
"ped_label": "Easter Sunday",
|
||||||
"ped_date_start": "2024-05-09",
|
"ped_date_start": "2023-04-09",
|
||||||
"ped_date_end": "2024-05-09",
|
"ped_date_end": "2023-04-09",
|
||||||
"ped_period_special_day_id": 1,
|
"ped_period_special_day_id": 2,
|
||||||
"ped_year": 2024
|
"ped_year": 2023
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"ped_id": 2026,
|
"ped_id": 2026,
|
||||||
"ped_label": "Pfingst Montag",
|
"ped_label": "Easter Monday",
|
||||||
"ped_date_start": "2024-05-20",
|
"ped_date_start": "2023-04-10",
|
||||||
"ped_date_end": "2024-05-20",
|
"ped_date_end": "2023-04-10",
|
||||||
"ped_period_special_day_id": 1,
|
"ped_period_special_day_id": 2,
|
||||||
"ped_year": 2024
|
"ped_year": 2023
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"ped_id": 2027,
|
"ped_id": 2027,
|
||||||
"ped_label": "Fronleichnam",
|
"ped_label": "Whit Sunday",
|
||||||
"ped_date_start": "2024-05-30",
|
"ped_date_start": "2023-05-28",
|
||||||
"ped_date_end": "2024-05-30",
|
"ped_date_end": "2023-05-28",
|
||||||
"ped_period_special_day_id": 1,
|
"ped_period_special_day_id": 2,
|
||||||
"ped_year": 2024
|
"ped_year": 2023
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"ped_id": 2028,
|
"ped_id": 2028,
|
||||||
"ped_label": "Maria Himmelfahrt",
|
"ped_label": "Whit Monday",
|
||||||
"ped_date_start": "2024-08-15",
|
"ped_date_start": "2023-05-29",
|
||||||
"ped_date_end": "2024-08-15",
|
"ped_date_end": "2023-05-29",
|
||||||
"ped_period_special_day_id": 1,
|
"ped_period_special_day_id": 2,
|
||||||
"ped_year": 0
|
"ped_year": 2023
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"ped_id": 2029,
|
"ped_id": 2029,
|
||||||
"ped_label": "Nationalfeiertag",
|
"ped_label": "Revolution Day (Hungary)",
|
||||||
"ped_date_start": "2024-10-26",
|
"ped_date_start": "2023-03-15",
|
||||||
"ped_date_end": "2024-10-26",
|
"ped_date_end": "2023-03-15",
|
||||||
"ped_period_special_day_id": 1,
|
"ped_period_special_day_id": 2,
|
||||||
"ped_year": 0
|
"ped_year": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"ped_id": 2030,
|
"ped_id": 2030,
|
||||||
"ped_label": "Allerheiligen",
|
"ped_label": "Labour Day",
|
||||||
"ped_date_start": "2024-11-01",
|
"ped_date_start": "2023-05-01",
|
||||||
"ped_date_end": "2024-11-01",
|
"ped_date_end": "2023-05-01",
|
||||||
"ped_period_special_day_id": 1,
|
"ped_period_special_day_id": 2,
|
||||||
"ped_year": 0
|
"ped_year": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"ped_id": 2031,
|
"ped_id": 2031,
|
||||||
"ped_label": "Mariae Empfaengnis",
|
"ped_label": "Saint Stephens Day (Hungary)",
|
||||||
"ped_date_start": "2024-08-12",
|
"ped_date_start": "2023-08-20",
|
||||||
"ped_date_end": "2024-08-12",
|
"ped_date_end": "2023-08-20",
|
||||||
"ped_period_special_day_id": 1,
|
"ped_period_special_day_id": 2,
|
||||||
"ped_year": 0
|
"ped_year": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"ped_id": 2032,
|
"ped_id": 2032,
|
||||||
"ped_label": "Christtag",
|
"ped_label": "All Saints Day",
|
||||||
"ped_date_start": "2024-12-25",
|
"ped_date_start": "2023-11-01",
|
||||||
"ped_date_end": "2024-12-25",
|
"ped_date_end": "2023-11-01",
|
||||||
"ped_period_special_day_id": 1,
|
"ped_period_special_day_id": 2,
|
||||||
"ped_year": 0
|
"ped_year": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"ped_id": 2034,
|
"ped_id": 2034,
|
||||||
"ped_label": "Stefanitag",
|
"ped_label": "Good Friday",
|
||||||
"ped_date_start": "2024-12-26",
|
"ped_date_start": "2024-03-29",
|
||||||
"ped_date_end": "2024-12-26",
|
"ped_date_end": "2024-03-29",
|
||||||
"ped_period_special_day_id": 1,
|
"ped_period_special_day_id": 2,
|
||||||
"ped_year": 0
|
"ped_year": 2024
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"ped_id": 2035,
|
"ped_id": 2035,
|
||||||
"ped_label": "Neujahr",
|
"ped_label": "Easter",
|
||||||
"ped_date_start": "2025-01-01",
|
"ped_date_start": "2024-03-31",
|
||||||
"ped_date_end": "2025-01-01",
|
"ped_date_end": "2024-03-31",
|
||||||
"ped_period_special_day_id": 1,
|
"ped_period_special_day_id": 2,
|
||||||
"ped_year": 0
|
"ped_year": 2024
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"ped_id": 2036,
|
"ped_id": 2036,
|
||||||
"ped_label": "Heilig Drei Koenige",
|
"ped_label": "Easter Monday",
|
||||||
"ped_date_start": "2025-06-01",
|
"ped_date_start": "2024-04-01",
|
||||||
"ped_date_end": "2025-06-01",
|
"ped_date_end": "2024-04-01",
|
||||||
|
"ped_period_special_day_id": 2,
|
||||||
|
"ped_year": 2024
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ped_id": 2037,
|
||||||
|
"ped_label": "Whit Monday",
|
||||||
|
"ped_date_start": "2024-05-20",
|
||||||
|
"ped_date_end": "2024-05-20",
|
||||||
|
"ped_period_special_day_id": 2,
|
||||||
|
"ped_year": 2024
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ped_id": 2038,
|
||||||
|
"ped_label": "Whit Sunday",
|
||||||
|
"ped_date_start": "2024-05-19",
|
||||||
|
"ped_date_end": "2024-05-19",
|
||||||
|
"ped_period_special_day_id": 2,
|
||||||
|
"ped_year": 2024
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ped_id": 2050,
|
||||||
|
"ped_label": "Uskrs",
|
||||||
|
"ped_date_start": "2023-04-16",
|
||||||
|
"ped_date_end": "2023-04-16",
|
||||||
"ped_period_special_day_id": 1,
|
"ped_period_special_day_id": 1,
|
||||||
"ped_year": 0
|
"ped_year": 0
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"ped_id": 2037,
|
|
||||||
"ped_label": "Ostermontag",
|
|
||||||
"ped_date_start": "2025-04-21",
|
|
||||||
"ped_date_end": "2025-04-21",
|
|
||||||
"ped_period_special_day_id": 1,
|
|
||||||
"ped_year": 2025
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"ped_id": 2038,
|
|
||||||
"ped_label": "Staatsfeiertag",
|
|
||||||
"ped_date_start": "2025-05-01",
|
|
||||||
"ped_date_end": "2025-05-01",
|
|
||||||
"ped_period_special_day_id": 1,
|
|
||||||
"ped_year": 2025
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"ped_id": 2050,
|
|
||||||
"ped_label": "Christi Himmelfahrt",
|
|
||||||
"ped_date_start": "2025-05-29",
|
|
||||||
"ped_date_end": "2025-05-29",
|
|
||||||
"ped_period_special_day_id": 1,
|
|
||||||
"ped_year": 2025
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"ped_id": 2051,
|
"ped_id": 2051,
|
||||||
"ped_label": "Pfingstmontag",
|
"ped_label": "Uskrs",
|
||||||
"ped_date_start": "2025-06-09",
|
"ped_date_start": "2023-04-16",
|
||||||
"ped_date_end": "2025-06-09",
|
"ped_date_end": "2023-04-16",
|
||||||
"ped_period_special_day_id": 1,
|
"ped_period_special_day_id": 1,
|
||||||
"ped_year": 2025
|
"ped_year": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"ped_id": 2052,
|
"ped_id": 2052,
|
||||||
"ped_label": "Fronlaeichnam",
|
"ped_label": "Christmas 1st day",
|
||||||
"ped_date_start": "2025-06-19",
|
"ped_date_start": "2022-12-25",
|
||||||
"ped_date_end": "2025-06-19",
|
"ped_date_end": "2022-12-25",
|
||||||
"ped_period_special_day_id": 1,
|
"ped_period_special_day_id": 2,
|
||||||
"ped_year": 2025
|
"ped_year": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"ped_id": 2053,
|
"ped_id": 2053,
|
||||||
"ped_label": "Mariae Himmelfahrt",
|
"ped_label": "Christmas 2nd day",
|
||||||
"ped_date_start": "2025-08-15",
|
"ped_date_start": "2022-12-26",
|
||||||
"ped_date_end": "2025-08-15",
|
"ped_date_end": "2022-12-26",
|
||||||
"ped_period_special_day_id": 1,
|
"ped_period_special_day_id": 2,
|
||||||
"ped_year": 0
|
"ped_year": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"ped_id": 2054,
|
"ped_id": 2054,
|
||||||
"ped_label": "Nationalfeiertag",
|
"ped_label": "Republic Day (Hungary)",
|
||||||
"ped_date_start": "2025-10-26",
|
"ped_date_start": "2022-10-23",
|
||||||
"ped_date_end": "2025-10-26",
|
"ped_date_end": "2022-10-23",
|
||||||
"ped_period_special_day_id": 1,
|
"ped_period_special_day_id": 2,
|
||||||
"ped_year": 0
|
"ped_year": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"ped_id": 2055,
|
"ped_id": 2055,
|
||||||
"ped_label": "Allerheiligen",
|
"ped_label": "Christmas (Sunday)",
|
||||||
"ped_date_start": "2025-11-01",
|
"ped_date_start": "2022-12-24",
|
||||||
"ped_date_end": "2025-11-01",
|
"ped_date_end": "2022-12-24",
|
||||||
"ped_period_special_day_id": 1,
|
"ped_period_special_day_id": 2,
|
||||||
"ped_year": 0
|
"ped_year": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"ped_id": 2056,
|
"ped_id": 2056,
|
||||||
"ped_label": "Mariae Empfaengnis",
|
"ped_label": "Holiday (Hungary)",
|
||||||
"ped_date_start": "2025-12-08",
|
"ped_date_start": "2022-12-31",
|
||||||
"ped_date_end": "2025-12-08",
|
"ped_date_end": "2022-12-31",
|
||||||
"ped_period_special_day_id": 1,
|
"ped_period_special_day_id": 1,
|
||||||
"ped_year": 0
|
"ped_year": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"ped_id": 2057,
|
"ped_id": 2057,
|
||||||
"ped_label": "Christtag",
|
"ped_label": "NewYear",
|
||||||
"ped_date_start": "2025-12-25",
|
"ped_date_start": "2023-01-01",
|
||||||
"ped_date_end": "2025-12-25",
|
"ped_date_end": "2023-01-01",
|
||||||
"ped_period_special_day_id": 1,
|
"ped_period_special_day_id": 2,
|
||||||
"ped_year": 0
|
"ped_year": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"ped_id": 2058,
|
"ped_id": 2058,
|
||||||
"ped_label": "Stefanitag",
|
"ped_label": "Good Friday",
|
||||||
"ped_date_start": "2025-12-26",
|
"ped_date_start": "2023-04-07",
|
||||||
"ped_date_end": "2025-12-26",
|
"ped_date_end": "2023-04-07",
|
||||||
"ped_period_special_day_id": 1,
|
"ped_period_special_day_id": 2,
|
||||||
"ped_year": 0
|
"ped_year": 2023
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"ped_id": 2059,
|
"ped_id": 2059,
|
||||||
"ped_label": "Neujahr",
|
"ped_label": "Easter Sunday",
|
||||||
"ped_date_start": "2026-01-01",
|
"ped_date_start": "2023-04-09",
|
||||||
"ped_date_end": "2026-01-01",
|
"ped_date_end": "2023-04-09",
|
||||||
"ped_period_special_day_id": 1,
|
"ped_period_special_day_id": 2,
|
||||||
"ped_year": 0
|
"ped_year": 2023
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"ped_id": 2060,
|
"ped_id": 2060,
|
||||||
"ped_label": "Heilige Drei Koenige",
|
"ped_label": "Easter Monday",
|
||||||
"ped_date_start": "2026-01-06",
|
"ped_date_start": "2023-04-10",
|
||||||
"ped_date_end": "2026-01-06",
|
"ped_date_end": "2023-04-10",
|
||||||
"ped_period_special_day_id": 1,
|
"ped_period_special_day_id": 2,
|
||||||
"ped_year": 0
|
"ped_year": 2023
|
||||||
}
|
},
|
||||||
],
|
|
||||||
"PeriodYear": [
|
|
||||||
{
|
{
|
||||||
"pye_id": 8,
|
"ped_id": 2061,
|
||||||
"pye_label": "Whole year",
|
"ped_label": "Whit Sunday",
|
||||||
"pye_start_month": 1,
|
"ped_date_start": "2023-05-28",
|
||||||
"pye_start_day": 1,
|
"ped_date_end": "2023-05-28",
|
||||||
"pye_end_month": 12,
|
"ped_period_special_day_id": 2,
|
||||||
"pye_end_day": 31
|
"ped_year": 2023
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ped_id": 2062,
|
||||||
|
"ped_label": "Whit Monday",
|
||||||
|
"ped_date_start": "2023-05-29",
|
||||||
|
"ped_date_end": "2023-05-29",
|
||||||
|
"ped_period_special_day_id": 2,
|
||||||
|
"ped_year": 2023
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ped_id": 2063,
|
||||||
|
"ped_label": "Revolution Day (Hungary)",
|
||||||
|
"ped_date_start": "2023-03-15",
|
||||||
|
"ped_date_end": "2023-03-15",
|
||||||
|
"ped_period_special_day_id": 2,
|
||||||
|
"ped_year": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ped_id": 2064,
|
||||||
|
"ped_label": "Labour Day",
|
||||||
|
"ped_date_start": "2023-05-01",
|
||||||
|
"ped_date_end": "2023-05-01",
|
||||||
|
"ped_period_special_day_id": 2,
|
||||||
|
"ped_year": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ped_id": 2065,
|
||||||
|
"ped_label": "Saint Stephens Day (Hungary)",
|
||||||
|
"ped_date_start": "2023-08-20",
|
||||||
|
"ped_date_end": "2023-08-20",
|
||||||
|
"ped_period_special_day_id": 2,
|
||||||
|
"ped_year": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ped_id": 2066,
|
||||||
|
"ped_label": "All Saints Day",
|
||||||
|
"ped_date_start": "2023-11-01",
|
||||||
|
"ped_date_end": "2023-11-01",
|
||||||
|
"ped_period_special_day_id": 2,
|
||||||
|
"ped_year": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ped_id": 2067,
|
||||||
|
"ped_label": "Good Friday",
|
||||||
|
"ped_date_start": "2024-03-29",
|
||||||
|
"ped_date_end": "2024-03-29",
|
||||||
|
"ped_period_special_day_id": 2,
|
||||||
|
"ped_year": 2024
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ped_id": 2068,
|
||||||
|
"ped_label": "Easter",
|
||||||
|
"ped_date_start": "2024-03-31",
|
||||||
|
"ped_date_end": "2024-03-31",
|
||||||
|
"ped_period_special_day_id": 2,
|
||||||
|
"ped_year": 2024
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ped_id": 2069,
|
||||||
|
"ped_label": "Easter Monday",
|
||||||
|
"ped_date_start": "2024-04-01",
|
||||||
|
"ped_date_end": "2024-04-01",
|
||||||
|
"ped_period_special_day_id": 2,
|
||||||
|
"ped_year": 2024
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ped_id": 2070,
|
||||||
|
"ped_label": "Whit Monday",
|
||||||
|
"ped_date_start": "2024-05-20",
|
||||||
|
"ped_date_end": "2024-05-20",
|
||||||
|
"ped_period_special_day_id": 2,
|
||||||
|
"ped_year": 2024
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ped_id": 2071,
|
||||||
|
"ped_label": "Whit Sunday",
|
||||||
|
"ped_date_start": "2024-05-19",
|
||||||
|
"ped_date_end": "2024-05-19",
|
||||||
|
"ped_period_special_day_id": 2,
|
||||||
|
"ped_year": 2024
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -1,629 +0,0 @@
|
|||||||
{
|
|
||||||
"Project" : "Korneuburg",
|
|
||||||
"Version" : "1.0.0",
|
|
||||||
"Info" : "",
|
|
||||||
"Currency": [
|
|
||||||
{
|
|
||||||
"pcu_id": 2,
|
|
||||||
"pcu_sign": "€",
|
|
||||||
"pcu_major": "EUR",
|
|
||||||
"pcu_minor": "",
|
|
||||||
"pcu_active": true
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"PaymentMethod": [
|
|
||||||
{
|
|
||||||
"pme_id": 1,
|
|
||||||
"pme_label": "progressive"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"pme_id": 2,
|
|
||||||
"pme_label": "degressive"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"pme_id": 3,
|
|
||||||
"pme_label": "linear"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"pme_id": 4,
|
|
||||||
"pme_label": "steps"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"PaymentOption": [
|
|
||||||
{
|
|
||||||
"pop_id": 1049,
|
|
||||||
"pop_label": "Zone 1",
|
|
||||||
"pop_payment_method_id": 3,
|
|
||||||
"pop_day_end_time": "00:00:00",
|
|
||||||
"pop_day_night_end_time": "00:00:00",
|
|
||||||
"pop_price_night": 0,
|
|
||||||
"pop_min_time": 30,
|
|
||||||
"pop_max_time": 180,
|
|
||||||
"pop_min_price": 60,
|
|
||||||
"pop_carry_over": 1,
|
|
||||||
"pop_daily_card_price": 0
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"PaymentRate": [
|
|
||||||
{
|
|
||||||
"pra_payment_option_id": 1049,
|
|
||||||
"pra_payment_unit_id": 1,
|
|
||||||
"pra_price": 10
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"Duration": [
|
|
||||||
{
|
|
||||||
"pun_id": 1,
|
|
||||||
"pun_label": "5 min",
|
|
||||||
"pun_duration": 5
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"pun_id": 3,
|
|
||||||
"pun_label": "15 min",
|
|
||||||
"pun_duration": 15
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"pun_id": 4,
|
|
||||||
"pun_label": "1 min",
|
|
||||||
"pun_duration": 1
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"WeekDaysWorktime": [
|
|
||||||
{
|
|
||||||
"pwd_id": 621,
|
|
||||||
"pwd_period_week_day_id": 36,
|
|
||||||
"pwd_period_day_in_week_id": 1,
|
|
||||||
"pwd_time_from": "08:00:00",
|
|
||||||
"pwd_time_to": "12:00:00"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"pwd_id": 621,
|
|
||||||
"pwd_period_week_day_id": 36,
|
|
||||||
"pwd_period_day_in_week_id": 1,
|
|
||||||
"pwd_time_from": "14:00:00",
|
|
||||||
"pwd_time_to": "18:00:00"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"pwd_id": 622,
|
|
||||||
"pwd_period_week_day_id": 36,
|
|
||||||
"pwd_period_day_in_week_id": 2,
|
|
||||||
"pwd_time_from": "08:00:00",
|
|
||||||
"pwd_time_to": "12:00:00"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"pwd_id": 622,
|
|
||||||
"pwd_period_week_day_id": 36,
|
|
||||||
"pwd_period_day_in_week_id": 2,
|
|
||||||
"pwd_time_from": "14:00:00",
|
|
||||||
"pwd_time_to": "18:00:00"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"pwd_id": 623,
|
|
||||||
"pwd_period_week_day_id": 36,
|
|
||||||
"pwd_period_day_in_week_id": 3,
|
|
||||||
"pwd_time_from": "08:00:00",
|
|
||||||
"pwd_time_to": "12:00:00"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"pwd_id": 623,
|
|
||||||
"pwd_period_week_day_id": 36,
|
|
||||||
"pwd_period_day_in_week_id": 3,
|
|
||||||
"pwd_time_from": "14:00:00",
|
|
||||||
"pwd_time_to": "18:00:00"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"pwd_id": 624,
|
|
||||||
"pwd_period_week_day_id": 36,
|
|
||||||
"pwd_period_day_in_week_id": 4,
|
|
||||||
"pwd_time_from": "08:00:00",
|
|
||||||
"pwd_time_to": "12:00:00"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"pwd_id": 624,
|
|
||||||
"pwd_period_week_day_id": 36,
|
|
||||||
"pwd_period_day_in_week_id": 4,
|
|
||||||
"pwd_time_from": "14:00:00",
|
|
||||||
"pwd_time_to": "18:00:00"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"pwd_id": 625,
|
|
||||||
"pwd_period_week_day_id": 36,
|
|
||||||
"pwd_period_day_in_week_id": 5,
|
|
||||||
"pwd_time_from": "08:00:00",
|
|
||||||
"pwd_time_to": "12:00:00"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"pwd_id": 625,
|
|
||||||
"pwd_period_week_day_id": 36,
|
|
||||||
"pwd_period_day_in_week_id": 5,
|
|
||||||
"pwd_time_from": "14:00:00",
|
|
||||||
"pwd_time_to": "18:00:00"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"pwd_id": 626,
|
|
||||||
"pwd_period_week_day_id": 36,
|
|
||||||
"pwd_period_day_in_week_id": 6,
|
|
||||||
"pwd_time_from": "08:00:00",
|
|
||||||
"pwd_time_to": "12:00:00"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"SpecialDaysWorktime": [
|
|
||||||
{
|
|
||||||
"pedwt_id": 2156,
|
|
||||||
"pedwt_period_exc_day_id": 2024,
|
|
||||||
"pedwt_time_from": "00:00:00",
|
|
||||||
"pedwt_time_to": "00:00:00",
|
|
||||||
"pedwt_price": 0
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"pedwt_id": 2158,
|
|
||||||
"pedwt_period_exc_day_id": 2025,
|
|
||||||
"pedwt_time_from": "00:00:00",
|
|
||||||
"pedwt_time_to": "00:00:00",
|
|
||||||
"pedwt_price": 0
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"pedwt_id": 2160,
|
|
||||||
"pedwt_period_exc_day_id": 2026,
|
|
||||||
"pedwt_time_from": "00:00:00",
|
|
||||||
"pedwt_time_to": "00:00:00",
|
|
||||||
"pedwt_price": 0
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"pedwt_id": 2162,
|
|
||||||
"pedwt_period_exc_day_id": 2027,
|
|
||||||
"pedwt_time_from": "00:00:00",
|
|
||||||
"pedwt_time_to": "00:00:00",
|
|
||||||
"pedwt_price": 0
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"pedwt_id": 2164,
|
|
||||||
"pedwt_period_exc_day_id": 2028,
|
|
||||||
"pedwt_time_from": "00:00:00",
|
|
||||||
"pedwt_time_to": "00:00:00",
|
|
||||||
"pedwt_price": 0
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"pedwt_id": 2170,
|
|
||||||
"pedwt_period_exc_day_id": 2030,
|
|
||||||
"pedwt_time_from": "00:00:00",
|
|
||||||
"pedwt_time_to": "00:00:00",
|
|
||||||
"pedwt_price": 0
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"pedwt_id": 2172,
|
|
||||||
"pedwt_period_exc_day_id": 2032,
|
|
||||||
"pedwt_time_from": "00:00:00",
|
|
||||||
"pedwt_time_to": "00:00:00",
|
|
||||||
"pedwt_price": 0
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"pedwt_id": 2174,
|
|
||||||
"pedwt_period_exc_day_id": 11,
|
|
||||||
"pedwt_time_from": "00:00:00",
|
|
||||||
"pedwt_time_to": "00:00:00",
|
|
||||||
"pedwt_price": 0
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"pedwt_id": 2175,
|
|
||||||
"pedwt_period_exc_day_id": 13,
|
|
||||||
"pedwt_time_from": "00:00:00",
|
|
||||||
"pedwt_time_to": "00:00:00",
|
|
||||||
"pedwt_price": 0
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"pedwt_id": 2178,
|
|
||||||
"pedwt_period_exc_day_id": 2022,
|
|
||||||
"pedwt_time_from": "00:00:00",
|
|
||||||
"pedwt_time_to": "00:00:00",
|
|
||||||
"pedwt_price": 0
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"pedwt_id": 2179,
|
|
||||||
"pedwt_period_exc_day_id": 14,
|
|
||||||
"pedwt_time_from": "00:00:00",
|
|
||||||
"pedwt_time_to": "00:00:00",
|
|
||||||
"pedwt_price": 0
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"pedwt_id": 2184,
|
|
||||||
"pedwt_period_exc_day_id": 2021,
|
|
||||||
"pedwt_time_from": "00:00:00",
|
|
||||||
"pedwt_time_to": "00:00:00",
|
|
||||||
"pedwt_price": 0
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"pedwt_id": 2188,
|
|
||||||
"pedwt_period_exc_day_id": 2031,
|
|
||||||
"pedwt_time_from": "00:00:00",
|
|
||||||
"pedwt_time_to": "00:00:00",
|
|
||||||
"pedwt_price": 0
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"pedwt_id": 2189,
|
|
||||||
"pedwt_period_exc_day_id": 2029,
|
|
||||||
"pedwt_time_from": "00:00:00",
|
|
||||||
"pedwt_time_to": "00:00:00",
|
|
||||||
"pedwt_price": 0
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"pedwt_id": 2194,
|
|
||||||
"pedwt_period_exc_day_id": 2034,
|
|
||||||
"pedwt_time_from": "00:00:00",
|
|
||||||
"pedwt_time_to": "00:00:00",
|
|
||||||
"pedwt_price": 0
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"pedwt_id": 2200,
|
|
||||||
"pedwt_period_exc_day_id": 2037,
|
|
||||||
"pedwt_time_from": "00:00:00",
|
|
||||||
"pedwt_time_to": "00:00:00",
|
|
||||||
"pedwt_price": 0
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"pedwt_id": 2202,
|
|
||||||
"pedwt_period_exc_day_id": 2038,
|
|
||||||
"pedwt_time_from": "00:00:00",
|
|
||||||
"pedwt_time_to": "00:00:00",
|
|
||||||
"pedwt_price": 0
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"pedwt_id": 2226,
|
|
||||||
"pedwt_period_exc_day_id": 2016,
|
|
||||||
"pedwt_time_from": "00:00:00",
|
|
||||||
"pedwt_time_to": "00:00:00",
|
|
||||||
"pedwt_price": 0
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"pedwt_id": 2245,
|
|
||||||
"pedwt_period_exc_day_id": 2035,
|
|
||||||
"pedwt_time_from": "00:00:00",
|
|
||||||
"pedwt_time_to": "00:00:00",
|
|
||||||
"pedwt_price": 0
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"pedwt_id": 2246,
|
|
||||||
"pedwt_period_exc_day_id": 2036,
|
|
||||||
"pedwt_time_from": "00:00:00",
|
|
||||||
"pedwt_time_to": "00:00:00",
|
|
||||||
"pedwt_price": 0
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"pedwt_id": 2249,
|
|
||||||
"pedwt_period_exc_day_id": 2050,
|
|
||||||
"pedwt_time_from": "08:00:00",
|
|
||||||
"pedwt_time_to": "16:00:00",
|
|
||||||
"pedwt_price": 0
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"pedwt_id": 2250,
|
|
||||||
"pedwt_period_exc_day_id": 2051,
|
|
||||||
"pedwt_time_from": "08:00:00",
|
|
||||||
"pedwt_time_to": "16:00:00",
|
|
||||||
"pedwt_price": 0
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"pedwt_id": 2251,
|
|
||||||
"pedwt_period_exc_day_id": 2052,
|
|
||||||
"pedwt_time_from": "00:00:00",
|
|
||||||
"pedwt_time_to": "00:00:00",
|
|
||||||
"pedwt_price": 0
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"pedwt_id": 2252,
|
|
||||||
"pedwt_period_exc_day_id": 2053,
|
|
||||||
"pedwt_time_from": "00:00:00",
|
|
||||||
"pedwt_time_to": "00:00:00",
|
|
||||||
"pedwt_price": 0
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"pedwt_id": 2253,
|
|
||||||
"pedwt_period_exc_day_id": 2054,
|
|
||||||
"pedwt_time_from": "00:00:00",
|
|
||||||
"pedwt_time_to": "00:00:00",
|
|
||||||
"pedwt_price": 0
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"pedwt_id": 2254,
|
|
||||||
"pedwt_period_exc_day_id": 2055,
|
|
||||||
"pedwt_time_from": "00:00:00",
|
|
||||||
"pedwt_time_to": "00:00:00",
|
|
||||||
"pedwt_price": 0
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"pedwt_id": 2255,
|
|
||||||
"pedwt_period_exc_day_id": 2056,
|
|
||||||
"pedwt_time_from": "00:00:00",
|
|
||||||
"pedwt_time_to": "00:00:00",
|
|
||||||
"pedwt_price": 0
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"pedwt_id": 2256,
|
|
||||||
"pedwt_period_exc_day_id": 2057,
|
|
||||||
"pedwt_time_from": "00:00:00",
|
|
||||||
"pedwt_time_to": "00:00:00",
|
|
||||||
"pedwt_price": 0
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"pedwt_id": 2257,
|
|
||||||
"pedwt_period_exc_day_id": 2058,
|
|
||||||
"pedwt_time_from": "00:00:00",
|
|
||||||
"pedwt_time_to": "00:00:00",
|
|
||||||
"pedwt_price": 0
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"pedwt_id": 2258,
|
|
||||||
"pedwt_period_exc_day_id": 2059,
|
|
||||||
"pedwt_time_from": "00:00:00",
|
|
||||||
"pedwt_time_to": "00:00:00",
|
|
||||||
"pedwt_price": 0
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"pedwt_id": 2259,
|
|
||||||
"pedwt_period_exc_day_id": 2060,
|
|
||||||
"pedwt_time_from": "00:00:00",
|
|
||||||
"pedwt_time_to": "00:00:00",
|
|
||||||
"pedwt_price": 0
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"SpecialDays": [
|
|
||||||
{
|
|
||||||
"ped_id": 11,
|
|
||||||
"ped_label": "Mariae Empfaengnis",
|
|
||||||
"ped_date_start": "2023-12-08",
|
|
||||||
"ped_date_end": "2023-12-08",
|
|
||||||
"ped_period_special_day_id": 1,
|
|
||||||
"ped_year": 0
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"ped_id": 13,
|
|
||||||
"ped_label": "Christtag",
|
|
||||||
"ped_date_start": "2023-12-25",
|
|
||||||
"ped_date_end": "2023-12-25",
|
|
||||||
"ped_period_special_day_id": 1,
|
|
||||||
"ped_year": 0
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"ped_id": 14,
|
|
||||||
"ped_label": "Stefanitag",
|
|
||||||
"ped_date_start": "2023-12-26",
|
|
||||||
"ped_date_end": "2023-12-26",
|
|
||||||
"ped_period_special_day_id": 1,
|
|
||||||
"ped_year": 0
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"ped_id": 2016,
|
|
||||||
"ped_label": "Neujahr",
|
|
||||||
"ped_date_start": "2024-01-01",
|
|
||||||
"ped_date_end": "2024-01-01",
|
|
||||||
"ped_period_special_day_id": 1,
|
|
||||||
"ped_year": 0
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"ped_id": 2021,
|
|
||||||
"ped_label": "Heilig Drei Koenige",
|
|
||||||
"ped_date_start": "2024-01-06",
|
|
||||||
"ped_date_end": "2024-01-06",
|
|
||||||
"ped_period_special_day_id": 1,
|
|
||||||
"ped_year": 0
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"ped_id": 2022,
|
|
||||||
"ped_label": "Ostermontag",
|
|
||||||
"ped_date_start": "2024-01-04",
|
|
||||||
"ped_date_end": "2024-01-04",
|
|
||||||
"ped_period_special_day_id": 1,
|
|
||||||
"ped_year": 2024
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"ped_id": 2024,
|
|
||||||
"ped_label": "Staatsfeiertag",
|
|
||||||
"ped_date_start": "2024-05-01",
|
|
||||||
"ped_date_end": "2024-05-01",
|
|
||||||
"ped_period_special_day_id": 1,
|
|
||||||
"ped_year": 0
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"ped_id": 2025,
|
|
||||||
"ped_label": "Christi Himmelfahrt",
|
|
||||||
"ped_date_start": "2024-05-09",
|
|
||||||
"ped_date_end": "2024-05-09",
|
|
||||||
"ped_period_special_day_id": 1,
|
|
||||||
"ped_year": 2024
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"ped_id": 2026,
|
|
||||||
"ped_label": "Pfingst Montag",
|
|
||||||
"ped_date_start": "2024-05-20",
|
|
||||||
"ped_date_end": "2024-05-20",
|
|
||||||
"ped_period_special_day_id": 1,
|
|
||||||
"ped_year": 2024
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"ped_id": 2027,
|
|
||||||
"ped_label": "Fronleichnam",
|
|
||||||
"ped_date_start": "2024-05-30",
|
|
||||||
"ped_date_end": "2024-05-30",
|
|
||||||
"ped_period_special_day_id": 1,
|
|
||||||
"ped_year": 2024
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"ped_id": 2028,
|
|
||||||
"ped_label": "Maria Himmelfahrt",
|
|
||||||
"ped_date_start": "2024-08-15",
|
|
||||||
"ped_date_end": "2024-08-15",
|
|
||||||
"ped_period_special_day_id": 1,
|
|
||||||
"ped_year": 0
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"ped_id": 2029,
|
|
||||||
"ped_label": "Nationalfeiertag",
|
|
||||||
"ped_date_start": "2024-10-26",
|
|
||||||
"ped_date_end": "2024-10-26",
|
|
||||||
"ped_period_special_day_id": 1,
|
|
||||||
"ped_year": 0
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"ped_id": 2030,
|
|
||||||
"ped_label": "Allerheiligen",
|
|
||||||
"ped_date_start": "2024-11-01",
|
|
||||||
"ped_date_end": "2024-11-01",
|
|
||||||
"ped_period_special_day_id": 1,
|
|
||||||
"ped_year": 0
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"ped_id": 2031,
|
|
||||||
"ped_label": "Mariae Empfaengnis",
|
|
||||||
"ped_date_start": "2024-08-12",
|
|
||||||
"ped_date_end": "2024-08-12",
|
|
||||||
"ped_period_special_day_id": 1,
|
|
||||||
"ped_year": 0
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"ped_id": 2032,
|
|
||||||
"ped_label": "Christtag",
|
|
||||||
"ped_date_start": "2024-12-25",
|
|
||||||
"ped_date_end": "2024-12-25",
|
|
||||||
"ped_period_special_day_id": 1,
|
|
||||||
"ped_year": 0
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"ped_id": 2034,
|
|
||||||
"ped_label": "Stefanitag",
|
|
||||||
"ped_date_start": "2024-12-26",
|
|
||||||
"ped_date_end": "2024-12-26",
|
|
||||||
"ped_period_special_day_id": 1,
|
|
||||||
"ped_year": 0
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"ped_id": 2035,
|
|
||||||
"ped_label": "Neujahr",
|
|
||||||
"ped_date_start": "2025-01-01",
|
|
||||||
"ped_date_end": "2025-01-01",
|
|
||||||
"ped_period_special_day_id": 1,
|
|
||||||
"ped_year": 0
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"ped_id": 2036,
|
|
||||||
"ped_label": "Heilig Drei Koenige",
|
|
||||||
"ped_date_start": "2025-06-01",
|
|
||||||
"ped_date_end": "2025-06-01",
|
|
||||||
"ped_period_special_day_id": 1,
|
|
||||||
"ped_year": 0
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"ped_id": 2037,
|
|
||||||
"ped_label": "Ostermontag",
|
|
||||||
"ped_date_start": "2025-04-21",
|
|
||||||
"ped_date_end": "2025-04-21",
|
|
||||||
"ped_period_special_day_id": 1,
|
|
||||||
"ped_year": 2025
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"ped_id": 2038,
|
|
||||||
"ped_label": "Staatsfeiertag",
|
|
||||||
"ped_date_start": "2025-05-01",
|
|
||||||
"ped_date_end": "2025-05-01",
|
|
||||||
"ped_period_special_day_id": 1,
|
|
||||||
"ped_year": 2025
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"ped_id": 2050,
|
|
||||||
"ped_label": "Christi Himmelfahrt",
|
|
||||||
"ped_date_start": "2025-05-29",
|
|
||||||
"ped_date_end": "2025-05-29",
|
|
||||||
"ped_period_special_day_id": 1,
|
|
||||||
"ped_year": 2025
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"ped_id": 2051,
|
|
||||||
"ped_label": "Pfingstmontag",
|
|
||||||
"ped_date_start": "2025-06-09",
|
|
||||||
"ped_date_end": "2025-06-09",
|
|
||||||
"ped_period_special_day_id": 1,
|
|
||||||
"ped_year": 2025
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"ped_id": 2052,
|
|
||||||
"ped_label": "Fronlaeichnam",
|
|
||||||
"ped_date_start": "2025-06-19",
|
|
||||||
"ped_date_end": "2025-06-19",
|
|
||||||
"ped_period_special_day_id": 1,
|
|
||||||
"ped_year": 2025
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"ped_id": 2053,
|
|
||||||
"ped_label": "Mariae Himmelfahrt",
|
|
||||||
"ped_date_start": "2025-08-15",
|
|
||||||
"ped_date_end": "2025-08-15",
|
|
||||||
"ped_period_special_day_id": 1,
|
|
||||||
"ped_year": 0
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"ped_id": 2054,
|
|
||||||
"ped_label": "Nationalfeiertag",
|
|
||||||
"ped_date_start": "2025-10-26",
|
|
||||||
"ped_date_end": "2025-10-26",
|
|
||||||
"ped_period_special_day_id": 1,
|
|
||||||
"ped_year": 0
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"ped_id": 2055,
|
|
||||||
"ped_label": "Allerheiligen",
|
|
||||||
"ped_date_start": "2025-11-01",
|
|
||||||
"ped_date_end": "2025-11-01",
|
|
||||||
"ped_period_special_day_id": 1,
|
|
||||||
"ped_year": 0
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"ped_id": 2056,
|
|
||||||
"ped_label": "Mariae Empfaengnis",
|
|
||||||
"ped_date_start": "2025-12-08",
|
|
||||||
"ped_date_end": "2025-12-08",
|
|
||||||
"ped_period_special_day_id": 1,
|
|
||||||
"ped_year": 0
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"ped_id": 2057,
|
|
||||||
"ped_label": "Christtag",
|
|
||||||
"ped_date_start": "2025-12-25",
|
|
||||||
"ped_date_end": "2025-12-25",
|
|
||||||
"ped_period_special_day_id": 1,
|
|
||||||
"ped_year": 0
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"ped_id": 2058,
|
|
||||||
"ped_label": "Stefanitag",
|
|
||||||
"ped_date_start": "2025-12-26",
|
|
||||||
"ped_date_end": "2025-12-26",
|
|
||||||
"ped_period_special_day_id": 1,
|
|
||||||
"ped_year": 0
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"ped_id": 2059,
|
|
||||||
"ped_label": "Neujahr",
|
|
||||||
"ped_date_start": "2026-01-01",
|
|
||||||
"ped_date_end": "2026-01-01",
|
|
||||||
"ped_period_special_day_id": 1,
|
|
||||||
"ped_year": 0
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"ped_id": 2060,
|
|
||||||
"ped_label": "Heilige Drei Koenige",
|
|
||||||
"ped_date_start": "2026-01-06",
|
|
||||||
"ped_date_end": "2026-01-06",
|
|
||||||
"ped_period_special_day_id": 1,
|
|
||||||
"ped_year": 0
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"PeriodYear": [
|
|
||||||
{
|
|
||||||
"pye_id": 8,
|
|
||||||
"pye_label": "Whole year",
|
|
||||||
"pye_start_month": 1,
|
|
||||||
"pye_start_day": 1,
|
|
||||||
"pye_end_month": 12,
|
|
||||||
"pye_end_day": 31
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
Reference in New Issue
Block a user