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 }