File indexing completed on 2025-02-02 05:02:35
0001 /* 0002 SPDX-FileCopyrightText: 2019 Volker Krause <vkrause@kde.org> 0003 0004 SPDX-License-Identifier: LGPL-2.0-or-later 0005 */ 0006 0007 #ifndef STATISTICSMODEL_H 0008 #define STATISTICSMODEL_H 0009 0010 #include <QDate> 0011 #include <QObject> 0012 0013 #include <set> 0014 0015 class ReservationManager; 0016 class TripGroupManager; 0017 0018 /** Statistics data item. */ 0019 class StatisticsItem 0020 { 0021 Q_GADGET 0022 Q_PROPERTY(bool hasData MEMBER m_hasData CONSTANT) 0023 Q_PROPERTY(QString label MEMBER m_label CONSTANT) 0024 Q_PROPERTY(QString value MEMBER m_value CONSTANT) 0025 Q_PROPERTY(Trend trend MEMBER m_trend CONSTANT) 0026 0027 public: 0028 enum Trend { 0029 TrendUnknown, 0030 TrendUp, 0031 TrendDown, 0032 TrendUnchanged 0033 }; 0034 Q_ENUM(Trend) 0035 0036 StatisticsItem(); 0037 explicit StatisticsItem(const QString &label, const QString &value, StatisticsItem::Trend trend = TrendUnknown, bool hasData = true); 0038 ~StatisticsItem(); 0039 0040 QString m_label; 0041 QString m_value; 0042 Trend m_trend = TrendUnknown; 0043 bool m_hasData = true; 0044 }; 0045 0046 Q_DECLARE_METATYPE(StatisticsItem) 0047 0048 /** Provides the data shown in the statistics page. */ 0049 class StatisticsModel : public QObject 0050 { 0051 Q_OBJECT 0052 Q_PROPERTY(StatisticsItem totalCount READ totalCount NOTIFY changed) 0053 Q_PROPERTY(StatisticsItem totalDistance READ totalDistance NOTIFY changed) 0054 Q_PROPERTY(StatisticsItem totalNights READ totalNights NOTIFY changed) 0055 Q_PROPERTY(StatisticsItem totalCO2 READ totalCO2 NOTIFY changed) 0056 Q_PROPERTY(StatisticsItem visitedCountries READ visitedCountries NOTIFY changed) 0057 0058 Q_PROPERTY(StatisticsItem flightCount READ flightCount NOTIFY changed) 0059 Q_PROPERTY(StatisticsItem flightDistance READ flightDistance NOTIFY changed) 0060 Q_PROPERTY(StatisticsItem flightCO2 READ flightCO2 NOTIFY changed) 0061 0062 Q_PROPERTY(StatisticsItem trainCount READ trainCount NOTIFY changed) 0063 Q_PROPERTY(StatisticsItem trainDistance READ trainDistance NOTIFY changed) 0064 Q_PROPERTY(StatisticsItem trainCO2 READ trainCO2 NOTIFY changed) 0065 0066 Q_PROPERTY(StatisticsItem busCount READ busCount NOTIFY changed) 0067 Q_PROPERTY(StatisticsItem busDistance READ busDistance NOTIFY changed) 0068 Q_PROPERTY(StatisticsItem busCO2 READ busCO2 NOTIFY changed) 0069 0070 Q_PROPERTY(StatisticsItem carCount READ carCount NOTIFY changed) 0071 Q_PROPERTY(StatisticsItem carDistance READ carDistance NOTIFY changed) 0072 Q_PROPERTY(StatisticsItem carCO2 READ carCO2 NOTIFY changed) 0073 0074 Q_PROPERTY(StatisticsItem boatCount READ boatCount NOTIFY changed) 0075 Q_PROPERTY(StatisticsItem boatDistance READ boatDistance NOTIFY changed) 0076 Q_PROPERTY(StatisticsItem boatCO2 READ boatCO2 NOTIFY changed) 0077 0078 Q_PROPERTY(ReservationManager* reservationManager READ reservationManager WRITE setReservationManager NOTIFY setupChanged) 0079 Q_PROPERTY(TripGroupManager* tripGroupManager READ tripGroupManager WRITE setTripGroupManager NOTIFY setupChanged) 0080 0081 public: 0082 explicit StatisticsModel(QObject *parent = nullptr); 0083 ~StatisticsModel() override; 0084 0085 ReservationManager* reservationManager() const; 0086 void setReservationManager(ReservationManager *resMgr); 0087 TripGroupManager* tripGroupManager() const; 0088 void setTripGroupManager(TripGroupManager *tripGroupMgr); 0089 0090 Q_INVOKABLE void setTimeRange(const QDate &begin, const QDate &end); 0091 0092 StatisticsItem totalCount() const; 0093 StatisticsItem totalDistance() const; 0094 StatisticsItem totalNights() const; 0095 StatisticsItem totalCO2() const; 0096 StatisticsItem visitedCountries() const; 0097 0098 StatisticsItem flightCount() const; 0099 StatisticsItem flightDistance() const; 0100 StatisticsItem flightCO2() const; 0101 0102 StatisticsItem trainCount() const; 0103 StatisticsItem trainDistance() const; 0104 StatisticsItem trainCO2() const; 0105 0106 StatisticsItem busCount() const; 0107 StatisticsItem busDistance() const; 0108 StatisticsItem busCO2() const; 0109 0110 StatisticsItem carCount() const; 0111 StatisticsItem carDistance() const; 0112 StatisticsItem carCO2() const; 0113 0114 StatisticsItem boatCount() const; 0115 StatisticsItem boatDistance() const; 0116 StatisticsItem boatCO2() const; 0117 0118 Q_SIGNALS: 0119 void setupChanged(); 0120 void changed(); 0121 0122 private: 0123 void recompute(); 0124 0125 ReservationManager *m_resMgr = nullptr; 0126 TripGroupManager *m_tripGroupMgr = nullptr; 0127 QDate m_begin; 0128 QDate m_end; 0129 0130 enum AggregateType { Total, Flight, Train, Bus, Car, Boat, AGGREGATE_TYPE_COUNT }; 0131 enum StatType { TripCount, Distance, CO2, STAT_TYPE_COUNT }; 0132 0133 AggregateType typeForReservation(const QVariant &res) const; 0134 int co2emission(AggregateType type, int distance) const; 0135 void computeStats(const QVariant &res, int (&statData)[AGGREGATE_TYPE_COUNT][STAT_TYPE_COUNT]); 0136 0137 StatisticsItem::Trend trend(int current, int prev) const; 0138 StatisticsItem::Trend trend(AggregateType type, StatType stat) const; 0139 0140 std::set<QString> m_countries; 0141 0142 int m_statData[AGGREGATE_TYPE_COUNT][STAT_TYPE_COUNT]; 0143 int m_prevStatData[AGGREGATE_TYPE_COUNT][STAT_TYPE_COUNT]; 0144 bool m_hasData[AGGREGATE_TYPE_COUNT]; 0145 int m_hotelCount = 0; 0146 int m_prevHotelCount = 0; 0147 int m_tripGroupCount = 0; 0148 int m_prevTripGroupCount = 0; 0149 }; 0150 0151 #endif // STATISTICSMODEL_H