Changeset View
Changeset View
Standalone View
Standalone View
kmymoney/mymoney/mymoneybudget.cpp
Show All 18 Lines | |||||
19 | 19 | | |||
20 | #include "mymoneybudget.h" | 20 | #include "mymoneybudget.h" | ||
21 | #include "mymoneybudget_p.h" | 21 | #include "mymoneybudget_p.h" | ||
22 | 22 | | |||
23 | // ---------------------------------------------------------------------------- | 23 | // ---------------------------------------------------------------------------- | ||
24 | // QT Includes | 24 | // QT Includes | ||
25 | 25 | | |||
26 | #include <QMap> | 26 | #include <QMap> | ||
27 | #include <QDomElement> | | |||
28 | #include <QDomDocument> | | |||
29 | 27 | | |||
30 | // ---------------------------------------------------------------------------- | 28 | // ---------------------------------------------------------------------------- | ||
31 | // KDE Includes | 29 | // KDE Includes | ||
32 | 30 | | |||
33 | // ---------------------------------------------------------------------------- | 31 | // ---------------------------------------------------------------------------- | ||
34 | // Project Includes | 32 | // Project Includes | ||
35 | 33 | | |||
36 | class MyMoneyBudget::PeriodGroupPrivate | 34 | class MyMoneyBudget::PeriodGroupPrivate | ||
▲ Show 20 Lines • Show All 45 Lines • ▼ Show 20 Line(s) | |||||
82 | 80 | | |||
83 | bool MyMoneyBudget::PeriodGroup::operator == (const PeriodGroup& right) const | 81 | bool MyMoneyBudget::PeriodGroup::operator == (const PeriodGroup& right) const | ||
84 | { | 82 | { | ||
85 | Q_D(const PeriodGroup); | 83 | Q_D(const PeriodGroup); | ||
86 | auto d2 = static_cast<const PeriodGroupPrivate *>(right.d_func()); | 84 | auto d2 = static_cast<const PeriodGroupPrivate *>(right.d_func()); | ||
87 | return (d->m_start == d2->m_start && d->m_amount == d2->m_amount); | 85 | return (d->m_start == d2->m_start && d->m_amount == d2->m_amount); | ||
88 | } | 86 | } | ||
89 | 87 | | |||
90 | const int BUDGET_VERSION = 2; | | |||
91 | | ||||
92 | class MyMoneyBudget::AccountGroupPrivate { | 88 | class MyMoneyBudget::AccountGroupPrivate { | ||
93 | 89 | | |||
94 | public: | 90 | public: | ||
95 | 91 | | |||
96 | AccountGroupPrivate() : | 92 | AccountGroupPrivate() : | ||
97 | m_budgetlevel(eMyMoney::Budget::Level::None), | 93 | m_budgetlevel(eMyMoney::Budget::Level::None), | ||
98 | m_budgetsubaccounts(false) | 94 | m_budgetsubaccounts(false) | ||
99 | { | 95 | { | ||
▲ Show 20 Lines • Show All 265 Lines • ▼ Show 20 Line(s) | |||||
365 | 361 | | |||
366 | MyMoneyBudget::MyMoneyBudget(const QString &id) : | 362 | MyMoneyBudget::MyMoneyBudget(const QString &id) : | ||
367 | MyMoneyObject(*new MyMoneyBudgetPrivate, id) | 363 | MyMoneyObject(*new MyMoneyBudgetPrivate, id) | ||
368 | { | 364 | { | ||
369 | Q_D(MyMoneyBudget); | 365 | Q_D(MyMoneyBudget); | ||
370 | d->m_name = QLatin1Literal("Unconfigured Budget"); | 366 | d->m_name = QLatin1Literal("Unconfigured Budget"); | ||
371 | } | 367 | } | ||
372 | 368 | | |||
373 | MyMoneyBudget::MyMoneyBudget(const QDomElement& node) : | | |||
374 | MyMoneyObject(*new MyMoneyBudgetPrivate, node) | | |||
375 | { | | |||
376 | if (!read(node)) | | |||
377 | clearId(); | | |||
378 | } | | |||
379 | | ||||
380 | MyMoneyBudget::MyMoneyBudget(const QString& id, const MyMoneyBudget& other) : | 369 | MyMoneyBudget::MyMoneyBudget(const QString& id, const MyMoneyBudget& other) : | ||
381 | MyMoneyObject(*new MyMoneyBudgetPrivate(*other.d_func()), id) | 370 | MyMoneyObject(*new MyMoneyBudgetPrivate(*other.d_func()), id) | ||
382 | { | 371 | { | ||
383 | } | 372 | } | ||
384 | 373 | | |||
385 | MyMoneyBudget::MyMoneyBudget(const MyMoneyBudget& other) : | 374 | MyMoneyBudget::MyMoneyBudget(const MyMoneyBudget& other) : | ||
386 | MyMoneyObject(*new MyMoneyBudgetPrivate(*other.d_func()), other.id()) | 375 | MyMoneyObject(*new MyMoneyBudgetPrivate(*other.d_func()), other.id()) | ||
387 | { | 376 | { | ||
Show All 10 Lines | 384 | { | |||
398 | return (MyMoneyObject::operator==(right) && | 387 | return (MyMoneyObject::operator==(right) && | ||
399 | (d->m_accounts.count() == d2->m_accounts.count()) && | 388 | (d->m_accounts.count() == d2->m_accounts.count()) && | ||
400 | (d->m_accounts.keys() == d2->m_accounts.keys()) && | 389 | (d->m_accounts.keys() == d2->m_accounts.keys()) && | ||
401 | (d->m_accounts.values() == d2->m_accounts.values()) && | 390 | (d->m_accounts.values() == d2->m_accounts.values()) && | ||
402 | (d->m_name == d2->m_name) && | 391 | (d->m_name == d2->m_name) && | ||
403 | (d->m_start == d2->m_start)); | 392 | (d->m_start == d2->m_start)); | ||
404 | } | 393 | } | ||
405 | 394 | | |||
406 | void MyMoneyBudget::write(QDomElement& e, QDomDocument *doc) const | | |||
407 | { | | |||
408 | Q_D(const MyMoneyBudget); | | |||
409 | d->writeBaseXML(*doc, e); | | |||
410 | | ||||
411 | e.setAttribute(d->getAttrName(Budget::Attribute::Name), d->m_name); | | |||
412 | e.setAttribute(d->getAttrName(Budget::Attribute::Start), d->m_start.toString(Qt::ISODate)); | | |||
413 | e.setAttribute(d->getAttrName(Budget::Attribute::Version), BUDGET_VERSION); | | |||
414 | | ||||
415 | QMap<QString, AccountGroup>::const_iterator it; | | |||
416 | for (it = d->m_accounts.begin(); it != d->m_accounts.end(); ++it) { | | |||
417 | // only add the account if there is a budget entered | | |||
418 | // or it covers some sub accounts | | |||
419 | if (!(*it).balance().isZero() || (*it).budgetSubaccounts()) { | | |||
420 | QDomElement domAccount = doc->createElement(d->getElName(Budget::Element::Account)); | | |||
421 | domAccount.setAttribute(d->getAttrName(Budget::Attribute::ID), it.key()); | | |||
422 | domAccount.setAttribute(d->getAttrName(Budget::Attribute::BudgetLevel), d->budgetNames(it.value().budgetLevel())); | | |||
423 | domAccount.setAttribute(d->getAttrName(Budget::Attribute::BudgetSubAccounts), it.value().budgetSubaccounts()); | | |||
424 | | ||||
425 | const QMap<QDate, PeriodGroup> periods = it.value().getPeriods(); | | |||
426 | QMap<QDate, PeriodGroup>::const_iterator it_per; | | |||
427 | for (it_per = periods.begin(); it_per != periods.end(); ++it_per) { | | |||
428 | if (!(*it_per).amount().isZero()) { | | |||
429 | QDomElement domPeriod = doc->createElement(d->getElName(Budget::Element::Period)); | | |||
430 | | ||||
431 | domPeriod.setAttribute(d->getAttrName(Budget::Attribute::Amount), (*it_per).amount().toString()); | | |||
432 | domPeriod.setAttribute(d->getAttrName(Budget::Attribute::Start), (*it_per).startDate().toString(Qt::ISODate)); | | |||
433 | domAccount.appendChild(domPeriod); | | |||
434 | } | | |||
435 | } | | |||
436 | | ||||
437 | e.appendChild(domAccount); | | |||
438 | } | | |||
439 | } | | |||
440 | } | | |||
441 | | ||||
442 | bool MyMoneyBudget::read(const QDomElement& e) | | |||
443 | { | | |||
444 | // The goal of this reading method is 100% backward AND 100% forward | | |||
445 | // compatibility. Any Budget ever created with any version of KMyMoney | | |||
446 | // should be able to be loaded by this method (as long as it's one of the | | |||
447 | // Budget types supported in this version, of course) | | |||
448 | | ||||
449 | Q_D(MyMoneyBudget); | | |||
450 | auto result = false; | | |||
451 | | ||||
452 | if (d->getElName(Budget::Element::Budget) == e.tagName()) { | | |||
453 | result = true; | | |||
454 | d->m_name = e.attribute(d->getAttrName(Budget::Attribute::Name)); | | |||
455 | d->m_start = QDate::fromString(e.attribute(d->getAttrName(Budget::Attribute::Start)), Qt::ISODate); | | |||
456 | d->m_id = e.attribute(d->getAttrName(Budget::Attribute::ID)); | | |||
457 | | ||||
458 | QDomNode child = e.firstChild(); | | |||
459 | while (!child.isNull() && child.isElement()) { | | |||
460 | QDomElement c = child.toElement(); | | |||
461 | | ||||
462 | AccountGroup account; | | |||
463 | | ||||
464 | if (d->getElName(Budget::Element::Account) == c.tagName()) { | | |||
465 | if (c.hasAttribute(d->getAttrName(Budget::Attribute::ID))) | | |||
466 | account.setId(c.attribute(d->getAttrName(Budget::Attribute::ID))); | | |||
467 | | ||||
468 | if (c.hasAttribute(d->getAttrName(Budget::Attribute::BudgetLevel))) | | |||
469 | account.setBudgetLevel(d->stringToBudgetLevel(c.attribute(d->getAttrName(Budget::Attribute::BudgetLevel)))); | | |||
470 | | ||||
471 | if (c.hasAttribute(d->getAttrName(Budget::Attribute::BudgetSubAccounts))) | | |||
472 | account.setBudgetSubaccounts(c.attribute(d->getAttrName(Budget::Attribute::BudgetSubAccounts)).toUInt()); | | |||
473 | } | | |||
474 | | ||||
475 | QDomNode period = c.firstChild(); | | |||
476 | while (!period.isNull() && period.isElement()) { | | |||
477 | QDomElement per = period.toElement(); | | |||
478 | PeriodGroup pGroup; | | |||
479 | | ||||
480 | if (d->getElName(Budget::Element::Period) == per.tagName() && per.hasAttribute(d->getAttrName(Budget::Attribute::Amount)) && per.hasAttribute(d->getAttrName(Budget::Attribute::Start))) { | | |||
481 | pGroup.setAmount(MyMoneyMoney(per.attribute(d->getAttrName(Budget::Attribute::Amount)))); | | |||
482 | pGroup.setStartDate(QDate::fromString(per.attribute(d->getAttrName(Budget::Attribute::Start)), Qt::ISODate)); | | |||
483 | account.addPeriod(pGroup.startDate(), pGroup); | | |||
484 | } | | |||
485 | | ||||
486 | period = period.nextSibling(); | | |||
487 | } | | |||
488 | | ||||
489 | d->m_accounts[account.id()] = account; | | |||
490 | | ||||
491 | child = child.nextSibling(); | | |||
492 | } | | |||
493 | } | | |||
494 | | ||||
495 | return result; | | |||
496 | } | | |||
497 | | ||||
498 | void MyMoneyBudget::writeXML(QDomDocument& document, QDomElement& parent) const | | |||
499 | { | | |||
500 | Q_D(const MyMoneyBudget); | | |||
501 | QDomElement el = document.createElement(d->getElName(Budget::Element::Budget)); | | |||
502 | write(el, &document); | | |||
503 | parent.appendChild(el); | | |||
504 | } | | |||
505 | | ||||
506 | bool MyMoneyBudget::hasReferenceTo(const QString& id) const | 395 | bool MyMoneyBudget::hasReferenceTo(const QString& id) const | ||
507 | { | 396 | { | ||
508 | Q_D(const MyMoneyBudget); | 397 | Q_D(const MyMoneyBudget); | ||
509 | // return true if we have an assignment for this id | 398 | // return true if we have an assignment for this id | ||
510 | return (d->m_accounts.contains(id)); | 399 | return (d->m_accounts.contains(id)); | ||
511 | } | 400 | } | ||
512 | 401 | | |||
513 | void MyMoneyBudget::removeReference(const QString& id) | 402 | void MyMoneyBudget::removeReference(const QString& id) | ||
▲ Show 20 Lines • Show All 89 Lines • Show Last 20 Lines |