From c5960a031ea9c22c69934c7444d15a8f6eaeef3d Mon Sep 17 00:00:00 2001 From: Gerhard Hoffmann Date: Mon, 8 May 2023 12:34:01 +0200 Subject: [PATCH] init_tariff, compute_price_for_parking_ticket: return instance of CalcState as info for errors or success status. --- library/src/calculate_price.cpp | 101 +++++++++++++++++++------------- 1 file changed, 61 insertions(+), 40 deletions(-) diff --git a/library/src/calculate_price.cpp b/library/src/calculate_price.cpp index a04d82a..0125777 100644 --- a/library/src/calculate_price.cpp +++ b/library/src/calculate_price.cpp @@ -16,19 +16,18 @@ int CALCULATE_LIBRARY_API get_zone_nr() { QFileInfo finfo(zone); if (finfo.size() <= 4) { // decimal 000\n if (zone.open(QIODevice::ReadOnly | QIODevice::Text)) { - QTextStream in(&zone); return in.readLine(100).toInt(); - } } } return -1; } -bool CALCULATE_LIBRARY_API init_tariff(parking_tariff_t **tariff, char const *config_file) { +CalcState CALCULATE_LIBRARY_API init_tariff(parking_tariff_t **tariff, char const *config_file) { *tariff = new Configuration(); + CalcState calcState; int const zone = get_zone_nr(); // DEBUG @@ -36,7 +35,7 @@ bool CALCULATE_LIBRARY_API init_tariff(parking_tariff_t **tariff, char const *co qCritical() << " ... zone = " << zone; if (zone <= 0) { - return false; + return calcState.set(CalcState::State::ERROR_PARSING_ZONE_NR); } QString confFile(config_file); @@ -53,57 +52,79 @@ bool CALCULATE_LIBRARY_API init_tariff(parking_tariff_t **tariff, char const *co qCritical() << " ... confFile = " << confFile; QFile fname(confFile); - if (fname.exists()) { - + if (fname.exists() && + fname.open(QIODevice::ReadOnly | QIODevice::Text)) { // DEBUG - qCritical() << " ... confFile exists"; + qCritical() << " ... confFile is open"; - if (fname.open(QIODevice::ReadOnly | QIODevice::Text)) { - - // DEBUG - qCritical() << " ... confFile is open"; - - QString json = fname.readAll(); - return (*tariff)->ParseJson(*tariff, json.toStdString().c_str()); + QString json = fname.readAll(); + if (! (*tariff)->ParseJson(*tariff, json.toStdString().c_str())) { + calcState.m_status = CalcState::State::ERROR_PARSING_TARIFF; } + } else { + calcState.m_status = CalcState::State::ERROR_LOADING_TARIFF; } qCritical() << "init_tariff: Parsing tariff config (" << confFile << ") failed!"; - return false; + return calcState; } void CALCULATE_LIBRARY_API free_tariff(parking_tariff_t *tariff) { delete tariff; } -bool CALCULATE_LIBRARY_API compute_price_for_parking_ticket( - parking_tariff_t *tariff, - time_t start_parking_time, // in minutes - time_t end_parking_time, // in minutes - struct price_t *price) { +CalcState CALCULATE_LIBRARY_API compute_price_for_parking_ticket( + parking_tariff_t *tariff, + time_t start_parking_time, // in minutes + time_t end_parking_time, // in minutes + struct price_t *price) { + CalcState calcState; + double minMin = tariff->PaymentOption.find(PaymentOption::Option1)->second.pop_min_time; + double maxMin = tariff->PaymentOption.find(PaymentOption::Option1)->second.pop_max_time; + + if (minMin < 0 || maxMin < 0 || maxMin < minMin) { + calcState.setDesc(QString("minMin=%1, maxMin=%2").arg(minMin, maxMin)); + return calcState.set(CalcState::State::WRONG_PARAM_VALUES); + } + int const duration = end_parking_time - start_parking_time; - if (duration > 0) { - QDate const d(1970, 1, 1); - QTime const t(0, 0, 0); - QDateTime start(d, t, Qt::UTC); - start = start.toLocalTime().addSecs(start_parking_time * 60); - if (start.isValid()) { - QString cs = start.toString(Qt::ISODate); - double cost = calculator.GetCostFromDuration( - tariff, PaymentOption::Option1, - cs.toLocal8Bit().constData(), - duration, false, true); - price->units = cost; - price->netto = cost; - return true; - } - } else + if (duration < 0) { + calcState.setDesc(QString("end=%1, start=%2") + .arg(end_parking_time, start_parking_time)); + return calcState.set(CalcState::State::NEGATIVE_PARING_TIME); + } + if (duration > maxMin) { + calcState.setDesc(QString("duration=%1, maxMin=%2").arg(duration, maxMin)); + return calcState.set(CalcState::State::ABOVE_MAX_PARKING_TIME); + } + if (duration < minMin) { + calcState.setDesc(QString("duration=%1, minMin=%2").arg(duration, minMin)); + return calcState.set(CalcState::State::BELOW_MIN_PARKING_TIME); + } if (duration == 0) { memset(price, 0x00, sizeof(*price)); - return true; + return calcState.set(CalcState::State::SUCCESS); } - qCritical() << "ERROR start_parking_time (" << start_parking_time << ") <" - << "end_parking_time (" << end_parking_time << ")"; - return false; + + QDate const d(1970, 1, 1); + QTime const t(0, 0, 0); + QDateTime start(d, t, Qt::UTC); + start = start.toLocalTime().addSecs(start_parking_time * 60); + if (start.isValid()) { + QString cs = start.toString(Qt::ISODate); + double cost = calculator.GetCostFromDuration( + tariff, PaymentOption::Option1, + cs.toLocal8Bit().constData(), + duration, false, true); + double minCost = tariff->PaymentOption.find(PaymentOption::Option1)->second.pop_min_price; + if (cost < minCost) { + calcState.setDesc(QString("minCost=%1, cost=%2").arg(minCost, cost)); + return calcState.set(CalcState::State::BELOW_MIN_PARKING_PRICE); + } + price->units = cost; + price->netto = cost; + } + + return calcState.set(CalcState::State::SUCCESS); }