File indexing completed on 2025-02-02 05:02:38
0001 /* 0002 SPDX-FileCopyrightText: 2019 Volker Krause <vkrause@kde.org> 0003 0004 SPDX-License-Identifier: LGPL-2.0-or-later 0005 */ 0006 0007 #include "tripgroupinfoprovider.h" 0008 0009 #include "locationinformation.h" 0010 #include "reservationmanager.h" 0011 #include "tripgroup.h" 0012 0013 #include "weatherforecast.h" 0014 #include "weatherforecastmanager.h" 0015 0016 #include <KItinerary/LocationUtil> 0017 #include <KItinerary/Place> 0018 #include <KItinerary/SortUtil> 0019 0020 #include <KCountry> 0021 0022 #include <QDateTime> 0023 #include <QDebug> 0024 0025 using namespace KItinerary; 0026 0027 static GeoCoordinates geoCoordinate(const QVariant &res) 0028 { 0029 if (LocationUtil::isLocationChange(res)) { 0030 return LocationUtil::geo(LocationUtil::arrivalLocation(res)); 0031 } 0032 return LocationUtil::geo(LocationUtil::location(res)); 0033 } 0034 0035 TripGroupInfoProvider::TripGroupInfoProvider() = default; 0036 TripGroupInfoProvider::~TripGroupInfoProvider() = default; 0037 0038 void TripGroupInfoProvider::setReservationManager(ReservationManager *resMgr) 0039 { 0040 m_resMgr = resMgr; 0041 } 0042 0043 void TripGroupInfoProvider::setWeatherForecastManager(WeatherForecastManager *mgr) 0044 { 0045 m_weatherMgr = mgr; 0046 } 0047 0048 WeatherForecast TripGroupInfoProvider::weatherForecast(const TripGroup &group) const 0049 { 0050 WeatherForecast fc; 0051 if (!m_weatherMgr->allowNetworkAccess()) { 0052 return fc; 0053 } 0054 0055 const auto elems = group.elements(); 0056 QVariant startRes; 0057 QDateTime lastEndTime = group.beginDateTime(); 0058 0059 for (const auto &resId : elems) { 0060 const auto res = m_resMgr->reservation(resId); 0061 const auto newGeo = geoCoordinate(res); 0062 if (!newGeo.isValid()) { 0063 continue; 0064 } 0065 if (startRes.isValid()) { 0066 const auto geo = geoCoordinate(startRes); 0067 const auto startDt = LocationUtil::isLocationChange(startRes) ? SortUtil::endDateTime(startRes) : lastEndTime; 0068 const auto endDt = SortUtil::startDateTime(res); 0069 if (geo.isValid() && startDt.isValid() && endDt.isValid()) { 0070 const auto newFc = m_weatherMgr->forecast(geo.latitude(), geo.longitude(), startDt, endDt); 0071 if (!fc.isValid() && newFc.isValid()) { 0072 fc.setDateTime(startDt); 0073 fc.setRange(std::numeric_limits<int>::max()); // always consider the sub-range forecast during merging 0074 } 0075 fc.merge(newFc); 0076 } 0077 lastEndTime = endDt; 0078 } 0079 startRes = res; 0080 } 0081 0082 return fc; 0083 } 0084 0085 QVariantList TripGroupInfoProvider::locationInformation(const TripGroup &group, const QString &homeCountryIsoCode) const 0086 { 0087 QVariantList l; 0088 0089 const auto elems = group.elements(); 0090 for (const auto &resId : elems) { 0091 const auto res = m_resMgr->reservation(resId); 0092 if (!LocationUtil::isLocationChange(res)) { 0093 continue; 0094 } 0095 0096 const auto destCountry = LocationUtil::address(LocationUtil::arrivalLocation(res)).addressCountry(); 0097 if (destCountry.isEmpty() || destCountry == homeCountryIsoCode) { 0098 continue; 0099 } 0100 if (std::any_of(l.constBegin(), l.constEnd(), [destCountry](const QVariant &v) { return v.value<LocationInformation>().isoCode() == destCountry; })) { 0101 continue; 0102 } 0103 0104 LocationInformation info; 0105 info.setIsoCode(homeCountryIsoCode); 0106 info.setIsoCode(destCountry); 0107 if (info.powerPlugCompatibility() != LocationInformation::FullyCompatible) { 0108 l.push_back(QVariant::fromValue(info)); 0109 } 0110 } 0111 0112 return l; 0113 } 0114 0115 QStringList TripGroupInfoProvider::currencies(const TripGroup& group, const QString &homeCurrency) const 0116 { 0117 QStringList l; 0118 const auto elems = group.elements(); 0119 for (const auto &resId : elems) { 0120 const auto res = m_resMgr->reservation(resId); 0121 if (!LocationUtil::isLocationChange(res)) { 0122 continue; 0123 } 0124 0125 const auto destCountry = LocationUtil::address(LocationUtil::arrivalLocation(res)).addressCountry(); 0126 const auto currency = KCountry::fromAlpha2(destCountry).currencyCode(); 0127 if (currency.isEmpty() || currency == homeCurrency || l.contains(currency)) { 0128 continue; 0129 } 0130 l.push_back(currency); 0131 } 0132 0133 return l; 0134 } 0135 0136 #include "moc_tripgroupinfoprovider.cpp"