#ifndef CALCULATE_PRICE_H #define CALCULATE_PRICE_H #include #include #include "tariff_time_range.h" #include #include #ifdef WIN32 #ifdef CALCULATE_LIBRARY_EXPORTS #define CALCULATE_LIBRARY_API __declspec(dllexport) #else #define CALCULATE_LIBRARY_API __declspec(dllimport) #endif #else #define CALCULATE_LIBRARY_API #endif #include "tariff_permit_type.h" class Configuration; typedef Configuration parking_tariff_t; //#ifdef __cplusplus //extern "C" { //#endif struct CALCULATE_LIBRARY_API price_t { uint32_t units; double netto; double brutto; double vat_percentage; double vat; explicit price_t() { units = 0; netto = brutto = vat_percentage = vat = 0.0; } }; struct CALCULATE_LIBRARY_API CalcState { enum class State : uint8_t { SUCCESS, ERROR_PARSING_ZONE_NR, ERROR_LOADING_TARIFF, ERROR_PARSING_TARIFF, 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, OVERPAID, OUTSIDE_ALLOWED_PARKING_TIME }; State m_status; QString m_desc; TariffTimeRange m_allowedTimeRange; 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 { return (m_status == State::SUCCESS); } QString toString() { QString s; switch (m_status) { case State::SUCCESS: s = "SUCCESS"; break; case State::ERROR_PARSING_ZONE_NR: s = "ERROR_PARSING_ZONE_NR"; break; case State::ERROR_LOADING_TARIFF: s = "ERROR_LOADING_TARIFF"; break; case State::ERROR_PARSING_TARIFF: s = "ERROR_PARSING_TARIFF"; break; case State::NEGATIVE_PARING_TIME: s = "NEGATIVE_PARKING_TIME"; break; case State::ABOVE_MAX_PARKING_TIME: s = "ABOVE_MAX_PARKING_TIME"; break; case State::WRONG_PARAM_VALUES: s = "WRONG_PARAM_VALUES"; break; case State::BELOW_MIN_PARKING_TIME: s = "BELOW_MIN_PARKING_TIME"; break; case State::BELOW_MIN_PARKING_PRICE: s = "BELOW_MIN_PARKING_PRICE"; break; case State::OVERPAID: s = "OVERPAID"; break; case State::INVALID_START_DATE: s = "INVALID_START_DATE"; break; case State::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; } explicit operator QString () const noexcept { QString s; switch (m_status) { case State::SUCCESS: s = "SUCCESS"; break; case State::ERROR_PARSING_ZONE_NR: s = "ERROR_PARSING_ZONE_NR"; break; case State::ERROR_LOADING_TARIFF: s = "ERROR_LOADING_TARIFF"; break; case State::ERROR_PARSING_TARIFF: s = "ERROR_PARSING_TARIFF"; break; case State::NEGATIVE_PARING_TIME: s = "NEGATIVE_PARKING_TIME"; break; case State::ABOVE_MAX_PARKING_TIME: s = "ABOVE_MAX_PARKING_TIME"; break; case State::WRONG_PARAM_VALUES: s = "WRONG_PARAM_VALUES"; break; case State::BELOW_MIN_PARKING_TIME: s = "BELOW_MIN_PARKING_TIME"; break; case State::BELOW_MIN_PARKING_PRICE: s = "BELOW_MIN_PARKING_PRICE"; break; case State::OVERPAID: s = "OVERPAID"; break; case State::INVALID_START_DATE: s = "INVALID_START_DATE"; break; case State::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; } CalcState &set(State s) { m_status = s; return *this; } CalcState &setStatus(State s) { return set(s); } State getStatus() const { return m_status; } 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, char const *config_file); void CALCULATE_LIBRARY_API free_tariff(parking_tariff_t *tariff); int CALCULATE_LIBRARY_API get_zone_nr(int zone = -1); int CALCULATE_LIBRARY_API compute_next_timestep(parking_tariff_t *tariff, int currentTimeMinutes, int UpDown); QList CALCULATE_LIBRARY_API get_time_steps(Configuration *cfg); int CALCULATE_LIBRARY_API get_minimal_parkingtime(Configuration *cfg, PERMIT_TYPE permitType = PERMIT_TYPE::SHORT_TERM_PARKING); int CALCULATE_LIBRARY_API get_maximal_parkingtime(Configuration *cfg, PERMIT_TYPE permitType = PERMIT_TYPE::SHORT_TERM_PARKING); int CALCULATE_LIBRARY_API get_minimal_parkingprice(Configuration *cfg, PERMIT_TYPE permitType = PERMIT_TYPE::SHORT_TERM_PARKING); int CALCULATE_LIBRARY_API get_maximal_parkingprice(Configuration *cfg, PERMIT_TYPE permitType = PERMIT_TYPE::SHORT_TERM_PARKING); int CALCULATE_LIBRARY_API compute_product_price(Configuration const *cfg, PERMIT_TYPE permitType = PERMIT_TYPE::SHORT_TERM_PARKING); CalcState CALCULATE_LIBRARY_API compute_price_for_parking_ticket( // deprecated parking_tariff_t *tariff, time_t start_parking_time, time_t end_parking_time, struct price_t *price); CalcState CALCULATE_LIBRARY_API compute_price_for_parking_ticket( parking_tariff_t *tariff, QDateTime &start_parking_time, int netto_parking_time, QDateTime &end_parking_time, // return value struct price_t *price, // return value bool prepaid = true); CalcState CALCULATE_LIBRARY_API compute_duration_for_parking_ticket( // deprecated parking_tariff_t *tariff, time_t start_parking_time, double cost, QString &duration); 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); CalcState CALCULATE_LIBRARY_API compute_price_for_daily_ticket( parking_tariff_t *tariff, QDateTime const &start_parking_time, QDateTime &ticketEndTime, PERMIT_TYPE permitType, struct price_t *price); //#ifdef __cplusplus //} // extern "C" //#endif #endif // CALCULATE_PRICE_H