00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include <stdlib.h>
00023 #include <glib.h>
00024 #include <glib/gprintf.h>
00025 #include <qof.h>
00026 #include "qof-main.h"
00027 #include "qof-datebook.h"
00028 #ifdef HAVE_QOFEXPENSES
00029 #include <qof-expenses.h>
00030
00031 #else
00032 #define qof_currency_lookup pq_currency_lookup
00033 #define QofCurrency PQCurrency
00034 #endif
00035 #include "pilot-expenses.h"
00036 #include "pilot-expenses-p.h"
00037 #include "qof-address.h"
00038 #include "qof-invoice.h"
00039
00040 #define QOF_INVOICE_DESC "Pilot-link QOF Invoice"
00041
00042 static QofLogModule log_module = INVOICE_MOD;
00043
00044 static GList * date_list = NULL;
00045 static GList * addr_list = NULL;
00046 static GList * exp_list = NULL;
00047
00048 typedef struct
00049 {
00050 QofInstance inst;
00051 gchar *category;
00052 const gchar *print_string;
00053 QofCurrency *currency;
00054 gdouble temp_amount;
00057 gboolean reset_amount;
00058 QofDate * inv_date, * pay_date;
00059 gchar * reference;
00060 gchar * note;
00061 gchar * description;
00062 gchar * city;
00063 gchar * vendor;
00066 QofNumeric amount;
00067 } QofInvoice;
00068
00069 static QofInvoice *
00070 invoice_create (QofBook * book)
00071 {
00072 QofInvoice *obj;
00073 QofCollection *coll;
00074 GList *all;
00075
00076 obj = g_new0 (QofInvoice, 1);
00077 qof_instance_init (&obj->inst, PILOT_INVOICE, book);
00078 coll = qof_book_get_collection (book, PILOT_INVOICE);
00079 all = qof_collection_get_data (coll);
00080 all = g_list_prepend (all, obj);
00081 qof_collection_set_data (coll, all);
00082 obj->amount = qof_numeric_zero();
00084 obj->inv_date = qof_date_new_dmy(1,1,1970);
00085 obj->pay_date = qof_date_new_dmy(1,1,1970);
00086 obj->currency = g_new0(QofCurrency, 1);
00087 obj->currency->pq_code = -1;
00088 return obj;
00089 }
00090
00091 static QofTime*
00092 inv_getTime (QofInvoice * e)
00093 {
00094 QofTime *qt;
00095
00096 g_return_val_if_fail (e != NULL, NULL);
00097 ENTER (" ");
00101 qt = qof_date_to_qtime (e->inv_date);
00102 LEAVE (" ");
00103 return qt;
00104 }
00105
00106 static QofTime*
00107 pay_getTime (QofInvoice * e)
00108 {
00109 QofTime *qt;
00110
00111 g_return_val_if_fail (e != NULL, NULL);
00115 qt = qof_date_to_qtime (e->pay_date);
00116 return qt;
00117 }
00118
00119 static gint
00120 inv_getCurrency (QofInvoice * i)
00121 {
00122 QofCurrency * c;
00123
00124 g_return_val_if_fail (i != NULL, -1);
00125 if (!i->currency)
00126 return -1;
00127 c = i->currency;
00128 return c->pq_code;
00129 }
00130
00131 static const gchar *
00132 inv_getReference (QofInvoice * e)
00133 {
00134 g_return_val_if_fail (e != NULL, NULL);
00135 return e->reference;
00136 }
00137
00138 static const gchar *
00139 inv_getDescription (QofInvoice * e)
00140 {
00141 g_return_val_if_fail (e != NULL, NULL);
00142 return e->description;
00143 }
00144
00145 static QofNumeric
00146 inv_getAmount (QofInvoice * e)
00147 {
00148 QofNumeric amount;
00149
00150 amount = qof_numeric_zero ();
00151 g_return_val_if_fail (e != NULL, amount);
00152 if (qof_numeric_check (e->amount) == QOF_ERROR_OK)
00153 return e->amount;
00154 return qof_numeric_zero ();
00155 }
00156
00157 static const gchar *
00158 inv_getVendor (QofInvoice * e)
00159 {
00160 g_return_val_if_fail (e != NULL, NULL);
00161 return e->vendor;
00162 }
00163
00164 static const gchar *
00165 inv_getCity (QofInvoice * e)
00166 {
00167 g_return_val_if_fail (e != NULL, NULL);
00168 return e->city;
00169 }
00170
00171 static const gchar *
00172 inv_getNote (QofInvoice * e)
00173 {
00174 g_return_val_if_fail (e != NULL, NULL);
00175 return e->note;
00176 }
00177
00178 static const gchar *
00179 inv_getCategory (QofInvoice * e)
00180 {
00181 g_return_val_if_fail (e != NULL, NULL);
00182 return e->category;
00183 }
00184
00185 static void
00186 inv_setTime (QofInvoice * e, QofTime *h)
00187 {
00188 g_return_if_fail (e != NULL);
00189 e->inv_date = qof_date_from_qtime (h);
00190 }
00191
00192 static void
00193 pay_setTime (QofInvoice * e, QofTime *h)
00194 {
00195 g_return_if_fail (e != NULL);
00196 e->pay_date = qof_date_from_qtime (h);
00197 }
00198
00199 static void
00200 inv_setReference (QofInvoice * e, const gchar * type_string)
00201 {
00202 g_return_if_fail (e != NULL);
00203 e->reference = g_strdup (type_string);
00204 }
00205
00206 static void
00207 inv_setCurrency (QofInvoice * i, gint code)
00208 {
00209 g_return_if_fail (i != NULL);
00210 i->currency = qof_currency_lookup ((QofInstance*) i, code);
00211 }
00212
00213 static void
00214 inv_setDescription (QofInvoice * e, const gchar * desc_string)
00215 {
00216 g_return_if_fail (e != NULL);
00217 e->description = g_strdup (desc_string);
00218 }
00219
00220 static void
00221 inv_setAmount (QofInvoice * e, QofNumeric h)
00222 {
00223 g_return_if_fail (e != NULL);
00224 e->amount = h;
00225 e->temp_amount = qof_numeric_to_double (h);
00226 e->reset_amount = TRUE;
00227
00228
00231
00232
00233 }
00234
00235 static void
00236 inv_setVendor (QofInvoice * e, gchar * h)
00237 {
00238 g_return_if_fail (e != NULL);
00239 e->vendor = g_strdup (qof_util_make_utf8 (h));
00240 }
00241
00242 static void
00243 inv_setCity (QofInvoice * e, gchar * h)
00244 {
00245 g_return_if_fail (e != NULL);
00246 e->city = g_strdup (qof_util_make_utf8 (h));
00247 }
00248
00249 static void
00250 inv_setNote (QofInvoice * e, gchar * h)
00251 {
00252 g_return_if_fail (e != NULL);
00253 e->note = g_strdup (qof_util_make_utf8 (h));
00254 }
00255
00256 static void
00257 inv_setCategory (QofInvoice * e, gchar * n)
00258 {
00259 g_return_if_fail (e != NULL);
00260 e->category = g_strdup (qof_util_make_utf8 (n));
00261 }
00262
00263 static QofCollection *
00264 inv_getDates (QofInvoice * invoice)
00265 {
00266 QofCollection *entry_coll;
00267 GList *list;
00268 QofEntity *entry;
00269
00270 entry_coll = qof_collection_new(PILOT_LINK_QOF_DATEBOOK);
00271 for(list = date_list; list != NULL; list = list->next)
00272 {
00273 entry = QOF_ENTITY(list->data);
00274 qof_collection_add_entity(entry_coll, entry);
00275 }
00276 return entry_coll;
00277 }
00278
00279 static QofCollection *
00280 inv_getAddresses (QofInvoice * invoice)
00281 {
00282 QofCollection *entry_coll;
00283 GList *list;
00284 QofEntity *entry;
00285
00286 entry_coll = qof_collection_new(PILOT_LINK_QOF_ADDRESS);
00287 for(list = addr_list; list != NULL; list = list->next)
00288 {
00289 entry = QOF_ENTITY(list->data);
00290 qof_collection_add_entity(entry_coll, entry);
00291 }
00292 return entry_coll;
00293 }
00294
00295 static QofCollection *
00296 inv_getExpenses (QofInvoice * invoice)
00297 {
00298 QofCollection *entry_coll;
00299 GList *list;
00300 QofEntity *entry;
00301
00302 entry_coll = qof_collection_new(PILOT_LINK_QOF_EXPENSES);
00303 for(list = exp_list; list != NULL; list = list->next)
00304 {
00305 entry = QOF_ENTITY(list->data);
00306 qof_collection_add_entity(entry_coll, entry);
00307 }
00308 return entry_coll;
00309 }
00310
00311 static void
00312 inv_add_date_cb (QofEntity *ent, gpointer user_data)
00313 {
00314 QofInvoice *invoice;
00315
00316 invoice = (QofInvoice*)user_data;
00317 if(!invoice || !ent) { return; }
00318 date_list = g_list_append (date_list, ent);
00319 }
00320
00321 static void
00322 inv_add_addr_cb (QofEntity *ent, gpointer user_data)
00323 {
00324 QofInvoice *invoice;
00325
00326 invoice = (QofInvoice*)user_data;
00327 if(!invoice || !ent) { return; }
00328 addr_list = g_list_append (addr_list, ent);
00329 }
00330
00331 static void
00332 inv_add_exp_cb (QofEntity *ent, gpointer user_data)
00333 {
00334 QofInvoice *invoice;
00335
00336 invoice = (QofInvoice*)user_data;
00337 if(!invoice || !ent) { return; }
00338 exp_list = g_list_append (exp_list, ent);
00339 }
00340
00341 static void
00342 inv_setDates (QofInvoice *invoice, QofCollection *entry_coll)
00343 {
00344 if(!entry_coll) { return; }
00345 if(0 == safe_strcmp(qof_collection_get_type(entry_coll), PILOT_LINK_QOF_DATEBOOK))
00346 {
00347 qof_collection_foreach(entry_coll, inv_add_date_cb, invoice);
00348 }
00349 }
00350
00351 static void
00352 inv_setAddresses (QofInvoice *invoice, QofCollection *entry_coll)
00353 {
00354 if(!entry_coll) { return; }
00355 if(0 == safe_strcmp(qof_collection_get_type(entry_coll), PILOT_LINK_QOF_ADDRESS))
00356 {
00357 qof_collection_foreach(entry_coll, inv_add_addr_cb, invoice);
00358 }
00359 }
00360
00361 static void
00362 inv_setExpenses (QofInvoice *invoice, QofCollection *entry_coll)
00363 {
00364 if(!entry_coll) { return; }
00365 if(0 == safe_strcmp(qof_collection_get_type(entry_coll), PILOT_LINK_QOF_EXPENSES))
00366 {
00367 qof_collection_foreach(entry_coll, inv_add_exp_cb, invoice);
00368 }
00369 }
00370
00371 static const gchar *
00372 invoicePrintable (gpointer instance)
00373 {
00374 QofInvoice *obj;
00375
00376 obj = (QofInvoice *) instance;
00377 if (!obj)
00378 return NULL;
00379 if (inv_getDescription (obj))
00380 return g_strconcat (inv_getDescription (obj), " ",
00381 inv_getVendor (obj), " ", inv_getCity (obj), NULL);
00382 return NULL;
00383 }
00384
00385 static QofObject expenses_object_def = {
00386 interface_version : QOF_OBJECT_VERSION,
00387 e_type : PILOT_INVOICE,
00388 type_label : QOF_INVOICE_DESC,
00389 create : (gpointer) invoice_create,
00390 book_begin : NULL,
00391 book_end : NULL,
00392 is_dirty : qof_collection_is_dirty,
00393 mark_clean : qof_collection_mark_clean,
00394 foreach : qof_collection_foreach,
00395 printable : invoicePrintable,
00396 version_cmp : (gint (*)(gpointer, gpointer)) qof_instance_version_cmp,
00397 };
00398
00399 gboolean
00400 InvoiceRegister (void)
00401 {
00402 static QofParam params[] = {
00403 {INV_DATE, QOF_TYPE_TIME, (QofAccessFunc) inv_getTime,
00404 (QofSetterFunc) inv_setTime, NULL},
00405 {PAY_DATE, QOF_TYPE_TIME, (QofAccessFunc) pay_getTime,
00406 (QofSetterFunc) pay_setTime, NULL},
00407 {INV_REFERENCE, QOF_TYPE_STRING, (QofAccessFunc) inv_getReference,
00408 (QofSetterFunc) inv_setReference, NULL},
00409 {INV_CURRENCY, QOF_TYPE_INT32, (QofAccessFunc) inv_getCurrency,
00410 (QofSetterFunc) inv_setCurrency, NULL},
00411 {INV_AMOUNT, QOF_TYPE_NUMERIC, (QofAccessFunc) inv_getAmount,
00412 (QofSetterFunc) inv_setAmount, NULL},
00413 {INV_VENDOR, QOF_TYPE_STRING, (QofAccessFunc) inv_getVendor,
00414 (QofSetterFunc) inv_setVendor, NULL},
00415 {INV_CITY, QOF_TYPE_STRING, (QofAccessFunc) inv_getCity,
00416 (QofSetterFunc) inv_setCity, NULL},
00417 {INV_DESCRIPTION, QOF_TYPE_STRING, (QofAccessFunc) inv_getDescription,
00418 (QofSetterFunc) inv_setDescription, NULL},
00419 {INV_NOTE, QOF_TYPE_STRING, (QofAccessFunc) inv_getNote,
00420 (QofSetterFunc) inv_setNote, NULL},
00421 {INV_CATEGORY, QOF_TYPE_STRING, (QofAccessFunc) inv_getCategory,
00422 (QofSetterFunc) inv_setCategory, NULL},
00423 {INV_DATES, QOF_TYPE_COLLECT, (QofAccessFunc)inv_getDates,
00424 (QofSetterFunc)inv_setDates, NULL},
00425 {INV_ADDR, QOF_TYPE_COLLECT, (QofAccessFunc)inv_getAddresses,
00426 (QofSetterFunc)inv_setAddresses, NULL},
00427 {INV_EXPENSE, QOF_TYPE_COLLECT, (QofAccessFunc)inv_getExpenses,
00428 (QofSetterFunc)inv_setExpenses, NULL},
00429 {INV_KVP, QOF_TYPE_KVP, (QofAccessFunc) qof_instance_get_slots,
00430 NULL, NULL},
00431 {QOF_PARAM_BOOK, QOF_ID_BOOK,
00432 (QofAccessFunc) qof_instance_get_book, NULL, NULL},
00433 {QOF_PARAM_GUID, QOF_TYPE_GUID,
00434 (QofAccessFunc) qof_instance_get_guid, NULL, NULL},
00435 {NULL, NULL, NULL, NULL, NULL},
00436 };
00437
00438 qof_class_register (PILOT_INVOICE, NULL, params);
00439
00440 return qof_object_register (&expenses_object_def);
00441 }