File indexing completed on 2024-05-19 05:08:19

0001 /*
0002     SPDX-FileCopyrightText: 2000-2002 Michael Edwardes <mte@users.sourceforge.net>
0003     SPDX-FileCopyrightText: 2000-2002 Javier Campos Morales <javi_c@users.sourceforge.net>
0004     SPDX-FileCopyrightText: 2000-2002 Felix Rodriguez <frodriguez@users.sourceforge.net>
0005     SPDX-FileCopyrightText: 2000-2002 John C <thetacoturtle@users.sourceforge.net>
0006     SPDX-FileCopyrightText: 2000-2002 Thomas Baumgart <ipwizard@users.sourceforge.net>
0007     SPDX-FileCopyrightText: 2000-2002 Kevin Tambascio <ktambascio@users.sourceforge.net>
0008     SPDX-FileCopyrightText: 2000-2002 Andreas Nicolai <Andreas.Nicolai@gmx.net>
0009     SPDX-FileCopyrightText: 2017 Łukasz Wojniłowicz <lukasz.wojnilowicz@gmail.com>
0010     SPDX-License-Identifier: GPL-2.0-or-later
0011 */
0012 
0013 #include "kpayeesview.h"
0014 #include "kpayeesview_p.h"
0015 
0016 // ----------------------------------------------------------------------------
0017 // QT Includes
0018 
0019 #include <QAction>
0020 
0021 // ----------------------------------------------------------------------------
0022 // KDE Includes
0023 
0024 // ----------------------------------------------------------------------------
0025 // Project Includes
0026 
0027 using namespace Icons;
0028 
0029 // *** KPayeesView Implementation ***
0030 
0031 KPayeesView::KPayeesView(QWidget *parent) :
0032     KMyMoneyViewBase(*new KPayeesViewPrivate(this), parent)
0033 {
0034     Q_D(KPayeesView);
0035     d->init();
0036 
0037     connect(d->ui->m_payees, &QWidget::customContextMenuRequested, this, [&](QPoint pos) {
0038         Q_D(KPayeesView);
0039         updateActions(d->m_selections);
0040         Q_EMIT requestCustomContextMenu(eMenu::Menu::Payee, d->ui->m_payees->mapToGlobal(pos));
0041     });
0042 
0043     connect(d->ui->m_register, &QWidget::customContextMenuRequested, this, [&](QPoint pos) {
0044         Q_D(KPayeesView);
0045         // it does not make sense to jump to myself
0046         pActions[eMenu::Action::GoToPayee]->setDisabled(true);
0047         Q_EMIT requestCustomContextMenu(eMenu::Menu::Transaction, d->ui->m_register->mapToGlobal(pos));
0048     });
0049 
0050     connect(d->ui->m_filterBox, QOverload<int>::of(&QComboBox::currentIndexChanged), this, [&](int idx) {
0051         Q_D(KPayeesView);
0052         d->m_renameProxyModel->setReferenceFilter(d->ui->m_filterBox->itemData(idx));
0053     });
0054 
0055     connect(d->ui->m_register, &LedgerView::transactionSelectionChanged, this, [&](const SelectedObjects& selections) {
0056         Q_D(KPayeesView);
0057         d->m_selections.setSelection(SelectedObjects::JournalEntry, selections.selection(SelectedObjects::JournalEntry));
0058         if (selections.selection(SelectedObjects::JournalEntry).count() == 1) {
0059             const auto file = MyMoneyFile::instance();
0060             const auto idx = file->journalModel()->indexById(selections.firstSelection(SelectedObjects::JournalEntry));
0061             d->m_selections.setSelection(SelectedObjects::Account, idx.data(eMyMoney::Model::SplitAccountIdRole).toString());
0062         }
0063         Q_EMIT requestSelectionChange(d->m_selections);
0064     });
0065 
0066     connect(d->ui->m_register, &LedgerView::requestView, this, &KPayeesView::requestView);
0067 
0068     connect(LedgerViewSettings::instance(), &LedgerViewSettings::settingsChanged, this, [&]() {
0069         Q_D(KPayeesView);
0070         d->m_transactionFilter->setHideReconciledTransactions(LedgerViewSettings::instance()->hideReconciledTransactions());
0071         d->m_transactionFilter->setHideTransactionsBefore(LedgerViewSettings::instance()->hideTransactionsBefore());
0072     });
0073 
0074     connect(pActions[eMenu::Action::NewPayee], &QAction::triggered, this, &KPayeesView::slotNewPayee);
0075     connect(pActions[eMenu::Action::DeletePayee], &QAction::triggered, this, &KPayeesView::slotDeletePayee);
0076     connect(pActions[eMenu::Action::RenamePayee], &QAction::triggered, this, &KPayeesView::slotRenamePayee);
0077     connect(pActions[eMenu::Action::MergePayee], &QAction::triggered, this, &KPayeesView::slotMergePayee);
0078 
0079     d->m_sharedToolbarActions.insert(eMenu::Action::FileNew, pActions[eMenu::Action::NewPayee]);
0080 }
0081 
0082 KPayeesView::~KPayeesView()
0083 {
0084 }
0085 
0086 void KPayeesView::slotChooseDefaultAccount()
0087 {
0088     Q_D(KPayeesView);
0089     MyMoneyFile* file = MyMoneyFile::instance();
0090     QMap<QString, int> account_count;
0091 
0092 
0093     QModelIndex idx;
0094     const auto rows = d->m_transactionFilter->rowCount();
0095     for(int row = 0; row < rows; ++row) {
0096         idx = d->m_transactionFilter->index(row, 0);
0097         if (!idx.data(eMyMoney::Model::TransactionIsTransferRole).toBool()
0098                 && idx.data(eMyMoney::Model::TransactionSplitCountRole).toInt() == 2) {
0099             const auto accountId = idx.data(eMyMoney::Model::SplitAccountIdRole).toString();
0100             const auto action = idx.data(eMyMoney::Model::SplitActionRole).toString();
0101             const MyMoneyAccount& acc = file->account(accountId);
0102             if (action != MyMoneySplit::actionName(eMyMoney::Split::Action::Amortization)
0103                     && acc.accountType() != eMyMoney::Account::Type::AssetLoan) {
0104                 const auto counterAccount = idx.data(eMyMoney::Model::TransactionCounterAccountIdRole).toString();
0105                 if (!counterAccount.isEmpty()) {
0106                     if (account_count.contains(counterAccount)) {
0107                         account_count[counterAccount]++;
0108                     } else {
0109                         account_count[counterAccount] = 1;
0110                     }
0111                 }
0112             }
0113         }
0114     }
0115 
0116     QMap<QString, int>::Iterator most_frequent, iter;
0117     most_frequent = account_count.begin();
0118     for (iter = account_count.begin(); iter != account_count.end(); ++iter) {
0119         if (iter.value() > most_frequent.value()) {
0120             most_frequent = iter;
0121         }
0122     }
0123 
0124     if (most_frequent != account_count.end()) {
0125         d->ui->checkEnableDefaultCategory->setChecked(true);
0126         d->ui->comboDefaultCategory->setSelected(most_frequent.key());
0127         d->setDirty(true);
0128     }
0129 }
0130 
0131 void KPayeesView::slotRenameSinglePayee(const QModelIndex& idx, const QVariant& value)
0132 {
0133     Q_D(KPayeesView);
0134     //if there is no current item selected, exit
0135     if (!idx.isValid())
0136         return;
0137 
0138     //qDebug() << "[KPayeesView::slotRenamePayee]";
0139     // create a copy of the new name without appended whitespaces
0140     QString new_name = value.toString();
0141     if (d->m_payee.name() != new_name) {
0142         MyMoneyFileTransaction ft;
0143         try {
0144             // check if we already have a payee with the new name
0145             if (!MyMoneyFile::instance()->payeeByName(new_name).id().isEmpty()) {
0146                 // the name already exists, ask the user whether he's sure to keep the name
0147                 if (KMessageBox::questionTwoActions(this,
0148                                                     i18n("A payee with the name '%1' already exists. It is not advisable to have "
0149                                                          "multiple payees with the same identification name. Are you sure you would like "
0150                                                          "to rename the payee?",
0151                                                          new_name),
0152                                                     i18nc("@title:window", "Duplicate payee name"),
0153                                                     KMMYesNo::yes(),
0154                                                     KMMYesNo::no())
0155                     != KMessageBox::PrimaryAction) {
0156                     // p->setText(d->m_payee.name());
0157                     return;
0158                 }
0159             }
0160 
0161             d->m_payee.setName(new_name);
0162             d->m_newName = new_name;
0163             MyMoneyFile::instance()->modifyPayee(d->m_payee);
0164 
0165             // the above call to modifyPayee will reload the view so
0166             // all references and pointers to the view have to be
0167             // re-established.
0168 
0169             ft.commit();
0170 
0171             // make sure, that the record is visible even if it moved
0172             // out of sight due to the rename operation
0173             d->ensurePayeeVisible(d->m_payee.id());
0174 
0175         } catch (const MyMoneyException &e) {
0176             KMessageBox::detailedError(this, i18n("Unable to modify payee"), QString::fromLatin1(e.what()));
0177         }
0178     }
0179 }
0180 
0181 void KPayeesView::updateActions(const SelectedObjects& selections)
0182 {
0183     Q_D(KPayeesView);
0184     const auto selectedItemCount = selections.selection(SelectedObjects::Payee).count();
0185 
0186     d->ui->m_syncAddressbook->setEnabled(true);
0187     d->ui->m_tabWidget->setEnabled(false); // disable tab widget
0188 
0189     pActions[eMenu::Action::RenamePayee]->setEnabled(false);
0190     pActions[eMenu::Action::DeletePayee]->setEnabled(false);
0191     pActions[eMenu::Action::MergePayee]->setEnabled(false);
0192 
0193     switch (selectedItemCount) {
0194     case 0: // no selection
0195         d->ui->m_balanceLabel->hide();
0196         if (isVisible()) {
0197             d->clearItemData();
0198         }
0199         d->ui->m_syncAddressbook->setEnabled(false);
0200         break;
0201 
0202     case 1: // single selection
0203         pActions[eMenu::Action::RenamePayee]->setEnabled(true);
0204         pActions[eMenu::Action::DeletePayee]->setEnabled(true);
0205         d->ui->m_tabWidget->setEnabled(true); // enable tab widget
0206         break;
0207 
0208     default:  // if we have multiple payees selected, clear and disable the payee information
0209         pActions[eMenu::Action::DeletePayee]->setEnabled(true);
0210         pActions[eMenu::Action::MergePayee]->setEnabled(true);
0211         d->ui->m_balanceLabel->hide();
0212         if (isVisible()) {
0213             d->clearItemData();
0214         }
0215         break;
0216     }
0217 }
0218 
0219 void KPayeesView::aboutToShow()
0220 {
0221     Q_D(KPayeesView);
0222     d->loadDetails();
0223     d->showTransactions();
0224 
0225     // don't forget base class logic
0226     KMyMoneyViewBase::aboutToShow();
0227 }
0228 
0229 void KPayeesView::aboutToHide()
0230 {
0231     Q_D(KPayeesView);
0232 
0233     d->finalizePendingChanges();
0234 
0235     KMyMoneyViewBase::aboutToHide();
0236 }
0237 
0238 void KPayeesView::slotPayeeSelectionChanged(const QItemSelection& selected, const QItemSelection& deselected)
0239 {
0240     Q_UNUSED(selected)
0241     Q_UNUSED(deselected)
0242     Q_D(KPayeesView);
0243 
0244     d->finalizePendingChanges();
0245     d->selectPayee();
0246 }
0247 
0248 void KPayeesView::slotKeyListChanged()
0249 {
0250     Q_D(KPayeesView);
0251     bool rc = false;
0252     bool ignorecase = false;
0253     QStringList keys;
0254 
0255     d->m_payee.matchData(ignorecase, keys);
0256     if (static_cast<eMyMoney::Payee::MatchType>(d->ui->matchTypeCombo->currentData().toUInt()) == eMyMoney::Payee::MatchType::Key) {
0257         rc |= (keys != d->ui->matchKeyEditList->items());
0258     }
0259     d->setDirty(rc);
0260 }
0261 
0262 void KPayeesView::slotModelDataChanged(const QModelIndex& topLeft, const QModelIndex& bottomRight)
0263 {
0264     Q_D(KPayeesView);
0265     QModelIndex idx;
0266     if (topLeft.model() == d->m_renameProxyModel) {
0267         const auto baseModel = MyMoneyFile::instance()->payeesModel();
0268         for (int row = topLeft.row(); row <= bottomRight.row(); ++row) {
0269             idx = topLeft.model()->index(row, 0, topLeft.parent());
0270             if (d->m_payee.id() == idx.data(eMyMoney::Model::IdRole).toString()) {
0271                 d->m_payee = baseModel->itemById(d->m_payee.id());
0272                 d->loadDetails();
0273             }
0274         }
0275     }
0276 }
0277 
0278 
0279 void KPayeesView::slotPayeeDataChanged()
0280 {
0281     Q_D(KPayeesView);
0282     bool rc = false;
0283 
0284     if (d->ui->m_tabWidget->isEnabled()) {
0285         rc |= ((d->m_payee.email().isEmpty() != d->ui->emailEdit->text().isEmpty())
0286                || (!d->ui->emailEdit->text().isEmpty() && d->m_payee.email() != d->ui->emailEdit->text()));
0287         rc |= ((d->m_payee.address().isEmpty() != d->ui->addressEdit->toPlainText().isEmpty())
0288                || (!d->ui->addressEdit->toPlainText().isEmpty() && d->m_payee.address() != d->ui->addressEdit->toPlainText()));
0289         rc |= ((d->m_payee.city().isEmpty() != d->ui->payeecityEdit->text().isEmpty())
0290                || (!d->ui->payeecityEdit->text().isEmpty() && d->m_payee.city() != d->ui->payeecityEdit->text()));
0291         rc |= ((d->m_payee.state().isEmpty() != d->ui->payeestateEdit->text().isEmpty())
0292                || (!d->ui->payeestateEdit->text().isEmpty() && d->m_payee.state() != d->ui->payeestateEdit->text()));
0293         rc |= ((d->m_payee.postcode().isEmpty() != d->ui->postcodeEdit->text().isEmpty())
0294                || (!d->ui->postcodeEdit->text().isEmpty() && d->m_payee.postcode() != d->ui->postcodeEdit->text()));
0295         rc |= ((d->m_payee.telephone().isEmpty() != d->ui->telephoneEdit->text().isEmpty())
0296                || (!d->ui->telephoneEdit->text().isEmpty() && d->m_payee.telephone() != d->ui->telephoneEdit->text()));
0297         rc |= ((d->m_payee.name().isEmpty() != d->m_newName.isEmpty())
0298                || (!d->m_newName.isEmpty() && d->m_payee.name() != d->m_newName));
0299         rc |= ((d->m_payee.notes().isEmpty() != d->ui->notesEdit->toPlainText().isEmpty())
0300                || (!d->ui->notesEdit->toPlainText().isEmpty() && d->m_payee.notes() != d->ui->notesEdit->toPlainText()));
0301 
0302         bool ignorecase = false;
0303         QStringList keys;
0304 
0305         const auto selectedMatchType = static_cast<eMyMoney::Payee::MatchType>(d->ui->matchTypeCombo->currentData().toUInt());
0306         const auto storedMatchType = d->m_payee.matchData(ignorecase, keys);
0307         rc |= (storedMatchType != selectedMatchType);
0308 
0309         d->ui->checkMatchIgnoreCase->setEnabled(false);
0310         d->ui->matchKeyEditList->setEnabled(false);
0311 
0312         if (selectedMatchType != eMyMoney::Payee::MatchType::Disabled) {
0313             d->ui->checkMatchIgnoreCase->setEnabled(true);
0314             // if we turn matching on, we default to 'ignore case'
0315             // TODO maybe make the default a user option
0316             if (storedMatchType == eMyMoney::Payee::MatchType::Disabled && (selectedMatchType != eMyMoney::Payee::MatchType::Disabled))
0317                 d->ui->checkMatchIgnoreCase->setChecked(true);
0318             rc |= (ignorecase != d->ui->checkMatchIgnoreCase->isChecked());
0319             if (selectedMatchType == eMyMoney::Payee::MatchType::Key) {
0320                 d->ui->matchKeyEditList->setEnabled(true);
0321                 rc |= (keys != d->ui->matchKeyEditList->items());
0322             }
0323         }
0324 
0325         rc |= (d->ui->checkEnableDefaultCategory->isChecked() != !d->m_payee.defaultAccountId().isEmpty());
0326         if (d->ui->checkEnableDefaultCategory->isChecked()) {
0327             d->ui->comboDefaultCategory->setEnabled(true);
0328             d->ui->labelDefaultCategory->setEnabled(true);
0329             // this is only going to understand the first in the list of selected accounts
0330             if (d->ui->comboDefaultCategory->getSelected().isEmpty()) {
0331                 rc |= !d->m_payee.defaultAccountId().isEmpty();
0332             } else {
0333                 QString temp = d->ui->comboDefaultCategory->getSelected();
0334                 rc |= (temp.isEmpty() != d->m_payee.defaultAccountId().isEmpty())
0335                       || (!d->m_payee.defaultAccountId().isEmpty() && temp != d->m_payee.defaultAccountId());
0336             }
0337         } else {
0338             d->ui->comboDefaultCategory->setEnabled(false);
0339             d->ui->labelDefaultCategory->setEnabled(false);
0340         }
0341 
0342         rc |= (d->m_payee.payeeIdentifiers() != d->ui->payeeIdentifiers->identifiers());
0343     }
0344     d->setDirty(rc);
0345 }
0346 
0347 void KPayeesView::slotUpdatePayee()
0348 {
0349     Q_D(KPayeesView);
0350     if (d->isDirty()) {
0351         MyMoneyFileTransaction ft;
0352         d->setDirty(false);
0353         try {
0354             d->m_payee.setName(d->m_newName);
0355             d->m_payee.setAddress(d->ui->addressEdit->toPlainText());
0356             d->m_payee.setCity(d->ui->payeecityEdit->text());
0357             d->m_payee.setState(d->ui->payeestateEdit->text());
0358             d->m_payee.setPostcode(d->ui->postcodeEdit->text());
0359             d->m_payee.setTelephone(d->ui->telephoneEdit->text());
0360             d->m_payee.setEmail(d->ui->emailEdit->text());
0361             d->m_payee.setNotes(d->ui->notesEdit->toPlainText());
0362             d->m_payee.setMatchData(static_cast<eMyMoney::Payee::MatchType>(d->ui->matchTypeCombo->currentData().toUInt()), d->ui->checkMatchIgnoreCase->isChecked(), d->ui->matchKeyEditList->items());
0363             d->m_payee.setDefaultAccountId();
0364             d->m_payee.resetPayeeIdentifiers(d->ui->payeeIdentifiers->identifiers());
0365 
0366             if (d->ui->checkEnableDefaultCategory->isChecked()) {
0367                 QString temp;
0368                 if (!d->ui->comboDefaultCategory->getSelected().isEmpty()) {
0369                     temp = d->ui->comboDefaultCategory->getSelected();
0370                     d->m_payee.setDefaultAccountId(temp);
0371                 }
0372             }
0373 
0374             MyMoneyFile::instance()->modifyPayee(d->m_payee);
0375             ft.commit();
0376 
0377         } catch (const MyMoneyException &e) {
0378             KMessageBox::detailedError(this, i18n("Unable to modify payee"), QString::fromLatin1(e.what()));
0379         }
0380     }
0381 }
0382 
0383 void KPayeesView::slotSyncAddressBook()
0384 {
0385     Q_D(KPayeesView);
0386     if (d->m_payeesToSync.isEmpty()) {                            // empty list means no syncing is pending...
0387         d->m_payeesToSync = d->selectedPayees();                    // ...so initialize one
0388         d->m_syncedPayees = 0;
0389         d->ui->m_syncAddressbook->setEnabled(false);                // disallow concurrent syncs
0390     }
0391 
0392     if (d->m_payeesToSync.count() <= d->m_syncedPayees) {
0393         if (!d->m_payeesToSync.isEmpty()) {
0394             MyMoneyFileTransaction ft;
0395             try {
0396                 for (const auto& payee : d->m_payeesToSync) {
0397                     MyMoneyFile::instance()->modifyPayee(payee);
0398                 }
0399                 ft.commit();
0400             } catch (const MyMoneyException &e) {
0401                 KMessageBox::detailedError(this, i18n("Unable to modify payee"), QString::fromLatin1(e.what()));
0402             }
0403         }
0404         d->m_payeesToSync.clear();  // that means end of sync
0405         d->m_syncedPayees = 0;
0406         d->ui->m_syncAddressbook->setEnabled(true);
0407         return;
0408     }
0409 
0410     // search for payee's data in addressbook and receive it in slotContactFetched
0411     d->m_contact->fetchContact(d->m_payeesToSync[d->m_syncedPayees].email());
0412 }
0413 
0414 void KPayeesView::slotContactFetched(const ContactData &identity)
0415 {
0416     Q_D(KPayeesView);
0417     MyMoneyPayee& payee = d->m_payeesToSync[d->m_syncedPayees];
0418 
0419     if (!identity.email.isEmpty()) {  // empty e-mail means no identity fetched
0420         QString txt;
0421         if (!identity.street.isEmpty())
0422             txt.append(identity.street + '\n');
0423         if (!identity.locality.isEmpty()) {
0424             txt.append(identity.locality);
0425             if (!identity.postalCode.isEmpty())
0426                 txt.append(' ' + identity.postalCode + '\n');
0427             else
0428                 txt.append('\n');
0429         }
0430         if (!identity.country.isEmpty())
0431             txt.append(identity.country + '\n');
0432 
0433         if (!txt.isEmpty() && d->m_payee.address().compare(txt) != 0)
0434             d->m_payee.setAddress(txt);
0435 
0436         if (!identity.city.isEmpty() && d->m_payee.city().compare(identity.city) != 0)
0437             d->m_payee.setCity(identity.city);
0438 
0439         if (!identity.state.isEmpty() && d->m_payee.state().compare(identity.state) != 0)
0440             d->m_payee.setState(identity.state);
0441 
0442         if (!identity.postalCode.isEmpty() && d->m_payee.postcode().compare(identity.postalCode) != 0)
0443             d->m_payee.setPostcode(identity.postalCode);
0444 
0445         if (!identity.postalCode.isEmpty() && payee.postcode().compare(identity.postalCode) != 0)
0446             payee.setPostcode(identity.postalCode);
0447 
0448         if (!identity.phoneNumber.isEmpty() && payee.telephone().compare(identity.phoneNumber) != 0)
0449             payee.setTelephone(identity.phoneNumber);
0450     }
0451 
0452     ++d->m_syncedPayees;
0453     slotSyncAddressBook();  // process next payee
0454 }
0455 
0456 void KPayeesView::slotSendMail()
0457 {
0458     Q_D(KPayeesView);
0459     QRegularExpression re(".+@.+");
0460     if (re.match(d->m_payee.email()).hasMatch())
0461         QDesktopServices::openUrl(QUrl(QStringLiteral("mailto:?to=") + d->m_payee.email(), QUrl::TolerantMode));
0462 }
0463 
0464 void KPayeesView::executeAction(eMenu::Action action, const SelectedObjects& selections)
0465 {
0466     const auto payeeId(selections.firstSelection(SelectedObjects::Payee));
0467     const auto accountId(selections.firstSelection(SelectedObjects::Account));
0468     const auto journalEntryId(selections.firstSelection(SelectedObjects::JournalEntry));
0469 
0470     Q_D(KPayeesView);
0471     const auto idx = d->ui->m_register->currentIndex();
0472     switch (action) {
0473     case eMenu::Action::GoToPayee:
0474         if (d->isActiveView()) {
0475             d->selectPayeeAndTransaction(payeeId, accountId, journalEntryId);
0476         }
0477         break;
0478     case eMenu::Action::EditTransaction:
0479         if (d->isActiveView()) {
0480             d->ui->m_register->edit(d->ui->m_register->currentIndex());
0481         }
0482         break;
0483     case eMenu::Action::EditSplits:
0484         if (d->isActiveView()) {
0485             d->ui->m_register->edit(idx);
0486             const auto editor = d->ui->m_register->indexWidget(d->ui->m_register->editIndex());
0487             if (editor) {
0488                 QMetaObject::invokeMethod(editor, "editSplits", Qt::QueuedConnection);
0489             }
0490         }
0491         break;
0492 
0493     case eMenu::Action::SelectAllTransactions:
0494         if (d->isActiveView()) {
0495             d->ui->m_register->selectAllTransactions();
0496         }
0497         break;
0498 
0499     case eMenu::Action::FileClose:
0500         d->ui->payeeIdentifiers->closeSource();
0501         break;
0502 
0503     case eMenu::Action::ShowTransaction:
0504         d->ui->m_register->showEditor();
0505         break;
0506 
0507     default:
0508         break;
0509     }
0510 }
0511 
0512 void KPayeesView::slotSettingsChanged()
0513 {
0514     Q_D(KPayeesView);
0515     if (d->ui->m_register) {
0516         d->ui->m_register->slotSettingsChanged();
0517     }
0518 }
0519 
0520 void KPayeesView::slotHelp()
0521 {
0522     KHelpClient::invokeHelp("details.payees");
0523 }
0524 
0525 void KPayeesView::slotNewPayee()
0526 {
0527     Q_D(KPayeesView);
0528     bool ok;
0529     QString id;
0530     std::tie(ok, id) = KMyMoneyUtils::newPayee(i18n("New Payee"));
0531     d->selectPayeeAndTransaction(id);
0532 }
0533 
0534 void KPayeesView::slotRenamePayee()
0535 {
0536     Q_D(KPayeesView);
0537     if (d->ui->m_payees->currentIndex().isValid() && d->ui->m_payees->selectionModel()->selectedIndexes().count() == 1) {
0538         d->ui->m_payees->edit(d->ui->m_payees->currentIndex());
0539     }
0540 }
0541 
0542 void KPayeesView::slotDeletePayee()
0543 {
0544     Q_D(KPayeesView);
0545     const auto payeesList = d->selectedPayees();
0546 
0547     if (payeesList.isEmpty())
0548         return; // shouldn't happen
0549 
0550     // get confirmation from user
0551     QString prompt;
0552     if (payeesList.count() == 1)
0553         prompt = i18n("<p>Do you really want to remove the payee <b>%1</b>?</p>", payeesList.front().name());
0554     else
0555         prompt = i18n("Do you really want to remove all selected payees?");
0556 
0557     if (KMessageBox::questionTwoActions(this, prompt, i18n("Remove Payee"), KMMYesNo::yes(), KMMYesNo::no()) == KMessageBox::SecondaryAction)
0558         return;
0559 
0560     d->payeeReassign(KPayeeReassignDlg::TypeDelete);
0561 }
0562 
0563 void KPayeesView::slotMergePayee()
0564 {
0565     Q_D(KPayeesView);
0566     const auto payeesList = d->selectedPayees();
0567     if (payeesList.count() < 1)
0568         return; // shouldn't happen
0569 
0570     if (KMessageBox::questionTwoActions(this,
0571                                         i18n("<p>Do you really want to merge the selected payees?"),
0572                                         i18n("Merge Payees"),
0573                                         KMMYesNo::yes(),
0574                                         KMMYesNo::no())
0575         == KMessageBox::SecondaryAction)
0576         return;
0577 
0578     if (d->payeeReassign(KPayeeReassignDlg::TypeMerge))
0579         /// @todo maybe select the one that is remaining and call
0580         ///       d->ensurePayeeVisible
0581         // clean selection since we just deleted the selected payees
0582         d->ui->m_payees->selectionModel()->clear();
0583 }