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 "gncInvoiceP.h"
46 #include "gnc-invoice-xml-v2.h"
47 #include "gnc-owner-xml-v2.h"
48 #include "gnc-bill-term-xml-v2.h"
50 #define _GNC_MOD_NAME GNC_ID_INVOICE
54 const gchar *invoice_version_string =
"2.0.0";
57 #define gnc_invoice_string "gnc:GncInvoice"
58 #define invoice_guid_string "invoice:guid"
59 #define invoice_id_string "invoice:id"
60 #define invoice_owner_string "invoice:owner"
61 #define invoice_opened_string "invoice:opened"
62 #define invoice_posted_string "invoice:posted"
63 #define invoice_terms_string "invoice:terms"
64 #define invoice_billing_id_string "invoice:billing_id"
65 #define invoice_notes_string "invoice:notes"
66 #define invoice_active_string "invoice:active"
67 #define invoice_posttxn_string "invoice:posttxn"
68 #define invoice_postlot_string "invoice:postlot"
69 #define invoice_postacc_string "invoice:postacc"
70 #define invoice_currency_string "invoice:currency"
71 #define invoice_billto_string "invoice:billto"
72 #define invoice_tochargeamt_string "invoice:charge-amt"
73 #define invoice_slots_string "invoice:slots"
79 maybe_add_string (xmlNodePtr ptr,
const char *tag,
const char *str)
81 if (str && strlen(str) > 0)
82 xmlAddChild (ptr, text_to_dom_tree (tag, str));
86 maybe_add_timespec (xmlNodePtr ptr,
const char *tag,
Timespec ts)
88 if (ts.tv_sec || ts.tv_nsec)
89 xmlAddChild (ptr, timespec_to_dom_tree (tag, &ts));
105 ret = xmlNewNode(NULL, BAD_CAST gnc_invoice_string);
106 xmlSetProp(ret, BAD_CAST
"version", BAD_CAST invoice_version_string);
108 xmlAddChild(ret, guid_to_dom_tree(invoice_guid_string,
111 xmlAddChild(ret, text_to_dom_tree(invoice_id_string,
112 gncInvoiceGetID (invoice)));
114 xmlAddChild(ret, gnc_owner_to_dom_tree (invoice_owner_string,
115 gncInvoiceGetOwner (invoice)));
117 ts = gncInvoiceGetDateOpened (invoice);
118 xmlAddChild(ret, timespec_to_dom_tree (invoice_opened_string, &ts));
120 maybe_add_timespec (ret, invoice_posted_string,
121 gncInvoiceGetDatePosted (invoice));
123 term = gncInvoiceGetTerms (invoice);
125 xmlAddChild(ret, guid_to_dom_tree(invoice_terms_string,
128 maybe_add_string (ret, invoice_billing_id_string,
129 gncInvoiceGetBillingID (invoice));
130 maybe_add_string (ret, invoice_notes_string, gncInvoiceGetNotes (invoice));
132 xmlAddChild(ret, int_to_dom_tree(invoice_active_string,
133 gncInvoiceGetActive (invoice)));
135 txn = gncInvoiceGetPostedTxn (invoice);
137 xmlAddChild (ret, guid_to_dom_tree (invoice_posttxn_string,
140 lot = gncInvoiceGetPostedLot (invoice);
142 xmlAddChild (ret, guid_to_dom_tree (invoice_postlot_string,
143 gnc_lot_get_guid (lot)));
145 acc = gncInvoiceGetPostedAcc (invoice);
147 xmlAddChild (ret, guid_to_dom_tree (invoice_postacc_string,
152 commodity_ref_to_dom_tree(invoice_currency_string,
153 gncInvoiceGetCurrency (invoice)));
155 billto = gncInvoiceGetBillTo (invoice);
156 if (billto && billto->owner.undefined != NULL)
157 xmlAddChild (ret, gnc_owner_to_dom_tree (invoice_billto_string, billto));
159 amt = gncInvoiceGetToChargeAmount (invoice);
161 xmlAddChild (ret, gnc_numeric_to_dom_tree (invoice_tochargeamt_string, &amt));
163 kf = qof_instance_get_slots (QOF_INSTANCE(invoice));
166 xmlNodePtr kvpnode = kvp_frame_to_dom_tree(invoice_slots_string, kf);
169 xmlAddChild(ret, kvpnode);
184 static inline gboolean
185 set_string(xmlNodePtr node,
GncInvoice* invoice,
186 void (*func)(
GncInvoice *invoice,
const char *txt))
188 char* txt = dom_tree_to_text(node);
189 g_return_val_if_fail(txt, FALSE);
197 static inline gboolean
198 set_timespec(xmlNodePtr node,
GncInvoice* invoice,
201 Timespec ts = dom_tree_to_timespec(node);
202 if (!dom_tree_valid_timespec(&ts, node->name))
return FALSE;
209 invoice_guid_handler (xmlNodePtr node, gpointer
invoice_pdata)
211 struct invoice_pdata *pdata = invoice_pdata;
215 guid = dom_tree_to_guid(node);
216 g_return_val_if_fail (guid, FALSE);
217 invoice = gncInvoiceLookup (pdata->book, guid);
220 gncInvoiceDestroy (pdata->invoice);
221 pdata->invoice = invoice;
222 gncInvoiceBeginEdit (invoice);
226 gncInvoiceSetGUID(pdata->invoice, guid);
235 invoice_id_handler (xmlNodePtr node, gpointer invoice_pdata)
237 struct invoice_pdata *pdata = invoice_pdata;
239 return set_string(node, pdata->invoice, gncInvoiceSetID);
243 invoice_owner_handler (xmlNodePtr node, gpointer invoice_pdata)
245 struct invoice_pdata *pdata = invoice_pdata;
249 ret = gnc_dom_tree_to_owner (node, &owner, pdata->book);
251 gncInvoiceSetOwner (pdata->invoice, &owner);
257 invoice_opened_handler (xmlNodePtr node, gpointer invoice_pdata)
259 struct invoice_pdata *pdata = invoice_pdata;
261 return set_timespec (node, pdata->invoice, gncInvoiceSetDateOpened);
265 invoice_posted_handler (xmlNodePtr node, gpointer invoice_pdata)
267 struct invoice_pdata *pdata = invoice_pdata;
269 return set_timespec (node, pdata->invoice, gncInvoiceSetDatePosted);
273 invoice_billing_id_handler (xmlNodePtr node, gpointer invoice_pdata)
275 struct invoice_pdata *pdata = invoice_pdata;
277 return set_string(node, pdata->invoice, gncInvoiceSetBillingID);
281 invoice_notes_handler (xmlNodePtr node, gpointer invoice_pdata)
283 struct invoice_pdata *pdata = invoice_pdata;
285 return set_string(node, pdata->invoice, gncInvoiceSetNotes);
289 invoice_active_handler (xmlNodePtr node, gpointer invoice_pdata)
291 struct invoice_pdata *pdata = invoice_pdata;
295 ret = dom_tree_to_integer(node, &val);
297 gncInvoiceSetActive(pdata->invoice, (gboolean)val);
303 invoice_terms_handler (xmlNodePtr node, gpointer invoice_pdata)
305 struct invoice_pdata *pdata = invoice_pdata;
309 guid = dom_tree_to_guid(node);
310 g_return_val_if_fail (guid, FALSE);
311 term = gnc_billterm_xml_find_or_create(pdata->book, guid);
314 gncInvoiceSetTerms (pdata->invoice, term);
320 invoice_posttxn_handler (xmlNodePtr node, gpointer invoice_pdata)
322 struct invoice_pdata *pdata = invoice_pdata;
326 guid = dom_tree_to_guid(node);
327 g_return_val_if_fail (guid, FALSE);
330 g_return_val_if_fail (txn, FALSE);
332 gncInvoiceSetPostedTxn (pdata->invoice, txn);
337 invoice_postlot_handler (xmlNodePtr node, gpointer invoice_pdata)
339 struct invoice_pdata *pdata = invoice_pdata;
343 guid = dom_tree_to_guid(node);
344 g_return_val_if_fail (guid, FALSE);
345 lot = gnc_lot_lookup (guid, pdata->book);
347 g_return_val_if_fail (lot, FALSE);
349 gncInvoiceSetPostedLot (pdata->invoice, lot);
354 invoice_postacc_handler (xmlNodePtr node, gpointer invoice_pdata)
356 struct invoice_pdata *pdata = invoice_pdata;
360 guid = dom_tree_to_guid(node);
361 g_return_val_if_fail (guid, FALSE);
364 g_return_val_if_fail (acc, FALSE);
366 gncInvoiceSetPostedAcc (pdata->invoice, acc);
371 invoice_currency_handler (xmlNodePtr node, gpointer invoice_pdata)
373 struct invoice_pdata *pdata = invoice_pdata;
376 com = dom_tree_to_commodity_ref(node, pdata->book);
377 g_return_val_if_fail (com, FALSE);
379 gncInvoiceSetCurrency (pdata->invoice, com);
385 invoice_billto_handler (xmlNodePtr node, gpointer invoice_pdata)
387 struct invoice_pdata *pdata = invoice_pdata;
391 ret = gnc_dom_tree_to_owner (node, &owner, pdata->book);
393 gncInvoiceSetBillTo (pdata->invoice, &owner);
399 invoice_tochargeamt_handler (xmlNodePtr node, gpointer invoice_pdata)
401 struct invoice_pdata *pdata = invoice_pdata;
403 g_return_val_if_fail(num, FALSE);
405 gncInvoiceSetToChargeAmount (pdata->invoice, *num);
411 invoice_slots_handler (xmlNodePtr node, gpointer invoice_pdata)
413 struct invoice_pdata *pdata = invoice_pdata;
415 return dom_tree_to_kvp_frame_given
416 (node, qof_instance_get_slots (QOF_INSTANCE (pdata->invoice)));
421 { invoice_guid_string, invoice_guid_handler, 1, 0 },
422 { invoice_id_string, invoice_id_handler, 1, 0 },
423 { invoice_owner_string, invoice_owner_handler, 1, 0 },
424 { invoice_opened_string, invoice_opened_handler, 1, 0 },
425 { invoice_posted_string, invoice_posted_handler, 0, 0 },
426 { invoice_billing_id_string, invoice_billing_id_handler, 0, 0 },
427 { invoice_notes_string, invoice_notes_handler, 0, 0 },
428 { invoice_active_string, invoice_active_handler, 1, 0 },
429 { invoice_terms_string, invoice_terms_handler, 0, 0 },
430 { invoice_posttxn_string, invoice_posttxn_handler, 0, 0 },
431 { invoice_postlot_string, invoice_postlot_handler, 0, 0 },
432 { invoice_postacc_string, invoice_postacc_handler, 0, 0 },
433 { invoice_currency_string, invoice_currency_handler, 0, 0 },
434 {
"invoice:commodity", invoice_currency_handler, 0, 0 },
435 { invoice_billto_string, invoice_billto_handler, 0, 0 },
436 { invoice_tochargeamt_string, invoice_tochargeamt_handler, 0, 0},
437 { invoice_slots_string, invoice_slots_handler, 0, 0 },
442 dom_tree_to_invoice (xmlNodePtr node,
QofBook *book)
444 struct invoice_pdata invoice_pdata;
447 invoice_pdata.invoice = gncInvoiceCreate(book);
448 invoice_pdata.book = book;
449 gncInvoiceBeginEdit (invoice_pdata.invoice);
451 successful = dom_tree_generic_parse (node, invoice_handlers_v2,
455 gncInvoiceCommitEdit (invoice_pdata.invoice);
458 PERR (
"failed to parse invoice tree");
459 gncInvoiceDestroy (invoice_pdata.invoice);
460 invoice_pdata.invoice = NULL;
463 return invoice_pdata.invoice;
467 gnc_invoice_end_handler(gpointer data_for_children,
468 GSList* data_from_children, GSList* sibling_data,
469 gpointer parent_data, gpointer global_data,
470 gpointer *result,
const gchar *tag)
473 xmlNodePtr tree = (xmlNodePtr)data_for_children;
475 QofBook *book = gdata->bookdata;
489 g_return_val_if_fail(tree, FALSE);
491 invoice = dom_tree_to_invoice(tree, book);
494 gdata->cb(tag, gdata->parsedata, invoice);
499 return invoice != NULL;
503 invoice_sixtp_parser_create(
void)
505 return sixtp_dom_parser_new(gnc_invoice_end_handler, NULL, NULL);
514 id = gncInvoiceGetID (invoice);
515 if (
id == NULL || *
id ==
'\0')
522 do_count (
QofInstance * invoice_p, gpointer count_p)
524 int *count = count_p;
525 if (invoice_should_be_saved ((
GncInvoice *)invoice_p))
530 invoice_get_count (
QofBook *book)
538 xml_add_invoice (
QofInstance * invoice_p, gpointer out_p)
546 if (!invoice_should_be_saved (invoice))
549 node = invoice_dom_tree_create (invoice);
550 xmlElemDump(out, NULL, node);
552 if (ferror(out) || fprintf(out,
"\n") < 0)
557 invoice_write (FILE *out,
QofBook *book)
560 return ferror(out) == 0;
564 invoice_ns(FILE *out)
566 g_return_val_if_fail(out, FALSE);
571 gnc_invoice_xml_initialize (
void)
575 GNC_FILE_BACKEND_VERS,
577 invoice_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)
Use a 64-bit unsigned int timespec.
gboolean gnc_numeric_zero_p(gnc_numeric a)
#define PERR(format, args...)
void qof_object_foreach_sorted(QofIdTypeConst type_name, QofBook *book, QofInstanceForeachCB cb, gpointer user_data)
Transaction * xaccTransLookup(const GncGUID *guid, QofBook *book)
api for GnuCash version 2 XML-based file format
void qof_object_foreach(QofIdTypeConst type_name, QofBook *book, QofInstanceForeachCB cb, gpointer user_data)
#define xaccTransGetGUID(X)
gboolean gnc_xml2_write_namespace_decl(FILE *out, const char *name_space)
struct KvpFrameImpl KvpFrame
const gchar * QofLogModule
Account * xaccAccountLookup(const GncGUID *guid, QofBook *book)