32 #include <qofinstance-p.h>
35 #include "gncTaxTableP.h"
41 GncTaxTableEntryList* entries;
77 #define GNC_RETURN_ENUM_AS_STRING(x,s) case (x): return (s);
86 g_warning (
"asked to translate unknown amount type %d.\n", type);
101 g_warning (
"asked to translate unknown taxincluded type %d.\n", type);
106 #undef GNC_RETURN_ENUM_AS_STRING
107 #define GNC_RETURN_ON_MATCH(s,x) \
108 if(g_strcmp0((s), (str)) == 0) { *type = x; return(TRUE); }
114 g_warning (
"asked to translate unknown amount type string %s.\n",
115 str ? str :
"(null)");
121 gncTaxIncludedStringToType (
const char *str,
GncTaxIncluded *type)
126 g_warning (
"asked to translate unknown taxincluded type string %s.\n",
127 str ? str :
"(null)");
131 #undef GNC_RETURN_ON_MATCH
136 #define _GNC_MOD_NAME GNC_ID_TAXTABLE
138 #define SET_STR(obj, member, str) { \
141 if (!g_strcmp0 (member, str)) return; \
142 gncTaxTableBeginEdit (obj); \
143 tmp = CACHE_INSERT (str); \
144 CACHE_REMOVE (member); \
151 qof_instance_set_dirty(&table->inst);
160 if (table->parent || table->invisible)
return;
162 bi->tables = g_list_sort (bi->tables, (GCompareFunc)gncTaxTableCompare);
175 bi->tables = g_list_insert_sorted (bi->tables, table,
176 (GCompareFunc)gncTaxTableCompare);
183 bi->tables = g_list_remove (bi->tables, table);
189 g_return_if_fail(table);
190 g_return_if_fail(child);
193 table->children = g_list_prepend(table->children, child);
199 g_return_if_fail(table);
200 g_return_if_fail(child);
204 table->children = g_list_remove(table->children, child);
219 G_DEFINE_TYPE(
GncTaxTable, gnc_taxtable, QOF_TYPE_INSTANCE);
227 gnc_taxtable_dispose(GObject *ttp)
229 G_OBJECT_CLASS(gnc_taxtable_parent_class)->dispose(ttp);
233 gnc_taxtable_finalize(GObject* ttp)
235 G_OBJECT_CLASS(gnc_taxtable_parent_class)->dispose(ttp);
239 gnc_taxtable_get_property (GObject *
object,
246 g_return_if_fail(GNC_IS_TAXTABLE(
object));
248 tt = GNC_TAXTABLE(
object);
252 g_value_set_string(value, tt->name);
255 g_value_set_boolean(value, tt->invisible);
258 g_value_set_uint64(value, tt->refcount);
261 G_OBJECT_WARN_INVALID_PROPERTY_ID(
object, prop_id, pspec);
267 gnc_taxtable_set_property (GObject *
object,
274 g_return_if_fail(GNC_IS_TAXTABLE(
object));
276 tt = GNC_TAXTABLE(
object);
277 g_assert (qof_instance_get_editlevel(tt));
282 gncTaxTableSetName(tt, g_value_get_string(value));
285 if (g_value_get_boolean(value))
287 gncTaxTableMakeInvisible(tt);
291 gncTaxTableSetRefcount(tt, g_value_get_uint64(value));
294 G_OBJECT_WARN_INVALID_PROPERTY_ID(
object, prop_id, pspec);
305 g_return_val_if_fail(inst != NULL, FALSE);
306 g_return_val_if_fail(GNC_IS_TAXTABLE(inst), FALSE);
308 tt = GNC_TAXTABLE(inst);
309 return g_strdup_printf(
"Tax table %s", tt->name);
318 g_return_val_if_fail(inst != NULL, FALSE);
319 g_return_val_if_fail(GNC_IS_TAXTABLE(inst), FALSE);
321 tt = GNC_TAXTABLE(inst);
323 if (GNC_IS_ACCOUNT(ref))
327 for (node = tt->entries; node != NULL; node = node->next)
331 if (tte->account == GNC_ACCOUNT(ref))
350 if (!GNC_IS_ACCOUNT(ref))
361 GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
364 gobject_class->dispose = gnc_taxtable_dispose;
365 gobject_class->finalize = gnc_taxtable_finalize;
366 gobject_class->set_property = gnc_taxtable_set_property;
367 gobject_class->get_property = gnc_taxtable_get_property;
369 qof_class->get_display_name = impl_get_display_name;
370 qof_class->refers_to_object = impl_refers_to_object;
371 qof_class->get_typed_referring_object_list = impl_get_typed_referring_object_list;
373 g_object_class_install_property
376 g_param_spec_string (
"name",
378 "The accountName is an arbitrary string "
379 "assigned by the user. It is intended to "
380 "a short, 10 to 30 character long string "
381 "that is displayed by the GUI as the "
382 "tax table mnemonic.",
386 g_object_class_install_property
389 g_param_spec_boolean (
"invisible",
391 "TRUE if the tax table is invisible. FALSE if visible.",
395 g_object_class_install_property
398 g_param_spec_uint64(
"ref-count",
400 "The ref-count property contains number of times this tax table "
410 gncTaxTableCreate (
QofBook *book)
413 if (!book)
return NULL;
415 table = g_object_new (GNC_TYPE_TAXTABLE, NULL);
417 table->name = CACHE_INSERT (
"");
427 qof_instance_set_destroying(table, TRUE);
428 qof_instance_set_dirty (&table->inst);
429 gncTaxTableCommitEdit (table);
441 CACHE_REMOVE (table->name);
445 for (list = table->entries; list; list = list->next)
446 gncTaxTableEntryDestroy (list->data);
447 g_list_free (table->entries);
450 PERR(
"free a taxtable without do_free set!");
454 gncTaxTableRemoveChild(table->parent, table);
457 for (list = table->children; list; list = list->next)
460 gncTaxTableSetParent(child, NULL);
462 g_list_free(table->children);
465 g_object_unref (table);
474 entry->amount = gnc_numeric_zero ();
487 void gncTaxTableSetName (
GncTaxTable *table,
const char *name)
489 if (!table || !name)
return;
490 SET_STR (table, table->name, name);
492 maybe_resort_list (table);
493 gncTaxTableCommitEdit (table);
499 gncTaxTableBeginEdit (table);
501 gncTaxTableRemoveChild(table->parent, table);
502 table->parent = parent;
504 gncTaxTableAddChild(parent, table);
506 gncTaxTableMakeInvisible (table);
508 gncTaxTableCommitEdit (table);
514 gncTaxTableBeginEdit (table);
515 table->child = child;
517 gncTaxTableCommitEdit (table);
523 if (table->parent || table->invisible)
return;
524 gncTaxTableBeginEdit (table);
527 gncTaxTableCommitEdit (table);
533 if (table->parent || table->invisible)
return;
534 g_return_if_fail (table->refcount > 0);
535 gncTaxTableBeginEdit (table);
538 gncTaxTableCommitEdit (table);
541 void gncTaxTableSetRefcount (
GncTaxTable *table, gint64 refcount)
544 g_return_if_fail (refcount >= 0);
545 gncTaxTableBeginEdit (table);
546 table->refcount = refcount;
548 gncTaxTableCommitEdit (table);
555 gncTaxTableBeginEdit (table);
556 table->invisible = TRUE;
558 bi->tables = g_list_remove (bi->tables, table);
559 gncTaxTableCommitEdit (table);
564 if (!entry || !account)
return;
565 if (entry->account == account)
return;
566 entry->account = account;
569 mark_table (entry->table);
570 mod_table (entry->table);
577 if (entry->type == type)
return;
581 mark_table (entry->table);
582 mod_table (entry->table);
590 entry->amount = amount;
593 mark_table (entry->table);
594 mod_table (entry->table);
600 if (!table || !entry)
return;
601 if (entry->table == table)
return;
603 gncTaxTableBeginEdit (table);
605 gncTaxTableRemoveEntry (entry->table, entry);
607 entry->table = table;
608 table->entries = g_list_insert_sorted (table->entries, entry,
609 (GCompareFunc)gncTaxTableEntryCompare);
612 gncTaxTableCommitEdit (table);
617 if (!table || !entry)
return;
618 gncTaxTableBeginEdit (table);
620 table->entries = g_list_remove (table->entries, entry);
623 gncTaxTableCommitEdit (table);
629 gncTaxTableBeginEdit (table);
631 gncTaxTableCommitEdit (table);
643 PERR(
"TaxTable QofBackend Failure: %d", errcode);
644 gnc_engine_signal_commit_error( errcode );
647 static void gncTaxTableOnDone (
QofInstance *inst) {}
652 gncTaxTableFree (table);
663 gncTaxTableOnDone, table_free);
672 GList *list = gncTaxTableGetTables (book);
674 for ( ; list; list = list->next)
677 if (!g_strcmp0 (table->name, name))
683 GList * gncTaxTableGetTables (
QofBook *book)
686 if (!book)
return NULL;
692 const char *gncTaxTableGetName (
const GncTaxTable *table)
694 if (!table)
return NULL;
701 if (!entry)
return NULL;
703 e = gncTaxTableEntryCreate ();
704 gncTaxTableEntrySetAccount (e, entry->account);
705 gncTaxTableEntrySetType (e, entry->type);
706 gncTaxTableEntrySetAmount (e, entry->amount);
716 if (!table)
return NULL;
718 gncTaxTableSetName (t, table->name);
719 for (list = table->entries; list; list = list->next)
723 e = gncTaxTableEntryCopy (entry);
724 gncTaxTableAddEntry (t, e);
733 if (!table)
return NULL;
734 if (table->child)
return table->child;
735 if (table->parent || table->invisible)
return table;
738 child = gncTaxTableCopy (table);
739 gncTaxTableSetChild (table, child);
740 gncTaxTableSetParent (child, table);
747 if (!table)
return NULL;
748 return table->parent;
751 GncTaxTableEntryList* gncTaxTableGetEntries (
const GncTaxTable *table)
753 if (!table)
return NULL;
754 return table->entries;
757 gint64 gncTaxTableGetRefcount (
const GncTaxTable *table)
759 if (!table)
return 0;
760 return table->refcount;
766 if (!table)
return ts;
767 return table->modtime;
770 gboolean gncTaxTableGetInvisible (
const GncTaxTable *table)
772 if (!table)
return FALSE;
773 return table->invisible;
778 if (!entry)
return NULL;
779 return entry->account;
784 if (!entry)
return 0;
790 if (!entry)
return gnc_numeric_zero();
791 return entry->amount;
798 if (!entry)
return NULL;
804 char *name_a, *name_b;
807 if (!a && !b)
return 0;
813 retval = g_strcmp0(name_a, name_b);
825 if (!a && !b)
return 0;
828 return g_strcmp0 (a->name, b->name);
833 if (a == NULL && b == NULL)
return TRUE;
834 if (a == NULL || b == NULL)
return FALSE;
838 PWARN(
"accounts differ");
842 if (a->type != b->type)
844 PWARN(
"types differ");
850 PWARN(
"amounts differ");
859 if (a == NULL && b == NULL)
return TRUE;
860 if (a == NULL || b == NULL)
return FALSE;
862 g_return_val_if_fail(GNC_IS_TAXTABLE(a), FALSE);
863 g_return_val_if_fail(GNC_IS_TAXTABLE(b), FALSE);
865 if (g_strcmp0(a->name, b->name) != 0)
867 PWARN(
"Names differ: %s vs %s", a->name, b->name);
871 if (a->invisible != b->invisible)
873 PWARN(
"invisible flags differ");
877 if ((a->entries != NULL) != (b->entries != NULL))
879 PWARN(
"only one has entries");
883 if (a->entries != NULL && b->entries != NULL)
885 GncTaxTableEntryList* a_node;
886 GncTaxTableEntryList* b_node;
888 for (a_node = a->entries, b_node = b->entries;
889 a_node != NULL && b_node != NULL;
890 a_node = a_node->next, b_node = b_node->next)
895 PWARN(
"entries differ");
900 if (a_node != NULL || b_node != NULL)
902 PWARN(
"Unequal number of entries");
928 g_return_val_if_fail (acc, list);
932 for (li = list; li; li = li->next)
935 if (res->account == acc)
947 return g_list_prepend (list, res);
955 for (li = l2; li; li = li->next )
969 for ( ; list ; list = list->next)
981 for ( node = list; node ; node = node->next)
989 static void _gncTaxTableCreate (
QofBook *book)
999 static void _gncTaxTableDestroy (
QofBook *book)
1007 g_list_free (bi->tables);
1014 DI(.e_type = ) _GNC_MOD_NAME,
1015 DI(.type_label = ) "Tax
Table",
1016 DI(.create = ) (gpointer)gncTaxTableCreate,
1017 DI(.book_begin = ) _gncTaxTableCreate,
1018 DI(.book_end = ) _gncTaxTableDestroy,
1022 DI(.printable = ) NULL,
1026 gboolean gncTaxTableRegister (
void)
int qof_instance_version_cmp(const QofInstance *left, const QofInstance *right)
gboolean gnc_numeric_equal(gnc_numeric a, gnc_numeric b)
const GncGUID * qof_instance_get_guid(gconstpointer)
QofBook * qof_instance_get_book(gconstpointer)
gboolean qof_collection_is_dirty(const QofCollection *col)
QofBackendError
The errors that can be reported to the GUI & other front-end users.
gboolean kvp_frame_is_empty(const KvpFrame *frame)
GList * qof_instance_get_referring_object_list_from_collection(const QofCollection *coll, const QofInstance *ref)
gboolean qof_instance_get_destroying(gconstpointer ptr)
void gnc_features_set_used(QofBook *book, const gchar *feature)
void qof_class_register(QofIdTypeConst obj_name, QofSortFunc default_sort_fcn, const QofParam *params)
gnc_numeric gnc_numeric_add(gnc_numeric a, gnc_numeric b, gint64 denom, gint how)
Use a 64-bit unsigned int timespec.
QofCollection * qof_instance_get_collection(gconstpointer inst)
gnc_numeric gncAccountValueTotal(GList *list)
gpointer(* QofAccessFunc)(gpointer object, const QofParam *param)
gint gnc_numeric_compare(gnc_numeric a, gnc_numeric b)
#define QOF_OBJECT_VERSION
gboolean qof_commit_edit(QofInstance *inst)
#define PERR(format, args...)
void qof_collection_foreach(const QofCollection *, QofInstanceForeachCB, gpointer user_data)
#define PWARN(format, args...)
void qof_instance_init_data(QofInstance *, QofIdType, QofBook *)
gboolean qof_begin_edit(QofInstance *inst)
gchar * gnc_account_get_full_name(const Account *account)
int(* QofSortFunc)(gconstpointer, gconstpointer)
void qof_book_set_data(QofBook *book, const gchar *key, gpointer data)
gboolean qof_commit_edit_part2(QofInstance *inst, void(*on_error)(QofInstance *, QofBackendError), void(*on_done)(QofInstance *), void(*on_free)(QofInstance *))
void qof_collection_mark_clean(QofCollection *)
void gncAccountValueDestroy(GList *list)
gboolean xaccAccountEqual(const Account *aa, const Account *ab, gboolean check_guids)
gboolean gnc_numeric_eq(gnc_numeric a, gnc_numeric b)
GList * gncAccountValueAddList(GList *l1, GList *l2)
void(* QofSetterFunc)(gpointer, gpointer)
time64 gnc_time(time64 *tbuf)
get the current local time
GNCNumericErrorCode gnc_numeric_check(gnc_numeric a)
gboolean qof_object_register(const QofObject *object)
GList * gncAccountValueAdd(GList *list, Account *acc, gnc_numeric value)
void qof_event_gen(QofInstance *entity, QofEventId event_type, gpointer event_data)
Invoke all registered event handlers using the given arguments.
gpointer qof_book_get_data(const QofBook *book, const gchar *key)
const gchar * QofLogModule
void timespecFromTime64(Timespec *ts, time64 t)
Utility functions for file access.