From 05974fd8ee97075178ebd36e2725e823db84d5c5 Mon Sep 17 00:00:00 2001 From: Gerhard Hoffmann Date: Fri, 21 Feb 2025 13:10:36 +0100 Subject: [PATCH] started documentation --- documentation/atb-update-tool.tex | 3085 +---------------------------- 1 file changed, 18 insertions(+), 3067 deletions(-) diff --git a/documentation/atb-update-tool.tex b/documentation/atb-update-tool.tex index 24c68c1..6903ae2 100644 --- a/documentation/atb-update-tool.tex +++ b/documentation/atb-update-tool.tex @@ -30,260 +30,26 @@ innertopmargin=20,innerbottommargin=20 \lstset{emph={any-of,all-off},emphstyle=\textbf} -\title{Tariff File Structure} +\title{ATB Update Tool(s)} %\author{Gerhard Hoffmann} -\date{\today\\\normalsize Version 0.8.0} +\date{\today\\\normalsize Version 0.1.0} \newacronym{pnd}{PND}{\textbf{p}ay \textbf{and} \textbf{d}isplay machine} \newacronym{psa}{PSA}{pay and display machine} -\newglossaryentry{customer}{ - name=customer, - description={is either an operator of PND machines or a person buying - tickets using a PND. - Usually, it will be clear from the context, what kind of customer is meant} -} -\newglossaryentry{short-term-parking}{ - name=short-term-parking, - description={mode for buying tickets using a PND. - Several tariff-steps are used to compute parking-price and - parking-time} -} - -\newglossaryentry{tariff-file}{ - name=tariff-file, - description={is a JSON formatted file defining a tariff and controlling - the tariff calculator for a certain product} -} - -\newglossaryentry{tariff-calculator}{% - name=tariff-calculator, - description={% - software module implemented as a shared library. - Responsible to compute for parking times corresponding prices and - vice versa}% +\newglossaryentry{ISMAS}{% + name=ISMAS, + description={}% }% -\newglossaryentry{tariff-step}{ - name=tariff-step, - description={a step during the flow of a selling process. - Also known as time-step - Minimal duration: 1 minute. - }% -} - -\newglossaryentry{prepaid tariff-step}{ - name=prepaid tariff-step, - description={buy a product before - actual service tariff-step} -} - -\newglossaryentry{prepaid-setting}{% - name=prepaid-setting, - description={settings for a prepaid tariff-step} +\newglossaryentry{ATBUpdateCheck}{% + name=ATBUpdateCheck, + description={Tool for checking ISMAS connectivity and for checking + the customer repository}% }% -\newglossaryentry{service time}{ - name=service time, - description={union of all possible service tariff-steps} -} - -\newglossaryentry{service tariff-step}{ - name=service tariff-step, - description={tariff-step to buy products. - Possibly follows some prepaid and/or carry-over tariff-steps} -} - -\newglossaryentry{carry-over tariff-step}{ - name=carry-over tariff-step, - description={if carry-over setting is on, transition to next available -service tariff-step. - Otherwise, if carry-over setting is off, equals out-of-service tariff-step} -} - -\newglossaryentry{carry-over time-step}{ - name=carry-over time-step, - description={tariff-step within it is not possible to buy products. - If carry-over is off, identical to out-of-service tariff-step range} -} - -\newglossaryentry{out-of-service tariff-step}{ - name=out-of-service tariff-step, - description={tariff-step within it is not possible to buy products. - Opposite of service tariff-step. - If carry-over is on, identical to carry-over tariff-step} -} - -\newglossaryentry{payment-setting}{ - name=payment-setting, - description={include min-time, max-time, min-price, max-price} -} - -\newglossaryentry{prepaid-if}{ - name=prepaid-if, - description={conditions for prepaid} -} - -\newglossaryentry{carry-over-if}{ - name=carry-over-if, - description={conditions for carry-over} -} - -\newglossaryentry{carry-over}{ - name=carry-over, - description={boolean flag. Defined implicitly. True if carry-over -tariff-steps are defined, - false otherwise} -}% - -\newglossaryentry{prepaid}{ - name=prepaid, - description={boolean flag. Defined implicitly. True if prepaid tariff-steps -are defined, - otherwise false} -} - -\newglossaryentry{time range}{ - name=time range, - description={intervals of minutes. Minimal length: 1 minute. Written as - closed intervals. Right value does not belong to interval. Tariff-steps have -time ranges. - Example: [08:00 - 20:00]. Timepoint 20:00 does not belong to time range} -}% - -\newglossaryentry{arrival-time}{% - name=arrival-time, - description={Time point of a customer's arrival at a \gls{pnd}. - Possibly different from start-time in case prepaid is set} -}% - -\newglossaryentry{start-time}{% - name=start-time, - description={Time point of a customer's start of a selling process - at a \gls{pnd}} -}% - -\newglossaryentry{wallclock-arrival-time}{ - name=wallclock-arrival-time, - description={Time point of a customer's arrival at a \gls{pnd}, expressed as - wallclock time} -}% - -\newglossaryentry{exit-time}{ - name=exit-time, - description={Time point of a customer's leave at a PND} -} - -\newglossaryentry{net-parking-time}{ - name=net-parking-time, - description={charged part of the gross-parking-time} -} - -\newglossaryentry{current-wallclock-parking-time}{ - name=current-wallclock-parking-time, - description={current time point of selling process, expressed as wallclock -time} -} - -\newglossaryentry{gross-parking-time}{ - name=gross-parking-time, - description={complete parking time, including net-parking-time, - possible prepaid tariff-steps and carry-over tariff-steps. - Expressed i minutes. Also known as pre-tax-parking-time} -} - -\newglossaryentry{product}{ - name=product, - description={sold by a PND-machine. Possible values include: - usual parking ticket SHORT\_TERM\_PARKING} -} - -\newglossaryentry{interpolate-last-tariff-step}{ - name=interpolate-last-tariff-step, - description={termination mode for tariff-calculator. compute fractional - price for tariff-step on per minute basis} -} - -\newglossaryentry{customer-overpay}{ - name=customer-overpay, - description={termination mode for tariff-calculator. customer overpays, - but receives an replacement voucher to reclaim the overpaid amount} -} - -\newglossaryentry{customer-unfairness}{ - name=customer-unfairness, - description={termination mode for tariff-calculator. customer has to pay for - the complete last tariff-step} -} - -\newglossaryentry{customer-fairness}{ - name=customer-fairness, - description={termination mode for tariff-calculator. customer has not to pay -for - the last tariff-step} -} - - -\newglossaryentry{end-of-last-tariff-step}{ - name=end-of-last-tariff-step, - description={termination mode for tariff-calculator. end of - the last tariff-step is the termination time-point} -} - -\newglossaryentry{end-of-unique-tariff-step}{ - name=end-of-unique-tariff-step, - description={termination mode for tariff-calculator. end of - unique tariff-step (e.g. day-ticket) is the termination time-point} -} - -\newglossaryentry{tariff-step single}{ - name=single, - description={tariff-step is not followed by other tariff-steps} -} - -\newglossaryentry{cond}{ - name=cond, - description={conditional modelling sequence of if, else if, else if, \dots, -else} -} - -\newglossaryentry{allof}{ - name=all-of, - description={synonym for a conventional \textbf(and) } -} - -\newglossaryentry{anyof}{ - name=any-of, - description={synonym for a conventional \textbf(or) } -} - -\newglossaryentry{direct-coin-insertion}{ - name=direct coin insertion, - description={preselection of parking-price or - parking-time by direct insertion of coins \textbf{only} } -} - -\newglossaryentry{pre-selection}{ - name=preselection, - description={preselection of parking-price or - parking-time using the GUI of a \gls{pnd}} -} - -\newglossaryentry{overpay}{ - name=overpay, - description={customer insert coins with an amount higher than actual ticket -price} -} - -\newglossaryentry{missing-receipt-declaration}{ - name=missing receipt declaration, - description={a \gls{pnd} could not return change, but a document a customer -can use to get the remaining money back} -} - - \makeglossaries \begin{document} @@ -300,2843 +66,28 @@ can use to get the remaining money back} \hline \textbf{Version} & \textbf{Date} & \textbf{Comment} \\ \hline - 0.8.0 & \today & \\ \hline + 0.1.0 & \today & \\ \hline \end{tabularx} \end{table} \pagebreak \section{Introduction} - - - -\subsection[Some background about the tariff calculation]{ - Some background about the tariff calculation} - -\subsubsection[Conceptual view]{Conceptual view} - -If a customer wants to buy a ticket at a usual \gls{pnd}, there are -several options available: - -\paragraph{ - Pay with coins -} -The first option is \textbf{\gls{direct-coin-insertion}}. A -customer inserts coins, and the \gls{tariff-calculator} computes the -corresponding parking-price resp. parking-time on the fly while coins are -inserted. - -The other option is \textbf{\gls{pre-selection}}. Using -Plus/Minus-buttons, a customer is displayed the current parking-time resp. -parking-price (again computed by the \gls{tariff-calculator} on the fly). In -case the customer doesn't have the matching coins available, he might be asked -for \textbf{\gls{overpay}}: - -If the \gls{pnd} is equipped with a money changer and the customer confirms the -\gls{overpay} and the money changer can return the change, there will be no -problem. Otherwise, the customer will receive a -\gls{missing-receipt-declaration} to be able to collect the drawback. If the -customer denies the \gls{overpay}, the money will be returned. - -If the \gls{pnd} is not equipped with a money changer, and the customer still -confirms, then the money will be lost. - - -\paragraph{ - Pay with credit card -} - -In this case the customer always uses \gls{pre-selection}. Using -Plus/Minus-buttons of the \gls{pnd}-display, -the customer chooses parking-time/-price (computed by the -\gls{tariff-calculator} on the fly) and buys the ticket -using a built-in credit-card terminal. - -\paragraph{} -The tariff-calculation is controlled by two different main settings: - -\begin{enumerate} - \item \textbf{Service time ranges}, usually given as fixed wall clock time -ranges. - For instance, a possible setting might be $08:00 – 20:00$, on every day - during a week. Other such time ranges are for instance - \textbf{carry-over} time ranges or \textbf{prepaid} time ranges. - \item The operator of some \gls{pnd}-machine may decide that the customer -has to pay in - \gls{tariff-step}s of 60 minutes per step. - Such 60 minute intervals are usually intertwined with the fixed service -time ranges. - The \gls{tariff-file} must contain settings which allow the calculation -to cope with such a requirement. -\end{enumerate} - -To configure the behaviour of the \gls{tariff-calculator}, a so-called -\gls{tariff-file} is used. -It has the follwing properties: -%\begin{mdframed}[style=exampledefault]% - \begin{enumerate} - \item For historical reasons, its syntax is -\href{https://www.json.org/json-en.html}{JSON}. - \item It is generated using an external tool (tariff editor) (Audivo). - \item \Gls{tariff-file}s are kept in customer-specific git repositories. - \end{enumerate} -%\end{mdframed} - -The \gls{tariff-calculator} uses a \gls{tariff-file} in a two-step process: -First, parse the \gls{tariff-file} into internal C/C++ data structures. -Then, using these structures, generate a sequence of \gls{tariff-step}s, -which are used as internal representation of the flow of a selling process. -\newline -\par{ - This document defines the structure of a \gls{tariff-file} in an - incremental way. After the description of some settings, - there will be an example of mapping a tariff provided by some - \gls{pnd}-operator into a \gls{tariff-file} using these settings. - At the end of this document, several complete examples will be given. -} -\newline -\par{ -Each day of the week is divided in \gls{service tariff-step}s (complementary -in \gls{out-of-service tariff-step}s). -There can be several of them for each day. -} -\newline -\par{ -By definition, it is not possible to buy products during \gls{out-of-service -tariff-step}s. There are two exceptions to this rule: the special -\gls{out-of-service tariff-step}s \textbf{\gls{prepaid}} and -\textbf{carry-over} tariff-steps. \Gls{prepaid tariff-step}s allow to buy -products before actual \gls{service tariff-step}s whereas -\gls{carry-over tariff-step}s allow the transition to the next available -\gls{service tariff-step}. -} - -\Gls{prepaid tariff-step}s can occur only at the beginning of a selling process, -whereas \gls{carry-over tariff-step}s can occur more often between -\gls{service tariff-step}s. - -\subsubsection[Example]{% - Example} -Let carry\_over $($co$)$ and prepaid $($pp$)$ be set. -\begin{table}[h!] - \begin{center} - \label{tab:table1} - \begin{tabular}{|c|c|c|c|c|} - \hline - \textbf{00:00 - 08:00} & \textbf{08:00 - 12:00} & \textbf{12:00 - 14:00} -& - \textbf{14:00 - 20:00} & \textbf{20:00 - 24:00}\\ - \hline - co / pp & service & co / pp & service & co / pp\\ - \hline - \end{tabular} - \end{center} -\end{table} -If a customer arrives at 07:00, then the \gls{prepaid tariff-step} is -07:00-08:00 -and the actual parking time starts at 08:00. -The next \gls{carry-over tariff-step} is from 12:00 – 14:00. -The customer does not have to pay for the \gls{prepaid tariff-step}. -\subsubsection[A more technical view]{A more technical view} +\section{ATBUpdateCheck} +\gls{ATBUpdateCheck} -The steps of a tariff are represented as step-function. The discrete -values of the step-function are the prices of the various -\gls{tariff-step}s. The \gls{tariff-calculator} integrates this -step-function over the \gls{tariff-step}s (see figure below). +\section{ATBUpdateGit} -\begin{figure}[!h] -\begin{center} -\caption{Tariff as step-function} -\vspace{0.5cm} -\begin{tikzpicture}[scale=0.8] -% Definitions -\tikzmath{ -\r0 = 0; -\r1 = 0.2; -\r2 = 0.3; -\r3 = 0.4; -\r4 = 0.1; -\r5 = 0.6; -\r6 = 0.5; -\t0 = 1; -\t1 = 2; -\t2 = 6; -\t3 = 10; -\t4 = 11; -\t5 = 12; -\t6 = 13; -\x0 = \t0; \y0 = \r0; -\x1 = \t1; \y1 = \r1; -\x2 = \t2; \y2 = \r2; -\x3 = \t3; \y3 = \r3; -\x4 = \t4; \y4 = \r4; -\x5 = \t5; \y5 = \r5; -\x6 = \t6; \y6 = \r6; - } -% Axis -\begin{axis}[ -axis x line=middle, -axis y line=middle, -ylabel=Price, -%xlabel style={at={(10,10)},above right,yshift=10pt}, -%xlabel style={at={(axis description cs:0.5,-0.1)},anchor=east}, -%xlabel=Time, -xtick={0,\x0,\x1,\x2,\x3,\x4,\x5,\x6}, -xticklabels={0,$t_0$,$t_1$, $t_2$, $t_3$,$t_4$,$t_5$,$t_6$,{ }}, -xlabel near ticks, -extra x ticks={2, 6, 10, 14}, -extra x tick labels={$08:00$,$09:00$,$10:00$,$11:00$}, -extra x tick style={yshift={-30.0}}, -ytick={0,\y0,\y1,\y2,\y3,\y5,\y6}, -yticklabels={0,$p_0$,$p_1$, $p_2$, $p_3$,$p_5$,$p_4$}, -ylabel near ticks, -xmax=\x6+2, -ymax=\y5+0.1, -xmin=0, -ymin=0 -] -% Plots -%\addplot[domain=0:\t1] {\r1*x}; -%\addplot[domain=\t1:\t2] {\r2*x}; -%\addplot[domain=\t2:\t3] {\r3*x}; -\draw[ultra thick] (axis cs:\x0,\y0) -- (axis cs:\x1, \y0); -\draw[thick] (axis cs:\x1,\y1) -- (axis cs:\x2, \y1); -\draw[ultra thick] (axis cs:\x2,0) -- (axis cs:\x3, 0); -\draw[thick] (axis cs:\x3,\y3) -- (axis cs:\x4, \y3); -\draw[ultra thick] (axis cs:\x4,\y5) -- (axis cs:\x5, \y5); -\draw[ultra thick] (axis cs:\x5,\y6) -- (axis cs:\x6, \y6); +\section{ATBUpdateOpkg} -\draw[dotted] (axis cs:\x1,0) -- (axis cs:\x1, \y1); -\draw[dotted] (axis cs:\x2,\y1) -- (axis cs:\x2, 0); -\draw[dotted] (axis cs:\x3,0) -- (axis cs:\x3, \y3); -\draw[dotted] (axis cs:\x4,\y3) -- (axis cs:\x4, \y5); -\draw[dotted] (axis cs:\x5,\y5) -- (axis cs:\x5, \y6); +\section{ATBUpdateSync} -\addplot[fill=white,only marks,mark=*] -coordinates{(\x1,\y0)(\x2,\y1)(\x3,0)(\x4,\y3)(\x5,\y5)(\x6,\y6)}; -\end{axis} -\end{tikzpicture} -\end{center} -\end{figure} +\section{ATBUpdateDCConfig} -\begin{enumerate} - \item The \gls{tariff-step} $[t_{0}, t_{1}]$ is a prepaid step having a - price of $0$ by definition. \Gls{arrival-time} is $t_0$, \gls{start-time} - is $t_1$. The price for the first \gls{tariff-step} is $p_1$ and its - duration is $60$ minutes. - \item The \gls{tariff-step} $[t_{2}, t_{3}]$ is a carry-over step; - price is $0$ as well, again by definition. - \item Note: \gls{tariff-step}s can have any price: they don't have to be -equal, increasing or decreasing. Additionally, they don't have to have the same -duration (i.e. length). The minimal duration of the various \gls{tariff-step}s -is one minute (for any possible tariff): +\section{ATBUpdateDC} -\[ - \mid t_{i} - t_{j} \mid \; \geq 1 -\] - -for the time points $t_i$ above. The maximal duration is not limited, -but the typical maximal value is $24$ hours. -\end{enumerate} - - -\subsubsection[\Gls{tariff-step} notation]{% -\Gls{tariff-step} notation} -\Gls{tariff-step}s are written as closed intervals ($[00:00-08:00]$, -$[08:00-24:00]$, \dots). -Note that the time point $08:00$ is not included in the first interval. -Rather, it denotes the first minute of the interval $[08:00-24:00]$. -In the same manner $24:00$ denotes the first minute of the next day, -whereas $00:00$ denotes the first minute of the current day. -The same holds for intervals given in time point notation $[t_1,t_2]$ -as above. - -\subsubsection{% - Basic workflow of the tariff calculator} -The \gls{tariff-calculator} just integrates over the \gls{tariff-step}s. -The only exception is if a last \gls{tariff-step} has to be refined to a -higher (minute) resolution. - -The effect of the Plus/Minus-buttons is basically to move the calculator -forward / backward by one step. - -%Carry-over \gls{tariff-step}s or prepaid time ranges are not included -%in the step-function. - - -\subsubsection[Interpolation]{% - Interpolation -} - -\paragraph{% - How to interpolate into \gls{tariff-step}s -} -It is quite common that all \gls{tariff-step}s have the same duration, -say $5$ minutes. Now, if \gls{service time} ends at $20:00$ and there is no -carry-over allowed, this raises a problem if the last \gls{tariff-step} ends -closer to $t = 20:00$ than $5$ minutes: -\[ -\mid t_{last} - t \mid \; < 5 -\] - -What shall happen with these last minutes? Several options are possible: - -% manchmal egal: bei tagesticket oder 24h-ticket - -\paragraph{% - Use minute resolution -} -Compute the price for $1$ minute based on the price for the -last \gls{tariff-step}. If applicable, this resolves the issue. -But sometimes this option is not possible: - -\paragraph{% - Rounding problems -} -This problem arises if the price of the last $5$ minutes from above is not a -multiple of $5$. Dividing by $5$ might result in a fractional, i.e. non-integer -value. - -\paragraph{% - (Direct) coin insertion -} -In this case it might be possible to ask the customer for \gls{overpay}. - - -\paragraph{% - Preselection using Plus/Minus -} -Using the Plus/Minus-buttons a user can preselect parking-time and -parking-price. "Plus" means to go forward in time by a certain amount of -\gls{tariff-step}s, "Minus" means to go backward to the -previous \gls{tariff-step}. - -Thus "Plus" allows to move forward much faster -than backward with "Minus". The reason is user convenience. As the customer -must be able to select any possible price, the backward move must have the -finest possible resolution. - -TODO: configure forward step-size. - - -\subsection[Interface of the \gls{tariff-calculator}]{% - Interface of the tariff calculator} - -\subsubsection{% - Dependency to existing software components} - -The tariff-calculator is used by the main application ATBQT -with the help of a special wrapper around the actual tariff-calculator. - -\begin{center} - \framebox[250pt][c]{ATBQT | Tariff Simulator | Tariff Editor }\\ - \framebox[250pt][c]{wrapper for tariff-calculator (plugin)}\\ - \framebox[250pt][c]{tariff-calculator (library)} -\end{center} - - -The \gls{tariff-calculator} is basically about computing two values: -\begin{enumerate} - \item Given \gls{net-parking-time}, compute the corresponding parking -price (any prepaid-/carry-over time ranges are excluded). - \item Given a price, compute the corresponding net- and - \gls{gross-parking-time}s. - \item Additionally, it has to return error states to the caller for - (direct) coin insertion: the customer might have inserted - an amount greater than the allowed max-price (error state overpaid). -\end{enumerate} - -\subsubsection{% - C Interface of the tariff calculator (in progress)} - -Although the \gls{tariff-calculator} is written in C\texttt{++}, there will -be a C interface to be used by external software written in a -different language like for instance C\texttt{\#}. - -\paragraph{Tariff calculator} -\label{tariff-calculator-interface} -\begin{minted}[frame=single, - framesep=3mm, - linenos=true, - xleftmargin=21pt, - tabsize=4]{c} - - TariffCalculator *allocTariffCalculator(char const *tariff_file); - // allocate tariff-calculator based on tariff-file. - // note that a tariff-file is for a single product: - // if there are several products to be handled - // at the same time, allocate multiple tariff-calculators. - - freeTariffCalculator(TariffCalculator *tc); - // free a previously allocated tariff-calculator. - - TariffCalculatorState *forward(TariffCalculator *tc); - // move the tc forward by a configured number of tariff-steps. - - TariffCalculatorState *backward(TariffCalculator *tc); - // move the tc backward by one tariff-step. - - TariffCalculatorState *currentState(TariffCalculator const *tc); - // get current state of the tariff-calculator. - - TariffCalculatorState *priceGrossDTime(TariffCaculator const *tc, - char gross_datetime[]); - // compute price using tariff-calculator and gross_datetime, - // which is given in ISO-format: '2024-01-01T12:00:00'. - // Refer to TariffCalculatorState for possible result. - - TariffCalculatorState *priceNetTime(TariffCaculator const *tc, - uint32_t net_parking_time); - // compute price using tariff-calculator and net_parking_time, - // given in minutes. - // Refer to TariffCalculatorState for possible result. - - TariffCalculatorState *priceGrossTime(TariffCaculator const *tc, - uint32_t gross_parking_time); - // compute price using tariff-calculator and gross_parking_time, - // given in minutes. - // Refer to TariffCalculatorState for possible result. - - TariffCalculatorState *timeForPrice(TariffCaculator const *tc, - unsigned int price); - // compute parking-time for given price. - // Refer to TariffCalculatorState for possible result. - }; - -\end{minted} - -\paragraph{Tariff calculator state} -\label{tariff-calculator-state} -\begin{minted}[frame=single, - framesep=3mm, - linenos=true, - xleftmargin=21pt, - tabsize=4]{c} - typedef struct TimePoint { - char tp[20]; - // time point given in ISO-format: '2024-01-01T12:00' - } TimePoint; - - struct TariffCalculatorState { - char start[20]; - // start time of the tariff-calculation, given - // in ISO-format: '2024-01-01T12:00' - - unsigned int net_parking_time; - // net parking time so far, given in minutes - - char net_parking_time_date[20]; - // net parking time so far, given as date in - // ISO-format: '2024-01-01T12:00' - - unsigned int gross_parking_time; - // net parking time so far, given in minutes - - char gross_parking_time_date[20]; - // net parking time so far, given as date in - // ISO-format: '2024-01-01T12:00' */ - - unsigned int price; - // price so far - }; - -\end{minted} - - -\subsection[Conditional Expressions in a Tariff File]{% - Conditional Expressions in a Tariff File} -Sometimes it is necessary to encode conditionals in JSON. Here the -following approach is used: assume for example some pseudo-code like this: - - \begin{minted}[frame=single, - framesep=3mm, - linenos=true, - xleftmargin=21pt, - tabsize=4]{c} - (("A" < 10 && "B" > 100) || "C" == 0) - \end{minted} - - -\subsubsection[any-of and all-of]{% - any-of and all-of} - - In order to model such an expression, use the conditionals -\textbf{\gls{anyof}} and \textbf{\gls{allof}}. - - \begin{minted}[frame=single, - framesep=3mm, - linenos=true, - xleftmargin=21pt, - tabsize=4]{js} - "any-of": [ - { - "all-of": [ - { "A": { "lt": 10}}, - { "B": { "gt": 100}} - ] - }, - { - "C": { "eq": 0} - } - ] - \end{minted} - - "any-of" plays the role of the operator OR, whereas "all-of" is for modeling -the operator AND. - -\subsubsection[cond]{% - \gls{cond}} - In order to model "if, else if, else if, \dots, else" use -\textbf{\gls{cond}}. - - The objects of a \gls{cond}-array consist of two entries: the first one - is a test, the second line some kind of expression, typically just a -value. - If the test evaluates to true, then the evaluation of the expression - is returned, and \gls{cond} stops. Otherwise, then next object - is tried. If all tests fail, then there is an (optional) else-object - and its evaluation is returned. If there is no such an else-object, then - false will be returned. - -\begin{minted}[frame=single, - framesep=3mm, - linenos=true, - xleftmargin=21pt, - tabsize=4]{js} - "cond": [ - { - "current-wallclock-parking-time": { - "<": "14:00", - "then": "14:00" - } - }, - { - "current-wallclock-parking-time": { - "<": "18:00", - "then": "18:00" - } - }, - { - "else": "24:00" - } - ] -\end{minted} - -\section{The header of the tariff file} -A tariff file starts with some general entries. - - \begin{minted}[frame=single, - framesep=3mm, - linenos=true, - xleftmargin=21pt, - tabsize=4]{js} - { - "project": "project-name", - "version": "1.0.0", - "info": "", - "product": "short-term-parking" - } -\end{minted} - -\begin{enumerate} - \item \textbf{project} - Optional. A string in free format describing the project. Typically - includes a location. - \item \textbf{version} - Optional. Version of the tariff file. Should follow Semantic - Versioning. - \item \textbf{info} - Optional. Free format string for own use. - \item \textbf{product} - Optional. A string describing the product in use for this tariff file. - Available products are: - \begin{enumerate} - \item short-term-parking - \item day-ticket - \item 24-h-ticket - \item \dots - \end{enumerate} - \Gls{product} is always implicitly defined, as there is exactly one - \gls{tariff-file} for each \gls{product}. - -\end{enumerate} - -Following the initial entries, the tariff file is divided in a top and bottom -half. -The top part includes general settings, which can be overwritten in the bottom -part on a per-day basis, which is similar to the inheritance -in object-oriented programming. - -\section{The top half of the tariff file} - -The top part consists of \textbf{payment-setting}, \textbf{prepaid settings}, -\textbf{service settings} and \textbf{carry-over settings}. For example, a -payment-setting might be a simple as - -\begin{minted}[frame=single, - framesep=3mm, - linenos=true, - xleftmargin=21pt, - tabsize=4]{js} - { - "payment-settings”: [ - { - "min-time": 30, - "max-time": 840, - "min-price": 50, - "max-price": 1400, - "allow-overpay": true - } - ] - } -\end{minted} - -\subsection{payment-settings} -Defines the general settings for a buying a \gls{product}. - -\begin{enumerate} - \item \textbf{min-time}: - Mandatory. Minimal parking time. Never bigger than maximal parking -time.\\ - Possible values: - \begin{enumerate} - \item a non-negative integer: minimal parking time in minutes. - \item string (format "h:m"): e.g. "$24:00$": minimal parking time is - supposed to last until $24:00$ (next midnight). - \item settable using \textbf{cond}-conditional. - - Example: If \gls{current-wallclock-parking-time} is before $14:00$, - then min-time is until $14:00$. Otherwise it is $24:00$ - (next midnight). - - \begin{minted}[frame=single, - framesep=3mm, - linenos=true, - xleftmargin=21pt, - tabsize=4]{js} - { - "min-time": { - "cond": [ - { - "current-wallclock-parking-time": { - "<": "14:00", - "then": "14:00" - } - }, - { - "else": "24:00" - } - ] - } - } - \end{minted} - \end{enumerate} - - \item \textbf{max-time}: - Maximal parking time. Never smaller than minimal parking time. - Possible values: - \begin{enumerate} - \item a non-negative integer: maximal parking time in minutes. - \item string (format "h:m"): e.g. "$24:00$" maximal parking time is - supposed to last until $24:00$ (next midnight). - \item string: "unlimited". - \item settable using \textbf{cond}-conditional. - - Example: If \gls{current-wallclock-parking-time} is before $14:00$, - then max-time is until $14:00$. Otherwise it is $24:00$ - (next midnight). - \begin{minted}[frame=single, - framesep=3mm, - linenos=true, - xleftmargin=21pt, - tabsize=4]{js} - { - "max-time": { - "cond": [ - { - "current-wallclock-parking-time": { - "<": "14:00", - "then": "14:00" - } - }, - { - "else": "24:00" - } - ] - } - } - \end{minted} - \end{enumerate} - - \item \textbf{min-price:} - Mandatory. Minimal parking price. Never bigger than maximal parking -price.\\ - \begin{enumerate} - \item a non-negative integer: minimal parking price. - \item settable using \textbf{cond}-conditional. - - Example: If \gls{current-wallclock-parking-time} is before $14:00$, - then min-price is until $800$. Otherwise it is $500$. - \begin{minted}[frame=single, - framesep=3mm, - linenos=true, - xleftmargin=21pt, - tabsize=4]{js} - { - "min-price": { - "cond": [ - { - "current-wallclock-parking-time": { - "<": "14:00", - "then": 800 - } - }, - { - "else": 500 - } - ] - } - } - \end{minted} - \end{enumerate} - - \item \textbf{max-price}: - Mandatory. Maximal parking price. - \begin{enumerate} - \item a non-negative integer: maximal parking price. - \item settable using \textbf{cond}-conditional. See min-price. - \end{enumerate} - - \item \textbf{price-scaling-factor}: - Scaling factor to prevent rounding errors. - - \item \textbf{allow-overpay}: - Allow overpay, e.g. if the customer does not - have the coins to pay the exact price. - Possible values: true/false. - - % \item \textbf{accumulate\_step\_prices}: If \textbf{true}, accumulate - % prices in payment rate (todo). - % \item \textbf{accumulate\_step\_durations}: If \textbf{true}, - % accumulate durations in duration (todo). -\end{enumerate} - -\subsubsection*{Implicit settings} -\begin{enumerate} - \item \textbf{carry\_over}: - If the selling process runs beyond a certain time point (usually -midnight), - then: - \begin{enumerate} - \item if \textbf{true}, continue tariff calculation with the current - price / parking time. - \item if \textbf{false}, stop tariff calculation. Return current -price - and parking time. - \end{enumerate} - - \item \textbf{prepaid:} allow a customer to by a product before an actual - service time. - \begin{enumerate} - \item if \textbf{true}, continue tariff calculation with the next - possible \gls{start-time}. - \item if \textbf{false}, stop tariff calculation. Return error, - because inside \gls{out-of-service tariff-step} range. - \end{enumerate} -\end{enumerate} - -\subsection{prepaid-settings} -“Prepaid” (“Vorkauf”) is a special operation mode, which makes it possible -to buy some product before service time. -There can be several \gls{prepaid tariff-step}s per day (depending on how -many \gls{service tariff-step}s exist). -\Gls{prepaid} is optional. If not given in the tariff file, no \gls{prepaid} -is possible, i.e. the implicit \gls{prepaid}-flag is not set. - -\begin{enumerate} - \item \textbf{prepaid-ranges} - \begin{enumerate} - \item[] \textbf{prepaid-duration}: Conditional. If prepaid-start and -prepaid-end are given, - it can be computed. - \item[] \textbf{prepaid-start}: Mandatory. Start of prepaid time -range. - \item[] \textbf{prepaid-end}: Conditional. If prepaid-duration is -given, it can be computed. - \end{enumerate} -\end{enumerate} - -\subsubsection*{Example} -A customer has an appointment with her doctor at 7:00, -and service time starts at 8:00. Parking is free before 8:00. -If the appointment would take more than one hour, then the customer -could not buy a parking-ticket before 8:00 without the prepaid-mode. - -\begin{minted}[frame=single, - framesep=3mm, - linenos=true, - xleftmargin=21pt, - tabsize=4]{js} - { - "prepaid-settings": [ - { - "prepaid-ranges": [ - { - "prepaid-duration": 480, - "prepaid-start": "00:00", - "prepaid-end": "08:00" - }, - { - "prepaid-duration": 240, - "prepaid-start": "20:00", - "prepaid-end": "24:00" - } - ] - } - ] - } - -\end{minted} - -\subsection{service-settings} -\Gls{service tariff-step}sare (in most cases) not free, -and there can be more than one such \gls{tariff-step} per day. - -\begin{minted}[frame=single, - framesep=3mm, - linenos=true, - xleftmargin=21pt, - tabsize=4]{js} - { - "service-settings": [ - { - "service-ranges": [ - { - "service-duration": 720, - "service-start": "08:00", - "service-end": "20:00" - } - ] - } - ] - } -\end{minted} - -\begin{enumerate} - \item \textbf{service-ranges} - \begin{enumerate} - \item[] \textbf{service-duration:} Conditional. If service-start and -service\_end are given, - it can be computed. - \item[] \textbf{service-start:} Mandatory. Start of \gls{service -tariff-step} range. - \item[] \textbf{service-end:} Conditional. If service-duration is -given, it can be computed. - \end{enumerate} -\end{enumerate} - -\subsection{out-of-service-settings} -During \gls{out-of-service tariff-step} parking is forbidden. -The exception to this rule is in case the general -\textbf{carry\_over}-flag is true, where \gls{out-of-service tariff-step}s -are in fact \gls{carry-over tariff-step}s. Indeed, defining -\gls{carry-over tariff-step}s in the \gls{tariff-file} means -that the \gls{carry-over}-flag is implicitly defined. In such -a case, it is possible to jump across a \gls{carry-over tariff-step} -and and to continue with the next available \gls{service tariff-step}. -The same holds true for the textbf{prepaid}-flag and \gls{prepaid tariff-step}s. -\subsubsection*{Remark} -It might happen that all \gls{service tariff-step}s stretch always -full days. Hence, there are no \gls{out-of-service tariff-step}s -and no \gls{carry-over tariff-step}s: the \gls{carry-over}-flag is -implicitly set to \textbf{false} in this case, as there is no carry-over. - - -\subsection{tariff-steps} -One of the most important objects in the \gls{tariff-file}. - -\begin{minted}[frame=single, - framesep=3mm, - linenos=true, - xleftmargin=21pt, - tabsize=4]{js} - { - "tariff-steps": [ - { - - - } - ] - } -\end{minted} - -\begin{enumerate} - \item \textbf{\gls{tariff-step}s} - Some variables of a \gls{tariff-step} can be given statically, - i.e. at load-time of the \gls{tariff-file}. Others may be - set only at runtime as \textbf{step\_start} below. - Depending on the context, different values of a \gls{tariff-step} - will be defined. - \begin{enumerate} - \item[] \textbf{step-duration-in-minutes}: if defined, the - length of a \gls{tariff-step} in minutes. - \item[] \textbf{step-start:} may be set to - \begin{enumerate} - \item \textbf{anytime}: the \gls{tariff-step} starts at an - arbitrary time-point. Can only be set at runtime. - \item \textbf{now}: synonymous for \textbf{anytime} - \item explicitly given time-point as \textbf{12:00} - \end{enumerate} - \item[] \textbf{step-start-after:} explicitly given - time-point as \textbf{12:00}. - Take step into account if start of price calculation - is after this time-point. - \item[] \textbf{step-start-before:} explicitly given - time-point as \textbf{12:00}. - Take step into account if start of price calculation - is before this time-point. - \item[] \textbf{step-end:} may be set to - \begin{enumerate} - \item explicitly given time-point as \textbf{20:00} - \item \textbf{midnight}: the \gls{tariff-step} ends at midnight. - Same as time-point setting 24:00. - \end{enumerate} - \item[] \textbf{step-price-per-minute:} used for interpolating - the price of the \gls{tariff-step} in case the \gls{tariff-step} - is not fully used. - \item[] \textbf{step-price} full price of the \gls{tariff-step}. - \item[] \textbf{step-type} type of \gls{tariff-step}. Possible values: - \begin{enumerate} - \item \gls{tariff-step single} - \item cont - \end{enumerate} - \end{enumerate} -\end{enumerate} - -\subsection{special days} -TODO. -Settings for public holidays and open for sale days - -\subsection{carry-over-if} -TODO. -Basically describe under what conditions a carry-over -might take place. - -\subsection{prepaid-if} - -\subsection{Example: tariff file using top half} -The tariff is given by the PND-operator as follows: - -\begin{enumerate} - \item 24/7 service time ranges for all parking machines on all weekdays. - \item No exceptions (for example for holidays). - \item Each weekday is handled the same way. - \item Customer can buy ticket valid for up to 7 days. For each began day, -the price is 7 euros. - \item Do not allow overpay: if the customer pays with coins, paying 51 euros -means 2 euros lost. -\end{enumerate} - -These requirements mean that the maximal parking time is 7 days (or 10080 -minutes), minimal price is 7 euros and maximal price is 49 euros. Further, there -is no prepaid and no carry-over (because 24/7 service time). Because the is -no difference between the weekdays, there is no need to override some settings -in a bottom half of the tariff file. - -The mapping of the tariff to a JSON file results in: - -\begin{minted}[frame=single, - framesep=3mm, - linenos=true, - xleftmargin=21pt, - tabsize=4]{js} - { - "project": "project-name", - "version": "1.0.0", - "product": "short-term-parking", - "payment-settings": { - "min-time": "24:00", - "max-time": 10080, - "min-price": 700, - "max-price": 4900, - "allow-overpay": false - - }, - "service-settings": { - "service-ranges": [ - { - "service-start": "00:00", - "service-end": "24:00" - } - ] - }, - "tariff-steps": [ - { - "step-start": "now", - "step-end": "24:00", - "step-price": 700, - "comment": "first tariff-step", - "comment": "customer can buy anytime (now)", - "comment": "step ends at midnight" - }, - { - "step-duration": 1440, - "comment": "step-duration given for clarity", - "step-start": "00", - "step-end": "24:00", - "step-repetition-count": 6, - "step-price": 700, - "comment": "the following (max. 6) tariff-steps", - "comment": "price uniformly 7 euros for each day" - } - ] - } -\end{minted} - -\section{The bottom half of the tariff file} -The bottom part of the tariff file is for overriding the general settings in the -top half of the tariff file. For each week day, -settings can be overridden separately. If a day is not mentioned, the settings -from the top half apply. -The general layout of the bottom half therefore looks like this: -\begin{minted}[frame=single, - framesep=3mm, - linenos=true, - xleftmargin=21pt, - tabsize=4]{js} - { - "monday": [{ - "default": { - } - }], - "tuesday": [{ - "default": { - } - }], - "wednesday": [{ - "default": { - } - }], - "thursday": [{ - }], - "friday": [{ - "default": { - } - }], - "saturday": [{ - "default": { - } - }], - "sunday": [{ - "default": { - } - }] - } -\end{minted} - -Some days are special, though, for instance holidays or open for sale sundays. -They are mapped into their corresponding weekdays using their date. -Special days are handled with higher priority. - -\subsection*{Example} -Christmas Day in 2024 will be at 2024-12-25, a Wednesday. The same holds for New -Year’s Day. This results in the following setting: -\begin{minted}[frame=single, - framesep=3mm, - linenos=true, - xleftmargin=21pt, - tabsize=4]{js} - { - "wednesday": [{ - "2025-01-01": { - "comment": "New Year’s Day" - }, - "2024-12-25": { - "comment": "Christmas Day" - }, - "default": { - "comment": "usual wednesday" - } - }] - } -\end{minted} - -\subsection{Example: tariff file using top and bottom half} -\label{top-and-bottom} -The tariff is given as follows: - -\begin{enumerate} - \item Service time ranges: Monday – Sunday: $08:00 – 18:00$. - \item Holidays are handled as Sundays. - \item The first $20$ minutes are free for each weekday. - \item Cost for every other $20$ minutes: $40$ cent. - \item Maximal parking time for Monday-Saturday: 1 hour. Cost: $80$ cent. - For Sunday: $3$ hours. Cost: $3,20$ euros. - \item Prepaid: Yes. No restriction on prepaid time ranges. - \item Carry-over: Yes. - \item Plus/Minus: step forward every $20$ minutes, step backward every $5$ -minutes. - \item Service time restriction: carry-over from Sunday/Holiday to next day -results in service time range of $08:00-09:00$ on next day. Even if the next day -is a holiday. -\end{enumerate} -\paragraph{Note} -Due to this specification, $1$ minute costs $2$ cent. Thus, paying by -credit-card is not a problem. Because overpay is allowed, there is also no -problem for a -transition from Sunday to Monday when reaching $09:00$. - - -\begin{minted}[frame=single, - framesep=3mm, - linenos=true, - xleftmargin=21pt, - tabsize=4]{js} - { - "project": "project-name", - "version": "1.0.0", - "product": "short-term-parking", - "payment-settings": [ - { - "min-time": 20, - "max-time": 60, - "min-price": 0, - "max-price": 80, - "allow-overpay": true - } - ], - "service-settings": [ - { - "service-ranges": [ - { - "service-start": "08:00", - "service-end": "18:00" - } - ] - } - ], - "prepaid-settings": [ - { - "prepaid-ranges": [ - { - "prepaid-start": "00:00", - "prepaid-end": "08:00" - }, - { - "prepaid-start": "18:00", - "prepaid-end": "24:00" - } - ] - } - ], - "carry-over-settings": [ - "carry-over-if": { - "cond": [ - { - "max-remaining-net-parking-time": { - "<=": 60, - "then": true - } - }, - { - "max-remaining-parking-price": { - "<=": 120, - "then": true - } - }, - { - "else": false - } - ] - } - ], - "tariff-steps": [ - { - "step-start": "now", - "step-duration": 20, - "step-price": 0 - }, - { - "step-duration": 5, - "step-repetition-count": 32, - "step-price": 10, - "comment": "repetition count controlled by max-time" - } - ], - ... - "wednesday": [{ - "2025-01-01": { - "comment": "New Year’s Day", - "type": "holiday", - "payment-settings": [ - { - "min-time": 20, - "max-time": 180, - "min-price": 0, - "max-price": 320, - "allow-overpay": true - } - ] - } - }] - ... -} -\end{minted} - - -\section{Use Cases} -In this section, several complete examples will be listed. - -\subsection{Prepaid. Carry over. Weekend free. Price scaling.} -\subsubsection{Szeged (Hungary)} -The tariff (for Zone 1) is given as follows (special days for 2024): - -\begin{enumerate} - \item[$\bullet$] Service time ranges: Monday – Friday: 08:00 – 18:00. - \item[$\bullet$] Saturday and Sunday and public holidays are free - except PND-operator says otherwise. - \item[$\bullet$] Special open for sale days during the year (e.g. Saturdays - which are not free). - \item[$\bullet$] Price per hour: 150 Forint. - \item[$\bullet$] Minimal parking time: 15 minutes. - \item[$\bullet$] Minimal parking price: 38 Forint. - \item[$\bullet$] Maximal parking time: 6 hours. - \item[$\bullet$] Maximal parking price: 900 Forint. - - \item[$\bullet$] Prepaid: Yes. No restriction on \gls{prepaid -tariff-step}(s). - \item[$\bullet$] Carry-over: yes. - \item[$\bullet$] Interpolate: no. - \item[$\bullet$] Allow overpay: yes. -\end{enumerate} - -\subsubsection*{Remark: price-scaling-factor} -The settings for Szeged shows that the price for 15 minutes is -\begin{equation*} - (150 / 60) * 15 = 2,5 * 15 = 37,5 -\end{equation*} -possibly introducing rounding errors. To fix this problem, scale the -price setting such that the division by $60$ never produces some rest: - - price-scaling-factor $= LCM(150, 60) / 150 = 300 / 150 = 2$ - -where $LCM(x,y)$ is the least common multiple of the integers $x, y$. -The price for 15 minutes is then internally - - $37,5\; *$ price-scaling-factor $= 75$ - -and the computed price has to be divided by the price-scaling-factor -to get the correct result, of course. - -\paragraph{Remark} -The smallest possible coin in Szeged is 5 Forint. -According to the scaled setting, 5 Forint (HUF) are exactly 1 minute -parking-time: $5 * 60 = 300$, the scaled price. -\paragraph{Remark} -Such a scaling would be possible for the time-dimension only for cases where -there is full service time (no carry over or prepaid). Usually the duration -must be computed for every \gls{tariff-step}, see section \ref{Stockerau}. - -\begin{minted}[frame=single, - framesep=3mm, - linenos=true, - xleftmargin=21pt, - tabsize=4]{js} - { - "project": "Szeged", - "version": "1.0.0", - "product": "short-term-parking", - "payment-settings": [ - { - "min-time": 15, - "max-time": 360, - "min-price": 75, - "max-price": 1800, - "comment": "prices already scaled", - "price-scaling-factor": 2, - "allow-overpay": true - } - ], - "service-settings": [ - { - "service-ranges": [ - { - "service-start": "08:00", - "service-end": "18:00" - } - ] - } - ], - "prepaid-settings": [ - { - "prepaid-ranges": [ - { - "prepaid-start": "00:00", - "prepaid-end": "08:00" - }, - { - "prepaid-start": "18:00", - "prepaid-end": "24:00" - } - ] - } - ], - "carry-over-settings": [ - { - "carry-over-ranges": [ - { - "carry-over-start": "00:00", - "carry-over-end": "08:00" - }, - { - "carry-over-start": "18:00", - "carry-over-end": "24:00" - } - ] - } - ], - "tariff-steps": [ - { - "step-start": "now", - "step-duration": 15, - "step-price": 75 - }, - { - "step-duration": 15, - "step-repetition-count": 23, - "step-price": 75, - "comment": "in total 345 minutes and cost 1725 HUF" - } - ], - "monday": [{ - "default": { - "comment": "settings from top half apply" - } - }], - "tuesday": [{ - "default": { - "comment": "settings from top half apply" - } - }], - "wednesday": [{ - "2024-12-25": { - "comment": "Christmas Day", - "comment": "Public Holidays are free", - "prepaid-settings": [ - { - "prepaid-ranges": [ - { - "prepaid-start": "00:00", - "prepaid-end": "24:00" - } - ] - } - ], - "carry-over-settings": [ - { - "carry-over-ranges": [ - { - "carry-over-start": "00:00", - "carry-over-end": "24:00" - } - ] - } - ] - }, - "default": { - "comment": "settings from top half apply" - } - }], - "thursday": [{ - "2024-12-26": { - "comment": "2nd day of Christmas", - "comment": "Public Holidays are free", - "prepaid-settings": [ - { - "prepaid-ranges": [ - { - "prepaid-start": "00:00", - "prepaid-end": "24:00" - } - ] - } - ], - "carry-over-settings": [ - { - "carry-over-ranges": [ - { - "carry-over-start": "00:00", - "carry-over-end": "24:00" - } - ] - } - ] - }, - "default": { - "comment": "settings from top half apply" - } - }], - "friday": [{ - "default": { - "comment": "settings from top half apply" - } - }], - "saturday": [{ - "2024-12-07": { - "comment": "Open For Sale", - "comment": "settings from top half apply" - }, - "default": { - "comment": "Saturday is free", - "prepaid-settings": [ - { - "prepaid-ranges": [ - { - "prepaid-start": "00:00", - "prepaid-end": "24:00" - } - ] - } - ], - "carry-over-settings": [ - { - "carry-over-ranges": [ - { - "carry-over-start": "00:00", - "carry-over-end": "24:00" - } - ] - } - ] - } - }], - "sunday": [{ - "default": { - "comment": "Sunday is free", - "prepaid-settings": [ - { - "prepaid-ranges": [ - { - "prepaid-start": "00:00", - "prepaid-end": "24:00" - } - ] - } - ], - "carry-over-settings": [ - { - "carry-over-ranges": [ - { - "carry-over-start": "00:00", - "carry-over-end": "24:00" - } - ] - } - ] - } - }] - } -} -\end{minted} - -\subsection{Full time service. No overpay.} -\subsubsection{Galtür} - -\begin{enumerate} - \item[$\bullet$] Service time ranges: Monday – Sunday: 00:00 – 24:00. - \item[$\bullet$] Price per day: 7 euros. - \item[$\bullet$] Minimal parking time: 1 day. - \item[$\bullet$] Minimal parking price: 7 euros. - \item[$\bullet$] Maximal parking time: 7 days. - \item[$\bullet$] Maximal parking price: 49 euros. - \item[$\bullet$] Allow overpay: no. - \item[$\bullet$] Prepaid: no. - \item[$\bullet$] Carry over: no. -\end{enumerate} - -\begin{minted}[frame=single, - framesep=3mm, - linenos=true, - xleftmargin=21pt, - tabsize=4]{js} - { - "project": "Galtuer", - "version": "1.0.0", - "product": "short-term-parking", - "payment-settings": [ - { - "min-time": "24:00", - "max-time": 10080, - "min-price": 700, - "max-price": 4900, - "allow-overpay": false - } - ], - "service-settings": [ - { - "service-ranges": [ - { - "service-start": "00:00", - "service-end": "24:00" - } - ] - } - ], - "comment": "no prepaid-settings", - "comment": "no carry-over-settings", - "tariff-steps": [ - { - "step-start": "now", - "step-end": "24:00", - "step-price": 700, - "comment": "first tariff-step", - "comment": "customer can buy anytime (now)", - "comment": "step ends at midnight (next day)" - }, - { - "step-duration": 1440, - "comment": "step-duration given for clarity", - "step-start": "00:00", - "step-end": "24:00", - "step-repetition-count": 6, - "step-price": 700, - "comment": "the following (max. 6) tariff-steps", - "comment": "price uniformly 7 euros for each day" - } - ], - "comment": "not mentioning monday-sunday means that", - "comment": "for monday-sunday apply settings from top-half", - "comment": "of tariff-file" - } -} -\end{minted} - -\subsection{Decreasing price the later \gls{start-time}} -\subsubsection{Pernegg an der Mur} - -\begin{enumerate} - \item[$\bullet$] Service time ranges: Monday – Sunday: 06:00 – 17:00. - \item[$\bullet$] Product: day-ticket. - \item[$\bullet$] Price per day: - \begin{enumerate} - \item 2 euros if \gls{start-time} after $16:00$ - \item 3 euros if \gls{start-time} after $15:00$ - \item 3 euros if \gls{start-time} after $06:00$ - \end{enumerate} - \item[$\bullet$] Minimal parking time: 60 minutes. - \item[$\bullet$] Minimal parking price: 2 euros. - \item[$\bullet$] Maximal parking time: 11 hours (660 minutes). - \item[$\bullet$] Maximal parking price: 6 euros. - \item[$\bullet$] No special days.. - \item[$\bullet$] Allow overpay: no. - \item[$\bullet$] Carry over: no. - \item[$\bullet$] Prepaid: no. -\end{enumerate} - -\begin{minted}[frame=single, - framesep=3mm, - linenos=true, - xleftmargin=21pt, - tabsize=4]{js} - { - "project": "Pernegg an der Mur", - "version": "1.0.0", - "product": "day-ticket", - "payment-settings": [ - { - "min-time": "17:00", - "max-time": "17:00", - "min-price": 200, - "max-price": 600, - "allow-overpay": false - } - ], - "service-settings": [ - { - "service-ranges": [ - { - "service-start": "06:00", - "service-end": "17:00" - } - ] - } - ], - "comment": "no prepaid-settings", - "comment": "no carry-over-settings", - "comment": "implicit out-of-service time", - "comment": "i.e. complement of service time", - "tariff-steps": [ - { - "step-start-after": "06:00", - "step-start-before": "15:00", - "step-end": "17:00", - "step-price": 600, - "comment": "unique tariff-step" - }, - { - "step-start-after": "15:00", - "step-start-before": "16:00", - "step-end": "17:00", - "step-price": 300, - "comment": "unique tariff-step" - }, - { - "step-start-after": "16:00", - "step-end": "17:00", - "step-price": 200, - "comment": "unique tariff-step" - } - ], - "comment": "not mentioning monday-sunday means that", - "comment": "for monday-sunday apply settings from top-half", - "comment": "of tariff-file" - } -} -\end{minted} - -%\subsection{Linsinger Maschinenbau} -%\subsection{Nordisches Ausbildungszentrum (NAZ)} - -\subsection{Full time service. Variable \gls{tariff-step}s.} -\subsubsection{Christoph Reisen} - -\begin{enumerate} - \item[$\bullet$] Service time ranges: Monday – Sunday: 00 – 24:00. - \item[$\bullet$] Prices: - \begin{enumerate} - \item 0-6 hours: 6 euros - \item 7 hours: 7 euros - \item 24 hours: 8 euros - \item 48 hours: 16 euros - \item 72 hours: 24 euros - \item 90 hours: 32 euros - \item 124 hours: 40 euros - \end{enumerate} - \item[$\bullet$] Minimal parking time: 360 minutes. - \item[$\bullet$] Minimal parking price: 6 euros. - \item[$\bullet$] Maximal parking time: $124 * 60 = 7440$ minutes. - \item[$\bullet$] Maximal parking price: 40 euros. - \item[$\bullet$] Allow overpay: yes. -\end{enumerate} - -\begin{minted}[frame=single, - framesep=3mm, - linenos=true, - xleftmargin=21pt, - tabsize=4]{js} - { - "project": "Christoph Reisen", - "version": "1.0.0", - "product": "day-ticket", - "payment-settings": [ - { - "min-time": 360, - "max-time": 7440, - "min-price": 600, - "max-price": 4000, - "price-scaling-factor": 1, - "allow-overpay": true - } - ], - "service-settings": [ - { - "service-ranges": [ - { - "service-start": "00:00", - "service-end": "24:00" - } - ] - } - ], - "comment": "no prepaid-settings", - "comment": "no carry-over-settings", - "comment": "implicit out-of-service time", - "comment": "i.e. complement of service time", - "tariff-steps": [ - { - "step-start": "now", - "step-duration": 360, - "step-price": 600, - "step_type": "single", - "comment": "single tariff-step" - }, - { - "step-start": "now", - "step-duration": 420, - "step-price": 700, - "step_type": "single" - }, - { - "step-start": "now", - "step-duration": 1440, - "step-price": 800, - "step_type": "single" - }, - { - "step-start": "now", - "step-duration": 2880, - "step-price": 1600, - "step_type": "single" - }, - { - "step-start": "now", - "step-duration": 4320, - "step-price": 2400, - "step_type": "single" - }, - { - "step-start": "now", - "step-duration": 5400, - "step-price": 3200, - "step_type": "single" - }, - { - "step-start": "now", - "step-duration": 7440, - "step-price": 4000, - "step_type": "single" - } - ], - "comment": "not mentioning monday-sunday means that", - "comment": "for monday-sunday apply settings from top-half", - "comment": "of tariff-file" - } -} -\end{minted} - -\subsection{Several service time ranges per day. Scaling factor} -\subsubsection{Stockerau} -\label{Stockerau} -\begin{enumerate} - \item[$\bullet$] Service time ranges: - \begin{enumerate} - \item Monday – Friday: $08:00–12:00$ and $13:30-18:00$ - \item Saturday: $08:00-12:00$ - \item Sunday and special days (holidays, open for sale days) - are free. - \end{enumerate} - \item[$\bullet$] Prices: - \begin{enumerate} - \item first 30 minutes: 70 cent - \item 60 minutes: 1,40 euros - \item 120 minutes: 2,80 euros - \item 180 minutes: 4,20 euros - \item 240 minutes: 5,60 euros - \end{enumerate} - \item[$\bullet$] Minimal parking time: 30 minutes. - \item[$\bullet$] Minimal parking price: 70 cent. - \item[$\bullet$] Maximal parking time: 257 minutes. - \item[$\bullet$] Maximal parking price: 6 euros. - \item[$\bullet$] Allow overpay: no. - \item[$\bullet$] Carry over: yes. - \item[$\bullet$] Prepaid: yes. - \item[$\bullet$] Smallest possible coin: 10 cent. -\end{enumerate} - - -\begin{minted}[frame=single, - framesep=3mm, - linenos=true, - xleftmargin=21pt, - tabsize=4]{js} - { - "project": "Stockerau", - "version": "1.0.0", - "product": "short-term-parking", - "payment-settings": [ - { - "min-time": 30, - "max-time": 257, - "min-price": 70, - "max-price": 600, - "allow-overpay": true - } - ], - "service-settings": [ - { - "service-ranges": [ - { - "service-start": "08:00", - "service-end": "12:00" - }, - { - "service-start": "13:30", - "service-end": "18:00" - } - ] - } - ], - "prepaid-settings": [ - { - "prepaid-ranges": [ - { - "prepaid-start": "00:00", - "prepaid-end": "08:00" - }, - { - "prepaid-start": "12:00", - "prepaid-end": "13:30" - }, - { - "prepaid-start": "18:00", - "prepaid-end": "24:00" - }, - } - ], - "carry-over-settings": [ - { - "carry-over-ranges": [ - { - "carry-over-start": "00:00", - "carry-over-end": "08:00" - }, - { - "carry-over-start": "12:00", - "carry-over-end": "13:30" - }, - { - "carry-over-start": "18:00", - "carry-over-end": "24:00" - }, - ] - } - ], - "tariff-steps": [ - { - "step-start": "now", - "step-duration": 30, - "step-price": 70 - }, - { - "step-duration": 4, - "step-price": 10 - "comment": 34 - }, - { - "step-duration": 5, - "step-price": 10 - "comment": 39 - }, - { - "step-duration": 4, - "step-price": 10 - "comment": 43 - }, - { - "step-duration": 4, - "step-price": 10 - "comment": 47 - }, - { - "step-duration": 4, - "step-price": 10 - "comment": 51 - }, - { - "step-duration": 5, - "step-price": 10 - "comment": 56 - }, - { - "step-duration": 4, - "step-price": 10 - "comment": 60 - }, - { - "step-duration": 4, - "step-price": 10 - "comment": 64 - }, - { - "step-duration": 5, - "step-price": 10 - "comment": 69 - }, - { - "step-duration": 4, - "step-price": 10 - "comment": 73 - }, - { - "step-duration": 4, - "step-price": 10 - "comment": 77 - }, - { - "step-duration": 4, - "step-price": 10 - "comment": 81 - }, - { - "step-duration": 5, - "step-price": 10 - "comment": 86 - }, - { - "step-duration": 4, - "step-price": 10 - "comment": 90 - }, - { - "step-duration": 4, - "step-price": 10 - "comment": 94 - }, - { - "step-duration": 5, - "step-price": 10 - "comment": 99 - }, - { - "step-duration": 4, - "step-price": 10 - "comment": 103 - }, - { - "step-duration": 4, - "step-price": 10 - "comment": 107 - }, - { - "step-duration": 4, - "step-price": 10 - "comment": 111 - }, - { - "step-duration": 5, - "step-price": 10 - "comment": 116 - }, - { - "step-duration": 4, - "step-price": 10 - "comment": 120 - }, - { - "step-duration": 4, - "step-price": 10 - "comment": 124 - }, - { - "step-duration": 5, - "step-price": 10 - "comment": 129 - }, - { - "step-duration": 4, - "step-price": 10 - "comment": 133 - }, - { - "step-duration": 4, - "step-price": 10 - "comment": 137 - }, - { - "step-duration": 4, - "step-price": 10 - "comment": 141 - }, - { - "step-duration": 5, - "step-price": 10 - "comment": 146 - }, - { - "step-duration": 4, - "step-price": 10 - "comment": 150 - }, - { - "step-duration": 4, - "step-price": 10 - "comment": 154 - }, - { - "step-duration": 5, - "step-price": 10 - "comment": 159 - }, - { - "step-duration": 4, - "step-price": 10 - "comment": 163 - }, - { - "step-duration": 4, - "step-price": 10 - "comment": 167 - }, - { - "step-duration": 4, - "step-price": 10 - "comment": 171 - }, - { - "step-duration": 5, - "step-price": 10 - "comment": 176 - }, - { - "step-duration": 4, - "step-price": 10 - "comment": 180 - }, - { - "step-duration": 4, - "step-price": 10 - "comment": 184 - }, - { - "step-duration": 5, - "step-price": 10 - "comment": 189 - }, - { - "step-duration": 4, - "step-price": 10 - "comment": 193 - }, - { - "step-duration": 4, - "step-price": 10 - "comment": 197 - }, - { - "step-duration": 4, - "step-price": 10 - "comment": 201 - }, - { - "step-duration": 5, - "step-price": 10 - "comment": 206 - }, - { - "step-duration": 4, - "step-price": 10 - "comment": 210 - }, - { - "step-duration": 4, - "step-price": 10 - "comment": 214 - }, - { - "step-duration": 5, - "step-price": 10 - "comment": 219 - }, - { - "step-duration": 4, - "step-price": 10 - "comment": 223 - }, - { - "step-duration": 4, - "step-price": 10 - "comment": 227 - }, - { - "step-duration": 4, - "step-price": 10 - "comment": 231 - }, - { - "step-duration": 5, - "step-price": 10 - "comment": 236 - }, - { - "step-duration": 4, - "step-price": 10 - "comment": 240 - }, - { - "step-duration": 4, - "step-price": 10 - "comment": 244 - }, - { - "step-duration": 5, - "step-price": 10 - "comment": 249 - }, - { - "step-duration": 4, - "step-price": 10 - "comment": 253 - }, - { - "step-duration": 4, - "step-price": 10 - "comment": 257 - } - ], - "comment": "monday-friday not really necessary", - "monday": [{ - "default": { - "comment": "settings from top half apply" - } - }], - "tuesday": [{ - "2024-12-24": { - "comment": "Christmas", - "comment": "Public Holidays are free", - "prepaid-settings": [ - { - "prepaid-ranges": [ - { - "prepaid-start": "00:00", - "prepaid-end": "24:00" - } - ] - } - ], - "carry-over-settings": [ - { - "carry-over-ranges": [ - { - "carry-over-start": "00:00", - "carry-over-end": "24:00" - } - ] - } - ] - }, - "default": { - "comment": "settings from top half apply" - } - }], - "wednesday": [{ - "2024-12-25": { - "comment": "1st day of Christmas", - "comment": "Public Holidays are free", - "prepaid-settings": [ - { - "prepaid-ranges": [ - { - "prepaid-start": "00:00", - "prepaid-end": "24:00" - } - ] - } - ], - "carry-over-settings": [ - { - "carry-over-ranges": [ - { - "carry-over-start": "00:00", - "carry-over-end": "24:00" - } - ] - } - ] - }, - "default": { - "comment": "settings from top half apply" - } - }], - "thursday": [{ - "2024-12-26": { - "comment": "2nd day of Christmas", - "comment": "Public Holidays are free", - "prepaid-settings": [ - { - "prepaid-ranges": [ - { - "prepaid-start": "00:00", - "prepaid-end": "24:00" - } - ] - } - ], - "carry-over-settings": [ - { - "carry-over-ranges": [ - { - "carry-over-start": "00:00", - "carry-over-end": "24:00" - } - ] - } - ] - }, - "default": { - "comment": "settings from top half apply" - } - }], - "friday": [{ - "default": { - "comment": "settings from top half apply" - } - }], - "saturday": [{ - "default": { - "prepaid-settings": [ - { - "prepaid-ranges": [ - { - "prepaid-start": "00:00", - "prepaid-end": "08:00" - }, - { - "prepaid-start": "12:00", - "prepaid-end": "24:00" - } - ] - } - ], - "carry-over-settings": [ - { - "carry-over-ranges": [ - { - "carry-over-start": "00:00", - "carry-over-end": "08:00" - }, - { - "carry-over-start": "12:00", - "carry-over-end": "24:00" - } - ] - } - ], - "service-settings": [ - { - "service-ranges": [ - { - "service-start": "08:00", - "service-end": "12:00" - } - ] - } - ] - } - }], - "sunday": [{ - "default": { - "comment": "Sunday is free", - "prepaid-settings": [ - { - "prepaid-ranges": [ - { - "prepaid-start": "00:00", - "prepaid-end": "24:00" - } - ] - } - ], - "prepaid-settings": [ - { - "prepaid-ranges": [ - { - "prepaid-start": "00:00", - "prepaid-end": "24:00" - } - ] - } - ] - } - }] - } -} -\end{minted} - - -\subsection{Several service time ranges per day. Free special days.} -\subsubsection{Korneuburg} - -\begin{enumerate} - \item[$\bullet$] Service time ranges: - \begin{enumerate} - \item Monday – Friday: $08:00–12:00$ and $14:00-18:00$ - \item Saturday: $08:00-12:00$ - \item Sunday and special days (holidays, open for sale days) - are free. - \end{enumerate} - \item[$\bullet$] Prices: - \begin{enumerate} - \item first 30 minutes: 60 cent - \item each following 5 minutes: 10 cent - \end{enumerate} - \item[$\bullet$] Minimal parking time: 30 minutes. - \item[$\bullet$] Minimal parking price: 60 euros. - \item[$\bullet$] Maximal parking time: 180 minutes. - \item[$\bullet$] Maximal parking price: 3,60 euros. - \item[$\bullet$] Allow overpay: yes. - \item[$\bullet$] Carry over: yes. - \item[$\bullet$] Prepaid: no. -\end{enumerate} - -\begin{minted}[frame=single, - framesep=3mm, - linenos=true, - xleftmargin=21pt, - tabsize=4]{js} - { - "project": "Korneuburg", - "version": "1.0.0", - "product": "short-term-parking", - "payment-settings": [ - { - "min-time": 30, - "max-time": 180, - "min-price": 60, - "max-price": 360, - "allow-overpay": true - } - ], - "service-settings": [ - { - "service-ranges": [ - { - "service-start": "08:00", - "service-end": "12:00" - }, - { - "service-start": "14:00", - "service-end": "18:00" - } - ] - } - ], - "comment": "no prepaid-settings", - "carry-over-settings": [ - { - "carry-over-ranges": [ - { - "carry-over-start": "12:00", - "carry-over-end": "14:00" - } - ] - } - ], - "tariff-steps": [ - { - "step-start": "now", - "step-duration": 30, - "step-price": 60 - }, - { - "step-duration": 5, - "step-repetition-count": 30, - "step-price": 10, - "comment": "in total 150 minutes and cost 3 euros" - } - ], - "comment": "monday-friday not really necessary", - "monday": [{ - "default": { - "comment": "settings from top half apply" - } - }], - "tuesday": [{ - "2024-12-24": { - "comment": "Christmas", - "comment": "Public Holidays are free", - "prepaid-settings": [ - { - "prepaid-ranges": [ - { - "prepaid-start": "00:00", - "prepaid-end": "24:00" - } - ] - } - ], - "carry-over-settings": [ - { - "carry-over-ranges": [ - { - "carry-over-start": "00:00", - "carry-over-end": "24:00" - } - ] - } - ] - }, - "default": { - "comment": "settings from top half apply" - } - }], - "wednesday": [{ - "2024-12-25": { - "comment": "1st day of Christmas", - "comment": "Public Holidays are free", - "prepaid-settings": [ - { - "prepaid-ranges": [ - { - "prepaid-start": "00:00", - "prepaid-end": "24:00" - } - ] - } - ], - "carry-over-settings": [ - { - "carry-over-ranges": [ - { - "carry-over-start": "00:00", - "carry-over-end": "24:00" - } - ] - } - ] - }, - "default": { - "comment": "settings from top half apply" - } - }], - "thursday": [{ - "2024-12-26": { - "comment": "2nd day of Christmas", - "comment": "Public Holidays are free", - "prepaid-settings": [ - { - "prepaid-ranges": [ - { - "prepaid-start": "00:00", - "prepaid-end": "24:00" - } - ] - } - ], - "carry-over-settings": [ - { - "carry-over-ranges": [ - { - "carry-over-start": "00:00", - "carry-over-end": "24:00" - } - ] - } - ] - }, - "default": { - "comment": "settings from top half apply" - } - }], - "friday": [{ - "default": { - "comment": "settings from top half apply" - } - }], - "saturday": [{ - "default": { - "carry-over-settings": [ - { - "carry-over-ranges": [ - { - "carry-over-start": "00:00", - "carry-over-end": "08:00" - }, - { - "carry-over-start": "12:00", - "carry-over-end": "24:00" - } - ] - } - ], - "service-settings": [ - { - "service-ranges": [ - { - "service-start": "08:00", - "service-end": "12:00" - } - ] - } - ] - } - }], - "sunday": [{ - "default": { - "comment": "Sunday is free", - "carry-over-settings": [ - { - "carry-over-ranges": [ - { - "carry-over-start": "00:00", - "carry-over-end": "24:00" - } - ] - } - ] - } - }] - } -} -\end{minted} - -\subsection{Several service time ranges per day. Free special days. No prepaid.} -\subsubsection{Kirchdorf} - -\begin{enumerate} - \item[$\bullet$] Service time ranges: - \begin{enumerate} - \item Monday – Friday: 08:00 – 12:00 and 14:00 - 18:00 - \item Saturday: 08:00 - 12:00 - \item Sunday and special days (holidays, open for sale days) - are free. - \end{enumerate} - \item[$\bullet$] Prices: - \begin{enumerate} - \item first 30 minutes: 30 cent - \item each following 5 minutes: 10 cent - \end{enumerate} - \item[$\bullet$] Minimal parking time: 30 minutes. - \item[$\bullet$] Minimal parking price: 30 cent. - \item[$\bullet$] Maximal parking time: 90 minutes. - \item[$\bullet$] Maximal parking price: 1,50 euros. - \item[$\bullet$] Allow overpay: yes. - \item[$\bullet$] Carry over: yes. - \item[$\bullet$] Prepaid: yes. -\end{enumerate} - -\begin{minted}[frame=single, - framesep=3mm, - linenos=true, - xleftmargin=21pt, - tabsize=4]{js} - { - "project": "Korneuburg", - "version": "1.0.0", - "product": "short-term-parking", - "payment-settings": [ - { - "min-time": 30, - "max-time": 90, - "min-price": 30, - "max-price": 150, - "allow-overpay": true - } - ], - "service-settings": [ - { - "service-ranges": [ - { - "service-start": "08:00", - "service-end": "12:00" - }, - { - "service-start": "14:00", - "service-end": "18:00" - } - ] - } - ], - "prepaid-settings": [ - { - "prepaid-ranges": [ - { - "prepaid-start": "00:00", - "prepaid-end": "08:00" - }, - { - "prepaid-start": "12:00", - "prepaid-end": "14:00" - }, - { - "prepaid-start": "18:00", - "prepaid-end": "24:00" - } - ] - } - ], - "comment": "no carry-over-settings", - "tariff-steps": [ - { - "step-start": "now", - "step-duration": 30, - "step-price": 60 - }, - { - "step-duration": 5, - "step-repetition-count": 30, - "step-price": 10, - "comment": "in total 150 minutes and cost 3 euros" - } - ], - "comment": "monday-friday not really necessary", - "monday": [{ - "default": { - "comment": "settings from top half apply" - } - }], - "tuesday": [{ - "2024-12-24": { - "comment": "Christmas", - "comment": "Public Holidays are free", - "prepaid-settings": [ - { - "prepaid-ranges": [ - { - "prepaid-start": "00:00", - "prepaid-end": "24:00" - } - ] - } - ], - "carry-over-settings": [ - { - "carry-over-ranges": [ - { - "carry-over-start": "00:00", - "carry-over-end": "24:00" - } - ] - } - ] - }, - "default": { - "comment": "settings from top half apply" - } - }], - "wednesday": [{ - "2024-12-25": { - "comment": "1st day of Christmas", - "comment": "Public Holidays are free", - "prepaid-settings": [ - { - "prepaid-ranges": [ - { - "prepaid-start": "00:00", - "prepaid-end": "24:00" - } - ] - } - ], - "carry-over-settings": [ - { - "carry-over-ranges": [ - { - "carry-over-start": "00:00", - "carry-over-end": "24:00" - } - ] - } - ] - }, - "default": { - "comment": "settings from top half apply" - } - }], - "thursday": [{ - "2024-12-25": { - "comment": "2nd day of Christmas", - "comment": "Public Holidays are free", - "prepaid-settings": [ - { - "prepaid-ranges": [ - { - "prepaid-start": "00:00", - "prepaid-end": "24:00" - } - ] - } - ], - "carry-over-settings": [ - { - "carry-over-ranges": [ - { - "carry-over-start": "00:00", - "carry-over-end": "24:00" - } - ] - } - ] - }, - "default": { - "comment": "settings from top half apply" - } - }], - "friday": [{ - "default": { - "comment": "settings from top half apply" - } - }], - "saturday": [{ - "default": { - "prepaid-settings": [ - { - "prepaid-ranges": [ - { - "prepaid-start": "00:00", - "prepaid-end": "08:00" - }, - { - "prepaid-start": "12:00", - "prepaid-end": "24:00" - } - ] - } - ], - "service-settings": [ - { - "service-ranges": [ - { - "service-start": "08:00", - "service-end": "12:00" - } - ] - } - ] - } - }], - "sunday": [{ - "default": { - "comment": "Sunday is free", - "prepaid-settings": [ - { - "prepaid-ranges": [ - { - "prepaid-start": "00:00", - "prepaid-end": "24:00" - } - ] - } - ], - - } - }] - } -} -\end{minted} - -\subsection{Different max-price for Sunday. 1 minute resolution for -last tariff-step} -\subsubsection{Bad Neuenahr} -See section \ref{top-and-bottom}. - -%\subsection{Weiden} -%\subsection{Forchach} -%\subsection{Schnals} - -\subsection{Set min-time and/or min-price at runtime} -\subsubsection{Valser Alm: Fane} - -\begin{enumerate} - \item[$\bullet$] Service time ranges: Monday – Sunday: 00:00 – 24:00. - \item[$\bullet$] Minimal parking time: until 14:00 if arrival time is - before 14:00. Otherwise until 24:00. - \item[$\bullet$] Minimal parking price: 8 euros if arrival time is - before 14:00. Otherwise 5 euros. - \item[$\bullet$] Maximal parking time: unlimited. - \item[$\bullet$] Maximal parking price: unlimited. - \item[$\bullet$] Allow overpay: no. - \item[$\bullet$] Prepaid: no. -\end{enumerate} - -\begin{minted}[frame=single, - framesep=3mm, - linenos=true, - xleftmargin=21pt, - tabsize=4]{js} - { - "header" : { - "project": "Valser Alm (Fane)", - "version": "1.0.0", - "product": "short-term-parking", - "info": "" - }, - "top" : { - "payment-settings": { - "min-time": { - "cond": [ - { - "current-wallclock-parking-time": { - "<": "14:00", - "then": "14:00" - } - }, - { - "else": "24:00" - } - ] - }, - "min-price": { - "cond": [ - { - "current-wallclock-parking-time": { - "<": "14:00", - "then": 800 - } - }, - { - "else": 500 - } - ] - }, - "max-time": "unlimited", - "max-price": "unlimited", - "allow-overpay": true, - "prepaid": false - }, - "service-settings": [ - { - "service-ranges": [ - { - "service-start": "00:00", - "service-end": "24:00" - } - ] - } - ], - "comment": "no prepaid-settings", - "comment": "no carry-over-settings", - "tariff-steps": [ - { - "step-start": "now", - "step-duration": "min-time" - "step-price": "min-price" - }, - { - "step-duration": 1440, - "step-start": "00:00", - "step-end": "24:00", - "step-repetition-count": "unlimited", - "step-price": 800 - } - ] - }, - "bottom" : { - "comment": "monday-sunday not necessary", - "comment": "take implicitly settings from top half" - } - } -} -\end{minted} - -\subsubsection{Valser Alm: Specker} -Two different \gls{tariff-file}s for this site: \textbf{PKW} and \textbf{BUS}. - -% TODO: eine aufspaltung zwichen arrival-time und start-time. insbesondere -% bei prepaid ist das wichti. - -\begin{enumerate} - \item[$\bullet$] Service time ranges: Monday – Sunday: 07:00 – 19:00. - \item[$\bullet$] Minimal parking time: 12 hours. - \item[$\bullet$] Maximal parking time: 7 days. - \item[$\bullet$] Allow overpay: no. - \item[$\bullet$] Prepaid: yes. - \item[$\bullet$] Carry over: yes. - \item[] \textbf{PKW} - \begin{enumerate} - \item[$\bullet$] Minimal parking price: 6 euros. - \item[$\bullet$] Maximal parking price: 42 euros. - \end{enumerate} - \item[] \textbf{BUS} - \begin{enumerate} - \item[$\bullet$] Minimal parking price: 30 euros. - \item[$\bullet$] Maximal parking price: 210 euros. - \end{enumerate} - -\end{enumerate} - -%\subsection{Sexten} -%\subsection{Wolkenstein} +\section{ATBUpdateShow} \section{Known issues}