diff --git a/CMakeLists.txt b/CMakeLists.txt --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,5 +1,5 @@ cmake_minimum_required(VERSION 3.0) -set(PIM_VERSION "5.9.41") +set(PIM_VERSION "5.9.42") project(KItinerary VERSION ${PIM_VERSION}) set(KF5_VERSION "5.48.0") diff --git a/autotests/jsonlddocumenttest.cpp b/autotests/jsonlddocumenttest.cpp --- a/autotests/jsonlddocumenttest.cpp +++ b/autotests/jsonlddocumenttest.cpp @@ -22,6 +22,7 @@ #include #include #include +#include #include #include @@ -85,10 +86,27 @@ // integer values FoodEstablishmentReservation res; res.setPartySize(2); + const QString reservationNumber{QStringLiteral("OT123456")}; + res.setReservationNumber(reservationNumber); + res.setStartTime(QDateTime(QDate(2018, 3, 18), QTime(18, 44, 0), QTimeZone("Europe/Berlin"))); + Person person; + const QString fullName{QStringLiteral("John")}; + + person.setName(fullName); + res.setUnderName(person); + array = JsonLdDocument::toJson({res}); QCOMPARE(array.size(), 1); obj = array.at(0).toObject(); QCOMPARE(obj.value(QLatin1String("partySize")).toInt(), 2); + QCOMPARE(obj.value(QLatin1String("reservationNumber")).toString(), reservationNumber); + auto resDtObj = obj.value(QLatin1String("startTime")).toObject(); + QCOMPARE(resDtObj.value(QLatin1String("@value")).toString(), QLatin1String("2018-03-18T18:44:00+01:00")); + QCOMPARE(resDtObj.value(QLatin1String("@type")).toString(), QLatin1String("QDateTime")); + QCOMPARE(resDtObj.value(QLatin1String("timezone")).toString(), QLatin1String("Europe/Berlin")); + qDebug().noquote() << QJsonDocument(obj).toJson(); + auto undernameObj = obj.value(QLatin1String("underName")).toObject(); + QCOMPARE(undernameObj.value(QLatin1String("name")), QLatin1String("John")); } void testDeserialization() @@ -131,7 +149,14 @@ b = QByteArray("[{" "\"@context\": \"http://schema.org\"," "\"@type\": \"FoodEstablishmentReservation\"," - "\"partySize\": 42" + "\"partySize\": 42," + "\"reservationNumber\": \"0T44542\"," + "\"underName\": {" + " \"@type\": \"Person\"," + " \"name\": \"John Smith\"," + " \"email\": \"foo@kde.org\"" + "}" + "}]"); array = QJsonDocument::fromJson(b).array(); @@ -141,6 +166,9 @@ QVERIFY(data.canConvert()); auto res = data.value(); QCOMPARE(res.partySize(), 42); + QCOMPARE(res.reservationNumber(), QStringLiteral("0T44542")); + QCOMPARE(res.underName().value().name(), QStringLiteral("John Smith")); + QCOMPARE(res.underName().value().email(), QStringLiteral("foo@kde.org")); } void testApply() diff --git a/src/calendarhandler.cpp b/src/calendarhandler.cpp --- a/src/calendarhandler.cpp +++ b/src/calendarhandler.cpp @@ -63,6 +63,8 @@ static void fillLodgingReservation(const LodgingReservation &reservation, const KCalCore::Event::Ptr &event); static void fillEventReservation(const QVector &reservations, const KCalCore::Event::Ptr &event); static void fillGeoPosition(const QVariant &place, const KCalCore::Event::Ptr &event); +static void fillFoodReservation(const FoodEstablishmentReservation &reservation, const KCalCore::Event::Ptr &event); + #endif QSharedPointer CalendarHandler::findEvent(const QSharedPointer &calendar, const QVariant &reservation) @@ -125,6 +127,8 @@ fillBusReservation(reservation.value(), event); } else if (JsonLd::isA(reservation)) { fillEventReservation(reservations, event); + } else if (JsonLd::isA(reservation)) { + fillFoodReservation(reservation.value(), event); } else { return; } @@ -340,4 +344,33 @@ event->setGeoLatitude(geo.latitude()); event->setGeoLongitude(geo.longitude()); } + +static void fillFoodReservation(const FoodEstablishmentReservation &reservation, const KCalCore::Event::Ptr &event) +{ + const auto foodEstablishment = reservation.reservationFor().value(); + const auto address = foodEstablishment.address(); + + event->setSummary(i18n("Restaurant reservation: %1", foodEstablishment.name())); +#ifdef HAVE_KCONTACTS + event->setLocation(i18nc(", , ", "%1, %2 %3, %4", + address.streetAddress(), address.postalCode(), + address.addressLocality(), KContacts::Address::ISOtoCountry(address.addressCountry()))); +#endif + fillGeoPosition(foodEstablishment, event); + + event->setDtStart(reservation.startTime()); + auto endTime = reservation.endTime(); + if (!endTime.isValid()) { + endTime = QDateTime(reservation.startTime().date(), QTime(23, 59, 59)); + } + event->setDtEnd(endTime); + event->setAllDay(false); + event->setTransparency(KCalCore::Event::Transparent); + event->setSummary(i18n("Restaurant reservation: %1", foodEstablishment.name())); + event->setDescription(i18n("Number Of People: %1\nReservation reference: %2\nUnder name: %3", + reservation.partySize(), + reservation.reservationNumber(), + reservation.underName().value().name())); + +} #endif diff --git a/src/datatypes/reservation.h b/src/datatypes/reservation.h --- a/src/datatypes/reservation.h +++ b/src/datatypes/reservation.h @@ -112,6 +112,7 @@ { KITINERARY_GADGET(FoodEstablishmentReservation) KITINERARY_PROPERTY(QDateTime, endTime, setEndTime) + KITINERARY_PROPERTY(QDateTime, modifiedTime, setModifiedTime) KITINERARY_PROPERTY(int, partySize, setPartySize) KITINERARY_PROPERTY(QDateTime, startTime, setStartTime) }; diff --git a/src/datatypes/reservation.cpp b/src/datatypes/reservation.cpp --- a/src/datatypes/reservation.cpp +++ b/src/datatypes/reservation.cpp @@ -97,10 +97,12 @@ KITINERARY_PRIVATE_GADGET(FoodEstablishmentReservation) public: QDateTime endTime; + QDateTime modifiedTime; QDateTime startTime; int partySize = 0; }; KITINERARY_MAKE_SUB_CLASS(FoodEstablishmentReservation, Reservation) +KITINERARY_MAKE_PROPERTY(FoodEstablishmentReservation, QDateTime, modifiedTime, setModifiedTime) KITINERARY_MAKE_PROPERTY(FoodEstablishmentReservation, QDateTime, endTime, setEndTime) KITINERARY_MAKE_PROPERTY(FoodEstablishmentReservation, int, partySize, setPartySize) KITINERARY_MAKE_PROPERTY(FoodEstablishmentReservation, QDateTime, startTime, setStartTime) diff --git a/src/mergeutil.cpp b/src/mergeutil.cpp --- a/src/mergeutil.cpp +++ b/src/mergeutil.cpp @@ -153,7 +153,12 @@ if (lhsRes.reservationNumber() != rhsRes.reservationNumber()) { return false; } - return isSame(lhsRes.reservationFor(), rhsRes.reservationFor()) && lhsRes.startTime().date() == rhsRes.endTime().date(); + auto endTime = rhsRes.endTime(); + if (!endTime.isValid()) { + endTime = QDateTime(rhsRes.startTime().date(), QTime(23, 59, 59)); + } + + return isSame(lhsRes.reservationFor(), rhsRes.reservationFor()) && lhsRes.startTime().date() == endTime.date(); } if (JsonLd::isA(lhs)) { const auto lhsRestaurant = lhs.value(); diff --git a/src/sortutil.cpp b/src/sortutil.cpp --- a/src/sortutil.cpp +++ b/src/sortutil.cpp @@ -82,7 +82,11 @@ return res.value().reservationFor().value().arrivalTime(); } if (JsonLd::isA(res)) { - return res.value().endTime(); + auto endTime = res.value().endTime(); + if (!endTime.isValid()) { + endTime = QDateTime(res.value().startTime().date(), QTime(23, 59, 59)); + } + return endTime; } if (JsonLd::isA(res)) { const auto hotel = res.value();