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