00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include "config.h"
00023 #include <stdlib.h>
00024 #include <glib.h>
00025 #include <libintl.h>
00026 #include <glib/gprintf.h>
00027 #include <qof.h>
00028 #include <locale.h>
00029 #include "qof-expenses.h"
00030 #define _(String) dgettext (LIBRARY_GETTEXT_PACKAGE, String)
00031
00032 static QofLogModule log_module = GPE_MOD_EXP;
00033
00034 AS_STRING_FUNC (ExpenseDistance, DISTANCE_LIST)
00035 FROM_STRING_FUNC(ExpenseDistance, DISTANCE_LIST)
00036 AS_STRING_FUNC (ExpensePayment, PAYMENT_TYPE_LIST)
00037 FROM_STRING_FUNC(ExpensePayment, PAYMENT_TYPE_LIST)
00038
00039
00040
00041 AS_STRING_FUNC (ExpenseType, EXPENSE_TYPE_LIST)
00042 FROM_STRING_FUNC(ExpenseType, EXPENSE_TYPE_LIST)
00043
00048 static GHashTable *qof_currency_table = NULL;
00049
00050 void
00051 qof_currency_foreach(QofCurrencyCB cb, gpointer user_data)
00052 {
00053 g_hash_table_foreach(qof_currency_table, cb, user_data);
00054 }
00055
00072 static void
00073 populate_currencies (void)
00074 {
00075 qof_currency_table = g_hash_table_new(g_direct_hash, g_direct_equal);
00076 {
00077 QofCurrency *c = g_new0(QofCurrency, 1);
00078 c->pq_code = 0;
00079 c->fraction = 100;
00080 c->symbol = "AU$";
00081 c->mnemonic = "AUD";
00082 c->non_utf8 = FALSE;
00083 g_hash_table_insert(qof_currency_table,
00084 GINT_TO_POINTER(c->pq_code), (gpointer)c);
00085 }
00086 {
00087 QofCurrency *c = g_new0(QofCurrency, 1);
00088 c->pq_code = 1;
00089 c->fraction = 100;
00090 c->symbol = "€";
00091 c->mnemonic = "ATS";
00092 c->non_utf8 = TRUE;
00093 g_hash_table_insert(qof_currency_table,
00094 GINT_TO_POINTER(c->pq_code), (gpointer)c);
00095 }
00096 {
00097 QofCurrency *c = g_new0(QofCurrency, 1);
00098 c->pq_code = 2;
00099 c->fraction = 100;
00100 c->symbol = "€";
00101 c->mnemonic = "BEF";
00102 c->non_utf8 = TRUE;
00103 g_hash_table_insert(qof_currency_table,
00104 GINT_TO_POINTER(c->pq_code), (gpointer)c);
00105 }
00106 {
00107 QofCurrency *c = g_new0(QofCurrency, 1);
00108 c->pq_code = 3;
00109 c->fraction = 100;
00110 c->symbol = "R$";
00111 c->mnemonic = "BRL";
00112 c->non_utf8 = FALSE;
00113 g_hash_table_insert(qof_currency_table,
00114 GINT_TO_POINTER(c->pq_code), (gpointer)c);
00115 }
00116 {
00117 QofCurrency *c = g_new0(QofCurrency, 1);
00118 c->pq_code = 4;
00119 c->fraction = 100;
00120 c->symbol = "$CN";
00121 c->mnemonic = "CAD";
00122 c->non_utf8 = FALSE;
00123 g_hash_table_insert(qof_currency_table,
00124 GINT_TO_POINTER(c->pq_code), (gpointer)c);
00125 }
00126 {
00127 QofCurrency *c = g_new0(QofCurrency, 1);
00128 c->pq_code = 5;
00129 c->fraction = 100;
00130 c->symbol = "DKK";
00131 c->mnemonic = "DKK";
00132 c->non_utf8 = FALSE;
00133 g_hash_table_insert(qof_currency_table,
00134 GINT_TO_POINTER(c->pq_code), (gpointer)c);
00135 }
00136 {
00137 QofCurrency *c = g_new0(QofCurrency, 1);
00138 c->pq_code = 6;
00139 c->fraction = 100;
00140 c->symbol = "€";
00141 c->mnemonic = "FIM";
00142 c->non_utf8 = TRUE;
00143 g_hash_table_insert(qof_currency_table,
00144 GINT_TO_POINTER(c->pq_code), (gpointer)c);
00145 }
00146 {
00147 QofCurrency *c = g_new0(QofCurrency, 1);
00148 c->pq_code = 7;
00149 c->fraction = 100;
00150 c->symbol = "€";
00151 c->mnemonic = "FRF";
00152 c->non_utf8 = TRUE;
00153 g_hash_table_insert(qof_currency_table,
00154 GINT_TO_POINTER(c->pq_code), (gpointer)c);
00155 }
00156 {
00157 QofCurrency *c = g_new0(QofCurrency, 1);
00158 c->pq_code = 8;
00159 c->fraction = 100;
00160 c->symbol = "€";
00161 c->mnemonic = "DEM";
00162 c->non_utf8 = TRUE;
00163 g_hash_table_insert(qof_currency_table,
00164 GINT_TO_POINTER(c->pq_code), (gpointer)c);
00165 }
00166 {
00167 QofCurrency *c = g_new0(QofCurrency, 1);
00168 c->pq_code = 9;
00169 c->fraction = 100;
00170 c->symbol = "HK$";
00171 c->mnemonic = "HKD";
00172 c->non_utf8 = FALSE;
00173 g_hash_table_insert(qof_currency_table,
00174 GINT_TO_POINTER(c->pq_code), (gpointer)c);
00175 }
00176 {
00177 QofCurrency *c = g_new0(QofCurrency, 1);
00178 c->pq_code = 10;
00179 c->fraction = 100;
00180 c->symbol = "ISK";
00181 c->mnemonic = "ISK";
00182 c->non_utf8 = FALSE;
00183 g_hash_table_insert(qof_currency_table,
00184 GINT_TO_POINTER(c->pq_code), (gpointer)c);
00185 }
00186 {
00187 QofCurrency *c = g_new0(QofCurrency, 1);
00188 c->pq_code = 11;
00189 c->fraction = 100;
00190 c->symbol = "€";
00191 c->mnemonic = "IEP";
00192 c->non_utf8 = TRUE;
00193 g_hash_table_insert(qof_currency_table,
00194 GINT_TO_POINTER(c->pq_code), (gpointer)c);
00195 }
00196 {
00197
00198 QofCurrency *c = g_new0(QofCurrency, 1);
00199 c->pq_code = 12;
00200 c->fraction = 100;
00201 c->symbol = "EUR";
00202 c->mnemonic = "ITL";
00203 c->non_utf8 = FALSE;
00204 g_hash_table_insert(qof_currency_table,
00205 GINT_TO_POINTER(c->pq_code), (gpointer)c);
00206 }
00207 {
00208 QofCurrency *c = g_new0(QofCurrency, 1);
00209 c->pq_code = 13;
00210 c->fraction = 1;
00211 c->symbol = "¥";
00212 c->mnemonic = "JPY";
00213 c->non_utf8 = TRUE;
00214 g_hash_table_insert(qof_currency_table,
00215 GINT_TO_POINTER(c->pq_code), (gpointer)c);
00216 }
00217 {
00218 QofCurrency *c = g_new0(QofCurrency, 1);
00219 c->pq_code = 14;
00220 c->fraction = 100;
00221 c->symbol = "€";
00222 c->mnemonic = "LUF";
00223 c->non_utf8 = TRUE;
00224 g_hash_table_insert(qof_currency_table,
00225 GINT_TO_POINTER(c->pq_code), (gpointer)c);
00226 }
00227 {
00228 QofCurrency *c = g_new0(QofCurrency, 1);
00229 c->pq_code = 15;
00230 c->fraction = 100;
00231 c->symbol = "MXP";
00232 c->mnemonic = "MXP";
00233 c->non_utf8 = FALSE;
00234 g_hash_table_insert(qof_currency_table,
00235 GINT_TO_POINTER(c->pq_code), (gpointer)c);
00236 }
00237 {
00238 QofCurrency *c = g_new0(QofCurrency, 1);
00239 c->pq_code = 16;
00240 c->fraction = 100;
00241 c->symbol = "€";
00242 c->mnemonic = "ANG";
00243 c->non_utf8 = TRUE;
00244 g_hash_table_insert(qof_currency_table,
00245 GINT_TO_POINTER(c->pq_code), (gpointer)c);
00246 }
00247 {
00248 QofCurrency *c = g_new0(QofCurrency, 1);
00249 c->pq_code = 17;
00250 c->fraction = 100;
00251 c->symbol = "$NZ";
00252 c->mnemonic = "NZD";
00253 c->non_utf8 = FALSE;
00254 g_hash_table_insert(qof_currency_table,
00255 GINT_TO_POINTER(c->pq_code), (gpointer)c);
00256 }
00257 {
00258 QofCurrency *c = g_new0(QofCurrency, 1);
00259 c->pq_code = 18;
00260 c->fraction = 100;
00261 c->symbol = "NOK";
00262 c->mnemonic = "NOK";
00263 c->non_utf8 = FALSE;
00264 g_hash_table_insert(qof_currency_table,
00265 GINT_TO_POINTER(c->pq_code), (gpointer)c);
00266 }
00267 {
00268 QofCurrency *c = g_new0(QofCurrency, 1);
00269 c->pq_code = 19;
00270 c->fraction = 100;
00271 c->symbol = "€";
00272 c->mnemonic = "ESP";
00273 c->non_utf8 = TRUE;
00274 g_hash_table_insert(qof_currency_table,
00275 GINT_TO_POINTER(c->pq_code), (gpointer)c);
00276 }
00277 {
00278 QofCurrency *c = g_new0(QofCurrency, 1);
00279 c->pq_code = 20;
00280 c->fraction = 100;
00281 c->symbol = "SEK";
00282 c->mnemonic = "SEK";
00283 c->non_utf8 = FALSE;
00284 g_hash_table_insert(qof_currency_table,
00285 GINT_TO_POINTER(c->pq_code), (gpointer)c);
00286 }
00287 {
00288 QofCurrency *c = g_new0(QofCurrency, 1);
00289 c->pq_code = 21;
00290 c->fraction = 100;
00291 c->symbol = "CHF";
00292 c->mnemonic = "CHF";
00293 c->non_utf8 = FALSE;
00294 g_hash_table_insert(qof_currency_table,
00295 GINT_TO_POINTER(c->pq_code), (gpointer)c);
00296 }
00297 {
00298 QofCurrency *c = g_new0(QofCurrency, 1);
00299 c->pq_code = 22;
00300 c->fraction = 100;
00301 c->symbol = "£";
00302 c->mnemonic = "GBP";
00303 c->non_utf8 = TRUE;
00304 g_hash_table_insert(qof_currency_table,
00305 GINT_TO_POINTER(c->pq_code), (gpointer)c);
00306 }
00307 {
00308 QofCurrency *c = g_new0(QofCurrency, 1);
00309 c->pq_code = 23;
00310 c->fraction = 100;
00311 c->symbol = "$US";
00312 c->mnemonic = "USD";
00313 c->non_utf8 = FALSE;
00314 g_hash_table_insert(qof_currency_table,
00315 GINT_TO_POINTER(c->pq_code), (gpointer)c);
00316 }
00317 {
00318 QofCurrency *c = g_new0(QofCurrency, 1);
00319 c->pq_code = 24;
00320 c->fraction = 100;
00321 c->symbol = "Rs";
00322 c->mnemonic = "INR";
00323 c->non_utf8 = FALSE;
00324 g_hash_table_insert(qof_currency_table,
00325 GINT_TO_POINTER(c->pq_code), (gpointer)c);
00326 }
00327 {
00328 QofCurrency *c = g_new0(QofCurrency, 1);
00329 c->pq_code = 25;
00330 c->fraction = 1;
00331 c->symbol = "Rp";
00332 c->mnemonic = "IDR";
00333 c->non_utf8 = FALSE;
00334 g_hash_table_insert(qof_currency_table,
00335 GINT_TO_POINTER(c->pq_code), (gpointer)c);
00336 }
00337 {
00338 QofCurrency *c = g_new0(QofCurrency, 1);
00339 c->pq_code = 26;
00340 c->fraction = 100;
00341 c->symbol = "KRW";
00342 c->mnemonic = "KRW";
00343 c->non_utf8 = FALSE;
00344 g_hash_table_insert(qof_currency_table,
00345 GINT_TO_POINTER(c->pq_code), (gpointer)c);
00346 }
00347 {
00348 QofCurrency *c = g_new0(QofCurrency, 1);
00349 c->pq_code = 27;
00350 c->fraction = 100;
00351 c->symbol = "RM";
00352 c->mnemonic = "MYR";
00353 c->non_utf8 = FALSE;
00354 g_hash_table_insert(qof_currency_table,
00355 GINT_TO_POINTER(c->pq_code), (gpointer)c);
00356 }
00357 {
00358 QofCurrency *c = g_new0(QofCurrency, 1);
00359 c->pq_code = 28;
00360 c->fraction = 100;
00361 c->symbol = "RMB";
00362 c->mnemonic = "CNY";
00363 c->non_utf8 = FALSE;
00364 g_hash_table_insert(qof_currency_table,
00365 GINT_TO_POINTER(c->pq_code), (gpointer)c);
00366 }
00367 {
00368 QofCurrency *c = g_new0(QofCurrency, 1);
00369 c->pq_code = 29;
00370 c->fraction = 100;
00371 c->symbol = "P";
00372 c->mnemonic = "PHP";
00373 c->non_utf8 = FALSE;
00374 g_hash_table_insert(qof_currency_table,
00375 GINT_TO_POINTER(c->pq_code), (gpointer)c);
00376 }
00377 {
00378 QofCurrency *c = g_new0(QofCurrency, 1);
00379 c->pq_code = 30;
00380 c->fraction = 100;
00381 c->symbol = "$";
00382 c->mnemonic = "SGD";
00383 c->non_utf8 = FALSE;
00384 g_hash_table_insert(qof_currency_table,
00385 GINT_TO_POINTER(c->pq_code), (gpointer)c);
00386 }
00387 {
00388 QofCurrency *c = g_new0(QofCurrency, 1);
00389 c->pq_code = 31;
00390 c->fraction = 100;
00391 c->symbol = "BHT";
00392 c->mnemonic = "THB";
00393 c->non_utf8 = FALSE;
00394 g_hash_table_insert(qof_currency_table,
00395 GINT_TO_POINTER(c->pq_code), (gpointer)c);
00396 }
00397 {
00398 QofCurrency *c = g_new0(QofCurrency, 1);
00399 c->pq_code = 32;
00400 c->fraction = 100;
00401 c->symbol = "NT$";
00402 c->mnemonic = "TWD";
00403 c->non_utf8 = FALSE;
00404 g_hash_table_insert(qof_currency_table,
00405 GINT_TO_POINTER(c->pq_code), (gpointer)c);
00406 }
00407 {
00408 QofCurrency *c = g_new0(QofCurrency, 1);
00409 c->pq_code = 133;
00410 c->fraction = 100;
00411 c->symbol = "€";
00412 c->mnemonic = "EUR";
00413 c->non_utf8 = TRUE;
00414 g_hash_table_insert(qof_currency_table,
00415 GINT_TO_POINTER(c->pq_code), (gpointer)c);
00416 }
00417 }
00418
00419 static gboolean
00420 check_name (gpointer G_GNUC_UNUSED key, gpointer value, gpointer data)
00421 {
00422 gchar * mnemonic = (gchar*) data;
00423 QofCurrency * currency = (QofCurrency*) value;
00424 if (0 == safe_strcmp (mnemonic, currency->mnemonic))
00425 return TRUE;
00426 return FALSE;
00427 }
00428
00429 QofCurrency*
00430 qof_currency_lookup_name (QofInstance * inst, gchar * mnemonic)
00431 {
00432 QofCurrency *currency;
00433
00434 currency = NULL;
00435 if(!qof_currency_table) populate_currencies();
00436 currency = (QofCurrency*) g_hash_table_find
00437 (qof_currency_table, check_name, mnemonic);
00438 if (!currency) return NULL;
00439 qof_currency_lookup(inst, currency->pq_code);
00440 return currency;
00441 }
00442
00443 QofCurrency*
00444 qof_currency_lookup (QofInstance* inst, gint currency_code)
00445 {
00446 QofCurrency *currency;
00447
00448 currency = NULL;
00449 if(!qof_currency_table) populate_currencies();
00450 currency = (QofCurrency*)g_hash_table_lookup(
00451 qof_currency_table, GINT_TO_POINTER(currency_code));
00452 if(!currency)
00453 {
00454 PERR (" unsupported currency! %d", currency_code);
00455 return NULL;
00456 }
00457 kvp_frame_set_string(qof_instance_get_slots(inst),
00458 PQ_CURRENCY_MNEMONIC, currency->mnemonic);
00459 kvp_frame_set_gint64(qof_instance_get_slots(inst),
00460 PQ_CURRENCY_FRACTION, currency->fraction);
00461 if(currency->non_utf8)
00462 {
00463 gchar * k_symbol = g_strdup (currency->symbol);
00464 kvp_frame_set_string(qof_instance_get_slots(inst),
00465 PQ_CURRENCY_SYMBOL, qof_util_make_utf8(k_symbol));
00466 }
00467 else
00468 {
00469 kvp_frame_set_string(qof_instance_get_slots(inst),
00470 PQ_CURRENCY_SYMBOL, currency->symbol);
00471 }
00472 return currency;
00473 }
00474
00475 struct QofExp_s
00476 {
00477 QofInstance inst;
00478 ExpenseDistance distance_unit;
00479 struct tm date;
00480 ExpenseType type;
00481 ExpensePayment payment;
00482 gint currency_code;
00483 gchar *amount;
00484 gchar *vendor;
00485 gchar *city;
00486 gchar *attendees;
00487 gchar *note;
00488 gchar *category;
00489 const gchar* print_string;
00490 QofCurrency *currency;
00491 gdouble temp_amount;
00494 gboolean reset_amount;
00495 };
00496
00497 static QofExp *
00498 expense_create (QofBook *book)
00499 {
00500 QofExp *obj;
00501 QofCollection *coll;
00502 GList *all;
00503 glong nanosecs;
00504 QofTime *qt;
00505 QofDate *qd;
00506
00507 obj = g_new0(QofExp, 1);
00508 qof_instance_init (&obj->inst, GPE_QOF_EXPENSES, book);
00509 coll = qof_book_get_collection (book, GPE_QOF_EXPENSES);
00510 all = qof_collection_get_data (coll);
00511 all = g_list_prepend (all, obj);
00512 qof_collection_set_data (coll, all);
00513 qt = qof_time_get_current ();
00514 nanosecs = qof_time_get_nanosecs (qt);
00515 qd = qof_date_from_qtime (qt);
00516 if (!qof_date_to_struct_tm (qd, &obj->date, &nanosecs))
00517 DEBUG (" failed to set initial date");
00518 qof_date_free (qd);
00519 qof_time_free (qt);
00520 obj->amount = "0";
00521
00522 obj->currency_code = -1;
00523 if(!qof_currency_table) populate_currencies();
00524 qof_event_gen ((QofEntity*)obj, QOF_EVENT_CREATE, NULL);
00525 return obj;
00526 }
00527
00528 static const gchar*
00529 qof_exp_paymentAsString(ExpensePayment payment)
00530 {
00531 const gchar *string;
00532
00533 string = "Cash";
00534 string = ExpensePaymentasString(payment);
00535 return string;
00536 }
00537
00538 static const gchar*
00539 qof_exp_typeAsString(ExpenseType type)
00540 {
00541 const gchar* string;
00542
00543 string = "Bus";
00544 string = ExpenseTypeasString(type);
00545 return string;
00546 }
00547
00548 static ExpensePayment
00549 qof_exp_paymentFromString(const gchar* payment_string)
00550 {
00551 return ExpensePaymentfromString(payment_string);
00552 }
00553
00554 static ExpenseType
00555 qof_exp_typeFromString(const gchar* type_string)
00556 {
00557 return ExpenseTypefromString(type_string);
00558 }
00559
00560 static QofTime *
00561 exp_getTime (QofExp * e)
00562 {
00563 QofDate *qd;
00564 QofTime *qt;
00565
00566 g_return_val_if_fail (e != NULL, NULL);
00567 qd = qof_date_from_struct_tm (&e->date);
00568 qt = qof_date_to_qtime (qd);
00569 qof_date_free (qd);
00570 return qt;
00571 }
00572
00573 static gchar*
00574 exp_getType (QofExp * e)
00575 {
00576 gchar* string;
00577
00578 g_return_val_if_fail (e != NULL, NULL);
00579 string = g_strdup(qof_exp_typeAsString(e->type));
00580 return string;
00581 }
00582
00583 static gchar*
00584 exp_getPayment (QofExp * e)
00585 {
00586 gchar* string;
00587
00588 g_return_val_if_fail (e != NULL, NULL);
00589 string = g_strdup(qof_exp_paymentAsString(e->payment));
00590 return string;
00591 }
00592
00593 static gint
00594 exp_getCurrency (QofExp * e)
00595 {
00596 g_return_val_if_fail (e != NULL, -1);
00597 return e->currency_code;
00598 }
00599
00600 static QofNumeric
00601 exp_getAmount (QofExp * e)
00602 {
00603 QofNumeric amount;
00604 gdouble pi_amount;
00605 gchar *numeric_char;
00606
00607 amount = qof_numeric_zero ();
00608 g_return_val_if_fail (e != NULL, amount);
00609 if(e->amount == 0) { return amount; }
00610
00611 pi_amount = strtod (e->amount, NULL);
00612 if(e->currency)
00613 {
00614 amount = qof_numeric_from_double (pi_amount, e->currency->fraction,
00615 QOF_HOW_DENOM_EXACT | QOF_HOW_RND_ROUND);
00616 }
00617 else
00618 {
00619 amount = qof_numeric_from_double (pi_amount, 100,
00620 QOF_HOW_DENOM_EXACT | QOF_HOW_RND_ROUND);
00621 }
00622 numeric_char = qof_numeric_to_string(amount);
00623 g_free(numeric_char);
00624
00625 if (qof_numeric_check (amount) == QOF_ERROR_OK)
00626 return amount;
00627 return qof_numeric_zero ();
00628 }
00629
00630 static const gchar *
00631 exp_getVendor (QofExp * e)
00632 {
00633 g_return_val_if_fail (e != NULL, NULL);
00634 return e->vendor;
00635 }
00636
00637 static const gchar *
00638 exp_getCity (QofExp * e)
00639 {
00640 g_return_val_if_fail (e != NULL, NULL);
00641 return e->city;
00642 }
00643
00644 static const gchar *
00645 exp_getAttendees (QofExp * e)
00646 {
00647 g_return_val_if_fail (e != NULL, NULL);
00648 return e->attendees;
00649 }
00650
00651 static const gchar *
00652 exp_getNote (QofExp * e)
00653 {
00654 g_return_val_if_fail (e != NULL, NULL);
00655 return e->note;
00656 }
00657
00658 static const gchar*
00659 exp_getDistance(QofExp *e)
00660 {
00661 g_return_val_if_fail(e != NULL, NULL);
00662 return ExpenseDistanceasString(e->distance_unit);
00663 }
00664
00665 static const gchar*
00666 exp_getCategory(QofExp *e)
00667 {
00668 g_return_val_if_fail(e != NULL, NULL);
00669 return e->category;
00670 }
00671
00672 static void
00673 exp_setTime (QofExp * e, QofTime *h)
00674 {
00675 glong nanosecs;
00676 QofDate *qd;
00677
00678 g_return_if_fail (e != NULL);
00679 if (!h)
00680 return;
00681 nanosecs = qof_time_get_nanosecs (h);
00682 qd = qof_date_from_qtime (h);
00683 qof_date_to_struct_tm (qd, &e->date, &nanosecs);
00684 qof_date_free (qd);
00685 }
00686
00687 static void
00688 exp_setType (QofExp * e, const gchar *type_string)
00689 {
00690 g_return_if_fail (e != NULL);
00691 e->type = qof_exp_typeFromString(type_string);
00692 }
00693
00694 static void
00695 exp_setPayment (QofExp * e, const gchar *payment_string)
00696 {
00697 g_return_if_fail (e != NULL);
00698 e->payment = qof_exp_paymentFromString(payment_string);
00699 }
00700
00701 static void
00702 exp_combine_currency_with_amount(QofExp *e)
00703 {
00704 g_return_if_fail (e != NULL);
00705 if(!e->currency || e->currency_code < 0)
00706 {
00707
00708 e->currency = qof_currency_lookup((QofInstance*)e, e->currency_code);
00709 }
00710 if(!e->currency)
00711 {
00712 PERR (" Unable to identify currency fraction."
00713 " Using two decimal places.");
00714
00715
00716 e->amount = g_strdup_printf ("%.2f", e->temp_amount);
00717 return;
00718 }
00719 switch (e->currency->fraction)
00720 {
00721 case 1 :
00722 {
00723 e->amount = g_strdup_printf ("%.0f", e->temp_amount);
00724 break;
00725 }
00726 case 10 :
00727 {
00728 e->amount = g_strdup_printf ("%.1f", e->temp_amount);
00729 break;
00730 }
00731 case 100 :
00732 {
00733 e->amount = g_strdup_printf ("%.2f", e->temp_amount);
00734 break;
00735 }
00736 case 1000 :
00737 {
00738 e->amount = g_strdup_printf ("%.3f", e->temp_amount);
00739 break;
00740 }
00741 default :
00742 {
00743 PERR (" Invalid currency fraction."
00744 " Using two decimal places as default.");
00745 e->amount = g_strdup_printf ("%.2f", e->temp_amount);
00746 }
00747 }
00748 }
00749
00750 static void
00751 exp_setCurrency (QofExp * e, gint data)
00752 {
00753 g_return_if_fail (e != NULL);
00754 e->currency_code = data;
00755 e->currency = qof_currency_lookup((QofInstance*)e, data);
00756 if(e->reset_amount)
00757 exp_combine_currency_with_amount(e);
00758 e->reset_amount = FALSE;
00759 }
00760
00761 static void
00762 exp_setAmount (QofExp * e, QofNumeric h)
00763 {
00764 g_return_if_fail (e != NULL);
00765 e->temp_amount = qof_numeric_to_double (h);
00766 e->reset_amount = TRUE;
00767
00768
00771 if(e->currency) exp_combine_currency_with_amount(e);
00772 }
00773
00774 static void
00775 exp_setVendor (QofExp * e, gchar *h)
00776 {
00777 g_return_if_fail (e != NULL);
00778 e->vendor = g_strdup (qof_util_make_utf8(h));
00779 }
00780
00781 static void
00782 exp_setCity (QofExp * e, gchar *h)
00783 {
00784 g_return_if_fail (e != NULL);
00785 e->city = g_strdup (qof_util_make_utf8(h));
00786 }
00787
00788 static void
00789 exp_setAttendees (QofExp * e, gchar *h)
00790 {
00791 g_return_if_fail (e != NULL);
00792 e->attendees = g_strdup (qof_util_make_utf8(h));
00793 }
00794
00795 static void
00796 exp_setNote (QofExp * e, gchar *h)
00797 {
00798 g_return_if_fail (e != NULL);
00799 e->note = g_strdup (qof_util_make_utf8(h));
00800 }
00801
00802 static void
00803 exp_setDistance(QofExp *e, const gchar *distance_name)
00804 {
00805 g_return_if_fail(e);
00806 e->distance_unit = ExpenseDistancefromString(distance_name);
00807 }
00808
00809 static void
00810 exp_setCategory(QofExp *e, gchar *n)
00811 {
00812 g_return_if_fail(e != NULL);
00813 e->category = g_strdup(qof_util_make_utf8(n));
00814 }
00815
00816 static const gchar*
00817 expensePrintable (gpointer instance)
00818 {
00819 QofExp *obj;
00820
00821 obj = (QofExp*)instance;
00822 if(!obj) return NULL;
00823 if(exp_getType(obj))
00824 return g_strconcat(exp_getType(obj), " ",
00825 exp_getVendor(obj), " ", exp_getCity(obj), NULL);
00826 return NULL;
00827 }
00828
00829 static QofObject expenses_object_def = {
00830 .interface_version = QOF_OBJECT_VERSION,
00831 .e_type = GPE_QOF_EXPENSES,
00832 .type_label = QOF_EXPENSES_DESC,
00833 .create = ((gpointer)expense_create),
00834 .book_begin = NULL,
00835 .book_end = NULL,
00836 .is_dirty = qof_collection_is_dirty,
00837 .mark_clean = qof_collection_mark_clean,
00838 .foreach = qof_collection_foreach,
00839 .printable = expensePrintable,
00840 .version_cmp = (gint (*)(gpointer, gpointer)) qof_instance_version_cmp,
00841 };
00842
00843 gboolean
00844 ExpensesRegister (void)
00845 {
00846 static QofParam params[] = {
00847 { EXP_DATE, QOF_TYPE_TIME, (QofAccessFunc) exp_getTime, (QofSetterFunc) exp_setTime, NULL },
00848 { EXP_TYPE, QOF_TYPE_STRING, (QofAccessFunc) exp_getType, (QofSetterFunc) exp_setType, NULL },
00849 { EXP_PAYMENT, QOF_TYPE_STRING, (QofAccessFunc) exp_getPayment, (QofSetterFunc) exp_setPayment, NULL },
00850 { EXP_CURRENCY, QOF_TYPE_INT32, (QofAccessFunc) exp_getCurrency, (QofSetterFunc) exp_setCurrency, NULL },
00851 { EXP_AMOUNT, QOF_TYPE_NUMERIC, (QofAccessFunc) exp_getAmount, (QofSetterFunc) exp_setAmount, NULL },
00852 { EXP_VENDOR, QOF_TYPE_STRING, (QofAccessFunc) exp_getVendor, (QofSetterFunc) exp_setVendor, NULL },
00853 { EXP_CITY, QOF_TYPE_STRING, (QofAccessFunc) exp_getCity, (QofSetterFunc) exp_setCity, NULL },
00854 { EXP_ATTENDEES, QOF_TYPE_STRING, (QofAccessFunc) exp_getAttendees, (QofSetterFunc) exp_setAttendees, NULL },
00855 { EXP_NOTE, QOF_TYPE_STRING, (QofAccessFunc) exp_getNote, (QofSetterFunc) exp_setNote, NULL },
00856 { EXP_DISTANCE, QOF_TYPE_STRING, (QofAccessFunc) exp_getDistance, (QofSetterFunc) exp_setDistance, NULL },
00857 { EXP_CATEGORY, QOF_TYPE_STRING, (QofAccessFunc) exp_getCategory, (QofSetterFunc) exp_setCategory, NULL },
00858 { EXP_KVP, QOF_TYPE_KVP, (QofAccessFunc) qof_instance_get_slots, NULL, NULL },
00859 { QOF_PARAM_BOOK, QOF_ID_BOOK, (QofAccessFunc) qof_instance_get_book, NULL, NULL },
00860 { QOF_PARAM_GUID, QOF_TYPE_GUID, (QofAccessFunc) qof_instance_get_guid, NULL, NULL },
00861 { NULL, NULL, NULL, NULL, NULL },
00862 };
00863
00864 bindtextdomain (LIBRARY_GETTEXT_PACKAGE, LOCALE_DIR);
00865
00866 qof_class_register (GPE_QOF_EXPENSES, NULL, params);
00867 if(!qof_currency_table) populate_currencies();
00868
00869 return qof_object_register (&expenses_object_def);
00870 }