161 lines
6.1 KiB
Groff
161 lines
6.1 KiB
Groff
#include <QDebug>
|
|
#include <QDateTime>
|
|
|
|
#include "calculate_parking_tickets.h"
|
|
#include "calculate_parking_tickets_algorithms.h"
|
|
#include "calculate_parking_tickets_tariff.h"
|
|
#include "calculate_parking_tickets_utils.h"
|
|
#include "message_handler.h"
|
|
|
|
int main() {
|
|
|
|
if (!messageHandlerInstalled()) { // change internal qt-QDebug-handling
|
|
atbInstallMessageHandler(atbDebugOutput);
|
|
setDebugLevel(QtMsgType::QtDebugMsg);
|
|
}
|
|
|
|
/*
|
|
Germersheim:
|
|
Freiparkzeit: 90 min
|
|
Stundentarif: 7:00 - 20:00 3,50 Euro/h
|
|
Tagesmaximum: 18 Euro, gueltig 24h ab einfahrt
|
|
Nacht-Tarif: 20:00 - 7:00: 8 Euro
|
|
|
|
Fragen:
|
|
1. Fuer die Abrechnung bleiben mehrere Moeglichkeiten.
|
|
a: minutengenau: eine Minute kostet 0.0583 Euro (bzw. 0.012 Euro nachts).
|
|
b: im Stunden-Raster ausgerichtet an der tatsaechlichen Uhrzeit
|
|
wie angeben: jede angefangene Stunde kostet 3.50 Euro bzw.
|
|
8 Euro Nacht-Tarif.
|
|
|
|
Beispiele:
|
|
zu b: Einfahrt um 18:24 Uhr. Bis 19:54 Uhr ist dann frei. Die 6 Minuten
|
|
bis 20:00 Uhr kosten dann 3.50 Euro. Ausfahrt um 21.00 Uhr: kostet
|
|
dann 8 Euro, insgesamt also 11.50 Euro.
|
|
zu a: wie vor, nur minutengenaue Abrechnung: 6 Minuten kosten dann
|
|
6*0.0583 = 0.35 Euro, plus 1h nachts: 60*0.012 = 0.72 Euro,
|
|
insgesamt also 1.07 Euro.
|
|
|
|
Was (logisch) nicht moeglich ist: ein Stunden-Raster, das nicht an der
|
|
tatsaechlichen Uhrzeit ausgerichtet ist.
|
|
Beispiel: Einfahrt 18:00 Uhr, frei bis 19:30 Uhr. Wie soll nun die
|
|
naechste Stunde berechnet werden? Nach Tag- oder Nacht-Tariff?
|
|
|
|
2: Tagesmaximum
|
|
a: Es gibt also eine maximale Parkzeit von 24h, und der maximale Preis
|
|
ist 18 Euro? Oder gibt es kein Maximum fuer die Parkdauer, aber der
|
|
Preis ab 24h Parkdauer betraegt einheitlich 18 Euro.
|
|
|
|
Im zweiten Fall waere dann Folgendes moeglich:
|
|
Einfahrt 5:30 Uhr, frei bis 7:00 Uhr.
|
|
Kosten von 7:00 - 20:00 Uhr: 13*3.50 = 45.50 Euro.
|
|
Kosten von 20:00 - 7:00 Uhr: 8 Euro.
|
|
Ausfahrt: 8:00 Uhr: 3.50 Euro, insgesamt eigentlich 57 Euro,
|
|
nach obiger Regel aber dann nur 18 Euro.
|
|
*/
|
|
|
|
/*
|
|
TODO:
|
|
1: Abrechnungsmodus:
|
|
a: minutengenau
|
|
b: 15-min-Raster, ausgerichtet an der tatseachlichen Uhrzeit
|
|
b: 30-min-Raster, ausgerichtet an der tatseachlichen Uhrzeit
|
|
b: 60-min-Raster, ausgerichtet an der tatseachlichen Uhrzeit
|
|
c: wie im Tarif angegeben mit einer moeglichst groben Aufloesung.
|
|
*/
|
|
|
|
parking_tariff_t *tariff = new parking_tariff_t();
|
|
|
|
tariff->unit_scale_factor = 1.0;
|
|
tariff->unit_definition = 1000;
|
|
tariff->waiting_period = 0;
|
|
// tariff->waiting_period = 90;
|
|
|
|
int const si = sizeof(TariffStep);
|
|
qDebug() << si;
|
|
QDate today = QDate::currentDate();
|
|
int todayWeekDay = today.dayOfWeek();
|
|
if (todayWeekDay > Qt::Monday) {
|
|
int day = today.day() - todayWeekDay;
|
|
if (!today.setDate(today.year(), today.month(), day)) {
|
|
qFatal("Setting today failed");
|
|
}
|
|
}
|
|
QDate sunday = today;
|
|
qDebug() << sunday;
|
|
for (int i = Qt::Monday; i <= Qt::Sunday; ++i) {
|
|
// days start at midnight
|
|
QDateTime startMinute(sunday.addDays(i), QTime( 0, 0));
|
|
|
|
//qDebug() << "startMinute=" << startMinute << startMinute.date().dayOfWeek();
|
|
|
|
// first block: 0:00 - 7:00. night-tariff.
|
|
TariffStep *current = &tariff->m_tariffSteps[i][0];
|
|
TariffStep *next = &tariff->m_tariffSteps[i][7*60];
|
|
*current = TariffStep(startMinute, 0, next);
|
|
|
|
//qDebug() << "current =" << "c=" << current << current->startMinute() << current->price() << "n=" << current->next();
|
|
//qDebug() << "offset =" << ((char *)current->next() - (char *)&tariff->m_tariffSteps[i][0])/sizeof(TariffStep);
|
|
|
|
// from 7:00 on, each hour costs 3.50 euros == 350000 units
|
|
startMinute = startMinute.addSecs(7*3600);
|
|
current = next;
|
|
|
|
for (int j = 7; j < 20; ++j) {
|
|
next = current + 60;
|
|
*current = TariffStep(startMinute, 350000, next);
|
|
|
|
//qDebug() << "current =" << "c=" << current << current->startMinute() << current->price() << "n=" << current->next();
|
|
//qDebug() << "offset =" << ((char *)current->next() - (char *)&tariff->m_tariffSteps[i][0])/sizeof(TariffStep);
|
|
|
|
startMinute = startMinute.addSecs(3600);
|
|
current = next;
|
|
}
|
|
|
|
if (i != Qt::Sunday) {
|
|
next = current + 4*60 + 7*60;
|
|
} else {
|
|
next = &tariff->m_tariffSteps[Qt::Monday][7*60];
|
|
}
|
|
*current = TariffStep(startMinute, 0, next);
|
|
|
|
if (i != Qt::Sunday) {
|
|
qDebug() << "current =" << "c=" << current << current->startMinute() << current->price() << "n=" << current->next();
|
|
qDebug() << "offset =" << ((char *)current->next() - (char *)&tariff->m_tariffSteps[i][0])/sizeof(TariffStep);
|
|
} else {
|
|
qDebug() << "current =" << "c=" << current << current->startMinute() << current->price() << "n=" << current->next();
|
|
if (&tariff->m_tariffSteps[1][420] == current->next()) {
|
|
qDebug() << "OK";
|
|
qDebug() << "offset =" << ((char *)current->next() - (char *)&tariff->m_tariffSteps[1][0])/sizeof(TariffStep);
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
return 0;
|
|
|
|
#if 0
|
|
price_t price;
|
|
memset(&price, 0x00, sizeof(price));
|
|
QDateTime start = QDateTime::currentDateTime();
|
|
|
|
minute_t const s = TUtils::toMinutes(start);
|
|
minute_t const e = s + 60;
|
|
|
|
qDebug() << "start =" << start << "(" << s << ")";
|
|
//start.setTime(QTime()); ruecksetzen des tages auf 0:00
|
|
//QTime t = start.time();
|
|
for (int i=1; i < (e-s); ++i) {
|
|
qDebug() << i << start << start.date().dayOfWeek();
|
|
start = start.addSecs(60);
|
|
}
|
|
#endif
|
|
//if (TAlgo::compute_price_for_parking_ticket(tariff, s, e, &price)) {
|
|
|
|
//}
|
|
|
|
// Calculate_parking_tickets cpt;
|
|
|
|
return 0;
|
|
}
|