30 #include "TransactionP.hpp" 32 #include "gnc-lot-p.h" 34 #include "gnc-xml-helper.h" 37 #include "sixtp-utils.h" 38 #include "sixtp-parsers.h" 39 #include "sixtp-utils.h" 40 #include "sixtp-dom-parsers.h" 41 #include "sixtp-dom-generators.h" 45 #include "io-gncxml-gen.h" 47 #include "sixtp-dom-parsers.h" 49 [[maybe_unused]]
static const QofLogModule log_module =
G_LOG_DOMAIN;
50 const gchar* transaction_version_string =
"2.0.0";
53 add_gnc_num (xmlNodePtr node,
const gchar* tag, gnc_numeric num)
55 xmlAddChild (node, gnc_numeric_to_dom_tree (tag, &num));
59 add_time64 (xmlNodePtr node,
const gchar * tag,
time64 time, gboolean always)
62 xmlAddChild (node, time64_to_dom_tree (tag, time));
66 split_to_dom_tree (
const gchar* tag, Split* spl)
70 ret = xmlNewNode (NULL, BAD_CAST tag);
77 if (memo && g_strcmp0 (memo,
"") != 0)
79 xmlNewTextChild (ret, NULL, BAD_CAST
"split:memo",
80 checked_char_cast (memo));
88 if (action && g_strcmp0 (action,
"") != 0)
90 xmlNewTextChild (ret, NULL, BAD_CAST
"split:action",
91 checked_char_cast (action));
102 xmlNewTextChild (ret, NULL, BAD_CAST
"split:reconciled-state",
106 add_time64 (ret,
"split:reconcile-date",
116 xmlAddChild (ret, guid_to_dom_tree (
"split:account",
124 xmlAddChild (ret, guid_to_dom_tree (
"split:lot",
125 gnc_lot_get_guid (lot)));
129 xmlAddChild (ret, qof_instance_slots_to_dom_tree (
"split:slots",
130 QOF_INSTANCE (spl)));
135 add_trans_splits (xmlNodePtr node, Transaction* trn)
140 toaddto = xmlNewChild (node, NULL, BAD_CAST
"trn:splits", NULL);
144 Split* s =
static_cast<decltype (s)
> (n->data);
145 xmlAddChild (toaddto, split_to_dom_tree (
"trn:split", s));
150 gnc_transaction_dom_tree_create (Transaction* trn)
155 ret = xmlNewNode (NULL, BAD_CAST
"gnc:transaction");
157 xmlSetProp (ret, BAD_CAST
"version",
158 BAD_CAST transaction_version_string);
162 xmlAddChild (ret, commodity_ref_to_dom_tree (
"trn:currency",
165 if (str && (g_strcmp0 (str,
"") != 0))
167 xmlNewTextChild (ret, NULL, BAD_CAST
"trn:num",
168 checked_char_cast (str));
174 add_time64 (ret,
"trn:date-entered",
180 xmlNewTextChild (ret, NULL, BAD_CAST
"trn:description",
181 checked_char_cast (str));
186 xmlAddChild (ret, qof_instance_slots_to_dom_tree (
"trn:slots",
187 QOF_INSTANCE (trn)));
189 add_trans_splits (ret, trn);
202 static inline gboolean
203 set_spl_string (xmlNodePtr node, Split* spl,
204 void (*func) (Split* spl,
const char* txt))
206 gchar* tmp = dom_tree_to_text (node);
207 g_return_val_if_fail (tmp, FALSE);
216 static inline gboolean
217 set_spl_gnc_num (xmlNodePtr node, Split* spl,
218 void (*func) (Split* spl, gnc_numeric gn))
220 func (spl, dom_tree_to_gnc_numeric (node));
225 spl_id_handler (xmlNodePtr node, gpointer data)
227 struct split_pdata* pdata =
static_cast<decltype (pdata)
> (data);
228 GncGUID* tmp = dom_tree_to_guid (node);
229 g_return_val_if_fail (tmp, FALSE);
231 xaccSplitSetGUID (pdata->split, tmp);
238 spl_memo_handler (xmlNodePtr node, gpointer data)
240 struct split_pdata* pdata =
static_cast<decltype (pdata)
> (data);
245 spl_action_handler (xmlNodePtr node, gpointer data)
247 struct split_pdata* pdata =
static_cast<decltype (pdata)
> (data);
252 spl_reconciled_state_handler (xmlNodePtr node, gpointer data)
254 struct split_pdata* pdata =
static_cast<decltype (pdata)
> (data);
255 gchar* tmp = dom_tree_to_text (node);
256 g_return_val_if_fail (tmp, FALSE);
266 spl_reconcile_date_handler (xmlNodePtr node, gpointer data)
268 struct split_pdata* pdata =
static_cast<decltype (pdata)
> (data);
269 time64 time = dom_tree_to_time64 (node);
270 if (!dom_tree_valid_time64 (time, node->name)) time = 0;
276 spl_value_handler (xmlNodePtr node, gpointer data)
278 struct split_pdata* pdata =
static_cast<decltype (pdata)
> (data);
283 spl_quantity_handler (xmlNodePtr node, gpointer data)
285 struct split_pdata* pdata =
static_cast<decltype (pdata)
> (data);
289 gboolean gnc_transaction_xml_v2_testing = FALSE;
292 spl_account_handler (xmlNodePtr node, gpointer data)
294 struct split_pdata* pdata =
static_cast<decltype (pdata)
> (data);
295 GncGUID*
id = dom_tree_to_guid (node);
298 g_return_val_if_fail (
id, FALSE);
301 if (!account && gnc_transaction_xml_v2_testing &&
305 xaccAccountSetGUID (account,
id);
318 spl_lot_handler (xmlNodePtr node, gpointer data)
320 struct split_pdata* pdata =
static_cast<decltype (pdata)
> (data);
321 GncGUID*
id = dom_tree_to_guid (node);
324 g_return_val_if_fail (
id, FALSE);
326 lot = gnc_lot_lookup (
id, pdata->book);
327 if (!lot && gnc_transaction_xml_v2_testing &&
330 lot = gnc_lot_new (pdata->book);
331 gnc_lot_set_guid (lot, *
id);
342 spl_slots_handler (xmlNodePtr node, gpointer data)
344 struct split_pdata* pdata =
static_cast<decltype (pdata)
> (data);
347 successful = dom_tree_create_instance_slots (node,
348 QOF_INSTANCE (pdata->split));
349 g_return_val_if_fail (successful, FALSE);
356 {
"split:id", spl_id_handler, 1, 0 },
357 {
"split:memo", spl_memo_handler, 0, 0 },
358 {
"split:action", spl_action_handler, 0, 0 },
359 {
"split:reconciled-state", spl_reconciled_state_handler, 1, 0 },
360 {
"split:reconcile-date", spl_reconcile_date_handler, 0, 0 },
361 {
"split:value", spl_value_handler, 1, 0 },
362 {
"split:quantity", spl_quantity_handler, 1, 0 },
363 {
"split:account", spl_account_handler, 1, 0 },
364 {
"split:lot", spl_lot_handler, 0, 0 },
365 {
"split:slots", spl_slots_handler, 0, 0 },
366 { NULL, NULL, 0, 0 },
370 dom_tree_to_split (xmlNodePtr node, QofBook* book)
375 g_return_val_if_fail (book, NULL);
378 g_return_val_if_fail (ret, NULL);
384 if (dom_tree_generic_parse (node, spl_dom_handlers, &pdata))
403 static inline gboolean
404 set_tran_string (xmlNodePtr node, Transaction* trn,
405 void (*func) (Transaction* trn,
const char* txt))
409 tmp = dom_tree_to_text (node);
411 g_return_val_if_fail (tmp, FALSE);
421 set_tran_time64 (xmlNodePtr node, Transaction * trn,
422 void (*func) (Transaction *,
time64))
424 time64 time = dom_tree_to_time64 (node);
425 if (!dom_tree_valid_time64 (time, node->name)) time = 0;
431 trn_id_handler (xmlNodePtr node, gpointer
trans_pdata)
434 Transaction* trn = pdata->trans;
435 GncGUID* tmp = dom_tree_to_guid (node);
437 g_return_val_if_fail (tmp, FALSE);
439 xaccTransSetGUID ((Transaction*)trn, tmp);
447 trn_currency_handler (xmlNodePtr node, gpointer
trans_pdata)
450 Transaction* trn = pdata->trans;
453 ref = dom_tree_to_commodity_ref (node, pdata->book);
460 trn_num_handler (xmlNodePtr node, gpointer
trans_pdata)
463 Transaction* trn = pdata->trans;
469 trn_date_posted_handler (xmlNodePtr node, gpointer
trans_pdata)
472 Transaction* trn = pdata->trans;
478 trn_date_entered_handler (xmlNodePtr node, gpointer
trans_pdata)
481 Transaction* trn = pdata->trans;
487 trn_description_handler (xmlNodePtr node, gpointer
trans_pdata)
490 Transaction* trn = pdata->trans;
496 trn_slots_handler (xmlNodePtr node, gpointer
trans_pdata)
499 Transaction* trn = pdata->trans;
502 successful = dom_tree_create_instance_slots (node, QOF_INSTANCE (trn));
504 g_return_val_if_fail (successful, FALSE);
510 trn_splits_handler (xmlNodePtr node, gpointer
trans_pdata)
513 Transaction* trn = pdata->trans;
516 g_return_val_if_fail (node, FALSE);
517 g_return_val_if_fail (node->xmlChildrenNode, FALSE);
519 for (mark = node->xmlChildrenNode; mark; mark = mark->next)
523 if (g_strcmp0 (
"text", (
char*)mark->name) == 0)
526 if (g_strcmp0 (
"trn:split", (
char*)mark->name))
531 spl = dom_tree_to_split (mark, pdata->book);
547 {
"trn:id", trn_id_handler, 1, 0 },
548 {
"trn:currency", trn_currency_handler, 0, 0},
549 {
"trn:num", trn_num_handler, 0, 0 },
550 {
"trn:date-posted", trn_date_posted_handler, 1, 0 },
551 {
"trn:date-entered", trn_date_entered_handler, 1, 0 },
552 {
"trn:description", trn_description_handler, 0, 0 },
553 {
"trn:slots", trn_slots_handler, 0, 0 },
554 {
"trn:splits", trn_splits_handler, 1, 0 },
555 { NULL, NULL, 0, 0 },
559 gnc_transaction_end_handler (gpointer data_for_children,
560 GSList* data_from_children, GSList* sibling_data,
561 gpointer parent_data, gpointer global_data,
562 gpointer* result,
const gchar* tag)
564 Transaction* trn = NULL;
565 xmlNodePtr tree = (xmlNodePtr)data_for_children;
566 gxpf_data* gdata = (gxpf_data*)global_data;
580 g_return_val_if_fail (tree, FALSE);
582 trn = dom_tree_to_transaction (tree,
583 static_cast<QofBook*> (gdata->bookdata));
586 gdata->cb (tag, gdata->parsedata, trn);
595 dom_tree_to_transaction (xmlNodePtr node, QofBook* book)
601 g_return_val_if_fail (node, NULL);
602 g_return_val_if_fail (book, NULL);
605 g_return_val_if_fail (trn, NULL);
611 successful = dom_tree_generic_parse (node, trn_dom_handlers, &pdata);
617 xmlElemDump (stdout, NULL, node);
628 gnc_transaction_sixtp_parser_create (
void)
630 return sixtp_dom_parser_new (gnc_transaction_end_handler, NULL, NULL);
void xaccSplitSetValue(Split *split, gnc_numeric val)
The xaccSplitSetValue() method sets the value of this split in the transaction's commodity.
This is the private header for the account structure.
#define xaccTransAppendSplit(t, s)
Add a split to the transaction.
Transaction * xaccMallocTransaction(QofBook *book)
The xaccMallocTransaction() will malloc memory and initialize it.
void xaccSplitSetAction(Split *split, const char *actn)
The Action is an arbitrary user-assigned string.
#define G_LOG_DOMAIN
Functions providing the SX List as a plugin page.
gboolean xaccSplitDestroy(Split *split)
Destructor.
char xaccSplitGetReconcile(const Split *split)
Returns the value of the reconcile flag.
void gnc_lot_add_split(GNCLot *lot, Split *split)
Adds a split to this lot.
void xaccTransSetDescription(Transaction *trans, const char *desc)
Sets the transaction Description.
void xaccTransSetNum(Transaction *trans, const char *xnum)
Sets the transaction Number (or ID) field; rather than use this function directly, see 'gnc_set_num_action' in engine/engine-helpers.c & .h which takes a user-set book option for selecting the source for the num-cell (the transaction-number or the split-action field) in registers/reports into account automatically.
void xaccSplitSetReconcile(Split *split, char recn)
Set the reconcile flag.
const char * xaccTransGetNum(const Transaction *trans)
Gets the transaction Number (or ID) field; rather than use this function directly, see 'gnc_get_num_action' and 'gnc_get_action_num' in engine/engine-helpers.c & .h which takes a user-set book option for selecting the source for the num-cell (the transaction-number or the split-action field) in registers/reports into account automatically.
void xaccTransSetCurrency(Transaction *trans, gnc_commodity *curr)
Set a new currency on a transaction.
void xaccTransDestroy(Transaction *trans)
Destroys a transaction.
#define xaccAccountGetGUID(X)
void xaccSplitSetAmount(Split *split, gnc_numeric amt)
The xaccSplitSetAmount() method sets the amount in the account's commodity that the split should have...
gboolean guid_equal(const GncGUID *guid_1, const GncGUID *guid_2)
Given two GUIDs, return TRUE if they are non-NULL and equal.
void xaccSplitSetMemo(Split *split, const char *memo)
The memo is an arbitrary string associated with a split.
time64 xaccTransRetDatePosted(const Transaction *trans)
Retrieve the posted date of the transaction.
const char * xaccTransGetDescription(const Transaction *trans)
Gets the transaction Description.
void xaccTransCommitEdit(Transaction *trans)
The xaccTransCommitEdit() method indicates that the changes to the transaction and its splits are com...
#define xaccSplitGetGUID(X)
void xaccTransBeginEdit(Transaction *trans)
The xaccTransBeginEdit() method must be called before any changes are made to a transaction or any of...
void xaccAccountSetCommoditySCU(Account *acc, int scu)
Set the SCU for the account.
Split * xaccMallocSplit(QofBook *book)
Constructor.
#define xaccTransGetGUID(X)
void xaccSplitSetDateReconciledSecs(Split *split, time64 secs)
Set the date on which this split was reconciled by specifying the time as time64. ...
time64 xaccSplitGetDateReconciled(const Split *split)
Retrieve the date when the Split was reconciled.
void xaccTransSetDatePostedSecs(Transaction *trans, time64 secs)
The xaccTransSetDatePostedSecs() method will modify the posted date of the transaction, specified by a time64 (see ctime(3)).
gnc_numeric xaccSplitGetValue(const Split *split)
Returns the value of this split in the transaction's commodity.
Account * xaccSplitGetAccount(const Split *split)
Returns the account of this split, which was set through xaccAccountInsertSplit().
const GncGUID * guid_null(void)
Returns a GncGUID which is guaranteed to never reference any entity.
gnc_commodity * xaccTransGetCurrency(const Transaction *trans)
Returns the valuation commodity of this transaction.
#define xaccAccountInsertSplit(acc, s)
The xaccAccountInsertSplit() method will insert the indicated split into the indicated account...
Account * xaccMallocAccount(QofBook *book)
Constructor.
const char * xaccSplitGetMemo(const Split *split)
Returns the memo string.
const char * xaccSplitGetAction(const Split *split)
Returns the action string.
gint64 time64
Most systems that are currently maintained, including Microsoft Windows, BSD-derived Unixes and Linux...
void xaccTransSetDateEnteredSecs(Transaction *trans, time64 secs)
Modify the date of when the transaction was entered.
time64 xaccTransRetDateEntered(const Transaction *trans)
Retrieve the date of when the transaction was entered.
API for Transactions and Splits (journal entries)
The type used to store guids in C.
SplitList * xaccTransGetSplitList(const Transaction *trans)
The xaccTransGetSplitList() method returns a GList of the splits in a transaction.
GNCLot * xaccSplitGetLot(const Split *split)
Returns the pointer to the debited/credited Lot where this split belongs to, or NULL if it doesn't be...
gnc_numeric xaccSplitGetAmount(const Split *split)
Returns the amount of the split in the account's commodity.
Account * xaccAccountLookup(const GncGUID *guid, QofBook *book)
The xaccAccountLookup() subroutine will return the account associated with the given id...