void MyMoneySplitTest::testReadXML() { MyMoneySplit s; QString ref_ok = QString( "<!DOCTYPE TEST>\n" "<SPLIT-CONTAINER>\n" " <SPLIT payee=\"P000001\" reconciledate=\"\" shares=\"96379/100\" action=\"Deposit\" bankid=\"SPID\" number=\"124\" reconcileflag=\"2\" memo=\"MyMemo\" value=\"96379/1000\" account=\"A000076\">\n" " <TAG id=\"G000001\"/>\n" " </SPLIT>\n" "</SPLIT-CONTAINER>\n"); QString ref_false = QString( "<!DOCTYPE TEST>\n" "<SPLIT-CONTAINER>\n" " <SPLITS payee=\"P000001\" reconciledate=\"\" shares=\"96379/100\" action=\"Deposit\" bankid=\"SPID\" number=\"124\" reconcileflag=\"2\" memo=\"\" value=\"96379/1000\" account=\"A000076\" />\n" " <TAG id=\"G000001\"/>\n" "</SPLIT-CONTAINER>\n"); QDomDocument doc; QDomElement node; doc.setContent(ref_false); node = doc.documentElement().firstChild().toElement(); try { s = MyMoneySplit(node); QFAIL("Missing expected exception"); } catch (const MyMoneyException &) { } doc.setContent(ref_ok); node = doc.documentElement().firstChild().toElement(); try { s = MyMoneySplit(node); QVERIFY(s.id().isEmpty()); QVERIFY(s.payeeId() == "P000001"); QList<QString> tagIdList; tagIdList << "G000001"; QVERIFY(s.tagIdList() == tagIdList); QVERIFY(s.reconcileDate() == QDate()); QVERIFY(s.shares() == MyMoneyMoney(96379, 100)); QVERIFY(s.value() == MyMoneyMoney(96379, 1000)); QVERIFY(s.number() == "124"); QVERIFY(s.bankID() == "SPID"); QVERIFY(s.reconcileFlag() == MyMoneySplit::Reconciled); QVERIFY(s.action() == MyMoneySplit::ActionDeposit); QVERIFY(s.accountId() == "A000076"); QVERIFY(s.memo() == "MyMemo"); } catch (const MyMoneyException &) { } }
MyMoneyObject const * TransactionMatcher::findMatch(const MyMoneyTransaction& ti, const MyMoneySplit& si, MyMoneySplit& sm, autoMatchResultE& result) { result = notMatched; sm = MyMoneySplit(); MyMoneyTransactionFilter filter(si.accountId()); filter.setReportAllSplits(false); filter.setDateFilter(ti.postDate().addDays(-m_days), ti.postDate().addDays(m_days)); filter.setAmountFilter(si.shares(), si.shares()); QValueList<QPair<MyMoneyTransaction, MyMoneySplit> > list; MyMoneyFile::instance()->transactionList(list, filter); // parse list QValueList<QPair<MyMoneyTransaction, MyMoneySplit> >::iterator it_l; QPair<MyMoneyTransaction, MyMoneySplit> lastMatch; for(it_l = list.begin(); (result != matchedDuplicate) && (it_l != list.end()); ++it_l) { // just skip myself if((*it_l).first.id() == ti.id()) { continue; } checkTransaction((*it_l).first, ti, si, lastMatch, result); } MyMoneyObject* rc = 0; if(result != notMatched) { sm = lastMatch.second; rc = new MyMoneyTransaction(lastMatch.first); } else { // if we did not find anything, we need to scan for scheduled transactions QValueList<MyMoneySchedule> list; QValueList<MyMoneySchedule>::iterator it_sch; // find all schedules that have a reference to the current account list = MyMoneyFile::instance()->scheduleList(m_account.id()); for(it_sch = list.begin(); (result != matched && result != matchedExact) && (it_sch != list.end()); ++it_sch) { // get the next due date adjusted by the weekend switch QDate nextDueDate = (*it_sch).nextDueDate(); if((*it_sch).isOverdue() || (nextDueDate >= ti.postDate().addDays(-m_days) && nextDueDate <= ti.postDate().addDays(m_days))) { MyMoneyTransaction st = KMyMoneyUtils::scheduledTransaction(*it_sch); checkTransaction(st, ti, si, lastMatch, result, (*it_sch).variation()); if(result == matched || result == matchedExact) { sm = lastMatch.second; rc = new MyMoneySchedule(*it_sch); } } } } return rc; }
const MyMoneySplit KMyMoneyUtils::stockSplit(const MyMoneyTransaction& t) { QList<MyMoneySplit>::ConstIterator it_s; MyMoneySplit investmentAccountSplit; for (it_s = t.splits().begin(); it_s != t.splits().end(); ++it_s) { if (!(*it_s).accountId().isEmpty()) { MyMoneyAccount acc = MyMoneyFile::instance()->account((*it_s).accountId()); if (acc.isInvest()) { return *it_s; } // if we have a reference to an investment account, we remember it here if (acc.accountType() == MyMoneyAccount::Investment) investmentAccountSplit = *it_s; } } // if we haven't found a stock split, we see if we've seen // an investment account on the way. If so, we return it. if (!investmentAccountSplit.id().isEmpty()) return investmentAccountSplit; // if none was found, we return an empty split. return MyMoneySplit(); }
void MyMoneySplitTest::testReplaceId() { MyMoneySplit s; bool changed; s.setPayeeId("P000001"); s.setAccountId("A000076"); changed = s.replaceId("X0001", "Y00001"); QVERIFY(changed == false); QVERIFY(s.payeeId() == "P000001"); QVERIFY(s.accountId() == "A000076"); changed = s.replaceId("P000002", "P000001"); QVERIFY(changed == true); QVERIFY(s.payeeId() == "P000002"); QVERIFY(s.accountId() == "A000076"); changed = s.replaceId("A000079", "A000076"); QVERIFY(changed == true); QVERIFY(s.payeeId() == "P000002"); QVERIFY(s.accountId() == "A000079"); QString ref_ok = QString( "<!DOCTYPE TEST>\n" "<SPLIT-CONTAINER>\n" " <SPLIT payee=\"P000001\" reconciledate=\"\" shares=\"-125000/100\" action=\"Transfer\" bankid=\"A000076-2010-03-05-b6850c0-1\" number=\"\" reconcileflag=\"1\" memo=\"UMBUCHUNG\" value=\"-125000/100\" id=\"S0001\" account=\"A000076\" >\n" " <KEYVALUEPAIRS>\n" " <PAIR key=\"kmm-match-split\" value=\"S0002\" />\n" " <PAIR key=\"kmm-matched-tx\" value=\"&lt;!DOCTYPE MATCH>\n" " &lt;CONTAINER>\n" " &lt;TRANSACTION postdate="2010-03-05" memo="UMBUCHUNG" id="" commodity="EUR" entrydate="2010-03-08" >\n" " &lt;SPLITS>\n" " &lt;SPLIT payee="P000010" reconciledate="" shares="125000/100" action="Transfer" bankid="" number="" reconcileflag="0" memo="UMBUCHUNG" value="125000/100" id="S0001" account="A000087" />\n" " &lt;SPLIT payee="P000011" reconciledate="" shares="-125000/100" action="" bankid="A000076-2010-03-05-b6850c0-1" number="" reconcileflag="0" memo="UMBUCHUNG" value="-125000/100" id="S0002" account="A000076" />\n" " &lt;/SPLITS>\n" " &lt;KEYVALUEPAIRS>\n" " &lt;PAIR key="Imported" value="true" />\n" " &lt;/KEYVALUEPAIRS>\n" " &lt;/TRANSACTION>\n" " &lt;/CONTAINER>\n" "\" />\n" " <PAIR key=\"kmm-orig-memo\" value=\"\" />\n" " </KEYVALUEPAIRS>\n" " </SPLIT>\n" "</SPLIT-CONTAINER>\n" ); QDomDocument doc; QDomElement node; doc.setContent(ref_ok); node = doc.documentElement().firstChild().toElement(); try { s = MyMoneySplit(node); QVERIFY(s.payeeId() == "P000001"); QVERIFY(s.replaceId("P2", "P1") == false); QVERIFY(s.matchedTransaction().splits()[0].payeeId() == "P000010"); QVERIFY(s.matchedTransaction().splits()[1].payeeId() == "P000011"); QVERIFY(s.replaceId("P0010", "P000010") == true); QVERIFY(s.matchedTransaction().splits()[0].payeeId() == "P0010"); QVERIFY(s.matchedTransaction().splits()[1].payeeId() == "P000011"); QVERIFY(s.replaceId("P0011", "P000011") == true); QVERIFY(s.matchedTransaction().splits()[0].payeeId() == "P0010"); QVERIFY(s.matchedTransaction().splits()[1].payeeId() == "P0011"); } catch (const MyMoneyException &) { QFAIL("Unexpected exception"); } }