[Gnucash-changes] Completing the Chart of Accounts QSF Export.

Neil Williams codehelp at cvs.gnucash.org
Sat Mar 26 12:39:55 EST 2005


Log Message:
-----------
Completing the Chart of Accounts QSF Export.
Support for multiple references per entity.
Use string values for enum types in Account.

Tags:
----
gnucash-gnome2-dev

Modified Files:
--------------
    gnucash:
        ChangeLog
    gnucash/src/backend/qsf:
        qsf-backend.c
    gnucash/src/business/business-gnome:
        gnc-plugin-business.c
    gnucash/src/engine:
        Account.c
        Account.h
        Transaction.c
        Transaction.h
        qofclass.c
        qofsession.c
    gnucash/src/gnome:
        dialog-chart-export.c

Revision Data
-------------
Index: ChangeLog
===================================================================
RCS file: /home/cvs/cvsroot/gnucash/ChangeLog,v
retrieving revision 1.1487.2.184
retrieving revision 1.1487.2.185
diff -LChangeLog -LChangeLog -u -r1.1487.2.184 -r1.1487.2.185
--- ChangeLog
+++ ChangeLog
@@ -1,3 +1,20 @@
+2005-03-25  Neil Williams <linux at codehelp.co.uk>
+	* src/backend/qsf/qsf-backend.c: Support for
+	multiple references in the same entity.
+	* src/business/business-gnome/gnc-plugin-business.c:
+	Typo in employee export collection.
+	* src/engine/Account.c:
+	* src/engine/Account.h: qofAccountGetTypeString
+	and qofAccountSetType to use string values for
+	enum types in QOF.
+	* src/engine/Transaction.c:
+	* src/engine/Transaction.h: qofSplitSetParentTrans
+	and qofSplitSetAccount QOF reference QofSetterFunc.
+	* src/engine/qofclass.c: Fixing reference identification.
+	* src/engine/qofsession.c: Removing debug calls. Minor fix.
+	* src/gnome/dialog-chart-export.c: Adding references to
+	generated Transaction and Splits in Chart of Accounts export.
+	
 2005-03-21  Neil Williams <linux at codehelp.co.uk>
 	* src/backend/qsf/qsf-backend.c: 
 	* src/backend/qsf/qsf-xml.c:
Index: Transaction.h
===================================================================
RCS file: /home/cvs/cvsroot/gnucash/src/engine/Transaction.h,v
retrieving revision 1.141.4.8
retrieving revision 1.141.4.9
diff -Lsrc/engine/Transaction.h -Lsrc/engine/Transaction.h -u -r1.141.4.8 -r1.141.4.9
--- src/engine/Transaction.h
+++ src/engine/Transaction.h
@@ -921,6 +921,10 @@
 
 #define RECONCILED_MATCH_TYPE	"reconciled-match"
 
+/* QOF only */
+void qofSplitSetParentTrans(Split *s, QofEntity *ent);
+void qofSplitSetAccount(Split *s, QofEntity *ent);
+
 /** deprecated rouitines */
 #define xaccSplitGetGUID(X)      qof_entity_get_guid(QOF_ENTITY(X))
 #define xaccSplitReturnGUID(X) (X ? *(qof_entity_get_guid(QOF_ENTITY(X))) : *(guid_null()))
Index: Transaction.c
===================================================================
RCS file: /home/cvs/cvsroot/gnucash/src/engine/Transaction.c,v
retrieving revision 1.261.4.7
retrieving revision 1.261.4.8
diff -Lsrc/engine/Transaction.c -Lsrc/engine/Transaction.c -u -r1.261.4.7 -r1.261.4.8
--- src/engine/Transaction.c
+++ src/engine/Transaction.c
@@ -3221,7 +3221,7 @@
   mark_clean:              NULL,
   foreach:                 qof_collection_foreach,
   printable:               (const char* (*)(gpointer)) xaccSplitGetMemo,
-  version_cmp:             NULL,
+  version_cmp:             (int (*)(gpointer, gpointer)) qof_instance_version_cmp,
 };
 
 static gpointer 
@@ -3249,6 +3249,26 @@
   return obj;
 }
 
