Compare commits

...

37 Commits

Author SHA1 Message Date
GerhardHoffmann cb78e27d37 Re-Test. 2023-10-11 15:49:45 +02:00
GerhardHoffmann ff1dc4a10c Add header file for project-variables 2023-10-11 15:46:06 +02:00
GerhardHoffmann 9d9fbc91f9 Read Project, Version and Info fields from json-tariff-files 2023-10-11 15:45:27 +02:00
GerhardHoffmann e0ccec1ff2 Add header file atb_project.h 2023-10-11 15:43:13 +02:00
GerhardHoffmann 2974734642 Add ATBProject to configuration 2023-10-11 15:42:31 +02:00
GerhardHoffmann 6ea2ea7df7 Use helper functions GetTimeStep() and GetPriceForTimeStep() inside of
GetCostFromDuration().
2023-10-11 15:41:02 +02:00
GerhardHoffmann 7508cb6c45 Add helper functions GetTimeSteps() and GetPriceForTimeSteps(). 2023-10-11 15:40:13 +02:00
GerhardHoffmann 4925870227 Add helper functions for Schoenau: GetTimeSteps(0 and
GetPriceForTimeStep().
2023-10-11 15:38:35 +02:00
GerhardHoffmann c310f7a06d test cases for schoenau 2023-10-11 15:37:35 +02:00
GerhardHoffmann e99612fed9 draft for tariff files of schoenau 2023-10-11 15:36:40 +02:00
GerhardHoffmann 8e1ef45b3f remove obsolete files 2023-10-11 15:35:50 +02:00
SiegfriedSiegert d15c9dad29 Update tariff04 (virtual dayticket) 2023-06-27 17:43:58 +02:00
SiegfriedSiegert cb8cd5dead Merge branch 'moransBranch' 2023-06-14 11:28:27 +02:00
SiegfriedSiegert 9d64350e4f Merge branch 'moransBranch' of git.mimbach49.de:GerhardHoffmann/MOBILISIS-Calculator into moransBranch 2023-06-14 11:27:43 +02:00
GerhardHoffmann 1a71edc274 max_time=300, unit_id=1 2023-06-13 13:32:16 +02:00
GerhardHoffmann 51d8beda2a max_time=300, unit_id=1 2023-06-13 13:32:12 +02:00
GerhardHoffmann 7bab9d6ba2 max_time=300, unit_id=1 2023-06-13 13:32:08 +02:00
GerhardHoffmann 8b4d64bd0c max_time=300, unit_id=1 2023-06-13 13:31:42 +02:00
GerhardHoffmann eefdde4693 Removed section whith superfluous 'price_per_unit < 0' check.
Removed calc_price-caculation followed by shift of inputDate.
2023-06-13 12:12:23 +02:00
GerhardHoffmann 6157861d62 Monday starts with 1 2023-06-13 12:11:09 +02:00
SiegfriedSiegert 23748966de Merge branch 'moransBranch' of git.mimbach49.de:GerhardHoffmann/MOBILISIS-Calculator into moransBranch 2023-05-19 15:49:38 +02:00
MoranRod 7bd7f66666 Fixed pra_payment_unit_id 2023-05-17 10:08:02 +02:00
SiegfriedSiegert 268d43cdea GetDailyTicketDuration: use QDateTime for timestamps 2023-05-16 16:43:45 +02:00
SiegfriedSiegert a453886f0a Merge branch 'master' into moransBranch 2023-05-16 15:35:47 +02:00
SiegfriedSiegert eef94a3fb3 Change interface: use QDateTime
- use QDateTime instead of char*-string
 - GetCostFromDuration: add end_datetime as a return value
2023-05-16 15:31:53 +02:00
SiegfriedSiegert 88a0b6ebe2 Make main.c compile again 2023-05-16 11:10:49 +02:00
SiegfriedSiegert 3097819c01 Update interface for 'compute_duration_for_daily_ticket() 2023-05-16 11:07:21 +02:00
SiegfriedSiegert acf799da7e Add explaining comments 2023-05-15 17:37:51 +02:00
SiegfriedSiegert 3bf71f84d5 Merge branch 'moransBranch' 2023-05-15 17:33:51 +02:00
SiegfriedSiegert 73f5eca656 Tariff config: add day ticket 2023-05-15 17:23:10 +02:00
SiegfriedSiegert b8753cc2ed Update tariff config for test 2023-05-15 17:06:57 +02:00
SiegfriedSiegert 29986e0451 Merge branch 'moransBranch' of git.mimbach49.de:GerhardHoffmann/MOBILISIS-Calculator into moransBranch 2023-05-15 16:58:48 +02:00
SiegfriedSiegert 1146db743c Add explaining comments 2023-05-15 16:58:28 +02:00
SiegfriedSiegert c6302edec5 Format all json files 2023-05-15 16:57:45 +02:00
MoranRod 617eee39ed Daily ticket 2023-05-15 14:05:55 +02:00
MoranRod 6b3c1cbf0c Fix with min time in GetDurationFromCost 2023-05-14 17:19:24 +02:00
MoranRod 1142efaec2 Rounding minutes seems to be fixed ... 2023-05-14 16:15:37 +02:00
17 changed files with 3504 additions and 417 deletions
+13
View File
@@ -0,0 +1,13 @@
#ifndef ATB_PROJECT_H_INCLUDED
#define ATB_PROJECT_H_INCLUDED
#include <QString>
class ATBProject {
public:
QString project;
QString version;
QString info;
};
#endif // ATB_PROJECT_H_INCLUDED
+10 -4
View File
@@ -109,7 +109,7 @@ CalcState CALCULATE_LIBRARY_API init_tariff(parking_tariff_t **tariff,
void CALCULATE_LIBRARY_API free_tariff(parking_tariff_t *tariff);
int CALCULATE_LIBRARY_API get_zone_nr(int zone = -1);
CalcState CALCULATE_LIBRARY_API compute_price_for_parking_ticket(
CalcState CALCULATE_LIBRARY_API compute_price_for_parking_ticket( // deprecated
parking_tariff_t *tariff,
time_t start_parking_time,
time_t end_parking_time,
@@ -118,10 +118,11 @@ CalcState CALCULATE_LIBRARY_API compute_price_for_parking_ticket(
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);
int netto_parking_time,
QDateTime &end_parking_time, // return value
struct price_t *price); // return value
CalcState CALCULATE_LIBRARY_API compute_duration_for_parking_ticket(
CalcState CALCULATE_LIBRARY_API compute_duration_for_parking_ticket( // deprecated
parking_tariff_t *tariff,
time_t start_parking_time,
double cost,
@@ -131,6 +132,11 @@ CalcState CALCULATE_LIBRARY_API compute_duration_for_parking_ticket(
parking_tariff_t *tariff,
QDateTime const &start_parking_time,
double cost,
QDateTime &ticketEndTime); // return value
CalcState CALCULATE_LIBRARY_API compute_duration_for_daily_ticket(
parking_tariff_t *tariff,
QDateTime const &start_parking_time,
QDateTime &ticketEndTime);
//#ifdef __cplusplus
//} // extern "C"
@@ -1,7 +1,7 @@
#pragma once
#include <iostream>
#include "configuration.h"
#include <QDateTime>
using namespace std;
class Calculator
@@ -23,7 +23,19 @@ public:
/// <param name="tariff_cfg">Pointer to configuration</param>
/// <param name="vehicle_type">Type of vehicle</param>
/// <param name="start_datetime">Date/time of payment to be conducted in ISO8601 format (e.g. 2022-12-25T08:00:00Z) </param>
/// <param name="end_datetime">Date/time of park end to be conducted in ISO8601 format (e.g. 2022-12-25T08:00:00Z) </param>
/// <param name="durationMin">Duration of parking in minutes</param>
/// <returns>Returns cost (data type: double)</returns>
double GetCostFromDuration(Configuration* cfg, uint8_t vehicle_type, char const* start_datetime, double durationMin, bool nextDay = false, bool prepaid = false);
double GetCostFromDuration(Configuration* cfg, uint8_t vehicle_type, const QDateTime start_datetime, QDateTime & end_datetime, double durationMin, bool nextDay = false, bool prepaid = false);
// Daily ticket
QDateTime GetDailyTicketDuration(Configuration* cfg, const QDateTime start_datetime, uint8_t payment_option, bool carry_over);
//
// helper functions for Schoenau
//
QList<int> GetTimeSteps(Configuration const *cfg, int paymentOption);
//
double GetPriceForTimeStep(Configuration const *cfg, int paymentOption, int timeStep);
};
+2 -1
View File
@@ -20,6 +20,7 @@
#include "member_type.h"
#include "period_year.h"
#include "payment_rate.h"
#include "atb_project.h"
using namespace std;
using namespace rapidjson;
@@ -27,7 +28,7 @@ using namespace rapidjson;
class Configuration
{
public:
ATBProject project;
ATBCurrency Currency;
ATBDuration duration;
+3 -3
View File
@@ -2,12 +2,12 @@
enum DayOfWeek
{
Saturday = 0x06,
Sunday = 0x01,
Monday = 0x02,
Monday = 0x01,
Tuesday = 0x02,
Wednesday = 0x03,
Thursday = 0x04,
Friday = 0x05,
Saturday = 0x06,
Sunday = 0x07,
UndefinedDay = 0xFF
};
+1
View File
@@ -14,4 +14,5 @@ public:
double pop_max_time;
double pop_min_price;
int pop_carry_over;
int pop_daily_card_price;
};
+2 -1
View File
@@ -68,5 +68,6 @@ public:
/// </summary>
/// <param name="pra_price"></param>
/// <returns></returns>
static double CalculatePricePerUnit(double pra_price);
static double CalculatePricePerUnit(double pra_price, double durationUnit = -1);
};
+2 -1
View File
@@ -65,7 +65,8 @@ HEADERS += \
include/mobilisis/tariff_period_year.h \
include/mobilisis/tariff_payment_rate.h \
include/mobilisis/tariff_log.h \
include/mobilisis/calculate_price.h
include/mobilisis/calculate_price.h \
include/mobilisis/atb_project.h
OTHER_FILES += src/main.cpp
+50 -19
View File
@@ -92,10 +92,12 @@ void CALCULATE_LIBRARY_API free_tariff(parking_tariff_t *tariff) {
}
}
// this is currently not used
CalcState CALCULATE_LIBRARY_API compute_price_for_parking_ticket(
parking_tariff_t *tariff,
time_t start_parking_time, // in minutes
time_t end_parking_time, // in minutes
time_t end_parking_time, // netto time in minutes
struct price_t *price) {
CalcState calcState;
double minMin = tariff->PaymentOption.find(PaymentOption::Option1)->second.pop_min_time;
@@ -129,11 +131,12 @@ CalcState CALCULATE_LIBRARY_API compute_price_for_parking_ticket(
QTime const t(0, 0, 0);
QDateTime start(d, t, Qt::UTC);
start = start.toLocalTime().addSecs(start_parking_time * 60);
QDateTime end(start);
if (start.isValid()) {
QString cs = start.toString(Qt::ISODate);
double cost = calculator.GetCostFromDuration(
tariff, PaymentOption::Option1,
cs.toLocal8Bit().constData(),
start,
end,
duration, false, true);
double minCost = tariff->PaymentOption.find(PaymentOption::Option1)->second.pop_min_price;
if (cost < minCost) {
@@ -152,8 +155,10 @@ CalcState CALCULATE_LIBRARY_API compute_price_for_parking_ticket(
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) {
int netto_parking_time,
QDateTime &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;
@@ -161,39 +166,37 @@ CalcState CALCULATE_LIBRARY_API compute_price_for_parking_ticket(
// DEBUG
qCritical() << "compute_price_for_parking_ticket() " << endl
<< " start_parking_time: " << start_parking_time << endl
<< " end_parking_time: " << end_parking_time << endl
<< " netto_parking_time: " << netto_parking_time << endl
<< " minMin: " << minMin << endl
<< " maxMin: " << maxMin;
int const duration = (end_parking_time.toSecsSinceEpoch() -
start_parking_time.toSecsSinceEpoch()) / 60;
if (duration < 0) {
if (netto_parking_time < 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));
if (netto_parking_time > maxMin) {
calcState.setDesc(QString("duration=%1, maxMin=%2").arg(netto_parking_time).arg(maxMin));
return calcState.set(CalcState::State::ABOVE_MAX_PARKING_TIME);
}
if (duration < minMin) {
calcState.setDesc(QString("duration=%1, minMin=%2").arg(duration, minMin));
if (netto_parking_time < minMin) {
calcState.setDesc(QString("duration=%1, minMin=%2").arg(netto_parking_time).arg(minMin));
return calcState.set(CalcState::State::BELOW_MIN_PARKING_TIME);
}
if (duration == 0) {
if (netto_parking_time == 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);
start_parking_time, // starting time
end_parking_time, // return value: end time
netto_parking_time, // minutes, netto
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));
@@ -249,7 +252,8 @@ CalcState CALCULATE_LIBRARY_API compute_duration_for_parking_ticket(
parking_tariff_t *tariff,
QDateTime const &start_parking_time,
double price,
QDateTime &ticketEndTime) {
QDateTime &ticketEndTime)
{
CalcState calcState;
if (start_parking_time.isValid()) {
QString cs = start_parking_time.toString(Qt::ISODate);
@@ -274,3 +278,30 @@ CalcState CALCULATE_LIBRARY_API compute_duration_for_parking_ticket(
return calcState.set(CalcState::State::SUCCESS);
}
CalcState CALCULATE_LIBRARY_API compute_duration_for_daily_ticket(parking_tariff_t *tariff, QDateTime const &start_parking_time, QDateTime &ticketEndTime)
{
CalcState calcState;
if (start_parking_time.isValid()) {
ticketEndTime = calculator.GetDailyTicketDuration(tariff,
start_parking_time,
PaymentOption::Option1,
false); // carry over
// DEBUG
qCritical() << "compute_duration_for_daily_ticket(): ";
qCritical() << " ticketEndTime: " << ticketEndTime;
if (!ticketEndTime.isValid()) {
calcState.setDesc(QString("ticketEndTime=%1").arg(ticketEndTime.toString(Qt::ISODate)));
return calcState.set(CalcState::State::WRONG_ISO_TIME_FORMAT);
}
} else {
return calcState.set(CalcState::State::INVALID_START_DATE);
}
return calcState.set(CalcState::State::SUCCESS);
}
+171 -27
View File
@@ -19,6 +19,97 @@ inline struct tm* localtime_r(const time_t *clock, struct tm* result){
}
#endif
QDateTime Calculator::GetDailyTicketDuration(Configuration* cfg, const QDateTime start_datetime, uint8_t payment_option, bool carry_over)
{
if(!start_datetime.isValid()) {
return QDateTime();
}
double day_price = 0.0f;
int current_special_day_id = -1;
bool is_special_day = Utilities::CheckSpecialDay(cfg, start_datetime.toString(Qt::ISODate).toStdString().c_str(), &current_special_day_id, &day_price);
QDateTime inputDateTime = start_datetime;
QTime worktime_from;
QTime worktime_to;
int daily_card_price = cfg->PaymentOption.find(payment_option)->second.pop_daily_card_price;
if(daily_card_price <= 0) {
LOG_ERROR("Calculator::GetDailyTicketDuration(): Daily ticket price zero or less");
return QDateTime();
}
if(is_special_day)
{
worktime_from = QTime::fromString(cfg->SpecialDaysWorktime.find(current_special_day_id)->second.pedwt_time_from.c_str(), Qt::ISODate);
worktime_to = QTime::fromString(cfg->SpecialDaysWorktime.find(current_special_day_id)->second.pedwt_time_to.c_str(),Qt::ISODate);
if(inputDateTime.time() < worktime_from) inputDateTime.setTime(worktime_from);
if(carry_over) inputDateTime.setTime(worktime_from);
if(inputDateTime.time() >= worktime_to)
{
// Go to next day if outside worktime
inputDateTime = inputDateTime.addSecs(86400);
return GetDailyTicketDuration(cfg,inputDateTime, payment_option,true);
}
if(day_price <=0)
{
// Go to next day if special day price is 0
inputDateTime = inputDateTime.addSecs(86400);
return GetDailyTicketDuration(cfg,inputDateTime, payment_option,true);
}
int diff = abs(inputDateTime.time().secsTo(worktime_to));
inputDateTime = inputDateTime.addSecs(diff);
//qDebug() << "Ticket is valid until: " << inputDateTime.toString(Qt::ISODate) << "price = " << daily_card_price << ", duration = " << diff / 60;
return inputDateTime;
}
else
{
// Get day of week
int weekdayId = 0;
weekdayId = Utilities::ZellersAlgorithm(inputDateTime.date().day(),inputDateTime.date().month(),inputDateTime.date().year());
// If no working day found, skip it (recursively call method again)
size_t found = 0;
found = cfg->WeekDaysWorktime.count(weekdayId);
// When no workday found, go to next available day
if(found <=0)
{
inputDateTime = inputDateTime.addSecs(86400);
return GetDailyTicketDuration(cfg,inputDateTime, payment_option,true);
}
else
{
worktime_from = QTime::fromString(cfg->WeekDaysWorktime.find(weekdayId)->second.pwd_time_from.c_str(),Qt::ISODate);
worktime_to = QTime::fromString(cfg->WeekDaysWorktime.find(weekdayId)->second.pwd_time_to.c_str(),Qt::ISODate);
if(inputDateTime.time() < worktime_from)
inputDateTime.setTime(worktime_from);
if(carry_over)
inputDateTime.setTime(worktime_from);
if(inputDateTime.time() >= worktime_to)
{
// Go to next day if outside worktime
inputDateTime = inputDateTime.addSecs(86400);
return GetDailyTicketDuration(cfg,inputDateTime, payment_option,true);
}
int diff = abs(inputDateTime.time().secsTo(worktime_to));
inputDateTime = inputDateTime.addSecs(diff);
//qDebug() << "Ticket is valid until: " << inputDateTime.toString(Qt::ISODate) << "price = " << daily_card_price << ", duration = " << diff / 60;
return inputDateTime;
}
}
return QDateTime();
}
/// <inheritdoc/>
std::string Calculator::GetDurationFromCost(Configuration* cfg,
uint8_t payment_option,
@@ -43,6 +134,7 @@ std::string Calculator::GetDurationFromCost(Configuration* cfg,
double min_price = 0;
min_price = cfg->PaymentOption.find(payment_option)->second.pop_min_price;
if(price < min_price)
{
return "PARKING NOT ALLOWED";
@@ -90,8 +182,12 @@ std::string Calculator::GetDurationFromCost(Configuration* cfg,
else
{
// Set new price for the normal day
day_price = cfg->PaymentRate.find(payment_option)->second.pra_price;
price_per_unit = Utilities::CalculatePricePerUnit(day_price);
int pop_id = cfg->PaymentOption.find(payment_option)->second.pop_id;
day_price = cfg->PaymentRate.find(pop_id)->second.pra_price;
int durationId = cfg->PaymentRate.find(pop_id)->second.pra_payment_unit_id;
double durationUnit = cfg->Duration.find(durationId)->second.pun_duration;
price_per_unit = Utilities::CalculatePricePerUnit(day_price,durationUnit);
// If no working day found, skip it (recursively call method again)
size_t found = 0;
@@ -109,14 +205,9 @@ std::string Calculator::GetDurationFromCost(Configuration* cfg,
}
if (price_per_unit < 0) price_per_unit = 1.0f;
LOG_DEBUG("Calculated price per minute: ", price_per_unit);
if (price_per_unit < 0)
{
inputDate = inputDate.addDays(1);
inputDate.setTime(worktime_from);
return GetDurationFromCost(cfg, payment_option, inputDate.toString(Qt::ISODate).toStdString().c_str(), money_left, true);
}
// if((price/price_per_unit) < minMin) return "PARKING NOT ALLOWED";
LOG_DEBUG("Calculated price per minute: ", price_per_unit);
// If overtime flag is set
if (overtime || nextDay)
@@ -151,7 +242,7 @@ std::string Calculator::GetDurationFromCost(Configuration* cfg,
while(true)
{
if(money_left <= 0) break;
if((int)money_left <= 0) break;
// Check year period
bool isYearPeriodActive = false;
@@ -221,15 +312,15 @@ std::string Calculator::GetDurationFromCost(Configuration* cfg,
// }
double ret_val = 0;
double calc_price = (int)total_duration_min - (int)price / price_per_unit;
// double calc_price = (int)total_duration_min - (int)price / price_per_unit;
if (calc_price > 0 && total_duration_min > 0)
{
inputDate = inputDate.addSecs(-(int)ceil(calc_price) * 60);
}
//if (calc_price > 0 && total_duration_min > 0)
//{
// inputDate = inputDate.addSecs(-(int)ceil(calc_price) * 60);
//}
if(price >= min_price && total_duration_min >= minMin)
qDebug() << "Valid until: " << inputDate.toString(Qt::ISODate);
qDebug() << "GetDurationFromCost(): Valid until: " << inputDate.toString(Qt::ISODate);
else
{
qDebug() << "Parking not allowed";
@@ -248,10 +339,19 @@ std::string Calculator::GetDurationFromCost(Configuration* cfg,
///////////////////////////////////////
/// <inheritdoc/>
double Calculator::GetCostFromDuration(Configuration* cfg, uint8_t payment_option, const char* start_datetime, double durationMin, bool nextDay, bool prepaid)
double Calculator::GetCostFromDuration(Configuration* cfg, uint8_t payment_option, const QDateTime start_datetime, QDateTime & end_datetime, double durationMin, bool nextDay, bool prepaid)
{
if (cfg->project.project == "Schoenau" || cfg->project.project == "schoenau") {
static QList<int> const timeSteps = GetTimeSteps(cfg, payment_option);
if (!timeSteps.contains(durationMin)) {
return 0.0f; // error: timestep not valid
}
return GetPriceForTimeStep(cfg, payment_option, durationMin);
}
// Get input date
QDateTime inputDate = QDateTime::fromString(start_datetime,Qt::ISODate);
QDateTime inputDate = start_datetime;
// Get day of week
int weekdayId = 0;
@@ -321,8 +421,13 @@ double Calculator::GetCostFromDuration(Configuration* cfg, uint8_t payment_optio
else
{
// Set new price for the normal day
day_price = cfg->PaymentRate.find(payment_option)->second.pra_price;
price_per_unit = Utilities::CalculatePricePerUnit(day_price);
int pop_id = cfg->PaymentOption.find(payment_option)->second.pop_id;
day_price = cfg->PaymentRate.find(pop_id)->second.pra_price;
int durationId = cfg->PaymentRate.find(pop_id)->second.pra_payment_unit_id;
double durationUnit = cfg->Duration.find(durationId)->second.pun_duration;
price_per_unit = Utilities::CalculatePricePerUnit(day_price,durationUnit);
// If no working day found, skip it (recursively call method again)
size_t found = 0;
@@ -333,7 +438,7 @@ double Calculator::GetCostFromDuration(Configuration* cfg, uint8_t payment_optio
{
LOG_DEBUG("- No workday found, trying to find next available day");
inputDate = inputDate.addDays(1);
return floor(GetCostFromDuration(cfg, payment_option, inputDate.toString(Qt::ISODate).toStdString().c_str(), durationMin, true, prepaid));
return floor(GetCostFromDuration(cfg, payment_option, inputDate, end_datetime, durationMin, true, prepaid));
}
worktime_from = QTime::fromString(cfg->WeekDaysWorktime.find(weekdayId)->second.pwd_time_from.c_str());
worktime_to = QTime::fromString(cfg->WeekDaysWorktime.find(weekdayId)->second.pwd_time_to.c_str());
@@ -346,7 +451,7 @@ double Calculator::GetCostFromDuration(Configuration* cfg, uint8_t payment_optio
{
inputDate = inputDate.addDays(1);
inputDate.setTime(worktime_from);
return GetCostFromDuration(cfg, payment_option, inputDate.toString(Qt::ISODate).toStdString().c_str(), durationMin, true, prepaid);
return GetCostFromDuration(cfg, payment_option, inputDate, end_datetime, durationMin, true, prepaid);
}
// If overtime flag is set
@@ -376,7 +481,7 @@ double Calculator::GetCostFromDuration(Configuration* cfg, uint8_t payment_optio
{
LOG_DEBUG(" *** PREPAID *** Current time is past the time range end, searching for next available day");
inputDate = inputDate.addDays(1);
return GetCostFromDuration(cfg, payment_option, inputDate.toString(Qt::ISODate).toStdString().c_str(), durationMin, true, prepaid);
return GetCostFromDuration(cfg, payment_option, inputDate, end_datetime, durationMin, true, prepaid);
}
}
@@ -417,17 +522,18 @@ double Calculator::GetCostFromDuration(Configuration* cfg, uint8_t payment_optio
return 0.0f;
}
int carry_over_status = 0;
carry_over_status = cfg->PaymentOption.find(payment_option)->second.pop_carry_over;
// Go to next day if minutes not spent
if(inputDate.time() >= worktime_to)
{
int carry_over_status = 0;
carry_over_status = cfg->PaymentOption.find(payment_option)->second.pop_carry_over;
if (carry_over_status < 1) break;
LOG_DEBUG("Reached end of worktime, searching for the next working day");
inputDate = inputDate.addDays(1);
overtime = true;
return GetCostFromDuration(cfg, payment_option, inputDate.toString(Qt::ISODate).toStdString().c_str(), total_duration_min);
return GetCostFromDuration(cfg, payment_option, inputDate, end_datetime, total_duration_min);
}
// Increment input date minutes for each monetary unit
@@ -436,8 +542,46 @@ double Calculator::GetCostFromDuration(Configuration* cfg, uint8_t payment_optio
total_cost += price_per_unit;
}
qDebug() << "Valid until:" << inputDate.toString(Qt::ISODate).toStdString().c_str();
qDebug() << "GetCostFromDuration(): Valid until:" << inputDate.toString(Qt::ISODate).toStdString().c_str();
end_datetime = inputDate;
double ret_val = total_cost;
total_cost = 0.0f;
return ceil(ret_val);
}
QList<int> Calculator::GetTimeSteps(Configuration const *cfg, int paymentOption) {
QList<int> timeSteps;
int const pop_id = cfg->PaymentOption.find(paymentOption)->second.pop_id;
for (auto[itr, rangeEnd] = cfg->PaymentRate.equal_range(pop_id); itr != rangeEnd; ++itr)
{
int const durationId = itr->second.pra_payment_unit_id;
int const durationUnit = cfg->Duration.find(durationId)->second.pun_duration;
timeSteps << durationUnit;
}
return timeSteps;
}
double Calculator::GetPriceForTimeStep(Configuration const *cfg, int paymentOption, int timeStep) {
int const pop_id = cfg->PaymentOption.find(paymentOption)->second.pop_id;
for (auto[itr, rangeEnd] = cfg->PaymentRate.equal_range(pop_id); itr != rangeEnd; ++itr)
{
int const payment_unit_id = itr->second.pra_payment_unit_id;
int const pun_id = cfg->Duration.find(payment_unit_id)->second.pun_id;
Q_ASSERT(pun_id == payment_unit_id);
int const pun_duration = cfg->Duration.find(payment_unit_id)->second.pun_duration;
if (timeStep == pun_duration) {
return itr->second.pra_price;
}
}
return 0.0;
}
+19 -6
View File
@@ -1,4 +1,5 @@
#include "configuration.h"
#include <QDebug>
/// <inheritdoc/>
MemberType Configuration::IdentifyJsonMember(const char* member_name)
@@ -87,13 +88,24 @@ bool Configuration::ParseJson(Configuration* cfg, const char* json)
const char* mb_name = i->name.GetString();
if (mb_name == NULL) continue;
// if (!document[mb_name].IsArray()) {
std::string const _mb_name(mb_name);
if (_mb_name == "version" || _mb_name == "project" ||
_mb_name == "zone" || _mb_name == "info") {
if (document[mb_name].IsString()) {
QString const _mb_name(mb_name);
if (_mb_name.startsWith("Project", Qt::CaseInsensitive)) {
cfg->project.project = document[mb_name].GetString();
qDebug() << "PROJECT" << cfg->project.project;
continue;
}
// }
if (_mb_name.startsWith("Version", Qt::CaseInsensitive)) {
cfg->project.version = document[mb_name].GetString();
qDebug() << "VERSION" << cfg->project.version;
continue;
}
if (_mb_name.startsWith("Info", Qt::CaseInsensitive)) {
cfg->project.info = document[mb_name].GetString();
qDebug() << "INFO" << cfg->project.info;
continue;
}
}
//printf(" -%s\n", mb_name);
@@ -154,6 +166,7 @@ bool Configuration::ParseJson(Configuration* cfg, const char* json)
else if (strcmp(inner_obj_name, "pop_max_time") == 0) PaymentOption.pop_max_time = k->value.GetDouble();
else if (strcmp(inner_obj_name, "pop_min_price") == 0) PaymentOption.pop_min_price = k->value.GetDouble();
else if (strcmp(inner_obj_name, "pop_carry_over") == 0) PaymentOption.pop_carry_over = k->value.GetInt();
else if (strcmp(inner_obj_name, "pop_daily_card_price") == 0) PaymentOption.pop_daily_card_price = k->value.GetInt();
break;
case MemberType::DurationType:
if (strcmp(inner_obj_name, "pun_id") == 0) Duration.pun_id = k->value.GetInt();
@@ -209,7 +222,7 @@ bool Configuration::ParseJson(Configuration* cfg, const char* json)
cfg->PaymentMethod.insert(pair<int, ATBPaymentMethod>(PaymentMethod.pme_id, PaymentMethod));
break;
case MemberType::PaymentRateType:
cfg->PaymentRate.insert(pair<int, ATBPaymentRate>(PaymentRate.pra_payment_unit_id, PaymentRate));
cfg->PaymentRate.insert(pair<int, ATBPaymentRate>(PaymentRate.pra_payment_option_id, PaymentRate));
break;
case MemberType::PaymentOptionType:
cfg->PaymentOption.insert(pair<int, ATBPaymentOption>(PaymentOption.pop_payment_method_id, PaymentOption));
+5 -2
View File
@@ -8,12 +8,15 @@ static int protection_counter = 0;
/// </summary>
/// <param name="pra_price"></param>
/// <returns></returns>
double Utilities::CalculatePricePerUnit(double pra_price)
double Utilities::CalculatePricePerUnit(double pra_price, double durationUnit)
{
try
{
double price_per_unit = pra_price;
price_per_unit /= 60.0f; // Divided by 60 because price per unit is set per hour and we are using minutes
double unit = durationUnit;
if(unit < 0 || unit > 65535 ) unit = 60.0f;
price_per_unit /= unit; // Divided by 60 because price per unit is set per hour and we are using minutes
//printf("Price per unit (min) is: %lf\n", price_per_unit);
return price_per_unit;
}
+20 -309
View File
File diff suppressed because one or more lines are too long
+1592 -1
View File
File diff suppressed because one or more lines are too long
+1562 -1
View File
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long