diff --git a/plugins/skrooge/skrooge_budget/skgbudgetpluginwidget.cpp b/plugins/skrooge/skrooge_budget/skgbudgetpluginwidget.cpp
index 7586d5824..2074268ec 100644
--- a/plugins/skrooge/skrooge_budget/skgbudgetpluginwidget.cpp
+++ b/plugins/skrooge/skrooge_budget/skgbudgetpluginwidget.cpp
@@ -1,834 +1,834 @@
/***************************************************************************
* Copyright (C) 2008 by S. MANKOWSKI / G. DE BURE support@mankowski.fr *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program. If not, see *
***************************************************************************/
/** @file
* A skrooge plugin to manage budgets.
*
* @author Stephane MANKOWSKI
*/
#include "skgbudgetpluginwidget.h"
#include
#include
#include "skgbudgetdelegate.h"
#include "skgbudgetobject.h"
#include "skgbudgetruleobject.h"
#include "skgcategoryobject.h"
#include "skgdocument.h"
#include "skgmainpanel.h"
#include "skgobjectmodel.h"
#include "skgtraces.h"
#include "skgtransactionmng.h"
SKGBudgetPluginWidget::SKGBudgetPluginWidget(QWidget* iParent, SKGDocument* iDocument)
: SKGTabPage(iParent, iDocument), m_objectModel(nullptr)
{
SKGTRACEINFUNC(1)
if (iDocument == nullptr) {
return;
}
ui.setupUi(this);
ui.kUseScheduledOperation->hide();
ui.kTopBtn->setIcon(SKGServices::fromTheme(QStringLiteral("arrow-up-double")));
ui.kUpBtn->setIcon(SKGServices::fromTheme(QStringLiteral("arrow-up")));
ui.kDownBtn->setIcon(SKGServices::fromTheme(QStringLiteral("arrow-down")));
ui.kBottomBtn->setIcon(SKGServices::fromTheme(QStringLiteral("arrow-down-double")));
ui.kPeriodLbl->setText(i18n("%1:", iDocument->getDisplay(QStringLiteral("t_period"))));
ui.kYearLbl->setText(i18n("%1:", iDocument->getDisplay(QStringLiteral("i_year"))));
ui.kMonthLbl->setText(i18n("%1:", iDocument->getDisplay(QStringLiteral("i_month"))));
ui.kAmountLabel->setText(i18n("%1:", iDocument->getDisplay(QStringLiteral("f_value"))));
ui.kCategoryLabel->setText(i18n("%1:", iDocument->getDisplay(QStringLiteral("t_category"))));
ui.kYearCheck->setText(i18n("%1:", iDocument->getDisplay(QStringLiteral("i_year"))));
ui.kMonthCheck->setText(i18n("%1:", iDocument->getDisplay(QStringLiteral("i_month"))));
ui.kCategoryCheck->setText(i18n("%1:", iDocument->getDisplay(QStringLiteral("t_category"))));
ui.kPeriodLbl2->setText(i18n("%1:", iDocument->getDisplay(QStringLiteral("t_period"))));
ui.kAmountLabel2->setText(i18n("%1:", iDocument->getDisplay(QStringLiteral("f_value"))));
ui.kCategoryTransferCheck->setText(i18n("%1:", iDocument->getDisplay(QStringLiteral("t_category"))));
ui.kYear->setValue(QDate::currentDate().year());
ui.kYearAutoBase->setValue(QDate::currentDate().year());
ui.kMonth->setValue(QDate::currentDate().month());
ui.kPeriod->addItem(i18nc("Noun, how to define a budget period", "Monthly"));
ui.kPeriod->addItem(i18nc("Noun, how to define a budget period", "Yearly"));
ui.kPeriod->addItem(i18nc("Noun, how to define a budget period", "Individual"));
ui.kView->getShowWidget()->addItem(QStringLiteral("all"), i18nc("Noun, budget items to display", "All"), QLatin1String(""),
QLatin1String(""),
QStringLiteral("current;currentYear;currentMonth;previousYear;previousMonth"),
QStringLiteral("none"), QLatin1String(""), QLatin1String(""),
Qt::META + Qt::Key_A);
ui.kView->getShowWidget()->addItem(QStringLiteral("none"), i18nc("Noun, budget items to display", "None"), QLatin1String(""),
QStringLiteral("1=0"),
QLatin1String(""), // Check when checked
QStringLiteral("all;current;currentYear;currentMonth;previousYear;previousMonth"), // Uncheck when checked
QLatin1String(""), // Check when unchecked
QStringLiteral("all"), // Uncheck when unchecked
Qt::META + Qt::Key_0);
ui.kView->getShowWidget()->addSeparator();
ui.kView->getShowWidget()->addItem(QStringLiteral("current"), i18nc("Noun, budget items to display", "Current"), QStringLiteral("view-calendar-whatsnext"),
QStringLiteral("t_PERIOD>=STRFTIME('%Y-%m', date('now')) OR t_PERIOD=STRFTIME('%Y', date('now'))"),
QStringLiteral("currentMonth"), // Check when checked
QStringLiteral("none"), // Uncheck when checked
QLatin1String(""), // Check when unchecked
QStringLiteral("all"), // Uncheck when unchecked
Qt::META + Qt::Key_1);
ui.kView->getShowWidget()->addSeparator();
ui.kView->getShowWidget()->addItem(QStringLiteral("currentYear"), i18nc("Noun, budget items to display", "Current year"), QStringLiteral("view-calendar-month"),
QStringLiteral("t_PERIOD LIKE STRFTIME('%Y', date('now'))||'%'"),
QLatin1String(""),
QStringLiteral("none"),
QLatin1String(""),
QStringLiteral("all"),
Qt::META + Qt::Key_3);
ui.kView->getShowWidget()->addItem(QStringLiteral("currentMonth"), i18nc("Noun, budget items to display", "Current month"), QStringLiteral("view-calendar-week"),
QStringLiteral("t_PERIOD=STRFTIME('%Y-%m', date('now'))"),
QLatin1String(""),
QStringLiteral("none"),
QLatin1String(""),
QStringLiteral("all;current"),
Qt::META + Qt::Key_2);
ui.kView->getShowWidget()->addSeparator();
ui.kView->getShowWidget()->addItem(QStringLiteral("previousYear"), i18nc("Noun, budget items to display", "Previous year"), QStringLiteral("view-calendar-month"),
QStringLiteral("t_PERIOD LIKE STRFTIME('%Y', date('now','start of year','-1 day'))||'%'"),
QLatin1String(""),
QStringLiteral("none"),
QLatin1String(""),
QStringLiteral("all"),
Qt::META + Qt::Key_5);
ui.kView->getShowWidget()->addItem(QStringLiteral("previousMonth"), i18nc("Noun, budget items to display", "Previous month"), QStringLiteral("view-calendar-week"),
QStringLiteral("t_PERIOD=STRFTIME('%Y-%m', date('now','start of month','-1 day'))"),
QLatin1String(""),
QStringLiteral("none"),
QLatin1String(""),
QStringLiteral("all"),
Qt::META + Qt::Key_4);
ui.kView->getShowWidget()->setDefaultState(QStringLiteral("current;currentMonth"));
m_timer.setSingleShot(true);
connect(&m_timer, &QTimer::timeout, this, &SKGBudgetPluginWidget::refreshInfoZone, Qt::QueuedConnection);
ui.kConditionCmb->addItem(i18nc("Noun, condition item to a apply a transfer of budget", "All"), static_cast(SKGBudgetRuleObject::ALL));
ui.kConditionCmb->addItem(i18nc("Noun, condition item to a apply a transfer of budget", "Negative"), static_cast(SKGBudgetRuleObject::NEGATIVE));
ui.kConditionCmb->addItem(i18nc("Noun, condition item to a apply a transfer of budget", "Positive"), static_cast(SKGBudgetRuleObject::POSITIVE));
ui.kModeCmb->addItem(i18nc("Noun, mode item to a apply a transfer of budget", "Next"), static_cast(SKGBudgetRuleObject::NEXT));
ui.kModeCmb->addItem(i18nc("Noun, mode item to a apply a transfer of budget", "Current"), static_cast(SKGBudgetRuleObject::CURRENT));
ui.kModeCmb->addItem(i18nc("Noun, mode item to a apply a transfer of budget", "Current year"), static_cast(SKGBudgetRuleObject::YEAR));
ui.kView->getView()->setItemDelegate(new SKGBudgetDelegate(ui.kView->getView(), getDocument()));
auto* doc = qobject_cast(getDocument());
if (doc != nullptr) {
ui.kUnitCmb->addItem(QStringLiteral("%"));
ui.kUnitCmb->addItem(doc->getPrimaryUnit().Symbol);
ui.kUnit->setText(doc->getPrimaryUnit().Symbol);
// Bind operation view
m_objectModel = new SKGObjectModel(doc, QStringLiteral("v_budget_display"), QStringLiteral("1=0"), this, QLatin1String(""), false);
ui.kView->setModel(m_objectModel);
ui.kSortButton->setVisible(false);
}
connect(ui.kView->getView(), &SKGTreeView::doubleClicked, SKGMainPanel::getMainPanel()->getGlobalAction(QStringLiteral("open")).data(), &QAction::trigger);
connect(ui.kView->getView(), &SKGTreeView::selectionChangedDelayed, this, [ = ] {this->onSelectionChanged();});
// Add Standard KDE Icons to buttons to Operations
ui.kModifyBtn->setIcon(SKGServices::fromTheme(QStringLiteral("dialog-ok")));
ui.kAddBtn->setIcon(SKGServices::fromTheme(QStringLiteral("list-add")));
QAction* processAction = SKGMainPanel::getMainPanel()->getGlobalAction(QStringLiteral("tool_process_budget_rules"));
if (processAction != nullptr) {
ui.kProcessBtn->setIcon(processAction->icon());
connect(ui.kProcessBtn, &QPushButton::clicked, processAction, &QAction::trigger);
}
{
SKGWidgetSelector::SKGListQWidget list;
list.push_back(ui.SKGManualSection);
list.push_back(ui.SKGEditionButtonsSection);
ui.kWidgetSelector->addButton(SKGServices::fromTheme(QStringLiteral("user-properties")), i18n("Manual"), i18n("Display the edit panel for standard budget"), list);
}
{
SKGWidgetSelector::SKGListQWidget list;
list.push_back(ui.SKGAutoSection);
list.push_back(ui.SKGEditionButtonsSection);
ui.kWidgetSelector->addButton(SKGServices::fromTheme(QStringLiteral("games-solve")), i18n("Auto"), i18n("Display the edit panel for automatic budgets"), list);
}
{
SKGWidgetSelector::SKGListQWidget list;
list.push_back(ui.SKGRuleSection);
list.push_back(ui.SKGEditionButtonsSection);
ui.kWidgetSelector->addButton(SKGServices::fromTheme(QStringLiteral("run-build")), i18n("Rules"), i18n("Display the edit panel for rules"), list);
}
connect(ui.kWidgetSelector, &SKGWidgetSelector::selectedModeChanged, this, &SKGBudgetPluginWidget::onBtnModeClicked, Qt::QueuedConnection);
connect(ui.kAddBtn, &QPushButton::clicked, this, &SKGBudgetPluginWidget::onAddClicked);
connect(ui.kModifyBtn, &QPushButton::clicked, this, &SKGBudgetPluginWidget::onUpdateClicked);
connect(ui.kAmountEdit, &SKGCalculatorEdit::textChanged, this, &SKGBudgetPluginWidget::onCreatorModified);
connect(ui.kPeriod, static_cast(&SKGComboBox::currentTextChanged), this, &SKGBudgetPluginWidget::onCreatorModified);
connect(ui.kYearCheck, &QCheckBox::toggled, ui.kYearRule, &QSpinBox::setEnabled);
connect(ui.kMonthCheck, &QCheckBox::toggled, ui.kMonthRule, &QSpinBox::setEnabled);
connect(ui.kCategoryCheck, &QCheckBox::toggled, ui.kCategoryRule, &SKGComboBox::setEnabled);
connect(ui.kCategoryTransferCheck, &QCheckBox::toggled, ui.kCategoryTransfer, &SKGComboBox::setEnabled);
connect(ui.kModeCmb, static_cast(&SKGComboBox::currentIndexChanged), this, &SKGBudgetPluginWidget::onCreatorModified);
connect(ui.kAutoBudgetCheck, &QCheckBox::toggled, ui.kYearAutoBase, &QSpinBox::setEnabled);
connect(ui.kAutoBudgetCheck, &QCheckBox::toggled, ui.kRemovePrevious, &QCheckBox::setEnabled);
connect(ui.kAutoBudgetCheck, &QCheckBox::toggled, ui.kUseScheduledOperation, &QCheckBox::setEnabled);
connect(ui.kTopBtn, &QToolButton::clicked, this, &SKGBudgetPluginWidget::onTop);
connect(ui.kUpBtn, &QToolButton::clicked, this, &SKGBudgetPluginWidget::onUp);
connect(ui.kDownBtn, &QToolButton::clicked, this, &SKGBudgetPluginWidget::onDown);
connect(ui.kBottomBtn, &QToolButton::clicked, this, &SKGBudgetPluginWidget::onBottom);
- connect(ui.kYearAuto, static_cast(&QSpinBox::valueChanged), this, [ = ](const QString & text) {
+ connect(ui.kYearAuto, &QSpinBox::textChanged, this, [ = ](const QString & text) {
ui.kRemovePrevious->setText(i18nc("Option", "Remove existing budgets for %1", text));
});
ui.kYearAuto->setValue(QDate::currentDate().year());
ui.kWidgetSelector->setSelectedMode(0);
// Set Event filters to catch CTRL+ENTER or SHIFT+ENTER
this->installEventFilter(this);
// Refresh
connect(getDocument(), &SKGDocument::tableModified, this, &SKGBudgetPluginWidget::dataModified, Qt::QueuedConnection);
dataModified(QLatin1String(""), 0);
}
SKGBudgetPluginWidget::~SKGBudgetPluginWidget()
{
SKGTRACEINFUNC(1)
m_objectModel = nullptr;
}
bool SKGBudgetPluginWidget::eventFilter(QObject* iObject, QEvent* iEvent)
{
if ((iEvent != nullptr) && iEvent->type() == QEvent::KeyPress) {
auto* keyEvent = dynamic_cast(iEvent);
if (keyEvent && (keyEvent->key() == Qt::Key_Return || keyEvent->key() == Qt::Key_Enter) && iObject == this) {
if ((QApplication::keyboardModifiers() & Qt::ControlModifier) != 0u && ui.kAddBtn->isEnabled()) {
ui.kAddBtn->click();
} else if ((QApplication::keyboardModifiers() &Qt::ShiftModifier) != 0u && ui.kModifyBtn->isEnabled()) {
ui.kModifyBtn->click();
}
}
}
return SKGTabPage::eventFilter(iObject, iEvent);
}
QString SKGBudgetPluginWidget::getState()
{
SKGTRACEINFUNC(10)
QDomDocument doc(QStringLiteral("SKGML"));
QDomElement root = doc.createElement(QStringLiteral("parameters"));
doc.appendChild(root);
root.setAttribute(QStringLiteral("currentPage"), SKGServices::intToString(ui.kWidgetSelector->getSelectedMode()));
if ((m_objectModel != nullptr) && m_objectModel->getRealTable() == QStringLiteral("budget")) {
root.setAttribute(QStringLiteral("view"), ui.kView->getState());
root.setAttribute(QStringLiteral("viewRule"), m_viewRule);
} else {
root.setAttribute(QStringLiteral("view"), m_viewBudget);
root.setAttribute(QStringLiteral("viewRule"), ui.kView->getState());
}
return doc.toString();
}
void SKGBudgetPluginWidget::setState(const QString& iState)
{
SKGTRACEINFUNC(10)
QDomDocument doc(QStringLiteral("SKGML"));
doc.setContent(iState);
QDomElement root = doc.documentElement();
QString currentPage = root.attribute(QStringLiteral("currentPage"));
if (currentPage.isEmpty()) {
currentPage = '0';
}
ui.kWidgetSelector->setSelectedMode(SKGServices::stringToInt(currentPage));
m_viewBudget = root.attribute(QStringLiteral("view"));
m_viewRule = root.attribute(QStringLiteral("viewRule"));
if ((m_objectModel != nullptr) && m_objectModel->getRealTable() == QStringLiteral("budget")) {
ui.kView->setState(m_viewBudget);
} else {
ui.kView->setState(m_viewRule);
}
}
QString SKGBudgetPluginWidget::getDefaultStateAttribute()
{
return QStringLiteral("SKGBUDGET_DEFAULT_PARAMETERS");
}
QWidget* SKGBudgetPluginWidget::mainWidget()
{
return ui.kView->getView();
}
void SKGBudgetPluginWidget::refresh()
{
SKGTRACEINFUNC(1)
QSqlDatabase* db = getDocument()->getMainDatabase();
setEnabled(db != nullptr);
if (db != nullptr) {
// Refresh yours widgets here
}
}
void SKGBudgetPluginWidget::dataModified(const QString& iTableName, int iIdTransaction, bool iLightTransaction)
{
SKGTRACEINFUNC(10)
Q_UNUSED(iIdTransaction)
// Refresh widgets
if (iTableName == QStringLiteral("budget") || iTableName.isEmpty()) {
// Refresh info area
m_timer.start(300);
}
if (!iLightTransaction) {
if (iTableName == QStringLiteral("category") || iTableName.isEmpty()) {
// Set type category
SKGMainPanel::fillWithDistinctValue(QList() << ui.kCategoryEdit << ui.kCategoryRule << ui.kCategoryTransfer, getDocument(), QStringLiteral("category"), QStringLiteral("t_fullname"), QLatin1String(""));
}
}
}
void SKGBudgetPluginWidget::onBtnModeClicked(int mode)
{
SKGTRACEINFUNC(10)
if (m_objectModel == nullptr) {
return;
}
if (mode == 2 && m_objectModel->getTable() != QStringLiteral("v_budgetrule_display")) {
ui.kView->getShowWidget()->setEnabled(false);
m_viewBudget = ui.kView->getState();
m_objectModel->setFilter(QLatin1String(""));
m_objectModel->setTable(QStringLiteral("v_budgetrule_display"));
ui.kSortButton->setVisible(true);
ui.kView->setState(m_viewRule);
} else if (mode != 2 && m_objectModel->getTable() != QStringLiteral("v_budget_display")) {
ui.kView->getShowWidget()->setEnabled(true);
m_viewRule = ui.kView->getState();
m_objectModel->setTable(QStringLiteral("v_budget_display"));
ui.kSortButton->setVisible(false);
ui.kView->setState(m_viewBudget);
}
onCreatorModified();
}
void SKGBudgetPluginWidget::onAddClicked()
{
SKGError err;
_SKGTRACEINFUNCRC(10, err)
if (ui.kWidgetSelector->getSelectedMode() == 2) {
// Creation of a rule
QStringList uniqueIDs;
{
SKGBEGINTRANSACTION(*getDocument(), i18nc("Noun, name of the user action", "Budget rule creation"), err)
SKGBudgetRuleObject budgetRule(getDocument());
IFOKDO(err, updateBudgetRule(budgetRule))
IFOKDO(err, budgetRule.setOrder(-1))
IFOKDO(err, budgetRule.save())
uniqueIDs.push_back(budgetRule.getUniqueID());
// Send message
IFOKDO(err, budgetRule.getDocument()->sendMessage(i18nc("An information to the user", "The budget rule '%1' has been added", budgetRule.getDisplayName()), SKGDocument::Hidden))
}
// status bar
IFOK(err) {
err = SKGError(0, i18nc("Successful message after an user action", "Budget rule created"));
ui.kView->getView()->selectObjects(uniqueIDs);
} else {
err.addError(ERR_FAIL, i18nc("Error message", "Budget rule creation failed"));
}
} else {
// Creation of a budget
QStringList uniqueIDs;
{
SKGBEGINPROGRESSTRANSACTION(*getDocument(), i18nc("Noun, name of the user action", "Budget creation"), err, 2)
if (ui.kWidgetSelector->getSelectedMode() == 0) {
// Manual creation
int mode = ui.kPeriod->currentIndex();
if (mode == 0) { // Monthly
for (int m = 1; !err && m <= 12; ++m) {
SKGBudgetObject budget(getDocument());
IFOKDO(err, updateBudget(budget, m))
// Send message
IFOKDO(err, getDocument()->sendMessage(i18nc("An information to the user", "The budget '%1' has been added", budget.getDisplayName()), SKGDocument::Hidden))
uniqueIDs.push_back(budget.getUniqueID());
}
} else if (mode == 1) { // Yearly
SKGBudgetObject budget(getDocument());
IFOKDO(err, updateBudget(budget, 0))
// Send message
IFOKDO(err, getDocument()->sendMessage(i18nc("An information to the user", "The budget '%1' has been added", budget.getDisplayName()), SKGDocument::Hidden))
uniqueIDs.push_back(budget.getUniqueID());
} else { // Individual
SKGBudgetObject budget(getDocument());
IFOKDO(err, updateBudget(budget))
// Send message
IFOKDO(err, getDocument()->sendMessage(i18nc("An information to the user", "The budget '%1' has been added", budget.getDisplayName()), SKGDocument::Hidden))
uniqueIDs.push_back(budget.getUniqueID());
}
} else {
// Automatic creation
if (ui.kAutoBudgetCheck->isChecked()) {
err = SKGBudgetObject::createAutomaticBudget(qobject_cast(getDocument()),
ui.kYearAuto->value(),
ui.kYearAutoBase->value(),
ui.kUseScheduledOperation->isChecked(),
ui.kRemovePrevious->isChecked());
}
IFOKDO(err, getDocument()->stepForward(1))
IFOKDO(err, SKGBudgetObject::balanceBudget(qobject_cast(getDocument()),
ui.kYearAuto->value(), (ui.kBalancingMonthly->isChecked() ? 0 : -1),
ui.kBalancingAnnual->isChecked()));
IFOKDO(err, getDocument()->stepForward(2))
}
}
// status bar
IFOK(err) {
err = SKGError(0, i18nc("Successful message after an user action", "Budget created"));
ui.kView->getView()->selectObjects(uniqueIDs);
} else {
err.addError(ERR_FAIL, i18nc("Error message", "Budget creation failed"));
}
}
// Display error
SKGMainPanel::displayErrorMessage(err, true);
}
void SKGBudgetPluginWidget::onUpdateClicked()
{
SKGError err;
SKGTRACEINFUNCRC(10, err)
// Get Selection
SKGObjectBase::SKGListSKGObjectBase selection = getSelectedObjects();
if (ui.kWidgetSelector->getSelectedMode() == 2) {
{
SKGBEGINTRANSACTION(*getDocument(), i18nc("Noun, name of the user action", "Budget rule update"), err)
SKGBudgetRuleObject rule(selection.at(0));
IFOKDO(err, updateBudgetRule(rule))
// Send message
IFOKDO(err, rule.getDocument()->sendMessage(i18nc("An information to the user", "The budget rule '%1' has been updated", rule.getDisplayName()), SKGDocument::Hidden))
}
// status bar
IFOK(err) {
err = SKGError(0, i18nc("Successful message after an user action", "Budget rule updated"));
} else {
err.addError(ERR_FAIL, i18nc("Error message", "Budget rule update failed"));
}
} else {
{
int nb = selection.count();
SKGBEGINPROGRESSTRANSACTION(*getDocument(), i18nc("Noun, name of the user action", "Budget update"), err, nb)
for (int i = 0; !err && i < nb; ++i) {
SKGBudgetObject budget(selection.at(i));
int mode = ui.kPeriod->currentIndex();
if (mode == 1) { // Yearly
err = updateBudget(budget, 0);
} else { // Individual
err = updateBudget(budget);
}
IFOKDO(err, getDocument()->stepForward(i + 1))
}
}
// status bar
IFOK(err) {
err = SKGError(0, i18nc("Successful message after an user action", "Budget updated"));
} else {
err.addError(ERR_FAIL, i18nc("Error message", "Budget update failed"));
}
}
// Display error
SKGMainPanel::displayErrorMessage(err, true);
// Set focus on table
ui.kView->getView()->setFocus();
}
SKGError SKGBudgetPluginWidget::updateBudget(SKGBudgetObject& iBudget, int iMonth)
{
SKGError err;
if (!err && ui.kYear->isEnabled()) {
err = iBudget.setYear(ui.kYear->value());
}
if (!err && ui.kMonth->isEnabled()) {
err = iBudget.setMonth(iMonth != -1 ? iMonth : ui.kMonth->value());
}
SKGCategoryObject cat;
QString catName = ui.kCategoryEdit->text().trimmed();
IFOKDO(err, SKGCategoryObject::createPathCategory(qobject_cast(getDocument()), catName, cat, true))
IFOKDO(err, iBudget.setCategory(cat))
IFOKDO(err, iBudget.enableSubCategoriesInclusion(ui.kIncludingSubCategories->isChecked()))
double val = ui.kAmountEdit->value();
// Is the sign forced ?
if (ui.kAmountEdit->sign() == 0) {
// No
SKGObjectBase cat2(cat.getDocument(), QStringLiteral("v_category_display"), cat.getID());
// Are we able to find to sign with the category ?
if (cat2.getAttribute(QStringLiteral("t_TYPEEXPENSE")) == QStringLiteral("-")) {
val = -val;
}
}
IFOKDO(err, iBudget.setBudgetedAmount(val))
IFOKDO(err, iBudget.save())
return err;
}
SKGError SKGBudgetPluginWidget::updateBudgetRule(SKGBudgetRuleObject& iRule)
{
SKGError err;
SKGCategoryObject cat;
QString catName = ui.kCategoryRule->text().trimmed();
IFOKDO(err, SKGCategoryObject::createPathCategory(qobject_cast(getDocument()), catName, cat, true))
SKGCategoryObject catchange;
QString catchangeName = ui.kCategoryTransfer->text().trimmed();
IFOKDO(err, SKGCategoryObject::createPathCategory(qobject_cast(getDocument()), catchangeName, catchange, true))
IFOKDO(err, iRule.enableCategoryCondition(ui.kCategoryCheck->isChecked()))
IFOKDO(err, iRule.setBudgetCategory(cat))
IFOKDO(err, iRule.enableYearCondition(ui.kYearCheck->isChecked()))
IFOKDO(err, iRule.setBudgetYear(ui.kYearRule->value()))
IFOKDO(err, iRule.enableMonthCondition(ui.kMonthCheck->isChecked()))
IFOKDO(err, iRule.setBudgetMonth(ui.kMonthRule->value()))
IFOK(err) {
bool absolute = (ui.kUnitCmb->currentIndex() == 1);
double val = ui.kAmountEdit2->value();
if (!absolute) {
val = qMin(qMax(static_cast(0), val), static_cast(100));
}
err = iRule.setQuantity(val, absolute);
}
IFOKDO(err, iRule.setCondition(static_cast(ui.kConditionCmb->itemData(ui.kConditionCmb->currentIndex()).toInt())))
IFOKDO(err, iRule.enableCategoryChange(ui.kCategoryTransferCheck->isChecked()))
IFOKDO(err, iRule.setTransfer(static_cast(ui.kModeCmb->itemData(ui.kModeCmb->currentIndex()).toInt()), catchange))
IFOKDO(err, iRule.save())
return err;
}
void SKGBudgetPluginWidget::onCreatorModified()
{
bool test = !ui.kAmountEdit->text().isEmpty() && !ui.kYear->text().isEmpty();
ui.kAddBtn->setEnabled(test || ui.kWidgetSelector->getSelectedMode() != 0);
ui.kModifyBtn->setEnabled((test && ui.kPeriod->currentIndex() != 0 && ui.kWidgetSelector->getSelectedMode() == 0 && (getNbSelectedObjects() != 0))
|| (ui.kWidgetSelector->getSelectedMode() == 2 && getNbSelectedObjects() == 1));
bool monthCondition = (ui.kPeriod->currentIndex() == 2 || ui.kWidgetSelector->getSelectedMode() == 2);
ui.kMonthLbl->setVisible(monthCondition);
ui.kMonth->setVisible(monthCondition);
}
void SKGBudgetPluginWidget::onSelectionChanged()
{
SKGTRACEINFUNC(10)
if (m_objectModel == nullptr) {
return;
}
SKGObjectBase::SKGListSKGObjectBase objs = getSelectedObjects();
int nb = objs.count();
int mode = ui.kWidgetSelector->getSelectedMode();
if (nb != 0) {
if (m_objectModel->getRealTable() == QStringLiteral("budget")) {
SKGBudgetObject budget(objs.at(0));
ui.kYear->setValue(budget.getYear());
ui.kMonth->setValue(budget.getMonth());
ui.kAmountEdit->setValue(budget.getBudgetedAmount());
ui.kCategoryEdit->setText(budget.getAttribute(QStringLiteral("t_CATEGORY")));
ui.kPeriod->setCurrentIndex(budget.getMonth() == 0 ? 1 : 2); // Set yearly or individual
ui.kIncludingSubCategories->setChecked(budget.isSubCategoriesInclusionEnabled());
if (mode > 0) {
ui.kWidgetSelector->setSelectedMode(0);
}
} else {
SKGBudgetRuleObject rule(objs.at(0));
ui.kYearCheck->setChecked(rule.isYearConditionEnabled());
ui.kYearRule->setValue(rule.getBudgetYear());
ui.kMonthCheck->setChecked(rule.isMonthConditionEnabled());
ui.kMonthRule->setValue(rule.getBudgetMonth());
ui.kCategoryCheck->setChecked(rule.isCategoryConditionEnabled());
ui.kCategoryRule->setText(rule.getAttribute(QStringLiteral("t_CATEGORYCONDITION")));
ui.kCategoryTransferCheck->setChecked(rule.isCategoryChangeEnabled());
ui.kCategoryTransfer->setText(rule.getAttribute(QStringLiteral("t_CATEGORY")));
ui.kUnitCmb->setCurrentIndex(rule.isAbolute() ? 1 : 0);
ui.kAmountEdit2->setValue(rule.getQuantity());
ui.kModeCmb->setCurrentIndex(ui.kModeCmb->findData(static_cast(rule.getTransferMode())));
ui.kConditionCmb->setCurrentIndex(ui.kConditionCmb->findData(static_cast(rule.getCondition())));
}
}
ui.kPeriod->setEnabled(nb <= 1);
ui.kYear->setEnabled(nb <= 1);
ui.kMonth->setEnabled(nb <= 1);
onCreatorModified();
refreshInfoZone();
Q_EMIT selectionChanged();
}
void SKGBudgetPluginWidget::activateEditor()
{
if (ui.kWidgetSelector->getSelectedMode() == -1) {
ui.kWidgetSelector->setSelectedMode(0);
}
ui.kAmountEdit->setFocus();
}
bool SKGBudgetPluginWidget::isEditor()
{
return true;
}
void SKGBudgetPluginWidget::refreshInfoZone()
{
SKGTRACEINFUNC(10)
auto* doc = qobject_cast(getDocument());
if ((doc != nullptr) && ui.kWidgetSelector->getSelectedMode() != 2) {
SKGServices::SKGUnitInfo primary = doc->getPrimaryUnit();
SKGServices::SKGUnitInfo secondary = doc->getSecondaryUnit();
// Refresh info area with selection
SKGObjectBase::SKGListSKGObjectBase selection = getSelectedObjects();
double budgeted = 0;
double modified = 0;
int nb = selection.count();
for (int i = 0; i < nb; ++i) {
SKGBudgetObject budget(selection.at(i));
budgeted += budget.getBudgetedAmount();
modified += budget.getBudgetedModifiedAmount();
}
QString budgetedS = doc->formatMoney(budgeted, primary);
QString modifiedS = doc->formatMoney(modified, primary);
QString v = (budgetedS == modifiedS ? budgetedS : modifiedS % " " % budgetedS % "");
if (nb != 0) {
ui.kInfo->setText(i18np("Selection: %1 budget for %2", "Selection: %1 budgets for %2", nb, v));
if (!secondary.Symbol.isEmpty() && (secondary.Value != 0.0)) {
budgetedS = doc->formatMoney(budgeted, secondary);
modifiedS = doc->formatMoney(modified, secondary);
v = (budgetedS == modifiedS ? budgetedS : modifiedS % " " % budgetedS % "");
}
ui.kInfo->setToolTip(i18np("Selection: %1 budget for %2", "Selection: %1 budgets for %2", nb, v));
} else {
ui.kInfo->setText(i18nc("Noun", "Selection: none"));
ui.kInfo->setToolTip(i18nc("Noun", "Selection: none"));
}
}
}
void SKGBudgetPluginWidget::onTop()
{
SKGError err;
SKGTRACEINFUNCRC(1, err)
// Get rules
SKGObjectBase::SKGListSKGObjectBase rules = getSelectedObjects();
int nb = rules.count();
{
SKGBEGINPROGRESSTRANSACTION(*getDocument(), i18nc("Noun, name of the user action", "Budget rule update"), err, nb)
for (int i = nb - 1; !err && i >= 0; --i) {
SKGBudgetRuleObject rule(rules.at(i));
double order = 1;
SKGStringListList result;
err = getDocument()->executeSelectSqliteOrder(QStringLiteral("SELECT min(f_sortorder) from budgetrule"), result);
if (!err && result.count() == 2) {
order = SKGServices::stringToDouble(result.at(1).at(0)) - 1;
}
IFOKDO(err, rule.setOrder(order))
IFOKDO(err, rule.save())
// Send message
IFOKDO(err, getDocument()->sendMessage(i18nc("An information to the user", "The budget rule '%1' has been updated", rule.getDisplayName()), SKGDocument::Hidden))
IFOKDO(err, getDocument()->stepForward(i + 1))
}
}
// status bar
IFOKDO(err, SKGError(0, i18nc("Successful message after an user action", "Budget rule updated")))
else {
err.addError(ERR_FAIL, i18nc("Error message", "Budget rule update failed"));
}
// Display error
SKGMainPanel::displayErrorMessage(err);
}
void SKGBudgetPluginWidget::onUp()
{
SKGError err;
SKGTRACEINFUNCRC(1, err)
// Get rules
SKGObjectBase::SKGListSKGObjectBase rules = getSelectedObjects();
int nb = rules.count();
{
SKGBEGINPROGRESSTRANSACTION(*getDocument(), i18nc("Noun, name of the user action", "Budget rule update"), err, nb)
for (int i = 0; !err && i < nb; ++i) {
SKGBudgetRuleObject rule(rules.at(i));
double order = rule.getOrder();
SKGStringListList result;
err = getDocument()->executeSelectSqliteOrder("SELECT f_sortorder from budgetrule where f_sortorder<" % SKGServices::doubleToString(order) % " ORDER BY f_sortorder DESC", result);
IFOK(err) {
if (result.count() == 2) {
order = SKGServices::stringToDouble(result.at(1).at(0)) - 1;
} else if (result.count() >= 2) {
order = (SKGServices::stringToDouble(result.at(1).at(0)) + SKGServices::stringToDouble(result.at(2).at(0))) / 2;
}
}
IFOKDO(err, rule.setOrder(order))
IFOKDO(err, rule.save())
// Send message
IFOKDO(err, getDocument()->sendMessage(i18nc("An information to the user", "The budget rule '%1' has been updated", rule.getDisplayName()), SKGDocument::Hidden))
IFOKDO(err, getDocument()->stepForward(i + 1))
}
}
// status bar
IFOKDO(err, SKGError(0, i18nc("Successful message after an user action", "Budget rule updated")))
else {
err.addError(ERR_FAIL, i18nc("Error message", "Budget rule update failed"));
}
// Display error
SKGMainPanel::displayErrorMessage(err);
}
void SKGBudgetPluginWidget::onDown()
{
SKGError err;
SKGTRACEINFUNCRC(1, err)
// Get rules
SKGObjectBase::SKGListSKGObjectBase rules = getSelectedObjects();
int nb = rules.count();
{
SKGBEGINPROGRESSTRANSACTION(*getDocument(), i18nc("Noun, name of the user action", "Budget rule update"), err, nb)
for (int i = nb - 1; !err && i >= 0; --i) {
SKGBudgetRuleObject rule(rules.at(i));
double order = rule.getOrder();
SKGStringListList result;
err = getDocument()->executeSelectSqliteOrder("SELECT f_sortorder from budgetrule where f_sortorder>" % SKGServices::doubleToString(order) % " ORDER BY f_sortorder ASC", result);
IFOK(err) {
if (result.count() == 2) {
order = SKGServices::stringToDouble(result.at(1).at(0)) + 1;
} else if (result.count() >= 2) {
order = (SKGServices::stringToDouble(result.at(1).at(0)) + SKGServices::stringToDouble(result.at(2).at(0))) / 2;
}
}
IFOKDO(err, rule.setOrder(order))
IFOKDO(err, rule.save())
// Send message
IFOKDO(err, getDocument()->sendMessage(i18nc("An information to the user", "The budget rule '%1' has been updated", rule.getDisplayName()), SKGDocument::Hidden))
IFOKDO(err, getDocument()->stepForward(i + 1))
}
}
// status bar
IFOKDO(err, SKGError(0, i18nc("Successful message after an user action", "Budget rule updated")))
else {
err.addError(ERR_FAIL, i18nc("Error message", "Budget rule update failed"));
}
// Display error
SKGMainPanel::displayErrorMessage(err);
}
void SKGBudgetPluginWidget::onBottom()
{
SKGError err;
SKGTRACEINFUNCRC(1, err)
// Get rules
SKGObjectBase::SKGListSKGObjectBase rules = getSelectedObjects();
int nb = rules.count();
{
SKGBEGINPROGRESSTRANSACTION(*getDocument(), i18nc("Noun, name of the user action", "Budget rule update"), err, nb)
for (int i = 0; !err && i < nb; ++i) {
SKGBudgetRuleObject rule(rules.at(i));
double order = 1;
SKGStringListList result;
err = getDocument()->executeSelectSqliteOrder(QStringLiteral("SELECT max(f_sortorder) from budgetrule"), result);
if (!err && result.count() == 2) {
order = SKGServices::stringToDouble(result.at(1).at(0)) + 1;
}
IFOKDO(err, rule.setOrder(order))
IFOKDO(err, rule.save())
// Send message
IFOKDO(err, getDocument()->sendMessage(i18nc("An information to the user", "The budget rule '%1' has been updated", rule.getDisplayName()), SKGDocument::Hidden))
IFOKDO(err, getDocument()->stepForward(i + 1))
}
}
// status bar
IFOKDO(err, SKGError(0, i18nc("Successful message after an user action", "Budget rule updated")))
else {
err.addError(ERR_FAIL, i18nc("Error message", "Budget rule update failed"));
}
// Display error
SKGMainPanel::displayErrorMessage(err);
}