File indexing completed on 2024-05-12 16:42:40

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