diff --git a/library/src/calculator_functions.cpp b/library/src/calculator_functions.cpp index 24b87ba..5b1a1c7 100644 --- a/library/src/calculator_functions.cpp +++ b/library/src/calculator_functions.cpp @@ -320,17 +320,17 @@ std::string Calculator::GetDurationFromCost(Configuration* cfg, lastCurrent = current; current.setTime(to); - int const minsLeft = lastCurrent.secsTo(current) / 60; + int const minsUsed = lastCurrent.secsTo(current) / 60; // mod duration: possibly discard some minutes in // the next time-range - minsToCarryOver = (durationMinutes - minsLeft) % duration; + minsToCarryOver = (durationMinutes - minsUsed) % duration; - durationMinutes -= minsLeft; - durationMinutesNetto += minsLeft; - durationMinutesBrutto += minsLeft; + durationMinutes -= minsUsed; + durationMinutesNetto += minsUsed; + durationMinutesBrutto += minsUsed; - if (minsLeft > 0) { + if (minsUsed > 0) { for(const auto &x: cfg->PaymentRate) { ATBPaymentRate const rate = x.second; if (rate.pra_payment_unit_id == timeRange.time_range_payment_type_id) { @@ -569,6 +569,7 @@ double Calculator::GetCostFromDuration(Configuration* cfg, if (carryOverNotSet) { int range = 0; int minsToCarryOver = 0; // from one work-time to the other on the same day + int minsUsed = 0; QDateTime lastCurrent = QDateTime(); auto timeRangeIt = cfg->TimeRange.cbegin(); @@ -609,18 +610,23 @@ double Calculator::GetCostFromDuration(Configuration* cfg, int duration = timeRange.time_range_to_in_minutes_from_start - timeRange.time_range_from_in_minutes_from_start; - if (current.addSecs(duration * 60).time() <= to) { + if (minsUsed > 0) { + duration -= minsUsed; + minsUsed = 0; + } - for(const auto &x: cfg->PaymentRate) { - ATBPaymentRate const rate = x.second; - if (rate.pra_payment_unit_id == timeRange.time_range_payment_type_id) { - if (minsToCarryOver > 0) { - durationMinutes -= minsToCarryOver; - durationMinutesNetto += minsToCarryOver; - durationMinutesBrutto += minsToCarryOver; - current = current.addSecs(minsToCarryOver*60); - minsToCarryOver = 0; - } else { + if (current.addSecs(duration * 60).time() <= to) { + if (minsToCarryOver > 0) { // the price for this time range + // has been is paid already + durationMinutes -= duration; + durationMinutesNetto += duration; + durationMinutesBrutto += duration; + current = current.addSecs(duration*60); + minsToCarryOver = 0; + } else { + 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; durationMinutes -= duration; @@ -628,8 +634,8 @@ double Calculator::GetCostFromDuration(Configuration* cfg, durationMinutesBrutto += duration; current = current.addSecs(duration * 60); + break; } - break; } } @@ -644,17 +650,19 @@ double Calculator::GetCostFromDuration(Configuration* cfg, lastCurrent = current; current.setTime(to); - int const minsLeft = lastCurrent.secsTo(current) / 60; + minsUsed = lastCurrent.secsTo(current) / 60; // mod duration: possibly discard some minutes in // the next time-range - minsToCarryOver = (durationMinutes - minsLeft) % duration; + if (durationMinutes >= minsUsed) { + minsToCarryOver = durationMinutes - minsUsed; + } - durationMinutes -= minsLeft; - durationMinutesNetto += minsLeft; - durationMinutesBrutto += minsLeft; + durationMinutes -= minsUsed; + durationMinutesNetto += minsUsed; + durationMinutesBrutto += minsUsed; - if (minsLeft > 0) { + if (minsUsed > 0) { for(const auto &x: cfg->PaymentRate) { ATBPaymentRate const rate = x.second; if (rate.pra_payment_unit_id == timeRange.time_range_payment_type_id) { @@ -663,7 +671,6 @@ double Calculator::GetCostFromDuration(Configuration* cfg, } } } - break; } }