gnucash trunk: Bug 723644.

Mike Evans mikee at code.gnucash.org
Sun Feb 9 11:59:48 EST 2014


Updated	 via  https://github.com/Gnucash/gnucash/commit/40c236b9 (commit)
	from  https://github.com/Gnucash/gnucash/commit/5706c008 (commit)



commit 40c236b9e0650ba88039e9aeeaab6055ef42fde8
Author: Mike Evans <mikee at millstreamcomputing.co.uk>
Date:   Sun Feb 9 16:21:12 2014 +0000

    Bug 723644.
    
    Make sure that gnc_search_invoice_on_id() returns the correct type
    of object.

diff --git a/src/engine/gncIDSearch.c b/src/engine/gncIDSearch.c
index 7378e9c..058474e 100644
--- a/src/engine/gncIDSearch.c
+++ b/src/engine/gncIDSearch.c
@@ -23,7 +23,16 @@
 
 #include "gncIDSearch.h"
 
-static void * search(QofBook * book, const gchar *id, void * object, QofIdType type);
+typedef enum
+{   UNDEFINED,
+    CUSTOMER,
+    VENDOR,
+    INVOICE,
+    BILL
+}GncSearchType;
+
+static void * search(QofBook * book, const gchar *id, void * object, GncSearchType type);
+static QofLogModule log_module = G_LOG_DOMAIN;
 /***********************************************************************
  * Search the book for a Customer/Invoice/Bill with the same ID.
  * If it exists return a valid object, if not then returns NULL.
@@ -31,11 +40,13 @@ static void * search(QofBook * book, const gchar *id, void * object, QofIdType t
  @param gchar ID of the Customer
  @return GncCustomer * Pointer to the customer or NULL of there is no customer
  **********************************************************************/
+
+
 GncCustomer *
 gnc_search_customer_on_id (QofBook * book, const gchar *id)
 {
     GncCustomer *customer = NULL;
-    QofIdType type = GNC_CUSTOMER_MODULE_NAME;
+    GncSearchType type = CUSTOMER;
     customer = (GncCustomer*)search(book, id, customer, type);
     return customer;
 }
@@ -44,7 +55,7 @@ GncInvoice *
 gnc_search_invoice_on_id (QofBook * book, const gchar *id)
 {
     GncInvoice *invoice = NULL;
-    QofIdType type = GNC_INVOICE_MODULE_NAME;
+    GncSearchType type = INVOICE;
     invoice = (GncInvoice*)search(book, id, invoice, type);
     return invoice;
 }
@@ -54,7 +65,7 @@ GncInvoice *
 gnc_search_bill_on_id (QofBook * book, const gchar *id)
 {
     GncInvoice *bill =  NULL;
-    QofIdType type = GNC_INVOICE_MODULE_NAME;
+    GncSearchType type = BILL;
     bill = (GncInvoice*)search(book, id, bill, type);
     return bill;
 }
@@ -63,7 +74,7 @@ GncVendor *
 gnc_search_vendor_on_id (QofBook * book, const gchar *id)
 {
     GncVendor *vendor =  NULL;
-    QofIdType type = GNC_VENDOR_MODULE_NAME;
+    GncSearchType type = VENDOR;
     vendor = (GncVendor*)search(book, id, vendor, type);
     return vendor;
 }
@@ -73,33 +84,37 @@ gnc_search_vendor_on_id (QofBook * book, const gchar *id)
  * Generic search called after setting up stuff
  * DO NOT call directly but type tests should fail anyway
  ****************************************************************/
