diff --git a/library/include/mobilisis/calculate_price.h b/library/include/mobilisis/calculate_price.h index 8c4dcfb..277d9d5 100644 --- a/library/include/mobilisis/calculate_price.h +++ b/library/include/mobilisis/calculate_price.h @@ -5,6 +5,7 @@ #include #include +#include #ifdef WIN32 #ifdef CALCULATE_LIBRARY_EXPORTS @@ -20,9 +21,9 @@ class Configuration; typedef Configuration parking_tariff_t; -#ifdef __cplusplus -extern "C" { -#endif +//#ifdef __cplusplus +//extern "C" { +//#endif struct CALCULATE_LIBRARY_API price_t { uint32_t units; @@ -41,6 +42,7 @@ struct CALCULATE_LIBRARY_API CalcState { NEGATIVE_PARING_TIME, INVALID_START_DATE, WRONG_PARAM_VALUES, + WRONG_ISO_TIME_FORMAT, ABOVE_MAX_PARKING_TIME, BELOW_MIN_PARKING_TIME, BELOW_MIN_PARKING_PRICE, @@ -92,6 +94,8 @@ struct CALCULATE_LIBRARY_API CalcState { case State::INVALID_START_DATE: s = "INVALID_START_DATE"; break; + case State::WRONG_ISO_TIME_FORMAT: + s = "WRONG_ISO_TIME_FORMAT"; } return s + ":" + m_desc; } @@ -111,13 +115,25 @@ CalcState CALCULATE_LIBRARY_API compute_price_for_parking_ticket( time_t end_parking_time, struct price_t *price); +CalcState CALCULATE_LIBRARY_API compute_price_for_parking_ticket( + parking_tariff_t *tariff, + QDateTime const &start_parking_time, + QDateTime const &end_parking_time, + struct price_t *price); + CalcState CALCULATE_LIBRARY_API compute_duration_for_parking_ticket( parking_tariff_t *tariff, time_t start_parking_time, double cost, QString &duration); -#ifdef __cplusplus -} // extern "C" -#endif + +CalcState CALCULATE_LIBRARY_API compute_duration_for_parking_ticket( + parking_tariff_t *tariff, + QDateTime const &start_parking_time, + double cost, + QDateTime &ticketEndTime); +//#ifdef __cplusplus +//} // extern "C" +//#endif #endif // CALCULATE_PRICE_H diff --git a/library/src/calculate_price.cpp b/library/src/calculate_price.cpp index 2d3f4a5..c3eef53 100644 --- a/library/src/calculate_price.cpp +++ b/library/src/calculate_price.cpp @@ -139,6 +139,57 @@ CalcState CALCULATE_LIBRARY_API compute_price_for_parking_ticket( return calcState.set(CalcState::State::SUCCESS); } +CalcState CALCULATE_LIBRARY_API compute_price_for_parking_ticket( + parking_tariff_t *tariff, + QDateTime const &start_parking_time, + QDateTime const &end_parking_time, + struct price_t *price) { + CalcState calcState; + double minMin = tariff->PaymentOption.find(PaymentOption::Option1)->second.pop_min_time; + double maxMin = tariff->PaymentOption.find(PaymentOption::Option1)->second.pop_max_time; + + int const duration = (end_parking_time.toSecsSinceEpoch() - + start_parking_time.toMSecsSinceEpoch()) / 60; + + if (duration < 0) { + calcState.setDesc(QString("end=%1, start=%2") + .arg(end_parking_time.toString(Qt::ISODate), + start_parking_time.toString(Qt::ISODate))); + return calcState.set(CalcState::State::NEGATIVE_PARING_TIME); + } + if (duration > maxMin) { + calcState.setDesc(QString("duration=%1, maxMin=%2").arg(duration, maxMin)); + return calcState.set(CalcState::State::ABOVE_MAX_PARKING_TIME); + } + if (duration < minMin) { + calcState.setDesc(QString("duration=%1, minMin=%2").arg(duration, minMin)); + return calcState.set(CalcState::State::BELOW_MIN_PARKING_TIME); + } + if (duration == 0) { + memset(price, 0x00, sizeof(*price)); + return calcState.set(CalcState::State::SUCCESS); + } + + if (start_parking_time.isValid()) { + QString cs = start_parking_time.toString(Qt::ISODate); + double cost = calculator.GetCostFromDuration( + tariff, PaymentOption::Option1, + cs.toLocal8Bit().constData(), + duration, false, true); + double minCost = tariff->PaymentOption.find(PaymentOption::Option1)->second.pop_min_price; + if (cost < minCost) { + calcState.setDesc(QString("minCost=%1, cost=%2").arg(minCost, cost)); + return calcState.set(CalcState::State::BELOW_MIN_PARKING_PRICE); + } + price->units = cost; + price->netto = cost; + } else { + return calcState.set(CalcState::State::INVALID_START_DATE); + } + + return calcState.set(CalcState::State::SUCCESS); +} + CalcState CALCULATE_LIBRARY_API compute_duration_for_parking_ticket( parking_tariff_t *tariff, time_t start_parking_time, @@ -154,6 +205,35 @@ CalcState CALCULATE_LIBRARY_API compute_duration_for_parking_ticket( duration = calculator.GetDurationFromCost(tariff, PaymentOption::Option1, cs.toLocal8Bit().constData(), price, false, true).c_str(); + QDateTime d = QDateTime::fromString(duration); + if (!d.isValid()) { + calcState.setDesc(QString("ticketEndTime=%1").arg(duration)); + return calcState.set(CalcState::State::WRONG_ISO_TIME_FORMAT); + } + } else { + return calcState.set(CalcState::State::INVALID_START_DATE); + } + + return calcState.set(CalcState::State::SUCCESS); +} + +CalcState CALCULATE_LIBRARY_API compute_duration_for_parking_ticket( + parking_tariff_t *tariff, + QDateTime const &start_parking_time, + double price, + QDateTime &ticketEndTime) { + CalcState calcState; + if (start_parking_time.isValid()) { + QString cs = start_parking_time.toString(Qt::ISODate); + QString endTime = calculator.GetDurationFromCost( + tariff, PaymentOption::Option1, + cs.toLocal8Bit().constData(), + price, false, true).c_str(); + ticketEndTime = QDateTime::fromString(endTime); + if (!ticketEndTime.isValid()) { + calcState.setDesc(QString("ticketEndTime=%1").arg(endTime)); + return calcState.set(CalcState::State::WRONG_ISO_TIME_FORMAT); + } } else { return calcState.set(CalcState::State::INVALID_START_DATE); }