+void
+qofSplitSetParentTrans(Split *s, QofEntity *ent)
+{
+	Transaction *trans;
+
+	trans = (Transaction*)ent;
+	g_return_if_fail(trans != NULL);
+	xaccTransAppendSplit(trans, s);
+}
+
+void
+qofSplitSetAccount(Split *s, QofEntity *ent)
+{
+	Account *acc;
+
+	acc = (Account*)ent;
+	g_return_if_fail(acc != NULL);
+	xaccAccountInsertSplit(acc, s);
+}
+
 gboolean xaccSplitRegister (void)
 {
   static const QofParam params[] = {
@@ -3257,29 +3277,23 @@
 
     /* d-* are depricated query params, should not be used in new
      * queries, should be removed from old queries. */
-    { "d-share-amount", QOF_TYPE_DOUBLE,
-      (QofAccessFunc)DxaccSplitGetShareAmount, NULL },
+    { "d-share-amount", QOF_TYPE_DOUBLE,  (QofAccessFunc)DxaccSplitGetShareAmount, NULL },
     { "d-share-int64", QOF_TYPE_INT64, (QofAccessFunc)qof_entity_get_guid, NULL },
     { SPLIT_BALANCE, QOF_TYPE_NUMERIC, (QofAccessFunc)xaccSplitGetBalance, NULL },
-    { SPLIT_CLEARED_BALANCE, QOF_TYPE_NUMERIC,
-      (QofAccessFunc)xaccSplitGetClearedBalance, NULL },
-    { SPLIT_RECONCILED_BALANCE, QOF_TYPE_NUMERIC,
-      (QofAccessFunc)xaccSplitGetReconciledBalance, NULL },
+    { SPLIT_CLEARED_BALANCE, QOF_TYPE_NUMERIC,(QofAccessFunc)xaccSplitGetClearedBalance, NULL },
+    { SPLIT_RECONCILED_BALANCE, QOF_TYPE_NUMERIC,(QofAccessFunc)xaccSplitGetReconciledBalance, NULL },
     { SPLIT_MEMO, QOF_TYPE_STRING, (QofAccessFunc)xaccSplitGetMemo, (QofSetterFunc)xaccSplitSetMemo },
     { SPLIT_ACTION, QOF_TYPE_STRING, (QofAccessFunc)xaccSplitGetAction, (QofSetterFunc)xaccSplitSetAction },
     { SPLIT_RECONCILE, QOF_TYPE_CHAR, (QofAccessFunc)xaccSplitGetReconcile, (QofSetterFunc)xaccSplitSetReconcile },
     { SPLIT_AMOUNT, QOF_TYPE_NUMERIC, (QofAccessFunc)xaccSplitGetAmount, (QofSetterFunc)xaccSplitSetAmount },
-    { SPLIT_SHARE_PRICE, QOF_TYPE_NUMERIC,
-      (QofAccessFunc)xaccSplitGetSharePrice, (QofSetterFunc)xaccSplitSetSharePrice },
+    { SPLIT_SHARE_PRICE, QOF_TYPE_NUMERIC,(QofAccessFunc)xaccSplitGetSharePrice, (QofSetterFunc)xaccSplitSetSharePrice },
     { SPLIT_VALUE, QOF_TYPE_DEBCRED, (QofAccessFunc)xaccSplitGetValue, (QofSetterFunc)xaccSplitSetValue },
     { SPLIT_TYPE, QOF_TYPE_STRING, (QofAccessFunc)xaccSplitGetType, NULL },
-    { SPLIT_VOIDED_AMOUNT, QOF_TYPE_NUMERIC,
-      (QofAccessFunc)xaccSplitVoidFormerAmount, NULL },
-    { SPLIT_VOIDED_VALUE, QOF_TYPE_NUMERIC,
-      (QofAccessFunc)xaccSplitVoidFormerValue, NULL },
+    { SPLIT_VOIDED_AMOUNT, QOF_TYPE_NUMERIC, (QofAccessFunc)xaccSplitVoidFormerAmount, NULL },
+    { SPLIT_VOIDED_VALUE, QOF_TYPE_NUMERIC,  (QofAccessFunc)xaccSplitVoidFormerValue, NULL },
     { SPLIT_LOT, GNC_ID_LOT, (QofAccessFunc)xaccSplitGetLot, NULL },
-    { SPLIT_TRANS, GNC_ID_TRANS, (QofAccessFunc)xaccSplitGetParent, NULL },
-    { SPLIT_ACCOUNT, GNC_ID_ACCOUNT, (QofAccessFunc)xaccSplitGetAccount, NULL },
+    { SPLIT_TRANS,     GNC_ID_TRANS,     (QofAccessFunc)xaccSplitGetParent,    (QofSetterFunc)qofSplitSetParentTrans },
+    { SPLIT_ACCOUNT,   GNC_ID_ACCOUNT,   (QofAccessFunc)xaccSplitGetAccount,   (QofSetterFunc)qofSplitSetAccount },
     { SPLIT_ACCOUNT_GUID, QOF_TYPE_GUID, split_account_guid_getter, NULL },
 /*  these are no-ops to register the parameter names (for sorting) but
     they return an allocated object which getters cannot do.  */
@@ -3338,15 +3352,15 @@
     { TRANS_DATE_DUE, QOF_TYPE_DATE, (QofAccessFunc)xaccTransRetDateDueTS, (QofSetterFunc)xaccTransSetDateDueTS },
     { TRANS_IMBALANCE, QOF_TYPE_NUMERIC, (QofAccessFunc)xaccTransGetImbalance,NULL },
     { TRANS_NOTES, QOF_TYPE_STRING, (QofAccessFunc)xaccTransGetNotes, (QofSetterFunc)xaccTransSetNotes },
-    { TRANS_IS_BALANCED, QOF_TYPE_BOOLEAN, (QofAccessFunc)trans_is_balanced_p,NULL },
+    { TRANS_IS_BALANCED, QOF_TYPE_BOOLEAN, (QofAccessFunc)trans_is_balanced_p, NULL },
     { TRANS_TYPE, QOF_TYPE_CHAR, (QofAccessFunc)xaccTransGetTxnType, (QofSetterFunc)xaccTransSetTxnType },
     { TRANS_VOID_STATUS, QOF_TYPE_BOOLEAN, (QofAccessFunc)xaccTransGetVoidStatus,NULL },
     { TRANS_VOID_REASON, QOF_TYPE_STRING, (QofAccessFunc)xaccTransGetVoidReason,NULL },
-    { TRANS_VOID_TIME, QOF_TYPE_DATE, (QofAccessFunc)xaccTransGetVoidTime,NULL },
-    { TRANS_SPLITLIST, GNC_ID_SPLIT, (QofAccessFunc)xaccTransGetSplitList,NULL },
-    { TRANS_KVP, QOF_TYPE_KVP, (QofAccessFunc)qof_instance_get_slots,NULL },
-    { QOF_PARAM_BOOK, QOF_ID_BOOK, (QofAccessFunc)qof_instance_get_book,NULL },
-    { QOF_PARAM_GUID, QOF_TYPE_GUID, (QofAccessFunc)qof_entity_get_guid,NULL },
+    { TRANS_VOID_TIME, QOF_TYPE_DATE,    (QofAccessFunc)xaccTransGetVoidTime,   NULL },
+    { TRANS_SPLITLIST, GNC_ID_SPLIT,     (QofAccessFunc)xaccTransGetSplitList,  NULL },
+    { TRANS_KVP,       QOF_TYPE_KVP,     (QofAccessFunc)qof_instance_get_slots, NULL },
+    { QOF_PARAM_BOOK,  QOF_ID_BOOK,      (QofAccessFunc)qof_instance_get_book,  NULL },
+    { QOF_PARAM_GUID,  QOF_TYPE_GUID,    (QofAccessFunc)qof_entity_get_guid,    NULL },
     { NULL },
   };
 
Index: Account.c
===================================================================
RCS file: /home/cvs/cvsroot/gnucash/src/engine/Account.c,v
retrieving revision 1.222.4.10
retrieving revision 1.222.4.11
diff -Lsrc/engine/Account.c -Lsrc/engine/Account.c -u -r1.222.4.10 -r1.222.4.11
--- src/engine/Account.c
+++ src/engine/Account.c
@@ -1470,6 +1470,22 @@
    return (acc->type);
 }
 
