Add right-click menu item "Assign payment" to assign a transaction as a payment.

Feature request as described on
https://gnucash.uservoice.com/forums/101223-feature-request/suggestions/1536285-reassociate-already-existing-transactions-with-a-b?ref=title

git-svn-id: svn+ssh://svn.gnucash.org/repo/gnucash/trunk@21383 57a11ea4-9604-0410-9ed3-97b8803252fd
This commit is contained in:
Christian Stimming 2011-10-07 21:50:14 +00:00
parent e0e564f234
commit d4f33a5867
2 changed files with 131 additions and 1 deletions

View File

@ -53,6 +53,11 @@
#include "core-utils/gnc-gconf-utils.h"
#include "gnome-utils/gnc-main-window.h"
#include "gnc-plugin-page-register.h"
/* This static indicates the debugging module that this .o belongs to. */
static QofLogModule log_module = G_LOG_DOMAIN;
/* g_object functions */
static void gnc_plugin_business_class_init (GncPluginBusinessClass *klass);
static void gnc_plugin_business_init (GncPluginBusiness *plugin);
@ -135,6 +140,8 @@ static void gnc_plugin_business_cmd_test_reload_receivable_report (GtkAction *ac
static void gnc_plugin_business_cmd_test_init_data (GtkAction *action,
GncMainWindowActionData *data);
static void gnc_plugin_business_cmd_assign_payment (GtkAction *action,
GncMainWindowActionData *data);
#define PLUGIN_ACTIONS_NAME "gnc-plugin-business-actions"
#define PLUGIN_UI_FILENAME "gnc-plugin-business-ui.xml"
@ -323,6 +330,13 @@ static GtkActionEntry gnc_plugin_actions [] =
N_("Open the New Invoice dialog"),
G_CALLBACK (gnc_plugin_business_cmd_customer_new_invoice)
},
/* Register popup menu */
{
"RegisterAssignPayment", NULL, N_("Assign as payment..."), NULL,
N_("Assign the selected transaction as payment"),
G_CALLBACK (gnc_plugin_business_cmd_assign_payment)
},
};
static guint gnc_plugin_n_actions = G_N_ELEMENTS (gnc_plugin_actions);
@ -858,6 +872,101 @@ gnc_plugin_business_cmd_test_reload_receivable_report (GtkAction *action,
gnc_plugin_business_reload_module("gnucash/report/receivable-report.scm");
}
static void gnc_business_assign_payment (GtkWidget *parent,
Transaction *trans,
GncOwner *owner)
{
g_return_if_fail(trans);
// Do nothing if we don't have more than one split (e.g. in the empty line at the end of the register)
if (xaccTransCountSplits(trans) <= 1)
return;
//g_message("Creating payment dialog with trans %p", trans);
gnc_ui_payment_new_with_txn(owner, trans);
}
static void gnc_plugin_business_cmd_assign_payment (GtkAction *action,
GncMainWindowActionData *mw)
{
GncPluginBusiness *plugin_business;
GncPluginBusinessPrivate *plugin_business_priv;
GncPluginPage *plugin_page;
GNCSplitReg *gsr;
SplitRegister *reg;
Split *split;
Transaction *trans;
g_return_if_fail (mw != NULL);
g_return_if_fail (GNC_IS_PLUGIN_BUSINESS (mw->data));
plugin_page = gnc_main_window_get_current_page(mw->window);
// We continue only if the current page is a plugin page and more
// specifically a register plugin page
if (!GNC_IS_PLUGIN_PAGE(plugin_page)
|| !GNC_IS_PLUGIN_PAGE_REGISTER(plugin_page))
return;
gsr = gnc_plugin_page_register_get_gsr(plugin_page);
g_return_if_fail(gsr);
reg = gnc_ledger_display_get_split_register( gsr->ledger );
g_return_if_fail(reg);
split = gnc_split_register_get_current_split(reg);
g_return_if_fail(split);
trans = xaccSplitGetParent(split);
g_return_if_fail(trans);
plugin_business = GNC_PLUGIN_BUSINESS (mw->data);
plugin_business_priv = GNC_PLUGIN_BUSINESS_GET_PRIVATE (plugin_business);
gnc_business_assign_payment (gnc_plugin_page_get_window(plugin_page),
trans,
plugin_business_priv->last_customer);
}
static const gchar *register_txn_actions[] =
{
"RegisterAssignPayment",
NULL
};
static void
gnc_plugin_business_update_menus (GncPluginPage *plugin_page)
{
GncMainWindow *window;
GtkActionGroup *action_group;
gboolean is_txn_register;
// We continue only if the current page is a plugin page
if (!plugin_page || !GNC_IS_PLUGIN_PAGE(plugin_page))
return;
is_txn_register = GNC_IS_PLUGIN_PAGE_REGISTER(plugin_page);
window = GNC_MAIN_WINDOW(plugin_page->window);
g_return_if_fail(GNC_IS_MAIN_WINDOW(window));
action_group = gnc_main_window_get_action_group(window, PLUGIN_ACTIONS_NAME);
g_return_if_fail(GTK_IS_ACTION_GROUP(action_group));
// Change visibility and also sensitivity according to whether we are in a txn register
gnc_plugin_update_actions (action_group, register_txn_actions,
"sensitive", is_txn_register);
gnc_plugin_update_actions (action_group, register_txn_actions,
"visible", is_txn_register);
}
static void gnc_plugin_business_main_window_page_changed(GncMainWindow *window,
GncPluginPage *page,
gpointer user_data)
{
// g_message("gnc_plugin_business_main_window_page_changed, page=%p", page);
gnc_plugin_business_update_menus(page);
}
static void
gnc_plugin_business_cmd_test_init_data (GtkAction *action,
GncMainWindowActionData *data)
@ -995,11 +1104,20 @@ gnc_plugin_business_gconf_changed (GConfClient *client,
}
}
/* Update the toolbar button visibility each time our plugin is added
/**
* Called when this plugin is added to a main window. Connect a few callbacks
* here to track page changes.
*
* Update the toolbar button visibility each time our plugin is added
* to a new GncMainWindow. */
static void gnc_plugin_business_add_to_window (GncPlugin *plugin,
GncMainWindow *mainwindow,
GQuark type)
{
// g_message("gnc_plugin_business_add_to_window");
update_extra_toolbuttons(mainwindow);
g_signal_connect(mainwindow, "page_changed",
G_CALLBACK(gnc_plugin_business_main_window_page_changed),
plugin);
}

View File

@ -1,5 +1,11 @@
<ui>
<menubar>
<menu name="Edit" action="EditAction">
<placeholder name="EditSelectedPlaceholder">
<menuitem name="RegisterAssignPayment" action="RegisterAssignPayment"/>
</placeholder>
</menu>
<placeholder name="AdditionalMenusPlaceholder">
<menu name="Business" action="BusinessAction">
<menu name="CustomerMenu" action="CustomerMenuAction">
@ -66,4 +72,10 @@
</placeholder>
</toolbar>
<popup name="MainPopup" action="FakeToplevel">
<!--separator name="PopupSep3"/-->
<placeholder name="PopupPlaceholder3">
<menuitem name="RegisterAssignPayment" action="RegisterAssignPayment"/>
</placeholder>
</popup>
</ui>