From 535632b02515d0bbca3ba01ef2f2bfb7f0edf442 Mon Sep 17 00:00:00 2001 From: Christopher Lam Date: Sun, 3 Nov 2019 18:41:54 +0800 Subject: [PATCH] Bug 787295 - Allow UI jump from Business accounts to their relevant invoice/bill/voucher This enables UI jump via Transaction or Right-click menu to open the invoice for editing. --- gnucash/gnome/gnc-plugin-page-register.c | 75 ++++++++++++++++++++++ gnucash/ui/gnc-plugin-page-register-ui.xml | 4 ++ 2 files changed, 79 insertions(+) diff --git a/gnucash/gnome/gnc-plugin-page-register.c b/gnucash/gnome/gnc-plugin-page-register.c index 42aead8362..308c40916b 100644 --- a/gnucash/gnome/gnc-plugin-page-register.c +++ b/gnucash/gnome/gnc-plugin-page-register.c @@ -54,6 +54,7 @@ #include "dialog-find-account.h" #include "dialog-find-transactions.h" #include "dialog-print-check.h" +#include "dialog-invoice.h" #include "dialog-transfer.h" #include "dialog-utils.h" #include "assistant-stock-split.h" @@ -184,6 +185,7 @@ static void gnc_plugin_page_register_cmd_transaction_report (GtkAction *action, static void gnc_plugin_page_register_cmd_associate_file_transaction (GtkAction *action, GncPluginPageRegister *plugin_page); static void gnc_plugin_page_register_cmd_associate_location_transaction (GtkAction *action, GncPluginPageRegister *plugin_page); static void gnc_plugin_page_register_cmd_execassociated_transaction (GtkAction *action, GncPluginPageRegister *plugin_page); +static void gnc_plugin_page_register_cmd_jump_associated_invoice (GtkAction *action, GncPluginPageRegister *plugin_page); static void gnc_plugin_page_help_changed_cb( GNCSplitReg *gsr, GncPluginPageRegister *register_page ); static void gnc_plugin_page_popup_menu_cb( GNCSplitReg *gsr, GncPluginPageRegister *register_page ); @@ -197,6 +199,8 @@ static void gnc_plugin_page_register_event_handler (QofInstance *entity, GncPluginPageRegister *page, GncEventData *ed); +static GncInvoice * invoice_from_trans (Transaction *trans); + /************************************************************/ /* Actions */ /************************************************************/ @@ -209,6 +213,7 @@ static void gnc_plugin_page_register_event_handler (QofInstance *entity, #define ASSOCIATE_TRANSACTION_FILE_LABEL N_("_Associate File with Transaction") #define ASSOCIATE_TRANSACTION_LOCATION_LABEL N_("_Associate Location with Transaction") #define EXECASSOCIATED_TRANSACTION_LABEL N_("_Open Associated File/Location") +#define JUMP_ASSOCIATED_INVOICE_LABEL N_("Open Associated Invoice") #define CUT_SPLIT_LABEL N_("Cu_t Split") #define COPY_SPLIT_LABEL N_("_Copy Split") #define PASTE_SPLIT_LABEL N_("_Paste Split") @@ -222,6 +227,7 @@ static void gnc_plugin_page_register_event_handler (QofInstance *entity, #define ASSOCIATE_TRANSACTION_FILE_TIP N_("Associate a file with the current transaction") #define ASSOCIATE_TRANSACTION_LOCATION_TIP N_("Associate a location with the current transaction") #define EXECASSOCIATED_TRANSACTION_TIP N_("Open the associated file or location with the current transaction") +#define JUMP_ASSOCIATED_INVOICE_TIP N_("Open the associated invoice") #define CUT_SPLIT_TIP N_("Cut the selected split into clipboard") #define COPY_SPLIT_TIP N_("Copy the selected split into clipboard") #define PASTE_SPLIT_TIP N_("Paste the split from the clipboard") @@ -339,6 +345,11 @@ static GtkActionEntry gnc_plugin_page_register_actions [] = EXECASSOCIATED_TRANSACTION_TIP, G_CALLBACK (gnc_plugin_page_register_cmd_execassociated_transaction) }, + { + "JumpAssociatedInvoiceAction", NULL, JUMP_ASSOCIATED_INVOICE_LABEL, NULL, + JUMP_ASSOCIATED_INVOICE_TIP, + G_CALLBACK (gnc_plugin_page_register_cmd_jump_associated_invoice) + }, /* View menu */ @@ -513,6 +524,7 @@ static action_toolbar_labels toolbar_labels[] = { "AssociateTransactionFileAction", N_("Associate File") }, { "AssociateTransactionLocationAction", N_("Associate Location") }, { "ExecAssociatedTransactionAction", N_("Open File/Location") }, + { "JumpAssociatedInvoiceAction", N_("Open Invoice") }, { NULL, NULL }, }; @@ -890,6 +902,7 @@ static const char* tran_action_labels[] = ASSOCIATE_TRANSACTION_FILE_LABEL, ASSOCIATE_TRANSACTION_LOCATION_LABEL, EXECASSOCIATED_TRANSACTION_LABEL, + JUMP_ASSOCIATED_INVOICE_LABEL, NULL }; @@ -904,6 +917,7 @@ static const char* tran_action_tips[] = ASSOCIATE_TRANSACTION_FILE_TIP, ASSOCIATE_TRANSACTION_LOCATION_TIP, EXECASSOCIATED_TRANSACTION_TIP, + JUMP_ASSOCIATED_INVOICE_TIP, NULL }; @@ -937,6 +951,7 @@ gnc_plugin_page_register_ui_update (gpointer various, GncPluginPageRegister *pag GtkAction *action; gboolean expanded, voided, read_only = FALSE; Transaction *trans; + GncInvoice *inv; CursorClass cursor_class; const char *uri; @@ -1009,6 +1024,12 @@ gnc_plugin_page_register_ui_update (gpointer various, GncPluginPageRegister *pag "ExecAssociatedTransactionAction"); gtk_action_set_sensitive (GTK_ACTION(action), (uri && *uri)); + /* Set 'ExecAssociatedInvoice' */ + inv = invoice_from_trans(trans); + action = gnc_plugin_page_get_action (GNC_PLUGIN_PAGE(page), + "JumpAssociatedInvoiceAction"); + gtk_action_set_sensitive (GTK_ACTION(action), (!(!inv))); + gnc_plugin_business_split_reg_ui_update (GNC_PLUGIN_PAGE(page)); /* If we are in a readonly book, make any modifying action inactive */ @@ -4307,6 +4328,60 @@ gnc_plugin_page_register_cmd_execassociated_transaction (GtkAction *action, } +static GncInvoice * invoice_from_trans (Transaction *trans) +{ + GncInvoice *invoice; + SplitList *splits; + + g_return_if_fail (GNC_IS_TRANSACTION(trans)); + invoice = gncInvoiceGetInvoiceFromTxn(trans); + + if (invoice) + return invoice; + + for (splits = xaccTransGetSplitList (trans); splits; splits = splits->next) + { + Split *split = splits->data; + GNCLot *lot; + + if (!split) + continue; + + lot = xaccSplitGetLot (split); + if (!lot) + continue; + + invoice = gncInvoiceGetInvoiceFromLot (lot); + if (!invoice) + continue; + + return invoice; + } + + return NULL; +} + +static void +gnc_plugin_page_register_cmd_jump_associated_invoice (GtkAction *action, + GncPluginPageRegister *plugin_page) +{ + GncPluginPageRegisterPrivate *priv; + SplitRegister *reg; + GncInvoice *invoice; + + ENTER("(action %p, plugin_page %p)", action, plugin_page); + + g_return_if_fail(GNC_IS_PLUGIN_PAGE_REGISTER(plugin_page)); + priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE(plugin_page); + reg = gnc_ledger_display_get_split_register (priv->gsr->ledger); + invoice = invoice_from_trans (xaccSplitGetParent + (gnc_split_register_get_current_split (reg))); + if (invoice) + gnc_ui_invoice_edit (NULL, invoice); + + LEAVE(" "); +} + static void gnc_plugin_page_register_cmd_blank_transaction (GtkAction *action, GncPluginPageRegister *plugin_page) diff --git a/gnucash/ui/gnc-plugin-page-register-ui.xml b/gnucash/ui/gnc-plugin-page-register-ui.xml index 23d64d5580..517afcbca1 100644 --- a/gnucash/ui/gnc-plugin-page-register-ui.xml +++ b/gnucash/ui/gnc-plugin-page-register-ui.xml @@ -25,6 +25,8 @@ + + @@ -101,6 +103,8 @@ + +