27 #include <glib/gprintf.h>
28 #include <glib/gi18n.h>
31 #include <qofbookslots.h>
33 #include <qofinstance-p.h>
77 #define GET_PRIVATE(o) \
78 (G_TYPE_INSTANCE_GET_PRIVATE((o), GNC_TYPE_BUDGET, BudgetPrivate))
86 G_DEFINE_TYPE(
GncBudget, gnc_budget, QOF_TYPE_INSTANCE)
94 priv = GET_PRIVATE(budget);
95 priv->name = CACHE_INSERT(_(
"Unnamed Budget"));
96 priv->description = CACHE_INSERT(
"");
98 priv->num_periods = 12;
100 g_date_subtract_days(&date, g_date_get_day(&date) - 1);
101 recurrenceSet(&priv->recurrence, 1, PERIOD_MONTH, &date, WEEKEND_ADJ_NONE);
105 gnc_budget_dispose (GObject *budgetp)
107 G_OBJECT_CLASS(gnc_budget_parent_class)->dispose(budgetp);
111 gnc_budget_finalize(GObject* budgetp)
113 G_OBJECT_CLASS(gnc_budget_parent_class)->finalize(budgetp);
117 gnc_budget_get_property( GObject*
object,
125 g_return_if_fail(GNC_IS_BUDGET(
object));
127 budget = GNC_BUDGET(
object);
128 priv = GET_PRIVATE(budget);
132 g_value_set_string(value, priv->name);
134 case PROP_DESCRIPTION:
135 g_value_set_string(value, priv->description);
137 case PROP_NUM_PERIODS:
138 g_value_set_uint(value, priv->num_periods);
140 case PROP_RECURRENCE:
142 g_value_set_pointer(value, &priv->recurrence);
145 G_OBJECT_WARN_INVALID_PROPERTY_ID(
object, prop_id, pspec);
151 gnc_budget_set_property( GObject*
object,
158 g_return_if_fail(GNC_IS_BUDGET(
object));
160 budget = GNC_BUDGET(
object);
161 if (prop_id < PROP_RUNTIME_0)
162 g_assert (qof_instance_get_editlevel(budget));
169 case PROP_DESCRIPTION:
172 case PROP_NUM_PERIODS:
175 case PROP_RECURRENCE:
176 gnc_budget_set_recurrence(budget, g_value_get_pointer(value));
179 G_OBJECT_WARN_INVALID_PROPERTY_ID(
object, prop_id, pspec);
187 GObjectClass* gobject_class = G_OBJECT_CLASS(klass);
189 gobject_class->dispose = gnc_budget_dispose;
190 gobject_class->finalize = gnc_budget_finalize;
191 gobject_class->get_property = gnc_budget_get_property;
192 gobject_class->set_property = gnc_budget_set_property;
196 g_object_class_install_property(
199 g_param_spec_string(
"name",
201 "The name is an arbitrary string "
202 "assigned by the user. It is intended "
203 "to be a short, 5 to 30 character long string "
204 "that is displayed by the GUI as the "
209 g_object_class_install_property(
212 g_param_spec_string(
"description",
213 "Budget Description",
214 "The description is an arbitrary string "
215 "assigned by the user. It is intended "
216 "to be a longer, 1-5 sentence description of "
217 "what the budget is all about.",
221 g_object_class_install_property(
224 g_param_spec_uint(
"num-periods",
226 "The number of periods for this budget.",
232 g_object_class_install_property(
235 g_param_spec_pointer(
"recurrence",
243 PERR (
"Failed to commit: %d", errcode);
244 gnc_engine_signal_commit_error( errcode );
255 g_return_if_fail(GNC_IS_BUDGET(inst));
257 budget = GNC_BUDGET(inst);
258 priv = GET_PRIVATE(budget);
265 CACHE_REMOVE(priv->name);
266 CACHE_REMOVE(priv->description);
269 g_object_unref(budget);
285 noop, gnc_budget_free);
293 g_return_val_if_fail(book, NULL);
296 budget = g_object_new(GNC_TYPE_BUDGET, NULL);
308 g_return_if_fail(GNC_IS_BUDGET(budget));
309 gnc_budget_begin_edit(budget);
310 qof_instance_set_dirty(&budget->inst);
311 qof_instance_set_destroying(budget, TRUE);
312 gnc_budget_commit_edit(budget);
324 clone_budget_values_cb(
Account* a, gpointer user_data)
329 for ( i = 0; i < data->num_periods; ++i )
331 if ( gnc_budget_is_account_period_value_set(data->old_b, a, i) )
333 gnc_budget_set_account_period_value(data->new_b, a, i,
334 gnc_budget_get_account_period_value(data->old_b, a, i));
346 g_return_val_if_fail(old_b != NULL, NULL);
351 gnc_budget_begin_edit(new_b);
354 gnc_budget_set_recurrence(new_b, gnc_budget_get_recurrence(old_b));
358 clone_data.old_b = old_b;
359 clone_data.new_b = new_b;
360 clone_data.num_periods = gnc_budget_get_num_periods(new_b);
363 gnc_budget_commit_edit(new_b);
375 g_return_if_fail(GNC_IS_BUDGET(budget) && name);
377 priv = GET_PRIVATE(budget);
378 if ( name == priv->name )
return;
380 gnc_budget_begin_edit(budget);
381 CACHE_REPLACE(priv->name, name);
382 qof_instance_set_dirty(&budget->inst);
383 gnc_budget_commit_edit(budget);
389 gnc_budget_get_name(
const GncBudget* budget)
391 g_return_val_if_fail(GNC_IS_BUDGET(budget), NULL);
392 return GET_PRIVATE(budget)->name;
400 g_return_if_fail(GNC_IS_BUDGET(budget));
401 g_return_if_fail(description);
403 priv = GET_PRIVATE(budget);
404 if ( description == priv->description )
return;
405 gnc_budget_begin_edit(budget);
406 CACHE_REPLACE(priv->description, description);
407 qof_instance_set_dirty(&budget->inst);
408 gnc_budget_commit_edit(budget);
414 gnc_budget_get_description(
const GncBudget* budget)
416 g_return_val_if_fail(GNC_IS_BUDGET(budget), NULL);
417 return GET_PRIVATE(budget)->description;
425 g_return_if_fail(budget && r);
426 priv = GET_PRIVATE(budget);
428 gnc_budget_begin_edit(budget);
429 priv->recurrence = *r;
430 qof_instance_set_dirty(&budget->inst);
431 gnc_budget_commit_edit(budget);
437 gnc_budget_get_recurrence(
const GncBudget *budget)
439 g_return_val_if_fail(budget, NULL);
440 return (&GET_PRIVATE(budget)->recurrence);
444 gnc_budget_get_guid(
const GncBudget* budget)
446 g_return_val_if_fail(budget, NULL);
447 g_return_val_if_fail(GNC_IS_BUDGET(budget), NULL);
456 g_return_if_fail(GNC_IS_BUDGET(budget));
458 priv = GET_PRIVATE(budget);
459 if ( priv->num_periods == num_periods )
return;
461 gnc_budget_begin_edit(budget);
462 priv->num_periods = num_periods;
463 qof_instance_set_dirty(&budget->inst);
464 gnc_budget_commit_edit(budget);
470 gnc_budget_get_num_periods(
const GncBudget* budget)
472 g_return_val_if_fail(GNC_IS_BUDGET(budget), 0);
473 return GET_PRIVATE(budget)->num_periods;
476 #define BUF_SIZE (10 + GUID_ENCODING_LENGTH + \
477 GNC_BUDGET_MAX_NUM_PERIODS_DIGITS)
482 gnc_budget_unset_account_period_value(
GncBudget *budget,
const Account *account,
487 gchar path[BUF_SIZE];
490 gnc_budget_begin_edit(budget);
491 frame = qof_instance_get_slots(QOF_INSTANCE(budget));
494 g_sprintf(bufend,
"/%d", period_num);
497 qof_instance_set_dirty(&budget->inst);
498 gnc_budget_commit_edit(budget);
507 gnc_budget_set_account_period_value(
GncBudget *budget,
const Account *account,
512 gchar path[BUF_SIZE];
517 if (period_num >= GET_PRIVATE(budget)->num_periods)
519 PWARN(
"Period %i does not exist", period_num);
523 gnc_budget_begin_edit(budget);
524 frame = qof_instance_get_slots(QOF_INSTANCE(budget));
527 g_sprintf(bufend,
"/%d", period_num);
533 qof_instance_set_dirty(&budget->inst);
534 gnc_budget_commit_edit(budget);
544 gnc_budget_is_account_period_value_set(
const GncBudget *budget,
const Account *account,
547 gchar path[BUF_SIZE];
551 g_return_val_if_fail(GNC_IS_BUDGET(budget), FALSE);
552 g_return_val_if_fail(account, FALSE);
554 frame = qof_instance_get_slots(QOF_INSTANCE(budget));
556 g_sprintf(bufend,
"/%d", period_num);
557 return (kvp_frame_get_value(frame, path) != NULL);
561 gnc_budget_get_account_period_value(
const GncBudget *budget,
const Account *account,
565 gchar path[BUF_SIZE];
569 numeric = gnc_numeric_zero();
570 g_return_val_if_fail(GNC_IS_BUDGET(budget), numeric);
571 g_return_val_if_fail(account, numeric);
573 frame = qof_instance_get_slots(QOF_INSTANCE(budget));
575 g_sprintf(bufend,
"/%d", period_num);
577 numeric = kvp_frame_get_numeric(frame, path);
587 g_return_val_if_fail (GNC_IS_BUDGET(budget), ts);
589 &ts, recurrenceGetPeriodTime(&GET_PRIVATE(budget)->recurrence,
598 g_return_val_if_fail (GNC_IS_BUDGET(budget), ts);
600 &ts, recurrenceGetPeriodTime(&GET_PRIVATE(budget)->recurrence, period_num, TRUE));
605 gnc_budget_get_account_period_actual_value(
609 g_return_val_if_fail(GNC_IS_BUDGET(budget) && acc, gnc_numeric_zero());
610 return recurrenceGetAccountPeriodValue(&GET_PRIVATE(budget)->recurrence,
619 g_return_val_if_fail(guid, NULL);
620 g_return_val_if_fail(book, NULL);
625 static void just_get_one(
QofInstance *ent, gpointer data)
628 if (bgt && !*bgt) *bgt = GNC_BUDGET(ent);
632 gnc_budget_get_default (
QofBook *book)
636 const GncGUID *default_budget_guid = NULL;
638 g_return_val_if_fail(book, NULL);
643 "default-budget", &default_budget_guid,
645 if (default_budget_guid != NULL)
649 default_budget_guid);
667 destroy_budget_on_book_close(
QofInstance *ent, gpointer data)
679 gnc_budget_book_end(
QofBook* book)
699 DI(.e_type = ) GNC_ID_BUDGET,
700 DI(.type_label = ) "Budget",
702 DI(.book_begin = ) NULL,
703 DI(.book_end = ) gnc_budget_book_end,
707 DI(.printable = ) (const
char * (*)(gpointer)) gnc_budget_get_name,
713 static PeriodType gnc_budget_get_rec_pt(const
GncBudget *bgt)
715 return recurrenceGetPeriodType(&(GET_PRIVATE(bgt)->recurrence));
717 static guint gnc_budget_get_rec_mult(
const GncBudget *bgt)
719 return recurrenceGetMultiplier(&(GET_PRIVATE(bgt)->recurrence));
721 static GDate gnc_budget_get_rec_date(
const GncBudget *bgt)
723 return recurrenceGetDate(&(GET_PRIVATE(bgt)->recurrence));
727 gboolean gnc_budget_register (
void)
732 "name", QOF_TYPE_STRING,
737 "description", QOF_TYPE_STRING,
742 "recurrence_period_type", QOF_TYPE_INT32,
747 "recurrence_multiplier", QOF_TYPE_INT32,
754 "recurrence_date", QOF_TYPE_DATE,
759 "num_periods", QOF_TYPE_INT32,
768 QOF_PARAM_GUID, QOF_TYPE_GUID,
void gnc_budget_set_num_periods(GncBudget *budget, guint num_periods)
void gnc_gdate_set_today(GDate *gd)
int qof_instance_version_cmp(const QofInstance *left, const QofInstance *right)
void gnc_budget_destroy(GncBudget *budget)
Timespec gnc_budget_get_period_end_date(const GncBudget *budget, guint period_num)
const GncGUID * qof_instance_get_guid(gconstpointer)
void qof_instance_get(const QofInstance *inst, const gchar *first_param,...)
Wrapper for g_object_get.
void gnc_account_foreach_descendant(const Account *acc, AccountCb thunk, gpointer user_data)
QofBook * qof_instance_get_book(gconstpointer)
gboolean qof_collection_is_dirty(const QofCollection *col)
QofInstance * qof_collection_lookup_entity(const QofCollection *, const GncGUID *)
QofBackendError
The errors that can be reported to the GUI & other front-end users.
GncBudget * gnc_budget_new(QofBook *book)
void qof_class_register(QofIdTypeConst obj_name, QofSortFunc default_sort_fcn, const QofParam *params)
Use a 64-bit unsigned int timespec.
gchar * guid_to_string_buff(const GncGUID *guid, gchar *buff)
gpointer(* QofAccessFunc)(gpointer object, const QofParam *param)
#define QOF_OBJECT_VERSION
gboolean qof_commit_edit(QofInstance *inst)
#define PERR(format, args...)
#define ENTER(format, args...)
KvpFrame * kvp_frame_set_value(KvpFrame *frame, const gchar *path, const KvpValue *value)
void qof_collection_foreach(const QofCollection *, QofInstanceForeachCB, gpointer user_data)
#define PWARN(format, args...)
Timespec gnc_budget_get_period_start_date(const GncBudget *budget, guint period_num)
void qof_instance_init_data(QofInstance *, QofIdType, QofBook *)
gboolean qof_begin_edit(QofInstance *inst)
#define xaccAccountGetGUID(X)
Account handling public routines.
GncBudget * gnc_budget_clone(const GncBudget *old_b)
void kvp_frame_set_numeric(KvpFrame *frame, const gchar *path, gnc_numeric nval)
int(* QofSortFunc)(gconstpointer, gconstpointer)
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 gnc_budget_set_name(GncBudget *budget, const gchar *name)
void gnc_budget_set_description(GncBudget *budget, const gchar *description)
struct KvpFrameImpl KvpFrame
#define LEAVE(format, args...)
void(* QofSetterFunc)(gpointer, gpointer)
GNCNumericErrorCode gnc_numeric_check(gnc_numeric a)
QofCollection * qof_book_get_collection(const QofBook *, QofIdType)
guint qof_collection_count(const QofCollection *col)
gboolean qof_object_register(const QofObject *object)
void qof_event_gen(QofInstance *entity, QofEventId event_type, gpointer event_data)
Invoke all registered event handlers using the given arguments.
Commodity handling public routines.
const gchar * QofLogModule
void timespecFromTime64(Timespec *ts, time64 t)