3734 lines
163 KiB
C++
3734 lines
163 KiB
C++
#ifdef WIN32
|
|
#include <time.h>
|
|
#include <iomanip>
|
|
#include <sstream>
|
|
#include <calculate_price.h>
|
|
|
|
|
|
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>
|
|
#include <QDir>
|
|
#include <QFileInfo>
|
|
#include <QSet>
|
|
#include <initializer_list>
|
|
|
|
#include <fstream>
|
|
#include <sstream>
|
|
#include "calculator_functions.h"
|
|
#include "calculate_price.h"
|
|
#include "aes128.h"
|
|
#include "cc_iuc_asynchpos.h"
|
|
#include "MessageHelper.h"
|
|
|
|
#define SZEGED (0)
|
|
#define SCHOENAU_KOENIGSEE (0)
|
|
#define NEUHAUSER_KORNEUBURG (0)
|
|
#define NEUHAUSER_LINSINGER_MASCHINENBAU (0)
|
|
#define NEUHAUSER_NORDISCHES_AUSBILDUNGSZENTRUM (0)
|
|
#define NEUHAUSER_BILEXA_GALTUER (0)
|
|
#define BAD_NEUENAHR_AHRWEILER (0)
|
|
#define NEUHAUSER_CHRISTOPH_REISEN (0)
|
|
#define NEUHAUSER_PERNEGG_AN_DER_MUR (0)
|
|
#define NEUHAUSER_STOCKERAU (1)
|
|
#define KLEIPEDA_LITAUEN (0)
|
|
|
|
#if NEUHAUSER_KIRCHDORF==1
|
|
static bool test_neuhauser_kirchdorf(int step, double cost) {
|
|
return true;
|
|
|
|
|
|
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
|
|
|
|
#include <cmath>
|
|
#include <QJsonArray>
|
|
#include <QJsonObject>
|
|
#include <QJsonDocument>
|
|
#include <QJsonValue>
|
|
|
|
/*
|
|
QJsonObject root;
|
|
QJsonArray PaymentRate;
|
|
QJsonArray Duration;
|
|
|
|
for (int i = 1; i <= 15*15; ++i) {
|
|
QJsonObject o;
|
|
o["pra_payment_option_id"] = 1049;
|
|
o["pra_payment_unit_id"] = i;
|
|
if (i <= 15) {
|
|
o["pra_price"] = 0;
|
|
} else {
|
|
o["pra_price"] = (i-15)*10;
|
|
}
|
|
|
|
PaymentRate.push_back(o);
|
|
}
|
|
for (int i = 1; i <= 15*15; ++i) {
|
|
QJsonObject o;
|
|
o["pun_duration"] = i*4;
|
|
o["pun_id"] = i;
|
|
o["pun_label"] = QString("%1 min").arg(i*4);
|
|
Duration.push_back(o);
|
|
}
|
|
|
|
root["PaymentRate"] = PaymentRate;
|
|
root["Duration"] = Duration;
|
|
|
|
qCritical().noquote() << QJsonDocument(root).toJson();
|
|
|
|
return 0;
|
|
*/
|
|
|
|
|
|
|
|
|
|
//https://lxp32.github.io/docs/a-simple-example-crc32-calculation/
|
|
uint32_t crc32(const char *s, size_t n) {
|
|
uint32_t crc=0xFFFFFFFF;
|
|
|
|
for(size_t i=0;i<n;i++) {
|
|
char ch=s[i];
|
|
for(size_t j=0;j<8;j++) {
|
|
uint32_t b=(ch^crc)&1;
|
|
crc>>=1;
|
|
if(b) crc=crc^0xEDB88320;
|
|
ch>>=1;
|
|
}
|
|
}
|
|
|
|
return ~crc;
|
|
}
|
|
|
|
#define UINT unsigned int
|
|
#define UCHAR unsigned char
|
|
|
|
|
|
static struct billAsynchData asynchBill;
|
|
|
|
void iuc_asynchpos_sub_initArray(unsigned char* pArray, int length) {
|
|
unsigned int uitemp = 0;
|
|
|
|
for (uitemp = 0; uitemp < length; ++uitemp)
|
|
pArray[uitemp] = 0x00;
|
|
}
|
|
|
|
unsigned int biox_StrLen(unsigned char *str) {
|
|
unsigned int zz;
|
|
for (zz=0; zz<0xF000; zz++)
|
|
if (str[zz]==0)
|
|
return(zz);
|
|
|
|
return(0);
|
|
}
|
|
|
|
void biox_CopyBlock(unsigned char *src, UINT srcPos, UCHAR *dest, UINT destPos, UINT len) {
|
|
UINT xx,yy,zz,ii;
|
|
|
|
xx = srcPos;
|
|
yy = destPos;
|
|
zz = len;
|
|
|
|
for (ii = 0; ii < zz; ++ii) {
|
|
dest[yy + ii] = src[xx + ii];
|
|
}
|
|
}
|
|
|
|
void iuc_asynchpos_sub_synchTime() {
|
|
QDateTime current = QDateTime::currentDateTime();
|
|
current.setTime(QTime(12, 0, 0));
|
|
QString const &s = current.toString(Qt::ISODate);
|
|
|
|
QByteArray time(s.toStdString().c_str());
|
|
time[10] = ' ';
|
|
|
|
strncpy((char *)asynchBill.time, time.toStdString().c_str(), sizeof(asynchBill.time));
|
|
}
|
|
|
|
uint32_t iuc_asynchpos_sub_updateCRC(uint32_t crc, unsigned char* pData, size_t len) {
|
|
// berechne CRC32 nach Polynom x^26 + x^23 + x^22 + x^16 + x^12 + x^11 + x^10 + x^8 + x^7 + x^5 + x^4 + x^2 + x + 1
|
|
|
|
|
|
QByteArray a((char *)pData, len);
|
|
qCritical() << "updateCRC" << a.toHex(' ');
|
|
qCritical() << "updateCRC" << len << hex << crc;
|
|
|
|
int i = 0;
|
|
int j = 0;
|
|
// unsigned long rem;
|
|
// unsigned char octet;
|
|
// UCHAR *p, *q;
|
|
unsigned char ucCarry = 0x00;
|
|
|
|
crc = ~crc;
|
|
while (len > 0) {
|
|
crc ^= (uint32_t) pData[i];
|
|
++i;
|
|
|
|
for (j = 0; j < 8; ++j) {
|
|
ucCarry = crc & 1;
|
|
crc >>= 1;
|
|
|
|
if (ucCarry) {
|
|
crc ^= IUC_ASYNCHPOS_POLYNOME;
|
|
}
|
|
}
|
|
--len;
|
|
}
|
|
|
|
return ~crc;
|
|
|
|
}
|
|
|
|
unsigned char biox_ah2ui_char(unsigned char AscString)
|
|
{
|
|
// change hex ascii string ( of ascii numbers '0'..'9', 'A' or 'a' ...'F','f') to number
|
|
|
|
unsigned char uctmp1;
|
|
unsigned char uitmp;
|
|
|
|
uitmp = 0;
|
|
uctmp1=AscString;//[zz];
|
|
|
|
if (uctmp1>=0x30 && uctmp1<=0x39)
|
|
{
|
|
//uitmp<<=4; // nur wenn eine neue Ziffer dazukommt und vor der addition!
|
|
uctmp1-=0x30;
|
|
uitmp+=/*(UINT)*/uctmp1;
|
|
} else
|
|
|
|
if (uctmp1>='A' && uctmp1<='F')
|
|
{
|
|
//uitmp<<=4;
|
|
uctmp1-=0x37;
|
|
uitmp+=/*(UINT)*/uctmp1;
|
|
} else
|
|
|
|
if (uctmp1>='a' && uctmp1<='f')
|
|
{
|
|
//uitmp<<=4;
|
|
uctmp1-=0x57;
|
|
uitmp+=/*(UINT)*/uctmp1;
|
|
}
|
|
|
|
return(uitmp);
|
|
|
|
}
|
|
|
|
unsigned char iuc_asynchpos_send_serial(unsigned char* pData, unsigned int length, unsigned char needRTS, unsigned char overrideACK) {
|
|
unsigned int uitmp = 0;
|
|
unsigned int uitmp2 = 0;
|
|
unsigned int uitmp3 = 0;
|
|
unsigned int txCounter = 0;
|
|
unsigned int dxCounter = 0;
|
|
unsigned char uctmp = 0x00;
|
|
// unsigned char uctmp2 =0x00;
|
|
unsigned char chksum = 0x00;
|
|
//unsigned char dataContext = 0x00;
|
|
unsigned int retryCount = 0;
|
|
unsigned long lastRetry = 0;
|
|
unsigned int dxLength;
|
|
// unsigned int dx = biox_StrLen(pData) + 1;
|
|
unsigned char rxBuf[8];
|
|
//unsigned char pData_[IUC_ASYNCHPOS_MAX_ARRAY_SIZE];
|
|
// unsigned int loopCount = 1000;
|
|
// unsigned char retVal = 0x01;
|
|
|
|
//preparing to send
|
|
//if (needRTS) {
|
|
//brd_SendDiagStr("->IUC ASYNCHPOS sending 0x04 (EOT).",1);
|
|
// uctmp = iuc_asynchpos_rts();
|
|
//}
|
|
|
|
//sending data
|
|
if (!uctmp) {
|
|
//brd_SendDiagStr("----->IUC ASYNCHPOS",1);
|
|
iuc_asynchpos_sub_initArray(txAsynchData, IUC_ASYNCHPOS_MAX_ARRAY_SIZE);
|
|
//iuc_asynchpos_sub_initArray(pData_, IUC_ASYNCHPOS_MAX_ARRAY_SIZE);
|
|
|
|
//biox_CopyBlock(pData,0,pData_,0,IUC_ASYNCHPOS_MAX_ARRAY_SIZE);
|
|
|
|
/*dxCounter = 0;
|
|
for (uitmp = 0; uitmp < dx + dxCounter; ++uitmp) {
|
|
if ((pData[uitmp] >= STX && pData[uitmp] <= ACK2)
|
|
|| (pData[uitmp] == DLE) || (pData[uitmp] == NAK)) {
|
|
|
|
pData[uitmp] = (pData[uitmp] + 0x30);
|
|
|
|
for (uitmp2 = uitmp; uitmp2 < dx + dxCounter; ++uitmp2) {
|
|
pData[uitmp2 + 1] = pData[uitmp2];
|
|
}
|
|
|
|
pData[uitmp] = DLE;
|
|
++dxCounter;
|
|
}
|
|
}
|
|
|
|
dxCounter = 0;*/
|
|
|
|
for (uitmp = 0; uitmp < length; uitmp += IUC_ASYNCHPOS_MIN_PACKET_SIZE) {
|
|
|
|
//if (dxCounter > 0)
|
|
//uitmp -= dxCounter;
|
|
|
|
uctmp = 0x00;
|
|
dxCounter = 0;
|
|
chksum = 0x00;
|
|
dxLength = IUC_ASYNCHPOS_MIN_PACKET_SIZE;
|
|
|
|
if (length - uitmp <= IUC_ASYNCHPOS_MIN_PACKET_SIZE)
|
|
dxLength = 2 + length - uitmp;
|
|
|
|
iuc_asynchpos_sub_initArray(txAsynchData, 3 + IUC_ASYNCHPOS_MIN_PACKET_SIZE);
|
|
|
|
//Packet structure is STX <packet_data> ETX1|ETX2 {LRC}
|
|
txAsynchData[0] = STX;
|
|
|
|
for (txCounter = 0; (txCounter/* + dxCounter*/) < dxLength; ++txCounter) {
|
|
//for (txCounter = 0; txCounter < dxLength; ++txCounter) {
|
|
|
|
/*if ((pData[uitmp + txCounter] >= STX && pData[uitmp + txCounter] <= ACK2)
|
|
|| (pData[uitmp + txCounter] == DLE) || (pData[uitmp + txCounter] == NAK)) {
|
|
txAsynchData[1 + txCounter + dxCounter] = DLE;
|
|
uctmp = (pData[uitmp + txCounter] + 0x30);
|
|
++dxCounter;
|
|
txAsynchData[1 + txCounter + dxCounter] = uctmp; //(pData[uitmp + txCounter] + 0x30);
|
|
} else {*/
|
|
txAsynchData[1 + txCounter/* + dxCounter*/] = pData[uitmp + txCounter];
|
|
|
|
if ((pData[uitmp + txCounter] >= STX && pData[uitmp + txCounter] <= ACK2)
|
|
|| (pData[uitmp + txCounter] == DLE) || (pData[uitmp + txCounter] == NAK)) {
|
|
++dxCounter;
|
|
}
|
|
}
|
|
|
|
for (uitmp2 = 1; uitmp2 < dxLength + dxCounter; ++uitmp2) {
|
|
if ((txAsynchData[uitmp2] >= STX && txAsynchData[uitmp2] <= ACK2)
|
|
|| (txAsynchData[uitmp2] == DLE) || (txAsynchData[uitmp2] == NAK)) {
|
|
for (uitmp3 = dxLength + dxCounter; uitmp3 > uitmp2; --uitmp3) {
|
|
txAsynchData[uitmp3] = txAsynchData[uitmp3 - 1];
|
|
}
|
|
txAsynchData[uitmp2 + 1] = (txAsynchData[uitmp2 + 1] + 0x30);
|
|
txAsynchData[uitmp2] = DLE;
|
|
}
|
|
}
|
|
|
|
/*if (dxLength < IUC_ASYNCHPOS_MIN_PACKET_SIZE && txAsynchData[txCounter + dxCounter] != 0x00) {
|
|
++dxCounter;
|
|
}*/
|
|
|
|
for (uitmp2 = 1; uitmp2 <= (txCounter + dxCounter); ++uitmp2) {
|
|
chksum ^= txAsynchData[uitmp2];
|
|
}
|
|
|
|
if (!iucAsynchpoxDataContext) {
|
|
txAsynchData[1 + txCounter + dxCounter] = ETX1;
|
|
chksum ^= ETX1;
|
|
} else {
|
|
txAsynchData[1 + txCounter + dxCounter] = ETX2;
|
|
chksum ^= ETX2;
|
|
}
|
|
|
|
txAsynchData[2 + txCounter + dxCounter] = chksum;
|
|
|
|
QByteArray c((char*)txAsynchData, 2 + txCounter + dxCounter + 1);
|
|
qCritical() << "txCounter" << txCounter;
|
|
qCritical() << "dxCounter" << dxCounter;
|
|
qCritical() << "check" << chksum;
|
|
qCritical() << "txAsyncData" << c.toHex(' ');
|
|
|
|
|
|
}
|
|
}
|
|
return 0;
|
|
}
|
|
unsigned int iuc_asynchpos_send(unsigned char packetType,
|
|
unsigned char* pData,
|
|
unsigned int length,
|
|
unsigned char needRTS) {
|
|
unsigned char txData_[IUC_ASYNCHPOS_MAX_ARRAY_SIZE];
|
|
unsigned char tempID [IUC_ASYNCHPOS_MIN_BASE_BYTE_DATA_SIZE];
|
|
unsigned char tempID_ [IUC_ASYNCHPOS_MIN_BASE_BYTE_DATA_SIZE];
|
|
unsigned char tempAPAK [IUC_ASYNCHPOS_MIN_BASE_BYTE_DATA_SIZE];
|
|
unsigned long uitmp = 0;
|
|
unsigned int posID = 0;
|
|
unsigned long chksum = 0;
|
|
unsigned int messageLength = length + 1;
|
|
unsigned int length_ = length + 1;
|
|
unsigned char pData_[IUC_ASYNCHPOS_MAX_ARRAY_SIZE];
|
|
unsigned char uctemp = 0;
|
|
// unsigned char retries = 4;
|
|
unsigned char rxBuf[8];
|
|
|
|
iuc_asynchpos_crc_old = 0;
|
|
iuc_asynchpos_sub_initArray(rxBuf, 8);
|
|
iuc_asynchpos_sub_initArray(pData_, IUC_ASYNCHPOS_MAX_ARRAY_SIZE);
|
|
biox_CopyBlock(pData,0,pData_,0,length_);
|
|
|
|
iuc_asynchpos_sub_initArray(txData_, IUC_ASYNCHPOS_MAX_ARRAY_SIZE);
|
|
iuc_asynchpos_sub_initArray(tempID, IUC_ASYNCHPOS_MIN_BASE_BYTE_DATA_SIZE);
|
|
iuc_asynchpos_sub_initArray(tempID_, IUC_ASYNCHPOS_MIN_BASE_BYTE_DATA_SIZE);
|
|
iuc_asynchpos_sub_initArray(tempAPAK, IUC_ASYNCHPOS_MIN_BASE_BYTE_DATA_SIZE);
|
|
|
|
//header
|
|
/*
|
|
The header of the message is composed of:
|
|
? 1 byte packet Type, which indicates the type of the packet;
|
|
? 8 bytes Packet ID, a unique ID to achieve maximum security (for information on forming
|
|
Packet ID see chapter 3.4 Communication security);
|
|
? 1 byte P.O.S. ID length;
|
|
? ASCII encoded P.O.S. ID (up to 255 bytes); ((gemeint ist Terminal ID)
|
|
*/
|
|
|
|
txData_[2] = packetType;
|
|
|
|
//1 byte P.O.S. ID length
|
|
/*for (uitmp = 0; uitmp < 32 && terminalID[uitmp] != 0x00; ++uitmp) {
|
|
++posID; // -= uitmp;
|
|
}*/
|
|
|
|
posID = biox_StrLen(terminalID)/* + 1*/;
|
|
|
|
//++posID;
|
|
txData_[11] = (UCHAR) posID;
|
|
|
|
messageLength += (10 + posID); //Added header
|
|
txData_[0] = (messageLength) & 0xFF00; //high byte
|
|
txData_[1] = (messageLength) & 0x00FF; //low byte
|
|
|
|
//8 byte Packet ID
|
|
/*
|
|
Apak: 9D547268976ADE1BBB39DE90F3A449E5
|
|
Terminal id: T-LT-OPT-01
|
|
*/
|
|
|
|
//calculate CRC32
|
|
uctemp = (UCHAR) posID;
|
|
|
|
fprintf(stderr, "POSID=%0X\n", uctemp);
|
|
|
|
chksum = IUC_ASYNCHPOS_POLYNOME_INITIAL;
|
|
chksum = iuc_asynchpos_sub_updateCRC(chksum,&uctemp,1);
|
|
fprintf(stderr, "%d CRC32=%04X\n", __LINE__, chksum);
|
|
chksum = iuc_asynchpos_sub_updateCRC(chksum,terminalID,posID);
|
|
fprintf(stderr, "%d CRC32=%04X\n", __LINE__, chksum);
|
|
//for (uitmp = 0; uitmp < length_; ++uitmp) {
|
|
chksum = iuc_asynchpos_sub_updateCRC(chksum,pData_/*[uitmp]*/,length_);
|
|
fprintf(stderr, "%d CRC32=%04X\n", __LINE__, chksum);
|
|
//}
|
|
|
|
//XOR crc value with APAK
|
|
//chksum = 2502456899; //HACK FOR TESTING, REMOVE LATER!
|
|
for(uitmp = 0; uitmp < IUC_ASYNCHPOS_MIN_BASE_BYTE_DATA_SIZE; ++uitmp) {
|
|
tempAPAK[uitmp] |= biox_ah2ui_char(terminalAPAK[uitmp * 2]) << 4;
|
|
tempAPAK[uitmp] |= biox_ah2ui_char(terminalAPAK[(uitmp * 2) + 1]);
|
|
//tempAPAK[uitmp] = (terminalAPAK[uitmp * 2] << 8) | (terminalAPAK[(uitmp * 2) + 1]);
|
|
}
|
|
|
|
tempID[0] = (chksum >> 24) & 0xFF;
|
|
tempID[1] = (chksum >> 16) & 0xFF;
|
|
tempID[2] = (chksum >> 8) & 0xFF;
|
|
tempID[3] = chksum & 0xFF;
|
|
|
|
for (uitmp = 0; uitmp < 4; ++uitmp) {
|
|
tempID[uitmp] ^= tempAPAK[uitmp]; //terminalAPAK[uitmp];
|
|
}
|
|
|
|
for (uitmp = 4; uitmp < IUC_ASYNCHPOS_MIN_BASE_BYTE_DATA_SIZE; ++uitmp) {
|
|
tempID[uitmp] = tempAPAK[uitmp]; //terminalAPAK[uitmp];
|
|
}
|
|
|
|
//Eyncrypt result with APAK, according to AES128
|
|
|
|
QByteArray x((char *)tempID, IUC_ASYNCHPOS_MIN_BASE_BYTE_DATA_SIZE);
|
|
QByteArray y((char *)tempID_, IUC_ASYNCHPOS_MIN_BASE_BYTE_DATA_SIZE);
|
|
QByteArray z((char *)tempAPAK, IUC_ASYNCHPOS_MIN_BASE_BYTE_DATA_SIZE);
|
|
|
|
qCritical() << "X" << x.toHex();
|
|
qCritical() << "Y" << y.toHex();
|
|
qCritical() << "Z" << z.toHex();
|
|
|
|
|
|
aes_encrypt(tempID,tempID_,tempAPAK);
|
|
|
|
//get the leftmost 8 byte of that value and set then as Packet ID
|
|
for (uitmp = 0; uitmp < 8; ++uitmp) {
|
|
txData_[3 + uitmp] = tempID_[uitmp];
|
|
fprintf(stderr, "%0X", txData_[3 + uitmp]);
|
|
} fprintf(stderr, "\n");
|
|
|
|
//P.O.S.ID
|
|
for (uitmp = 0; uitmp < posID; ++uitmp) {
|
|
txData_[12 + uitmp] = terminalID[uitmp];
|
|
}
|
|
|
|
//Message
|
|
//1 byte - marker
|
|
//0 . 7F bytes - tag name
|
|
//2 + N bytes - data
|
|
for (uitmp = 0; uitmp < length_; ++uitmp) {
|
|
txData_[12 + posID + uitmp] = pData_[uitmp];
|
|
}
|
|
|
|
QByteArray a((char *)(&txData_[0]), messageLength+1);
|
|
qCritical() << "MESSAGE" << a.toHex(' ');
|
|
|
|
iuc_asynchpos_send_serial(txData_, (messageLength/* + 1*/),needRTS,0x00);
|
|
//QByteArray b((char *)(&txAsynchData[0]), IUC_ASYNCHPOS_MAX_ARRAY_SIZE);
|
|
//qCritical() << "EXPANDED MESSAGE" << b.toHex(' ');
|
|
|
|
#if 0
|
|
brd_SendDiagStr("->IUC ASYNCHPOS send message: ",0);
|
|
brd_SendDiagBlock(txData_,1,messageLength);
|
|
|
|
//Message compiled, now send it via serial
|
|
uitmp = 1;
|
|
//while (retries > 0 && uitmp > 0) {
|
|
//uitmp = iuc_asynchpos_send_serial(txData_, (messageLength + 1));
|
|
//--retries;
|
|
if (iuc_asynchpos_send_serial(txData_, (messageLength/* + 1*/),needRTS,0x00)) {
|
|
//brd_SendDiagStr("->IUC ASYNCHPOS Message failed!",1);
|
|
//TODO Message sending failed -> Error handling here
|
|
//return 1;
|
|
uitmp = 0x00;
|
|
//brd_SendDiagStr("->IUC ASYNCHPOS Message NOT send",1);
|
|
} else {
|
|
//brd_SendDiagStr("->IUC ASYNCHPOS Message send",1);
|
|
} /*else {
|
|
--retries;
|
|
}
|
|
}*/
|
|
|
|
//if (!uitmp)
|
|
//return 1;
|
|
|
|
/*if (retries == 0) {
|
|
brd_SendDiagStr("->IUC ASYNCHPOS Message failed!",1);
|
|
rxBuf[0] = 0x45;
|
|
rxBuf[1] = 0x00;
|
|
rxBuf[2] = 0xFF;
|
|
vmc_SendWithBuffer(rxBuf,20,0x69,0);
|
|
return 1;
|
|
}
|
|
|
|
rxBuf[0] = 0x45;
|
|
rxBuf[1] = 0x00;
|
|
rxBuf[2] = 0x00;
|
|
vmc_SendWithBuffer(rxBuf,20,0x69,0);*/
|
|
|
|
//brd_SendDiagStr("->IUC ASYNCHPOS Message send",1);
|
|
//while(iuc_asynchpos_recieve_serial());
|
|
#endif
|
|
return 0;
|
|
}
|
|
|
|
void iuc_asynchpos_command_Login() { //Kasse registrieren
|
|
unsigned char message[IUC_ASYNCHPOS_MAX_TX_MESSAGE_SIZE];
|
|
unsigned char packetType = 0x00;
|
|
unsigned int uitemp = 0;
|
|
unsigned char command[] = "Login";
|
|
unsigned char tagName[] = "Time";
|
|
//unsigned char tag2Name[] = "IdleText";
|
|
unsigned char tag3Name[] = "Flags";
|
|
unsigned char tag3Value[] = "AP3|LR";
|
|
|
|
//Constructing the message
|
|
iuc_asynchpos_sub_initArray(message,IUC_ASYNCHPOS_MAX_TX_MESSAGE_SIZE);
|
|
uitemp = (unsigned char) biox_StrLen(command);
|
|
message[0] = (unsigned char) uitemp + 0x80; //constructed element, tag name length
|
|
biox_CopyBlock(command,0,message,1,uitemp); //tag name
|
|
++uitemp;
|
|
|
|
message[uitemp] = (unsigned char) biox_StrLen(tagName);//data element, tag name length
|
|
++uitemp;
|
|
biox_CopyBlock(tagName,0,message,uitemp, biox_StrLen(tagName));// tag name
|
|
uitemp += (1 + biox_StrLen(tagName));
|
|
|
|
//Time
|
|
iuc_asynchpos_sub_synchTime();
|
|
message[uitemp] = (unsigned char) biox_StrLen(asynchBill.time);//value length
|
|
++uitemp;
|
|
biox_CopyBlock(asynchBill.time,0,message,uitemp, biox_StrLen(asynchBill.time));//value
|
|
uitemp += biox_StrLen(asynchBill.time);
|
|
|
|
//Flags
|
|
message[uitemp] = (unsigned char) biox_StrLen(tag3Name);//data element, tag name length
|
|
++uitemp;
|
|
biox_CopyBlock(tag3Name,0,message,uitemp, biox_StrLen(tag3Name));// tag name
|
|
uitemp += (1 + biox_StrLen(tag3Name));
|
|
|
|
message[uitemp] = (unsigned char) biox_StrLen(tag3Value);//value length
|
|
++uitemp;
|
|
biox_CopyBlock(tag3Value,0,message,uitemp, biox_StrLen(tag3Value));//value
|
|
|
|
uitemp += biox_StrLen(tag3Value)/* + 1*/;
|
|
|
|
iuc_asynchpos_send(packetType,message,uitemp,0x01);
|
|
}
|
|
|
|
int main() {
|
|
#if 1
|
|
|
|
MessageHelper msgHelp;
|
|
|
|
|
|
msgHelp.createLoginMessageChunksToSend(0x02);
|
|
|
|
|
|
qCritical() << "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" << endl;
|
|
//return 0;
|
|
|
|
// unsigned static char terminalID[IUC_ASYNCHPOS_MIN_BASE_DATA_SIZE];
|
|
// unsigned static char terminalAPAK[IUC_ASYNCHPOS_MIN_BASE_DATA_SIZE];
|
|
strncpy((char *)&terminalID[0], "T-TPS-SELF2002in", IUC_ASYNCHPOS_MIN_BASE_DATA_SIZE);
|
|
strncpy((char *)&terminalAPAK[0], "8AC304380E0E476BA2558B75DB9E2516", IUC_ASYNCHPOS_MIN_BASE_DATA_SIZE);
|
|
|
|
iuc_asynchpos_command_Login();
|
|
return 0;
|
|
|
|
// test aes
|
|
aes_init();
|
|
|
|
uint32_t crc = 0;
|
|
|
|
QByteArray a("T-TPS-SELF2002");
|
|
qCritical() << a.toHex(' ');
|
|
|
|
//QByteArray xx("\x0D\x54\x2D\x54\x50\x53\x2D\x53\x45\x4C\x46\x32\x30\x30\x32\x85\x4C\x6F\x67\x69\x6E\x04\x54\x69\x6D\x65\x00\x13\x32\x30\x32\x34\x2d\x30\x36\x2d\x31\x31\x20\x31\x33\x3a\x34\x34\x3a\x33\x35\x00\x02",
|
|
// 48);
|
|
|
|
//QByteArray xx("123456789", 9);
|
|
|
|
QByteArray xx("2E5450532D53454C4632303032854C6F67696E0454696D650013323032342d30362d31312031333a34343a333505466C616773000341505300",
|
|
114);
|
|
unsigned char bb = 0;
|
|
//32:4b:e7:4e:1d:d7:b5:ae
|
|
QByteArray b("\x00\x46\x00\x32\x4b\xe7\x4e\x1d\xd7\xb5\xae\x0E\x54\x2D\x54\x50\x53\x2D\x53\x45\x4C\x46\x32\x30\x30\x32\x85\x4C\x6F\x67\x69\x6E\x04\x54\x69\x6D\x65\x00\x13\x32\x30\x32\x34\x2d\x30\x36\x2d\x31\x31\x20\x31\x33\x3a\x34\x34\x3a\x33\x35\x05\x46\x6C\x61\x67\x73\x00\x03\x41\x50\x53\x00\x02",
|
|
71);
|
|
qCritical() << "B" << b.toHex(':');
|
|
|
|
for (int i=0; i < b.size(); ++i) {
|
|
//printf("%d %02x\n", i, (unsigned char)b.at(i));
|
|
bb = bb ^ b.at(i);
|
|
}
|
|
printf("bb=%02x\n", bb);
|
|
|
|
|
|
|
|
qCritical() << xx.size() << "xx" << xx.toHex(' ');
|
|
|
|
crc = iuc_asynchpos_sub_updateCRC(crc, xx.data(), xx.size());
|
|
|
|
printf("111 crc=%04x\n", crc);
|
|
|
|
crc = crc32(xx.data(), xx.size());
|
|
printf("222 crc=%04x\n", crc);
|
|
|
|
QByteArray ba("TEST\x0E\x0E\x47\x6B\xA2\x55\x8B\x75\xDB\x9E\x25\x16");
|
|
|
|
ba[0] = (crc >> 24);
|
|
ba[1] = (crc >> 16);
|
|
ba[2] = (crc >> 8);
|
|
ba[3] = (crc);
|
|
|
|
qCritical() << ba.toHex(' ');
|
|
|
|
QDateTime current = QDateTime::currentDateTime();
|
|
QString const &s = current.toString(Qt::ISODate);
|
|
QByteArray time(s.toStdString().c_str());
|
|
time[10] = ' ';
|
|
|
|
qCritical() << time.toHex(' ');
|
|
|
|
|
|
|
|
//unsigned char in[] = "TESTTESTTESTTEST";
|
|
//unsigned char in[] = ba.data();
|
|
unsigned char key[] = "8AC304380E0E476BA2558B75DB9E2516";
|
|
//unsigned char key[] = "\x8A\xC3\x04\x38\x0E\x0E\x47\x6B\xA2\x55\x8B\x75\xDB\x9E\x25\x16";
|
|
unsigned char output[256];
|
|
|
|
memset(output, 0, sizeof(output));
|
|
|
|
aes_encrypt((unsigned char*)ba.data(), output, key);
|
|
|
|
qCritical() << ba.toHex(':') << endl;
|
|
qCritical() << QByteArray((char*)key).toHex(':') << endl;
|
|
qCritical() << QByteArray((char*)output).toHex(':') << endl;
|
|
|
|
return 0;
|
|
#endif
|
|
|
|
//char aes_encrypt(unsigned char *input,unsigned char *output,unsigned char *key);
|
|
|
|
#if KLEIPEDA_LITAUEN==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;
|
|
|
|
input.open("/opt/ptu5/opt/customer_335/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) {
|
|
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;
|
|
|
|
|
|
QList<int> timeSteps = Calculator::GetInstance().GetTimeSteps(&cfg);
|
|
qCritical() << "TimeSteps" << timeSteps;
|
|
|
|
return 0;
|
|
|
|
|
|
CalcState cs;
|
|
double cost;
|
|
int durationInMinutes = 0;
|
|
int offsetInMinutes = 0;
|
|
|
|
// for (int day = Qt::Monday; day <= Qt::Sunday; ++day) {
|
|
for (int day = Qt::Monday; day <= Qt::Monday; ++day) {
|
|
QDateTime s(QDate(2024, 5, 19 + day), QTime()); // 20: (whit) monday,..., 26: sunday
|
|
QDateTime end;
|
|
|
|
switch (day) {
|
|
case (int)Qt::Monday:
|
|
qCritical() << "Monday";
|
|
break;
|
|
case (int)Qt::Tuesday:
|
|
qCritical() << "Tuesday";
|
|
break;
|
|
case (int)Qt::Wednesday:
|
|
qCritical() << "Wednesday";
|
|
break;
|
|
case (int)Qt::Thursday:
|
|
qCritical() << "Thursday";
|
|
break;
|
|
case (int)Qt::Friday:
|
|
qCritical() << "Friday";
|
|
break;
|
|
case (int)Qt::Saturday:
|
|
qCritical() << "Saturday";
|
|
break;
|
|
case (int)Qt::Sunday:
|
|
qCritical() << "Sunday";
|
|
break;
|
|
}
|
|
|
|
|
|
for (int minutes = 0; minutes < 1440; ++minutes) {
|
|
QDateTime start = s.addSecs(minutes * 60);
|
|
QDateTime effectiveStart = start;
|
|
|
|
if (start.time() < QTime(8, 0, 0)) {
|
|
effectiveStart.setTime(QTime(8, 0, 0));
|
|
} else
|
|
if (start.time() <= QTime(22, 0, 0)) {
|
|
effectiveStart = start;
|
|
} else {
|
|
effectiveStart = start.addDays(1);
|
|
effectiveStart.setTime(QTime(8, 0, 0)); // next day
|
|
}
|
|
|
|
for (int i = 0; i <= 2100; i += 10) {
|
|
//for (int i = 2100; i <= 2100; i += 10) {
|
|
cost = i;
|
|
|
|
if ((cs = compute_duration_for_parking_ticket(&cfg, start, cost, end))) { // return value
|
|
durationInMinutes = pop_min_time;
|
|
if (i > 0) {
|
|
durationInMinutes += (i/10) * 4;
|
|
}
|
|
offsetInMinutes = 0;
|
|
|
|
if (effectiveStart.time() >= QTime(8, 0, 0) && effectiveStart.time() <= QTime(22, 0, 0)) {
|
|
if (effectiveStart.time().secsTo(QTime(22, 0, 0)) < (durationInMinutes * 60)) {
|
|
offsetInMinutes = 600; // 22:00 -> 8:00
|
|
}
|
|
}
|
|
|
|
if (i == 0) {
|
|
i += 20;
|
|
}
|
|
|
|
if ((durationInMinutes + offsetInMinutes) == (effectiveStart.secsTo(end) / 60)) {
|
|
|
|
if (day == Qt::Monday && minutes >= 480 && minutes <= 1320) {
|
|
qCritical() << "| start ............................" << start.toString(Qt::ISODate);
|
|
qCritical() << "| cost ............................." << cost;
|
|
qCritical() << "| durationInMinutes ................" << durationInMinutes
|
|
<< "(" << (durationInMinutes - 60) << "+ 60 )";
|
|
qCritical() << "| offsetInMinutes .................." << offsetInMinutes;
|
|
qCritical() << "| end .............................." << end.toString(Qt::ISODate) << endl;
|
|
}
|
|
|
|
continue;
|
|
}
|
|
}
|
|
|
|
if (!cs) {
|
|
qCritical() << "ERROR CalcState" << cs.toString() << endl;
|
|
} else {
|
|
qCritical() << cs.toString();
|
|
}
|
|
qCritical() << __LINE__ << "start ............................" << start.toString(Qt::ISODate);
|
|
qCritical() << __LINE__ << "effectiveStart ..................." << effectiveStart.toString(Qt::ISODate);
|
|
qCritical() << __LINE__ << "cost ............................." << cost;
|
|
qCritical() << __LINE__ << "durationInMinutes ................" << durationInMinutes;
|
|
qCritical() << __LINE__ << "offsetInMinutes .................." << offsetInMinutes;
|
|
qCritical() << __LINE__ << "effectiveStart.secsTo(end) / 60 .." << effectiveStart.secsTo(end) / 60;
|
|
qCritical() << __LINE__ << "end .............................." << end.toString(Qt::ISODate) << endl;
|
|
exit(-1);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
#endif
|
|
|
|
#if NEUHAUSER_STOCKERAU==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;
|
|
|
|
input.open("/opt/ptu5/opt/customer_748/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) {
|
|
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;
|
|
|
|
CalcState cs;
|
|
double const x = 30.0/7.0;
|
|
double cost;
|
|
int durationInMinutes;
|
|
int offsetInMinutes = 0;
|
|
|
|
//for (int day = Qt::Monday; day <= Qt::Sunday; ++day) {
|
|
for (int day = Qt::Tuesday; day <= Qt::Tuesday; ++day) {
|
|
QDateTime s(QDate(2024, 6, 9 + day), QTime()); // 20: (whit) monday,..., 26: sunday
|
|
QDateTime end;
|
|
|
|
for (int minutes = 660; minutes <= 660; ++minutes) {
|
|
//for (int minutes = 0; minutes < 1440; ++minutes) {
|
|
QDateTime start = s.addSecs(minutes * 60);
|
|
QDateTime effectiveStart = start;
|
|
|
|
if (day >= Qt::Monday && day <= Qt::Friday) {
|
|
if (start.time() < QTime(8,0,0)) {
|
|
effectiveStart.setTime(QTime(8,0,0));
|
|
} else
|
|
if (start.time() <= QTime(12,0,0)) {
|
|
effectiveStart = start;
|
|
} else
|
|
if (start.time() < QTime(13,30,0)) {
|
|
effectiveStart.setTime(QTime(13,30,0));
|
|
} else
|
|
if (start.time() <= QTime(18,0,0)) {
|
|
effectiveStart = start;
|
|
} else {
|
|
effectiveStart = start.addDays(1);
|
|
effectiveStart.setTime(QTime(8,0,0)); // saturday
|
|
}
|
|
} else
|
|
if (day == Qt::Saturday) {
|
|
if (start.time() < QTime(8,0,0)) {
|
|
effectiveStart.setTime(QTime(8,0,0));
|
|
} else
|
|
if (start.time() <= QTime(12,0,0)) {
|
|
effectiveStart = start;
|
|
} else {
|
|
effectiveStart = start.addDays(2);
|
|
effectiveStart.setTime(QTime(8,0,0)); // monday
|
|
}
|
|
} else
|
|
if (day == Qt::Sunday) {
|
|
effectiveStart = start.addDays(1);
|
|
effectiveStart.setTime(QTime(8,0,0)); // monday
|
|
}
|
|
|
|
for (int i = 700; i <= 700; i += 10) {
|
|
cost = i;
|
|
if ((cs = compute_duration_for_parking_ticket(&cfg, start, cost, end))) { // return value
|
|
durationInMinutes = truncf(x * (i/10));
|
|
offsetInMinutes = 0;
|
|
if (day >= Qt::Monday && day <= Qt::Friday) {
|
|
if (effectiveStart.time() >= QTime(8, 0, 0) && effectiveStart.time() <= QTime(12, 0, 0)) {
|
|
if (effectiveStart.date().dayOfWeek() == start.date().dayOfWeek()) {
|
|
if (effectiveStart.time().addSecs(durationInMinutes * 60) > QTime(12, 0, 0)) {
|
|
offsetInMinutes = 90; // 12:00 - 13:30
|
|
}
|
|
} else {
|
|
offsetInMinutes = 14 * 60; // 18:00 -> next day, 8:00
|
|
if (effectiveStart.time().addSecs(durationInMinutes * 60) <= QTime(12, 0, 0)) {
|
|
offsetInMinutes = 0;
|
|
} else {
|
|
if (effectiveStart.date().dayOfWeek() == Qt::Saturday) {
|
|
offsetInMinutes = (12 + 24 + 8) * 60;
|
|
} else {
|
|
offsetInMinutes = 90;
|
|
}
|
|
}
|
|
}
|
|
} else
|
|
if (effectiveStart.time() >= QTime(13, 30, 0)) {
|
|
if (effectiveStart.time().addSecs(durationInMinutes * 60) > QTime(18, 0, 0)) {
|
|
offsetInMinutes = 14 * 60; // 18:00 -> next day, 8:00
|
|
}
|
|
}
|
|
} else
|
|
if (day == Qt::Saturday) {
|
|
if (effectiveStart.time() >= QTime(8, 0, 0) && effectiveStart.time() <= QTime(12, 0, 0)) {
|
|
if (effectiveStart.date().dayOfWeek() == start.date().dayOfWeek()) {
|
|
if (effectiveStart.time().addSecs(durationInMinutes * 60) > QTime(12, 0, 0)) {
|
|
offsetInMinutes = (12 + 24 + 8) * 60; // monday, 8:00
|
|
}
|
|
} else {
|
|
offsetInMinutes = (12 + 24 + 8) * 60; // monday, 8:00
|
|
if (effectiveStart.time().addSecs(durationInMinutes * 60) <= QTime(12, 0, 0)) {
|
|
offsetInMinutes = 0;
|
|
} else {
|
|
offsetInMinutes = 90;
|
|
}
|
|
}
|
|
}
|
|
} else
|
|
if (day == Qt::Sunday) {
|
|
if (effectiveStart.time() >= QTime(8, 0, 0) && effectiveStart.time() <= QTime(12, 0, 0)) {
|
|
if (effectiveStart.time().addSecs(durationInMinutes * 60) > QTime(12, 0, 0)) {
|
|
offsetInMinutes = 90;
|
|
}
|
|
}
|
|
}
|
|
|
|
if ((durationInMinutes + offsetInMinutes) == (effectiveStart.secsTo(end) / 60)) {
|
|
qCritical() << "| start ............................" << start.toString(Qt::ISODate);
|
|
qCritical() << "| effectiveStart ..................." << effectiveStart.toString(Qt::ISODate);
|
|
qCritical() << "| cost ............................." << cost;
|
|
qCritical() << "| durationMinutes .................." << durationInMinutes;
|
|
qCritical() << "| offsetInMinutes .................." << offsetInMinutes;
|
|
qCritical() << "| effectiveStart.secsTo(end) / 60 .." << effectiveStart.secsTo(end) / 60;
|
|
qCritical() << "| end .............................." << end.toString(Qt::ISODate) << endl;
|
|
continue;
|
|
}
|
|
}
|
|
|
|
if (!cs) {
|
|
qCritical() << "ERROR CalcState" << cs.toString() << endl;
|
|
} else {
|
|
qCritical() << "SUCCESS";
|
|
}
|
|
qCritical() << "start ............................" << cs.toString();
|
|
qCritical() << "start ............................" << start.toString(Qt::ISODate);
|
|
qCritical() << "effectiveStart ..................." << effectiveStart.toString(Qt::ISODate);
|
|
qCritical() << "cost ............................." << cost;
|
|
qCritical() << "durationMinutes .................." << durationInMinutes;
|
|
qCritical() << "offsetInMinutes .................." << offsetInMinutes;
|
|
qCritical() << "effectiveStart.secsTo(end) / 60 .." << effectiveStart.secsTo(end) / 60;
|
|
qCritical() << "end .............................." << end.toString(Qt::ISODate) << endl;
|
|
exit(-1);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
#endif
|
|
|
|
#if NEUHAUSER_PERNEGG_AN_DER_MUR==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;
|
|
|
|
input.open("/opt/ptu5/opt/customer_747/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) {
|
|
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;
|
|
|
|
int price;
|
|
QDateTime productStart;
|
|
QDateTime productEnd;
|
|
QDateTime start = QDateTime::currentDateTime();
|
|
start.setTime(QTime(0, 0, 0));
|
|
price = compute_product_price(&cfg, PERMIT_TYPE::DAY_TICKET, start);
|
|
qCritical() << QString("line=%1 price (%2) :")
|
|
.arg(__LINE__)
|
|
.arg(start.time().toString(Qt::ISODate)) << price;
|
|
|
|
price = get_minimal_parkingprice(&cfg, PERMIT_TYPE::DAY_TICKET, 0, start);
|
|
qCritical() << QString("line=%1 get_minimal_parkingprice:").arg(__LINE__) << price;
|
|
|
|
start.setTime(QTime(6, 0, 0));
|
|
productStart = productEnd = QDateTime();
|
|
price = compute_product_price(&cfg, PERMIT_TYPE::DAY_TICKET, start, &productStart, &productEnd);
|
|
qCritical() << QString("line=%1 price (%2-%3) :")
|
|
.arg(__LINE__)
|
|
.arg(productStart.time().toString(Qt::ISODate))
|
|
.arg(productEnd.time().toString(Qt::ISODate))
|
|
<< price;
|
|
|
|
price = get_minimal_parkingprice(&cfg, PERMIT_TYPE::DAY_TICKET, 0, start);
|
|
qCritical() << QString("line=%1 get_minimal_parkingprice:").arg(__LINE__)
|
|
<< price;
|
|
|
|
price = compute_product_price(&cfg, PERMIT_TYPE::DAY_TICKET, start);
|
|
qCritical() << QString("line=%1 price:").arg(__LINE__) << price;
|
|
|
|
start.setTime(QTime(15, 0, 0));
|
|
productStart = productEnd = QDateTime();
|
|
price = compute_product_price(&cfg, PERMIT_TYPE::DAY_TICKET, start, &productStart, &productEnd);
|
|
qCritical() << QString("line=%1 price (%2-%3) :")
|
|
.arg(__LINE__)
|
|
.arg(productStart.time().toString(Qt::ISODate))
|
|
.arg(productEnd.time().toString(Qt::ISODate))
|
|
<< price;
|
|
|
|
price = get_minimal_parkingprice(&cfg, PERMIT_TYPE::DAY_TICKET, 0, start);
|
|
qCritical() << QString("line=%1 get_minimal_parkingprice:").arg(__LINE__) << price;
|
|
|
|
start.setTime(QTime(16, 0, 0));
|
|
productStart = productEnd = QDateTime();
|
|
price = compute_product_price(&cfg, PERMIT_TYPE::DAY_TICKET, start, &productStart, &productEnd);
|
|
qCritical() << QString("line=%1 price (%2-%3) :")
|
|
.arg(__LINE__)
|
|
.arg(productStart.time().toString(Qt::ISODate))
|
|
.arg(productEnd.time().toString(Qt::ISODate))
|
|
<< price;
|
|
|
|
price = get_minimal_parkingprice(&cfg, PERMIT_TYPE::DAY_TICKET, 0, start);
|
|
qCritical() << QString("line=%1 get_minimal_parkingprice:").arg(__LINE__) << price;
|
|
|
|
start.setTime(QTime(17, 0, 0));
|
|
productStart = productEnd = QDateTime();
|
|
price = compute_product_price(&cfg, PERMIT_TYPE::DAY_TICKET, start, &productStart, &productEnd);
|
|
qCritical() << QString("line=%1 price (%2-%3) :")
|
|
.arg(__LINE__)
|
|
.arg(productStart.time().toString(Qt::ISODate))
|
|
.arg(productEnd.time().toString(Qt::ISODate))
|
|
<< price;
|
|
|
|
price = get_minimal_parkingprice(&cfg, PERMIT_TYPE::DAY_TICKET, 0, start);
|
|
qCritical() << QString("line=%1 get_minimal_parkingprice:").arg(__LINE__) << price;
|
|
|
|
price = get_minimal_parkingprice(&cfg, PERMIT_TYPE::DAY_TICKET);
|
|
qCritical() << QString("line=%1 get_minimal_parkingprice:").arg(__LINE__) << price;
|
|
|
|
for (int h = 0; h < 24; ++h) {
|
|
start.setTime(QTime(h, 0, 0));
|
|
productStart = productEnd = QDateTime();
|
|
price = compute_product_price(&cfg, PERMIT_TYPE::DAY_TICKET, start, &productStart, &productEnd);
|
|
qCritical() << QString("line=%1 %2 price (%3-%4) :")
|
|
.arg(__LINE__)
|
|
.arg(start.time().toString(Qt::ISODate))
|
|
.arg(productStart.time().toString(Qt::ISODate))
|
|
.arg(productEnd.time().toString(Qt::ISODate))
|
|
<< price;
|
|
}
|
|
}
|
|
#endif
|
|
|
|
#if NEUHAUSER_CHRISTOPH_REISEN==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;
|
|
|
|
input.open("/opt/ptu5/opt/customer_746/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) {
|
|
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> stepsConfigured
|
|
= QList(std::initializer_list<int>{
|
|
360, 420, 1440, 2880, 4320, 5400, 7440});
|
|
|
|
QList<int> timeSteps = Calculator::GetInstance().GetTimeSteps(&cfg);
|
|
qCritical() << "TimeSteps" << timeSteps;
|
|
|
|
if (stepsConfigured != timeSteps) {
|
|
qCritical() << "TIME-STEPS SHOULD BE" << stepsConfigured;
|
|
return -1;
|
|
}
|
|
|
|
stepsConfigured.push_front(360); // for test run
|
|
stepsConfigured.push_back(7440);
|
|
|
|
#if 0
|
|
static const int Down = 0;
|
|
static const 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);
|
|
if (nextTimeStep != stepsConfigured.at(i+2)) {
|
|
qCritical() << "(" << __func__ << ":" << __LINE__ << ") ERROR"
|
|
<< nextTimeStep << stepsConfigured.at(i+2);
|
|
return -1;
|
|
}
|
|
qCritical() << "curTimeStep" << timeSteps.at(i) << ", nextTimeStep" << nextTimeStep;
|
|
|
|
|
|
int prevTimeStep = compute_next_timestep(&cfg, timeSteps.at(i), Down);
|
|
if (prevTimeStep != stepsConfigured.at(i)) {
|
|
qCritical() << "(" << __func__ << ":" << __LINE__ << ") ERROR"
|
|
<< prevTimeStep << stepsConfigured.at(i);
|
|
return -1;
|
|
}
|
|
qCritical() << "curTimeStep" << timeSteps.at(i) << ", prevTimeStep" << prevTimeStep;
|
|
}
|
|
#endif
|
|
|
|
QDateTime start = QDateTime::currentDateTime();
|
|
start.setTime(QTime(10, 2, 30));
|
|
start.setDate(QDate(2024, 5, 5));
|
|
|
|
// 2024-05-05 10:02:30
|
|
|
|
struct price_t costs;
|
|
double const cost[] = {600, 700, 800, 1600, 2400, 3200, 4000};
|
|
double price1 = 0;
|
|
double price2 = 0;
|
|
|
|
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) {
|
|
qCritical() << "ERROR STATUS" << costs.netto;
|
|
exit(-1);
|
|
}
|
|
price1 = costs.netto;
|
|
price2 = Calculator::GetInstance().GetCostFromDuration(&cfg, start, timeSteps.at(i));
|
|
|
|
if (price1 != price2) {
|
|
qCritical() << "ERROR DIFFERENT PRICES" << price1 << price2;
|
|
exit(-1);
|
|
}
|
|
|
|
qCritical() << "compute_price_for_parking_ticket()/GetCostFromDuration() TIME: "
|
|
<< timeSteps.at(i) << "(" << timeSteps.at(i)/60 << "h)" << "PRICE=" << price1;
|
|
|
|
|
|
std::string duration = Calculator::GetInstance().GetDurationFromCost(&cfg, 4,
|
|
start.toString(Qt::ISODate).toStdString().c_str(),
|
|
cost[i], false, true);
|
|
QDateTime d(QDateTime::fromString(QString(duration.c_str()), Qt::ISODate));
|
|
|
|
qCritical() << "start" << start.toString(Qt::ISODate)
|
|
<< "cost[" << i << "]" << cost[i] << "duration" << d.toString(Qt::ISODate) << (start.secsTo(d) + 59) / 60;
|
|
}
|
|
}
|
|
|
|
#endif
|
|
#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;
|
|
int pop_carry_over;
|
|
int pop_carry_over_time_range_id;
|
|
|
|
for (int zone=1; zone < 2; ++zone) {
|
|
//for (int t=6; t < 7; t+=20) {
|
|
switch (zone) {
|
|
case 1: {
|
|
// standard-tarif
|
|
input.open("/opt/ptu5/opt/customer_249/etc/psa_tariff/tariff01.json");
|
|
//pop_max_time = 6*60;
|
|
} break;
|
|
case 2: {
|
|
// kuzzeit-1-tarif
|
|
input.open("/opt/ptu5/opt/customer_249/etc/psa_tariff/tariff02.json");
|
|
//pop_max_time = 5*60;
|
|
} break;
|
|
case 3: {
|
|
// kuzzeit-2-tarif
|
|
input.open("/opt/ptu5/opt/customer_249/etc/psa_tariff/tariff03.json");
|
|
//pop_max_time = 6*60;
|
|
} break;
|
|
case 4: {
|
|
// kuzzeit-3-tarif
|
|
input.open("/opt/ptu5/opt/customer_249/etc/psa_tariff/tariff04.json");
|
|
//pop_max_time = 4*60;
|
|
} break;
|
|
case 5: {
|
|
// langzeit-tarif
|
|
input.open("/opt/ptu5/opt/customer_249/etc/psa_tariff/tariff05.json");
|
|
//pop_max_time = 6*60;
|
|
} break;
|
|
case 6: {
|
|
// sondertarif
|
|
input.open("/opt/ptu5/opt/customer_249/etc/psa_tariff/tariff06.json");
|
|
//pop_max_time = 4*60;
|
|
} break;
|
|
case 7: {
|
|
// wochenend-tarif
|
|
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
|
|
|
|
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;
|
|
}
|
|
|
|
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));
|
|
|
|
if (price1 != price2) {
|
|
qCritical() << "ERROR DIFFERENT PRICES" << price1 << price2;
|
|
exit(-1);
|
|
}
|
|
|
|
qCritical() << "compute_price_for_parking_ticket()/GetCostFromDuration() TIME: "
|
|
<< timeSteps.at(i) << "PRICE=" << price1;
|
|
|
|
|
|
//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));
|
|
|
|
}
|
|
|
|
}
|
|
#endif
|
|
bool fail;
|
|
QDateTime start;
|
|
|
|
for (int i=0; i < 4; ++i) {
|
|
switch (i) {
|
|
case 0:
|
|
start = QDateTime(QDate(2024, 5, 1), QTime(16, 0, 0)); // holiday
|
|
fail = false;
|
|
break;
|
|
case 1:
|
|
start = QDateTime(QDate(2024, 4, 21), QTime(16, 0, 0)); // sunday
|
|
fail = false;
|
|
break;
|
|
case 2:
|
|
start = QDateTime(QDate(2024, 4, 22), QTime(8, 0, 0)); // monday
|
|
fail = false;
|
|
break;
|
|
case 3:
|
|
start = QDateTime(QDate(2024, 4, 22), QTime(17, 30, 0)); // monday
|
|
fail = true;
|
|
break;
|
|
default:;
|
|
}
|
|
|
|
QDateTime end;
|
|
struct price_t price;
|
|
|
|
//start = QDateTime::currentDateTime();
|
|
QList<int> timeSteps;
|
|
|
|
int paymentOptionIndex = cfg.getPaymentOptionIndex(start);
|
|
if (paymentOptionIndex != -1) {
|
|
qCritical() << "paymentOptionIndex" << paymentOptionIndex;
|
|
timeSteps = Calculator::GetInstance().GetTimeSteps(&cfg, paymentOptionIndex);
|
|
qCritical() << "TimeSteps" << timeSteps;
|
|
|
|
QList<int>::const_iterator step;
|
|
for (step = timeSteps.cbegin(); step != timeSteps.cend(); ++step) {
|
|
|
|
double cost = 0;
|
|
CalcState cs;
|
|
|
|
if ((cs = compute_price_for_parking_ticket(&cfg, start, *step, end, &price))) {
|
|
cost = price.netto;
|
|
qCritical() << "step" << *step << ": cost" << cost;
|
|
} else {
|
|
if (fail == false) {
|
|
qCritical() << "<<<ERROR>>> cs =" << QString(cs);
|
|
}
|
|
}
|
|
}
|
|
} else {
|
|
qCritical() << "ERROR paymentOptionIndex =" << paymentOptionIndex;
|
|
}
|
|
}
|
|
}
|
|
if (zone == 3) {
|
|
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});
|
|
|
|
static QList<int> const timeSteps = Calculator::GetInstance().GetTimeSteps(&cfg);
|
|
qCritical() << "TimeSteps" << timeSteps;
|
|
|
|
if (stepsConfigured != timeSteps) {
|
|
qCritical() << "TIME-STEPS SHOULD BE" << stepsConfigured;
|
|
return -1;
|
|
}
|
|
|
|
bool fail;
|
|
QDateTime start;
|
|
|
|
for (int i=0; i < 5; ++i) {
|
|
switch (i) {
|
|
case 0:
|
|
start = QDateTime(QDate(2024, 5, 1), QTime(16, 0, 0)); // holiday
|
|
fail = false;
|
|
break;
|
|
case 1:
|
|
start = QDateTime(QDate(2024, 4, 21), QTime(16, 0, 0)); // sunday
|
|
fail = false;
|
|
break;
|
|
case 2:
|
|
start = QDateTime(QDate(2024, 4, 22), QTime(8, 0, 0)); // monday
|
|
fail = false;
|
|
break;
|
|
case 3:
|
|
start = QDateTime(QDate(2024, 4, 23), QTime(17, 30, 0)); // tuesday
|
|
fail = true;
|
|
break;
|
|
case 4:
|
|
start = QDateTime(QDate(2024, 4, 24), QTime(7, 30, 0)); // wednesday
|
|
fail = true;
|
|
break;
|
|
default:;
|
|
}
|
|
|
|
QDateTime end;
|
|
struct price_t price;
|
|
|
|
//start = QDateTime::currentDateTime();
|
|
QList<int> timeSteps;
|
|
|
|
int paymentOptionIndex = cfg.getPaymentOptionIndex(start);
|
|
if (paymentOptionIndex != -1) {
|
|
qCritical() << "paymentOptionIndex" << paymentOptionIndex;
|
|
timeSteps = Calculator::GetInstance().GetTimeSteps(&cfg, paymentOptionIndex);
|
|
qCritical() << "TimeSteps" << timeSteps;
|
|
|
|
QList<int>::const_iterator step;
|
|
for (step = timeSteps.cbegin(); step != timeSteps.cend(); ++step) {
|
|
|
|
double cost = 0;
|
|
CalcState cs;
|
|
|
|
if ((cs = compute_price_for_parking_ticket(&cfg, start, *step, end, &price))) {
|
|
cost = price.netto;
|
|
qCritical() << "step" << *step << ": cost" << cost;
|
|
} else {
|
|
if (fail == false) {
|
|
qCritical() << "<<<ERROR>>> cs =" << QString(cs);
|
|
}
|
|
}
|
|
}
|
|
} else {
|
|
qCritical() << "ERROR paymentOptionIndex =" << paymentOptionIndex;
|
|
}
|
|
}
|
|
|
|
}
|
|
if (zone == 4) {
|
|
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});
|
|
|
|
static QList<int> const timeSteps = Calculator::GetInstance().GetTimeSteps(&cfg);
|
|
qCritical() << "TimeSteps" << timeSteps;
|
|
|
|
if (stepsConfigured != timeSteps) {
|
|
qCritical() << "TIME-STEPS SHOULD BE" << stepsConfigured;
|
|
return -1;
|
|
}
|
|
|
|
bool fail;
|
|
QDateTime start;
|
|
|
|
for (int i=4; i < 5; ++i) {
|
|
switch (i) {
|
|
case 0:
|
|
start = QDateTime(QDate(2024, 5, 1), QTime(16, 0, 0)); // holiday
|
|
fail = false;
|
|
break;
|
|
case 1:
|
|
start = QDateTime(QDate(2024, 4, 21), QTime(16, 0, 0)); // sunday
|
|
fail = false;
|
|
break;
|
|
case 2:
|
|
start = QDateTime(QDate(2024, 4, 22), QTime(8, 0, 0)); // monday
|
|
fail = false;
|
|
break;
|
|
case 3:
|
|
start = QDateTime(QDate(2024, 4, 23), QTime(17, 30, 0)); // tuesday
|
|
fail = true;
|
|
break;
|
|
case 4:
|
|
start = QDateTime(QDate(2024, 4, 24), QTime(7, 30, 0)); // wednesday
|
|
fail = true;
|
|
break;
|
|
default:;
|
|
}
|
|
|
|
QDateTime end;
|
|
struct price_t price;
|
|
|
|
//start = QDateTime::currentDateTime();
|
|
QList<int> timeSteps;
|
|
|
|
int paymentOptionIndex = cfg.getPaymentOptionIndex(start);
|
|
if (paymentOptionIndex != -1) {
|
|
qCritical() << "paymentOptionIndex" << paymentOptionIndex;
|
|
timeSteps = Calculator::GetInstance().GetTimeSteps(&cfg, paymentOptionIndex);
|
|
qCritical() << "TimeSteps" << timeSteps;
|
|
|
|
QList<int>::const_iterator step;
|
|
for (step = timeSteps.cbegin(); step != timeSteps.cend(); ++step) {
|
|
|
|
double cost = 0;
|
|
CalcState cs;
|
|
|
|
if ((cs = compute_price_for_parking_ticket(&cfg, start, *step, end, &price))) {
|
|
cost = price.netto;
|
|
qCritical() << "step" << *step << ": cost" << cost;
|
|
} else {
|
|
if (fail == false) {
|
|
qCritical() << "<<<ERROR>>> cs =" << QString(cs);
|
|
}
|
|
}
|
|
}
|
|
} else {
|
|
qCritical() << "ERROR paymentOptionIndex =" << paymentOptionIndex;
|
|
}
|
|
}
|
|
}
|
|
if (zone == 5) { // langzeit-tarif
|
|
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() << zone << " pop_min_time: " << pop_min_time;
|
|
qCritical() << zone << " pop_max_time: " << pop_max_time;
|
|
qCritical() << zone << " pop_min_price: " << pop_min_price;
|
|
qCritical() << zone << " pop_max_price: " << pop_max_price;
|
|
qCritical() << zone << "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, 4320, 10080
|
|
});
|
|
|
|
static QList<int> const timeSteps = Calculator::GetInstance().GetTimeSteps(&cfg);
|
|
qCritical() << "( TimeSteps :" << __LINE__ << ")" << timeSteps;
|
|
|
|
if (stepsConfigured != timeSteps) {
|
|
qCritical() << "TIME-STEPS SHOULD BE" << stepsConfigured;
|
|
return -1;
|
|
}
|
|
|
|
bool fail;
|
|
QDateTime start = QDateTime::currentDateTime();
|
|
|
|
int paymentOptionIndex = cfg.getPaymentOptionIndex(start);
|
|
if (paymentOptionIndex != -1) {
|
|
QDateTime end;
|
|
struct price_t price;
|
|
|
|
qCritical() << "paymentOptionIndex" << paymentOptionIndex;
|
|
|
|
QList<int>::const_iterator step;
|
|
int i = 0;
|
|
for (step = timeSteps.cbegin(); step != timeSteps.cend(); ++step) {
|
|
if (++i < 16) continue;
|
|
|
|
double cost = 0;
|
|
CalcState cs;
|
|
|
|
if ((cs = compute_price_for_parking_ticket(&cfg, start, *step, end, &price))) {
|
|
cost = price.netto;
|
|
qCritical() << "step" << *step << ": cost" << cost;
|
|
} else {
|
|
if (fail == false) {
|
|
qCritical() << "<<<ERROR>>> cs =" << QString(cs);
|
|
}
|
|
}
|
|
exit(0);
|
|
}
|
|
} else {
|
|
qCritical() << "ERROR paymentOptionIndex =" << paymentOptionIndex;
|
|
}
|
|
|
|
}
|
|
if (zone == 6) { // sondertarif: 24h ticket wohnmobile
|
|
// 8 euro; hoechstparkdauer 24h
|
|
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() << zone << " pop_min_time: " << pop_min_time;
|
|
qCritical() << zone << " pop_max_time: " << pop_max_time;
|
|
qCritical() << zone << " pop_min_price: " << pop_min_price;
|
|
qCritical() << zone << " pop_max_price: " << pop_max_price;
|
|
qCritical() << zone << "pop_daily_card_price: " << pop_daily_card_price;
|
|
|
|
QDateTime start = QDateTime::currentDateTime();
|
|
start.setTime(QTime(0, 0, 0));
|
|
|
|
for (int i=0; i<1440; ++i) {
|
|
|
|
QDateTime productStart;
|
|
QDateTime productEnd;
|
|
|
|
int v = compute_product_price(&cfg, PERMIT_TYPE::TWENTY_FOUR_HOURS_TICKET, start, &productStart, &productEnd);
|
|
if (v != 800) {
|
|
qCritical() << "ERROR [" << i << "]" << "price 24h-ticket"
|
|
<< v << productStart.toString(Qt::ISODate)
|
|
<< productEnd.toString(Qt::ISODate);
|
|
exit(-1);
|
|
} else {
|
|
|
|
int const secs = productStart.secsTo(productEnd);
|
|
if (secs != 86400) {
|
|
qCritical() << "ERROR" << i << secs << v
|
|
<< productStart.toString(Qt::ISODate)
|
|
<< productEnd.toString(Qt::ISODate);
|
|
exit(-1);
|
|
} else {
|
|
qCritical() << i << secs << v
|
|
<< productStart.toString(Qt::ISODate)
|
|
<< productEnd.toString(Qt::ISODate);
|
|
}
|
|
|
|
}
|
|
start = start.addSecs(60);
|
|
}
|
|
}
|
|
if (zone == 7) {
|
|
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() << zone << " pop_min_time: " << pop_min_time;
|
|
qCritical() << zone << " pop_max_time: " << pop_max_time;
|
|
qCritical() << zone << " pop_min_price: " << pop_min_price;
|
|
qCritical() << zone << " pop_max_price: " << pop_max_price;
|
|
qCritical() << zone << "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 :" << __LINE__ << ")" << timeSteps;
|
|
|
|
if (stepsConfigured != timeSteps) {
|
|
qCritical() << "TIME-STEPS SHOULD BE" << stepsConfigured;
|
|
return -1;
|
|
}
|
|
|
|
QDateTime start = QDateTime::currentDateTime();
|
|
|
|
// testing
|
|
start.setDate(QDate(2024, 5, 5));
|
|
start.setTime(QTime(16, 0, 0));
|
|
|
|
struct price_t costs;
|
|
double price1 = 0;
|
|
double price2 = 0;
|
|
|
|
CalcState cs;
|
|
for (int i = 13, 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);
|
|
qCritical() << endl;
|
|
}
|
|
|
|
exit(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;
|
|
//}
|
|
|
|
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));
|
|
|
|
if (price1 != price2) {
|
|
qCritical() << "ERROR DIFFERENT PRICES" << price1 << price2;
|
|
exit(-1);
|
|
}
|
|
|
|
qCritical() << "compute_price_for_parking_ticket()/GetCostFromDuration() TIME: "
|
|
<< timeSteps.at(i) << "PRICE=" << price1;
|
|
|
|
|
|
//std::string duration = Calculator::GetInstance().GetDurationFromCost(&cfg, 4,
|
|
// start.toString(Qt::ISODate).toStdString().c_str(),
|
|
// cost[i], false, true);
|
|
//qCritical() << "duration" << duration.c_str();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
#endif
|
|
|
|
#if SCHOENAU_KOENIGSEE==1
|
|
for (int zone=1; zone < 3; ++zone) {
|
|
std::ifstream input;
|
|
|
|
if (zone == 1) {
|
|
input.open("/opt/ptu5/opt/customer_332/etc/psa_tariff/tariff01.json");
|
|
}
|
|
if (zone == 2) {
|
|
input.open("/opt/ptu5/opt/customer_332/etc/psa_tariff/tariff02.json");
|
|
}
|
|
|
|
qCritical() << "--------------------";
|
|
qCritical() << " ZONE" << zone;
|
|
qCritical() << "--------------------";
|
|
|
|
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 zone" << zone << "file";
|
|
|
|
int minParkingTime = get_minimal_parkingtime(&cfg);
|
|
qCritical() << "minimal_parking_time" << minParkingTime;
|
|
|
|
QDateTime start = QDateTime::currentDateTime();
|
|
|
|
// zone 1
|
|
//int timeSteps[] = {60, 180, 1440, 2880, 4320, 5670, 7200, 8640, 10080, 11520, 12960, 14400};
|
|
|
|
static QList<int> const timeSteps = Calculator::GetInstance().GetTimeSteps(&cfg);
|
|
qCritical() << "TimeSteps" << timeSteps;
|
|
|
|
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));
|
|
qCritical() << "zone" << zone
|
|
<< "GetCostFromDuration() time: " << timeSteps.at(i)
|
|
<< "(" << timeSteps.at(i)/60 << "h)"
|
|
<< "price=" << price;
|
|
|
|
switch(timeSteps.at(i)) {
|
|
case 60:
|
|
if (zone == 1) {
|
|
if (price == 300.0) {
|
|
continue;
|
|
}
|
|
}
|
|
if (zone == 2) {
|
|
if (price == 300.0) {
|
|
continue;
|
|
}
|
|
}
|
|
if (zone == 3) {
|
|
if (price == 200.0) {
|
|
continue;
|
|
}
|
|
}
|
|
break;
|
|
case 180:
|
|
if (zone == 1) {
|
|
if (price == 700.0) {
|
|
continue;
|
|
}
|
|
}
|
|
if (zone == 2) {
|
|
if (price == 500.0) {
|
|
continue;
|
|
}
|
|
}
|
|
if (zone == 3) {
|
|
if (price == 400.0) {
|
|
continue;
|
|
}
|
|
}
|
|
break;
|
|
case 1440:
|
|
if (zone == 1) {
|
|
if (price == 900.0) {
|
|
continue;
|
|
}
|
|
}
|
|
if (zone == 2) {
|
|
if (price == 600.0) {
|
|
continue;
|
|
}
|
|
}
|
|
if (zone == 3) {
|
|
if (price == 500.0) {
|
|
continue;
|
|
}
|
|
}
|
|
break;
|
|
case 2880:
|
|
if (zone == 1) {
|
|
if (price == 1800.0) {
|
|
continue;
|
|
}
|
|
}
|
|
if (zone == 2) {
|
|
if (price == 1200.0) {
|
|
continue;
|
|
}
|
|
}
|
|
break;
|
|
case 4320:
|
|
if (zone == 1) {
|
|
if (price == 2700.0) {
|
|
continue;
|
|
}
|
|
}
|
|
if (zone == 2) {
|
|
if (price == 1800.0) {
|
|
continue;
|
|
}
|
|
}
|
|
break;
|
|
case 5760:
|
|
if (zone == 1) {
|
|
if (price == 3600.0) {
|
|
continue;
|
|
}
|
|
}
|
|
if (zone == 2) {
|
|
if (price == 2400.0) {
|
|
continue;
|
|
}
|
|
}
|
|
break;
|
|
case 7200:
|
|
if (zone == 1) {
|
|
if (price == 4500.0) {
|
|
continue;
|
|
}
|
|
}
|
|
if (zone == 2) {
|
|
if (price == 3000.0) {
|
|
continue;
|
|
}
|
|
}
|
|
break;
|
|
case 8640:
|
|
if (zone == 1) {
|
|
if (price == 5400.0) {
|
|
continue;
|
|
}
|
|
}
|
|
if (zone == 2) {
|
|
if (price == 3600.0) {
|
|
continue;
|
|
}
|
|
}
|
|
break;
|
|
case 10080:
|
|
if (zone == 1) {
|
|
if (price == 6300.0) {
|
|
continue;
|
|
}
|
|
}
|
|
if (zone == 2) {
|
|
if (price == 4200.0) {
|
|
continue;
|
|
}
|
|
}
|
|
break;
|
|
case 11520:
|
|
if (zone == 1) {
|
|
if (price == 7200.0) {
|
|
continue;
|
|
}
|
|
}
|
|
if (zone == 2) {
|
|
if (price == 4800.0) {
|
|
continue;
|
|
}
|
|
}
|
|
break;
|
|
case 12960:
|
|
if (zone == 1) {
|
|
if (price == 8100.0) {
|
|
continue;
|
|
}
|
|
}
|
|
if (zone == 2) {
|
|
if (price == 5400.0) {
|
|
continue;
|
|
}
|
|
}
|
|
break;
|
|
case 14400:
|
|
if (zone == 1) {
|
|
if (price == 9000.0) {
|
|
continue;
|
|
}
|
|
}
|
|
if (zone == 2) {
|
|
if (price == 6000.0) {
|
|
continue;
|
|
}
|
|
}
|
|
break;
|
|
default:
|
|
qCritical() << "ERROR zone" << zone
|
|
<< "GetCostFromDuration() time: " << timeSteps.at(i)
|
|
<< "(" << timeSteps.at(i)/60 << "h)"
|
|
<< "price=" << price;
|
|
exit(-1);
|
|
}
|
|
|
|
}
|
|
}
|
|
}
|
|
#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<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) {
|
|
//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;
|
|
|
|
//if (*step != 30) continue;
|
|
|
|
double cost = 0;
|
|
|
|
if (compute_price_for_parking_ticket(&cfg, start, *step, end, &price)) {
|
|
cost = price.netto;
|
|
|
|
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[
|
|
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;
|
|
//return -1;
|
|
}
|
|
} else
|
|
if (offset < 9*60) { // [8:00 - 9: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;
|
|
//return -1;
|
|
}
|
|
} else
|
|
if (offset < 10*60) {
|
|
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;
|
|
//return -1;
|
|
}
|
|
} else
|
|
if (offset < 11*60) {
|
|
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;
|
|
//return -1;
|
|
}
|
|
} else
|
|
if (offset < 12*60) {
|
|
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;
|
|
//return -1;
|
|
}
|
|
} else
|
|
if (offset < 13*60) {
|
|
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;
|
|
//return -1;
|
|
}
|
|
} else
|
|
if (offset < 14*60) {
|
|
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;
|
|
//return -1;
|
|
}
|
|
} else
|
|
if (offset < 15*60) {
|
|
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;
|
|
//return -1;
|
|
}
|
|
} else
|
|
if (offset < 16*60) {
|
|
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;
|
|
//return -1;
|
|
}
|
|
} else
|
|
if (offset < 17*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;
|
|
//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;
|
|
// return -1;
|
|
}
|
|
} else {
|
|
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;
|
|
}
|
|
|
|
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
|
|
<< "end" << end2.toString(Qt::ISODate);
|
|
if (end != end2) {
|
|
qCritical() << end.toString(Qt::ISODate)
|
|
<< end2.toString(Qt::ISODate);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
#if 0
|
|
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();
|
|
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 = 0; offset <= 0; ++offset) {
|
|
//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;
|
|
|
|
//#if COST_FROM_DURATION==0
|
|
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;
|
|
|
|
// if (cost_soll != cost) {
|
|
//qCritical() << "ERROR" << __func__ << ":" << __LINE__
|
|
// << "cost_soll" << cost_soll << "cost_ist" << cost;
|
|
//break;
|
|
// }
|
|
// if (duration != duration_ist) {
|
|
//qCritical() << "ERROR" << __func__ << ":" << __LINE__
|
|
// << "duration_soll" << duration << "duration_ist" << duration_ist;
|
|
//break;
|
|
// }
|
|
|
|
//#else
|
|
//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())) {
|
|
//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()));
|
|
|
|
//#endif // COST_FROM_DURATION
|
|
|
|
}
|
|
}
|
|
#endif // 0
|
|
#endif
|
|
|
|
#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) {
|
|
//int minParkingTime = get_minimal_parkingtime(&cfg);
|
|
QList<int> timeSteps = Calculator::GetInstance().GetTimeSteps(&cfg);
|
|
qCritical() << timeSteps;
|
|
int Down = 0;
|
|
int Up = 1;
|
|
//compute_next_timestep(&cfg, )
|
|
|
|
QDateTime const start = QDateTime::currentDateTime();
|
|
int paymentOptionIndex = cfg.getPaymentOptionIndex(start);
|
|
|
|
if (paymentOptionIndex < 0) {
|
|
qCritical() << "ERROR paymentOptionIndex" << paymentOptionIndex
|
|
<< "< 0 for start" << start.toString(Qt::ISODate);
|
|
exit(-1);
|
|
}
|
|
|
|
QSet<uint32_t> const prices{700, 1400, 2100, 2800, 3500, 4200, 4900};
|
|
|
|
for (int i=0; i<timeSteps.size(); ++i) {
|
|
int nextTimeStep = compute_next_timestep(&cfg, timeSteps.at(i), Up);
|
|
qCritical() << "nextTimeStep" << nextTimeStep;
|
|
|
|
uint32_t price = Calculator::GetInstance().GetPriceForTimeStep(&cfg, timeSteps.at(i), paymentOptionIndex);
|
|
uint32_t duration = Calculator::GetInstance().GetDurationForPrice(&cfg, price);
|
|
|
|
if (!prices.contains(price)) {
|
|
qCritical() << "ERROR nextTimeStep relative to start:"
|
|
<< duration << start.addSecs(duration * 60).toString(Qt::ISODate)
|
|
<< "(price so far:" << price << ")";
|
|
exit(-1);
|
|
}
|
|
qCritical() << "nextTimeStep relative to start:"
|
|
<< duration << start.addSecs(duration * 60).toString(Qt::ISODate)
|
|
<< "(price so far:" << price << ")";
|
|
|
|
}
|
|
}
|
|
#endif
|
|
|
|
#if NEUHAUSER_NORDISCHES_AUSBILDUNGSZENTRUM==1
|
|
std::ifstream input("/opt/ptu5/opt/customer_744/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) {
|
|
|
|
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;
|
|
|
|
|
|
QDateTime s(QDate(2023, 11, 30), QTime());
|
|
QDateTime end;
|
|
struct price_t price;
|
|
|
|
for (int offset = 480; offset < 1200; ++offset) {
|
|
QDateTime start = s.addSecs(offset * 60);
|
|
CalcState cs = compute_price_for_daily_ticket(&cfg, start, end,
|
|
PERMIT_TYPE::DAY_TICKET_ADULT,
|
|
&price);
|
|
if (price.netto != 800) {
|
|
qCritical() << "ERROR(ADULT) start=" << start.toString(Qt::ISODate)
|
|
<< "end" << end.toString(Qt::ISODate) << "price (ADULT)" << price.netto;
|
|
exit(-1);
|
|
}
|
|
qCritical() << "start=" << start.toString(Qt::ISODate)
|
|
<< "end" << end.toString(Qt::ISODate) << "price (ADULT)" << price.netto;
|
|
}
|
|
|
|
for (int offset = 480; offset < 1200; ++offset) {
|
|
QDateTime start = s.addSecs(offset * 60);
|
|
CalcState cs = compute_price_for_daily_ticket(&cfg, start, end,
|
|
PERMIT_TYPE::DAY_TICKET_TEEN,
|
|
&price);
|
|
if (price.netto != 400) {
|
|
qCritical() << "ERROR(TEEN) start=" << start.toString(Qt::ISODate)
|
|
<< "end" << end.toString(Qt::ISODate) << "price (TEEN)" << price.netto;
|
|
exit(-1);
|
|
}
|
|
qCritical() << "start=" << start.toString(Qt::ISODate)
|
|
<< "end" << end.toString(Qt::ISODate) << "price (TEEN)" << price.netto;
|
|
}
|
|
}
|
|
#undef ADULT
|
|
#undef TEEN
|
|
#endif
|
|
|
|
#if NEUHAUSER_LINSINGER_MASCHINENBAU==1
|
|
std::ifstream input("/opt/ptu5/opt/customer_741/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) {
|
|
int const price = compute_product_price(&cfg, PERMIT_TYPE::FOOD_STAMP);
|
|
if (price != 300) {
|
|
qCritical() << "ERROR price food stamp" << price;
|
|
exit(-1);
|
|
|
|
}
|
|
qCritical() << "price food stamp" << price;
|
|
}
|
|
#endif
|
|
|
|
#if NEUHAUSER_KORNEUBURG==1
|
|
std::ifstream input("/opt/ptu5/opt/customer_714/etc/psa_tariff/tariff01.json");
|
|
int pop_max_time;
|
|
|
|
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);
|
|
|
|
double cost = Calculator::GetInstance().GetCostFromDuration(&cfg, 3, start, end, duration, nextDay, prePaid);
|
|
//Q_ASSERT(cost == duration*2.5);
|
|
//qCritical() << "";
|
|
qCritical() << "start" << start.toString(Qt::ISODate)
|
|
<< "end" << end.toString(Qt::ISODate)
|
|
<< "duration" << duration
|
|
<< "cost" << cost;
|
|
|
|
switch(duration) {
|
|
case 30:
|
|
if (cost == 60.0) {
|
|
continue;
|
|
}
|
|
break;
|
|
case 35:
|
|
if (cost == 70.0) {
|
|
continue;
|
|
}
|
|
break;
|
|
case 40:
|
|
if (cost == 80.0) {
|
|
continue;
|
|
}
|
|
break;
|
|
case 45:
|
|
if (cost == 90.0) {
|
|
continue;
|
|
}
|
|
break;
|
|
case 50:
|
|
if (cost == 100.0) {
|
|
continue;
|
|
}
|
|
break;
|
|
case 55:
|
|
if (cost == 110.0) {
|
|
continue;
|
|
}
|
|
break;
|
|
case 60:
|
|
if (cost == 120.0) {
|
|
continue;
|
|
}
|
|
break;
|
|
case 65:
|
|
if (cost == 130.0) {
|
|
continue;
|
|
}
|
|
break;
|
|
case 70:
|
|
if (cost == 140.0) {
|
|
continue;
|
|
}
|
|
break;
|
|
case 75:
|
|
if (cost == 150.0) {
|
|
continue;
|
|
}
|
|
break;
|
|
case 80:
|
|
if (cost == 160.0) {
|
|
continue;
|
|
}
|
|
break;
|
|
case 85:
|
|
if (cost == 170.0) {
|
|
continue;
|
|
}
|
|
break;
|
|
case 90:
|
|
if (cost == 180.0) {
|
|
continue;
|
|
}
|
|
break;
|
|
case 95:
|
|
if (cost == 190.0) {
|
|
continue;
|
|
}
|
|
break;
|
|
case 100:
|
|
if (cost == 200.0) {
|
|
continue;
|
|
}
|
|
break;
|
|
case 105:
|
|
if (cost == 210.0) {
|
|
continue;
|
|
}
|
|
break;
|
|
case 110:
|
|
if (cost == 220.0) {
|
|
continue;
|
|
}
|
|
break;
|
|
case 115:
|
|
if (cost == 230.0) {
|
|
continue;
|
|
}
|
|
break;
|
|
case 120:
|
|
if (cost == 240.0) {
|
|
continue;
|
|
}
|
|
break;
|
|
case 125:
|
|
if (cost == 250.0) {
|
|
continue;
|
|
}
|
|
break;
|
|
case 130:
|
|
if (cost == 260.0) {
|
|
continue;
|
|
}
|
|
break;
|
|
case 135:
|
|
if (cost == 270.0) {
|
|
continue;
|
|
}
|
|
break;
|
|
case 140:
|
|
if (cost == 280.0) {
|
|
continue;
|
|
}
|
|
break;
|
|
case 145:
|
|
if (cost == 290.0) {
|
|
continue;
|
|
}
|
|
break;
|
|
case 150:
|
|
if (cost == 300.0) {
|
|
continue;
|
|
}
|
|
break;
|
|
case 155:
|
|
if (cost == 310.0) {
|
|
continue;
|
|
}
|
|
break;
|
|
case 160:
|
|
if (cost == 320.0) {
|
|
continue;
|
|
}
|
|
break;
|
|
case 165:
|
|
if (cost == 330.0) {
|
|
continue;
|
|
}
|
|
break;
|
|
case 170:
|
|
if (cost == 340.0) {
|
|
continue;
|
|
}
|
|
break;
|
|
case 175:
|
|
if (cost == 350.0) {
|
|
continue;
|
|
}
|
|
break;
|
|
case 180:
|
|
if (cost == 360.0) {
|
|
continue;
|
|
}
|
|
break;
|
|
default:
|
|
qCritical() << "ERROR(1) start" << start.toString(Qt::ISODate)
|
|
<< "end" << end.toString(Qt::ISODate)
|
|
<< "duration" << duration
|
|
<< "cost" << cost;
|
|
exit(-1);
|
|
}
|
|
|
|
//std::string duration = Calculator::GetInstance().GetDurationFromCost(&cfg, 3, start.toString(Qt::ISODate).toStdString().c_str(), cost);
|
|
//Q_ASSERT(cost == duration*2.5);
|
|
//qCritical() << "start" << start.toString(Qt::ISODate)
|
|
// << "cost" << cost
|
|
// << "until" << duration.c_str() << start.secsTo(QDateTime::fromString(duration.c_str(), Qt::ISODate)) / 60;
|
|
}
|
|
}
|
|
|
|
Configuration::SpecialDaysType specialDays = cfg.SpecialDays;
|
|
for (Configuration::SpecialDaysType::const_iterator it = specialDays.cbegin();
|
|
it != specialDays.cend(); ++it) {
|
|
QDate d = QDate::fromString(QString::fromStdString(it->second.ped_date_start), Qt::ISODate);
|
|
s.setDate(d);
|
|
s.setTime(QTime(12, 0, 0));
|
|
int duration = 30;
|
|
double cost = Calculator::GetInstance().GetCostFromDuration(&cfg, 3, s, end, duration, nextDay, prePaid);
|
|
if (cost != 60.0) {
|
|
qCritical() << "ERROR(2) start" << s.toString(Qt::ISODate)
|
|
<< "end" << end.toString(Qt::ISODate)
|
|
<< "duration" << duration
|
|
<< "cost" << cost;
|
|
exit(-1);
|
|
}
|
|
qCritical() << "start" << s.toString(Qt::ISODate)
|
|
<< "end" << end.toString(Qt::ISODate)
|
|
<< "duration" << duration
|
|
<< "cost" << cost;
|
|
}
|
|
|
|
}
|
|
}
|
|
return 0;
|
|
|
|
#endif
|
|
|
|
#if SZEGED==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;
|
|
|
|
for (int zone = 1; zone < 2; ++zone) {
|
|
//for (int t=6; t < 7; t+=20) {
|
|
switch (zone) {
|
|
case 1: {
|
|
input.open("/opt/ptu5/opt/customer_281/etc/psa_tariff/tariff01.json");
|
|
//pop_max_time = 6*60;
|
|
} break;
|
|
case 2: {
|
|
input.open("/opt/ptu5/opt/customer_281/etc/psa_tariff/tariff02.json");
|
|
//pop_max_time = 5*60;
|
|
} break;
|
|
case 3: {
|
|
input.open("/opt/ptu5/opt/customer_281/etc/psa_tariff/tariff03.json");
|
|
//pop_max_time = 6*60;
|
|
} break;
|
|
case 4: {
|
|
input.open("/opt/ptu5/opt/customer_281/etc/psa_tariff/tariff04.json");
|
|
//pop_max_time = 4*60;
|
|
} break;
|
|
case 5: {
|
|
input.open("/opt/ptu5/opt/customer_281/etc/psa_tariff/tariff05.json");
|
|
//pop_max_time = 6*60;
|
|
} break;
|
|
case 6: {
|
|
input.open("/opt/ptu5/opt/customer_281/etc/psa_tariff/tariff06.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
|
|
|
|
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;
|
|
|
|
|
|
pop_daily_card_price = compute_product_price(&cfg, PERMIT_TYPE::DAY_TICKET);
|
|
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;
|
|
|
|
{
|
|
// zone 1 (lila)
|
|
QDateTime s(QDate(2024, 3, 26), QTime());
|
|
QDateTime end;
|
|
int cnt = 1;
|
|
if (zone == 1) {
|
|
m.insert(5, pop_min_price);
|
|
m.insert(10, pop_min_price); // 42
|
|
|
|
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);
|
|
m.insert(360, pop_max_price); // 990
|
|
|
|
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) {
|
|
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, 542);
|
|
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
|
|
|
|
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);
|
|
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) {
|
|
m.insert(5, pop_min_price);
|
|
m.insert(10, pop_min_price); // 163
|
|
|
|
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) {
|
|
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);
|
|
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) {
|
|
m.insert(5, pop_min_price);
|
|
m.insert(10, pop_min_price); // 163
|
|
|
|
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);
|
|
}
|
|
|
|
struct price_t price;
|
|
for (int duration = pop_min_time; duration <= pop_max_time; duration += 5) {
|
|
for (int offset = 480; offset < 1080; ++offset) {
|
|
QDateTime start = s.addSecs(offset * 60);
|
|
end = QDateTime();
|
|
price.netto = 0;
|
|
if (compute_price_for_parking_ticket(&cfg, start, duration, end, &price)) {
|
|
double cost = price.netto;
|
|
|
|
//qCritical() << start.toString(Qt::ISODate) << end.toString(Qt::ISODate)
|
|
// << duration << cost;
|
|
|
|
if (cost != m[duration]) {
|
|
qCritical() << "ERROR computing_price_for_parking_ticket"
|
|
<< "duration" << duration
|
|
<< "HAVE cost" << cost
|
|
<< "SHOULD HAVE cost" << m[duration];
|
|
return -1;
|
|
}
|
|
} 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;
|
|
|
|
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;
|
|
return -1;
|
|
}
|
|
} else {
|
|
qCritical() << "ERROR computing_price_for_daily_ticket AT"
|
|
<< "start" << start.toString(Qt::ISODate);
|
|
return -1;
|
|
}
|
|
|
|
// this->getDayTicketPrice(PERMIT_TYPE::DAY_TICKET)
|
|
|
|
// 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;
|
|
// }
|
|
|
|
// ++cnt;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
return 0;
|
|
|
|
#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_from\":\"00:00:00\",\"pedwt_time_to\":\"00:00:00\",\"pedwt_price\":0},{\"pedwt_id\":2182,\"pedwt_period_exc_day_id\":2019,\"pedwt_time_from\":\"00:00:00\",\"pedwt_time_to\":\"00:00:00\",\"pedwt_price\":0},{\"pedwt_id\":2183,\"pedwt_period_exc_day_id\":2020,\"pedwt_time_from\":\"00:00:00\",\"pedwt_time_to\":\"00:00:00\",\"pedwt_price\":0},{\"pedwt_id\":2184,\"pedwt_period_exc_day_id\":2021,\"pedwt_time_from\":\"00:00:00\",\"pedwt_time_to\":\"00:00:00\",\"pedwt_price\":0},{\"pedwt_id\":2185,\"pedwt_period_exc_day_id\":2023,\"pedwt_time_from\":\"00:00:00\",\"pedwt_time_to\":\"00:00:00\",\"pedwt_price\":0},{\"pedwt_id\":2188,\"pedwt_period_exc_day_id\":2031,\"pedwt_time_from\":\"00:00:00\",\"pedwt_time_to\":\"00:00:00\",\"pedwt_price\":0},{\"pedwt_id\":2189,\"pedwt_period_exc_day_id\":2029,\"pedwt_time_from\":\"00:00:00\",\"pedwt_time_to\":\"00:00:00\",\"pedwt_price\":0},{\"pedwt_id\":2191,\"pedwt_period_exc_day_id\":2016,\"pedwt_time_from\":\"00:00:00\",\"pedwt_time_to\":\"00:00:00\",\"pedwt_price\":0},{\"pedwt_id\":2192,\"pedwt_period_exc_day_id\":2033,\"pedwt_time_from\":\"00:00:00\",\"pedwt_time_to\":\"00:00:00\",\"pedwt_price\":0},{\"pedwt_id\":2194,\"pedwt_period_exc_day_id\":2034,\"pedwt_time_from\":\"00:00:00\",\"pedwt_time_to\":\"00:00:00\",\"pedwt_price\":0},{\"pedwt_id\":2196,\"pedwt_period_exc_day_id\":2035,\"pedwt_time_from\":\"00:00:00\",\"pedwt_time_to\":\"00:00:00\",\"pedwt_price\":0},{\"pedwt_id\":2198,\"pedwt_period_exc_day_id\":2036,\"pedwt_time_from\":\"00:00:00\",\"pedwt_time_to\":\"00:00:00\",\"pedwt_price\":0},{\"pedwt_id\":2200,\"pedwt_period_exc_day_id\":2037,\"pedwt_time_from\":\"00:00:00\",\"pedwt_time_to\":\"00:00:00\",\"pedwt_price\":0},{\"pedwt_id\":2202,\"pedwt_period_exc_day_id\":2038,\"pedwt_time_from\":\"00:00:00\",\"pedwt_time_to\":\"00:00:00\",\"pedwt_price\":0},{\"pedwt_id\":2204,\"pedwt_period_exc_day_id\":2039,\"pedwt_time_from\":\"00:00:00\",\"pedwt_time_to\":\"00:00:00\",\"pedwt_price\":0},{\"pedwt_id\":2206,\"pedwt_period_exc_day_id\":2040,\"pedwt_time_from\":\"00:00:00\",\"pedwt_time_to\":\"00:00:00\",\"pedwt_price\":0},{\"pedwt_id\":2219,\"pedwt_period_exc_day_id\":2041,\"pedwt_time_from\":\"00:00:00\",\"pedwt_time_to\":\"00:00:00\",\"pedwt_price\":0},{\"pedwt_id\":2220,\"pedwt_period_exc_day_id\":2042,\"pedwt_time_from\":\"00:00:00\",\"pedwt_time_to\":\"00:00:00\",\"pedwt_price\":0},{\"pedwt_id\":2221,\"pedwt_period_exc_day_id\":2043,\"pedwt_time_from\":\"00:00:00\",\"pedwt_time_to\":\"00:00:00\",\"pedwt_price\":0},{\"pedwt_id\":2222,\"pedwt_period_exc_day_id\":2044,\"pedwt_time_from\":\"00:00:00\",\"pedwt_time_to\":\"00:00:00\",\"pedwt_price\":0},{\"pedwt_id\":2223,\"pedwt_period_exc_day_id\":2045,\"pedwt_time_from\":\"00:00:00\",\"pedwt_time_to\":\"01:00:00\",\"pedwt_price\":0},{\"pedwt_id\":2224,\"pedwt_period_exc_day_id\":2046,\"pedwt_time_from\":\"00:00:00\",\"pedwt_time_to\":\"00:00:00\",\"pedwt_price\":0}],\"SpecialDays\":[{\"ped_id\":11,\"ped_label\":\"Christmas 1st day\",\"ped_date_start\":\"2022-12-25\",\"ped_date_end\":\"2022-12-25\",\"ped_period_special_day_id\":2,\"ped_year\":0},{\"ped_id\":13,\"ped_label\":\"Christmas 2nd day\",\"ped_date_start\":\"2022-12-26\",\"ped_date_end\":\"2022-12-26\",\"ped_period_special_day_id\":2,\"ped_year\":0},{\"ped_id\":14,\"ped_label\":\"Republic Day (Hungary)\",\"ped_date_start\":\"2022-10-23\",\"ped_date_end\":\"2022-10-23\",\"ped_period_special_day_id\":2,\"ped_year\":0},{\"ped_id\":2016,\"ped_label\":\"Christmas (Sunday)\",\"ped_date_start\":\"2022-12-24\",\"ped_date_end\":\"2022-12-24\",\"ped_period_special_day_id\":2,\"ped_year\":2023},{\"ped_id\":2017,\"ped_label\":\"Holiday (Hungary)\",\"ped_date_start\":\"2022-12-27\",\"ped_date_end\":\"2022-12-27\",\"ped_period_special_day_id\":1,\"ped_year\":0},{\"ped_id\":2018,\"ped_label\":\"Holiday (Hungary)\",\"ped_date_start\":\"2022-12-28\",\"ped_date_end\":\"2022-12-28\",\"ped_period_special_day_id\":1,\"ped_year\":0},{\"ped_id\":2019,\"ped_label\":\"Holiday (Hungary)\",\"ped_date_start\":\"2022-12-29\",\"ped_date_end\":\"2022-12-29\",\"ped_period_special_day_id\":1,\"ped_year\":0},{\"ped_id\":2020,\"ped_label\":\"Holiday (Hungary)\",\"ped_date_start\":\"2022-12-30\",\"ped_date_end\":\"2022-12-30\",\"ped_period_special_day_id\":1,\"ped_year\":0},{\"ped_id\":2021,\"ped_label\":\"Holiday (Hungary)\",\"ped_date_start\":\"2022-12-31\",\"ped_date_end\":\"2022-12-31\",\"ped_period_special_day_id\":1,\"ped_year\":0},{\"ped_id\":2022,\"ped_label\":\"NewYear\",\"ped_date_start\":\"2023-01-01\",\"ped_date_end\":\"2023-01-01\",\"ped_period_special_day_id\":2,\"ped_year\":0},{\"ped_id\":2023,\"ped_label\":\"Holiday (Hungary)\",\"ped_date_start\":\"2023-01-02\",\"ped_date_end\":\"2023-01-02\",\"ped_period_special_day_id\":1,\"ped_year\":2024},{\"ped_id\":2024,\"ped_label\":\"Good Friday\",\"ped_date_start\":\"2023-04-07\",\"ped_date_end\":\"2023-04-07\",\"ped_period_special_day_id\":2,\"ped_year\":2023},{\"ped_id\":2025,\"ped_label\":\"Easter Sunday\",\"ped_date_start\":\"2023-04-09\",\"ped_date_end\":\"2023-04-09\",\"ped_period_special_day_id\":2,\"ped_year\":2023},{\"ped_id\":2026,\"ped_label\":\"Easter Monday\",\"ped_date_start\":\"2023-04-10\",\"ped_date_end\":\"2023-04-10\",\"ped_period_special_day_id\":2,\"ped_year\":2023},{\"ped_id\":2027,\"ped_label\":\"Whit Sunday\",\"ped_date_start\":\"2023-05-28\",\"ped_date_end\":\"2023-05-28\",\"ped_period_special_day_id\":2,\"ped_year\":2023},{\"ped_id\":2028,\"ped_label\":\"Whit Monday\",\"ped_date_start\":\"2023-05-29\",\"ped_date_end\":\"2023-05-29\",\"ped_period_special_day_id\":2,\"ped_year\":2023},{\"ped_id\":2029,\"ped_label\":\"Revolution Day (Hungary)\",\"ped_date_start\":\"2023-03-15\",\"ped_date_end\":\"2023-03-15\",\"ped_period_special_day_id\":2,\"ped_year\":0},{\"ped_id\":2030,\"ped_label\":\"Labour Day\",\"ped_date_start\":\"2023-05-01\",\"ped_date_end\":\"2023-05-01\",\"ped_period_special_day_id\":2,\"ped_year\":0},{\"ped_id\":2031,\"ped_label\":\"Saint Stephens Day (Hungary)\",\"ped_date_start\":\"2023-08-20\",\"ped_date_end\":\"2023-08-20\",\"ped_period_special_day_id\":2,\"ped_year\":0},{\"ped_id\":2032,\"ped_label\":\"All Saints Day\",\"ped_date_start\":\"2023-11-01\",\"ped_date_end\":\"2023-11-01\",\"ped_period_special_day_id\":2,\"ped_year\":0},{\"ped_id\":2033,\"ped_label\":\"Christmas (Tuesday)\",\"ped_date_start\":\"2024-12-24\",\"ped_date_end\":\"2024-12-24\",\"ped_period_special_day_id\":2,\"ped_year\":2024},{\"ped_id\":2034,\"ped_label\":\"Good Friday\",\"ped_date_start\":\"2024-03-29\",\"ped_date_end\":\"2024-03-29\",\"ped_period_special_day_id\":2,\"ped_year\":2024},{\"ped_id\":2035,\"ped_label\":\"Easter\",\"ped_date_start\":\"2024-03-31\",\"ped_date_end\":\"2024-03-31\",\"ped_period_special_day_id\":2,\"ped_year\":0},{\"ped_id\":2036,\"ped_label\":\"Easter Monday\",\"ped_date_start\":\"2024-04-01\",\"ped_date_end\":\"2024-04-01\",\"ped_period_special_day_id\":2,\"ped_year\":0},{\"ped_id\":2037,\"ped_label\":\"Whit Monday\",\"ped_date_start\":\"2024-05-20\",\"ped_date_end\":\"2024-05-20\",\"ped_period_special_day_id\":2,\"ped_year\":2024},{\"ped_id\":2038,\"ped_label\":\"Whit Sunday\",\"ped_date_start\":\"2024-05-19\",\"ped_date_end\":\"2024-05-19\",\"ped_period_special_day_id\":2,\"ped_year\":2024},{\"ped_id\":2039,\"ped_label\":\"Christmas 1st Day\",\"ped_date_start\":\"2024-12-25\",\"ped_date_end\":\"2024-12-25\",\"ped_period_special_day_id\":2,\"ped_year\":2024},{\"ped_id\":2040,\"ped_label\":\"Christmas 2nd Day\",\"ped_date_start\":\"2024-12-26\",\"ped_date_end\":\"2024-12-26\",\"ped_period_special_day_id\":2,\"ped_year\":0},{\"ped_id\":2041,\"ped_label\":\"Holiday (Hungary)\",\"ped_date_start\":\"2024-12-27\",\"ped_date_end\":\"2024-12-27\",\"ped_period_special_day_id\":1,\"ped_year\":0},{\"ped_id\":2042,\"ped_label\":\"Holiday (Hungary)\",\"ped_date_start\":\"2024-12-28\",\"ped_date_end\":\"2024-12-28\",\"ped_period_special_day_id\":1,\"ped_year\":0},{\"ped_id\":2043,\"ped_label\":\"Holiday (Hungary)\",\"ped_date_start\":\"2024-12-29\",\"ped_date_end\":\"2024-12-29\",\"ped_period_special_day_id\":1,\"ped_year\":0},{\"ped_id\":2044,\"ped_label\":\"Holiday (Hungary)\",\"ped_date_start\":\"2024-12-30\",\"ped_date_end\":\"2024-12-30\",\"ped_period_special_day_id\":1,\"ped_year\":0},{\"ped_id\":2045,\"ped_label\":\"Holiday (Hungary)\",\"ped_date_start\":\"2024-12-31\",\"ped_date_end\":\"2024-12-31\",\"ped_period_special_day_id\":1,\"ped_year\":0},{\"ped_id\":2046,\"ped_label\":\"Holiday (Hungary)\",\"ped_date_start\":\"2025-01-02\",\"ped_date_end\":\"2025-01-02\",\"ped_period_special_day_id\":1,\"ped_year\":2025}]}";
|
|
|
|
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;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
#endif
|
|
}
|