Compare commits

..

No commits in common. "51318927444a0c95b0ac8b3ba394cb16049ba339" and "62c52fd580a4d9d1075a3636857a122697d2f6e7" have entirely different histories.

3 changed files with 57 additions and 53 deletions

View File

@ -36,11 +36,10 @@ int CALCULATE_LIBRARY_API get_minimal_parkingtime(Configuration const *cfg,
int paymentOptionIndex) { int paymentOptionIndex) {
int minTime = 0; int minTime = 0;
qCritical() << __func__ << __LINE__ << "permit" << PermitType(permitType).toString();
paymentOptionIndex = cfg->getPaymentOptionIndex(permitType); paymentOptionIndex = cfg->getPaymentOptionIndex(permitType);
qCritical() << __func__ << __LINE__ << "paymentOptionIndex" << paymentOptionIndex; qCritical() << __func__ << __LINE__ << "paymentOptionIndex" << paymentOptionIndex;
qCritical() << __func__ << __LINE__ << "permit" << PermitType(permitType).toString();
switch(permitType) { switch(permitType) {
case PERMIT_TYPE::SHORT_TERM_PARKING: { // e.g. szeged (customer_281) case PERMIT_TYPE::SHORT_TERM_PARKING: { // e.g. szeged (customer_281)
@ -724,14 +723,9 @@ CalcState CALCULATE_LIBRARY_API compute_price_for_parking_ticket(
int paymentOptionIndex = tariff->getPaymentOptionIndex(permitType); int paymentOptionIndex = tariff->getPaymentOptionIndex(permitType);
QList<int> tlist = Calculator::GetInstance().GetTimeSteps(tariff, paymentOptionIndex);
//Q_UNUSED(tlist);
double minMin = tariff->getPaymentOptions(paymentOptionIndex).pop_min_time; double minMin = tariff->getPaymentOptions(paymentOptionIndex).pop_min_time;
double maxMin = tariff->getPaymentOptions(paymentOptionIndex).pop_max_time; double maxMin = tariff->getPaymentOptions(paymentOptionIndex).pop_max_time;
// netto_parking_time = minMin;
// DEBUG // DEBUG
qCritical() << "compute_price_for_parking_ticket() " << endl qCritical() << "compute_price_for_parking_ticket() " << endl
<< " paymentOptionIndex: " << paymentOptionIndex << endl << " paymentOptionIndex: " << paymentOptionIndex << endl
@ -739,8 +733,8 @@ CalcState CALCULATE_LIBRARY_API compute_price_for_parking_ticket(
<< " netto_parking_time: " << netto_parking_time << endl << " netto_parking_time: " << netto_parking_time << endl
<< " start + netto: " << start_parking_time.addSecs(netto_parking_time * 60) << endl << " start + netto: " << start_parking_time.addSecs(netto_parking_time * 60) << endl
<< " minMin: " << minMin << endl << " minMin: " << minMin << endl
<< " maxMin: " << maxMin << endl << " maxMin: " << maxMin
<< " prepaid: " << prepaid << endl << " prepaid: " << prepaid
<< " permitType: " << permitType.toString(); << " permitType: " << permitType.toString();
if (netto_parking_time < 0) { if (netto_parking_time < 0) {
@ -749,17 +743,14 @@ CalcState CALCULATE_LIBRARY_API compute_price_for_parking_ticket(
start_parking_time.toString(Qt::ISODate))); start_parking_time.toString(Qt::ISODate)));
return calcState.set(CalcState::State::NEGATIVE_PARKING_TIME); return calcState.set(CalcState::State::NEGATIVE_PARKING_TIME);
} }
if (netto_parking_time > maxMin) { if (netto_parking_time > maxMin) {
calcState.setDesc(QString("duration=%1, maxMin=%2").arg(netto_parking_time).arg(maxMin)); calcState.setDesc(QString("duration=%1, maxMin=%2").arg(netto_parking_time).arg(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 (netto_parking_time < minMin) {
calcState.setDesc(QString("duration=%1, minMin=%2").arg(netto_parking_time).arg(minMin)); calcState.setDesc(QString("duration=%1, minMin=%2").arg(netto_parking_time).arg(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 (netto_parking_time == 0) {
return calcState.set(CalcState::State::SUCCESS); return calcState.set(CalcState::State::SUCCESS);
} }
@ -777,12 +768,15 @@ CalcState CALCULATE_LIBRARY_API compute_price_for_parking_ticket(
return calcState; return calcState;
} }
QList<int> tlist = Calculator::GetInstance().GetTimeSteps(tariff);
Q_UNUSED(tlist);
// compute cost (price) // compute cost (price)
cost = Calculator::GetInstance().GetCostFromDuration(tariff, start_parking_time, netto_parking_time, paymentOptionIndex); cost = Calculator::GetInstance().GetCostFromDuration(tariff, start_parking_time, netto_parking_time, paymentOptionIndex);
int weekDay = start_parking_time.date().dayOfWeek(); int weekDay = start_parking_time.date().dayOfWeek();
int pop_carry_over_option_id = tariff->getPaymentOptions(paymentOptionIndex).pop_carry_over_option_id; int pop_carry_over_option_id = tariff->getPaymentOptions(paymentOptionIndex).pop_carry_over_option_id;
qCritical() << __func__ << __LINE__ << "configured carry-over-id" << pop_carry_over_option_id;
std::optional<ATBPeriodYear> yperiod = Utilities::GetYearPeriodActive(tariff, start_parking_time); std::optional<ATBPeriodYear> yperiod = Utilities::GetYearPeriodActive(tariff, start_parking_time);
if (yperiod.has_value()) { if (yperiod.has_value()) {
@ -811,14 +805,13 @@ CalcState CALCULATE_LIBRARY_API compute_price_for_parking_ticket(
} else } else
if (start_parking_time.time() > p.static_start) { // static_start: e.g. 22:00:00 if (start_parking_time.time() > p.static_start) { // static_start: e.g. 22:00:00
effectiveStartTime.setTime(p.static_start); effectiveStartTime.setTime(p.static_start);
effectiveStartTime == effectiveStartTime.addSecs(carryOverDuration * 60);
} }
} }
} }
// handle carry over // handle carry over
int minutesUntilCarryOver = effectiveStartTime.time().secsTo(carryOverStart) / 60; int minutesUntilCarryOver = effectiveStartTime.time().secsTo(carryOverStart) / 60;
if (netto_parking_time >= minutesUntilCarryOver) { if (netto_parking_time > minutesUntilCarryOver) {
int const rest = netto_parking_time - minutesUntilCarryOver; int const rest = netto_parking_time - minutesUntilCarryOver;
QDateTime s(effectiveStartTime); QDateTime s(effectiveStartTime);
s = s.addSecs(minutesUntilCarryOver * 60); s = s.addSecs(minutesUntilCarryOver * 60);

View File

@ -339,6 +339,8 @@ std::string Calculator::GetDurationFromCost(Configuration* cfg,
#if DEBUG_GET_DURATION_FROM_COST==1 #if DEBUG_GET_DURATION_FROM_COST==1
qCritical() << DBG_HEADER << "(ADAPTED) INPUT-DATE" << inputDate.toString(Qt::ISODate); qCritical() << DBG_HEADER << "(ADAPTED) INPUT-DATE" << inputDate.toString(Qt::ISODate);
#endif #endif
//qCritical() << __func__ << __LINE__;
// inputDate is now located in a valid operational-working-range // inputDate is now located in a valid operational-working-range
// find this working-time-range // find this working-time-range
int pwd_period_day_in_week_id = inputDate.date().dayOfWeek(); int pwd_period_day_in_week_id = inputDate.date().dayOfWeek();
@ -352,6 +354,8 @@ std::string Calculator::GetDurationFromCost(Configuration* cfg,
return ""; return "";
} }
//qCritical() << __func__ << __LINE__;
QTime current_working_time_from; QTime current_working_time_from;
QTime current_working_time_to; QTime current_working_time_to;
@ -1009,14 +1013,12 @@ uint32_t Calculator::GetCostFromDuration(Configuration * cfg,
int paymentOptionIndex) const { int paymentOptionIndex) const {
static const PaymentMethod paymentMethodId = Utilities::getPaymentMethodId(cfg); static const PaymentMethod paymentMethodId = Utilities::getPaymentMethodId(cfg);
// qCritical() << __func__ << __LINE__ << "paymentOptionIndex" << paymentOptionIndex; //qCritical() << __func__ << __LINE__ << "paymentOptionIndex" << paymentOptionIndex;
if (paymentMethodId == PaymentMethod::Steps || if (paymentMethodId == PaymentMethod::Steps ||
paymentMethodId == PaymentMethod::Degressive) { paymentMethodId == PaymentMethod::Degressive) {
int const timeStepInMinutes = start.secsTo(end) / 60; int const timeStepInMinutes = start.secsTo(end) / 60;
QList<int> tlist = Calculator::GetInstance().GetTimeSteps(cfg, paymentOptionIndex, start); QList<int> tlist = Calculator::GetInstance().GetTimeSteps(cfg, paymentOptionIndex, start);
qCritical() << DBG_HEADER << " start" << start.toString(Qt::ISODate);
qCritical() << DBG_HEADER << " end" << end.toString(Qt::ISODate);
qCritical() << DBG_HEADER << "timeStepList" << timeStepInMinutes << tlist; qCritical() << DBG_HEADER << "timeStepList" << timeStepInMinutes << tlist;
qCritical() << DBG_HEADER << "timeStepInMinutes" << timeStepInMinutes << start.toString(Qt::ISODate); qCritical() << DBG_HEADER << "timeStepInMinutes" << timeStepInMinutes << start.toString(Qt::ISODate);
@ -2525,10 +2527,10 @@ QList<int> &Calculator::GetTimeSteps(Configuration *cfg, int paymentOptionIndex,
} }
} }
} else { // if (carryOverTimeRangeFrom == QTime(0, 0, 0)) { } else { // if (carryOverTimeRangeFrom == QTime(0, 0, 0)) {
if (DBG_LEVEL >= DBG_DEBUG) { //if (DBG_LEVEL >= DBG_DEBUG) {
qCritical() << "(" << __func__ << ":" << __LINE__ << ") carry over time range from:" << carryOverTimeRangeFrom.toString(Qt::ISODate); qCritical() << "(" << __func__ << ":" << __LINE__ << ") carry over time range from:" << carryOverTimeRangeFrom.toString(Qt::ISODate);
qCritical() << "(" << __func__ << ":" << __LINE__ << ") carry over time range to:" << carryOverTimeRangeTo.toString(Qt::ISODate); qCritical() << "(" << __func__ << ":" << __LINE__ << ") carry over time range to:" << carryOverTimeRangeTo.toString(Qt::ISODate);
} //}
m_timeSteps[paymentOptionIndex].clear(); m_timeSteps[paymentOptionIndex].clear();
@ -2552,7 +2554,7 @@ QList<int> &Calculator::GetTimeSteps(Configuration *cfg, int paymentOptionIndex,
qCritical() << "(" << __func__ << ":" << __LINE__ << ") interpolation end:" << interpolationEnd.toString(Qt::ISODate); qCritical() << "(" << __func__ << ":" << __LINE__ << ") interpolation end:" << interpolationEnd.toString(Qt::ISODate);
} }
} else { } else {
// qCritical() << "(" << __func__ << ":" << __LINE__ << ") TODO"; qCritical() << "(" << __func__ << ":" << __LINE__ << ") TODO";
} }
// int const start_time = start.time().hour() * 60 + start.time().minute(); // int const start_time = start.time().hour() * 60 + start.time().minute();
@ -2580,7 +2582,7 @@ QList<int> &Calculator::GetTimeSteps(Configuration *cfg, int paymentOptionIndex,
for (auto[itr, rangeEnd] = cfg->PaymentRate.equal_range(pop_id); itr != rangeEnd; ++itr) { for (auto[itr, rangeEnd] = cfg->PaymentRate.equal_range(pop_id); itr != rangeEnd; ++itr) {
int const durationId = itr->second.pra_payment_unit_id; int const durationId = itr->second.pra_payment_unit_id;
// qCritical() << "(" << __func__ << ":" << __LINE__ << ") durationId" << durationId; //qCritical() << "(" << __func__ << ":" << __LINE__ << ") durationId" << durationId;
// int const price = itr->second.pra_price; // int const price = itr->second.pra_price;
auto search = cfg->Duration.find(durationId); auto search = cfg->Duration.find(durationId);
@ -2604,8 +2606,7 @@ QList<int> &Calculator::GetTimeSteps(Configuration *cfg, int paymentOptionIndex,
ATBInterpolation interpolation = ipolCheck.value(); ATBInterpolation interpolation = ipolCheck.value();
if (duration.pun_interpolation_id == (int)ATBInterpolation::DYNAMIC_ABSTRACT_TIMEPOINT_AND_STATIC_PRICE) { if (duration.pun_interpolation_id == (int)ATBInterpolation::DYNAMIC_ABSTRACT_TIMEPOINT_AND_STATIC_PRICE) {
//qCritical() << "(" << __func__ << ":" << __LINE__ << ") payment option id:" << pop_id; qCritical() << "(" << __func__ << ":" << __LINE__ << ") HIER NICHT";
//qCritical() << "(" << __func__ << ":" << __LINE__ << ") pun_intnerpolation_id:" << duration.pun_interpolation_id;
interpolation.dynamic_start = start.time(); interpolation.dynamic_start = start.time();
interpolation.dynamic_start.setHMS(start.time().hour(), start.time().minute(), 0); interpolation.dynamic_start.setHMS(start.time().hour(), start.time().minute(), 0);
@ -2660,7 +2661,6 @@ QList<int> &Calculator::GetTimeSteps(Configuration *cfg, int paymentOptionIndex,
if (duration.pun_interpolation_id == (int)ATBInterpolation::NO_INTERPOLATION) { if (duration.pun_interpolation_id == (int)ATBInterpolation::NO_INTERPOLATION) {
//qCritical() << "(" << __func__ << ":" << __LINE__ << ") pun_id:" << duration.pun_id; //qCritical() << "(" << __func__ << ":" << __LINE__ << ") pun_id:" << duration.pun_id;
//qCritical() << "(" << __func__ << ":" << __LINE__ << ") paymentOptionIndex:" << paymentOptionIndex;
//qCritical() << "(" << __func__ << ":" << __LINE__ << ") pun duration:" << duration.pun_duration; //qCritical() << "(" << __func__ << ":" << __LINE__ << ") pun duration:" << duration.pun_duration;
//qCritical() << "(" << __func__ << ":" << __LINE__ << ") next time step:" << nextTimeStep.toString(Qt::ISODate); //qCritical() << "(" << __func__ << ":" << __LINE__ << ") next time step:" << nextTimeStep.toString(Qt::ISODate);
//qCritical() << "(" << __func__ << ":" << __LINE__ << ") runtime in minutes (2):" << runtimeInMinutes; //qCritical() << "(" << __func__ << ":" << __LINE__ << ") runtime in minutes (2):" << runtimeInMinutes;
@ -2673,7 +2673,6 @@ QList<int> &Calculator::GetTimeSteps(Configuration *cfg, int paymentOptionIndex,
m_timeSteps[paymentOptionIndex] << duration.pun_duration; m_timeSteps[paymentOptionIndex] << duration.pun_duration;
search->second = duration; search->second = duration;
cfg->getPaymentOptions(paymentOptionIndex).pop_min_time = runtimeInMinutes; cfg->getPaymentOptions(paymentOptionIndex).pop_min_time = runtimeInMinutes;
qCritical() << "(" << __func__ << ":" << __LINE__ << ") pop_min_time" << cfg->getPaymentOptions(paymentOptionIndex).pop_min_time;
continue; continue;
} }
} }
@ -2750,6 +2749,7 @@ QList<int> &Calculator::GetTimeSteps(Configuration *cfg, int paymentOptionIndex,
m_timeSteps[paymentOptionIndex] << duration.pun_duration; m_timeSteps[paymentOptionIndex] << duration.pun_duration;
search->second = duration; search->second = duration;
} else { } else {
qCritical() << "(" << __func__ << ":" << __LINE__ << ") HIER NICHT";
cfg->Duration.erase(search); cfg->Duration.erase(search);
} }
} }
@ -2783,7 +2783,7 @@ QList<int> &Calculator::GetTimeSteps(Configuration *cfg, int paymentOptionIndex,
} }
} }
// qCritical() << "(" << __func__ << ":" << __LINE__ << ") NEW timeSteps:" << m_timeSteps; qCritical() << "(" << __func__ << ":" << __LINE__ << ") NEW timeSteps:" << m_timeSteps;
if (DBG_LEVEL >= DBG_DEBUG) { if (DBG_LEVEL >= DBG_DEBUG) {
qCritical() << "(" << __func__ << ":" << __LINE__ << ") NEW timeSteps:" << m_timeSteps; qCritical() << "(" << __func__ << ":" << __LINE__ << ") NEW timeSteps:" << m_timeSteps;
@ -2816,13 +2816,9 @@ uint32_t Calculator::GetPriceForTimeStep(Configuration *cfg, int timeStep, int p
uint32_t price = 0; uint32_t price = 0;
int pun_duration = 0; int pun_duration = 0;
if (DBG_LEVEL >= DBG_DEBUG) { qCritical() << "(" << __func__ << ":" << __LINE__ << ") paymentOptionIndex" << paymentOptionIndex;
qCritical() << "(" << __func__ << ":" << __LINE__ << ") paymentOptionIndex" << paymentOptionIndex; //qCritical() << "(" << __func__ << ":" << __LINE__ << ") timeStep" << timeStep;
qCritical() << "(" << __func__ << ":" << __LINE__ << ") timeStep" << timeStep; //qCritical() << "(" << __func__ << ":" << __LINE__ << ") pop_id" << pop_id;
qCritical() << "(" << __func__ << ":" << __LINE__ << ") pop_id" << pop_id;
qCritical() << "(" << __func__ << ":" << __LINE__ << ") pop_accumulate_prices" << pop_accumulate_prices;
qCritical() << "(" << __func__ << ":" << __LINE__ << ") pop_accumulate_durations" << pop_accumulate_durations;
}
for (auto[itr, rangeEnd] = cfg->PaymentRate.equal_range(pop_id); itr != rangeEnd; ++itr) for (auto[itr, rangeEnd] = cfg->PaymentRate.equal_range(pop_id); itr != rangeEnd; ++itr)
{ {
@ -2847,7 +2843,6 @@ uint32_t Calculator::GetPriceForTimeStep(Configuration *cfg, int timeStep, int p
} }
if (DBG_LEVEL >= DBG_DEBUG) { if (DBG_LEVEL >= DBG_DEBUG) {
qCritical() << "(" << __func__ << ":" << __LINE__ << ")";
qCritical() << "(" << __func__ << ":" << __LINE__ << ") price" << price; qCritical() << "(" << __func__ << ":" << __LINE__ << ") price" << price;
qCritical() << "(" << __func__ << ":" << __LINE__ << ") pun_id" << pun_id; qCritical() << "(" << __func__ << ":" << __LINE__ << ") pun_id" << pun_id;
qCritical() << "(" << __func__ << ":" << __LINE__ << ") pun_unit_id" << payment_unit_id; qCritical() << "(" << __func__ << ":" << __LINE__ << ") pun_unit_id" << payment_unit_id;

View File

@ -49,9 +49,9 @@ extern "C" char* strptime(const char* s,
#define NEUHAUSER_STOCKERAU (0) #define NEUHAUSER_STOCKERAU (0)
#define KLEIPEDA_LITAUEN (0) #define KLEIPEDA_LITAUEN (0)
#define SEXTEN (0) #define SEXTEN (0)
#define SCHNALS_LEITER_KIRCHL (1) #define SCHNALS_LEITER_KIRCHL (0)
#define SCHNALS_STAUMAUER (SCHNALS_LEITER_KIRCHL) #define SCHNALS_STAUMAUER (SCHNALS_LEITER_KIRCHL)
#define VALSER_ALM (0) #define VALSER_ALM (1)
#if NEUHAUSER_KIRCHDORF==1 #if NEUHAUSER_KIRCHDORF==1
static bool test_neuhauser_kirchdorf(int step, double cost) { static bool test_neuhauser_kirchdorf(int step, double cost) {
@ -575,8 +575,8 @@ int main() {
int pop_max_price; int pop_max_price;
int pop_daily_card_price; int pop_daily_card_price;
input.open("/home/linux/customer_505/etc/psa_tariff/tariff01.json"); //input.open("/home/linux/customer_505/etc/psa_tariff/tariff01.json");
//input.open("/opt/ptu5/opt/customer_505/etc/psa_tariff/tariff01.json"); input.open("/opt/ptu5/opt/customer_505/etc/psa_tariff/tariff01.json");
std::stringstream sstr; std::stringstream sstr;
while(input >> sstr.rdbuf()); while(input >> sstr.rdbuf());
@ -588,13 +588,10 @@ int main() {
cout << endl; cout << endl;
if (isParsed) { if (isParsed) {
//PermitType permitType(PERMIT_TYPE::SHORT_TERM_PARKING); pop_min_time = get_minimal_parkingtime(&cfg);
PermitType permitType(PERMIT_TYPE::DAY_TICKET_PKW); pop_max_time = get_maximal_parkingtime(&cfg);
pop_min_price = get_minimal_parkingprice(&cfg);
pop_min_time = get_minimal_parkingtime(&cfg, permitType); pop_max_price = get_maximal_parkingprice(&cfg);
pop_max_time = get_maximal_parkingtime(&cfg, permitType);
pop_min_price = get_minimal_parkingprice(&cfg, permitType);
pop_max_price = get_maximal_parkingprice(&cfg, permitType);
pop_daily_card_price = cfg.getPaymentOptions().pop_daily_card_price; pop_daily_card_price = cfg.getPaymentOptions().pop_daily_card_price;
qCritical() << " pop_min_time: " << pop_min_time; qCritical() << " pop_min_time: " << pop_min_time;
@ -652,10 +649,10 @@ int main() {
} }
//for (int minutes = 0; minutes < 1440; ++minutes) { //for (int minutes = 0; minutes < 1440; ++minutes) {
for (int minutes = 480; minutes <= 480; minutes += 1) { for (int minutes = 1020; minutes <= 1020; minutes += 1) {
QDateTime start = s.addSecs(minutes * 60); QDateTime start = s.addSecs(minutes * 60);
// qCritical() << "start" << start.toString(Qt::ISODate); qCritical() << "start" << start.toString(Qt::ISODate);
QDateTime effectiveStart = start; QDateTime effectiveStart = start;
@ -672,7 +669,8 @@ int main() {
} }
#if 0 #if 0
for (int i = 700; i <= 1400; i += 700) { PermitType permitType(PERMIT_TYPE::SHORT_TERM_PARKING);
for (int i = 200; i <= 200; i += 10) {
cost = i; cost = i;
if ((cs = compute_duration_for_parking_ticket(&cfg, start, cost, end, permitType))) { // return value if ((cs = compute_duration_for_parking_ticket(&cfg, start, cost, end, permitType))) { // return value
@ -684,20 +682,38 @@ int main() {
// qCritical() << cs.toString(); // qCritical() << cs.toString();
} }
//qCritical() << "start" << start.toString(Qt::ISODate) << "< cost" << cost qCritical() << "start" << start.toString(Qt::ISODate) << "< cost" << cost
// << "> end" << end.toString(Qt::ISODate); << "> end" << end.toString(Qt::ISODate);
} }
#else #else
for (int i = 700; i <= 1400; i += 700) {
//for (int i = 2100; i <= 2100; i += 10) {
cost = i;
if ((cs = compute_duration_for_parking_ticket(&cfg, start, cost, end, PermitType(PERMIT_TYPE::SHORT_TERM_PARKING_PKW)))) { // return value
}
if (!cs) {
qCritical() << "ERROR CalcState" << cs.toString() << endl;
} else {
// qCritical() << cs.toString();
}
qCritical() << "start" << start.toString(Qt::ISODate) << "< cost" << cost
<< "> end" << end.toString(Qt::ISODate);
}
#endif
#if 0
start = QDateTime::currentDateTime(); start = QDateTime::currentDateTime();
//start.setTime(QTime(9, 57, 0)); start.setTime(QTime(9, 57, 0));
for (int netto_parking_time = 60; netto_parking_time <= 60; netto_parking_time += 60) { for (int i = 66; i <= 66; i += 6) {
QDateTime end; QDateTime end;
struct price_t price; struct price_t price;
cs = compute_price_for_parking_ticket(&cfg, start, netto_parking_time, end, &price, permitType, true); cs = compute_price_for_parking_ticket(&cfg, start, i, end, &price);
qCritical() << "start" << start.toString(Qt::ISODate) << "end" << end.toString(Qt::ISODate) qCritical() << "start" << start.toString(Qt::ISODate) << "end" << end.toString(Qt::ISODate)
<< "price" << price.netto; << "price" << price.netto;