Compare commits

...

3 Commits

Author SHA1 Message Date
631378deeb Added test cases for Szeged. 2024-02-01 13:28:08 +01:00
9d713c894d Moved check if netto minutes exceed max. parking time down into loop.
If this is the case, then stop updating the end-time-date.
2024-02-01 13:19:08 +01:00
38eca50d83 Minor: more detailed debug output 2024-02-01 13:18:27 +01:00
2 changed files with 74 additions and 29 deletions

View File

@ -674,13 +674,24 @@ Ticket Calculator::private_GetDurationFromCost(Configuration *cfg,
// Check prepaid // Check prepaid
if (!prepaid) { if (!prepaid) {
if ((current.time() < worktime_from) || (current.time() > worktime_to)) { if (current.time() < worktime_from) {
qDebug() << "[STOP] * Ticket is not valid * "; qDebug() << "[STOP] TICKET IS NOT VALID: "
<< QString("%1 (current) < %2 (start)")
.arg(current.toString(Qt::ISODate)
.arg(worktime_from.toString(Qt::ISODate)));
return Ticket();
} else
if (current.time() > worktime_to) {
qDebug() << "[STOP] TICKET IS NOT VALID: "
<< QString("%1 (current) > %2 (end)")
.arg(current.toString(Qt::ISODate)
.arg(worktime_to.toString(Qt::ISODate)));
return Ticket(); return Ticket();
} }
} else { } else {
qDebug() << "* PREPAID MODE ACTIVE *";
if (current.time() < worktime_from) { if (current.time() < worktime_from) {
qDebug() << "*** PREPAID *** Current time is before time range start, fast-forward to start"
<< worktime_from.toString(Qt::ISODate);
current.setTime(worktime_from); current.setTime(worktime_from);
end = current; end = current;
} else if(current.time() > lastWorktimeTo) { } else if(current.time() > lastWorktimeTo) {
@ -696,10 +707,16 @@ Ticket Calculator::private_GetDurationFromCost(Configuration *cfg,
if (!IsYearPeriodActive(cfg, current)) { if (!IsYearPeriodActive(cfg, current)) {
return Ticket(); return Ticket();
} }
if(durationMinutesNetto > maxParkingTimeMinutes) { // if(durationMinutesNetto >= maxParkingTimeMinutes) {
durationMinutesNetto = maxParkingTimeMinutes; // might be useful for overpayment
break; // durationMinutesNetto = maxParkingTimeMinutes;
} // int durationMinutesBrutto = start.secsTo(end) / 60;
//
// return
// Ticket(start, end, durationMinutesNetto,
// durationMinutesBrutto, cost, Ticket::s[INVALID_PRICE]);
//
// }
if(current.time() >= lastWorktimeTo) { if(current.time() >= lastWorktimeTo) {
// Go to next day if minutes not spent // Go to next day if minutes not spent
if (carryOverNotSet) { if (carryOverNotSet) {
@ -711,11 +728,20 @@ Ticket Calculator::private_GetDurationFromCost(Configuration *cfg,
} else { } else {
if(current.time() < worktime_to) { if(current.time() < worktime_to) {
// Increment input date minutes for each monetary unit // Increment input date minutes for each monetary unit
durationMinutesNetto +=1; durationMinutesNetto += 1;
moneyLeft -= price; moneyLeft -= price;
moneyLeft = std::round(moneyLeft * 1000.0) / 1000.0; moneyLeft = std::round(moneyLeft * 1000.0) / 1000.0;
current = current.addSecs(60); current = current.addSecs(60);
end = current;
//qCritical() << "moneyLeft" << moneyLeft
// << "durationMinutesNetto" << durationMinutesNetto
// << "current" << current.toString(Qt::ISODate);
if(durationMinutesNetto <= maxParkingTimeMinutes) {
// stop updating of end-date if parking time is
// overshot
end = current;
}
} else break; } else break;
} }
} // while(durationMinutes > 0) { } // while(durationMinutes > 0) {
@ -723,7 +749,7 @@ Ticket Calculator::private_GetDurationFromCost(Configuration *cfg,
} // for (int w = currentRange; w < ranges; ++w, ++totalTimeRanges) { } // for (int w = currentRange; w < ranges; ++w, ++totalTimeRanges) {
} // for (current = start; durationMinutes > 0; current = current.addDays(1)) { } // for (current = start; durationMinutes > 0; current = current.addDays(1)) {
int durationMinutesBrutto = start.secsTo(end) / 60; int durationMinutesBrutto = start.secsTo(end) / 60;
//qCritical() << "start" << start.toString(Qt::ISODate) << "end" //qCritical() << "start" << start.toString(Qt::ISODate) << "end"
// << end.toString(Qt::ISODate) << durationMinutesBrutto; // << end.toString(Qt::ISODate) << durationMinutesBrutto;

View File

@ -37,8 +37,8 @@ extern "C" char* strptime(const char* s,
#define SCHOENAU_KOENIGSEE (0) #define SCHOENAU_KOENIGSEE (0)
#define NEUHAUSER_KORNEUBURG (0) #define NEUHAUSER_KORNEUBURG (0)
#define NEUHAUSER_LINSINGER_MASCHINENBAU (0) #define NEUHAUSER_LINSINGER_MASCHINENBAU (0)
#define NEUHAUSER_NORDISCHES_AUSBILDUNGSZENTRUM (1) #define NEUHAUSER_NORDISCHES_AUSBILDUNGSZENTRUM (0)
#define NEUHAUSER_BILEXA_GALTUER (0) #define NEUHAUSER_BILEXA_GALTUER (1)
int main() { int main() {
@ -146,6 +146,7 @@ int main() {
qCritical() << "start=" << start.toString(Qt::ISODate) qCritical() << "start=" << start.toString(Qt::ISODate)
<< "end" << end.toString(Qt::ISODate) << "price" << price.netto; << "end" << end.toString(Qt::ISODate) << "price" << price.netto;
} }
for (int offset = 480; offset < 1080; ++offset) { for (int offset = 480; offset < 1080; ++offset) {
QDateTime start = s.addSecs(offset * 60); QDateTime start = s.addSecs(offset * 60);
CalcState cs = compute_price_for_daily_ticket(&cfg, start, end, CalcState cs = compute_price_for_daily_ticket(&cfg, start, end,
@ -184,15 +185,15 @@ int main() {
double cost = Calculator::GetInstance().GetCostFromDuration(&cfg, 4, start, end, marken[duration], nextDay, prePaid); double cost = Calculator::GetInstance().GetCostFromDuration(&cfg, 4, start, end, marken[duration], nextDay, prePaid);
//qCritical() << ""; //qCritical() << "";
//qCritical() << "start" << start.toString(Qt::ISODate)
// << "end" << end.toString(Qt::ISODate)
// << "duration" << marken[duration]
// << "cost" << cost;
std::string d = Calculator::GetInstance().GetDurationFromCost(&cfg, 4, start.toString(Qt::ISODate).toStdString().c_str(), cost);
qCritical() << "start" << start.toString(Qt::ISODate) qCritical() << "start" << start.toString(Qt::ISODate)
<< "cost" << cost << "end" << end.toString(Qt::ISODate)
<< "until" << d.c_str() << start.secsTo(QDateTime::fromString(d.c_str(), Qt::ISODate)) / 60; << "duration" << marken[duration]
<< "cost" << cost;
//std::string d = Calculator::GetInstance().GetDurationFromCost(&cfg, 4, start.toString(Qt::ISODate).toStdString().c_str(), cost);
//qCritical() << "start" << start.toString(Qt::ISODate)
// << "cost" << cost
// << "until" << d.c_str() << start.secsTo(QDateTime::fromString(d.c_str(), Qt::ISODate)) / 60;
} }
} }
} }
@ -254,7 +255,7 @@ int main() {
int pop_min_price; int pop_min_price;
int pop_max_price; int pop_max_price;
for (int t=2; t < 3; ++t) { for (int t=1; t < 2; ++t) {
//for (int t=6; t < 7; t+=20) { //for (int t=6; t < 7; t+=20) {
switch (t) { switch (t) {
case 1: { case 1: {
@ -301,15 +302,18 @@ int main() {
pop_min_price = get_minimal_parkingprice(&cfg); pop_min_price = get_minimal_parkingprice(&cfg);
pop_max_price = get_maximal_parkingprice(&cfg); pop_max_price = get_maximal_parkingprice(&cfg);
qCritical() << " pop_min_time: " << pop_min_time; qCritical() << " pop_min_time: " << pop_min_time;
qCritical() << " pop_max_time: " << pop_max_time; qCritical() << " pop_max_time: " << pop_max_time;
qCritical() << "pop_min_price: " << pop_min_price; qCritical() << " pop_min_price: " << pop_min_price;
qCritical() << "pop_max_price: " << pop_max_price; qCritical() << " pop_max_price: " << pop_max_price;
qCritical() << "pop_daily_card_price: " << cfg.getPaymentOptions().pop_daily_card_price;
{ {
// zone 1 (lila) // zone 1 (lila)
QDateTime s(QDate(2023, 11, 30), QTime()); QDateTime s(QDate(2023, 11, 30), QTime());
QDateTime end; QDateTime end;
int cnt = 1;
#if 0
for (int duration = 15; duration <= pop_max_time; duration += 5) { for (int duration = 15; duration <= pop_max_time; duration += 5) {
for (int offset = 480; offset < 1080; ++offset) { for (int offset = 480; offset < 1080; ++offset) {
QDateTime start = s.addSecs(offset * 60); QDateTime start = s.addSecs(offset * 60);
@ -317,19 +321,34 @@ int main() {
double cost = Calculator::GetInstance().GetCostFromDuration(&cfg, 3, start, end, duration); double cost = Calculator::GetInstance().GetCostFromDuration(&cfg, 3, start, end, duration);
// Q_ASSERT(cost == duration*2.5); // Q_ASSERT(cost == duration*2.5);
qCritical() << ""; //qCritical() << "";
qCritical() << "start" << start.toString(Qt::ISODate) qCritical() << cnt << "start" << start.toString(Qt::ISODate)
<< "end" << end.toString(Qt::ISODate) << "end" << end.toString(Qt::ISODate)
<< "duration" << duration << "duration" << duration
<< "cost" << cost; << "cost" << cost;
std::string duration = Calculator::GetInstance().GetDurationFromCost(&cfg, 3, start.toString(Qt::ISODate).toStdString().c_str(), cost); std::string duration = Calculator::GetInstance().GetDurationFromCost(&cfg,
3,
start.toString(Qt::ISODate).toStdString().c_str(),
cost, false, true);
//Q_ASSERT(cost == duration*2.5); //Q_ASSERT(cost == duration*2.5);
qCritical() << "start" << start.toString(Qt::ISODate) qCritical() << cnt << "start" << start.toString(Qt::ISODate)
<< "cost" << cost << "cost" << cost
<< "until" << duration.c_str() << start.secsTo(QDateTime::fromString(duration.c_str(), Qt::ISODate)) / 60; << "until" << duration.c_str() << start.secsTo(QDateTime::fromString(duration.c_str(), Qt::ISODate)) / 60;
++cnt;
} }
} }
#else
QDateTime start = s.addSecs(480 * 60); // 8:00:00
double cost = 2000;
std::string duration = Calculator::GetInstance().GetDurationFromCost(&cfg,
3,
start.toString(Qt::ISODate).toStdString().c_str(),
cost, false, true);
qCritical() << cnt << "start" << start.toString(Qt::ISODate)
<< "cost" << cost
<< "until" << duration.c_str() << start.secsTo(QDateTime::fromString(duration.c_str(), Qt::ISODate)) / 60;
#endif
} }
#if 0 #if 0
{ {