void Model_Checking::getFrequentUsedNotes(std::vector<wxString> &frequentNotes, int accountID) { frequentNotes.clear(); int max = 20; const auto notes = instance().find(NOTES("", NOT_EQUAL) , accountID > 0 ? ACCOUNTID(accountID) : ACCOUNTID(-1, NOT_EQUAL)); std::map <wxString, int> counterMap; for (const auto& entry : notes) counterMap[entry.NOTES]--; std::map <int, std::vector<wxString> > notesMap; for (const auto& entry : counterMap) notesMap[entry.second].push_back(entry.first); for (auto& v : notesMap) { std::reverse(v.second.begin(), v.second.end()); for (const auto& i : v.second) { frequentNotes.push_back(i); if (frequentNotes.size() >= static_cast<size_t>(max)) break; } if (frequentNotes.size() >= static_cast<size_t>(max)) break; } std::stable_sort(frequentNotes.begin(), frequentNotes.end()); }
void Model_Checking::getFrequentUsedNotes(std::vector<wxString> &frequentNotes, int accountID) { frequentNotes.clear(); size_t max = 20; const auto notes = instance().find(NOTES("", NOT_EQUAL) , accountID > 0 ? ACCOUNTID(accountID) : ACCOUNTID(-1, NOT_EQUAL)); std::map <wxString, int> counterMap; for (const auto& entry : notes) counterMap[entry.NOTES]--; std::priority_queue<std::pair<int, wxString> > q; // largest element to appear as the top for (const auto & kv: counterMap) { q.push(std::make_pair(kv.second, kv.first)); if (q.size() > max) q.pop(); // keep fixed queue as max } while(!q.empty()) { const auto & kv = q.top(); frequentNotes.push_back(kv.second); q.pop(); } }
void Model_Checking::getEmptyTransaction(Data &data, int accountID) { data.TRANSID = -1; wxDateTime trx_date = wxDateTime::Today(); if (mmIniOptions::instance().transDateDefault_ != 0) { auto trans = instance().find(ACCOUNTID(accountID), TRANSDATE(trx_date, LESS_OR_EQUAL)); std::stable_sort(trans.begin(), trans.end(), SorterByTRANSDATE()); std::reverse(trans.begin(), trans.end()); if (!trans.empty()) trx_date = to_date(trans.begin()->TRANSDATE); wxDateTime trx_date_b = wxDateTime::Today(); auto trans_b = instance().find(TOACCOUNTID(accountID), TRANSDATE(trx_date_b, LESS_OR_EQUAL)); std::stable_sort(trans_b.begin(), trans_b.end(), SorterByTRANSDATE()); std::reverse(trans_b.begin(), trans_b.end()); if (!trans_b.empty()) { trx_date_b = to_date(trans_b.begin()->TRANSDATE); if (!trans.empty() && (trx_date_b > trx_date)) trx_date = trx_date_b; } } data.TRANSDATE = trx_date.FormatISODate(); data.ACCOUNTID = accountID; data.STATUS = toShortStatus(all_status()[mmIniOptions::instance().transStatusReconciled_]); data.TRANSCODE = all_type()[WITHDRAWAL]; data.CATEGID = -1; data.SUBCATEGID = -1; data.FOLLOWUPID = -1; data.TRANSAMOUNT = 0; data.TOTRANSAMOUNT = 0; data.TRANSACTIONNUMBER = ""; if (mmIniOptions::instance().transPayeeSelectionNone_ != 0) { auto trx = instance().find(TRANSCODE(TRANSFER, NOT_EQUAL) , ACCOUNTID(accountID, EQUAL), TRANSDATE(trx_date, LESS_OR_EQUAL)); if (!trx.empty()) { std::stable_sort(trx.begin(), trx.end(), SorterByTRANSDATE()); Model_Payee::Data* payee = Model_Payee::instance().get(trx.rbegin()->PAYEEID); if (payee) data.PAYEEID = payee->PAYEEID; if (payee && mmIniOptions::instance().transCategorySelectionNone_ != 0) { data.CATEGID = payee->CATEGID; data.SUBCATEGID = payee->SUBCATEGID; } } } }
void Model_Checking::getFrequentUsedNotes(std::vector<wxString> &frequentNotes, int accountID) { frequentNotes.clear(); int max = 20; for (const auto& entry : instance().find(NOTES("", NOT_EQUAL) , accountID > 0 ? ACCOUNTID(accountID) : ACCOUNTID(-1, NOT_EQUAL))) { const wxString& notes = entry.NOTES; if (std::find(frequentNotes.begin(), frequentNotes.end(), notes) == frequentNotes.end()) frequentNotes.push_back(notes); } std::reverse(frequentNotes.begin(), frequentNotes.end()); if (frequentNotes.size() > static_cast<size_t>(max)) frequentNotes.erase(frequentNotes.begin() + max, frequentNotes.end()); std::stable_sort(frequentNotes.begin(), frequentNotes.end()); }