31 #include "gnc-xml-helper.h"
34 #include "sixtp-utils.h"
35 #include "sixtp-parsers.h"
36 #include "sixtp-utils.h"
37 #include "sixtp-dom-parsers.h"
38 #include "sixtp-dom-generators.h"
41 #include "io-gncxml-gen.h"
44 #include "gncBillTermP.h"
45 #include "gncCustomerP.h"
46 #include "gncTaxTableP.h"
47 #include "gnc-customer-xml-v2.h"
48 #include "gnc-address-xml-v2.h"
49 #include "gnc-bill-term-xml-v2.h"
51 #include "xml-helpers.h"
53 #define _GNC_MOD_NAME GNC_ID_CUSTOMER
57 const gchar *customer_version_string =
"2.0.0";
60 #define gnc_customer_string "gnc:GncCustomer"
61 #define cust_name_string "cust:name"
62 #define cust_guid_string "cust:guid"
63 #define cust_id_string "cust:id"
64 #define cust_addr_string "cust:addr"
65 #define cust_shipaddr_string "cust:shipaddr"
66 #define cust_notes_string "cust:notes"
67 #define cust_terms_string "cust:terms"
68 #define cust_taxincluded_string "cust:taxincluded"
69 #define cust_active_string "cust:active"
70 #define cust_discount_string "cust:discount"
71 #define cust_credit_string "cust:credit"
72 #define cust_currency_string "cust:currency"
73 #define cust_taxtable_string "cust:taxtable"
74 #define cust_taxtableoverride_string "cust:use-tt"
75 #define cust_slots_string "cust:slots"
80 xmlNodePtr ret, kvpnode;
85 ret = xmlNewNode(NULL, BAD_CAST gnc_customer_string);
86 xmlSetProp(ret, BAD_CAST
"version", BAD_CAST customer_version_string);
88 xmlAddChild(ret, guid_to_dom_tree(cust_guid_string,
91 xmlAddChild(ret, text_to_dom_tree(cust_name_string,
92 gncCustomerGetName (cust)));
94 xmlAddChild(ret, text_to_dom_tree(cust_id_string,
95 gncCustomerGetID (cust)));
97 xmlAddChild(ret, gnc_address_to_dom_tree(cust_addr_string,
98 gncCustomerGetAddr (cust)));
100 xmlAddChild(ret, gnc_address_to_dom_tree(cust_shipaddr_string,
101 gncCustomerGetShipAddr (cust)));
103 maybe_add_string (ret, cust_notes_string, gncCustomerGetNotes (cust));
105 term = gncCustomerGetTerms (cust);
107 xmlAddChild(ret, guid_to_dom_tree(cust_terms_string,
110 xmlAddChild(ret, text_to_dom_tree(cust_taxincluded_string,
111 gncTaxIncludedTypeToString (
112 gncCustomerGetTaxIncluded (cust))));
114 xmlAddChild(ret, int_to_dom_tree(cust_active_string,
115 gncCustomerGetActive (cust)));
117 num = gncCustomerGetDiscount (cust);
118 xmlAddChild(ret, gnc_numeric_to_dom_tree(cust_discount_string, &num));
120 num = gncCustomerGetCredit (cust);
121 xmlAddChild(ret, gnc_numeric_to_dom_tree(cust_credit_string, &num));
125 commodity_ref_to_dom_tree(cust_currency_string,
126 gncCustomerGetCurrency (cust)));
128 xmlAddChild (ret, int_to_dom_tree (cust_taxtableoverride_string,
129 gncCustomerGetTaxTableOverride (cust)));
130 taxtable = gncCustomerGetTaxTable (cust);
132 xmlAddChild (ret, guid_to_dom_tree (cust_taxtable_string,
135 kvpnode = kvp_frame_to_dom_tree (cust_slots_string,
136 qof_instance_get_slots (QOF_INSTANCE(cust)));
137 if (kvpnode) xmlAddChild (ret, kvpnode);
154 char* txt = dom_tree_to_text(node);
155 g_return_val_if_fail(txt, FALSE);
171 ret = dom_tree_to_integer(node, &val);
173 func(cust, (gboolean)val);
179 customer_name_handler (xmlNodePtr node, gpointer cust_pdata)
183 return set_string(node, pdata->customer, gncCustomerSetName);
187 customer_guid_handler (xmlNodePtr node, gpointer cust_pdata)
193 guid = dom_tree_to_guid(node);
194 g_return_val_if_fail(guid, FALSE);
195 cust = gncCustomerLookup (pdata->book, guid);
198 gncCustomerDestroy (pdata->customer);
199 pdata->customer = cust;
200 gncCustomerBeginEdit (cust);
204 gncCustomerSetGUID(pdata->customer, guid);
213 customer_id_handler (xmlNodePtr node, gpointer cust_pdata)
217 return set_string(node, pdata->customer, gncCustomerSetID);
221 customer_notes_handler (xmlNodePtr node, gpointer cust_pdata)
225 return set_string(node, pdata->customer, gncCustomerSetNotes);
229 customer_terms_handler (xmlNodePtr node, gpointer cust_pdata)
235 guid = dom_tree_to_guid(node);
236 g_return_val_if_fail (guid, FALSE);
237 term = gnc_billterm_xml_find_or_create(pdata->book, guid);
240 gncCustomerSetTerms (pdata->customer, term);
246 customer_addr_handler (xmlNodePtr node, gpointer cust_pdata)
250 return gnc_dom_tree_to_address (node, gncCustomerGetAddr(pdata->customer));
254 customer_shipaddr_handler (xmlNodePtr node, gpointer cust_pdata)
258 return gnc_dom_tree_to_address (node,
259 gncCustomerGetShipAddr(pdata->customer));
264 customer_taxincluded_handler (xmlNodePtr node, gpointer cust_pdata)
271 str = dom_tree_to_text (node);
272 g_return_val_if_fail (str, FALSE);
274 ret = gncTaxIncludedStringToType (str, &type);
278 gncCustomerSetTaxIncluded(pdata->customer, type);
284 customer_active_handler (xmlNodePtr node, gpointer cust_pdata)
287 return set_boolean (node, pdata->customer, gncCustomerSetActive);
291 customer_discount_handler (xmlNodePtr node, gpointer cust_pdata)
296 val = dom_tree_to_gnc_numeric(node);
297 g_return_val_if_fail(val, FALSE);
299 gncCustomerSetDiscount(pdata->customer, *val);
306 customer_credit_handler (xmlNodePtr node, gpointer cust_pdata)
311 val = dom_tree_to_gnc_numeric(node);
312 g_return_val_if_fail(val, FALSE);
314 gncCustomerSetCredit(pdata->customer, *val);
321 customer_currency_handler (xmlNodePtr node, gpointer
customer_pdata)
323 struct customer_pdata *pdata = customer_pdata;
326 com = dom_tree_to_commodity_ref(node, pdata->book);
327 g_return_val_if_fail (com, FALSE);
329 gncCustomerSetCurrency (pdata->customer, com);
335 customer_taxtable_handler (xmlNodePtr node, gpointer cust_pdata)
341 guid = dom_tree_to_guid (node);
342 g_return_val_if_fail (guid, FALSE);
343 taxtable = gncTaxTableLookup (pdata->book, guid);
346 taxtable = gncTaxTableCreate (pdata->book);
347 gncTaxTableBeginEdit (taxtable);
348 gncTaxTableSetGUID (taxtable, guid);
349 gncTaxTableCommitEdit (taxtable);
352 gncTaxTableDecRef (taxtable);
354 gncCustomerSetTaxTable (pdata->customer, taxtable);
360 customer_taxtableoverride_handler (xmlNodePtr node, gpointer cust_pdata)
363 return set_boolean (node, pdata->customer, gncCustomerSetTaxTableOverride);
367 customer_slots_handler (xmlNodePtr node, gpointer cust_pdata)
370 return dom_tree_to_kvp_frame_given (node,
371 qof_instance_get_slots (QOF_INSTANCE(pdata->customer)));
376 { cust_name_string, customer_name_handler, 1, 0 },
377 { cust_guid_string, customer_guid_handler, 1, 0 },
378 { cust_id_string, customer_id_handler, 1, 0 },
379 { cust_addr_string, customer_addr_handler, 1, 0 },
380 { cust_shipaddr_string, customer_shipaddr_handler, 1, 0 },
381 { cust_notes_string, customer_notes_handler, 0, 0 },
382 { cust_terms_string, customer_terms_handler, 0, 0 },
383 { cust_taxincluded_string, customer_taxincluded_handler, 1, 0 },
384 { cust_active_string, customer_active_handler, 1, 0 },
385 { cust_discount_string, customer_discount_handler, 1, 0 },
386 { cust_credit_string, customer_credit_handler, 1, 0 },
387 { cust_currency_string, customer_currency_handler, 0, 0 },
388 {
"cust:commodity", customer_currency_handler, 0, 0 },
389 { cust_taxtable_string, customer_taxtable_handler, 0, 0 },
390 { cust_taxtableoverride_string, customer_taxtableoverride_handler, 0, 0 },
391 { cust_slots_string, customer_slots_handler, 0, 0 },
396 dom_tree_to_customer (xmlNodePtr node,
QofBook *book)
401 cust_pdata.customer = gncCustomerCreate(book);
402 cust_pdata.book = book;
403 gncCustomerBeginEdit (cust_pdata.customer);
405 successful = dom_tree_generic_parse (node, customer_handlers_v2,
409 gncCustomerCommitEdit (cust_pdata.customer);
412 PERR (
"failed to parse customer tree");
413 gncCustomerDestroy (cust_pdata.customer);
414 cust_pdata.customer = NULL;
417 return cust_pdata.customer;
421 gnc_customer_end_handler(gpointer data_for_children,
422 GSList* data_from_children, GSList* sibling_data,
423 gpointer parent_data, gpointer global_data,
424 gpointer *result,
const gchar *tag)
427 xmlNodePtr tree = (xmlNodePtr)data_for_children;
429 QofBook *book = gdata->bookdata;
444 g_return_val_if_fail(tree, FALSE);
446 cust = dom_tree_to_customer(tree, book);
449 gdata->cb(tag, gdata->parsedata, cust);
458 customer_sixtp_parser_create(
void)
460 return sixtp_dom_parser_new(gnc_customer_end_handler, NULL, NULL);
469 id = gncCustomerGetID (customer);
470 if (
id == NULL || *
id ==
'\0')
479 int *count = count_p;
480 if (customer_should_be_saved ((
GncCustomer *)cust_p))
485 customer_get_count (
QofBook *book)
493 xml_add_customer (
QofInstance * cust_p, gpointer out_p)
501 if (!customer_should_be_saved (cust))
504 node = customer_dom_tree_create (cust);
505 xmlElemDump(out, NULL, node);
507 if (ferror(out) || fprintf(out,
"\n") < 0)
512 customer_write (FILE *out,
QofBook *book)
515 return ferror(out) == 0;
519 customer_ns(FILE *out)
521 g_return_val_if_fail(out, FALSE);
526 gnc_customer_xml_initialize (
void)
530 GNC_FILE_BACKEND_VERS,
532 customer_sixtp_parser_create,
gboolean qof_object_register_backend(QofIdTypeConst type_name, const char *backend_name, gpointer be_data)
const GncGUID * qof_instance_get_guid(gconstpointer)
#define PERR(format, args...)
void qof_object_foreach_sorted(QofIdTypeConst type_name, QofBook *book, QofInstanceForeachCB cb, gpointer user_data)
api for GnuCash version 2 XML-based file format
void qof_object_foreach(QofIdTypeConst type_name, QofBook *book, QofInstanceForeachCB cb, gpointer user_data)
gboolean gnc_xml2_write_namespace_decl(FILE *out, const char *name_space)
const gchar * QofLogModule