33 #include <qofinstance-p.h>
37 #include "gncAddressP.h"
39 #include "gncEmployeeP.h"
41 static gint gs_address_event_handler_id = 0;
43 gpointer user_data, gpointer event_data);
69 #define _GNC_MOD_NAME GNC_ID_EMPLOYEE
71 G_INLINE_FUNC
void mark_employee (
GncEmployee *employee);
74 qof_instance_set_dirty(&employee->inst);
95 PROP_PAYMENT_LAST_ACCT,
99 G_DEFINE_TYPE(
GncEmployee, gnc_employee, QOF_TYPE_INSTANCE);
107 gnc_employee_dispose(GObject *empp)
109 G_OBJECT_CLASS(gnc_employee_parent_class)->dispose(empp);
113 gnc_employee_finalize(GObject* empp)
115 G_OBJECT_CLASS(gnc_employee_parent_class)->finalize(empp);
125 gnc_employee_get_property (GObject *
object,
133 g_return_if_fail(GNC_IS_EMPLOYEE(
object));
135 emp = GNC_EMPLOYEE(
object);
139 g_value_set_string(value, emp->username);
142 g_value_set_string(value, emp->id);
145 g_value_set_boolean(value, emp->active);
148 g_value_set_string(value, emp->language);
151 g_value_take_object(value, emp->currency);
154 g_value_set_string(value, emp->acl);
157 g_value_take_object(value, emp->addr);
160 g_value_set_boxed(value, &emp->workday);
163 g_value_set_boxed(value, &emp->rate);
166 g_value_take_object(value, emp->ccard_acc);
168 case PROP_PDF_DIRNAME:
169 key = OWNER_EXPORT_PDF_DIRNAME;
170 qof_instance_get_kvp (QOF_INSTANCE (emp), key, value);
172 case PROP_LAST_POSTED:
173 key = LAST_POSTED_TO_ACCT;
174 qof_instance_get_kvp (QOF_INSTANCE (emp), key, value);
176 case PROP_PAYMENT_LAST_ACCT:
177 key = GNC_PAYMENT
"/" GNC_LAST_ACCOUNT;
178 qof_instance_get_kvp (QOF_INSTANCE (emp), key, value);
181 G_OBJECT_WARN_INVALID_PROPERTY_ID(
object, prop_id, pspec);
187 gnc_employee_set_property (GObject *
object,
195 g_return_if_fail(GNC_IS_EMPLOYEE(
object));
197 emp = GNC_EMPLOYEE(
object);
198 g_assert (qof_instance_get_editlevel(emp));
203 gncEmployeeSetUsername(emp, g_value_get_string(value));
206 gncEmployeeSetID(emp, g_value_get_string(value));
209 gncEmployeeSetActive(emp, g_value_get_boolean(value));
212 gncEmployeeSetLanguage(emp, g_value_get_string(value));
215 gncEmployeeSetCurrency(emp, g_value_get_object(value));
218 gncEmployeeSetAcl(emp, g_value_get_string(value));
221 qofEmployeeSetAddr(emp, g_value_get_object(value));
224 gncEmployeeSetWorkday(emp, *(
gnc_numeric*)g_value_get_boxed(value));
227 gncEmployeeSetRate(emp, *(
gnc_numeric*)g_value_get_boxed(value));
230 gncEmployeeSetCCard(emp, g_value_get_object(value));
232 case PROP_PDF_DIRNAME:
233 key = OWNER_EXPORT_PDF_DIRNAME;
234 qof_instance_set_kvp (QOF_INSTANCE (emp), key, value);
236 case PROP_LAST_POSTED:
237 key = LAST_POSTED_TO_ACCT;
238 qof_instance_set_kvp (QOF_INSTANCE (emp), key, value);
240 case PROP_PAYMENT_LAST_ACCT:
241 key = GNC_PAYMENT
"/" GNC_LAST_ACCOUNT;
242 qof_instance_set_kvp (QOF_INSTANCE (emp), key, value);
245 G_OBJECT_WARN_INVALID_PROPERTY_ID(
object, prop_id, pspec);
256 g_return_val_if_fail(inst != NULL, FALSE);
257 g_return_val_if_fail(GNC_IS_EMPLOYEE(inst), FALSE);
259 emp = GNC_EMPLOYEE(inst);
261 if (GNC_IS_COMMODITY(ref))
263 return (emp->currency == GNC_COMMODITY(ref));
265 else if (GNC_IS_ACCOUNT(ref))
267 return (emp->ccard_acc == GNC_ACCOUNT(ref));
282 if (!GNC_IS_COMMODITY(ref) && !GNC_IS_ACCOUNT(ref))
293 GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
296 gobject_class->dispose = gnc_employee_dispose;
297 gobject_class->finalize = gnc_employee_finalize;
298 gobject_class->set_property = gnc_employee_set_property;
299 gobject_class->get_property = gnc_employee_get_property;
301 qof_class->get_display_name = NULL;
302 qof_class->refers_to_object = impl_refers_to_object;
303 qof_class->get_typed_referring_object_list = impl_get_typed_referring_object_list;
305 g_object_class_install_property
308 g_param_spec_string (
"username",
310 "The employee name is an arbitrary string "
311 "assigned by the user which provides the employee "
316 g_object_class_install_property
319 g_param_spec_string (
"id",
321 "The employee ID is an arbitrary string "
322 "assigned by the user which provides the employee "
327 g_object_class_install_property
330 g_param_spec_boolean (
"active",
332 "TRUE if the employee is active. FALSE if inactive.",
336 g_object_class_install_property
339 g_param_spec_string (
"language",
341 "The language is an arbitrary string "
342 "assigned by the user which provides the language spoken "
347 g_object_class_install_property
350 g_param_spec_object (
"currency",
352 "The currency property denotes the currency used by this employee.",
356 g_object_class_install_property
359 g_param_spec_string (
"acl",
361 "The acl is an arbitrary string "
362 "assigned by the user which provides ??? "
363 " for the employee.",
367 g_object_class_install_property
370 g_param_spec_object (
"address",
372 "The address property contains the address information for this employee.",
376 g_object_class_install_property
379 g_param_spec_boxed(
"workday",
381 "The daily rate for this employee.",
385 g_object_class_install_property
388 g_param_spec_boxed(
"rate",
390 "The hourly rate for this employee.",
394 g_object_class_install_property
397 g_param_spec_object (
"credit-card-account",
398 "Credit card account",
399 "The credit card account for this employee.",
403 g_object_class_install_property
406 g_param_spec_string (
"export-pdf-dir",
407 "Export PDF Directory Name",
408 "A subdirectory for exporting PDF reports which is "
409 "appended to the target directory when writing them "
410 "out. It is retrieved from preferences and stored on "
411 "each 'Owner' object which prints items after "
416 g_object_class_install_property(
419 g_param_spec_boxed(
"invoice-last-posted-account",
420 "Invoice Last Posted Account",
421 "The last account to which an invoice belonging to "
422 "this owner was posted.",
426 g_object_class_install_property(
428 PROP_PAYMENT_LAST_ACCT,
429 g_param_spec_boxed(
"payment-last-account",
430 "Payment Last Account",
431 "The last account to which an payment belonging to "
432 "this owner was posted.",
442 if (!book)
return NULL;
444 employee = g_object_new (GNC_TYPE_EMPLOYEE, NULL);
447 employee->id = CACHE_INSERT (
"");
448 employee->username = CACHE_INSERT (
"");
449 employee->language = CACHE_INSERT (
"");
450 employee->acl = CACHE_INSERT (
"");
451 employee->addr = gncAddressCreate (book, &employee->inst);
452 employee->workday = gnc_numeric_zero();
453 employee->rate = gnc_numeric_zero();
454 employee->active = TRUE;
456 if (gs_address_event_handler_id == 0)
468 if (!employee)
return;
469 qof_instance_set_destroying(employee, TRUE);
470 gncEmployeeCommitEdit(employee);
473 static void gncEmployeeFree (
GncEmployee *employee)
475 if (!employee)
return;
479 CACHE_REMOVE (employee->id);
480 CACHE_REMOVE (employee->username);
481 CACHE_REMOVE (employee->language);
482 CACHE_REMOVE (employee->acl);
483 gncAddressBeginEdit (employee->addr);
484 gncAddressDestroy (employee->addr);
487 g_object_unref (employee);
493 #define SET_STR(obj, member, str) { \
496 if (!g_strcmp0 (member, str)) return; \
497 gncEmployeeBeginEdit (obj); \
498 tmp = CACHE_INSERT (str); \
499 CACHE_REMOVE (member); \
503 void gncEmployeeSetID (
GncEmployee *employee,
const char *
id)
505 if (!employee)
return;
507 SET_STR(employee, employee->id,
id);
508 mark_employee (employee);
509 gncEmployeeCommitEdit (employee);
512 void gncEmployeeSetUsername (
GncEmployee *employee,
const char *username)
514 if (!employee)
return;
515 if (!username)
return;
516 SET_STR(employee, employee->username, username);
517 mark_employee (employee);
518 gncEmployeeCommitEdit (employee);
526 void gncEmployeeSetName (
GncEmployee *employee,
const char *name)
528 if (!employee)
return;
530 gncAddressSetName (gncEmployeeGetAddr (employee), name);
533 void gncEmployeeSetLanguage (
GncEmployee *employee,
const char *language)
535 if (!employee)
return;
536 if (!language)
return;
537 SET_STR(employee, employee->language, language);
538 mark_employee (employee);
539 gncEmployeeCommitEdit (employee);
542 void gncEmployeeSetAcl (
GncEmployee *employee,
const char *acl)
544 if (!employee)
return;
546 SET_STR(employee, employee->acl, acl);
547 mark_employee (employee);
548 gncEmployeeCommitEdit (employee);
553 if (!employee)
return;
555 gncEmployeeBeginEdit (employee);
556 employee->workday = workday;
557 mark_employee (employee);
558 gncEmployeeCommitEdit (employee);
563 if (!employee)
return;
565 gncEmployeeBeginEdit (employee);
566 employee->rate = rate;
567 mark_employee (employee);
568 gncEmployeeCommitEdit (employee);
573 if (!employee || !currency)
return;
574 if (employee->currency &&
577 gncEmployeeBeginEdit (employee);
578 employee->currency = currency;
579 mark_employee (employee);
580 gncEmployeeCommitEdit (employee);
583 void gncEmployeeSetActive (
GncEmployee *employee, gboolean active)
585 if (!employee)
return;
586 if (active == employee->active)
return;
587 gncEmployeeBeginEdit (employee);
588 employee->active = active;
589 mark_employee (employee);
590 gncEmployeeCommitEdit (employee);
595 if (!employee)
return;
596 if (ccard_acc == employee->ccard_acc)
return;
597 gncEmployeeBeginEdit (employee);
598 employee->ccard_acc = ccard_acc;
599 mark_employee (employee);
600 gncEmployeeCommitEdit (employee);
608 if (!employee || !addr_ent)
613 if (addr == employee->addr)
617 if (employee->addr != NULL)
619 gncAddressBeginEdit(employee->addr);
620 gncAddressDestroy(employee->addr);
622 gncEmployeeBeginEdit(employee);
623 employee->addr = addr;
624 mark_employee (employee);
625 gncEmployeeCommitEdit(employee);
630 const char * gncEmployeeGetID (
const GncEmployee *employee)
632 if (!employee)
return NULL;
636 const char * gncEmployeeGetUsername (
const GncEmployee *employee)
638 if (!employee)
return NULL;
639 return employee->username;
647 const char * gncEmployeeGetName (
const GncEmployee *employee)
649 if (!employee)
return NULL;
650 return gncAddressGetName ( gncEmployeeGetAddr (employee));
655 if (!employee)
return NULL;
656 return employee->addr;
659 const char * gncEmployeeGetLanguage (
const GncEmployee *employee)
661 if (!employee)
return NULL;
662 return employee->language;
665 const char * gncEmployeeGetAcl (
const GncEmployee *employee)
667 if (!employee)
return NULL;
668 return employee->acl;
673 if (!employee)
return gnc_numeric_zero();
674 return employee->workday;
679 if (!employee)
return gnc_numeric_zero();
680 return employee->rate;
685 if (!employee)
return NULL;
686 return employee->currency;
689 gboolean gncEmployeeGetActive (
const GncEmployee *employee)
691 if (!employee)
return FALSE;
692 return employee->active;
697 if (!employee)
return NULL;
698 return employee->ccard_acc;
701 gboolean gncEmployeeIsDirty (
const GncEmployee *employee)
703 if (!employee)
return FALSE;
705 || gncAddressIsDirty (employee->addr));
715 PERR(
"Employee QofBackend Failure: %d", errcode);
716 gnc_engine_signal_commit_error( errcode );
722 gncAddressClearDirty (employee->addr);
728 gncEmployeeFree (employee);
736 gncEmployeeOnDone, emp_free);
744 if (!a && !b)
return 0;
745 if (!a && b)
return 1;
746 if (a && !b)
return -1;
748 return(strcmp(a->username, b->username));
753 if (a == NULL && b == NULL)
return TRUE;
754 if (a == NULL || b == NULL )
return FALSE;
756 g_return_val_if_fail(GNC_IS_EMPLOYEE(a), FALSE);
757 g_return_val_if_fail(GNC_IS_EMPLOYEE(b), FALSE);
759 if (g_strcmp0(a->id, b->id) != 0)
761 PWARN(
"IDs differ: %s vs %s", a->id, b->id);
765 if (g_strcmp0(a->username, b->username) != 0)
767 PWARN(
"Usernames differ: %s vs %s", a->username, b->username);
773 PWARN(
"Addresses differ");
779 PWARN(
"Currencies differ");
783 if (a->active != b->active)
785 PWARN(
"Active flags differ");
789 if (g_strcmp0(a->language, b->language) != 0)
791 PWARN(
"Languages differ: %s vs %s", a->language, b->language);
795 if (g_strcmp0(a->acl, b->acl) != 0)
797 PWARN(
"ACLs differ: %s vs %s", a->acl, b->acl);
803 PWARN(
"Accounts differ");
809 PWARN(
"Workdays differ");
815 PWARN(
"Rates differ");
824 static const char * _gncEmployeePrintable (gpointer item)
827 if (!item)
return NULL;
828 return gncAddressGetName(v->addr);
842 gpointer user_data, gpointer event_data)
846 if ((event_type & QOF_EVENT_MODIFY) == 0)
850 if (!GNC_IS_ADDRESS(entity))
854 if (!GNC_IS_EMPLOYEE(event_data))
858 empl = GNC_EMPLOYEE(event_data);
859 gncEmployeeBeginEdit(empl);
861 gncEmployeeCommitEdit(empl);
865 destroy_employee_on_book_close(
QofInstance *ent, gpointer data)
869 gncEmployeeBeginEdit(e);
870 gncEmployeeDestroy(e);
878 gnc_employee_book_end(
QofBook* book)
889 DI(.e_type = ) _GNC_MOD_NAME,
890 DI(.type_label = ) "Employee",
891 DI(.create = ) (gpointer)gncEmployeeCreate,
892 DI(.book_begin = ) NULL,
893 DI(.book_end = ) gnc_employee_book_end,
897 DI(.printable = ) _gncEmployeePrintable,
901 gboolean gncEmployeeRegister (
void)
907 EMPLOYEE_USERNAME, QOF_TYPE_STRING, (
QofAccessFunc)gncEmployeeGetUsername,
911 EMPLOYEE_NAME, QOF_TYPE_STRING, (
QofAccessFunc)gncEmployeeGetName,
915 EMPLOYEE_LANGUAGE, QOF_TYPE_STRING, (
QofAccessFunc)gncEmployeeGetLanguage,
920 EMPLOYEE_WORKDAY, QOF_TYPE_NUMERIC, (
QofAccessFunc)gncEmployeeGetWorkday,
937 gchar *gncEmployeeNextID (
QofBook *book)
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.
gchar * qof_book_increment_and_format_counter(QofBook *book, const char *counter_name)
GList * qof_instance_get_referring_object_list_from_collection(const QofCollection *coll, const QofInstance *ref)
void qof_class_register(QofIdTypeConst obj_name, QofSortFunc default_sort_fcn, const QofParam *params)
gboolean gnc_commodity_equal(const gnc_commodity *a, const gnc_commodity *b)
QofCollection * qof_instance_get_collection(gconstpointer inst)
gpointer(* QofAccessFunc)(gpointer object, const QofParam *param)
#define QOF_OBJECT_VERSION
gboolean qof_commit_edit(QofInstance *inst)
#define PERR(format, args...)
void qof_collection_foreach(const QofCollection *, QofInstanceForeachCB, gpointer user_data)
gint qof_event_register_handler(QofEventHandler handler, gpointer handler_data)
Register a handler for events.
#define PWARN(format, args...)
void qof_instance_init_data(QofInstance *, QofIdType, QofBook *)
gboolean qof_begin_edit(QofInstance *inst)
Account handling public routines.
gboolean qof_instance_get_dirty_flag(gconstpointer ptr)
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 *)
gboolean xaccAccountEqual(const Account *aa, const Account *ab, gboolean check_guids)
gboolean gncAddressEqual(const GncAddress *a, const GncAddress *b)
Deeply compare two addresses.
void(* QofSetterFunc)(gpointer, gpointer)
QofCollection * qof_book_get_collection(const QofBook *, QofIdType)
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
gboolean gncEmployeeEqual(const GncEmployee *a, const GncEmployee *b)