1 /*
2  * Copyright 2005-2017  Thomas Baumgart <tbaumgart@kde.org>
3  * Copyright 2017-2018  Łukasz Wojniłowicz <lukasz.wojnilowicz@gmail.com>
4  *
5  * This program is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU General Public License as
7  * published by the Free Software Foundation; either version 2 of
8  * the License, or (at your option) any later version.
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13  * GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
17  */
18 
19 #include "mymoneysecurity.h"
20 #include "mymoneysecurity_p.h"
21 
22 // ----------------------------------------------------------------------------
23 // QT Includes
24 
25 #include <QString>
26 
27 // ----------------------------------------------------------------------------
28 // KDE Includes
29 
30 #include <KLocalizedString>
31 
32 // ----------------------------------------------------------------------------
33 // Project Includes
34 
35 #include "mymoneyexception.h"
36 
37 using namespace eMyMoney;
38 
MyMoneySecurity()39 MyMoneySecurity::MyMoneySecurity() :
40   MyMoneyObject(*new MyMoneySecurityPrivate)
41 {
42 }
43 
MyMoneySecurity(const QString & id)44 MyMoneySecurity::MyMoneySecurity(const QString &id) :
45   MyMoneyObject(*new MyMoneySecurityPrivate, id)
46 {
47 }
48 
MyMoneySecurity(const QString & id,const QString & name,const QString & symbol,const int smallestCashFraction,const int smallestAccountFraction,const int pricePrecision)49 MyMoneySecurity::MyMoneySecurity(const QString& id,
50                                  const QString& name,
51                                  const QString& symbol,
52                                  const int smallestCashFraction,
53                                  const int smallestAccountFraction,
54                                  const int pricePrecision) :
55   MyMoneyObject(*new MyMoneySecurityPrivate, id),
56   MyMoneyKeyValueContainer()
57 {
58   Q_D(MyMoneySecurity);
59   d->m_name = name;
60   d->m_smallestCashFraction = smallestCashFraction;
61   d->m_pricePrecision = pricePrecision;
62   d->m_securityType = eMyMoney::Security::Type::Currency;
63 
64   if (symbol.isEmpty())
65     d->m_tradingSymbol = id;
66   else
67     d->m_tradingSymbol = symbol;
68 
69   if (smallestAccountFraction)
70     d->m_smallestAccountFraction = smallestAccountFraction;
71   else
72     d->m_smallestAccountFraction = smallestCashFraction;
73 }
74 
MyMoneySecurity(const MyMoneySecurity & other)75 MyMoneySecurity::MyMoneySecurity(const MyMoneySecurity& other) :
76   MyMoneyObject(*new MyMoneySecurityPrivate(*other.d_func()), other.id()),
77   MyMoneyKeyValueContainer(other)
78 {
79 }
80 
MyMoneySecurity(const QString & id,const MyMoneySecurity & other)81 MyMoneySecurity::MyMoneySecurity(const QString& id, const MyMoneySecurity& other) :
82   MyMoneyObject(*new MyMoneySecurityPrivate(*other.d_func()), id),
83   MyMoneyKeyValueContainer(other)
84 {
85 }
86 
~MyMoneySecurity()87 MyMoneySecurity::~MyMoneySecurity()
88 {
89 }
90 
operator ==(const MyMoneySecurity & right) const91 bool MyMoneySecurity::operator == (const MyMoneySecurity& right) const
92 {
93   Q_D(const MyMoneySecurity);
94   auto d2 = static_cast<const MyMoneySecurityPrivate *>(right.d_func());
95   return (d->m_id == d2->m_id)
96          && (d->m_name == d2->m_name)
97          && (d->m_tradingSymbol == d2->m_tradingSymbol)
98          && (d->m_tradingMarket == d2->m_tradingMarket)
99          && (d->m_roundingMethod == d2->m_roundingMethod)
100          && (d->m_tradingSymbol == d2->m_tradingSymbol)
101          && (d->m_tradingCurrency == d2->m_tradingCurrency)
102          && (d->m_securityType == d2->m_securityType)
103          && (d->m_smallestAccountFraction == d2->m_smallestAccountFraction)
104          && (d->m_smallestCashFraction == d2->m_smallestCashFraction)
105          && (d->m_pricePrecision == d2->m_pricePrecision)
106          && this->MyMoneyKeyValueContainer::operator == (right);
107 }
108 
operator <(const MyMoneySecurity & right) const109 bool MyMoneySecurity::operator < (const MyMoneySecurity& right) const
110 {
111   Q_D(const MyMoneySecurity);
112   auto d2 = static_cast<const MyMoneySecurityPrivate *>(right.d_func());
113   if (d->m_securityType == d2->m_securityType)
114     return d->m_name < d2->m_name;
115   return d->m_securityType < d2->m_securityType;
116 }
117 
name() const118 QString MyMoneySecurity::name() const
119 {
120   Q_D(const MyMoneySecurity);
121   return d->m_name;
122 }
123 
setName(const QString & str)124 void MyMoneySecurity::setName(const QString& str)
125 {
126   Q_D(MyMoneySecurity);
127   d->m_name = str;
128 }
129 
tradingSymbol() const130 QString MyMoneySecurity::tradingSymbol() const
131 {
132   Q_D(const MyMoneySecurity);
133   return d->m_tradingSymbol;
134 }
135 
setTradingSymbol(const QString & str)136 void MyMoneySecurity::setTradingSymbol(const QString& str)
137 {
138   Q_D(MyMoneySecurity);
139   d->m_tradingSymbol = str;
140 }
141 
tradingMarket() const142 QString MyMoneySecurity::tradingMarket() const
143 {
144   Q_D(const MyMoneySecurity);
145   return d->m_tradingMarket;
146 }
147 
setTradingMarket(const QString & str)148 void MyMoneySecurity::setTradingMarket(const QString& str)
149 {
150   Q_D(MyMoneySecurity);
151   d->m_tradingMarket = str;
152 }
153 
tradingCurrency() const154 QString MyMoneySecurity::tradingCurrency() const
155 {
156   Q_D(const MyMoneySecurity);
157   return d->m_tradingCurrency;
158 }
159 
setTradingCurrency(const QString & str)160 void MyMoneySecurity::setTradingCurrency(const QString& str)
161 {
162   Q_D(MyMoneySecurity);
163   d->m_tradingCurrency = str;
164 }
165 
operator !=(const MyMoneySecurity & r) const166 bool MyMoneySecurity::operator != (const MyMoneySecurity& r) const
167 {
168   return !(*this == r);
169 }
170 
securityType() const171 eMyMoney::Security::Type MyMoneySecurity::securityType() const
172 {
173   Q_D(const MyMoneySecurity);
174   return d->m_securityType;
175 }
176 
setSecurityType(const eMyMoney::Security::Type s)177 void MyMoneySecurity::setSecurityType(const eMyMoney::Security::Type s)
178 {
179   Q_D(MyMoneySecurity);
180   d->m_securityType = s;
181 }
182 
isCurrency() const183 bool MyMoneySecurity::isCurrency() const
184 {
185   Q_D(const MyMoneySecurity);
186   return d->m_securityType == eMyMoney::Security::Type::Currency;
187 }
188 
roundingMethod() const189 AlkValue::RoundingMethod MyMoneySecurity::roundingMethod() const
190 {
191   Q_D(const MyMoneySecurity);
192   return d->m_roundingMethod;
193 }
194 
setRoundingMethod(const AlkValue::RoundingMethod rnd)195 void MyMoneySecurity::setRoundingMethod(const AlkValue::RoundingMethod rnd)
196 {
197   Q_D(MyMoneySecurity);
198   d->m_roundingMethod = rnd;
199 }
200 
smallestAccountFraction() const201 int MyMoneySecurity::smallestAccountFraction() const
202 {
203   Q_D(const MyMoneySecurity);
204   return d->m_smallestAccountFraction;
205 }
206 
setSmallestAccountFraction(const int sf)207 void MyMoneySecurity::setSmallestAccountFraction(const int sf)
208 {
209   Q_D(MyMoneySecurity);
210   d->m_smallestAccountFraction = sf;
211 }
212 
smallestCashFraction() const213 int MyMoneySecurity::smallestCashFraction() const
214 {
215   Q_D(const MyMoneySecurity);
216   return d->m_smallestCashFraction;
217 }
218 
setSmallestCashFraction(const int cf)219 void MyMoneySecurity::setSmallestCashFraction(const int cf)
220 {
221   Q_D(MyMoneySecurity);
222   d->m_smallestCashFraction = cf;
223 }
224 
pricePrecision() const225 int MyMoneySecurity::pricePrecision() const
226 {
227   Q_D(const MyMoneySecurity);
228   return d->m_pricePrecision;
229 }
230 
setPricePrecision(const int pp)231 void MyMoneySecurity::setPricePrecision(const int pp)
232 {
233   Q_D(MyMoneySecurity);
234   d->m_pricePrecision = pp;
235 }
236 
hasReferenceTo(const QString & id) const237 bool MyMoneySecurity::hasReferenceTo(const QString& id) const
238 {
239   Q_D(const MyMoneySecurity);
240   return (id == d->m_tradingCurrency);
241 }
242 
securityTypeToString(const eMyMoney::Security::Type securityType)243 QString MyMoneySecurity::securityTypeToString(const eMyMoney::Security::Type securityType)
244 {
245   switch (securityType) {
246     case eMyMoney::Security::Type::Stock:
247       return i18nc("Security type", "Stock");
248     case eMyMoney::Security::Type::MutualFund:
249       return i18nc("Security type", "Mutual Fund");
250     case eMyMoney::Security::Type::Bond:
251       return i18nc("Security type", "Bond");
252     case eMyMoney::Security::Type::Currency:
253       return i18nc("Security type", "Currency");
254     case eMyMoney::Security::Type::None:
255       return i18nc("Security type", "None");
256     default:
257       return i18nc("Security type", "Unknown");
258   }
259 }
260 
roundingMethodToString(const AlkValue::RoundingMethod roundingMethod)261 QString MyMoneySecurity::roundingMethodToString(const AlkValue::RoundingMethod roundingMethod)
262 {
263   switch (roundingMethod) {
264     case AlkValue::RoundNever:
265       return I18N_NOOP("Never");
266     case AlkValue::RoundFloor:
267       return I18N_NOOP("Floor");
268     case AlkValue::RoundCeil:
269       return I18N_NOOP("Ceil");
270     case AlkValue::RoundTruncate:
271       return I18N_NOOP("Truncate");
272     case AlkValue::RoundPromote:
273       return I18N_NOOP("Promote");
274     case AlkValue::RoundHalfDown:
275       return I18N_NOOP("HalfDown");
276     case AlkValue::RoundHalfUp:
277       return I18N_NOOP("HalfUp");
278     case AlkValue::RoundRound:
279       return I18N_NOOP("Round");
280     default:
281       return I18N_NOOP("Unknown");
282   }
283 }
284