diff --git a/main/main.cpp b/main/main.cpp index 5007382..fc8702c 100644 --- a/main/main.cpp +++ b/main/main.cpp @@ -27,6 +27,7 @@ extern "C" char* strptime(const char* s, #include #include #include +#include #include #include @@ -41,6 +42,121 @@ extern "C" char* strptime(const char* s, #define NEUHAUSER_BILEXA_GALTUER (0) #define NEUHAUSER_KIRCHDORF (1) +#if NEUHAUSER_KIRCHDORF==1 +static bool test_neuhauser_kirchdorf(int step, double cost) { + switch (step) { + case 30: + if (cost != 30) { + qCritical() << "ERROR COMPUTING COST" + << "HAVE" << cost + << "SHOULD" << 30; + return false; + } + break; + case 35: + if (cost != 40) { + qCritical() << "ERROR COMPUTING COST" + << "HAVE" << cost + << "SHOULD" << 40; + return false; + } + break; + case 40: + if (cost != 50) { + qCritical() << "ERROR COMPUTING COST" + << "HAVE" << cost + << "SHOULD" << 50; + return false; + } + break; + case 45: + if (cost != 60) { + qCritical() << "ERROR COMPUTING COST" + << "HAVE" << cost + << "SHOULD" << 60; + return false; + } + break; + case 50: + if (cost != 70) { + qCritical() << "ERROR COMPUTING COST" + << "HAVE" << cost + << "SHOULD" << 70; + return false; + } + break; + case 55: + if (cost != 80) { + qCritical() << "ERROR COMPUTING COST" + << "HAVE" << cost + << "SHOULD" << 80; + return false; + } + break; + case 60: + if (cost != 90) { + qCritical() << "ERROR COMPUTING COST" + << "HAVE" << cost + << "SHOULD" << 90; + return false; + } + break; + case 65: + if (cost != 100) { + qCritical() << "ERROR COMPUTING COST" + << "HAVE" << cost + << "SHOULD" << 100; + return false; + } + break; + case 70: + if (cost != 110) { + qCritical() << "ERROR COMPUTING COST" + << "HAVE" << cost + << "SHOULD" << 110; + return false; + } + break; + case 75: + if (cost != 120) { + qCritical() << "ERROR COMPUTING COST" + << "HAVE" << cost + << "SHOULD" << 120; + return false; + } + break; + case 80: + if (cost != 130) { + qCritical() << "ERROR COMPUTING COST" + << "HAVE" << cost + << "SHOULD" << 130; + return false; + } + break; + case 85: + if (cost != 140) { + qCritical() << "ERROR COMPUTING COST" + << "HAVE" << cost + << "SHOULD" << 140; + return false; + } + break; + case 90: + if (cost != 150) { + qCritical() << "ERROR COMPUTING COST" + << "HAVE" << cost + << "SHOULD" << 150; + return false; + } + break; + default: + break; + } + + return true; +} + +#endif int main() { #if SCHOENAU_KOENIGSEE==1 @@ -89,6 +205,160 @@ int main() { #endif #if NEUHAUSER_KIRCHDORF==1 + if (QDir("/opt/app/tools/atbupdate/customer_743").exists()) { + if(QFileInfo::exists("/etc/psa_tariff/tariff01.json")) { + // if (true) { + // if(true) { + const char *f = "/etc/psa_tariff/tariff01.json"; + // const char *f = "/opt/ptu5/opt/customer_743/etc/psa_tariff/tariff01.json"; + std::ifstream input(f); + + std::stringstream sstr; + while(input >> sstr.rdbuf()); + std::string json(sstr.str()); + + Configuration cfg; + bool isParsed = cfg.ParseJson(&cfg, json.c_str()); + + if (!isParsed) { + qCritical() << "ERROR: CANNOT PARSE" << f; + return -1; + } + qCritical() << "Successfully parsed" << f; + + int const minParkingTime = get_minimal_parkingtime(&cfg); + int const maxParkingTime = get_maximal_parkingtime(&cfg); + int const minParkingPrice = get_minimal_parkingprice(&cfg); + + if (minParkingTime != 30) { + qCritical() << "ERROR: WRONG MIN_PARKING_TIME" << minParkingTime; + return -1; + } + qCritical() << "min_parking_time " << minParkingTime; + + if (maxParkingTime != 90) { + qCritical() << "ERROR: WRONG MAX_PARKING_TIME" << maxParkingTime; + return -1; + } + qCritical() << "max_parking_time " << maxParkingTime; + + + if (minParkingPrice != 30) { + qCritical() << "ERROR: WRONG MIN_PARKING_PRICE" << minParkingPrice; + return -1; + } + qCritical() << "min_parking_price" << minParkingPrice; + + QList const stepsConfigured + = QList(std::initializer_list{ + 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80, 85, 90}); + + QList const steps = Calculator::GetInstance().GetTimeSteps(&cfg); + + if (stepsConfigured != steps) { + qCritical() << "ERROR: WRONG TIME-STEP-LIST" << steps; + qCritical() << "SHOULD BE" << stepsConfigured; + return -1; + } + qCritical() << "time steps" << steps; + + QDateTime s(QDate(2024, 2, 21), QTime()); + QDateTime end; + struct price_t price; + + QList::const_iterator step; + for (step = steps.cbegin(); step != steps.cend(); ++step) { + qCritical() << QString("*** NEXT STEP: %1 ***").arg(*step); + for (int offset = 7*60; offset < 18*60; ++offset) { + QDateTime start = s.addSecs(offset * 60); + QDateTime const firstStart = start; + + if (compute_price_for_parking_ticket(&cfg, start, *step, end, &price)) { + double cost = price.netto; + + //qCritical() << "****" << offset << *step << "****"; + //qCritical() << " firstStart :" << firstStart.toString(Qt::ISODate); + //qCritical() << " start :" << start.toString(Qt::ISODate); + //qCritical() << " end :" << end.toString(Qt::ISODate); + + if (offset < 8*60) { // [7:00 - 8:00[ + if (!test_neuhauser_kirchdorf(*step, cost)) { + qCritical() << "ERROR AT OFFSET" << offset; + return -1; + } + } else + if (offset < 9*60) { // [8:00 - 9:00[ + if (!test_neuhauser_kirchdorf(*step, cost)) { + qCritical() << "ERROR AT OFFSET" << offset; + return -1; + } + } else + if (offset < 10*60) { + if (!test_neuhauser_kirchdorf(*step, cost)) { + qCritical() << "ERROR AT OFFSET" << offset; + return -1; + } + } else + if (offset < 11*60) { + if (!test_neuhauser_kirchdorf(*step, cost)) { + qCritical() << "ERROR AT OFFSET" << offset; + return -1; + } + } else + if (offset < 12*60) { + if (!test_neuhauser_kirchdorf(*step, cost)) { + qCritical() << "ERROR AT OFFSET" << offset; + return -1; + } + } else + if (offset < 13*60) { + if (!test_neuhauser_kirchdorf(*step, cost)) { + qCritical() << "ERROR AT OFFSET" << offset; + return -1; + } + } else + if (offset < 14*60) { + if (!test_neuhauser_kirchdorf(*step, cost)) { + qCritical() << "ERROR AT OFFSET" << offset; + return -1; + } + } else + if (offset < 15*60) { + if (!test_neuhauser_kirchdorf(*step, cost)) { + qCritical() << "ERROR AT OFFSET" << offset; + return -1; + } + } else + if (offset < 16*60) { + if (!test_neuhauser_kirchdorf(*step, cost)) { + qCritical() << "ERROR AT OFFSET" << offset; + return -1; + } + } else + if (offset < 17*60) { + if (!test_neuhauser_kirchdorf(*step, cost)) { + qCritical() << "ERROR AT OFFSET" << offset; + return -1; + } + } else { + qCritical() << "WARN OFFSET TOO HIGH" << offset; + } + + } else { + qCritical() << "ERROR COMPUTING PRICE FOR" + << "start" << start.toString(Qt::ISODate) + << "step" << *step + << "end" << end.toString(Qt::ISODate); + return -1; + } + + } + } + } + return 0; + } + +#if 0 const char *f = "/opt/ptu5/opt/customer_743/etc/psa_tariff/tariff01.json"; std::ifstream input(f); @@ -110,18 +380,18 @@ int main() { qCritical() << "max_parking_time " << maxParkingTime; qCritical() << "min_parking_price" << minParkingPrice; -#if 1 bool nextDay = false; bool prePaid = true; // bool carryOver = false; + //QDateTime s = QDateTime::currentDateTime(); QDateTime s(QDate(2024, 2, 21), QTime()); QDateTime end; for (int duration = 30; duration <= 90; duration += 5) { // for (int duration = 30; duration <= maxParkingTime; duration += 5) { qCritical() << ""; - //for (int offset = 420; offset <= 1080; ++offset) { for (int offset = 420; offset <= 1080; ++offset) { + //for (int offset = 0; offset <= 0; ++offset) { //for (int offset = 420; offset <= 1080; ++offset) { //if (offset > 720 && offset < 840) { // continue; @@ -130,7 +400,12 @@ int main() { QDateTime const firstStart = start; // qCritical() << "start" << start.toString(Qt::ISODate); - double cost = Calculator::GetInstance().GetCostFromDuration(&cfg, 1, start, end, duration, nextDay, prePaid); + // double cost = Calculator::GetInstance().GetCostFromDuration(&cfg, 1, start, end, duration, nextDay, prePaid); + + struct price_t price; + compute_price_for_parking_ticket(&cfg, start, duration, end, &price); + + double cost = price.netto; //#if COST_FROM_DURATION==0 double cost_soll = 30 + ((duration-30)/5 * 10); @@ -144,10 +419,10 @@ int main() { qCritical() << " firstStart :" << firstStart.toString(Qt::ISODate); qCritical() << " start :" << start.toString(Qt::ISODate); qCritical() << " end :" << end.toString(Qt::ISODate); - qCritical() << "duration (soll):" << duration; - qCritical() << "duration (ist) :" << duration_ist; - qCritical() << " cost (soll):" << cost_soll; - qCritical() << " cost (ist) :" << cost; + //qCritical() << "duration (soll):" << duration; + //qCritical() << "duration (ist) :" << duration_ist; + //qCritical() << " cost (soll):" << cost_soll; + //qCritical() << " cost (ist) :" << cost; // if (cost_soll != cost) { //qCritical() << "ERROR" << __func__ << ":" << __LINE__ @@ -161,32 +436,31 @@ int main() { // } //#else - start = s.addSecs(offset * 60); - std::string duration = Calculator::GetInstance().GetDurationFromCost(&cfg, 1, - start.toString(Qt::ISODate).toStdString().c_str(), - cost, false, true); + //start = s.addSecs(offset * 60); + //std::string duration = Calculator::GetInstance().GetDurationFromCost(&cfg, 1, + // start.toString(Qt::ISODate).toStdString().c_str(), + // cost, false, true); - if (end.toString(Qt::ISODate) != QString(duration.c_str())) { + //if (end.toString(Qt::ISODate) != QString(duration.c_str())) { //qCritical() << "ERROR" << end.toString(Qt::ISODate) // << QString(duration.c_str()); //break; - } + //} - qCritical() << "start" << start.toString(Qt::ISODate) - << "cost" << cost - << "until" << duration.c_str() - << "end" << end.toString(Qt::ISODate) - << ":" << start.secsTo(QDateTime::fromString(duration.c_str(), Qt::ISODate)) / 60 - << (end.toString(Qt::ISODate) == QString(duration.c_str())); + //qCritical() << "start" << start.toString(Qt::ISODate) + // << "cost" << cost + // << "until" << duration.c_str() + // << "end" << end.toString(Qt::ISODate) + // << ":" << start.secsTo(QDateTime::fromString(duration.c_str(), Qt::ISODate)) / 60 + // << (end.toString(Qt::ISODate) == QString(duration.c_str())); //#endif // COST_FROM_DURATION } } #endif // 0 - } #endif #if NEUHAUSER_BILEXA_GALTUER==1