MOBILISIS-Calculator/main/main.cpp

1632 lines
81 KiB
C++
Raw Normal View History

2023-04-28 11:00:01 +02:00
#ifdef WIN32
#include <time.h>
#include <iomanip>
#include <sstream>
2023-05-15 14:05:55 +02:00
#include <calculate_price.h>
2023-04-28 11:00:01 +02:00
extern "C" char* strptime(const char* s,
const char* f,
struct tm* tm) {
// Isn't the C++ standard lib nice? std::get_time is defined such that its
// format parameters are the exact same as strptime. Of course, we have to
// create a string stream first, and imbue it with the current C locale, and
// we also have to make sure we return the right things if it fails, or
// if it succeeds, but this is still far simpler an implementation than any
// of the versions in any of the C standard libraries.
std::istringstream input(s);
input.imbue(std::locale(setlocale(LC_ALL, nullptr)));
input >> std::get_time(tm, f);
if (input.fail()) {
return nullptr;
}
return (char*)(s + input.tellg());
}
#endif
#include <QDebug>
#include <QDateTime>
2023-05-12 12:43:07 +02:00
#include <QDir>
#include <QFileInfo>
2023-05-12 12:43:07 +02:00
#include <fstream>
#include <sstream>
#include "calculator_functions.h"
2024-01-30 14:00:55 +01:00
#include "calculate_price.h"
#define SZEGED (0)
2024-01-30 10:53:43 +01:00
#define SCHOENAU_KOENIGSEE (0)
2023-12-15 13:28:58 +01:00
#define NEUHAUSER_KORNEUBURG (0)
2024-03-07 08:18:40 +01:00
#define NEUHAUSER_LINSINGER_MASCHINENBAU (0)
2024-04-08 13:53:29 +02:00
#define NEUHAUSER_NORDISCHES_AUSBILDUNGSZENTRUM (0)
2024-02-15 16:12:10 +01:00
#define NEUHAUSER_BILEXA_GALTUER (0)
#define NEUHAUSER_KIRCHDORF (0)
2024-04-08 13:53:29 +02:00
#define BAD_NEUENAHR_AHRWEILER (1)
2023-12-06 10:52:35 +01:00
int main() {
2024-04-08 13:53:29 +02:00
#if BAD_NEUENAHR_AHRWEILER==1
std::ifstream input;
int pop_min_time;
int pop_max_time;
int pop_min_price;
int pop_max_price;
int pop_daily_card_price;
2024-04-12 14:14:40 +02:00
int pop_carry_over;
int pop_carry_over_time_range_id;
2024-04-08 13:53:29 +02:00
2024-04-12 14:14:40 +02:00
for (int zone=2; zone < 3; ++zone) {
2024-04-08 13:53:29 +02:00
//for (int t=6; t < 7; t+=20) {
switch (zone) {
case 1: {
input.open("/opt/ptu5/opt/customer_249/etc/psa_tariff/tariff01.json");
//pop_max_time = 6*60;
} break;
case 2: {
input.open("/opt/ptu5/opt/customer_249/etc/psa_tariff/tariff02.json");
//pop_max_time = 5*60;
} break;
case 3: {
input.open("/opt/ptu5/opt/customer_249/etc/psa_tariff/tariff03.json");
//pop_max_time = 6*60;
} break;
case 4: {
input.open("/opt/ptu5/opt/customer_249/etc/psa_tariff/tariff04.json");
//pop_max_time = 4*60;
} break;
case 5: {
input.open("/opt/ptu5/opt/customer_249/etc/psa_tariff/tariff05.json");
//pop_max_time = 6*60;
} break;
case 6: {
input.open("/opt/ptu5/opt/customer_249/etc/psa_tariff/tariff06.json");
//pop_max_time = 4*60;
} break;
case 7: {
input.open("/opt/ptu5/opt/customer_249/etc/psa_tariff/tariff07.json");
//pop_max_time = 4*60;
} break;
default:
continue;
}
std::stringstream sstr;
while(input >> sstr.rdbuf());
std::string json(sstr.str());
Configuration cfg;
bool isParsed = cfg.ParseJson(&cfg, json.c_str());
cout << endl;
if (isParsed) {
// test library functions
2024-04-12 14:14:40 +02:00
if (zone == 1) {
pop_min_time = get_minimal_parkingtime(&cfg);
pop_max_time = get_maximal_parkingtime(&cfg);
pop_min_price = get_minimal_parkingprice(&cfg);
pop_max_price = get_maximal_parkingprice(&cfg);
pop_daily_card_price = cfg.getPaymentOptions().pop_daily_card_price;
qCritical() << " pop_min_time: " << pop_min_time;
qCritical() << " pop_max_time: " << pop_max_time;
qCritical() << " pop_min_price: " << pop_min_price;
qCritical() << " pop_max_price: " << pop_max_price;
qCritical() << "pop_daily_card_price: " << pop_daily_card_price;
static QList<int> const stepsConfigured
= QList(std::initializer_list<int>{
20, 40, 60, 80, 100, 120, 140, 160, 180, 200, 220, 240, 260, 1440});
//static QList<double> const cost
// = QList(std::initializer_list<double>{
// 0, 40, 80, 120, 160, 200, 240, 280, 320, 360, 400, 440, 480, 500});
static QList<int> const timeSteps = Calculator::GetInstance().GetTimeSteps(&cfg);
qCritical() << "TimeSteps" << timeSteps;
if (stepsConfigured != timeSteps) {
qCritical() << "TIME-STEPS SHOULD BE" << stepsConfigured;
return -1;
}
2024-04-08 13:53:29 +02:00
2024-04-12 14:14:40 +02:00
QDateTime start = QDateTime::currentDateTime();
struct price_t costs;
double price1 = 0;
double price2 = 0;
for (int m=0; m < 1440; ++m) {
start.setTime(QTime(0, 0, 0));
start = start.addSecs(m*60);
qCritical() << "START" << start.toString(Qt::ISODate);
//int Down = 0;
//int Up = 1;
// for (int i = 0, j=timeSteps.size() ; i < timeSteps.size(); --j, ++i) {
// int nextTimeStep = compute_next_timestep(&cfg, timeSteps.at(i), Up);
// qCritical() << "nextTimeStep" << nextTimeStep;
//
// int prevTimeStep = compute_next_timestep(&cfg, timeSteps.at(i), Down);
// qCritical() << "prevTimeStep" << prevTimeStep;
//}
CalcState cs;
for (int i = 0, j=timeSteps.size() ; i < timeSteps.size(); --j, ++i) {
QDateTime end = start.addSecs(timeSteps.at(i)*60);
cs = compute_price_for_parking_ticket(&cfg, start, timeSteps.at(i), end, &costs);
if (cs.getStatus() != CalcState::State::SUCCESS) {
if (start.time().hour() >= 8 && start.time().hour() < 18) {
qCritical() << "ERROR CALC-STATE-1=" << QString(cs);
exit(-1);
} else {
if (cs.getStatus() == CalcState::State::OUTSIDE_ALLOWED_PARKING_TIME) {
qCritical() << "CALC-STATE=" << QString(cs);
continue;
}
qCritical() << "ERROR CALC-STATE-2=" << QString(cs);
exit(-1);
}
}
price1 = costs.netto;
price2 = Calculator::GetInstance().GetCostFromDuration(&cfg, start, timeSteps.at(i));
2024-04-08 13:53:29 +02:00
2024-04-12 14:14:40 +02:00
if (price1 != price2) {
qCritical() << "ERROR DIFFERENT PRICES" << price1 << price2;
exit(-1);
}
2024-04-08 13:53:29 +02:00
2024-04-12 14:14:40 +02:00
qCritical() << "compute_price_for_parking_ticket()/GetCostFromDuration() TIME: "
<< timeSteps.at(i) << "PRICE=" << price1;
2024-04-08 13:53:29 +02:00
2024-04-12 14:14:40 +02:00
//std::string duration = Calculator::GetInstance().GetDurationFromCost(&cfg, 4,
// start.toString(Qt::ISODate).toStdString().c_str(),
// cost[i], false, true);
//qCritical() << "duration" << duration.c_str();
}
}
} // zone == 1
if (zone == 2) {
int const numOptions = cfg.getAllPaymentOptions().size();
#if 0
for (int payOpt=0; payOpt < numOptions; ++payOpt) {
pop_min_time = get_minimal_parkingtime(&cfg, PERMIT_TYPE::SHORT_TERM_PARKING, payOpt);
pop_max_time = get_maximal_parkingtime(&cfg, PERMIT_TYPE::SHORT_TERM_PARKING, payOpt);
pop_min_price = get_minimal_parkingprice(&cfg, PERMIT_TYPE::SHORT_TERM_PARKING, payOpt);
pop_max_price = get_maximal_parkingprice(&cfg, PERMIT_TYPE::SHORT_TERM_PARKING, payOpt);
pop_daily_card_price = cfg.getPaymentOptions(payOpt).pop_daily_card_price;
pop_carry_over = cfg.getPaymentOptions(payOpt).pop_carry_over;
pop_carry_over_time_range_id = cfg.getPaymentOptions(payOpt).pop_carry_over_time_range_id;
qCritical() << QString(" pop_min_time[%1]: %2").arg(payOpt).arg(pop_min_time);
qCritical() << QString(" pop_max_time[%1]: %2").arg(payOpt).arg(pop_max_time);
qCritical() << QString(" pop_min_price[%1]: %2").arg(payOpt).arg(pop_min_price);
qCritical() << QString(" pop_max_price[%1]: %2").arg(payOpt).arg(pop_max_price);
qCritical() << QString(" pop_daily_card_price[%1]: %2").arg(payOpt).arg(pop_daily_card_price);
qCritical() << QString(" pop_carry_over[%1]: %2").arg(payOpt).arg(pop_carry_over);
qCritical() << QString("pop_carry_over_time_range_id[%1]: %2").arg(payOpt).arg(pop_carry_over_time_range_id);
if (pop_carry_over_time_range_id != -1) {
QTime const carryOverTimeRangeFrom = cfg.TimeRange.find(pop_carry_over_time_range_id)->second.time_range_from;
QTime const carryOverTimeRangeTo = cfg.TimeRange.find(pop_carry_over_time_range_id)->second.time_range_to;
qCritical() << QString(" timeRangeFrom[%1]: %2").arg(payOpt).arg(carryOverTimeRangeFrom.toString(Qt::ISODate));
qCritical() << QString(" timeRangeTo[%1]: %2").arg(payOpt).arg(carryOverTimeRangeTo.toString(Qt::ISODate));
2024-04-08 13:53:29 +02:00
2024-04-12 14:14:40 +02:00
}
2024-04-08 13:53:29 +02:00
2024-04-12 14:14:40 +02:00
}
#endif
2024-04-08 13:53:29 +02:00
2024-04-12 14:14:40 +02:00
QDateTime start(QDate(2024, 4, 14), QTime());
QDateTime end;
struct price_t price;
2024-04-08 13:53:29 +02:00
2024-04-12 14:14:40 +02:00
//start = QDateTime::currentDateTime();
2024-04-08 13:53:29 +02:00
2024-04-12 14:14:40 +02:00
int paymentOptionIndex = cfg.getCurrentPaymentOptionIndex(start);
if (paymentOptionIndex != -1) {
qCritical() << "paymentOptionIndex" << paymentOptionIndex;
QList<int> const timeSteps = Calculator::GetInstance().GetTimeSteps(&cfg, paymentOptionIndex);
qCritical() << "TimeSteps" << timeSteps;
2024-04-08 13:53:29 +02:00
2024-04-12 14:14:40 +02:00
// QDateTime start = s.addSecs(offset * 60);
2024-04-08 13:53:29 +02:00
2024-04-12 14:14:40 +02:00
QList<int>::const_iterator step;
for (step = timeSteps.cbegin(); step != timeSteps.cend(); ++step) {
2024-04-08 13:53:29 +02:00
2024-04-12 14:14:40 +02:00
double cost = 0;
2024-04-08 13:53:29 +02:00
2024-04-12 14:14:40 +02:00
//if (compute_price_for_parking_ticket(&cfg, start, *step, end, &price)) {
// cost = price.netto;
//}
2024-04-08 13:53:29 +02:00
}
}
}
}
}
#endif
2024-01-24 16:36:29 +01:00
#if SCHOENAU_KOENIGSEE==1
2024-04-12 14:14:40 +02:00
//QString f("/opt/ptu5/opt/customer_332/etc/psa_tariff/tariff01.json");
QString f("/opt/ptu5/opt/customer_332/etc/psa_tariff/tariff02.json");
2024-01-24 16:36:29 +01:00
std::ifstream input(f.toUtf8().constData());
std::stringstream sstr;
while(input >> sstr.rdbuf());
std::string json(sstr.str());
Configuration cfg;
bool isParsed = cfg.ParseJson(&cfg, json.c_str());
cout << endl;
if (isParsed) {
qCritical() << "parsed" << f;
int minParkingTime = get_minimal_parkingtime(&cfg);
qCritical() << "minimal_parking_time" << minParkingTime;
QDateTime start = QDateTime::currentDateTime();
// zone 1
2024-04-12 14:14:40 +02:00
//int timeSteps[] = {60, 180, 1440, 2880, 4320, 5670, 7200, 8640, 10080, 11520, 12960, 14400};
2024-01-24 16:36:29 +01:00
static QList<int> const timeSteps = Calculator::GetInstance().GetTimeSteps(&cfg);
qCritical() << "TimeSteps" << timeSteps;
2024-04-12 14:14:40 +02:00
for (int i = 0 ; i < timeSteps.size(); ++i) {
QDateTime end = start.addSecs(timeSteps.at(i)*60);
double price = Calculator::GetInstance().GetCostFromDuration(
&cfg,
start,
timeSteps.at(i));
qDebug() << "GetCostFromDuration() time: " << timeSteps.at(i)
<< "(" << timeSteps.at(i)/60 << "h)"
<< "price=" << price;
}
2024-01-24 16:36:29 +01:00
}
#endif
2024-02-15 16:12:10 +01:00
#if NEUHAUSER_KIRCHDORF==1
2024-02-26 16:57:37 +01:00
//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<int> const stepsConfigured
= QList(std::initializer_list<int>{
30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80, 85, 90});
QList<int> 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<int>::const_iterator step;
for (step = steps.cbegin(); step != steps.cend(); ++step) {
qCritical() << QString("*** NEXT STEP: %1 ***").arg(*step);
//for (int offset = 691; offset < 692; ++offset) {
for (int offset = 480; offset < 1080; ++offset) {
2024-02-27 12:23:52 +01:00
//for (int offset = 7*60; offset < (18*60)-90; ++offset) {
//for (int offset = (18*60)-90; offset < 18*60; ++offset) {
//for (int offset = 1046; offset < 1047; ++offset) {
QDateTime start = s.addSecs(offset * 60);
QDateTime const firstStart = start;
2024-02-27 17:30:15 +01:00
//if (*step != 30) continue;
double cost = 0;
2024-02-27 12:23:52 +01:00
if (compute_price_for_parking_ticket(&cfg, start, *step, end, &price)) {
cost = price.netto;
2024-02-26 16:57:37 +01:00
qCritical() << "****" << offset << *step << "****";
qCritical() << " firstStart :" << firstStart.toString(Qt::ISODate);
qCritical() << " start :" << start.toString(Qt::ISODate);
qCritical() << " end :" << end.toString(Qt::ISODate);
qCritical() << " cost :" << cost;
if (offset < 8*60) { // [7:00 - 8:00[
2024-02-27 12:23:52 +01:00
double new_cost = cost;
if (offset > (18*60)-(*step)) {
new_cost += ((*step-30)/5)*10;
qCritical() << __LINE__ << "new_cost" << new_cost << "(cost" << cost << ")";
}
if (!test_neuhauser_kirchdorf(*step, new_cost)) {
qCritical() << "ERROR AT OFFSET" << offset;
2024-02-27 12:23:52 +01:00
//return -1;
}
} else
if (offset < 9*60) { // [8:00 - 9:00[
2024-02-27 12:23:52 +01:00
double new_cost = cost;
if (offset > (18*60)-(*step)) {
new_cost += ((*step-30)/5)*10;
qCritical() << __LINE__ << "new_cost" << new_cost << "(cost" << cost << ")";
}
if (!test_neuhauser_kirchdorf(*step, new_cost)) {
qCritical() << "ERROR AT OFFSET" << offset;
2024-02-27 12:23:52 +01:00
//return -1;
}
} else
if (offset < 10*60) {
2024-02-27 12:23:52 +01:00
double new_cost = cost;
if (offset > (18*60)-(*step)) {
new_cost += ((*step-30)/5)*10;
qCritical() << __LINE__ << "new_cost" << new_cost << "(cost" << cost << ")";
}
if (!test_neuhauser_kirchdorf(*step, new_cost)) {
qCritical() << "ERROR AT OFFSET" << offset;
2024-02-27 12:23:52 +01:00
//return -1;
}
} else
if (offset < 11*60) {
2024-02-27 12:23:52 +01:00
double new_cost = cost;
if (offset > (18*60)-(*step)) {
new_cost += ((*step-30)/5)*10;
qCritical() << __LINE__ << "new_cost" << new_cost << "(cost" << cost << ")";
}
if (!test_neuhauser_kirchdorf(*step, new_cost)) {
qCritical() << "ERROR AT OFFSET" << offset;
2024-02-27 12:23:52 +01:00
//return -1;
}
} else
if (offset < 12*60) {
2024-02-27 12:23:52 +01:00
double new_cost = cost;
if (offset > (18*60)-(*step)) {
new_cost += ((*step-30)/5)*10;
qCritical() << __LINE__ << "new_cost" << new_cost << "(cost" << cost << ")";
}
if (!test_neuhauser_kirchdorf(*step, new_cost)) {
qCritical() << "ERROR AT OFFSET" << offset;
2024-02-27 12:23:52 +01:00
//return -1;
}
} else
if (offset < 13*60) {
2024-02-27 12:23:52 +01:00
double new_cost = cost;
if (offset > (18*60)-(*step)) {
new_cost += ((*step-30)/5)*10;
qCritical() << __LINE__ << "new_cost" << new_cost << "(cost" << cost << ")";
}
if (!test_neuhauser_kirchdorf(*step, new_cost)) {
qCritical() << "ERROR AT OFFSET" << offset;
2024-02-27 12:23:52 +01:00
//return -1;
}
} else
if (offset < 14*60) {
2024-02-27 12:23:52 +01:00
double new_cost = cost;
if (offset > (18*60)-(*step)) {
new_cost += ((*step-30)/5)*10;
qCritical() << __LINE__ << "new_cost" << new_cost << "(cost" << cost << ")";
}
if (!test_neuhauser_kirchdorf(*step, new_cost)) {
qCritical() << "ERROR AT OFFSET" << offset;
2024-02-27 12:23:52 +01:00
//return -1;
}
} else
if (offset < 15*60) {
2024-02-27 12:23:52 +01:00
double new_cost = cost;
if (offset > (18*60)-(*step)) {
new_cost += ((*step-30)/5)*10;
qCritical() << __LINE__ << "new_cost" << new_cost << "(cost" << cost << ")";
}
if (!test_neuhauser_kirchdorf(*step, new_cost)) {
qCritical() << "ERROR AT OFFSET" << offset;
2024-02-27 12:23:52 +01:00
//return -1;
}
} else
if (offset < 16*60) {
2024-02-27 12:23:52 +01:00
double new_cost = cost;
if (offset > (18*60)-(*step)) {
new_cost += ((*step-30)/5)*10;
qCritical() << __LINE__ << "new_cost" << new_cost << "(cost" << cost << ")";
}
if (!test_neuhauser_kirchdorf(*step, new_cost)) {
qCritical() << "ERROR AT OFFSET" << offset;
2024-02-27 12:23:52 +01:00
//return -1;
}
} else
if (offset < 17*60) {
2024-02-27 12:23:52 +01:00
double new_cost = cost;
if (offset > (18*60)-(*step)) {
double const f = ((*step-30)/5)*10;
new_cost += f;
new_cost = std::min(new_cost, f+30);
qCritical() << __LINE__ << "new_cost" << new_cost << "(cost" << cost << ")";
}
if (!test_neuhauser_kirchdorf(*step, new_cost)) {
qCritical() << "ERROR AT OFFSET" << offset;
//return -1;
}
} else
if (offset < 18*60) {
double new_cost = cost;
if (offset > (18*60)-(*step)) {
double const f = ((*step-30)/5)*10;
new_cost += f;
new_cost = std::min(new_cost, f+30);
qCritical() << __LINE__ << "new_cost" << new_cost << "(cost" << cost << ")";
}
if (!test_neuhauser_kirchdorf(*step, new_cost)) {
qCritical() << "ERROR AT OFFSET" << offset;
2024-02-27 12:23:52 +01:00
// return -1;
}
} else {
2024-02-27 12:23:52 +01:00
qCritical() << "ERROR OFFSET TOO HIGH" << offset;
return -1;
}
} else {
qCritical() << "ERROR COMPUTING PRICE FOR"
<< "start" << start.toString(Qt::ISODate)
<< "step" << *step
<< "end" << end.toString(Qt::ISODate);
return -1;
}
2024-02-27 17:30:15 +01:00
QDateTime end2 = QDateTime();
if (compute_duration_for_parking_ticket(&cfg, start, cost, end2)) { // return value
qCritical() << "start" << start.toString(Qt::ISODate)
<< "offset" << offset
<< "cost" << cost
2024-02-27 17:30:15 +01:00
<< "end" << end2.toString(Qt::ISODate);
if (end != end2) {
qCritical() << end.toString(Qt::ISODate)
2024-02-27 17:30:15 +01:00
<< end2.toString(Qt::ISODate);
}
}
}
}
}
return 0;
}
#if 0
2024-02-15 16:12:10 +01:00
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() << "Parsed" << f;
int minParkingTime = get_minimal_parkingtime(&cfg);
int maxParkingTime = get_maximal_parkingtime(&cfg);
int minParkingPrice = get_minimal_parkingprice(&cfg);
qCritical() << "min_parking_time " << minParkingTime;
qCritical() << "max_parking_time " << maxParkingTime;
qCritical() << "min_parking_price" << minParkingPrice;
bool nextDay = false;
bool prePaid = true;
// bool carryOver = false;
//QDateTime s = QDateTime::currentDateTime();
2024-02-21 11:08:49 +01:00
QDateTime s(QDate(2024, 2, 21), QTime());
2024-02-15 16:12:10 +01:00
QDateTime end;
2024-02-19 12:01:36 +01:00
for (int duration = 30; duration <= 90; duration += 5) {
2024-02-15 16:12:10 +01:00
// for (int duration = 30; duration <= maxParkingTime; duration += 5) {
qCritical() << "";
2024-02-19 12:01:36 +01:00
for (int offset = 420; offset <= 1080; ++offset) {
//for (int offset = 0; offset <= 0; ++offset) {
2024-02-15 16:12:10 +01:00
//for (int offset = 420; offset <= 1080; ++offset) {
//if (offset > 720 && offset < 840) {
// continue;
//}
QDateTime start = s.addSecs(offset * 60);
QDateTime const firstStart = start;
// qCritical() << "start" << start.toString(Qt::ISODate);
// 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;
2024-02-15 16:12:10 +01:00
2024-02-19 12:01:36 +01:00
//#if COST_FROM_DURATION==0
2024-02-15 16:12:10 +01:00
double cost_soll = 30 + ((duration-30)/5 * 10);
uint32_t duration_ist = start.secsTo(end) / 60;
if (duration_ist >= 120) {
duration_ist = duration_ist - 120;
}
qCritical() << "****" << offset << duration << "****";
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;
2024-02-15 16:12:10 +01:00
2024-02-21 11:08:49 +01:00
// if (cost_soll != cost) {
2024-02-19 12:01:36 +01:00
//qCritical() << "ERROR" << __func__ << ":" << __LINE__
// << "cost_soll" << cost_soll << "cost_ist" << cost;
//break;
2024-02-21 11:08:49 +01:00
// }
// if (duration != duration_ist) {
2024-02-15 16:12:10 +01:00
//qCritical() << "ERROR" << __func__ << ":" << __LINE__
// << "duration_soll" << duration << "duration_ist" << duration_ist;
//break;
2024-02-21 11:08:49 +01:00
// }
2024-02-15 16:12:10 +01:00
2024-02-19 12:01:36 +01:00
//#else
//start = s.addSecs(offset * 60);
//std::string duration = Calculator::GetInstance().GetDurationFromCost(&cfg, 1,
// start.toString(Qt::ISODate).toStdString().c_str(),
// cost, false, true);
2024-02-19 12:01:36 +01:00
//if (end.toString(Qt::ISODate) != QString(duration.c_str())) {
2024-02-19 12:01:36 +01:00
//qCritical() << "ERROR" << end.toString(Qt::ISODate)
// << QString(duration.c_str());
//break;
//}
2024-02-19 12:01:36 +01:00
//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()));
2024-02-15 16:12:10 +01:00
2024-02-19 12:01:36 +01:00
//#endif // COST_FROM_DURATION
2024-02-15 16:12:10 +01:00
}
}
#endif // 0
#endif
2024-01-18 14:34:57 +01:00
#if NEUHAUSER_BILEXA_GALTUER==1
std::ifstream input("/opt/ptu5/opt/customer_745/etc/psa_tariff/tariff01.json");
std::stringstream sstr;
while(input >> sstr.rdbuf());
std::string json(sstr.str());
Configuration cfg;
bool isParsed = cfg.ParseJson(&cfg, json.c_str());
cout << endl;
if (isParsed) {
2024-01-23 10:50:42 +01:00
int minParkingTime = get_minimal_parkingtime(&cfg);
QList<int> timeSteps = Calculator::GetInstance().GetTimeSteps(&cfg);
2024-01-18 14:34:57 +01:00
qCritical() << timeSteps;
2024-01-23 10:50:42 +01:00
int Down = 0;
int Up = 1;
//compute_next_timestep(&cfg, )
2024-01-18 14:34:57 +01:00
2024-03-07 08:18:40 +01:00
QDateTime const start = QDateTime::currentDateTime();
2024-01-18 14:34:57 +01:00
for (int i=0; i<timeSteps.size(); ++i) {
2024-01-23 10:50:42 +01:00
int nextTimeStep = compute_next_timestep(&cfg, timeSteps.at(i), Up);
qCritical() << "nextTimeStep" << nextTimeStep;
2024-03-07 08:18:40 +01:00
uint32_t price = Calculator::GetInstance().GetPriceForTimeStep(&cfg, timeSteps.at(i));
uint32_t duration = Calculator::GetInstance().GetDurationForPrice(&cfg, price);
qCritical() << "nextTimeStep relative to start:"
<< duration << start.addSecs(duration * 60).toString(Qt::ISODate)
<< "(price so far:" << price << ")";
2024-01-18 14:34:57 +01:00
}
}
#endif
2023-12-15 13:28:58 +01:00
#if NEUHAUSER_NORDISCHES_AUSBILDUNGSZENTRUM==1
2024-01-30 10:53:43 +01:00
std::ifstream input("/opt/ptu5/opt/customer_744/etc/psa_tariff/tariff01.json");
2023-12-15 13:28:58 +01:00
std::stringstream sstr;
while(input >> sstr.rdbuf());
std::string json(sstr.str());
Configuration cfg;
bool isParsed = cfg.ParseJson(&cfg, json.c_str());
cout << endl;
if (isParsed) {
2024-02-22 16:25:30 +01:00
int v = compute_product_price(&cfg, PERMIT_TYPE::DAY_TICKET_ADULT);
qCritical() << "price adult" << v;
int w = compute_product_price(&cfg, PERMIT_TYPE::DAY_TICKET_TEEN);
qCritical() << "price teen" << w;
2024-01-31 11:37:11 +01:00
QDateTime s(QDate(2023, 11, 30), QTime());
QDateTime end;
struct price_t price;
#define ADULT 1
//#define TEEN 1
2024-02-01 13:28:08 +01:00
for (int offset = 480; offset < 1200; ++offset) {
2024-01-31 11:37:11 +01:00
QDateTime start = s.addSecs(offset * 60);
CalcState cs = compute_price_for_daily_ticket(&cfg, start, end,
#if ADULT==1
PERMIT_TYPE::DAY_TICKET_ADULT,
#elif TEEN==1
PERMIT_TYPE::DAY_TICKET_TEEN,
#endif
&price);
2024-01-31 11:37:11 +01:00
qCritical() << "start=" << start.toString(Qt::ISODate)
<< "end" << end.toString(Qt::ISODate) << "price" << price.netto;
}
2023-12-15 13:28:58 +01:00
}
#undef ADULT
#undef TEEN
2023-12-15 13:28:58 +01:00
#endif
2023-12-12 10:59:49 +01:00
#if NEUHAUSER_LINSINGER_MASCHINENBAU==1
2024-01-31 15:08:16 +01:00
std::ifstream input("/opt/ptu5/opt/customer_741/etc/psa_tariff/tariff01.json");
2023-12-12 10:59:49 +01:00
std::stringstream sstr;
while(input >> sstr.rdbuf());
std::string json(sstr.str());
Configuration cfg;
bool isParsed = cfg.ParseJson(&cfg, json.c_str());
cout << endl;
if (isParsed) {
int const price = compute_product_price(&cfg, PERMIT_TYPE::FOOD_STAMP);
qCritical() << "price food stamp" << price;
2023-12-12 10:59:49 +01:00
}
#endif
2023-12-06 10:52:35 +01:00
#if NEUHAUSER_KORNEUBURG==1
2024-03-07 08:18:40 +01:00
std::ifstream input("/opt/ptu5/opt/customer_714/etc/psa_tariff/tariff01.json");
2023-12-05 17:30:12 +01:00
int pop_max_time;
2023-12-06 10:52:35 +01:00
std::stringstream sstr;
while(input >> sstr.rdbuf());
std::string json(sstr.str());
Configuration cfg;
bool isParsed = cfg.ParseJson(&cfg, json.c_str());
cout << endl;
if (isParsed) {
{
pop_max_time = 3*60;
bool nextDay = false;
bool prePaid = true;
// zone 1 (lila)
QDateTime s(QDate(2023, 11, 30), QTime());
QDateTime end;
for (int duration = 30; duration <= pop_max_time; duration += 5) {
for (int offset = 420; offset < 1140; ++offset) {
if (offset > 720 && offset < 840) {
continue;
}
QDateTime start = s.addSecs(offset * 60);
//qCritical() << "start" << start.toString(Qt::ISODate);
2024-03-07 08:18:40 +01:00
double cost = Calculator::GetInstance().GetCostFromDuration(&cfg, 3, start, end, duration, nextDay, prePaid);
2023-12-06 10:52:35 +01:00
//Q_ASSERT(cost == duration*2.5);
//qCritical() << "";
2024-03-07 08:18:40 +01:00
qCritical() << "start" << start.toString(Qt::ISODate)
<< "end" << end.toString(Qt::ISODate)
<< "duration" << duration
<< "cost" << cost;
2023-12-06 10:52:35 +01:00
2024-03-07 08:18:40 +01:00
//std::string duration = Calculator::GetInstance().GetDurationFromCost(&cfg, 3, start.toString(Qt::ISODate).toStdString().c_str(), cost);
2023-12-06 10:52:35 +01:00
//Q_ASSERT(cost == duration*2.5);
2024-03-07 08:18:40 +01:00
//qCritical() << "start" << start.toString(Qt::ISODate)
// << "cost" << cost
// << "until" << duration.c_str() << start.secsTo(QDateTime::fromString(duration.c_str(), Qt::ISODate)) / 60;
2023-12-06 10:52:35 +01:00
}
}
}
}
return 0;
2024-02-26 16:57:37 +01:00
#endif
#if SZEGED==1
2023-12-05 17:30:12 +01:00
std::ifstream input;
2024-01-30 14:00:55 +01:00
int pop_min_time;
2023-12-06 10:52:35 +01:00
int pop_max_time;
2024-01-30 14:00:55 +01:00
int pop_min_price;
int pop_max_price;
2024-02-22 16:25:30 +01:00
int pop_daily_card_price;
2023-12-06 10:52:35 +01:00
2024-04-08 13:53:29 +02:00
for (int zone=1; zone < 2; ++zone) {
2024-01-30 14:00:55 +01:00
//for (int t=6; t < 7; t+=20) {
2024-02-22 16:25:30 +01:00
switch (zone) {
2023-12-05 17:30:12 +01:00
case 1: {
2024-02-26 16:57:37 +01:00
input.open("/opt/ptu5/opt/customer_281/etc/psa_tariff/tariff01.json");
2024-01-30 14:00:55 +01:00
//pop_max_time = 6*60;
2023-12-05 17:30:12 +01:00
} break;
case 2: {
2024-02-26 16:57:37 +01:00
input.open("/opt/ptu5/opt/customer_281/etc/psa_tariff/tariff02.json");
2024-01-30 14:00:55 +01:00
//pop_max_time = 5*60;
2023-12-05 17:30:12 +01:00
} break;
case 3: {
2024-02-26 16:57:37 +01:00
input.open("/opt/ptu5/opt/customer_281/etc/psa_tariff/tariff03.json");
2024-01-30 14:00:55 +01:00
//pop_max_time = 6*60;
2023-12-05 17:30:12 +01:00
} break;
case 4: {
2024-02-26 16:57:37 +01:00
input.open("/opt/ptu5/opt/customer_281/etc/psa_tariff/tariff04.json");
2024-01-30 14:00:55 +01:00
//pop_max_time = 4*60;
2023-12-05 17:30:12 +01:00
} break;
case 5: {
2024-02-26 16:57:37 +01:00
input.open("/opt/ptu5/opt/customer_281/etc/psa_tariff/tariff05.json");
2024-01-30 14:00:55 +01:00
//pop_max_time = 6*60;
2023-12-05 17:30:12 +01:00
} break;
case 6: {
2024-02-26 16:57:37 +01:00
input.open("/opt/ptu5/opt/customer_281/etc/psa_tariff/tariff06.json");
2024-01-30 14:00:55 +01:00
//pop_max_time = 4*60;
2023-12-05 17:30:12 +01:00
} break;
default:
continue;
}
2023-12-05 17:30:12 +01:00
std::stringstream sstr;
while(input >> sstr.rdbuf());
std::string json(sstr.str());
Configuration cfg;
bool isParsed = cfg.ParseJson(&cfg, json.c_str());
cout << endl;
if (isParsed) {
2024-01-30 14:00:55 +01:00
// test library functions
pop_min_time = get_minimal_parkingtime(&cfg);
pop_max_time = get_maximal_parkingtime(&cfg);
pop_min_price = get_minimal_parkingprice(&cfg);
pop_max_price = get_maximal_parkingprice(&cfg);
2024-02-22 16:25:30 +01:00
pop_daily_card_price = cfg.getPaymentOptions().pop_daily_card_price;
2024-01-30 14:00:55 +01:00
2024-02-01 13:28:08 +01:00
qCritical() << " pop_min_time: " << pop_min_time;
qCritical() << " pop_max_time: " << pop_max_time;
qCritical() << " pop_min_price: " << pop_min_price;
qCritical() << " pop_max_price: " << pop_max_price;
2024-02-22 16:25:30 +01:00
qCritical() << "pop_daily_card_price: " << pop_daily_card_price;
if (pop_min_time > pop_max_time) {
qCritical() << "ERROR pop_min_time > pop_max_time"
<< pop_min_time << pop_max_time;
return -1;
}
if (pop_min_price > pop_max_price) {
qCritical() << "ERROR pop_min_price > pop_max_price"
<< pop_min_price << pop_max_price;
return -1;
}
if (pop_daily_card_price < pop_max_price) {
qCritical() << "ERROR pop_daily_card_price < pop_max_price"
<< pop_daily_card_price << pop_max_price;
return -1;
}
QMap<int, int> m;
2024-01-30 14:00:55 +01:00
2023-12-05 17:30:12 +01:00
{
// zone 1 (lila)
2024-04-08 13:53:29 +02:00
QDateTime s(QDate(2024, 3, 26), QTime());
2023-12-05 17:30:12 +01:00
QDateTime end;
2024-02-01 13:28:08 +01:00
int cnt = 1;
2024-02-22 16:25:30 +01:00
if (zone == 1) {
m.insert(5, pop_min_price);
2024-02-23 13:54:31 +01:00
m.insert(10, pop_min_price); // 42
2024-02-22 16:25:30 +01:00
m.insert(pop_min_time, pop_min_price);
m.insert(20, 55);
m.insert(25, 69);
m.insert(30, 83);
m.insert(35, 97);
m.insert(40, 110);
m.insert(45, 124);
m.insert(50, 138);
m.insert(55, 152);
m.insert(60, 165);
m.insert(65, 179);
m.insert(70, 193);
m.insert(75, 207);
m.insert(80, 220);
m.insert(85, 234);
m.insert(90, 248);
m.insert(95, 262);
m.insert(100, 275);
m.insert(105, 289);
m.insert(110, 303);
m.insert(115, 317);
m.insert(120, 330);
m.insert(125, 344);
m.insert(130, 358);
m.insert(135, 372);
m.insert(140, 385);
m.insert(145, 399);
m.insert(150, 413);
m.insert(155, 427);
m.insert(160, 440);
m.insert(165, 454);
m.insert(170, 468);
m.insert(175, 482);
m.insert(180, 495);
m.insert(185, 509);
m.insert(190, 523);
m.insert(195, 537);
m.insert(200, 550);
m.insert(205, 564);
m.insert(210, 578);
m.insert(215, 592);
m.insert(220, 605);
m.insert(225, 619);
m.insert(230, 633);
m.insert(235, 647);
m.insert(240, 660);
m.insert(245, 674);
m.insert(250, 688);
m.insert(255, 702);
m.insert(260, 715);
m.insert(265, 729);
m.insert(270, 743);
m.insert(275, 757);
m.insert(280, 770);
m.insert(285, 784);
m.insert(290, 798);
m.insert(295, 812);
m.insert(300, 825);
m.insert(305, 839);
m.insert(310, 853);
m.insert(315, 867);
m.insert(320, 880);
m.insert(325, 894);
m.insert(330, 908);
m.insert(335, 922);
m.insert(340, 935);
m.insert(345, 949);
m.insert(350, 963);
m.insert(355, 977);
2024-02-23 13:54:31 +01:00
m.insert(360, pop_max_price); // 990
2024-02-22 16:25:30 +01:00
m.insert(365, pop_max_price);
m.insert(370, pop_max_price);
m.insert(375, pop_max_price);
m.insert(380, pop_max_price);
m.insert(385, pop_max_price);
m.insert(390, pop_max_price);
m.insert(395, pop_max_price);
m.insert(400, pop_max_price);
m.insert(405, pop_max_price);
m.insert(410, pop_max_price);
m.insert(415, pop_max_price);
m.insert(420, pop_max_price);
} else
if (zone == 2) {
2024-02-23 13:54:31 +01:00
m.insert(5, pop_min_price);
m.insert(10, pop_min_price); // 65
m.insert(pop_min_time, pop_min_price);
m.insert(20, 87);
m.insert(25, 109);
m.insert(30, 130);
m.insert(35, 152);
m.insert(40, 174);
m.insert(45, 195);
m.insert(50, 217);
m.insert(55, 239);
m.insert(60, 260);
m.insert(65, 282);
m.insert(70, 304);
m.insert(75, 325);
m.insert(80, 347);
m.insert(85, 369);
m.insert(90, 390);
m.insert(95, 412);
m.insert(100, 434);
m.insert(105, 455);
m.insert(110, 477);
m.insert(115, 499);
m.insert(120, 520);
m.insert(125, 524);
m.insert(130, 564);
m.insert(135, 585);
m.insert(140, 607);
m.insert(145, 629);
m.insert(150, 650);
m.insert(155, 672);
m.insert(160, 694);
m.insert(165, 715);
m.insert(170, 737);
m.insert(175, 759);
m.insert(180, 780);
m.insert(185, 802);
m.insert(190, 824);
m.insert(195, 845);
m.insert(200, 867);
m.insert(205, 889);
m.insert(210, 910);
m.insert(215, 932);
m.insert(220, 954);
m.insert(225, 975);
m.insert(230, 997);
m.insert(235, 1019);
m.insert(240, 1040);
m.insert(245, 1062);
m.insert(250, 1084);
m.insert(255, 1105);
m.insert(260, 1127);
m.insert(265, 1149);
m.insert(270, 1170);
m.insert(275, 1192);
m.insert(280, 1214);
m.insert(285, 1235);
m.insert(290, 1257);
m.insert(295, 1279);
m.insert(300, 1300);
m.insert(305, 1322);
m.insert(310, 1344);
m.insert(315, 1365);
m.insert(320, 1387);
m.insert(325, 1409);
m.insert(330, 1430);
m.insert(335, 1452);
m.insert(340, 1474);
m.insert(345, 1495);
m.insert(350, 1517);
m.insert(355, 1539);
m.insert(360, pop_max_price); // 1560
2024-02-22 16:25:30 +01:00
2024-02-23 13:54:31 +01:00
m.insert(365, pop_max_price);
m.insert(370, pop_max_price);
m.insert(375, pop_max_price);
m.insert(380, pop_max_price);
m.insert(385, pop_max_price);
m.insert(390, pop_max_price);
m.insert(395, pop_max_price);
m.insert(400, pop_max_price);
m.insert(405, pop_max_price);
m.insert(410, pop_max_price);
m.insert(415, pop_max_price);
m.insert(420, pop_max_price);
} else
if (zone == 3) {
m.insert(5, pop_min_price);
m.insert(10, pop_min_price); // 90
m.insert(pop_min_time, pop_min_price);
m.insert(20, 120);
m.insert(25, 150);
m.insert(30, 180);
m.insert(35, 210);
m.insert(40, 240);
m.insert(45, 270);
m.insert(50, 300);
m.insert(55, 330);
m.insert(60, 360);
m.insert(65, 390);
m.insert(70, 420);
m.insert(75, 450);
m.insert(80, 480);
2024-02-24 11:07:04 +01:00
m.insert(85, 510);
m.insert(90, 540);
m.insert(95, 570);
m.insert(100, 600);
m.insert(105, 630);
m.insert(110, 660);
m.insert(115, 690);
m.insert(120, 720);
m.insert(125, 750);
m.insert(130, 780);
m.insert(135, 810);
m.insert(140, 840);
m.insert(145, 870);
m.insert(150, 900);
m.insert(155, 930);
m.insert(160, 960);
m.insert(165, 990);
m.insert(170, 1020);
m.insert(175, 1050);
m.insert(180, 1080);
m.insert(185, 1110);
m.insert(190, 1140);
m.insert(195, 1170);
m.insert(200, 1200);
m.insert(205, 1230);
m.insert(210, 1260);
m.insert(215, 1290);
m.insert(220, 1320);
m.insert(225, 1350);
m.insert(230, 1380);
m.insert(235, 1410);
m.insert(240, 1440);
m.insert(245, 1470);
m.insert(250, 1500);
m.insert(255, 1530);
m.insert(260, 1560);
m.insert(265, 1590);
m.insert(270, 1620);
m.insert(275, 1650);
m.insert(280, 1680);
m.insert(285, 1710);
m.insert(290, 1740);
m.insert(295, 1770);
m.insert(300, 1800);
m.insert(305, 1830);
m.insert(310, 1860);
m.insert(315, 1890);
m.insert(320, 1920);
m.insert(325, 1950);
m.insert(330, 1980);
m.insert(335, 2010);
m.insert(340, 2040);
m.insert(345, 2070);
m.insert(350, 2100);
m.insert(355, 2130);
m.insert(360, pop_max_price); // 2160
m.insert(365, pop_max_price);
m.insert(370, pop_max_price);
m.insert(375, pop_max_price);
m.insert(380, pop_max_price);
m.insert(385, pop_max_price);
m.insert(390, pop_max_price);
m.insert(395, pop_max_price);
m.insert(400, pop_max_price);
m.insert(405, pop_max_price);
m.insert(410, pop_max_price);
m.insert(415, pop_max_price);
m.insert(420, pop_max_price);
} else
if (zone == 4) {
2024-02-24 11:07:04 +01:00
m.insert(5, pop_min_price);
m.insert(10, pop_min_price); // 163
2024-02-24 11:07:04 +01:00
m.insert(pop_min_time, pop_min_price);
m.insert(20, 217);
m.insert(25, 271);
m.insert(30, 325);
m.insert(35, 380);
m.insert(40, 434);
m.insert(45, 488);
m.insert(50, 542);
m.insert(55, 596);
m.insert(60, 650);
m.insert(65, 705);
m.insert(70, 759);
m.insert(75, 813);
m.insert(80, 867);
m.insert(85, 921);
m.insert(90, 975);
m.insert(95, 1030);
m.insert(100, 1084);
m.insert(105, 1138);
m.insert(110, 1192);
m.insert(115, 1246);
m.insert(120, 1300);
m.insert(125, 1355);
m.insert(130, 1409);
m.insert(135, 1463);
m.insert(140, 1517);
m.insert(145, 1571);
m.insert(150, 1625);
m.insert(155, 1680);
m.insert(160, 1734);
m.insert(165, 1788);
m.insert(170, 1842);
m.insert(175, 1896);
m.insert(180, 1950);
m.insert(185, 2005);
m.insert(190, 2059);
m.insert(195, 2113);
m.insert(200, 2167);
m.insert(205, 2221);
m.insert(210, 2275);
m.insert(215, 2330);
m.insert(220, 2384);
m.insert(225, 2438);
m.insert(230, 2492);
m.insert(235, 2546);
m.insert(240, pop_max_price); // 2600
m.insert(245, pop_max_price);
m.insert(250, pop_max_price);
m.insert(255, pop_max_price);
m.insert(260, pop_max_price);
m.insert(270, pop_max_price);
m.insert(280, pop_max_price);
m.insert(290, pop_max_price);
m.insert(300, pop_max_price);
} else
if (zone == 5) {
2024-02-24 11:07:04 +01:00
m.insert(5, pop_min_price);
m.insert(10, pop_min_price); // 90
2024-02-24 11:07:04 +01:00
m.insert(pop_min_time, pop_min_price);
m.insert(20, 120);
m.insert(25, 150);
m.insert(30, 180);
m.insert(35, 210);
m.insert(40, 240);
m.insert(45, 270);
m.insert(50, 300);
m.insert(55, 330);
m.insert(60, 360);
m.insert(65, 390);
m.insert(70, 420);
m.insert(75, 450);
m.insert(80, 480);
m.insert(85, 510);
m.insert(90, 540);
m.insert(95, 570);
m.insert(100, 600);
m.insert(105, 630);
m.insert(110, 660);
m.insert(115, 690);
m.insert(120, 720);
m.insert(125, 750);
m.insert(130, 780);
m.insert(135, 810);
m.insert(140, 840);
m.insert(145, 870);
m.insert(150, 900);
m.insert(155, 930);
m.insert(160, 960);
m.insert(165, 990);
m.insert(170, 1020);
m.insert(175, 1050);
m.insert(180, 1080);
m.insert(185, 1110);
m.insert(190, 1140);
m.insert(195, 1170);
m.insert(200, 1200);
m.insert(205, 1230);
m.insert(210, 1260);
m.insert(215, 1290);
m.insert(220, 1320);
m.insert(225, 1350);
m.insert(230, 1380);
m.insert(235, 1410);
m.insert(240, 1440);
m.insert(245, 1470);
m.insert(250, 1500);
m.insert(255, 1530);
m.insert(260, 1560);
m.insert(265, 1590);
m.insert(270, 1620);
m.insert(275, 1650);
m.insert(280, 1680);
m.insert(285, 1710);
m.insert(290, 1740);
m.insert(295, 1770);
m.insert(300, 1800);
m.insert(305, 1830);
m.insert(310, 1860);
m.insert(315, 1890);
m.insert(320, 1920);
m.insert(325, 1950);
m.insert(330, 1980);
m.insert(335, 2010);
m.insert(340, 2040);
m.insert(345, 2070);
m.insert(350, 2100);
m.insert(355, 2130);
m.insert(360, pop_max_price); // 2160
m.insert(365, pop_max_price);
m.insert(370, pop_max_price);
m.insert(375, pop_max_price);
m.insert(380, pop_max_price);
m.insert(385, pop_max_price);
m.insert(390, pop_max_price);
m.insert(395, pop_max_price);
m.insert(400, pop_max_price);
m.insert(405, pop_max_price);
m.insert(410, pop_max_price);
m.insert(415, pop_max_price);
m.insert(420, pop_max_price);
} else
if (zone == 6) {
2024-02-24 11:07:04 +01:00
m.insert(5, pop_min_price);
m.insert(10, pop_min_price); // 163
2024-02-24 11:07:04 +01:00
m.insert(pop_min_time, pop_min_price);
m.insert(20, 217);
m.insert(25, 271);
m.insert(30, 325);
m.insert(35, 380);
m.insert(40, 434);
m.insert(45, 488);
m.insert(50, 542);
m.insert(55, 596);
m.insert(60, 650);
m.insert(65, 705);
m.insert(70, 759);
m.insert(75, 813);
m.insert(80, 867);
m.insert(85, 921);
m.insert(90, 975);
m.insert(95, 1030);
m.insert(100, 1084);
m.insert(105, 1138);
m.insert(110, 1192);
m.insert(115, 1246);
m.insert(120, 1300);
m.insert(125, 1355);
m.insert(130, 1409);
m.insert(135, 1463);
m.insert(140, 1517);
m.insert(145, 1571);
m.insert(150, 1625);
m.insert(155, 1680);
m.insert(160, 1734);
m.insert(165, 1788);
m.insert(170, 1842);
m.insert(175, 1896);
m.insert(180, 1950);
m.insert(185, 2005);
m.insert(190, 2059);
m.insert(195, 2113);
m.insert(200, 2167);
m.insert(205, 2221);
m.insert(210, 2275);
m.insert(215, 2330);
m.insert(220, 2384);
m.insert(225, 2438);
m.insert(230, 2492);
m.insert(235, 2546);
m.insert(240, pop_max_price); // 2600
m.insert(245, pop_max_price);
m.insert(250, pop_max_price);
m.insert(255, pop_max_price);
m.insert(260, pop_max_price);
m.insert(270, pop_max_price);
m.insert(280, pop_max_price);
m.insert(290, pop_max_price);
m.insert(300, pop_max_price);
2024-02-22 16:25:30 +01:00
}
struct price_t price;
for (int duration = pop_min_time; duration <= pop_max_time; duration += 5) {
2023-12-05 17:30:12 +01:00
for (int offset = 480; offset < 1080; ++offset) {
QDateTime start = s.addSecs(offset * 60);
2024-02-22 16:25:30 +01:00
end = QDateTime();
price.netto = 0;
if (compute_price_for_parking_ticket(&cfg, start, duration, end, &price)) {
double cost = price.netto;
2024-02-22 16:25:30 +01:00
2024-02-24 11:07:04 +01:00
//qCritical() << start.toString(Qt::ISODate) << end.toString(Qt::ISODate)
// << duration << cost;
2024-02-22 16:25:30 +01:00
2024-02-26 16:57:37 +01:00
if (cost != m[duration]) {
qCritical() << "ERROR computing_price_for_parking_ticket"
<< "duration" << duration
<< "HAVE cost" << cost
<< "SHOULD HAVE cost" << m[duration];
return -1;
}
2024-02-22 16:25:30 +01:00
} else {
qCritical() << "ERROR computing_price_for_parking_ticket AT"
<< cnt << "duration" << duration
<< "start" << start.toString(Qt::ISODate);
return -1;
}
start = s.addSecs(offset * 60);
end = QDateTime();
price.netto = 0;
2024-02-26 16:57:37 +01:00
if (compute_price_for_daily_ticket(&cfg, start, end, PERMIT_TYPE::DAY_TICKET, &price)) {
if (price.netto != pop_daily_card_price) {
qCritical() << "ERROR computing_price_for_daily_ticket"
<< "duration" << duration
<< "HAVE cost" << price.netto
<< "SHOULD HAVE cost" << pop_daily_card_price;
2024-02-22 16:25:30 +01:00
return -1;
}
2024-02-26 16:57:37 +01:00
} else {
qCritical() << "ERROR computing_price_for_daily_ticket AT"
<< "start" << start.toString(Qt::ISODate);
return -1;
2024-02-22 16:25:30 +01:00
}
2024-02-26 16:57:37 +01:00
// start = s.addSecs(offset * 60);
// end = QDateTime();
//if (compute_duration_for_daily_ticket(&cfg, start, end)) {
//
// } else {
// qCritical() << "ERROR computing_duration_for_daily_ticket AT"
// << "start" << start.toString(Qt::ISODate);
// return -1;
// }
2024-02-01 13:28:08 +01:00
++cnt;
2023-12-05 17:30:12 +01:00
}
}
}
}
}
return 0;
2023-12-05 17:30:12 +01:00
2023-12-06 10:52:35 +01:00
#endif
#if 0
//std::string json = "{\"Currency\":[{\"pcu_id\":2,\"pcu_sign\":\"Ft\",\"pcu_major\":\"HUF\",\"pcu_minor\":\"\",\"pcu_active\":true}],\"PaymentMethod\":[{\"pme_id\":1,\"pme_label\":\"progressive\"},{\"pme_id\":2,\"pme_label\":\"degressive\"},{\"pme_id\":3,\"pme_label\":\"linear\"},{\"pme_id\":4,\"pme_label\":\"steps\"}],\"PaymentOption\":[{\"pop_id\":17,\"pop_label\":\"Zone 1\",\"pop_payment_method_id\":3,\"pop_day_end_time\":\"00:00:00\",\"pop_day_night_end_time\":\"00:00:00\",\"pop_price_night\":0,\"pop_min_time\":15,\"pop_max_time\":240,\"pop_min_price\":120,\"pop_carry_over\":1}],\"PaymentRate\":[{\"pra_payment_option_id\":17,\"pra_payment_unit_id\":3,\"pra_price\":480}],\"Duration\":[{\"pun_id\":1,\"pun_label\":\"1h\",\"pun_duration\":60},{\"pun_id\":2,\"pun_label\":\"1 min\",\"pun_duration\":1},{\"pun_id\":3,\"pun_label\":\"15 min\",\"pun_duration\":15},{\"pun_id\":4,\"pun_label\":\"1d\",\"pun_duration\":1440},{\"pun_id\":6,\"pun_label\":\"2h\",\"pun_duration\":120},{\"pun_id\":7,\"pun_label\":\"3h\",\"pun_duration\":180},{\"pun_id\":11,\"pun_label\":\"4h\",\"pun_duration\":240},{\"pun_id\":17,\"pun_label\":\"30 min\",\"pun_duration\":30},{\"pun_id\":18,\"pun_label\":\"1.5h\",\"pun_duration\":90},{\"pun_id\":20,\"pun_label\":\"10min\",\"pun_duration\":10}],\"WeekDaysWorktime\":[{\"pwd_id\":540,\"pwd_period_week_day_id\":32,\"pwd_period_day_in_week_id\":1,\"pwd_time_from\":\"08:00:00\",\"pwd_time_to\":\"18:00:00\"},{\"pwd_id\":541,\"pwd_period_week_day_id\":32,\"pwd_period_day_in_week_id\":2,\"pwd_time_from\":\"08:00:00\",\"pwd_time_to\":\"18:00:00\"},{\"pwd_id\":542,\"pwd_period_week_day_id\":32,\"pwd_period_day_in_week_id\":3,\"pwd_time_from\":\"08:00:00\",\"pwd_time_to\":\"18:00:00\"},{\"pwd_id\":543,\"pwd_period_week_day_id\":32,\"pwd_period_day_in_week_id\":4,\"pwd_time_from\":\"08:00:00\",\"pwd_time_to\":\"18:00:00\"},{\"pwd_id\":544,\"pwd_period_week_day_id\":32,\"pwd_period_day_in_week_id\":5,\"pwd_time_from\":\"08:00:00\",\"pwd_time_to\":\"18:00:00\"}],\"PeriodYear\":[{\"pye_id\":1,\"pye_label\":\"Summer\",\"pye_start_month\":6,\"pye_start_day\":1,\"pye_end_month\":9,\"pye_end_day\":30},{\"pye_id\":2,\"pye_label\":\"Winter\",\"pye_start_month\":10,\"pye_start_day\":1,\"pye_end_month\":5,\"pye_end_day\":31},{\"pye_id\":8,\"pye_label\":\"Whole year\",\"pye_start_month\":1,\"pye_start_day\":1,\"pye_end_month\":12,\"pye_end_day\":31}],\"SpecialDaysWorktime\":[{\"pedwt_id\":2156,\"pedwt_period_exc_day_id\":2024,\"pedwt_time_from\":\"00:00:00\",\"pedwt_time_to\":\"00:00:00\",\"pedwt_price\":0},{\"pedwt_id\":2158,\"pedwt_period_exc_day_id\":2025,\"pedwt_time_from\":\"00:00:00\",\"pedwt_time_to\":\"00:00:00\",\"pedwt_price\":0},{\"pedwt_id\":2160,\"pedwt_period_exc_day_id\":2026,\"pedwt_time_from\":\"00:00:00\",\"pedwt_time_to\":\"00:00:00\",\"pedwt_price\":0},{\"pedwt_id\":2162,\"pedwt_period_exc_day_id\":2027,\"pedwt_time_from\":\"00:00:00\",\"pedwt_time_to\":\"00:00:00\",\"pedwt_price\":0},{\"pedwt_id\":2164,\"pedwt_period_exc_day_id\":2028,\"pedwt_time_from\":\"00:00:00\",\"pedwt_time_to\":\"00:00:00\",\"pedwt_price\":0},{\"pedwt_id\":2170,\"pedwt_period_exc_day_id\":2030,\"pedwt_time_from\":\"00:00:00\",\"pedwt_time_to\":\"00:00:00\",\"pedwt_price\":0},{\"pedwt_id\":2172,\"pedwt_period_exc_day_id\":2032,\"pedwt_time_from\":\"00:00:00\",\"pedwt_time_to\":\"00:00:00\",\"pedwt_price\":0},{\"pedwt_id\":2174,\"pedwt_period_exc_day_id\":11,\"pedwt_time_from\":\"00:00:00\",\"pedwt_time_to\":\"00:00:00\",\"pedwt_price\":0},{\"pedwt_id\":2175,\"pedwt_period_exc_day_id\":13,\"pedwt_time_from\":\"00:00:00\",\"pedwt_time_to\":\"00:00:00\",\"pedwt_price\":0},{\"pedwt_id\":2178,\"pedwt_period_exc_day_id\":2022,\"pedwt_time_from\":\"00:00:00\",\"pedwt_time_to\":\"00:00:00\",\"pedwt_price\":0},{\"pedwt_id\":2179,\"pedwt_period_exc_day_id\":14,\"pedwt_time_from\":\"00:00:00\",\"pedwt_time_to\":\"00:00:00\",\"pedwt_price\":0},{\"pedwt_id\":2180,\"pedwt_period_exc_day_id\":2017,\"pedwt_time_from\":\"00:00:00\",\"pedwt_time_to\":\"00:00:00\",\"pedwt_price\":0},{\"pedwt_id\":2181,\"pedwt_period_exc_day_id\":2018,\"pedwt_time_
for (int zone = 3; zone < 4; ++zone) {
// std::string fname("/opt/ptu5/opt/customer_281/szeged/tariff/szeged_winter_sale_zone");
std::string fname("/opt/ptu5/opt/ATB-CalculatorLinux_21.12.2022/tariff/szeged_winter_sale_zone");
fname += std::to_string(zone) + ".json";
std::cout << fname << std::endl;
std::ifstream input(fname);
std::stringstream sstr;
while(input >> sstr.rdbuf());
std::string json(sstr.str());
Calculator calculator;
Configuration cfg;
bool isParsed = cfg.ParseJson(&cfg, json.c_str());
cout << endl;
char const *startDate = "";
if (isParsed)
{
struct tm now; // = Utilities::DateTimeToStructTm("2023-03-01T16:00:00");
memset(&now, 0, sizeof(now));
char buffer[64];
//#if 0
// 3.Jan 2023 -> Tuesday
strptime("2023-01-03T14:00:00", "%Y-%m-%dT%H:%M:%S", &now);
for (int i = 0; i < 600; ++i) {
time_t now_t = mktime(&now);
now_t += 60;
now = *localtime(&now_t);
sprintf(buffer, "%04d-%02d-%02dT%02d:%02d:%02d", now.tm_year + 1900, now.tm_mon + 1, now.tm_mday, now.tm_hour, now.tm_min, now.tm_sec);
double cost = calculator.GetCostFromDuration(&cfg, PaymentOption::Option1, buffer, 240, false, true);
memset(buffer, 0, 64);
// cout << "======================================================" << endl;
// cout << "zone " << zone << " ===> " << i << " " << asctime(&now) << " - Total cost is: " << cost << " FT" << endl;
switch (zone) {
case 1:
assert(cost == 879); // expected value: 880
break;
case 2:
/* fall through */
case 3:
assert(cost == 1920);
break;
}
// cout << "======================================================" << endl;
}
// zone 3 has problems
for (int i = 112; i <= 128; ++i)
{
startDate = "2022-12-23T17:00:00";
std::string validity = calculator.GetDurationFromCost(&cfg, PaymentOption::Option1, (char *)startDate, i, false, true);
cout << "zone " << zone << ", startDate " << startDate << " _price_ "
<< i << " Total duration is: " << validity << endl;
}
for (int i = 112; i <= 128; ++i)
{
startDate = "2022-12-09T18:00:00";
std::string validity = calculator.GetDurationFromCost(&cfg, PaymentOption::Option1, (char *)startDate, i, false, true);
cout << "zone " << zone << ", startDate " << startDate << " _price_ "
<< i << " Total duration is: " << validity << endl;
}
for (int i = 112; i <= 128; ++i) {
startDate = "2022-12-26T17:00:00";
std::string validity = calculator.GetDurationFromCost(&cfg, PaymentOption::Option1, (char *)startDate, i, false, true);
cout << "zone " << zone << ", startDate " << startDate << " _price_ "
<< i << " Total duration is: " << validity << endl;
}
//std::string validity = calculator.GetDurationFromCost(&cfg, PaymentOption::Option1, (char*)"2022-12-22T05:00:00", 75, false, true);
//cout << "_price_ " << " Total duration is: " << validity << " min" << endl;
startDate = "2022-12-22T05:00:00";
std::string validity = calculator.GetDurationFromCost(&cfg, PaymentOption::Option1, (char*)startDate, 120, false, true);
cout << "zone " << zone << ", startDate " << startDate << " _price_ "
<< " Total duration is: " << validity << " min" << endl;
// working for all zones
//
// test Easter 2023
//
memset(&now, 0, sizeof(now));
strptime("2023-04-07T06:00:00", "%Y-%m-%dT%H:%M:%S", &now);
for (int i=0; i<6*24; ++i) {
time_t now_t = mktime(&now);
now_t += 60*60;
now = *localtime(&now_t);
sprintf(buffer, "%04d-%02d-%02dT%02d:%02d:%02d", now.tm_year + 1900,
now.tm_mon + 1, now.tm_mday, now.tm_hour, now.tm_min, now.tm_sec);
int const duration = 120;
double cost = calculator.GetCostFromDuration(&cfg,
PaymentOption::Option1, buffer, duration,
false, true);
switch (zone) {
case 1:
cout << "===> [" << i << "] " << asctime(&now) << " - Total cost is: " << cost << " FT" << endl;
assert(cost == 440);
break;
case 2:
/* fall through */
case 3:
assert(cost == 960);
cout << "===> [" << i << "] " << asctime(&now) << " - Total cost is: " << cost << " FT" << endl;
break;
}
//if (cost == 960) {
// cout << "===> [" << i << "] " << asctime(&now) << " - Total cost is: " << cost << " FT" << endl;
//} else {
// cout << "ERROR ===> [" << i << "] " << asctime(&now) << " - Total cost is: " << cost << " FT" << endl;
// assert(cost == 960);
//}
}
// working for all zones
//
// test May 1st 2023
//
memset(&now, 0, sizeof(now));
strptime("2023-04-30T06:00:00", "%Y-%m-%dT%H:%M:%S", &now);
for (int i=0; i<6*24; ++i) {
time_t now_t = mktime(&now);
now_t += 60*60;
now = *localtime(&now_t);
sprintf(buffer, "%04d-%02d-%02dT%02d:%02d:%02d", now.tm_year + 1900,
now.tm_mon + 1, now.tm_mday, now.tm_hour, now.tm_min, now.tm_sec);
int const duration = 120;
double cost = calculator.GetCostFromDuration(&cfg,
PaymentOption::Option1, buffer, duration,
false, true);
switch (zone) {
case 1:
cout << "===> [" << i << "] " << asctime(&now) << " - Total cost is: " << cost << " FT" << endl;
assert(cost == 440);
break;
case 2:
/* fall through */
case 3:
assert(cost == 960);
cout << "===> [" << i << "] " << asctime(&now) << " - Total cost is: " << cost << " FT" << endl;
break;
}
}
// only zone 1 has some minor problems
//
// test 17/04/2023 - 27/04/2023
//
memset(&now, 0, sizeof(now));
strptime("2023-04-17T06:00:00", "%Y-%m-%dT%H:%M:%S", &now);
int duration = 0;
//for (int i=0; i<1440; ++i) {
for (int i=0; i<1440; ++i) {
time_t now_t = mktime(&now);
now_t += 600; // 10 minutes
now = *localtime(&now_t);
sprintf(buffer, "%04d-%02d-%02dT%02d:%02d:%02d", now.tm_year + 1900,
now.tm_mon + 1, now.tm_mday, now.tm_hour, now.tm_min, now.tm_sec);
double const compCost = (duration < 15) ? 0 : duration * ((zone == 1) ? 3.6666 : 8.0);
double cost = calculator.GetCostFromDuration(&cfg,
PaymentOption::Option1, buffer, duration,
false, true);
if (fabs(cost - compCost) > 1.0) { // zone 1 has rounding errors
cout << "ERROR ===> [" << i << "] " << asctime(&now)
<< " - Total cost is: " << cost << " FT (computed="
<< compCost << ")" << endl;
// assert (cost == compCost);
}
if (++duration > 240) {
duration = 0;
}
}
}
}
2024-02-26 16:57:37 +01:00
#endif
}