File indexing completed on 2024-05-19 05:08:13

0001 /*
0002     SPDX-FileCopyrightText: 2020 Thomas Baumgart <tbaumgart@kde.org>
0003     SPDX-License-Identifier: GPL-2.0-or-later
0004 */
0005 
0006 #ifndef INVESTACTIVITIES_H
0007 #define INVESTACTIVITIES_H
0008 
0009 // ----------------------------------------------------------------------------
0010 // QT Includes
0011 
0012 #include "qcontainerfwd.h"
0013 #include <qglobal.h>
0014 
0015 // ----------------------------------------------------------------------------
0016 // KDE Includes
0017 
0018 // ----------------------------------------------------------------------------
0019 // Project Includes
0020 
0021 class MyMoneyMoney;
0022 class MyMoneySplit;
0023 class SplitModel;
0024 class InvestTransactionEditor;
0025 
0026 namespace eMyMoney {
0027 namespace Split {
0028 enum class InvestmentTransactionType;
0029 }
0030 }
0031 
0032 namespace eDialogs {
0033 enum class PriceMode;
0034 }
0035 
0036 namespace Invest
0037 {
0038 
0039 class ActivityPrivate;
0040 class Activity
0041 {
0042     Q_DISABLE_COPY(Activity)
0043 
0044 public:
0045     typedef enum {
0046         Unused,
0047         Optional,
0048         Mandatory,
0049     } fieldRequired_t;
0050 
0051     virtual eMyMoney::Split::InvestmentTransactionType type() const = 0;
0052     virtual void showWidgets() const = 0;
0053 
0054     virtual void adjustStockSplit(MyMoneySplit& stockSplit) = 0;
0055 
0056     virtual ~Activity();
0057 
0058     virtual void loadPriceWidget(const MyMoneySplit& split);
0059     virtual MyMoneyMoney totalAmount(const MyMoneySplit& stockSplit, const SplitModel* feesModel, const SplitModel* interestModel) const;
0060 
0061     virtual MyMoneyMoney sharesFactor() const;
0062 
0063     /**
0064      * This method returns the total value of the shares
0065      * The default is to return MyMoneyMoney().
0066      *
0067      * Widgets with names @c sharesAmountEdit and @c priceAmountEdit must
0068      * be present. If the priceMode is eDialogs::PriceMode::PricePerShare
0069      * the product of shares times the price will be returned. In other
0070      * cases, the value of price is returned.
0071      */
0072     virtual MyMoneyMoney valueAllShares() const;
0073 
0074     virtual MyMoneyMoney feesFactor() const;
0075     virtual MyMoneyMoney interestFactor() const;
0076 
0077     virtual fieldRequired_t feesRequired() const {
0078         return Unused;
0079     }
0080     virtual fieldRequired_t interestRequired() const {
0081         return Unused;
0082     }
0083     virtual fieldRequired_t assetAccountRequired() const {
0084         return Unused;
0085     }
0086     virtual fieldRequired_t priceRequired() const {
0087         return Unused;
0088     }
0089 
0090     eDialogs::PriceMode priceMode() const;
0091 
0092     bool haveFees( fieldRequired_t = Mandatory) const;
0093     bool haveInterest( fieldRequired_t = Mandatory) const;
0094 
0095     QString actionString() const;
0096 
0097 protected:
0098     explicit Activity(InvestTransactionEditor* editor, const QString& action);
0099     virtual QString priceLabelText() const;
0100     virtual QString sharesLabelText() const;
0101 
0102     bool haveCategoryAndAmount(const QString& category, const QString& amount, fieldRequired_t optional) const;
0103     void setLabelText(const QString& idx, const QString& txt) const;
0104     void setWidgetVisibility(const QStringList& widgetIds, bool visible) const;
0105     void setupWidgets(const QStringList& activityWidgets) const;
0106 
0107 protected:
0108     ActivityPrivate* d_ptr;
0109     Q_DECLARE_PRIVATE(Activity)
0110 };
0111 
0112 class Buy : public Activity
0113 {
0114 public:
0115     explicit Buy(InvestTransactionEditor* editor);
0116     ~Buy() override;
0117     eMyMoney::Split::InvestmentTransactionType type() const override;
0118     void showWidgets() const override;
0119     virtual void adjustStockSplit(MyMoneySplit&) override {}
0120 
0121     fieldRequired_t feesRequired() const override
0122     {
0123         return Optional;
0124     }
0125     fieldRequired_t interestRequired() const override
0126     {
0127         return Optional;
0128     }
0129     fieldRequired_t assetAccountRequired() const override
0130     {
0131         return Mandatory;
0132     }
0133     fieldRequired_t priceRequired() const override
0134     {
0135         return Mandatory;
0136     }
0137 };
0138 
0139 class Sell : public Activity
0140 {
0141 public:
0142     explicit Sell(InvestTransactionEditor* editor);
0143     ~Sell() override;
0144     eMyMoney::Split::InvestmentTransactionType type() const override;
0145     void showWidgets() const override;
0146     virtual void adjustStockSplit(MyMoneySplit&) override {}
0147 
0148     MyMoneyMoney sharesFactor() const override;
0149     fieldRequired_t feesRequired() const override {
0150         return Optional;
0151     }
0152     fieldRequired_t interestRequired() const override {
0153         return Optional;
0154     }
0155     fieldRequired_t assetAccountRequired() const override;
0156     fieldRequired_t priceRequired() const override {
0157         return Mandatory;
0158     }
0159 };
0160 
0161 class Div : public Activity
0162 {
0163 public:
0164     explicit Div(InvestTransactionEditor* editor);
0165     ~Div() override;
0166     eMyMoney::Split::InvestmentTransactionType type() const override;
0167     void showWidgets() const override;
0168     virtual void adjustStockSplit(MyMoneySplit&) override
0169     {
0170     }
0171     fieldRequired_t feesRequired() const override
0172     {
0173         return Optional;
0174     }
0175     fieldRequired_t interestRequired() const override
0176     {
0177         return Mandatory;
0178     }
0179     fieldRequired_t assetAccountRequired() const override
0180     {
0181         return Mandatory;
0182     }
0183 };
0184 
0185 class Yield : public Activity
0186 {
0187 public:
0188     explicit Yield(InvestTransactionEditor* editor);
0189     ~Yield() override;
0190     eMyMoney::Split::InvestmentTransactionType type() const override;
0191     void showWidgets() const override;
0192     virtual void adjustStockSplit(MyMoneySplit&) override
0193     {
0194     }
0195     fieldRequired_t feesRequired() const override
0196     {
0197         return Optional;
0198     }
0199     fieldRequired_t interestRequired() const override
0200     {
0201         return Mandatory;
0202     }
0203     fieldRequired_t assetAccountRequired() const override
0204     {
0205         return Mandatory;
0206     }
0207 };
0208 
0209 class Reinvest : public Activity
0210 {
0211 public:
0212     explicit Reinvest(InvestTransactionEditor* editor);
0213     ~Reinvest() override;
0214     eMyMoney::Split::InvestmentTransactionType type() const override;
0215     void showWidgets() const override;
0216     virtual void adjustStockSplit(MyMoneySplit&) override {}
0217     MyMoneyMoney totalAmount(const MyMoneySplit& stockSplit, const SplitModel* feesModel, const SplitModel* interestModel) const override;
0218 
0219     fieldRequired_t feesRequired() const override {
0220         return Optional;
0221     }
0222     fieldRequired_t interestRequired() const override {
0223         return Mandatory;
0224     }
0225     fieldRequired_t priceRequired() const override {
0226         return Mandatory;
0227     }
0228 };
0229 
0230 class Add : public Activity
0231 {
0232 public:
0233     explicit Add(InvestTransactionEditor* editor);
0234     ~Add() override;
0235     eMyMoney::Split::InvestmentTransactionType type() const override;
0236     void showWidgets() const override;
0237     void adjustStockSplit(MyMoneySplit& stockSplit) override;
0238     MyMoneyMoney totalAmount(const MyMoneySplit& stockSplit, const SplitModel* feesModel, const SplitModel* interestModel) const override;
0239 };
0240 
0241 class Remove : public Activity
0242 {
0243 public:
0244     explicit Remove(InvestTransactionEditor* editor);
0245     ~Remove() override;
0246     eMyMoney::Split::InvestmentTransactionType type() const override;
0247     void showWidgets() const override;
0248     void adjustStockSplit(MyMoneySplit& stockSplit) override;
0249     MyMoneyMoney totalAmount(const MyMoneySplit& stockSplit, const SplitModel* feesModel, const SplitModel* interestModel) const override;
0250 
0251     virtual MyMoneyMoney sharesFactor() const override;
0252 };
0253 
0254 class Split : public Activity
0255 {
0256 public:
0257     explicit Split(InvestTransactionEditor* editor);
0258     ~Split() override;
0259     eMyMoney::Split::InvestmentTransactionType type() const override;
0260     void showWidgets() const override;
0261     virtual void adjustStockSplit(MyMoneySplit& stockSplit) override;
0262     MyMoneyMoney totalAmount(const MyMoneySplit& stockSplit, const SplitModel* feesModel, const SplitModel* interestModel) const override;
0263 
0264 protected:
0265     QString sharesLabelText() const override;
0266 };
0267 
0268 class IntInc : public Activity
0269 {
0270 public:
0271     explicit IntInc(InvestTransactionEditor* editor);
0272     ~IntInc() override;
0273     eMyMoney::Split::InvestmentTransactionType type() const override;
0274     void showWidgets() const override;
0275     virtual void adjustStockSplit(MyMoneySplit&) override {}
0276 
0277     fieldRequired_t feesRequired() const override {
0278         return Optional;
0279     }
0280     fieldRequired_t interestRequired() const override {
0281         return Mandatory;
0282     }
0283     fieldRequired_t assetAccountRequired() const override {
0284         return Mandatory;
0285     }
0286 };
0287 
0288 } // namespace Invest
0289 
0290 #endif // INVESTACTIVITIES_H
0291