Compare commits
17 Commits
c2a8f0b00b
...
2.0.3
| Author | SHA1 | Date | |
|---|---|---|---|
| f7af631de6 | |||
| 15006e8e22 | |||
| 87c0f4397b | |||
| 24c6788427 | |||
| f848baec83 | |||
| 1467a69487 | |||
| 0b779b7846 | |||
| 25a39fdc61 | |||
| 9438a535ea | |||
| f87399ed44 | |||
| 868df3dd32 | |||
| d2a85532ce | |||
| e6399d477b | |||
| f450d85bff | |||
| f46adac56d | |||
| c799c24658 | |||
| dbcd27b377 |
@@ -3,6 +3,7 @@
|
|||||||
|
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
#include <inttypes.h>
|
#include <inttypes.h>
|
||||||
|
#include "tariff_time_range.h"
|
||||||
|
|
||||||
#include <QString>
|
#include <QString>
|
||||||
#include <QDateTime>
|
#include <QDateTime>
|
||||||
@@ -31,6 +32,11 @@ struct CALCULATE_LIBRARY_API price_t {
|
|||||||
double brutto;
|
double brutto;
|
||||||
double vat_percentage;
|
double vat_percentage;
|
||||||
double vat;
|
double vat;
|
||||||
|
|
||||||
|
explicit price_t() {
|
||||||
|
units = 0;
|
||||||
|
netto = brutto = vat_percentage = vat = 0.0;
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
enum class PERMIT_TYPE : quint8 {
|
enum class PERMIT_TYPE : quint8 {
|
||||||
@@ -57,13 +63,31 @@ struct CALCULATE_LIBRARY_API CalcState {
|
|||||||
ABOVE_MAX_PARKING_TIME,
|
ABOVE_MAX_PARKING_TIME,
|
||||||
BELOW_MIN_PARKING_TIME,
|
BELOW_MIN_PARKING_TIME,
|
||||||
BELOW_MIN_PARKING_PRICE,
|
BELOW_MIN_PARKING_PRICE,
|
||||||
OVERPAID
|
OVERPAID,
|
||||||
|
OUTSIDE_ALLOWED_PARKING_TIME
|
||||||
};
|
};
|
||||||
|
|
||||||
State m_status;
|
State m_status;
|
||||||
QString m_desc;
|
QString m_desc;
|
||||||
|
TariffTimeRange m_allowedTimeRange;
|
||||||
|
|
||||||
explicit CalcState() : m_status(State::SUCCESS), m_desc("") {}
|
explicit CalcState()
|
||||||
|
: m_status(State::SUCCESS)
|
||||||
|
, m_desc("") {
|
||||||
|
}
|
||||||
|
|
||||||
|
explicit CalcState(State state, QString desc = "")
|
||||||
|
: m_status(state)
|
||||||
|
, m_desc(desc) {
|
||||||
|
}
|
||||||
|
|
||||||
|
explicit CalcState(State state, QString desc = "",
|
||||||
|
QTime const &from = QTime(),
|
||||||
|
QTime const &until = QTime())
|
||||||
|
: m_status(state)
|
||||||
|
, m_desc(desc)
|
||||||
|
, m_allowedTimeRange(from, until) {
|
||||||
|
}
|
||||||
|
|
||||||
explicit operator bool() const noexcept {
|
explicit operator bool() const noexcept {
|
||||||
return (m_status == State::SUCCESS);
|
return (m_status == State::SUCCESS);
|
||||||
@@ -107,12 +131,23 @@ struct CALCULATE_LIBRARY_API CalcState {
|
|||||||
break;
|
break;
|
||||||
case State::WRONG_ISO_TIME_FORMAT:
|
case State::WRONG_ISO_TIME_FORMAT:
|
||||||
s = "WRONG_ISO_TIME_FORMAT";
|
s = "WRONG_ISO_TIME_FORMAT";
|
||||||
|
break;
|
||||||
|
case State::OUTSIDE_ALLOWED_PARKING_TIME:
|
||||||
|
s = "OUTSIDE_ALLOWED_PARKING_TIME";
|
||||||
}
|
}
|
||||||
return s + ":" + m_desc;
|
return s + ":" + m_desc;
|
||||||
}
|
}
|
||||||
|
|
||||||
CalcState &set(State s) { m_status = s; return *this; }
|
CalcState &set(State s) { m_status = s; return *this; }
|
||||||
CalcState &setDesc(QString s) { m_desc = s; return *this; }
|
CalcState &setDesc(QString s) { m_desc = s; return *this; }
|
||||||
|
|
||||||
|
void setAllowedTimeRange(QTime const &from, QTime const &until) {
|
||||||
|
m_allowedTimeRange.setTimeRange(from, until);
|
||||||
|
}
|
||||||
|
|
||||||
|
TariffTimeRange getAllowedTimeRange() {
|
||||||
|
return m_allowedTimeRange;
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
CalcState CALCULATE_LIBRARY_API init_tariff(parking_tariff_t **tariff,
|
CalcState CALCULATE_LIBRARY_API init_tariff(parking_tariff_t **tariff,
|
||||||
|
|||||||
@@ -35,6 +35,8 @@ public:
|
|||||||
void ResetPriceSteps() { m_priceSteps.clear(); }
|
void ResetPriceSteps() { m_priceSteps.clear(); }
|
||||||
QList<int> priceSteps() const { return m_priceSteps; }
|
QList<int> priceSteps() const { return m_priceSteps; }
|
||||||
|
|
||||||
|
CalcState isParkingAllowed(Configuration const *cfg, QDateTime const &start);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets duration in seconds from cost
|
/// Gets duration in seconds from cost
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|||||||
@@ -311,7 +311,6 @@ CalcState CALCULATE_LIBRARY_API compute_price_for_parking_ticket(
|
|||||||
return calcState.set(CalcState::State::BELOW_MIN_PARKING_TIME);
|
return calcState.set(CalcState::State::BELOW_MIN_PARKING_TIME);
|
||||||
}
|
}
|
||||||
if (duration == 0) {
|
if (duration == 0) {
|
||||||
memset(price, 0x00, sizeof(*price));
|
|
||||||
return calcState.set(CalcState::State::SUCCESS);
|
return calcState.set(CalcState::State::SUCCESS);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -375,7 +374,6 @@ CalcState CALCULATE_LIBRARY_API compute_price_for_parking_ticket(
|
|||||||
return calcState.set(CalcState::State::BELOW_MIN_PARKING_TIME);
|
return calcState.set(CalcState::State::BELOW_MIN_PARKING_TIME);
|
||||||
}
|
}
|
||||||
if (netto_parking_time == 0) {
|
if (netto_parking_time == 0) {
|
||||||
memset(price, 0x00, sizeof(*price));
|
|
||||||
return calcState.set(CalcState::State::SUCCESS);
|
return calcState.set(CalcState::State::SUCCESS);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -134,30 +134,17 @@ std::string Calculator::GetDurationFromCost(Configuration* cfg,
|
|||||||
inputDate = inputDate.addSecs(GetDurationForPrice(cfg, price) * 60);
|
inputDate = inputDate.addSecs(GetDurationForPrice(cfg, price) * 60);
|
||||||
return inputDate.toString(Qt::ISODate).toStdString();
|
return inputDate.toString(Qt::ISODate).toStdString();
|
||||||
} else {
|
} else {
|
||||||
QDateTime const &start = QDateTime::fromString(start_datetime, Qt::ISODate);
|
if (Utilities::IsYearPeriodActive(cfg, inputDate)) {
|
||||||
if (Utilities::IsYearPeriodActive(cfg, start)) {
|
|
||||||
if (!prepaid) {
|
if (!prepaid) {
|
||||||
BusinessHours businessHours = Utilities::getBusinessHours(cfg, paymentMethodId);
|
CalcState cs = isParkingAllowed(cfg, inputDate);
|
||||||
if (businessHours == BusinessHours::OnlyWeekDays) {
|
if (cs) {
|
||||||
int const weekdayId = start.date().dayOfWeek();
|
inputDate.setTime(cs.getAllowedTimeRange().getTimeUntil());
|
||||||
|
return inputDate.toString(Qt::ISODate).toStdString();
|
||||||
using WTIterator = std::multimap<int, ATBWeekDaysWorktime>::const_iterator;
|
|
||||||
std::pair<WTIterator, WTIterator> p = cfg->WeekDaysWorktime.equal_range(weekdayId);
|
|
||||||
|
|
||||||
for (WTIterator itr = p.first; itr != p.second; ++itr) {
|
|
||||||
QTime const &from = Utilities::WeekDaysWorkTimeFrom(itr);
|
|
||||||
QTime const &until = Utilities::WeekDaysWorkTimeUntil(itr);
|
|
||||||
QTime const& startTime = start.time();
|
|
||||||
|
|
||||||
if (from <= startTime && startTime <= until) {
|
|
||||||
return inputDate.addSecs(GetDurationForPrice(cfg, price) * 60).toString(Qt::ISODate).toStdString();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
qCritical() << __PRETTY_FUNCTION__ << "NOT YET IMPLEMENTED";
|
qCritical() << __func__ << ":" << __LINE__ << "NOT YET IMPLEMENTED";
|
||||||
return 0;
|
return "";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -200,6 +187,67 @@ uint32_t Calculator::GetCostFromDuration(Configuration * cfg,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
CalcState Calculator::isParkingAllowed(Configuration const *cfg, QDateTime const &start) {
|
||||||
|
static const PaymentMethod paymentMethodId = Utilities::getPaymentMethodId(cfg);
|
||||||
|
|
||||||
|
if (paymentMethodId == PaymentMethod::Steps) {
|
||||||
|
int const weekdayId = start.date().dayOfWeek();
|
||||||
|
BusinessHours businessHours = Utilities::getBusinessHours(cfg, paymentMethodId);
|
||||||
|
if (businessHours == BusinessHours::OnlyWeekDays) {
|
||||||
|
if (weekdayId != (int)Qt::Saturday && weekdayId != (int)Qt::Sunday) { // e.g. Neuhauser, Linsinger Maschinenbau (741)
|
||||||
|
if (cfg->WeekDaysWorktime.count(weekdayId) > 0) {
|
||||||
|
using WTIterator = std::multimap<int, ATBWeekDaysWorktime>::const_iterator;
|
||||||
|
std::pair<WTIterator, WTIterator> p = cfg->WeekDaysWorktime.equal_range(weekdayId);
|
||||||
|
|
||||||
|
for (WTIterator itr = p.first; itr != p.second; ++itr) {
|
||||||
|
QTime const &from = Utilities::WeekDaysWorkTimeFrom(itr);
|
||||||
|
QTime const &until = Utilities::WeekDaysWorkTimeUntil(itr);
|
||||||
|
QTime const &startTime = start.time();
|
||||||
|
if (from > startTime) {
|
||||||
|
return CalcState(CalcState::State::OUTSIDE_ALLOWED_PARKING_TIME,
|
||||||
|
QString("%1 < %2").arg(from.toString(Qt::ISODate))
|
||||||
|
.arg(startTime.toString(Qt::ISODate)), from, until);
|
||||||
|
} else
|
||||||
|
if (startTime >= until) {
|
||||||
|
return CalcState(CalcState::State::OUTSIDE_ALLOWED_PARKING_TIME,
|
||||||
|
QString("%1 >= %2").arg(startTime.toString(Qt::ISODate))
|
||||||
|
.arg(until.toString(Qt::ISODate)), from, until);
|
||||||
|
}
|
||||||
|
return CalcState(CalcState::State::SUCCESS,
|
||||||
|
"PARKING ALLOWED", from, until);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else
|
||||||
|
if (businessHours == BusinessHours::AllDaysWithRestrictedHours) { // e.g. for Neuhauser, NAZ (744)
|
||||||
|
if (cfg->WeekDaysWorktime.count(weekdayId) > 0) {
|
||||||
|
using WTIterator = std::multimap<int, ATBWeekDaysWorktime>::const_iterator;
|
||||||
|
std::pair<WTIterator, WTIterator> p = cfg->WeekDaysWorktime.equal_range(weekdayId);
|
||||||
|
|
||||||
|
for (WTIterator itr = p.first; itr != p.second; ++itr) {
|
||||||
|
QTime const &from = Utilities::WeekDaysWorkTimeFrom(itr);
|
||||||
|
QTime const &until = Utilities::WeekDaysWorkTimeUntil(itr);
|
||||||
|
QTime const &startTime = start.time();
|
||||||
|
if (from > startTime) {
|
||||||
|
return CalcState(CalcState::State::OUTSIDE_ALLOWED_PARKING_TIME,
|
||||||
|
QString("%1 < %2").arg(from.toString(Qt::ISODate))
|
||||||
|
.arg(startTime.toString(Qt::ISODate)), from, until);
|
||||||
|
} else
|
||||||
|
if (startTime >= until) {
|
||||||
|
return CalcState(CalcState::State::OUTSIDE_ALLOWED_PARKING_TIME,
|
||||||
|
QString("%1 >= %2").arg(startTime.toString(Qt::ISODate))
|
||||||
|
.arg(until.toString(Qt::ISODate)), from, until);
|
||||||
|
}
|
||||||
|
return CalcState(CalcState::State::SUCCESS,
|
||||||
|
"PARKING ALLOWED", from, until);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return CalcState(CalcState::State::OUTSIDE_ALLOWED_PARKING_TIME, "UNKNOWN ERROR",
|
||||||
|
QTime(), QTime());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
///////////////////////////////////////
|
///////////////////////////////////////
|
||||||
@@ -223,23 +271,13 @@ double Calculator::GetCostFromDuration(Configuration* cfg,
|
|||||||
} else {
|
} else {
|
||||||
if (Utilities::IsYearPeriodActive(cfg, start_datetime)) {
|
if (Utilities::IsYearPeriodActive(cfg, start_datetime)) {
|
||||||
if (!prepaid) {
|
if (!prepaid) {
|
||||||
BusinessHours businessHours = Utilities::getBusinessHours(cfg, paymentMethodId);
|
CalcState cs = isParkingAllowed(cfg, start_datetime);
|
||||||
if (businessHours == BusinessHours::OnlyWeekDays) {
|
if (cs) {
|
||||||
int const weekdayId = start_datetime.date().dayOfWeek();
|
end_datetime = start_datetime.addSecs(durationMinutes*60);
|
||||||
|
double cost = GetCostFromDuration(cfg, start_datetime, end_datetime);
|
||||||
using WTIterator = std::multimap<int, ATBWeekDaysWorktime>::const_iterator;
|
end_datetime = start_datetime;
|
||||||
std::pair<WTIterator, WTIterator> p = cfg->WeekDaysWorktime.equal_range(weekdayId);
|
end_datetime.setTime(cs.getAllowedTimeRange().getTimeUntil());
|
||||||
|
return cost;
|
||||||
for (WTIterator itr = p.first; itr != p.second; ++itr) {
|
|
||||||
QTime const &from = Utilities::WeekDaysWorkTimeFrom(itr);
|
|
||||||
QTime const &until = Utilities::WeekDaysWorkTimeUntil(itr);
|
|
||||||
QTime const &startTime = start_datetime.time();
|
|
||||||
|
|
||||||
if (from <= startTime && startTime <= until) {
|
|
||||||
end_datetime = start_datetime.addSecs(durationMinutes*60);
|
|
||||||
return GetCostFromDuration(cfg, start_datetime, end_datetime);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -712,9 +750,9 @@ QList<int> Calculator::GetTimeSteps(Configuration *cfg) const {
|
|||||||
int const pop_carry_over = cfg->getPaymentOptions().pop_carry_over;
|
int const pop_carry_over = cfg->getPaymentOptions().pop_carry_over;
|
||||||
int const pop_time_step_config = cfg->getPaymentOptions().pop_time_step_config;
|
int const pop_time_step_config = cfg->getPaymentOptions().pop_time_step_config;
|
||||||
|
|
||||||
qCritical() << __PRETTY_FUNCTION__ << " start parking time:" << start.toString(Qt::ISODate);
|
qCritical() << __func__ << ":" << __LINE__ << " start parking time:" << start.toString(Qt::ISODate);
|
||||||
qCritical() << __PRETTY_FUNCTION__ << " payment option id:" << pop_id;
|
qCritical() << __func__ << ":" << __LINE__ << " payment option id:" << pop_id;
|
||||||
qCritical() << __PRETTY_FUNCTION__ << " payment option carry over:" << pop_carry_over;
|
qCritical() << __func__ << ":" << __LINE__ << "payment option carry over:" << pop_carry_over;
|
||||||
|
|
||||||
if (pop_time_step_config == (int)ATBTimeStepConfig::TimeStepConfig::DYNAMIC) {
|
if (pop_time_step_config == (int)ATBTimeStepConfig::TimeStepConfig::DYNAMIC) {
|
||||||
//qCritical() << __PRETTY_FUNCTION__ << "payment option time step config:" << "TimeStepConfig::DYNAMIC";
|
//qCritical() << __PRETTY_FUNCTION__ << "payment option time step config:" << "TimeStepConfig::DYNAMIC";
|
||||||
@@ -852,11 +890,9 @@ Calculator::GetDailyTicketPrice(Configuration* cfg,
|
|||||||
ATBWeekDaysWorktime const &wt = workTime.value();
|
ATBWeekDaysWorktime const &wt = workTime.value();
|
||||||
endTime = startDatetime;
|
endTime = startDatetime;
|
||||||
endTime.setTime(QTime::fromString(wt.pwd_time_to.c_str(), Qt::ISODate));
|
endTime.setTime(QTime::fromString(wt.pwd_time_to.c_str(), Qt::ISODate));
|
||||||
|
|
||||||
std::optional<QVector<ATBDailyTicket>> dailyTickets = cfg->getDailyTicketsForAllKeys();
|
std::optional<QVector<ATBDailyTicket>> dailyTickets = cfg->getDailyTicketsForAllKeys();
|
||||||
if (dailyTickets) {
|
if (dailyTickets) {
|
||||||
QVector<ATBDailyTicket> const tickets = dailyTickets.value();
|
QVector<ATBDailyTicket> const tickets = dailyTickets.value();
|
||||||
|
|
||||||
switch (permitType) {
|
switch (permitType) {
|
||||||
case PERMIT_TYPE::DAY_TICKET_ADULT: {
|
case PERMIT_TYPE::DAY_TICKET_ADULT: {
|
||||||
std::optional<ATBCustomer> c = cfg->getCustomerForType(ATBCustomer::CustomerType::ADULT);
|
std::optional<ATBCustomer> c = cfg->getCustomerForType(ATBCustomer::CustomerType::ADULT);
|
||||||
@@ -864,12 +900,20 @@ Calculator::GetDailyTicketPrice(Configuration* cfg,
|
|||||||
for (QVector<ATBDailyTicket>::size_type i=0; i<tickets.size(); ++i) {
|
for (QVector<ATBDailyTicket>::size_type i=0; i<tickets.size(); ++i) {
|
||||||
if (tickets[i].daily_ticket_clearance_customer_ids.contains(c.value().cust_id)) {
|
if (tickets[i].daily_ticket_clearance_customer_ids.contains(c.value().cust_id)) {
|
||||||
int priceId = tickets[i].daily_ticket_price_id;
|
int priceId = tickets[i].daily_ticket_price_id;
|
||||||
std::optional<QVector<ATBPaymentRate>> const &paymentRates = cfg->getPaymentRateForKey(priceId);
|
QVector<ATBPaymentOption> const &paymentOptions = cfg->getAllPaymentOptions();
|
||||||
if (paymentRates) {
|
for (QVector<ATBPaymentOption>::size_type j=0; j < paymentOptions.size(); ++j) {
|
||||||
QVector<ATBPaymentRate> const &pr = paymentRates.value();
|
int const pop_id = paymentOptions.at(j).pop_id;
|
||||||
if (pr.size() > 0) {
|
std::optional<QVector<ATBPaymentRate>> const &paymentRates = cfg->getPaymentRateForKey(pop_id);
|
||||||
price.netto = pr.at(0).pra_price;
|
if (paymentRates) {
|
||||||
value.value_or(price);
|
QVector<ATBPaymentRate> const &pr = paymentRates.value();
|
||||||
|
for (QVector<ATBPaymentRate>::size_type k=0; k < pr.size(); ++k) {
|
||||||
|
if (pr.at(k).pra_payment_option_id == pop_id) {
|
||||||
|
if (priceId == pr.at(k).pra_payment_unit_id) {
|
||||||
|
price.netto = pr.at(k).pra_price;
|
||||||
|
value = value.value_or(price);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -882,12 +926,20 @@ Calculator::GetDailyTicketPrice(Configuration* cfg,
|
|||||||
for (QVector<ATBDailyTicket>::size_type i=0; i<tickets.size(); ++i) {
|
for (QVector<ATBDailyTicket>::size_type i=0; i<tickets.size(); ++i) {
|
||||||
if (tickets[i].daily_ticket_clearance_customer_ids.contains(c.value().cust_id)) {
|
if (tickets[i].daily_ticket_clearance_customer_ids.contains(c.value().cust_id)) {
|
||||||
int priceId = tickets[i].daily_ticket_price_id;
|
int priceId = tickets[i].daily_ticket_price_id;
|
||||||
std::optional<QVector<ATBPaymentRate>> const &paymentRates = cfg->getPaymentRateForKey(priceId);
|
QVector<ATBPaymentOption> const &paymentOptions = cfg->getAllPaymentOptions();
|
||||||
if (paymentRates) {
|
for (QVector<ATBPaymentOption>::size_type j=0; j < paymentOptions.size(); ++j) {
|
||||||
QVector<ATBPaymentRate> const &pr = paymentRates.value();
|
int const pop_id = paymentOptions.at(j).pop_id;
|
||||||
if (pr.size() > 0) {
|
std::optional<QVector<ATBPaymentRate>> const &paymentRates = cfg->getPaymentRateForKey(pop_id);
|
||||||
price.netto = pr.at(0).pra_price;
|
if (paymentRates) {
|
||||||
value.value_or(price);
|
QVector<ATBPaymentRate> const &pr = paymentRates.value();
|
||||||
|
for (QVector<ATBPaymentRate>::size_type k=0; k < pr.size(); ++k) {
|
||||||
|
if (pr.at(k).pra_payment_option_id == pop_id) {
|
||||||
|
if (priceId == pr.at(k).pra_payment_unit_id) {
|
||||||
|
price.netto = pr.at(k).pra_price;
|
||||||
|
value = value.value_or(price);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -895,6 +947,30 @@ Calculator::GetDailyTicketPrice(Configuration* cfg,
|
|||||||
}
|
}
|
||||||
} break;
|
} break;
|
||||||
case PERMIT_TYPE::DAY_TICKET_CHILD: {
|
case PERMIT_TYPE::DAY_TICKET_CHILD: {
|
||||||
|
std::optional<ATBCustomer> c = cfg->getCustomerForType(ATBCustomer::CustomerType::CHILD);
|
||||||
|
if (c) {
|
||||||
|
for (QVector<ATBDailyTicket>::size_type i=0; i<tickets.size(); ++i) {
|
||||||
|
if (tickets[i].daily_ticket_clearance_customer_ids.contains(c.value().cust_id)) {
|
||||||
|
int priceId = tickets[i].daily_ticket_price_id;
|
||||||
|
QVector<ATBPaymentOption> const &paymentOptions = cfg->getAllPaymentOptions();
|
||||||
|
for (QVector<ATBPaymentOption>::size_type j=0; j < paymentOptions.size(); ++j) {
|
||||||
|
int const pop_id = paymentOptions.at(j).pop_id;
|
||||||
|
std::optional<QVector<ATBPaymentRate>> const &paymentRates = cfg->getPaymentRateForKey(pop_id);
|
||||||
|
if (paymentRates) {
|
||||||
|
QVector<ATBPaymentRate> const &pr = paymentRates.value();
|
||||||
|
for (QVector<ATBPaymentRate>::size_type k=0; k < pr.size(); ++k) {
|
||||||
|
if (pr.at(k).pra_payment_option_id == pop_id) {
|
||||||
|
if (priceId == pr.at(k).pra_payment_unit_id) {
|
||||||
|
price.netto = pr.at(k).pra_price;
|
||||||
|
value = value.value_or(price);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
// [[fallthrough]];
|
// [[fallthrough]];
|
||||||
case PERMIT_TYPE::SHORT_TERM_PARKING: {
|
case PERMIT_TYPE::SHORT_TERM_PARKING: {
|
||||||
|
|||||||
@@ -87,7 +87,6 @@ bool Configuration::ParseJson(Configuration* cfg, const char* json)
|
|||||||
ATBSpecialDays SpecialDays;
|
ATBSpecialDays SpecialDays;
|
||||||
ATBWeekDays WeekDays;
|
ATBWeekDays WeekDays;
|
||||||
ATBWeekDaysWorktime WeekDaysWorktime;
|
ATBWeekDaysWorktime WeekDaysWorktime;
|
||||||
ATBPaymentOption PaymentOption;
|
|
||||||
ATBPeriodYear YearPeriod;
|
ATBPeriodYear YearPeriod;
|
||||||
ATBDailyTicket DailyTicket;
|
ATBDailyTicket DailyTicket;
|
||||||
ATBTimeBase TimeBase;
|
ATBTimeBase TimeBase;
|
||||||
@@ -96,6 +95,7 @@ bool Configuration::ParseJson(Configuration* cfg, const char* json)
|
|||||||
ATBTimeStepConfig TimeStepConfig;
|
ATBTimeStepConfig TimeStepConfig;
|
||||||
|
|
||||||
MemberType mb_type = MemberType::UnknownType;
|
MemberType mb_type = MemberType::UnknownType;
|
||||||
|
this->currentPaymentOptions.clear();
|
||||||
|
|
||||||
// Get all JSON object members
|
// Get all JSON object members
|
||||||
// This code should run only once (to load JSON variables into memory)
|
// This code should run only once (to load JSON variables into memory)
|
||||||
@@ -320,22 +320,37 @@ bool Configuration::ParseJson(Configuration* cfg, const char* json)
|
|||||||
else if (strcmp(inner_obj_name, "pra_price") == 0) PaymentRate.pra_price = k->value.GetDouble();
|
else if (strcmp(inner_obj_name, "pra_price") == 0) PaymentRate.pra_price = k->value.GetDouble();
|
||||||
break;
|
break;
|
||||||
case MemberType::PaymentOptionType:
|
case MemberType::PaymentOptionType:
|
||||||
if (strcmp(inner_obj_name, "pop_id") == 0) PaymentOption.pop_id = k->value.GetInt();
|
if (strcmp(inner_obj_name, "pop_id") == 0) {
|
||||||
else if (strcmp(inner_obj_name, "pop_label") == 0) PaymentOption.pop_label = k->value.GetString();
|
this->currentPaymentOptions.append(ATBPaymentOption());
|
||||||
else if (strcmp(inner_obj_name, "pop_payment_method_id") == 0) PaymentOption.pop_payment_method_id = k->value.GetInt();
|
this->currentPaymentOptions.last().reset();
|
||||||
else if (strcmp(inner_obj_name, "pop_day_end_time") == 0) PaymentOption.pop_day_end_time = k->value.GetString();
|
this->currentPaymentOptions.last().pop_id = k->value.GetInt();
|
||||||
else if (strcmp(inner_obj_name, "pop_day_night_end_time") == 0) PaymentOption.pop_day_night_end_time = k->value.GetString();
|
} else if (strcmp(inner_obj_name, "pop_label") == 0) {
|
||||||
else if (strcmp(inner_obj_name, "pop_price_night") == 0) PaymentOption.pop_price_night = k->value.GetDouble();
|
this->currentPaymentOptions.last().pop_label = k->value.GetString();
|
||||||
else if (strcmp(inner_obj_name, "pop_min_time") == 0) PaymentOption.pop_min_time = k->value.GetDouble();
|
} else if (strcmp(inner_obj_name, "pop_payment_method_id") == 0) {
|
||||||
else if (strcmp(inner_obj_name, "pop_max_time") == 0) PaymentOption.pop_max_time = k->value.GetDouble();
|
this->currentPaymentOptions.last().pop_payment_method_id = k->value.GetInt();
|
||||||
else if (strcmp(inner_obj_name, "pop_min_price") == 0) PaymentOption.pop_min_price = k->value.GetDouble();
|
} else if (strcmp(inner_obj_name, "pop_day_end_time") == 0) {
|
||||||
else if (strcmp(inner_obj_name, "pop_carry_over") == 0) PaymentOption.pop_carry_over = k->value.GetInt();
|
this->currentPaymentOptions.last().pop_day_end_time = k->value.GetString();
|
||||||
else if (strcmp(inner_obj_name, "pop_carry_over_time_range_id") == 0) PaymentOption.pop_carry_over_time_range_id = k->value.GetInt();
|
} else if (strcmp(inner_obj_name, "pop_day_night_end_time") == 0) {
|
||||||
else if (strcmp(inner_obj_name, "pop_daily_card_price") == 0) PaymentOption.pop_daily_card_price = k->value.GetInt();
|
this->currentPaymentOptions.last().pop_day_night_end_time = k->value.GetString();
|
||||||
else if (strcmp(inner_obj_name, "pop_business_hours") == 0) PaymentOption.pop_business_hours = k->value.GetInt();
|
} else if (strcmp(inner_obj_name, "pop_price_night") == 0) {
|
||||||
else if (strcmp(inner_obj_name, "pop_time_step_config") == 0) PaymentOption.pop_time_step_config = k->value.GetInt();
|
this->currentPaymentOptions.last().pop_price_night = k->value.GetDouble();
|
||||||
this->currentPaymentOptions.append(PaymentOption);
|
} else if (strcmp(inner_obj_name, "pop_min_time") == 0) {
|
||||||
PaymentOption.reset();
|
this->currentPaymentOptions.last().pop_min_time = k->value.GetDouble();
|
||||||
|
} else if (strcmp(inner_obj_name, "pop_max_time") == 0) {
|
||||||
|
this->currentPaymentOptions.last().pop_max_time = k->value.GetDouble();
|
||||||
|
} else if (strcmp(inner_obj_name, "pop_min_price") == 0) {
|
||||||
|
this->currentPaymentOptions.last().pop_min_price = k->value.GetDouble();
|
||||||
|
} else if (strcmp(inner_obj_name, "pop_carry_over") == 0) {
|
||||||
|
this->currentPaymentOptions.last().pop_carry_over = k->value.GetInt();
|
||||||
|
} else if (strcmp(inner_obj_name, "pop_carry_over_time_range_id") == 0) {
|
||||||
|
this->currentPaymentOptions.last().pop_carry_over_time_range_id = k->value.GetInt();
|
||||||
|
} else if (strcmp(inner_obj_name, "pop_daily_card_price") == 0) {
|
||||||
|
this->currentPaymentOptions.last().pop_daily_card_price = k->value.GetInt();
|
||||||
|
} else if (strcmp(inner_obj_name, "pop_business_hours") == 0) {
|
||||||
|
this->currentPaymentOptions.last().pop_business_hours = k->value.GetInt();
|
||||||
|
} else if (strcmp(inner_obj_name, "pop_time_step_config") == 0) {
|
||||||
|
this->currentPaymentOptions.last().pop_time_step_config = k->value.GetInt();
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case MemberType::DurationType:
|
case MemberType::DurationType:
|
||||||
if (strcmp(inner_obj_name, "pun_id") == 0) Duration.pun_id = k->value.GetInt();
|
if (strcmp(inner_obj_name, "pun_id") == 0) Duration.pun_id = k->value.GetInt();
|
||||||
@@ -397,9 +412,12 @@ bool Configuration::ParseJson(Configuration* cfg, const char* json)
|
|||||||
// qCritical() << "PaymentRate" << PaymentRate;
|
// qCritical() << "PaymentRate" << PaymentRate;
|
||||||
cfg->PaymentRate.insert(pair<int, ATBPaymentRate>(PaymentRate.pra_payment_option_id, PaymentRate));
|
cfg->PaymentRate.insert(pair<int, ATBPaymentRate>(PaymentRate.pra_payment_option_id, PaymentRate));
|
||||||
break;
|
break;
|
||||||
case MemberType::PaymentOptionType:
|
case MemberType::PaymentOptionType: {
|
||||||
cfg->PaymentOption.insert(pair<int, ATBPaymentOption>(PaymentOption.pop_payment_method_id, PaymentOption));
|
if (!this->currentPaymentOptions.isEmpty()) {
|
||||||
break;
|
ATBPaymentOption const &PaymentOption = this->currentPaymentOptions.last();
|
||||||
|
cfg->PaymentOption.insert(pair<int, ATBPaymentOption>(PaymentOption.pop_payment_method_id, PaymentOption));
|
||||||
|
}
|
||||||
|
} break;
|
||||||
case MemberType::DurationType:
|
case MemberType::DurationType:
|
||||||
cfg->Duration.insert(pair<int, ATBDuration>(Duration.pun_id, Duration));
|
cfg->Duration.insert(pair<int, ATBDuration>(Duration.pun_id, Duration));
|
||||||
break;
|
break;
|
||||||
@@ -453,10 +471,12 @@ bool Configuration::ParseJson(Configuration* cfg, const char* json)
|
|||||||
}
|
}
|
||||||
|
|
||||||
ATBPaymentOption const &Configuration::getPaymentOptions() const {
|
ATBPaymentOption const &Configuration::getPaymentOptions() const {
|
||||||
|
Q_ASSERT(!this->currentPaymentOptions.isEmpty());
|
||||||
return this->currentPaymentOptions.at(0);
|
return this->currentPaymentOptions.at(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
ATBPaymentOption &Configuration::getPaymentOptions() {
|
ATBPaymentOption &Configuration::getPaymentOptions() {
|
||||||
|
Q_ASSERT(!this->currentPaymentOptions.isEmpty());
|
||||||
return this->currentPaymentOptions[0];
|
return this->currentPaymentOptions[0];
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -479,7 +499,7 @@ Configuration::getDailyTicketsForAllKeys() const {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (tickets.size() > 0) {
|
if (tickets.size() > 0) {
|
||||||
value.value_or(tickets);
|
value = value.value_or(tickets);
|
||||||
}
|
}
|
||||||
|
|
||||||
return value;
|
return value;
|
||||||
@@ -490,18 +510,14 @@ Configuration::getDailyTicketsForKey(int key) const {
|
|||||||
QVector<ATBDailyTicket> tickets;
|
QVector<ATBDailyTicket> tickets;
|
||||||
std::optional<QVector<ATBDailyTicket>> value;
|
std::optional<QVector<ATBDailyTicket>> value;
|
||||||
|
|
||||||
std::pair<
|
tickets.clear();
|
||||||
std::multimap<int, ATBDailyTicket>::const_iterator,
|
|
||||||
std::multimap<int, ATBDailyTicket>::const_iterator
|
|
||||||
> p = this->DailyTicket.equal_range(key);
|
|
||||||
|
|
||||||
for (std::multimap<int, ATBDailyTicket>::const_iterator it = p.first;
|
for (auto[it, rangeEnd] = this->DailyTicket.equal_range(key); it != rangeEnd; ++it) {
|
||||||
it != p.second; ++it) {
|
|
||||||
tickets.append(it->second);
|
tickets.append(it->second);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (tickets.size() > 0) {
|
if (tickets.size() > 0) {
|
||||||
value.value_or(tickets);
|
value = value.value_or(tickets);
|
||||||
}
|
}
|
||||||
|
|
||||||
return value;
|
return value;
|
||||||
@@ -518,7 +534,7 @@ Configuration::getPaymentRateForAllKeys() const {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (paymentRates.size() > 0) {
|
if (paymentRates.size() > 0) {
|
||||||
value.value_or(paymentRates);
|
value = value.value_or(paymentRates);
|
||||||
}
|
}
|
||||||
|
|
||||||
return value;
|
return value;
|
||||||
@@ -530,18 +546,14 @@ Configuration::getPaymentRateForKey(int key) const {
|
|||||||
QVector<ATBPaymentRate> paymentRate;
|
QVector<ATBPaymentRate> paymentRate;
|
||||||
std::optional<QVector<ATBPaymentRate>> value;
|
std::optional<QVector<ATBPaymentRate>> value;
|
||||||
|
|
||||||
std::pair<
|
paymentRate.clear();
|
||||||
std::multimap<int, ATBPaymentRate>::const_iterator,
|
|
||||||
std::multimap<int, ATBPaymentRate>::const_iterator
|
|
||||||
> p = this->PaymentRate.equal_range(key);
|
|
||||||
|
|
||||||
for (std::multimap<int, ATBPaymentRate>::const_iterator it = p.first;
|
for (auto[it, rangeEnd] = this->PaymentRate.equal_range(key); it != rangeEnd; ++it) {
|
||||||
it != p.second; ++it) {
|
|
||||||
paymentRate.append(it->second);
|
paymentRate.append(it->second);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (paymentRate.size() > 0) {
|
if (paymentRate.size() > 0) {
|
||||||
value.value_or(paymentRate);
|
value = value.value_or(paymentRate);
|
||||||
}
|
}
|
||||||
|
|
||||||
return value;
|
return value;
|
||||||
@@ -567,10 +579,12 @@ Configuration::getWeekDayWorkTime(QTime const &time, Qt::DayOfWeek dayOfWeek) {
|
|||||||
|
|
||||||
std::multimap<int, ATBWeekDaysWorktime>::const_iterator it = this->WeekDaysWorktime.find((int)dayOfWeek);
|
std::multimap<int, ATBWeekDaysWorktime>::const_iterator it = this->WeekDaysWorktime.find((int)dayOfWeek);
|
||||||
if (it != this->WeekDaysWorktime.cend()) {
|
if (it != this->WeekDaysWorktime.cend()) {
|
||||||
|
|
||||||
ATBWeekDaysWorktime const &wt = it->second;
|
ATBWeekDaysWorktime const &wt = it->second;
|
||||||
if (QTime::fromString(wt.pwd_time_from.c_str(), Qt::ISODate) >= time
|
|
||||||
&& QTime::fromString(wt.pwd_time_to.c_str(), Qt::ISODate) < time) {
|
if (time >= QTime::fromString(wt.pwd_time_from.c_str(), Qt::ISODate)
|
||||||
value.value_or(wt);
|
&& time < QTime::fromString(wt.pwd_time_to.c_str(), Qt::ISODate)) {
|
||||||
|
value = value.value_or(wt);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -354,22 +354,24 @@ bool Utilities::isCarryOverNotSet(Configuration const *cfg, PaymentMethod paymen
|
|||||||
}
|
}
|
||||||
|
|
||||||
PaymentMethod Utilities::getPaymentMethodId(Configuration const *cfg) {
|
PaymentMethod Utilities::getPaymentMethodId(Configuration const *cfg) {
|
||||||
if (cfg->PaymentOption.size() != 1) {
|
if (cfg->PaymentOption.size() == 0) {
|
||||||
return PaymentMethod::Undefined;
|
return PaymentMethod::Undefined;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::multimap<int, ATBPaymentOption>::const_iterator it =
|
std::multimap<int, ATBPaymentOption>::const_iterator it =
|
||||||
cfg->PaymentOption.cbegin();
|
cfg->PaymentOption.cbegin();
|
||||||
|
|
||||||
switch (it->first) {
|
if (it != cfg->PaymentOption.cend()) {
|
||||||
case PaymentMethod::Linear:
|
switch (it->first) {
|
||||||
return PaymentMethod::Linear;
|
case PaymentMethod::Linear:
|
||||||
case PaymentMethod::Steps:
|
return PaymentMethod::Linear;
|
||||||
return PaymentMethod::Steps;
|
case PaymentMethod::Steps:
|
||||||
case PaymentMethod::Degressive:
|
return PaymentMethod::Steps;
|
||||||
return PaymentMethod::Degressive;
|
case PaymentMethod::Degressive:
|
||||||
case PaymentMethod::Progressive:
|
return PaymentMethod::Degressive;
|
||||||
return PaymentMethod::Progressive;
|
case PaymentMethod::Progressive:
|
||||||
|
return PaymentMethod::Progressive;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return PaymentMethod::Undefined;
|
return PaymentMethod::Undefined;
|
||||||
@@ -403,18 +405,22 @@ uint32_t Utilities::getFirstDurationStep(Configuration const *cfg, PaymentMethod
|
|||||||
|
|
||||||
BusinessHours Utilities::getBusinessHours(Configuration const *cfg, PaymentMethod methodId) {
|
BusinessHours Utilities::getBusinessHours(Configuration const *cfg, PaymentMethod methodId) {
|
||||||
int businessHours = cfg->PaymentOption.find(methodId)->second.pop_business_hours;
|
int businessHours = cfg->PaymentOption.find(methodId)->second.pop_business_hours;
|
||||||
|
|
||||||
|
qCritical() << __func__ << ":" << __LINE__ << businessHours;
|
||||||
|
|
||||||
switch (businessHours) {
|
switch (businessHours) {
|
||||||
case NoRestriction_24_7: return NoRestriction_24_7;
|
case NoRestriction_24_7: return BusinessHours::NoRestriction_24_7;
|
||||||
case OnlyWorkingDays: return OnlyWorkingDays;
|
case OnlyWorkingDays: return BusinessHours::OnlyWorkingDays;
|
||||||
case OnlyWeekDays: return OnlyWeekDays;
|
case OnlyWeekDays: return BusinessHours::OnlyWeekDays;
|
||||||
case OnlyWeekEnd: return OnlyWeekEnd;
|
case OnlyWeekEnd: return BusinessHours::OnlyWeekEnd;
|
||||||
case OnlyOfficialHolidays: return OnlyOfficialHolidays;
|
case OnlyOfficialHolidays: return BusinessHours::OnlyOfficialHolidays;
|
||||||
case OnlySpecialDays: return OnlySpecialDays;
|
case OnlySpecialDays: return BusinessHours::OnlySpecialDays;
|
||||||
case OnlySchoolHolidays: return OnlySchoolHolidays;
|
case OnlySchoolHolidays: return BusinessHours::OnlySchoolHolidays;
|
||||||
case SpecialAndSchoolHolidays: return SpecialAndSchoolHolidays;
|
case SpecialAndSchoolHolidays: return BusinessHours::SpecialAndSchoolHolidays;
|
||||||
case OnlyOpenForBusinessDays: return OnlyOpenForBusinessDays;
|
case OnlyOpenForBusinessDays: return BusinessHours::OnlyOpenForBusinessDays;
|
||||||
|
case AllDaysWithRestrictedHours: return BusinessHours::AllDaysWithRestrictedHours;
|
||||||
}
|
}
|
||||||
return NoBusinessHoursDefined;
|
return BusinessHours::NoBusinessHoursDefined;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t Utilities::computeWeekDaysPrice(Configuration const *cfg, PaymentMethod id) {
|
uint32_t Utilities::computeWeekDaysPrice(Configuration const *cfg, PaymentMethod id) {
|
||||||
|
|||||||
@@ -31,7 +31,7 @@ extern "C" char* strptime(const char* s,
|
|||||||
#include <fstream>
|
#include <fstream>
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
#include "calculator_functions.h"
|
#include "calculator_functions.h"
|
||||||
#include <calculate_price.h>
|
#include "calculate_price.h"
|
||||||
|
|
||||||
#define SZEGED (0)
|
#define SZEGED (0)
|
||||||
#define SCHOENAU_KOENIGSEE (0)
|
#define SCHOENAU_KOENIGSEE (0)
|
||||||
@@ -133,18 +133,37 @@ int main() {
|
|||||||
cout << endl;
|
cout << endl;
|
||||||
|
|
||||||
if (isParsed) {
|
if (isParsed) {
|
||||||
|
QDateTime s(QDate(2023, 11, 30), QTime());
|
||||||
|
QDateTime end;
|
||||||
|
struct price_t price;
|
||||||
|
for (int offset = 480; offset < 1080; ++offset) {
|
||||||
|
QDateTime start = s.addSecs(offset * 60);
|
||||||
|
|
||||||
|
// qCritical() << QString(Calculator::GetInstance().isParkingAllowed(&cfg, start));
|
||||||
|
|
||||||
|
CalcState cs = compute_price_for_daily_ticket(&cfg, start, end,
|
||||||
|
PERMIT_TYPE::DAY_TICKET_ADULT, &price);
|
||||||
|
qCritical() << "start=" << start.toString(Qt::ISODate)
|
||||||
|
<< "end" << end.toString(Qt::ISODate) << "price" << price.netto;
|
||||||
|
}
|
||||||
|
for (int offset = 480; offset < 1080; ++offset) {
|
||||||
|
QDateTime start = s.addSecs(offset * 60);
|
||||||
|
CalcState cs = compute_price_for_daily_ticket(&cfg, start, end,
|
||||||
|
PERMIT_TYPE::DAY_TICKET_TEEN, &price);
|
||||||
|
qCritical() << "start=" << start.toString(Qt::ISODate)
|
||||||
|
<< "end" << end.toString(Qt::ISODate) << "price" << price.netto;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if NEUHAUSER_LINSINGER_MASCHINENBAU==1
|
#if NEUHAUSER_LINSINGER_MASCHINENBAU==1
|
||||||
std::ifstream input("/tmp/tariff_linsinger_maschinenbau.json");
|
std::ifstream input("/opt/ptu5/opt/customer_741/etc/psa_tariff/tariff01.json");
|
||||||
|
|
||||||
std::stringstream sstr;
|
std::stringstream sstr;
|
||||||
while(input >> sstr.rdbuf());
|
while(input >> sstr.rdbuf());
|
||||||
std::string json(sstr.str());
|
std::string json(sstr.str());
|
||||||
|
|
||||||
Calculator calculator;
|
|
||||||
Configuration cfg;
|
Configuration cfg;
|
||||||
|
|
||||||
bool isParsed = cfg.ParseJson(&cfg, json.c_str());
|
bool isParsed = cfg.ParseJson(&cfg, json.c_str());
|
||||||
@@ -163,14 +182,14 @@ int main() {
|
|||||||
QDateTime start = s.addSecs(offset * 60);
|
QDateTime start = s.addSecs(offset * 60);
|
||||||
//qCritical() << "start" << start.toString(Qt::ISODate);
|
//qCritical() << "start" << start.toString(Qt::ISODate);
|
||||||
|
|
||||||
double cost = calculator.GetCostFromDuration(&cfg, 4, start, end, marken[duration], nextDay, prePaid);
|
double cost = Calculator::GetInstance().GetCostFromDuration(&cfg, 4, start, end, marken[duration], nextDay, prePaid);
|
||||||
//qCritical() << "";
|
//qCritical() << "";
|
||||||
//qCritical() << "start" << start.toString(Qt::ISODate)
|
//qCritical() << "start" << start.toString(Qt::ISODate)
|
||||||
// << "end" << end.toString(Qt::ISODate)
|
// << "end" << end.toString(Qt::ISODate)
|
||||||
// << "duration" << marken[duration]
|
// << "duration" << marken[duration]
|
||||||
// << "cost" << cost;
|
// << "cost" << cost;
|
||||||
|
|
||||||
std::string d = calculator.GetDurationFromCost(&cfg, 4, start.toString(Qt::ISODate).toStdString().c_str(), cost);
|
std::string d = Calculator::GetInstance().GetDurationFromCost(&cfg, 4, start.toString(Qt::ISODate).toStdString().c_str(), cost);
|
||||||
qCritical() << "start" << start.toString(Qt::ISODate)
|
qCritical() << "start" << start.toString(Qt::ISODate)
|
||||||
<< "cost" << cost
|
<< "cost" << cost
|
||||||
<< "until" << d.c_str() << start.secsTo(QDateTime::fromString(d.c_str(), Qt::ISODate)) / 60;
|
<< "until" << d.c_str() << start.secsTo(QDateTime::fromString(d.c_str(), Qt::ISODate)) / 60;
|
||||||
@@ -230,33 +249,37 @@ int main() {
|
|||||||
|
|
||||||
#elif SZEGED==1
|
#elif SZEGED==1
|
||||||
std::ifstream input;
|
std::ifstream input;
|
||||||
|
int pop_min_time;
|
||||||
int pop_max_time;
|
int pop_max_time;
|
||||||
|
int pop_min_price;
|
||||||
|
int pop_max_price;
|
||||||
|
|
||||||
for (int t=6; t < 7; t+=20) {
|
for (int t=2; t < 3; ++t) {
|
||||||
|
//for (int t=6; t < 7; t+=20) {
|
||||||
switch (t) {
|
switch (t) {
|
||||||
case 1: {
|
case 1: {
|
||||||
input.open("/opt/ptu5/opt/customer_281/etc/psa_tariff/tariff01.json");
|
input.open("/opt/ptu5/opt/customer_281/etc/psa_tariff/tariff01.json");
|
||||||
pop_max_time = 6*60;
|
//pop_max_time = 6*60;
|
||||||
} break;
|
} break;
|
||||||
case 2: {
|
case 2: {
|
||||||
input.open("/opt/ptu5/opt/customer_281/etc/psa_tariff/tariff02.json");
|
input.open("/opt/ptu5/opt/customer_281/etc/psa_tariff/tariff02.json");
|
||||||
pop_max_time = 5*60;
|
//pop_max_time = 5*60;
|
||||||
} break;
|
} break;
|
||||||
case 3: {
|
case 3: {
|
||||||
input.open("/opt/ptu5/opt/customer_281/etc/psa_tariff/tariff03.json");
|
input.open("/opt/ptu5/opt/customer_281/etc/psa_tariff/tariff03.json");
|
||||||
pop_max_time = 6*60;
|
//pop_max_time = 6*60;
|
||||||
} break;
|
} break;
|
||||||
case 4: {
|
case 4: {
|
||||||
input.open("/opt/ptu5/opt/customer_281/etc/psa_tariff/tariff04.json");
|
input.open("/opt/ptu5/opt/customer_281/etc/psa_tariff/tariff04.json");
|
||||||
pop_max_time = 4*60;
|
//pop_max_time = 4*60;
|
||||||
} break;
|
} break;
|
||||||
case 5: {
|
case 5: {
|
||||||
input.open("/opt/ptu5/opt/customer_281/etc/psa_tariff/tariff05.json");
|
input.open("/opt/ptu5/opt/customer_281/etc/psa_tariff/tariff05.json");
|
||||||
pop_max_time = 6*60;
|
//pop_max_time = 6*60;
|
||||||
} break;
|
} break;
|
||||||
case 6: {
|
case 6: {
|
||||||
input.open("/opt/ptu5/opt/customer_281/etc/psa_tariff/tariff06.json");
|
input.open("/opt/ptu5/opt/customer_281/etc/psa_tariff/tariff06.json");
|
||||||
pop_max_time = 4*60;
|
//pop_max_time = 4*60;
|
||||||
} break;
|
} break;
|
||||||
default:
|
default:
|
||||||
continue;
|
continue;
|
||||||
@@ -265,13 +288,24 @@ int main() {
|
|||||||
while(input >> sstr.rdbuf());
|
while(input >> sstr.rdbuf());
|
||||||
std::string json(sstr.str());
|
std::string json(sstr.str());
|
||||||
|
|
||||||
Calculator calculator;
|
|
||||||
Configuration cfg;
|
Configuration cfg;
|
||||||
|
|
||||||
bool isParsed = cfg.ParseJson(&cfg, json.c_str());
|
bool isParsed = cfg.ParseJson(&cfg, json.c_str());
|
||||||
cout << endl;
|
cout << endl;
|
||||||
|
|
||||||
if (isParsed) {
|
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);
|
||||||
|
|
||||||
|
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;
|
||||||
|
|
||||||
{
|
{
|
||||||
// zone 1 (lila)
|
// zone 1 (lila)
|
||||||
QDateTime s(QDate(2023, 11, 30), QTime());
|
QDateTime s(QDate(2023, 11, 30), QTime());
|
||||||
@@ -279,17 +313,17 @@ int main() {
|
|||||||
for (int duration = 15; duration <= pop_max_time; duration += 5) {
|
for (int duration = 15; duration <= pop_max_time; duration += 5) {
|
||||||
for (int offset = 480; offset < 1080; ++offset) {
|
for (int offset = 480; offset < 1080; ++offset) {
|
||||||
QDateTime start = s.addSecs(offset * 60);
|
QDateTime start = s.addSecs(offset * 60);
|
||||||
//qCritical() << "start" << start.toString(Qt::ISODate);
|
// qCritical() << "start" << start.toString(Qt::ISODate);
|
||||||
|
|
||||||
double cost = calculator.GetCostFromDuration(&cfg, 3, start, end, duration);
|
double cost = Calculator::GetInstance().GetCostFromDuration(&cfg, 3, start, end, duration);
|
||||||
//Q_ASSERT(cost == duration*2.5);
|
// Q_ASSERT(cost == duration*2.5);
|
||||||
//qCritical() << "";
|
qCritical() << "";
|
||||||
//qCritical() << "start" << start.toString(Qt::ISODate)
|
qCritical() << "start" << start.toString(Qt::ISODate)
|
||||||
// << "end" << end.toString(Qt::ISODate)
|
<< "end" << end.toString(Qt::ISODate)
|
||||||
// << "duration" << duration
|
<< "duration" << duration
|
||||||
// << "cost" << cost;
|
<< "cost" << cost;
|
||||||
|
|
||||||
std::string duration = calculator.GetDurationFromCost(&cfg, 3, start.toString(Qt::ISODate).toStdString().c_str(), cost);
|
std::string duration = Calculator::GetInstance().GetDurationFromCost(&cfg, 3, start.toString(Qt::ISODate).toStdString().c_str(), cost);
|
||||||
//Q_ASSERT(cost == duration*2.5);
|
//Q_ASSERT(cost == duration*2.5);
|
||||||
qCritical() << "start" << start.toString(Qt::ISODate)
|
qCritical() << "start" << start.toString(Qt::ISODate)
|
||||||
<< "cost" << cost
|
<< "cost" << cost
|
||||||
@@ -297,20 +331,22 @@ int main() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#if 0
|
||||||
{
|
{
|
||||||
QDateTime start(QDate(2023, 12, 1), QTime(18, 0));
|
QDateTime start(QDate(2023, 12, 1), QTime(18, 0));
|
||||||
QDateTime end;
|
QDateTime end;
|
||||||
double cost = calculator.GetCostFromDuration(&cfg, 3, start, end, 60);
|
double cost = Calculator::GetInstance().GetCostFromDuration(&cfg, 3, start, end, 60);
|
||||||
// Q_ASSERT(cost == 150);
|
// Q_ASSERT(cost == 150);
|
||||||
qCritical() << "end" << end.toString(Qt::ISODate) << "cost" << cost;
|
qCritical() << "end" << end.toString(Qt::ISODate) << "cost" << cost;
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
QDateTime start(QDate(2023, 10, 31), QTime(18, 0));
|
QDateTime start(QDate(2023, 10, 31), QTime(18, 0));
|
||||||
QDateTime end;
|
QDateTime end;
|
||||||
double cost = calculator.GetCostFromDuration(&cfg, 3, start, end, 60);
|
double cost = Calculator::GetInstance().GetCostFromDuration(&cfg, 3, start, end, 60);
|
||||||
//Q_ASSERT(cost == 150);
|
//Q_ASSERT(cost == 150);
|
||||||
qCritical() << "end" << end.toString(Qt::ISODate) << "cost" << cost;
|
qCritical() << "end" << end.toString(Qt::ISODate) << "cost" << cost;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user