File indexing completed on 2024-05-12 05:06:44

0001 /*
0002     SPDX-FileCopyrightText: 2005-2019 Thomas Baumgart <tbaumgart@kde.org>
0003     SPDX-FileCopyrightText: 2017-2018 Łukasz Wojniłowicz <lukasz.wojnilowicz@gmail.com>
0004     SPDX-License-Identifier: GPL-2.0-or-later
0005 */
0006 
0007 #include "mymoneysecurity.h"
0008 #include "mymoneysecurity_p.h"
0009 
0010 // ----------------------------------------------------------------------------
0011 // QT Includes
0012 
0013 #include <QString>
0014 #include <QSet>
0015 
0016 // ----------------------------------------------------------------------------
0017 // KDE Includes
0018 
0019 #include <KLazyLocalizedString>
0020 #include <KLocalizedString>
0021 
0022 // ----------------------------------------------------------------------------
0023 // Project Includes
0024 
0025 #include "mymoneyexception.h"
0026 
0027 using namespace eMyMoney;
0028 
0029 MyMoneySecurity::MyMoneySecurity() :
0030     MyMoneyObject(*new MyMoneySecurityPrivate)
0031 {
0032 }
0033 
0034 MyMoneySecurity::MyMoneySecurity(const QString &id) :
0035     MyMoneyObject(*new MyMoneySecurityPrivate, id)
0036 {
0037 }
0038 
0039 MyMoneySecurity::MyMoneySecurity(const QString& id,
0040                                  const QString& name,
0041                                  const QString& symbol,
0042                                  const int smallestCashFraction,
0043                                  const int smallestAccountFraction,
0044                                  const int pricePrecision) :
0045     MyMoneyObject(*new MyMoneySecurityPrivate, id),
0046     MyMoneyKeyValueContainer()
0047 {
0048     Q_D(MyMoneySecurity);
0049     d->m_name = name;
0050     d->m_smallestCashFraction = smallestCashFraction;
0051     d->m_pricePrecision = pricePrecision;
0052     d->m_securityType = eMyMoney::Security::Type::Currency;
0053 
0054     if (symbol.isEmpty())
0055         d->m_tradingSymbol = id;
0056     else
0057         d->m_tradingSymbol = symbol;
0058 
0059     if (smallestAccountFraction)
0060         d->m_smallestAccountFraction = smallestAccountFraction;
0061     else
0062         d->m_smallestAccountFraction = smallestCashFraction;
0063 }
0064 
0065 MyMoneySecurity::MyMoneySecurity(const MyMoneySecurity& other) :
0066     MyMoneyObject(*new MyMoneySecurityPrivate(*other.d_func()), other.id()),
0067     MyMoneyKeyValueContainer(other)
0068 {
0069 }
0070 
0071 MyMoneySecurity::MyMoneySecurity(const QString& id, const MyMoneySecurity& other) :
0072     MyMoneyObject(*new MyMoneySecurityPrivate(*other.d_func()), id),
0073     MyMoneyKeyValueContainer(other)
0074 {
0075 }
0076 
0077 MyMoneySecurity::~MyMoneySecurity()
0078 {
0079 }
0080 
0081 bool MyMoneySecurity::operator == (const MyMoneySecurity& right) const
0082 {
0083     Q_D(const MyMoneySecurity);
0084     auto d2 = static_cast<const MyMoneySecurityPrivate *>(right.d_func());
0085     // clang-format off
0086     return (d->m_id == d2->m_id)
0087            && (d->m_name == d2->m_name)
0088            && (d->m_tradingSymbol == d2->m_tradingSymbol)
0089            && (d->m_tradingMarket == d2->m_tradingMarket)
0090            && (d->m_roundingMethod == d2->m_roundingMethod)
0091            && (d->m_tradingCurrency == d2->m_tradingCurrency)
0092            && (d->m_securityType == d2->m_securityType)
0093            && (d->m_smallestAccountFraction == d2->m_smallestAccountFraction)
0094            && (d->m_smallestCashFraction == d2->m_smallestCashFraction)
0095            && (d->m_pricePrecision == d2->m_pricePrecision)
0096            && this->MyMoneyKeyValueContainer::operator == (right);
0097     // clang-format on
0098 }
0099 
0100 bool MyMoneySecurity::operator < (const MyMoneySecurity& right) const
0101 {
0102     Q_D(const MyMoneySecurity);
0103     auto d2 = static_cast<const MyMoneySecurityPrivate *>(right.d_func());
0104     if (d->m_securityType == d2->m_securityType)
0105         return QString::localeAwareCompare(d->m_name, d2->m_name) < 0;
0106     return d->m_securityType < d2->m_securityType;
0107 }
0108 
0109 QString MyMoneySecurity::name() const
0110 {
0111     Q_D(const MyMoneySecurity);
0112     return d->m_name;
0113 }
0114 
0115 void MyMoneySecurity::setName(const QString& str)
0116 {
0117     Q_D(MyMoneySecurity);
0118     d->m_name = str;
0119 }
0120 
0121 QString MyMoneySecurity::tradingSymbol() const
0122 {
0123     Q_D(const MyMoneySecurity);
0124     return d->m_tradingSymbol;
0125 }
0126 
0127 void MyMoneySecurity::setTradingSymbol(const QString& str)
0128 {
0129     Q_D(MyMoneySecurity);
0130     d->m_tradingSymbol = str;
0131 }
0132 
0133 QString MyMoneySecurity::tradingMarket() const
0134 {
0135     Q_D(const MyMoneySecurity);
0136     return d->m_tradingMarket;
0137 }
0138 
0139 void MyMoneySecurity::setTradingMarket(const QString& str)
0140 {
0141     Q_D(MyMoneySecurity);
0142     d->m_tradingMarket = str;
0143 }
0144 
0145 QString MyMoneySecurity::tradingCurrency() const
0146 {
0147     Q_D(const MyMoneySecurity);
0148     return d->m_tradingCurrency;
0149 }
0150 
0151 void MyMoneySecurity::setTradingCurrency(const QString& str)
0152 {
0153     Q_D(MyMoneySecurity);
0154     d->m_tradingCurrency = str;
0155 }
0156 
0157 bool MyMoneySecurity::operator != (const MyMoneySecurity& r) const
0158 {
0159     return !(*this == r);
0160 }
0161 
0162 eMyMoney::Security::Type MyMoneySecurity::securityType() const
0163 {
0164     Q_D(const MyMoneySecurity);
0165     return d->m_securityType;
0166 }
0167 
0168 void MyMoneySecurity::setSecurityType(const eMyMoney::Security::Type s)
0169 {
0170     Q_D(MyMoneySecurity);
0171     d->m_securityType = s;
0172 }
0173 
0174 bool MyMoneySecurity::isCurrency() const
0175 {
0176     Q_D(const MyMoneySecurity);
0177     return d->m_securityType == eMyMoney::Security::Type::Currency;
0178 }
0179 
0180 AlkValue::RoundingMethod MyMoneySecurity::roundingMethod() const
0181 {
0182     Q_D(const MyMoneySecurity);
0183     return d->m_roundingMethod;
0184 }
0185 
0186 void MyMoneySecurity::setRoundingMethod(const AlkValue::RoundingMethod rnd)
0187 {
0188     Q_D(MyMoneySecurity);
0189     d->m_roundingMethod = rnd;
0190 }
0191 
0192 int MyMoneySecurity::smallestAccountFraction() const
0193 {
0194     Q_D(const MyMoneySecurity);
0195     return d->m_smallestAccountFraction;
0196 }
0197 
0198 void MyMoneySecurity::setSmallestAccountFraction(const int sf)
0199 {
0200     Q_D(MyMoneySecurity);
0201     d->m_smallestAccountFraction = sf;
0202 }
0203 
0204 int MyMoneySecurity::smallestCashFraction() const
0205 {
0206     Q_D(const MyMoneySecurity);
0207     return d->m_smallestCashFraction;
0208 }
0209 
0210 void MyMoneySecurity::setSmallestCashFraction(const int cf)
0211 {
0212     Q_D(MyMoneySecurity);
0213     d->m_smallestCashFraction = cf;
0214 }
0215 
0216 int MyMoneySecurity::pricePrecision() const
0217 {
0218     Q_D(const MyMoneySecurity);
0219     return d->m_pricePrecision;
0220 }
0221 
0222 void MyMoneySecurity::setPricePrecision(const int pp)
0223 {
0224     Q_D(MyMoneySecurity);
0225     d->m_pricePrecision = pp;
0226 }
0227 
0228 QString MyMoneySecurity::securityTypeToString(const eMyMoney::Security::Type securityType)
0229 {
0230     switch (securityType) {
0231     case eMyMoney::Security::Type::Stock:
0232         return i18nc("Security type", "Stock");
0233     case eMyMoney::Security::Type::MutualFund:
0234         return i18nc("Security type", "Mutual Fund");
0235     case eMyMoney::Security::Type::Bond:
0236         return i18nc("Security type", "Bond");
0237     case eMyMoney::Security::Type::Currency:
0238         return i18nc("Security type", "Currency");
0239     case eMyMoney::Security::Type::None:
0240         return i18nc("Security type", "None");
0241     default:
0242         return i18nc("Security type", "Unknown");
0243     }
0244 }
0245 
0246 QString MyMoneySecurity::roundingMethodToString(const AlkValue::RoundingMethod roundingMethod)
0247 {
0248     switch (roundingMethod) {
0249     case AlkValue::RoundNever:
0250         return kli18n("Never").untranslatedText();
0251     case AlkValue::RoundFloor:
0252         return kli18n("Floor").untranslatedText();
0253     case AlkValue::RoundCeil:
0254         return kli18n("Ceil").untranslatedText();
0255     case AlkValue::RoundTruncate:
0256         return kli18n("Truncate").untranslatedText();
0257     case AlkValue::RoundPromote:
0258         return kli18n("Promote").untranslatedText();
0259     case AlkValue::RoundHalfDown:
0260         return kli18n("HalfDown").untranslatedText();
0261     case AlkValue::RoundHalfUp:
0262         return kli18n("HalfUp").untranslatedText();
0263     case AlkValue::RoundRound:
0264         return kli18n("Round").untranslatedText();
0265     default:
0266         return kli18n("Unknown").untranslatedText();
0267     }
0268 }