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

0001 /*
0002     SPDX-FileCopyrightText: 2005-2011 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 /**
0008   * @author Thomas Baumgart
0009   */
0010 
0011 #include "mymoneyprice.h"
0012 
0013 // ----------------------------------------------------------------------------
0014 // QT Includes
0015 
0016 #include <QDate>
0017 #include <QString>
0018 #include <QDomElement>
0019 
0020 // ----------------------------------------------------------------------------
0021 // KDE Includes
0022 
0023 // ----------------------------------------------------------------------------
0024 // Project Includes
0025 
0026 #include "mymoneymoney.h"
0027 #include "mymoneyexception.h"
0028 
0029 class MyMoneyPricePrivate
0030 {
0031 public:
0032     QString       m_fromSecurity;
0033     QString       m_toSecurity;
0034     QDate         m_date;
0035     MyMoneyMoney  m_rate;
0036     MyMoneyMoney  m_invRate;
0037     QString       m_source;
0038 };
0039 
0040 MyMoneyPrice::MyMoneyPrice() :
0041     d_ptr(new MyMoneyPricePrivate)
0042 {
0043 }
0044 
0045 MyMoneyPrice::MyMoneyPrice(const QString& from,
0046                            const QString& to,
0047                            const QDomElement& node) :
0048     d_ptr(new MyMoneyPricePrivate)
0049 {
0050     if ("PRICE" != node.tagName())
0051         throw MYMONEYEXCEPTION_CSTRING("Node was not PRICE");
0052 
0053     Q_D(MyMoneyPrice);
0054     d->m_fromSecurity = from;
0055     d->m_toSecurity = to;
0056 
0057     d->m_date = QDate::fromString(node.attribute("date"), Qt::ISODate);
0058     d->m_rate = MyMoneyMoney(node.attribute("price"));
0059     d->m_source = node.attribute("source");
0060 
0061     if (!d->m_rate.isZero())
0062         d->m_invRate = MyMoneyMoney::ONE / d->m_rate;
0063     else
0064         qDebug("Price with zero value loaded");
0065 }
0066 
0067 MyMoneyPrice::MyMoneyPrice(const QString& from, const QString& to, const QDate& date, const MyMoneyMoney& rate, const QString& source) :
0068     d_ptr(new MyMoneyPricePrivate)
0069 {
0070     Q_D(MyMoneyPrice);
0071     d->m_fromSecurity =from;
0072     d->m_toSecurity = to;
0073     d->m_date = date;
0074     d->m_rate = rate;
0075     d->m_source = source;
0076 
0077     if (!d->m_rate.isZero())
0078         d->m_invRate = MyMoneyMoney::ONE / d->m_rate;
0079     else
0080         qDebug("Price with zero value created for '%s' to '%s'",
0081                qPrintable(from), qPrintable(to));
0082 }
0083 
0084 MyMoneyPrice::MyMoneyPrice(const MyMoneyPrice& other) :
0085     d_ptr(new MyMoneyPricePrivate(*other.d_func()))
0086 {
0087 }
0088 
0089 MyMoneyPrice::~MyMoneyPrice()
0090 {
0091     Q_D(MyMoneyPrice);
0092     delete d;
0093 }
0094 
0095 MyMoneyMoney MyMoneyPrice::rate(const QString& id) const
0096 {
0097     Q_D(const MyMoneyPrice);
0098     static MyMoneyMoney dummyPrice(1, 1);
0099 
0100     if (!isValid())
0101         return dummyPrice;
0102 
0103     if (id.isEmpty() || id == d->m_toSecurity)
0104         return d->m_rate;
0105     if (id == d->m_fromSecurity)
0106         return d->m_invRate;
0107 
0108     throw MYMONEYEXCEPTION(QString::fromLatin1("Unknown security id %1 for price info %2/%3.").arg(id, d->m_fromSecurity, d->m_toSecurity));
0109 }
0110 
0111 QDate MyMoneyPrice::date() const
0112 {
0113     Q_D(const MyMoneyPrice);
0114     return d->m_date;
0115 }
0116 
0117 QString MyMoneyPrice::source() const
0118 {
0119     Q_D(const MyMoneyPrice);
0120     return d->m_source;
0121 }
0122 
0123 QString MyMoneyPrice::from() const
0124 {
0125     Q_D(const MyMoneyPrice);
0126     return d->m_fromSecurity;
0127 }
0128 
0129 QString MyMoneyPrice::to() const
0130 {
0131     Q_D(const MyMoneyPrice);
0132     return d->m_toSecurity;
0133 }
0134 
0135 bool MyMoneyPrice::isValid() const
0136 {
0137     Q_D(const MyMoneyPrice);
0138     return (d->m_date.isValid() && !d->m_fromSecurity.isEmpty() && !d->m_toSecurity.isEmpty());
0139 }
0140 
0141 // Equality operator
0142 bool MyMoneyPrice::operator == (const MyMoneyPrice &right) const
0143 {
0144     Q_D(const MyMoneyPrice);
0145     auto d2 = static_cast<const MyMoneyPricePrivate *>(right.d_func());
0146     return ((d->m_date == d2->m_date) &&
0147             (d->m_rate == d2->m_rate) &&
0148             ((d->m_fromSecurity.length() == 0 && d2->m_fromSecurity.length() == 0) || (d->m_fromSecurity == d2->m_fromSecurity)) &&
0149             ((d->m_toSecurity.length() == 0 && d2->m_toSecurity.length() == 0) || (d->m_toSecurity == d2->m_toSecurity)) &&
0150             ((d->m_source.length() == 0 && d2->m_source.length() == 0) || (d->m_source == d2->m_source)));
0151 }
0152 
0153 bool MyMoneyPrice::operator != (const MyMoneyPrice &right) const
0154 {
0155     return !(operator == (right));
0156 }
0157 
0158 bool MyMoneyPrice::hasReferenceTo(const QString& id) const
0159 {
0160     Q_D(const MyMoneyPrice);
0161     return (id == d->m_fromSecurity) || (id == d->m_toSecurity);
0162 }