-static void * search(QofBook * book, const gchar *id, void * object, QofIdType type)
+static void * search(QofBook * book, const gchar *id, void * object, GncSearchType type)
 {
     void *c;
     GList *result;
     QofQuery *q;
     gint len;
     QofQueryPredData* string_pred_data;
+    
+    PINFO("Type = %d", type);
     g_return_val_if_fail (type, NULL);
     g_return_val_if_fail (id, NULL);
     g_return_val_if_fail (book, NULL);
 
     // Build the query
-    q = qof_query_create_for (type);
+    q = qof_query_create ();
     qof_query_set_book (q, book);
     // Search only the id field
     string_pred_data = qof_query_string_predicate (QOF_COMPARE_EQUAL, id, QOF_STRING_MATCH_NORMAL, FALSE);
-
-    if (strcmp(type, GNC_CUSTOMER_MODULE_NAME))
+    if (type == CUSTOMER)
     {
+        qof_query_search_for(q,GNC_CUSTOMER_MODULE_NAME);
         qof_query_add_term (q, qof_query_build_param_list("CUSTOMER_ID"), string_pred_data, QOF_QUERY_AND);
     }
-    else if (strcmp(type, GNC_INVOICE_MODULE_NAME))
+    else if (type ==  INVOICE || type ==  BILL)
     {
+        qof_query_search_for(q,GNC_INVOICE_MODULE_NAME);
         qof_query_add_term (q, qof_query_build_param_list("INVOICE_ID"), string_pred_data, QOF_QUERY_AND);
     }
-    else if (strcmp(type, GNC_VENDOR_MODULE_NAME))
+    else if (type == VENDOR)
     {
+        qof_query_search_for(q,GNC_VENDOR_MODULE_NAME);
         qof_query_add_term (q, qof_query_build_param_list("VENDOR_ID"), string_pred_data, QOF_QUERY_AND);
     }
 
@@ -116,18 +131,26 @@ static void * search(QofBook * book, const gchar *id, void * object, QofIdType t
         while (result)
         {
             c = result->data;
-            if (strcmp(type, GNC_CUSTOMER_MODULE_NAME) && strcmp(id, gncCustomerGetID(c)) == 0)
+            
+            if (type == CUSTOMER && strcmp(id, gncCustomerGetID(c)) == 0)
             {
                 // correct id found
                 object = c;
                 break;
             }
-            else if (strcmp(type, GNC_INVOICE_MODULE_NAME) && strcmp(id, gncInvoiceGetID(c)) == 0)
+            else if (type == INVOICE && strcmp(id, gncInvoiceGetID(c)) == 0 
+                        && gncInvoiceGetType(c) == GNC_INVOICE_CUST_INVOICE)
+            {
+                object = c;
+                break;
+            }
+            else if (type == BILL && strcmp(id, gncInvoiceGetID(c)) == 0 
+                        && gncInvoiceGetType(c) == GNC_INVOICE_VEND_INVOICE)
             {
                 object = c;
                 break;
             }
-            else if (strcmp(type, GNC_VENDOR_MODULE_NAME) && strcmp(id, gncVendorGetID(c)) == 0)
+            else if (type == VENDOR && strcmp(id, gncVendorGetID(c)) == 0)
             {
                 object = c;
                 break;
diff --git a/src/plugins/bi_import/dialog-bi-import-gui.c b/src/plugins/bi_import/dialog-bi-import-gui.c
index fb0b402..9541eec 100644
--- a/src/plugins/bi_import/dialog-bi-import-gui.c
+++ b/src/plugins/bi_import/dialog-bi-import-gui.c
@@ -354,7 +354,7 @@ void gnc_bi_import_gui_open_mode_cb (GtkWidget *widget, gpointer data)
 
 
 /*****************************************************************
- * Set whether we are importing a bi, invoice, Customer or Vendor
+ * Set whether we are importing a bill, invoice, Customer or Vendor
  * ****************************************************************/
 void gnc_import_gui_type_cb (GtkWidget *widget, gpointer data)
 {
diff --git a/src/plugins/bi_import/dialog-bi-import.c b/src/plugins/bi_import/dialog-bi-import.c
index 6da1d4d..c990413 100644
--- a/src/plugins/bi_import/dialog-bi-import.c
+++ b/src/plugins/bi_import/dialog-bi-import.c
@@ -78,6 +78,7 @@
                 g_free (temp); \
             }
 
+static QofLogModule log_module = G_LOG_DOMAIN; //G_LOG_BUSINESS;
 
 bi_import_result
 gnc_bi_import_read_file (const gchar * filename, const gchar * parser_regexp,
@@ -564,9 +565,12 @@ gnc_bi_import_create_bis (GtkListStore * store, QofBook * book,
             invoice = gnc_search_bill_on_id (book, id);
         else if (g_ascii_strcasecmp (type, "INVOICE") == 0)
             invoice = gnc_search_invoice_on_id (book, id);
+        PINFO( "Existing %s ID: %s\n", type, gncInvoiceGetID(invoice));
 
-        if (!invoice)
+        // If the search is empty then there is no existing invoice so make a new one
+        if (invoice == NULL)
         {
+             PINFO( "Creating a new : %s\n", type );
             // new invoice
             invoice = gncInvoiceCreate (book);
             /* Protect against thrashing the DB and trying to write the invoice
@@ -686,6 +690,7 @@ gnc_bi_import_create_bis (GtkListStore * store, QofBook * book,
         gncEntrySetQuantity (entry, n);
         acc = gnc_account_lookup_for_register (gnc_get_current_root_account (),
                                                account);
+        
         if (g_ascii_strcasecmp (type, "BILL") == 0)
         {
             gncEntrySetBillAccount (entry, acc);



Summary of changes:
 src/engine/gncIDSearch.c                     | 51 ++++++++++++++++++++--------
 src/plugins/bi_import/dialog-bi-import-gui.c |  2 +-
 src/plugins/bi_import/dialog-bi-import.c     |  7 +++-
 3 files changed, 44 insertions(+), 16 deletions(-)



More information about the gnucash-changes mailing list