gnucash maint: Bug 787295 - Allow UI jump from Business accounts to their relevant invoice/bill/voucher
Christopher Lam
clam at code.gnucash.org
Sat Aug 15 01:47:21 EDT 2020
Updated via https://github.com/Gnucash/gnucash/commit/ca6e5528 (commit)
from https://github.com/Gnucash/gnucash/commit/d1976fc7 (commit)
commit ca6e5528bdf6c9b0bf72ea60a36062c5989f1b84
Author: Christopher Lam <christopher.lck at gmail.com>
Date: Sun Jun 28 23:45:06 2020 +0800
Bug 787295 - Allow UI jump from Business accounts to their relevant invoice/bill/voucher
diff --git a/gnucash/gnome/gnc-plugin-page-register.c b/gnucash/gnome/gnc-plugin-page-register.c
index 6f6d6137e..90b12969c 100644
--- a/gnucash/gnome/gnc-plugin-page-register.c
+++ b/gnucash/gnome/gnc-plugin-page-register.c
@@ -76,6 +76,7 @@
#include "gnc-window.h"
#include "gnc-main-window.h"
#include "gnc-session.h"
+#include "gnc-ui.h"
#include "gnc-warnings.h"
#include "gnucash-sheet.h"
#include "dialog-lot-viewer.h"
@@ -278,6 +279,7 @@ static void gnc_plugin_page_register_event_handler (QofInstance* entity,
GncEventData* ed);
static GncInvoice* invoice_from_split (Split* split);
+static GList* invoices_from_transaction (Transaction* trans);
/************************************************************/
/* Actions */
@@ -1064,7 +1066,7 @@ gnc_plugin_page_register_ui_update (gpointer various,
GtkAction* action;
gboolean expanded, voided, read_only = FALSE;
Transaction* trans;
- GncInvoice* inv;
+ GList* invoices;
CursorClass cursor_class;
const char* uri;
@@ -1146,20 +1148,13 @@ gnc_plugin_page_register_ui_update (gpointer various,
We can determine an invoice from a txn if either
- it is an invoice transaction
- it has splits with an invoice associated with it
- As payment txns can have more than one split associated
- with an invoice, we can't tell which invoice to open based on
- the transaction type alone (like in a bank account). However we can
- uniquely determine an invoice from a split starting from an APAR account
- as only those splits will have invoice information. For a more universal
- mechanism (like to be able to display invoices from a bank account) we would
- need user interaction which is not implemented so far. */
- inv = invoice_from_split (gnc_split_register_get_current_split (reg));
+ */
action = gnc_plugin_page_get_action (GNC_PLUGIN_PAGE (page),
"JumpAssociatedInvoiceAction");
- gtk_action_set_sensitive (GTK_ACTION (action),
- inv ||
- (xaccTransGetTxnType (trans) == TXN_TYPE_INVOICE));
+ invoices = invoices_from_transaction (trans);
+ gtk_action_set_sensitive (GTK_ACTION (action), (invoices != NULL));
+ g_list_free (invoices);
gnc_plugin_business_split_reg_ui_update (GNC_PLUGIN_PAGE (page));
@@ -4592,6 +4587,18 @@ static GncInvoice* invoice_from_split (Split* split)
return invoice;
}
+GList* invoices_from_transaction (Transaction* trans)
+{
+ GList *invoices = NULL;
+ for (GList *node = xaccTransGetAPARAcctSplitList(trans, TRUE); node;
+ node = node->next)
+ {
+ GncInvoice* inv = invoice_from_split ((Split*) node->data);
+ if (inv) invoices = g_list_prepend (invoices, inv);
+ }
+ return invoices;
+}
+
static void
gnc_plugin_page_register_cmd_jump_associated_invoice (GtkAction* action,
GncPluginPageRegister* plugin_page)
@@ -4608,10 +4615,49 @@ gnc_plugin_page_register_cmd_jump_associated_invoice (GtkAction* action,
reg = gnc_ledger_display_get_split_register (priv->gsr->ledger);
txn = gnc_split_register_get_current_trans (reg);
invoice = invoice_from_split (gnc_split_register_get_current_split (reg));
- if (xaccTransGetTxnType (txn) == TXN_TYPE_INVOICE)
- invoice = invoice_from_split (xaccTransGetFirstAPARAcctSplit (txn, TRUE));
- else
- invoice = invoice_from_split (gnc_split_register_get_current_split (reg));
+
+ if (!invoice)
+ {
+ GList *invoices = invoices_from_transaction (txn);
+ if (!invoices)
+ PERR ("shouldn't happen: if no invoices, function is never called");
+ else if (!invoices->next)
+ invoice = (GncInvoice*) invoices->data;
+ else
+ {
+ GList *details = NULL;
+ gint choice;
+ const gchar *amt;
+ for (GList *node = invoices; node; node = node->next)
+ {
+ GncInvoice* inv = node->data;
+ gchar *date = qof_print_date (gncInvoiceGetDatePosted (inv));
+ amt = xaccPrintAmount
+ (gncInvoiceGetTotal (inv),
+ gnc_account_print_info (gncInvoiceGetPostedAcc (inv), TRUE));
+ details = g_list_prepend
+ (details,
+ /* Translators: %s refer to the following in
+ order: invoice type, invoice ID, owner name,
+ posted date, amount */
+ g_strdup_printf (_("%s %s from %s, posted %s, amount %s"),
+ gncInvoiceGetTypeString (inv),
+ gncInvoiceGetID (inv),
+ gncOwnerGetName (gncInvoiceGetOwner (inv)),
+ date, amt));
+ g_free (date);
+ }
+ details = g_list_reverse (details);
+ choice = gnc_choose_radio_option_dialog
+ (GNC_PLUGIN_PAGE (plugin_page)->window, _("Select invoice"),
+ _("Several invoices are associated with this transaction. \
+Please choose one:"), _("Select"), 0, details);
+ if (choice >= 0)
+ invoice = (GncInvoice *)(g_list_nth (invoices, choice))->data;
+ g_list_free_full (details, g_free);
+ }
+ g_list_free (invoices);
+ }
if (invoice)
gnc_ui_invoice_edit (NULL, invoice);
Summary of changes:
gnucash/gnome/gnc-plugin-page-register.c | 78 +++++++++++++++++++++++++-------
1 file changed, 62 insertions(+), 16 deletions(-)
More information about the gnucash-changes
mailing list