From 9ea2037eca76babdc8a7cf35ac96e7b6239568ec Mon Sep 17 00:00:00 2001 From: Gerhard Hoffmann Date: Mon, 19 Feb 2024 11:59:06 +0100 Subject: [PATCH] GetDurationFromCost(): in case of progressive tariff -> implement analogously to GetCostFromDuration(). --- library/src/calculator_functions.cpp | 169 +++++++-------------------- 1 file changed, 45 insertions(+), 124 deletions(-) diff --git a/library/src/calculator_functions.cpp b/library/src/calculator_functions.cpp index 7c078d5..97dec43 100644 --- a/library/src/calculator_functions.cpp +++ b/library/src/calculator_functions.cpp @@ -115,7 +115,7 @@ QDateTime Calculator::GetDailyTicketDuration(Configuration* cfg, const QDateTime /// std::string Calculator::GetDurationFromCost(Configuration* cfg, uint8_t payment_option, - char const *start_datetime, // given in local time + char const *startDatetimePassed, // given in local time double cost, bool nextDay, bool prepaid) @@ -124,7 +124,7 @@ std::string Calculator::GetDurationFromCost(Configuration* cfg, Q_UNUSED(nextDay); // Get input date - QDateTime inputDate = QDateTime::fromString(start_datetime,Qt::ISODate); + QDateTime inputDate = QDateTime::fromString(startDatetimePassed,Qt::ISODate); static const PaymentMethod paymentMethodId = Utilities::getPaymentMethodId(cfg); if (paymentMethodId == PaymentMethod::Steps) { @@ -152,44 +152,37 @@ std::string Calculator::GetDurationFromCost(Configuration* cfg, // started with Neuhauser, Kirchdorf: merge into main algo. later // for now try out some ideas + // started with Neuhauser, Kirchdorf: merge into main algo. later + // for now try out some ideas + static const bool carryOverNotSet = Utilities::isCarryOverNotSet(cfg, paymentMethodId); + static const uint minParkingPrice = Utilities::getMinimalParkingPrice(cfg, paymentMethodId); Q_ASSERT_X(carryOverNotSet, __func__, "CARRYOVER SET (FOR KIRCHDORF)"); Q_ASSERT_X(prepaid, __func__, "PREPAID NOT SET (FOR KIRCHDORF)"); - QDateTime start = QDateTime::fromString(QString(start_datetime)); - QDateTime end = QDateTime(); + QDateTime start_datetime = QDateTime::fromString(QString(startDatetimePassed), Qt::ISODate); + QDateTime start = start_datetime; + QDateTime end_datetime = QDateTime(); int weekdayId = -1; int weekdayIdLast = -1; - int timeRanges = 0; + int durationMinutes = Utilities::getMaximalParkingTime(cfg, paymentMethodId); int durationMinutesBrutto = 0; - int durationMinutes = Utilities::getMaximalParkingPrice(cfg, paymentMethodId); - - QDateTime current = QDateTime::fromString(QString(start_datetime), Qt::ISODate); - -#define DEBUG 1 -//#define DEBUG 0 - -#if DEBUG==1 - qCritical() << "(" << __func__ << ":" << __LINE__ << ")" - << "current" << current.time().toString(Qt::ISODate) - << "durationMinutes" << durationMinutes - << "durationMinutesBrutto" << durationMinutesBrutto; -#endif + QDateTime current = start; int days = 7; while (--days > 0) { weekdayId = current.date().dayOfWeek(); weekdayIdLast = weekdayId; // TODO: some end condition in json-file - while ((timeRanges = cfg->WeekDaysWorktime.count(weekdayId)) == 0) { + while (cfg->WeekDaysWorktime.count(weekdayId) == 0) { current = current.addDays(1); weekdayId = current.date().dayOfWeek(); if (weekdayId == weekdayIdLast) { qCritical() << "ERROR: NO VALID WORKDAY-TIMES DEFINED"; - return 0; + return QDateTime().toString(Qt::ISODate).toStdString(); } } @@ -205,29 +198,24 @@ std::string Calculator::GetDurationFromCost(Configuration* cfg, } } - if (current.time() >= to) { - QDateTime const dt = start; - start = start.addDays(1); - start.setTime(QTime(0, 0, 0)); + if (carryOverNotSet) { + return end_datetime.toString(Qt::ISODate).toStdString(); + } else { + QDateTime const dt = start; + start = start.addDays(1); + start.setTime(QTime(0, 0, 0)); - durationMinutesBrutto += dt.secsTo(start) / 60; - -#if DEBUG==1 - qCritical() << "(" << __func__ << ":" << __LINE__ << ")" - << "start" << start.time().toString(Qt::ISODate) - << "durationMinutes" << durationMinutes - << "durationMinutesBrutto" << durationMinutesBrutto; -#endif - - current = start; + durationMinutesBrutto += dt.secsTo(start) / 60; + current = start; + } } else { break; } } int durationMinutesNetto = 0; - uint price = cost; + uint price = 0; if (carryOverNotSet) { int range = 0; @@ -259,17 +247,8 @@ std::string Calculator::GetDurationFromCost(Configuration* cfg, uint const minutesMoved = lastCurrent.secsTo(current) / 60; durationMinutesBrutto += minutesMoved; -#if DEBUG==1 - qCritical() << "(" << __func__ << ":" << __LINE__ << ")" - << "lastCurrent" << lastCurrent.time().toString(Qt::ISODate) - << "current" << current.time().toString(Qt::ISODate) - << "durationMinutes" << durationMinutes - << "durationMinutesBrutto" << durationMinutesBrutto; -#endif - if (range == 1) { - // TODO - // start_datetime = current; + start_datetime = current; } } } @@ -282,15 +261,7 @@ std::string Calculator::GetDurationFromCost(Configuration* cfg, int duration = timeRange.time_range_to_in_minutes_from_start - timeRange.time_range_from_in_minutes_from_start; -#if DEBUG==1 - qCritical() << "(" << __func__ << ":" << __LINE__ << ")" - << "duration" << duration - << "durationMinutes" << durationMinutes - << "durationMinutesBrutto" << durationMinutesBrutto; -#endif - if (current.addSecs(duration * 60).time() <= to) { - for(const auto &x: cfg->PaymentRate) { ATBPaymentRate const rate = x.second; if (rate.pra_payment_unit_id == timeRange.time_range_payment_type_id) { @@ -300,57 +271,32 @@ std::string Calculator::GetDurationFromCost(Configuration* cfg, durationMinutesBrutto += minsToCarryOver; current = current.addSecs(minsToCarryOver*60); minsToCarryOver = 0; - -#if DEBUG==1 - qCritical() << "(" << __func__ << ":" << __LINE__ << ")" - << "price" << price - << "durationMinutes" << durationMinutes - << "durationMinutesBrutto" << durationMinutesBrutto; -#endif } else { - price -= (uint)rate.pra_price; + if (price >= cost) { + end_datetime = current; + return end_datetime.toString(Qt::ISODate).toStdString(); + } + + price += (uint)rate.pra_price; durationMinutes -= duration; durationMinutesNetto += duration; durationMinutesBrutto += duration; -#if DEBUG==1 - qCritical() << "(" << __func__ << ":" << __LINE__ << ")" - << "price" << price - << "durationMinutes" << durationMinutes - << "durationMinutesBrutto" << durationMinutesBrutto; -#endif - current = current.addSecs(duration * 60); - if (price <= 0) { - - //end = start.addSecs(durationMinutesBrutto * 60); - end = current; - -#if DEBUG==1 - qCritical() << "(" << __func__ << ":" << __LINE__ << ")" - << "durationMinutesBrutto" << durationMinutesBrutto - << "price" << price - << "current" << current.toString(Qt::ISODate) - << "end" << end.toString(Qt::ISODate); -#endif - - return end.toString(Qt::ISODate).toStdString(); + if (price >= cost) { + end_datetime = current; + return end_datetime.toString(Qt::ISODate).toStdString(); } } break; } } -#if DEBUG==1 - qCritical() << "(" << __func__ << ":" << __LINE__ << ")" - << durationMinutes << durationMinutes; -#endif - if (durationMinutes <= 0) { - end = current; - return end.toString(Qt::ISODate).toStdString(); + end_datetime = current; + return end_datetime.toString(Qt::ISODate).toStdString(); } ++timeRangeIt; @@ -369,33 +315,16 @@ std::string Calculator::GetDurationFromCost(Configuration* cfg, durationMinutesNetto += minsLeft; durationMinutesBrutto += minsLeft; -#if DEBUG==1 - qCritical() << "(" << __func__ << ":" << __LINE__ << ")" - << "lastCurrent" << lastCurrent.time().toString(Qt::ISODate) - << "current" << current.time().toString(Qt::ISODate) - << "minsLeft" << minsLeft - << "durationMinutes" << durationMinutes - << "durationMinutesBrutto" << durationMinutesBrutto; -#endif - if (minsLeft > 0) { for(const auto &x: cfg->PaymentRate) { ATBPaymentRate const rate = x.second; if (rate.pra_payment_unit_id == timeRange.time_range_payment_type_id) { - price -= (uint)rate.pra_price; - if (price <= 0) { - end = lastCurrent; - -#if DEBUG==1 - qCritical() << "(" << __func__ << ":" << __LINE__ << ")" - << "lastCurrent" << lastCurrent.time().toString(Qt::ISODate) - << "current" << current.time().toString(Qt::ISODate) - << "price" << price - << "end" << end.toString(Qt::ISODate); -#endif - // return end.toString(Qt::ISODate).toStdString(); - break; - } else break; + price += (uint)rate.pra_price; + if (price >= cost) { + end_datetime = current; + // return end_datetime.toString(Qt::ISODate).toStdString(); + } + break; } } } @@ -405,21 +334,13 @@ std::string Calculator::GetDurationFromCost(Configuration* cfg, } } - end = current; - -#if DEBUG==1 - qCritical() << "(" << __func__ << ":" << __LINE__ << ")" - << "end" << end.toString(Qt::ISODate) - << "durationMinutes" << durationMinutes - << "durationMinutesBrutto" << durationMinutesBrutto; -#endif - - return end.toString(Qt::ISODate).toStdString(); + end_datetime = start.addSecs(durationMinutesBrutto * 60); + return end_datetime.toString(Qt::ISODate).toStdString(); } } - end = QDateTime(); - return end.toString(Qt::ISODate).toStdString(); + end_datetime = QDateTime(); + return end_datetime.toString(Qt::ISODate).toStdString(); } Ticket t = private_GetDurationFromCost(cfg, inputDate, cost, prepaid);