#include #include #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; }