+const char*
+qofAccountGetTypeString (Account *acc)
+{
+	if(!acc) { return NULL; }
+	return (xaccAccountTypeEnumAsString(acc->type));
+}
+
+void
+qofAccountSetType (Account *acc, const char *type_string)
+{
+	GNCAccountType type;
+
+	type = xaccAccountStringToEnum(type_string);
+	xaccAccountSetType(acc, type);
+}
+
 const char *
 xaccAccountGetName (Account *acc)
 {
@@ -2877,12 +2893,12 @@
     { ACCOUNT_BALANCE_, 		QOF_TYPE_NUMERIC, (QofAccessFunc)xaccAccountGetBalance, 		NULL },
     { ACCOUNT_CLEARED_, 		QOF_TYPE_NUMERIC, (QofAccessFunc)xaccAccountGetClearedBalance, 	NULL },
     { ACCOUNT_RECONCILED_,	 	QOF_TYPE_NUMERIC, (QofAccessFunc)xaccAccountGetReconciledBalance, NULL },
-	{ ACCOUNT_TYPE_, 			QOF_TYPE_INT32,   (QofAccessFunc)xaccAccountGetType, 			(QofSetterFunc)xaccAccountSetType },
-    { ACCOUNT_FUTURE_MINIMUM_, 	QOF_TYPE_NUMERIC, (QofAccessFunc)xaccAccountGetProjectedMinimumBalance, NULL },
+   { ACCOUNT_TYPE_,          QOF_TYPE_STRING,  (QofAccessFunc)qofAccountGetTypeString,   (QofSetterFunc)qofAccountSetType },
+   { ACCOUNT_FUTURE_MINIMUM_,QOF_TYPE_NUMERIC, (QofAccessFunc)xaccAccountGetProjectedMinimumBalance, NULL },
     { ACCOUNT_TAX_RELATED, 		QOF_TYPE_BOOLEAN, (QofAccessFunc)xaccAccountGetTaxRelated, 		(QofSetterFunc) xaccAccountSetTaxRelated },
-	{ ACCOUNT_SCU, 				QOF_TYPE_INT32,   (QofAccessFunc)xaccAccountGetCommoditySCU, 	(QofSetterFunc)xaccAccountSetCommoditySCU },
+   { ACCOUNT_SCU,            QOF_TYPE_INT32,   (QofAccessFunc)xaccAccountGetCommoditySCU,(QofSetterFunc)xaccAccountSetCommoditySCU },
 	{ ACCOUNT_NSCU, 			QOF_TYPE_BOOLEAN, (QofAccessFunc)xaccAccountGetNonStdSCU, 		(QofSetterFunc)xaccAccountSetNonStdSCU },
-	{ ACCOUNT_PARENT,			GNC_ID_ACCOUNT,	  (QofAccessFunc)xaccAccountGetParentAccount,	(QofSetterFunc)qofAccountSetParent },
+   { ACCOUNT_PARENT,         GNC_ID_ACCOUNT,   (QofAccessFunc)xaccAccountGetParentAccount,(QofSetterFunc)qofAccountSetParent },
     { QOF_PARAM_BOOK, 			QOF_ID_BOOK, 	  (QofAccessFunc)qof_instance_get_book, 		NULL },
     { QOF_PARAM_GUID, 			QOF_TYPE_GUID,    (QofAccessFunc)qof_instance_get_guid, 		NULL },
     { ACCOUNT_KVP, 				QOF_TYPE_KVP, 	  (QofAccessFunc)qof_instance_get_slots, 		NULL },
Index: qofsession.c
===================================================================
RCS file: /home/cvs/cvsroot/gnucash/src/engine/qofsession.c,v
retrieving revision 1.2.4.13
retrieving revision 1.2.4.14
diff -Lsrc/engine/qofsession.c -Lsrc/engine/qofsession.c -u -r1.2.4.13 -r1.2.4.14
--- src/engine/qofsession.c
+++ src/engine/qofsession.c
@@ -335,21 +335,28 @@
 	return FALSE;
 }
 
