00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00032 #include "config.h"
00033
00034 #include <glib/gi18n.h>
00035 #if HAVE_KTOBLZCHECK_H
00036 # include <ktoblzcheck.h>
00037 #endif
00038 #include <aqbanking/jobsingletransfer.h>
00039 #include <aqbanking/jobsingledebitnote.h>
00040 #include <aqbanking/jobinternaltransfer.h>
00041
00042 #include "dialog-ab-trans.h"
00043 #include "dialog-transfer.h"
00044 #include "dialog-utils.h"
00045 #include "gnc-ab-trans-templ.h"
00046 #include "gnc-ab-utils.h"
00047 #include "gnc-amount-edit.h"
00048 #include "gnc-ui.h"
00049
00050
00051 static QofLogModule log_module = G_LOG_DOMAIN;
00052
00053 static void fill_templ_helper(gpointer data, gpointer user_data);
00054 static AB_TRANSACTION *ab_trans_fill_values(GncABTransDialog *td);
00055 static gboolean check_ktoblzcheck(GtkWidget *parent, const GncABTransDialog *td,
00056 const AB_TRANSACTION *trans);
00057 static gboolean clear_templ_helper(GtkTreeModel *model, GtkTreePath *path,
00058 GtkTreeIter *iter, gpointer user_data);
00059 static gboolean get_templ_helper(GtkTreeModel *model, GtkTreePath *path,
00060 GtkTreeIter *iter, gpointer data);
00061 static AB_JOB *get_available_empty_job(AB_ACCOUNT *ab_acc,
00062 GncABTransType trans_type);
00063
00064 void dat_bankcode_changed_cb(GtkEditable *editable, gpointer user_data);
00065 void templ_list_row_activated_cb(GtkTreeView *view, GtkTreePath *path,
00066 GtkTreeViewColumn *column, gpointer user_data);
00067 static gboolean find_templ_helper(GtkTreeModel *model, GtkTreePath *path,
00068 GtkTreeIter *iter, gpointer user_data);
00069 void dat_add_templ_cb(GtkButton *button, gpointer user_data);
00070 void dat_moveup_templ_cb(GtkButton *button, gpointer user_data);
00071 void dat_movedown_templ_cb(GtkButton *button, gpointer user_data);
00072 void dat_sort_templ_cb(GtkButton *button, gpointer user_data);
00073 void dat_del_templ_cb(GtkButton *button, gpointer user_data);
00074
00075 enum
00076 {
00077 TEMPLATE_NAME,
00078 TEMPLATE_POINTER,
00079 TEMPLATE_NUM_COLUMNS
00080 };
00081
00082 struct _GncABTransDialog
00083 {
00084
00085 GtkWidget *dialog;
00086 GtkWidget *parent;
00087 AB_ACCOUNT *ab_acc;
00088
00089
00090 GncABTransType trans_type;
00091
00092
00093 GtkWidget *recp_name_entry;
00094 GtkWidget *recp_account_entry;
00095 GtkWidget *recp_bankcode_entry;
00096
00097
00098 GtkWidget *amount_edit;
00099
00100
00101 GtkWidget *purpose_entry;
00102 GtkWidget *purpose_cont_entry;
00103 GtkWidget *purpose_cont2_entry;
00104 GtkWidget *purpose_cont3_entry;
00105
00106
00107 GtkWidget *recp_bankname_label;
00108
00109
00110 GtkTreeView *template_gtktreeview;
00111 GtkListStore *template_list_store;
00112
00113
00114 gboolean templ_changed;
00115
00116
00117 AB_TRANSACTION *ab_trans;
00118
00119
00120 Transaction *gnc_trans;
00121
00122 #if HAVE_KTOBLZCHECK_H
00123
00124 AccountNumberCheck *blzcheck;
00125 #endif
00126 };
00127
00128 static void
00129 fill_templ_helper(gpointer data, gpointer user_data)
00130 {
00131 GncABTransTempl *templ = data;
00132 GtkListStore *store = user_data;
00133 GtkTreeIter iter;
00134
00135 g_return_if_fail(templ && store);
00136 gtk_list_store_append(store, &iter);
00137 gtk_list_store_set(store, &iter,
00138 TEMPLATE_NAME, gnc_ab_trans_templ_get_name(templ),
00139 TEMPLATE_POINTER, templ,
00140 -1);
00141 }
00142
00147 static AB_TRANSACTION *
00148 ab_trans_fill_values(GncABTransDialog *td)
00149 {
00150
00151 AB_TRANSACTION *trans = AB_Transaction_new();
00152 AB_VALUE *value;
00153
00154 AB_Transaction_SetLocalBankCode(trans, AB_Account_GetBankCode(td->ab_acc));
00155 AB_Transaction_SetLocalAccountNumber(
00156 trans, AB_Account_GetAccountNumber(td->ab_acc));
00157 AB_Transaction_SetLocalCountry(trans, "DE");
00158
00159 AB_Transaction_SetRemoteBankCode(
00160 trans, gtk_entry_get_text(GTK_ENTRY(td->recp_bankcode_entry)));
00161 AB_Transaction_SetRemoteAccountNumber(
00162 trans, gtk_entry_get_text(GTK_ENTRY(td->recp_account_entry)));
00163 AB_Transaction_SetRemoteCountry(trans, "DE");
00164 AB_Transaction_AddRemoteName(
00165 trans, gtk_entry_get_text(GTK_ENTRY(td->recp_name_entry)), FALSE);
00166
00167 AB_Transaction_AddPurpose(
00168 trans, gtk_entry_get_text(GTK_ENTRY(td->purpose_entry)), FALSE);
00169 AB_Transaction_AddPurpose(
00170 trans, gtk_entry_get_text(GTK_ENTRY(td->purpose_cont_entry)), FALSE);
00171 AB_Transaction_AddPurpose(
00172 trans, gtk_entry_get_text(GTK_ENTRY(td->purpose_cont2_entry)), FALSE);
00173 AB_Transaction_AddPurpose(
00174 trans, gtk_entry_get_text(GTK_ENTRY(td->purpose_cont3_entry)), FALSE);
00175
00176 value = AB_Value_fromDouble(gnc_amount_edit_get_damount(
00177 GNC_AMOUNT_EDIT(td->amount_edit)));
00178
00179 AB_Value_SetCurrency(value, "EUR");
00180 AB_Transaction_SetValue(trans, value);
00181 AB_Value_free(value);
00182
00183
00184
00185 switch (td->trans_type)
00186 {
00187 case SINGLE_DEBITNOTE:
00188
00189 AB_Transaction_SetTextKey(trans, 05);
00190 break;
00191 default:
00192
00193 AB_Transaction_SetTextKey (trans, 51);
00194 }
00195
00196 return trans;
00197 }
00198
00199 GncABTransDialog *
00200 gnc_ab_trans_dialog_new(GtkWidget *parent, AB_ACCOUNT *ab_acc,
00201 gint commodity_scu, GncABTransType trans_type,
00202 GList *templates)
00203 {
00204 GncABTransDialog *td;
00205 GladeXML *xml;
00206 const gchar *ab_ownername;
00207 const gchar *ab_accountnumber;
00208 const gchar *ab_bankname;
00209 const gchar *ab_bankcode;
00210 GtkWidget *heading_label;
00211 GtkWidget *recp_name_heading;
00212 GtkWidget *recp_account_heading;
00213 GtkWidget *recp_bankcode_heading;
00214 GtkWidget *amount_hbox;
00215 GtkWidget *orig_name_heading;
00216 GtkWidget *orig_name_label;
00217 GtkWidget *orig_account_heading;
00218 GtkWidget *orig_account_label;
00219 GtkWidget *orig_bankname_heading;
00220 GtkWidget *orig_bankname_label;
00221 GtkWidget *orig_bankcode_heading;
00222 GtkWidget *orig_bankcode_label;
00223 GtkCellRenderer *renderer;
00224 GtkTreeViewColumn *column;
00225
00226 g_return_val_if_fail(ab_acc, NULL);
00227
00228 ab_ownername = AB_Account_GetOwnerName(ab_acc);
00229 if (!ab_ownername)
00230 ab_ownername = "";
00231 ab_accountnumber = AB_Account_GetAccountNumber(ab_acc);
00232 ab_bankcode = AB_Account_GetBankCode(ab_acc);
00233 ab_bankname = AB_Account_GetBankName(ab_acc);
00234 if (!ab_bankname || !*ab_bankname)
00235 ab_bankname = _("(unknown)");
00236
00237 td = g_new0(GncABTransDialog, 1);
00238 td->parent = parent;
00239 td->ab_acc = ab_acc;
00240 td->trans_type = trans_type;
00241
00242 #if HAVE_KTOBLZCHECK_H
00243 td->blzcheck = AccountNumberCheck_new();
00244 #endif
00245
00246 xml = gnc_glade_xml_new("aqbanking.glade", "Transaction Dialog");
00247 td->dialog = glade_xml_get_widget(xml, "Transaction Dialog");
00248 g_object_set_data_full(G_OBJECT(td->dialog), "xml", xml, g_object_unref);
00249 glade_xml_signal_autoconnect_full(xml, gnc_glade_autoconnect_full_func, td);
00250
00251 if (parent)
00252 gtk_window_set_transient_for(GTK_WINDOW(td->dialog), GTK_WINDOW(parent));
00253
00254
00255 heading_label = glade_xml_get_widget(xml, "heading_label");
00256 recp_name_heading = glade_xml_get_widget(xml, "recp_name_heading");
00257 td->recp_name_entry = glade_xml_get_widget(xml, "recp_name_entry");
00258 recp_account_heading = glade_xml_get_widget(xml, "recp_account_heading");
00259 td->recp_account_entry = glade_xml_get_widget(xml, "recp_account_entry");
00260 recp_bankcode_heading = glade_xml_get_widget(xml, "recp_bankcode_heading");
00261 td->recp_bankcode_entry = glade_xml_get_widget(xml, "recp_bankcode_entry");
00262 td->recp_bankname_label = glade_xml_get_widget(xml, "recp_bankname_label");
00263 amount_hbox = glade_xml_get_widget(xml, "amount_hbox");
00264 td->purpose_entry = glade_xml_get_widget(xml, "purpose_entry");
00265 td->purpose_cont_entry = glade_xml_get_widget(xml, "purpose_cont_entry");
00266 td->purpose_cont2_entry = glade_xml_get_widget(xml, "purpose_cont2_entry");
00267 td->purpose_cont3_entry = glade_xml_get_widget(xml, "purpose_cont3_entry");
00268 orig_name_heading = glade_xml_get_widget(xml, "orig_name_heading");
00269 orig_name_label = glade_xml_get_widget(xml, "orig_name_label");
00270 orig_account_heading = glade_xml_get_widget(xml, "orig_account_heading");
00271 orig_account_label = glade_xml_get_widget(xml, "orig_account_label");
00272 orig_bankname_heading = glade_xml_get_widget(xml, "orig_bankname_heading");
00273 orig_bankname_label = glade_xml_get_widget(xml, "orig_bankname_label");
00274 orig_bankcode_heading = glade_xml_get_widget(xml, "orig_bankcode_heading");
00275 orig_bankcode_label = glade_xml_get_widget(xml, "orig_bankcode_label");
00276 td->template_gtktreeview =
00277 GTK_TREE_VIEW(glade_xml_get_widget(xml, "template_list"));
00278
00279
00280 td->amount_edit = gnc_amount_edit_new();
00281 gtk_box_pack_start_defaults(GTK_BOX(amount_hbox), td->amount_edit);
00282 gnc_amount_edit_set_evaluate_on_enter(GNC_AMOUNT_EDIT(td->amount_edit),
00283 TRUE);
00284 gnc_amount_edit_set_fraction(GNC_AMOUNT_EDIT(td->amount_edit),
00285 commodity_scu);
00286
00287
00288
00289 switch (trans_type)
00290 {
00291 case SINGLE_TRANSFER:
00292 case SINGLE_INTERNAL_TRANSFER:
00293
00294 break;
00295 case SINGLE_DEBITNOTE:
00296 gtk_label_set_text(GTK_LABEL (heading_label),
00297
00298
00299
00300
00301
00302
00303
00304
00305
00306
00307 _("Enter an Online Direct Debit Note"));
00308
00309 gtk_label_set_text(GTK_LABEL(recp_name_heading),
00310 _("Debited Account Owner"));
00311 gtk_label_set_text(GTK_LABEL(recp_account_heading),
00312 _("Debited Account Number"));
00313 gtk_label_set_text(GTK_LABEL(recp_bankcode_heading),
00314 _("Debited Account Bank Code"));
00315
00316 gtk_label_set_text(GTK_LABEL(orig_name_heading),
00317 _("Credited Account Owner"));
00318 gtk_label_set_text(GTK_LABEL(orig_account_heading),
00319 _("Credited Account Number"));
00320 gtk_label_set_text(GTK_LABEL(orig_bankcode_heading),
00321 _("Credited Account Bank Code"));
00322 break;
00323
00324 default:
00325 g_critical("gnc_ab_trans_dialog_new: Oops, unknown GncABTransType %d",
00326 trans_type);
00327 }
00328
00329 gtk_label_set_text(GTK_LABEL(orig_name_label), ab_ownername);
00330 gtk_label_set_text(GTK_LABEL(orig_account_label), ab_accountnumber);
00331 gtk_label_set_text(GTK_LABEL(orig_bankname_label), ab_bankname);
00332 gtk_label_set_text (GTK_LABEL (orig_bankcode_label), ab_bankcode);
00333
00334
00335 td->template_list_store = gtk_list_store_new(TEMPLATE_NUM_COLUMNS,
00336 G_TYPE_STRING, G_TYPE_POINTER);
00337 g_list_foreach(templates, fill_templ_helper, td->template_list_store);
00338 gtk_tree_view_set_model(td->template_gtktreeview,
00339 GTK_TREE_MODEL(td->template_list_store));
00340 td->templ_changed = FALSE;
00341
00342
00343
00344 renderer = gtk_cell_renderer_text_new();
00345 column = gtk_tree_view_column_new_with_attributes(
00346 "Template Name", renderer, "text", TEMPLATE_NAME, NULL);
00347 gtk_tree_view_append_column(td->template_gtktreeview, column);
00348
00349 return td;
00350 }
00351
00352 static gboolean
00353 check_ktoblzcheck(GtkWidget *parent, const GncABTransDialog *td,
00354 const AB_TRANSACTION *trans)
00355 {
00356 #ifndef HAVE_KTOBLZCHECK_H
00357 return TRUE;
00358 #else
00359 gint blzresult;
00360 const char *blztext;
00361 gboolean values_ok = TRUE;
00362
00363 ENTER(" ");
00364
00365 blzresult = AccountNumberCheck_check(
00366 td->blzcheck,
00367 AB_Transaction_GetRemoteBankCode(trans),
00368 AB_Transaction_GetRemoteAccountNumber(trans));
00369 switch (blzresult)
00370 {
00371 case 2:
00372 gtk_widget_show(parent);
00373 values_ok = gnc_verify_dialog(
00374 parent, TRUE,
00375 _("The internal check of the destination account number '%s' "
00376 "at the specified bank with bank code '%s' failed. This means "
00377 "the account number might contain an error. Should the online "
00378 "transfer job be sent with this account number anyway?"),
00379 AB_Transaction_GetRemoteAccountNumber(trans),
00380 AB_Transaction_GetRemoteBankCode(trans));
00381 blztext = "Kontonummer wahrscheinlich falsch";
00382 break;
00383 case 0:
00384 blztext = "Kontonummer ok";
00385 break;
00386 case 3:
00387 blztext = "bank unbekannt";
00388 break;
00389 case 1:
00390 default:
00391 blztext = "unbekannt aus unbekanntem grund";
00392 break;
00393 }
00394
00395 LEAVE("KtoBlzCheck said check is %d = %s",
00396 blzresult, blztext ? blztext : "(none)");
00397
00398 return values_ok;
00399 #endif
00400 }
00401
00402 gint
00403 gnc_ab_trans_dialog_run_until_ok(GncABTransDialog *td)
00404 {
00405 gint result;
00406 AB_JOB *job;
00407 const AB_TRANSACTION_LIMITS *joblimits;
00408 guint8 max_purpose_lines;
00409 gboolean values_ok;
00410 gchar *purpose;
00411 gchar *othername;
00412
00413
00414 job = get_available_empty_job(td->ab_acc, td->trans_type);
00415 if (!job)
00416 {
00417 g_warning("gnc_ab_trans_dialog_run_until_ok: Oops, job not available");
00418 return GTK_RESPONSE_CANCEL;
00419 }
00420
00421
00422 joblimits = AB_JobSingleTransfer_GetFieldLimits(job);
00423 max_purpose_lines = joblimits ?
00424 AB_TransactionLimits_GetMaxLinesPurpose(joblimits) : 2;
00425 gtk_widget_set_sensitive(td->purpose_cont_entry, max_purpose_lines > 1);
00426 gtk_widget_set_sensitive(td->purpose_cont2_entry, max_purpose_lines > 2);
00427 gtk_widget_set_sensitive(td->purpose_cont3_entry, max_purpose_lines > 3);
00428
00429
00430 gtk_widget_show(td->dialog);
00431
00432
00433 do
00434 {
00435
00436 result = gtk_dialog_run (GTK_DIALOG (td->dialog));
00437
00438
00439
00440
00441
00442
00443 if (result != GNC_RESPONSE_NOW && result != GNC_RESPONSE_LATER)
00444 {
00445 gtk_widget_destroy(td->dialog);
00446 td->dialog = NULL;
00447 break;
00448 }
00449
00450
00451
00452 td->ab_trans = ab_trans_fill_values(td);
00453 values_ok = TRUE;
00454
00455
00456 values_ok =
00457 AB_Value_GetValueAsDouble(AB_Transaction_GetValue(td->ab_trans))
00458 != 0.0;
00459 if (!values_ok)
00460 {
00461 gtk_widget_show(td->dialog);
00462 if (gnc_verify_dialog(
00463 td->dialog, TRUE, "%s",
00464 _("The amount is zero or the amount field could not be "
00465 "interpreted correctly. You might have mixed up decimal "
00466 "point and comma, compared to your locale settings. "
00467 "This does not result in a valid online transfer job. \n"
00468 "\n"
00469 "Do you want to enter the job again?")))
00470 {
00471 continue;
00472 }
00473 else
00474 {
00475 AB_Transaction_free(td->ab_trans);
00476 td->ab_trans = NULL;
00477 result = GTK_RESPONSE_CANCEL;
00478 break;
00479 }
00480 }
00481
00482
00483 purpose = gnc_ab_get_purpose(td->ab_trans);
00484 values_ok = *purpose;
00485 g_free(purpose);
00486 if (!values_ok)
00487 {
00488 gtk_widget_show(td->dialog);
00489 if (gnc_verify_dialog(
00490 td->dialog, TRUE, "%s",
00491 _("You did not enter any transaction purpose. A purpose is "
00492 "required for an online transfer.\n"
00493 "\n"
00494 "Do you want to enter the job again?")))
00495 {
00496 continue;
00497 }
00498 else
00499 {
00500 AB_Transaction_free(td->ab_trans);
00501 td->ab_trans = NULL;
00502 result = GTK_RESPONSE_CANCEL;
00503 break;
00504 }
00505 }
00506
00507
00508 othername = gnc_ab_get_remote_name(td->ab_trans);
00509 values_ok = othername && *othername;
00510 g_free(othername);
00511 if (!values_ok)
00512 {
00513 gtk_widget_show(td->dialog);
00514 if (gnc_verify_dialog(
00515 td->dialog, TRUE, "%s",
00516 _("You did not enter a recipient name. A recipient name is "
00517 "required for an online transfer.\n"
00518 "\n"
00519 "Do you want to enter the job again?")))
00520 {
00521 continue;
00522 }
00523 else
00524 {
00525 AB_Transaction_free(td->ab_trans);
00526 td->ab_trans = NULL;
00527 result = GTK_RESPONSE_CANCEL;
00528 break;
00529 }
00530 }
00531
00532
00533
00534
00535
00536
00537
00538 values_ok = check_ktoblzcheck(td->dialog, td, td->ab_trans);
00539
00540 }
00541 while (!values_ok);
00542
00543
00544 if (td->dialog)
00545 gtk_widget_hide(td->dialog);
00546
00547 return result;
00548 }
00549
00550 static gboolean
00551 clear_templ_helper(GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter,
00552 gpointer user_data)
00553 {
00554 GncABTransTempl *templ;
00555
00556 g_return_val_if_fail(model && iter, TRUE);
00557
00558 gtk_tree_model_get(model, iter, TEMPLATE_POINTER, &templ, -1);
00559 gnc_ab_trans_templ_free(templ);
00560 return FALSE;
00561 }
00562
00563 void
00564 gnc_ab_trans_dialog_free(GncABTransDialog *td)
00565 {
00566 if (!td) return;
00567 if (td->ab_trans)
00568 AB_Transaction_free(td->ab_trans);
00569 if (td->dialog)
00570 gtk_widget_destroy(td->dialog);
00571 if (td->template_list_store)
00572 {
00573 gtk_tree_model_foreach(GTK_TREE_MODEL(td->template_list_store),
00574 clear_templ_helper, NULL);
00575 g_object_unref(td->template_list_store);
00576 }
00577 #if HAVE_KTOBLZCHECK_H
00578 AccountNumberCheck_delete(td->blzcheck);
00579 #endif
00580 g_free(td);
00581 }
00582
00583 static gboolean
00584 get_templ_helper(GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter,
00585 gpointer data)
00586 {
00587 GList **list = data;
00588 GncABTransTempl *templ;
00589
00590 g_return_val_if_fail(model && iter, TRUE);
00591
00592 gtk_tree_model_get(model, iter, TEMPLATE_POINTER, &templ, -1);
00593 *list = g_list_prepend(*list, templ);
00594 return FALSE;
00595 }
00596
00597 GList *
00598 gnc_ab_trans_dialog_get_templ(const GncABTransDialog *td, gboolean *changed)
00599 {
00600 GList *list = NULL;
00601
00602 g_return_val_if_fail(td, NULL);
00603
00604 if (changed)
00605 {
00606 *changed = td->templ_changed;
00607 if (!*changed)
00608 return NULL;
00609 }
00610
00611 gtk_tree_model_foreach(GTK_TREE_MODEL(td->template_list_store),
00612 get_templ_helper, &list);
00613 list = g_list_reverse(list);
00614 return list;
00615 }
00616
00617 GtkWidget *
00618 gnc_ab_trans_dialog_get_parent(const GncABTransDialog *td)
00619 {
00620 g_return_val_if_fail(td, NULL);
00621 return td->parent;
00622 }
00623
00624 const AB_TRANSACTION *
00625 gnc_ab_trans_dialog_get_ab_trans(const GncABTransDialog *td)
00626 {
00627 g_return_val_if_fail(td, NULL);
00628 return td->ab_trans;
00629 }
00630
00631 static AB_JOB *
00632 get_available_empty_job(AB_ACCOUNT *ab_acc, GncABTransType trans_type)
00633 {
00634 AB_JOB *job;
00635
00636 switch (trans_type)
00637 {
00638 case SINGLE_DEBITNOTE:
00639 job = AB_JobSingleDebitNote_new(ab_acc);
00640 break;
00641 case SINGLE_INTERNAL_TRANSFER:
00642 job = AB_JobInternalTransfer_new(ab_acc);
00643 break;
00644 case SINGLE_TRANSFER:
00645 default:
00646 job = AB_JobSingleTransfer_new(ab_acc);
00647 };
00648
00649 if (!job || AB_Job_CheckAvailability(job
00650 #ifndef AQBANKING_VERSION_5_PLUS
00651 , 0
00652 #endif
00653 ))
00654 {
00655 if (job) AB_Job_free(job);
00656 return NULL;
00657 }
00658 return job;
00659 }
00660
00661 AB_JOB *
00662 gnc_ab_trans_dialog_get_job(const GncABTransDialog *td)
00663 {
00664 g_return_val_if_fail(td, NULL);
00665 return gnc_ab_get_trans_job(td->ab_acc, td->ab_trans, td->trans_type);
00666 }
00667
00668 AB_JOB *
00669 gnc_ab_get_trans_job(AB_ACCOUNT *ab_acc, const AB_TRANSACTION *ab_trans,
00670 GncABTransType trans_type)
00671 {
00672 AB_JOB *job;
00673
00674 g_return_val_if_fail(ab_acc && ab_trans, NULL);
00675
00676 job = get_available_empty_job(ab_acc, trans_type);
00677 if (job)
00678 {
00679 switch (trans_type)
00680 {
00681 case SINGLE_DEBITNOTE:
00682 AB_JobSingleDebitNote_SetTransaction(job, ab_trans);
00683 break;
00684 case SINGLE_INTERNAL_TRANSFER:
00685 AB_JobInternalTransfer_SetTransaction(job, ab_trans);
00686 break;
00687 case SINGLE_TRANSFER:
00688 default:
00689 AB_JobSingleTransfer_SetTransaction(job, ab_trans);
00690 };
00691 }
00692 return job;
00693 }
00694
00695 void
00696 templ_list_row_activated_cb(GtkTreeView *view, GtkTreePath *path,
00697 GtkTreeViewColumn *column, gpointer user_data)
00698 {
00699 GncABTransDialog *td = user_data;
00700 GtkTreeModel *model;
00701 GtkTreeIter iter;
00702 GncABTransTempl *templ;
00703 const gchar *old_name, *new_name;
00704 const gchar *old_account, *new_account;
00705 const gchar *old_bankcode, *new_bankcode;
00706 const gchar *old_purpose, *new_purpose;
00707 const gchar *old_purpose_cont, *new_purpose_cont;
00708 GtkWidget *amount_widget;
00709 const gchar *old_amount_text;
00710 gnc_numeric old_amount, new_amount;
00711
00712 g_return_if_fail(td);
00713
00714 ENTER("td=%p", td);
00715 if (!gtk_tree_model_get_iter(GTK_TREE_MODEL(td->template_list_store), &iter,
00716 path))
00717 {
00718 LEAVE("Could not get iter");
00719 return;
00720 }
00721 gtk_tree_model_get(GTK_TREE_MODEL(td->template_list_store), &iter,
00722 TEMPLATE_POINTER, &templ, -1);
00723
00724
00725 old_name = gtk_entry_get_text(GTK_ENTRY(td->recp_name_entry));
00726 old_account = gtk_entry_get_text(GTK_ENTRY(td->recp_account_entry));
00727 old_bankcode = gtk_entry_get_text(GTK_ENTRY(td->recp_bankcode_entry));
00728 old_purpose = gtk_entry_get_text(GTK_ENTRY(td->purpose_entry));
00729 old_purpose_cont = gtk_entry_get_text(GTK_ENTRY(td->purpose_cont_entry));
00730 amount_widget = gnc_amount_edit_gtk_entry(GNC_AMOUNT_EDIT(td->amount_edit));
00731 old_amount_text = gtk_entry_get_text(GTK_ENTRY(amount_widget));
00732 old_amount = gnc_amount_edit_get_amount(GNC_AMOUNT_EDIT(td->amount_edit));
00733
00734
00735 new_name = gnc_ab_trans_templ_get_recp_name(templ);
00736 new_account = gnc_ab_trans_templ_get_recp_account(templ);
00737 new_bankcode = gnc_ab_trans_templ_get_recp_bankcode(templ);
00738 new_purpose = gnc_ab_trans_templ_get_purpose(templ);
00739 new_purpose_cont = gnc_ab_trans_templ_get_purpose_cont(templ);
00740 new_amount = gnc_ab_trans_templ_get_amount(templ);
00741 if (!new_name) new_name = "";
00742 if (!new_account) new_account = "";
00743 if (!new_bankcode) new_bankcode = "";
00744 if (!new_purpose) new_purpose = "";
00745 if (!new_purpose_cont) new_purpose_cont = "";
00746
00747
00748 if ((*old_name && strcmp(old_name, new_name))
00749 || (*old_account && strcmp(old_account, new_account))
00750 || (*old_bankcode && strcmp(old_bankcode, new_bankcode))
00751 || (*old_purpose && strcmp(old_purpose, new_purpose))
00752 || (*old_purpose_cont && strcmp(old_purpose_cont, new_purpose_cont))
00753 || (*old_amount_text && !gnc_numeric_equal(old_amount, new_amount)))
00754 {
00755 if (!gnc_verify_dialog(
00756 td->parent, FALSE,
00757 _("Do you really want to overwrite your changes with the "
00758 "contents of the template \"%s\"?"),
00759 gnc_ab_trans_templ_get_name(templ)))
00760 {
00761
00762 LEAVE("aborted");
00763 return;
00764 }
00765 }
00766
00767
00768 gtk_entry_set_text(GTK_ENTRY(td->recp_name_entry), new_name);
00769 gtk_entry_set_text(GTK_ENTRY(td->recp_account_entry), new_account);
00770 gtk_entry_set_text(GTK_ENTRY(td->recp_bankcode_entry), new_bankcode);
00771 gtk_entry_set_text(GTK_ENTRY(td->purpose_entry), new_purpose);
00772 gtk_entry_set_text(GTK_ENTRY(td->purpose_cont_entry), new_purpose_cont);
00773 gnc_amount_edit_set_amount(GNC_AMOUNT_EDIT(td->amount_edit), new_amount);
00774 LEAVE(" ");
00775 }
00776
00777 void
00778 dat_bankcode_changed_cb(GtkEditable *editable, gpointer user_data)
00779 {
00780 #if HAVE_KTOBLZCHECK_H
00781 GncABTransDialog *td = user_data;
00782 const AccountNumberCheck_Record *record;
00783 const gchar *input = gtk_entry_get_text(GTK_ENTRY(td->recp_bankcode_entry));
00784
00785 g_return_if_fail(td);
00786
00787 ENTER("td=%p, input=%s", td, input);
00788 record = AccountNumberCheck_findBank(td->blzcheck, input);
00789
00790 if (record)
00791 {
00792 const char *bankname = AccountNumberCheck_Record_bankName(record);
00793 GError *error = NULL;
00794 const char *ktoblzcheck_encoding =
00795 #ifdef KTOBLZCHECK_VERSION_MAJOR
00796
00797
00798
00799 AccountNumberCheck_stringEncoding()
00800 #else
00801
00802
00803 "ISO-8859-15"
00804 #endif
00805 ;
00806 gchar *utf8_bankname = g_convert(bankname, strlen(bankname), "UTF-8",
00807 ktoblzcheck_encoding, NULL, NULL,
00808 &error);
00809
00810 if (error)
00811 {
00812 g_critical("Error converting bankname \"%s\" to UTF-8", bankname);
00813 g_error_free (error);
00814
00815 utf8_bankname = g_strdup(_("(unknown)"));
00816 }
00817 gtk_label_set_text(GTK_LABEL(td->recp_bankname_label),
00818 *utf8_bankname ? utf8_bankname : _("(unknown)"));
00819 DEBUG("Found: %s", utf8_bankname);
00820 g_free(utf8_bankname);
00821 }
00822 else
00823 {
00824 gtk_label_set_text(GTK_LABEL(td->recp_bankname_label), _("(unknown)"));
00825 }
00826 LEAVE(" ");
00827 #endif
00828 }
00829
00830 struct _FindTemplData
00831 {
00832 const gchar *name;
00833 const GncABTransTempl *pointer;
00834 };
00835
00836 static gboolean
00837 find_templ_helper(GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter,
00838 gpointer user_data)
00839 {
00840 struct _FindTemplData *data = user_data;
00841 gchar *name;
00842 GncABTransTempl *templ;
00843 gboolean match;
00844
00845 g_return_val_if_fail(model && data, TRUE);
00846 gtk_tree_model_get(model, iter,
00847 TEMPLATE_NAME, &name,
00848 TEMPLATE_POINTER, &templ,
00849 -1);
00850 if (data->name)
00851 {
00852
00853 g_return_val_if_fail(!data->pointer, TRUE);
00854 match = strcmp(name, data->name) == 0;
00855 if (match) data->pointer = templ;
00856 }
00857 else
00858 {
00859
00860 g_return_val_if_fail(!data->name, TRUE);
00861 match = templ == data->pointer;
00862 if (match) data->name = g_strdup(name);
00863 }
00864 g_free(name);
00865 return match;
00866 }
00867
00868 void
00869 dat_add_templ_cb(GtkButton *button, gpointer user_data)
00870 {
00871 GncABTransDialog *td = user_data;
00872 GladeXML *xml;
00873 GtkWidget *dialog;
00874 GtkWidget *entry;
00875 gint retval;
00876 const gchar *name;
00877 GncABTransTempl *templ;
00878 struct _FindTemplData data;
00879 GtkTreeSelection *selection;
00880 GtkTreeIter cur_iter;
00881 GtkTreeIter new_iter;
00882
00883 g_return_if_fail(td);
00884
00885 ENTER("td=%p", td);
00886 xml = gnc_glade_xml_new ("aqbanking.glade", "Template Name Dialog");
00887 dialog = glade_xml_get_widget(xml, "Template Name Dialog");
00888 g_object_set_data_full(G_OBJECT(dialog), "xml", xml, g_object_unref);
00889 entry = glade_xml_get_widget(xml, "template_name");
00890
00891
00892 gtk_entry_set_text(GTK_ENTRY(entry),
00893 gtk_entry_get_text(GTK_ENTRY(td->recp_name_entry)));
00894
00895 do
00896 {
00897 retval = gtk_dialog_run(GTK_DIALOG(dialog));
00898 if (retval != GTK_RESPONSE_OK)
00899 break;
00900
00901 name = gtk_entry_get_text(GTK_ENTRY(entry));
00902 if (!*name)
00903 break;
00904
00905 data.name = name;
00906 data.pointer = NULL;
00907 gtk_tree_model_foreach(GTK_TREE_MODEL(td->template_list_store),
00908 find_templ_helper, &data);
00909 if (data.pointer)
00910 {
00911 gnc_error_dialog(dialog, "%s",
00912 _("A template with the given name already exists. "
00913 "Please enter another name."));
00914 continue;
00915 }
00916
00917
00918 templ = gnc_ab_trans_templ_new_full(
00919 name,
00920 gtk_entry_get_text(GTK_ENTRY(td->recp_name_entry)),
00921 gtk_entry_get_text(GTK_ENTRY(td->recp_account_entry)),
00922 gtk_entry_get_text(GTK_ENTRY(td->recp_bankcode_entry)),
00923 gnc_amount_edit_get_amount(GNC_AMOUNT_EDIT(td->amount_edit)),
00924 gtk_entry_get_text(GTK_ENTRY(td->purpose_entry)),
00925 gtk_entry_get_text (GTK_ENTRY(td->purpose_cont_entry)));
00926
00927
00928 selection = gtk_tree_view_get_selection(td->template_gtktreeview);
00929 if (gtk_tree_selection_get_selected(selection, NULL, &cur_iter))
00930 {
00931 gtk_list_store_insert_after(td->template_list_store,
00932 &new_iter, &cur_iter);
00933 }
00934 else
00935 {
00936 gtk_list_store_append(td->template_list_store, &new_iter);
00937 }
00938 gtk_list_store_set(td->template_list_store, &new_iter,
00939 TEMPLATE_NAME, name,
00940 TEMPLATE_POINTER, templ,
00941 -1);
00942 td->templ_changed = TRUE;
00943 DEBUG("Added template with name %s", name);
00944 break;
00945 }
00946 while (TRUE);
00947
00948 gtk_widget_destroy(dialog);
00949
00950 LEAVE(" ");
00951 }
00952
00953 void
00954 dat_moveup_templ_cb(GtkButton *button, gpointer user_data)
00955 {
00956 GncABTransDialog *td = user_data;
00957 GtkTreeSelection *selection;
00958 GtkTreeModel *model;
00959 GtkTreeIter iter;
00960 GtkTreePath *prev_path;
00961 GtkTreeIter prev_iter;
00962
00963 g_return_if_fail(td);
00964
00965 selection = gtk_tree_view_get_selection(td->template_gtktreeview);
00966 if (!gtk_tree_selection_get_selected(selection, &model, &iter))
00967 return;
00968
00969 prev_path = gtk_tree_model_get_path(model, &iter);
00970 if (gtk_tree_path_prev(prev_path))
00971 {
00972 if (gtk_tree_model_get_iter(model, &prev_iter, prev_path))
00973 {
00974 gtk_list_store_move_before(GTK_LIST_STORE(model), &iter, &prev_iter);
00975 td->templ_changed = TRUE;
00976 }
00977 }
00978 gtk_tree_path_free(prev_path);
00979 }
00980
00981 void
00982 dat_movedown_templ_cb(GtkButton *button, gpointer user_data)
00983 {
00984 GncABTransDialog *td = user_data;
00985 GtkTreeSelection *selection;
00986 GtkTreeModel *model;
00987 GtkTreeIter iter;
00988 GtkTreeIter next_iter;
00989
00990 g_return_if_fail(td);
00991
00992 selection = gtk_tree_view_get_selection(td->template_gtktreeview);
00993 if (!gtk_tree_selection_get_selected (selection, &model, &iter))
00994 return;
00995
00996 next_iter = iter;
00997 if (gtk_tree_model_iter_next(model, &next_iter))
00998 {
00999 gtk_list_store_move_after(GTK_LIST_STORE(model), &iter, &next_iter);
01000 td->templ_changed = TRUE;
01001 }
01002 }
01003
01004 void
01005 dat_sort_templ_cb(GtkButton *button, gpointer user_data)
01006 {
01007 GncABTransDialog *td = user_data;
01008
01009 g_return_if_fail(td);
01010
01011 ENTER("td=%p", td);
01012 gtk_tree_sortable_set_sort_column_id(
01013 GTK_TREE_SORTABLE(td->template_list_store),
01014 TEMPLATE_NAME, GTK_SORT_ASCENDING);
01015 gtk_tree_sortable_set_sort_column_id(
01016 GTK_TREE_SORTABLE(td->template_list_store),
01017 GTK_TREE_SORTABLE_UNSORTED_SORT_COLUMN_ID,
01018 GTK_SORT_ASCENDING);
01019 td->templ_changed = TRUE;
01020 LEAVE(" ");
01021 }
01022
01023 void
01024 dat_del_templ_cb(GtkButton *button, gpointer user_data)
01025 {
01026 GncABTransDialog *td = user_data;
01027 GtkTreeSelection *selection;
01028 GtkTreeModel *model;
01029 GtkTreeIter iter;
01030 gchar *name;
01031
01032 g_return_if_fail(td);
01033
01034 ENTER("td=%p", td);
01035 selection = gtk_tree_view_get_selection(td->template_gtktreeview);
01036 if (!gtk_tree_selection_get_selected (selection, &model, &iter))
01037 {
01038 LEAVE("None selected");
01039 return;
01040 }
01041
01042 gtk_tree_model_get(model, &iter, TEMPLATE_NAME, &name, -1);
01043 if (gnc_verify_dialog(
01044 td->parent, FALSE,
01045 _("Do you really want to delete the template with the name \"%s\"?"),
01046 name))
01047 {
01048 gtk_list_store_remove(GTK_LIST_STORE(model), &iter);
01049 td->templ_changed = TRUE;
01050 DEBUG("Deleted template with name %s", name);
01051 }
01052 g_free(name);
01053 LEAVE(" ");
01054 }