+static void
+qof_book_set_partial(QofBook *book)
+{
+	gboolean partial;
+
+	partial = (gboolean)qof_book_get_data(book, PARTIAL_QOFBOOK);
+	if(!partial) {
+		qof_book_set_data(book, PARTIAL_QOFBOOK, (gboolean*)TRUE);
+	}
+}
+
 void
 qof_session_update_reference_list(QofSession *session, QofEntityReference *reference)
 {
 	QofBook  *book;
 	GList    *book_ref_list;
-	gboolean partial;
 
 	book = qof_session_get_book(session);
 	book_ref_list = (GList*)qof_book_get_data(book, ENTITYREFERENCE);
 	book_ref_list = g_list_append(book_ref_list, reference);
 	qof_book_set_data(book, ENTITYREFERENCE, book_ref_list);
-	partial = (gboolean)qof_book_get_data(book, PARTIAL_QOFBOOK);
-	if(!partial) {
-		qof_book_set_data(book, PARTIAL_QOFBOOK, (gboolean*)TRUE);
-	}
+	qof_book_set_partial(book);
 }
 
 static void
@@ -371,6 +378,7 @@
 {
 	QofEntityReference *reference;
 	QofEntity    *ref_ent;
+	QofParam     *copy_param;
 	const GUID   *cm_guid;
 	char         cm_sa[GUID_ENCODING_LENGTH + 1];
 	gchar        *cm_string;
@@ -381,7 +389,10 @@
 		reference->type = g_strdup(ent->e_type);
 		reference->ref_guid = g_new(GUID, 1);
 		reference->ent_guid = &ent->guid;
-		reference->param = param;
+		copy_param = g_new0(QofParam, 1);
+		copy_param->param_name = g_strdup(param->param_name);
+		copy_param->param_type = g_strdup(param->param_type);
+		reference->param = copy_param;
 		cm_guid = qof_entity_get_guid(ref_ent);
 		guid_to_string_buff(cm_guid, cm_sa);
 		cm_string = g_strdup(cm_sa);
@@ -433,7 +444,6 @@
 	registered_type = FALSE;
 	cm_param = (QofParam*) data;
 	g_return_if_fail(cm_param != NULL);
-	ENTER (" cm_param->param_type=%s\tname=%s", cm_param->param_type, cm_param->param_name);
 	if(safe_strcmp(cm_param->param_type, QOF_TYPE_STRING) == 0)  { 
 		cm_string = g_strdup(cm_param->param_getfcn(importEnt, cm_param));
 		string_setter = (void(*)(QofEntity*, const char*))cm_param->param_setfcn;
@@ -512,7 +522,6 @@
 		context->error = FALSE;
 	}
 	if(registered_type == FALSE) {
-		PINFO (" cm_param type=%s", cm_param->param_type);
 		referenceEnt = cm_param->param_getfcn(importEnt, cm_param);
 		reference = qof_entity_get_reference_from(importEnt, cm_param);
 		if(reference) {
@@ -620,6 +629,7 @@
 	qecd.param_list = NULL;
 	book = qof_session_get_book(new_session);
 	qecd.new_session = new_session;
+	qof_book_set_partial(book);
 	qecd.error = FALSE;
 	inst = (QofInstance*)qof_object_new_instance(original->e_type, book);
 	qecd.to = &inst->entity;
@@ -644,6 +654,7 @@
 	gnc_engine_suspend_events();
 	qecd.param_list = NULL;
 	qecd.new_session = new_session;
+	qof_book_set_partial(qof_session_get_book(qecd.new_session));
 	qecd.error = FALSE;
 	for(e=entity_list; e; e=e->next)
 	{
@@ -665,6 +676,7 @@
 	gnc_engine_suspend_events();
 	qecd.param_list = NULL;
 	qecd.new_session = new_session;
+	qof_book_set_partial(qof_session_get_book(qecd.new_session));
 	qecd.error = FALSE;
 	qof_collection_foreach(entity_coll, qof_entity_coll_foreach, &qecd);
 	if(qecd.error == TRUE) return FALSE;
Index: qofclass.c
===================================================================
RCS file: /home/cvs/cvsroot/gnucash/src/engine/qofclass.c,v
retrieving revision 1.1.6.3
retrieving revision 1.1.6.4
diff -Lsrc/engine/qofclass.c -Lsrc/engine/qofclass.c -u -r1.1.6.3 -r1.1.6.4
--- src/engine/qofclass.c
+++ src/engine/qofclass.c
@@ -250,12 +250,18 @@
   g_hash_table_foreach (param_ht, param_foreach_cb, &iter);
 }
 
+struct param_ref_list
+{
+	GList *ref_list;
+};
+
 static void
 find_reference_param(QofParam *param, gpointer user_data)
 {
-	GList *ref_list;
+	struct param_ref_list *b;
 
-	ref_list = (GList*)user_data;
+	b = (struct param_ref_list*)user_data;
+	if((param->param_getfcn == NULL)||(param->param_setfcn == NULL)) { return; }
 	if(0 == safe_strcmp(param->param_type, QOF_TYPE_STRING))   { return; }
 	if(0 == safe_strcmp(param->param_type, QOF_TYPE_NUMERIC))  { return; }
 	if(0 == safe_strcmp(param->param_type, QOF_TYPE_DATE))     { return; }
@@ -266,16 +272,22 @@
 	if(0 == safe_strcmp(param->param_type, QOF_TYPE_INT64))    { return; }
 	if(0 == safe_strcmp(param->param_type, QOF_TYPE_DOUBLE))   { return; }
 	if(0 == safe_strcmp(param->param_type, QOF_TYPE_KVP))      { return; }
-	ref_list = g_list_append(ref_list, param);
+	if(0 == safe_strcmp(param->param_type, QOF_TYPE_BOOLEAN))  { return; }
+	if(0 == safe_strcmp(param->param_type, QOF_ID_BOOK))       { return; }
+	b->ref_list = g_list_append(b->ref_list, param);
 }
 
 GList*
 qof_class_get_referenceList(QofIdTypeConst type)
 {
 	GList *ref_list;
+	struct param_ref_list b;
 
 	ref_list = NULL;
-	qof_class_param_foreach(type, find_reference_param, ref_list);
+	b.ref_list = NULL;
+	qof_class_param_foreach(type, find_reference_param, &b);
+	ref_list = g_list_copy(b.ref_list);
+	g_list_free(b.ref_list);
 	return ref_list;
 }
 
Index: Account.h
===================================================================
RCS file: /home/cvs/cvsroot/gnucash/src/engine/Account.h,v
retrieving revision 1.110.4.9
retrieving revision 1.110.4.10
diff -Lsrc/engine/Account.h -Lsrc/engine/Account.h -u -r1.110.4.9 -r1.110.4.10
--- src/engine/Account.h
+++ src/engine/Account.h
@@ -227,6 +227,8 @@
 */
 void qofAccountSetParent (Account *, QofEntity *);
 
+const char* qofAccountGetTypeString (Account *acc);
+void qofAccountSetType (Account *acc, const char *type_string);
 
 /** Get the account's name */
 const char *   xaccAccountGetName (Account *account);
Index: gnc-plugin-business.c
===================================================================
RCS file: /home/cvs/cvsroot/gnucash/src/business/business-gnome/Attic/gnc-plugin-business.c,v
retrieving revision 1.1.2.5
retrieving revision 1.1.2.6
diff -Lsrc/business/business-gnome/gnc-plugin-business.c -Lsrc/business/business-gnome/gnc-plugin-business.c -u -r1.1.2.5 -r1.1.2.6
--- src/business/business-gnome/gnc-plugin-business.c
+++ src/business/business-gnome/gnc-plugin-business.c
@@ -737,7 +737,7 @@
 	{
 		filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (qsffilechooser));
 		qof_session_begin(chart_session, filename, TRUE, TRUE);
-		coll = qof_book_get_collection(book, GNC_ID_INVOICE);
+		coll = qof_book_get_collection(book, GNC_ID_EMPLOYEE);
 		success = qof_entity_copy_coll(chart_session, coll);
 		if(success) 
 		{ 
Index: qsf-backend.c
===================================================================
RCS file: /home/cvs/cvsroot/gnucash/src/backend/qsf/Attic/qsf-backend.c,v
retrieving revision 1.1.2.5
retrieving revision 1.1.2.6
diff -Lsrc/backend/qsf/qsf-backend.c -Lsrc/backend/qsf/qsf-backend.c -u -r1.1.2.5 -r1.1.2.6
--- src/backend/qsf/qsf-backend.c
+++ src/backend/qsf/qsf-backend.c
@@ -132,10 +132,15 @@
 qsf_session_end( QofBackend *be)
 {
 	QSFBackend *qsf_be;
+	GList *book_ref_list;
+	QofBook *book;
 	
 	qsf_be = (QSFBackend*)be;
 	g_return_if_fail(qsf_be != NULL);
-
+	book = qsf_be->params->book;
+	book_ref_list = (GList*)qof_book_get_data(book, ENTITYREFERENCE);
+	g_list_free(book_ref_list);
+	qof_book_set_data(book, PARTIAL_QOFBOOK, (gboolean*)FALSE);
 	qsf_free_params(qsf_be->params);
 	g_free(qsf_be->fullpath);
 	qsf_be->fullpath = NULL;
@@ -392,13 +397,14 @@
 	const QofEntityReference *aa;
 	const QofEntityReference *bb;
 
-	aa = (QofEntityReference*)a;
+	aa = (QofEntityReference*) a;
 	bb = (QofEntityReference*) b;
-	g_return_val_if_fail((aa != NULL), 1);
+	if(aa == NULL) { return 1; }
 	g_return_val_if_fail((bb != NULL), 1);
 	g_return_val_if_fail((aa->type != NULL), 1);
 	if((0 == guid_compare(bb->ent_guid, aa->ent_guid))
-		&&(0 == safe_strcmp(bb->type, aa->type)))
+		&&(0 == safe_strcmp(bb->type, aa->type))
+		&&(0 == safe_strcmp(bb->param->param_name, aa->param->param_name)))
 	{
 		return 0;
 	}
@@ -422,6 +428,46 @@
 	return ent_ref;
 }
 
+static void
+reference_list_lookup(gpointer data, gpointer user_data)
+{
+	QofEntity *ent;
+	QofParam *ref_param;
+	QofEntityReference *reference, *starter;
+	qsf_param  *params;
+	xmlNodePtr node, object_node;
+	xmlNsPtr ns;
+	GList *copy_list;
+	gchar qsf_guid[GUID_ENCODING_LENGTH + 1], *ref_name;
+
+	params = (qsf_param*)user_data;
+	ref_param = (QofParam*)data;
+	object_node = params->output_node;
+	ent = params->qsf_ent;
+	ns = params->qsf_ns;
+	starter = g_new(QofEntityReference, 1);
+	starter->ent_guid = qof_entity_get_guid(ent);
+	starter->type = g_strdup(ent->e_type);
+	starter->param = ref_param;
+	starter->ref_guid = NULL;
+	copy_list = g_list_copy(params->referenceList);
+	reference = qof_reference_lookup(copy_list, starter);
+	g_free(starter);
+	if(reference != NULL) {
+		if((ref_param->param_getfcn == NULL)||(ref_param->param_setfcn == NULL))
+		{
+			return;
+		}
+		ref_name = g_strdup(reference->param->param_name);
+		node = xmlAddChild(object_node, xmlNewNode(ns, QOF_TYPE_GUID));
+		guid_to_string_buff(reference->ref_guid, qsf_guid);
+		xmlNodeAddContent(node, qsf_guid);
+		xmlNewProp(node, QSF_OBJECT_TYPE ,ref_name);
+		g_free(ref_name);
+	}
+}
+
+
 /*=====================================
 	Convert QofEntity to QSF XML node
 qof_param holds the parameter sequence.
@@ -429,12 +475,12 @@
 static void
 qsf_entity_foreach(QofEntity *ent, gpointer data)
 {
-	QofEntityReference *reference, *starter;
 	qsf_param  *params;
 	GSList     *param_list, *supported;
+	GList      *ref;
 	xmlNodePtr node, object_node;
 	xmlNsPtr   ns;
-	gchar      *string_buffer, qsf_guid[GUID_ENCODING_LENGTH + 1], *ref_name;
+	gchar      *string_buffer;
 	GString    *buffer;
 	QofParam   *qof_param;
 	KvpFrame   *qsf_kvp;
@@ -469,35 +515,15 @@
 				xmlNewProp(node, QSF_OBJECT_TYPE , QOF_PARAM_GUID);
 				own_guid = TRUE;
 			}
-			PINFO (" own_guid=%d ent->e_type=%s qof_param->param_name=%s",
-				own_guid, ent->e_type, qof_param->param_name);
-/*			if((qof_param->param_setfcn != NULL) && (qof_param->param_getfcn != NULL))
-			{*/
-				starter = g_new(QofEntityReference, 1);
-				starter->ent_guid = qof_entity_get_guid(ent);
-				/* Reading ent->e_type can seg fault if the above check on get() and set() is removed. */
-				/* Some entities seem to be invalid artefacts. Why? */
-				starter->type = g_strdup(ent->e_type);
-				starter->param = qof_param;
-				starter->ref_guid = NULL;
-				reference = qof_reference_lookup(params->referenceList, starter);
-				g_free(starter);
-			if(reference != NULL) {
-					ref_name = g_strdup(reference->param->param_name);
-					node = xmlAddChild(object_node, xmlNewNode(ns, QOF_TYPE_GUID));
-					guid_to_string_buff(reference->ref_guid, qsf_guid);
-					PINFO ("reference found=%s %s %s", ref_name, qsf_guid, reference->type);
-					xmlNodeAddContent(node, qsf_guid);
-					xmlNewProp(node, QSF_OBJECT_TYPE ,ref_name);
-					g_free(ref_name);
+			params->qsf_ent = ent;
+			params->output_node = object_node;
+			ref = qof_class_get_referenceList(ent->e_type);
+			if(ref != NULL) {
+				g_list_foreach(ref, reference_list_lookup, params);
 			}
-				param_list = g_slist_next(param_list);
-				continue;
-/*			}*/
 		}
 		if(0 == safe_strcmp(qof_param->param_type, QOF_TYPE_KVP))
 		{
-			/** Special KVP handling - the book_merge function doesn't render KVP */
 			qsf_kvp = kvp_frame_copy(qof_param->param_getfcn(ent,qof_param));
 			params->qof_param = qof_param;
 			params->output_node = object_node;
@@ -775,7 +801,6 @@
 	qsf_ent = params->qsf_ent;
 	targetBook = params->book;
 	obj_type = xmlGetProp(node->parent, QSF_OBJECT_TYPE);
-	ENTER (" ");
 	if(0 == safe_strcasecmp(obj_type, parameter_name)) { return; }
 	cm_setter = qof_class_get_parameter_setter(obj_type, parameter_name);
 	cm_param = qof_class_get_parameter(obj_type, parameter_name);
Index: dialog-chart-export.c
===================================================================
RCS file: /home/cvs/cvsroot/gnucash/src/gnome/Attic/dialog-chart-export.c,v
retrieving revision 1.1.2.2
retrieving revision 1.1.2.3
diff -Lsrc/gnome/dialog-chart-export.c -Lsrc/gnome/dialog-chart-export.c -u -r1.1.2.2 -r1.1.2.3
--- src/gnome/dialog-chart-export.c
+++ src/gnome/dialog-chart-export.c
@@ -103,6 +103,8 @@
 	QofCollection *coll;
 	const GUID *guid;
 	time_t trans_time;
+	GList *ref;
+	QofEntityReference *ent_ref;
 	
 	g_return_if_fail(user_data != NULL);
 	data = (chart_data*)user_data;
@@ -110,6 +112,7 @@
 	data->param_ref_list = NULL;
 	guid = qof_entity_get_guid(ent);
 	acc_ent = (Account*)ent;
+	ref = NULL;
 	equity_account = data->equity_account;
 	g_return_if_fail(equity_account != NULL);
 	balance = xaccAccountGetBalanceAsOfDate(acc_ent, data->chart_time_t);
@@ -131,12 +134,21 @@
 	xaccTransSetDateSecs (trans, trans_time);
 	xaccTransSetDateEnteredSecs (trans, trans_time);
 	xaccTransSetDescription (trans, OPENING_BALANCE_DESC);
+	/* User account split */
 	split = xaccMallocSplit (book);
 	xaccTransAppendSplit (trans, split);
 	xaccAccountInsertSplit (acc_ent, split);
 	xaccSplitSetAmount (split, balance);
 	xaccSplitSetValue (split, balance);
+	ref = qof_class_get_referenceList(GNC_ID_SPLIT);
+	while(ref != NULL) {
+		ent_ref = qof_entity_get_reference_from((QofEntity*)split, ref->data);
+		qof_session_update_reference_list(data->chart_session, ent_ref);
+		ref = g_list_next(ref);
+	}
+	g_list_free(ref);
 	balance = gnc_numeric_neg (balance);
+	/* Equity account split */
 	split = xaccMallocSplit (book);
 	xaccTransAppendSplit (trans, split);
 	xaccAccountInsertSplit (equity_account, split);
@@ -145,6 +157,20 @@
 	xaccTransCommitEdit (trans);
 	xaccAccountCommitEdit (equity_account);
 	xaccAccountCommitEdit (acc_ent);
+	ref = qof_class_get_referenceList(GNC_ID_TRANS);
+	while(ref != NULL) {
+		ent_ref = qof_entity_get_reference_from((QofEntity*)trans, ref->data);
+		qof_session_update_reference_list(data->chart_session, ent_ref);
+		ref = g_list_next(ref);
+	}
+	g_list_free(ref);
+	ref = qof_class_get_referenceList(GNC_ID_SPLIT);
+	while(ref != NULL) {
+		ent_ref = qof_entity_get_reference_from((QofEntity*)split, ref->data);
+		qof_session_update_reference_list(data->chart_session, ent_ref);
+		ref = g_list_next(ref);
+	}
+	g_list_free(ref);
 }
 
 static GtkWidget *


More information about the gnucash-changes mailing list