34 #include <glib/gi18n.h>
35 #if HAVE_KTOBLZCHECK_H
36 # include <ktoblzcheck.h>
38 #include <aqbanking/jobsingletransfer.h>
39 #include <aqbanking/jobsingledebitnote.h>
40 #include <aqbanking/jobinternaltransfer.h>
41 #include <aqbanking/jobsepatransfer.h>
42 #include <aqbanking/jobsepadebitnote.h>
45 #include "dialog-transfer.h"
46 #include "dialog-utils.h"
49 #include "gnc-amount-edit.h"
52 #if AQBANKING_VERSION_INT > 50200 || ((AQBANKING_VERSION_INT == 50200) && (AQBANKING_VERSION_BUILD > 0))
54 # define AQBANKING_VERSION_GREATER_5_2_0
61 static void gnc_ab_trans_dialog_fill_templ_helper(gpointer data, gpointer user_data);
62 static gboolean gnc_ab_trans_dialog_clear_templ_helper(GtkTreeModel *model,
66 static gboolean gnc_ab_trans_dialog_get_templ_helper(GtkTreeModel *model,
71 static AB_TRANSACTION *gnc_ab_trans_dialog_fill_values(
GncABTransDialog *td);
72 static AB_JOB *gnc_ab_trans_dialog_get_available_empty_job(AB_ACCOUNT *ab_acc,
73 GncABTransType trans_type);
75 static void gnc_ab_trans_dialog_check_ktoblzcheck(
const GncABTransDialog *td,
76 const AB_TRANSACTION *trans);
79 G_MODULE_EXPORT
void gnc_ab_trans_dialog_bankcode_changed_cb(GtkEditable *editable, gpointer user_data);
80 G_MODULE_EXPORT
void gnc_ab_trans_dialog_add_templ_cb(GtkButton *button, gpointer user_data);
81 G_MODULE_EXPORT
void gnc_ab_trans_dialog_moveup_templ_cb(GtkButton *button, gpointer user_data);
82 G_MODULE_EXPORT
void gnc_ab_trans_dialog_movedown_templ_cb(GtkButton *button, gpointer user_data);
83 G_MODULE_EXPORT
void gnc_ab_trans_dialog_sort_templ_cb(GtkButton *button, gpointer user_data);
84 G_MODULE_EXPORT
void gnc_ab_trans_dialog_del_templ_cb(GtkButton *button, gpointer user_data);
85 G_MODULE_EXPORT
void gnc_ab_trans_dialog_ibanentry_filter_cb (GtkEditable *editable,
90 G_MODULE_EXPORT
void gnc_ab_trans_dialog_bicentry_filter_cb (GtkEditable *editable,
95 G_MODULE_EXPORT
void gnc_ab_trans_dialog_templ_list_row_activated_cb(GtkTreeView *view,
97 GtkTreeViewColumn *column,
99 G_MODULE_EXPORT
void gnc_ab_trans_dialog_verify_values(
GncABTransDialog *td);
117 GncABTransType trans_type;
120 GtkWidget *recp_name_entry;
121 GtkWidget *recp_account_entry;
122 GtkWidget *recp_bankcode_entry;
125 GtkWidget *amount_edit;
128 GtkWidget *purpose_entry;
129 GtkWidget *purpose_cont_entry;
130 GtkWidget *purpose_cont2_entry;
131 GtkWidget *purpose_cont3_entry;
134 GtkWidget *recp_bankname_label;
137 GtkWidget *orig_name_entry;
140 GtkTreeView *template_gtktreeview;
141 GtkListStore *template_list_store;
144 GtkWidget *exec_button;
147 gboolean templ_changed;
150 AB_TRANSACTION *ab_trans;
155 #if HAVE_KTOBLZCHECK_H
157 AccountNumberCheck *blzcheck;
174 gnc_ab_trans_dialog_fill_templ_helper(gpointer data, gpointer user_data)
177 GtkListStore *store = user_data;
180 g_return_if_fail(templ && store);
181 gtk_list_store_append(store, &iter);
182 gtk_list_store_set(store, &iter,
184 TEMPLATE_POINTER, templ,
192 static AB_TRANSACTION *
196 AB_TRANSACTION *trans = AB_Transaction_new();
199 AB_Transaction_FillLocalFromAccount(trans, td->ab_acc);
207 AB_Transaction_SetRemoteBic(
208 trans, gtk_entry_get_text(GTK_ENTRY(td->recp_bankcode_entry)));
209 AB_Transaction_SetRemoteIban(
210 trans, gtk_entry_get_text(GTK_ENTRY(td->recp_account_entry)));
211 AB_Transaction_SetLocalName(
212 trans, gtk_entry_get_text(GTK_ENTRY(td->orig_name_entry)));
216 AB_Transaction_SetRemoteBankCode(
217 trans, gtk_entry_get_text(GTK_ENTRY(td->recp_bankcode_entry)));
218 AB_Transaction_SetRemoteAccountNumber(
219 trans, gtk_entry_get_text(GTK_ENTRY(td->recp_account_entry)));
221 AB_Transaction_SetRemoteCountry(trans,
"DE");
222 AB_Transaction_AddRemoteName(
223 trans, gtk_entry_get_text(GTK_ENTRY(td->recp_name_entry)), FALSE);
225 AB_Transaction_AddPurpose(
226 trans, gtk_entry_get_text(GTK_ENTRY(td->purpose_entry)), FALSE);
227 AB_Transaction_AddPurpose(
228 trans, gtk_entry_get_text(GTK_ENTRY(td->purpose_cont_entry)), FALSE);
229 AB_Transaction_AddPurpose(
230 trans, gtk_entry_get_text(GTK_ENTRY(td->purpose_cont2_entry)), FALSE);
231 AB_Transaction_AddPurpose(
232 trans, gtk_entry_get_text(GTK_ENTRY(td->purpose_cont3_entry)), FALSE);
234 value = AB_Value_fromDouble(gnc_amount_edit_get_damount(
235 GNC_AMOUNT_EDIT(td->amount_edit)));
237 AB_Value_SetCurrency(value,
"EUR");
238 AB_Transaction_SetValue(trans, value);
239 AB_Value_free(value);
243 switch (td->trans_type)
245 case SINGLE_DEBITNOTE:
247 AB_Transaction_SetTextKey(trans, 05);
251 AB_Transaction_SetTextKey (trans, 51);
260 gint commodity_scu, GncABTransType trans_type,
265 const gchar *ab_ownername;
266 const gchar *ab_accountnumber;
267 const gchar *ab_bankname;
268 const gchar *ab_bankcode;
269 G_GNUC_UNUSED GtkWidget *trans_vbox;
270 GtkWidget *heading_label;
271 GtkWidget *recp_name_heading;
272 GtkWidget *recp_account_heading;
273 GtkWidget *recp_bankcode_heading;
274 GtkWidget *amount_hbox;
275 GtkWidget *orig_name_heading;
276 GtkWidget *orig_account_heading;
277 GtkWidget *orig_account_label;
278 G_GNUC_UNUSED GtkWidget *orig_bankname_heading;
279 GtkWidget *orig_bankname_label;
280 GtkWidget *orig_bankcode_heading;
281 GtkWidget *orig_bankcode_label;
282 GtkCellRenderer *renderer;
283 GtkTreeViewColumn *column;
285 g_return_val_if_fail(ab_acc, NULL);
287 ab_ownername = AB_Account_GetOwnerName(ab_acc);
290 ab_accountnumber = AB_Account_GetAccountNumber(ab_acc);
291 ab_bankcode = AB_Account_GetBankCode(ab_acc);
292 ab_bankname = AB_Account_GetBankName(ab_acc);
293 if (!ab_bankname || !*ab_bankname)
294 ab_bankname = _(
"(unknown)");
299 td->trans_type = trans_type;
301 #if HAVE_KTOBLZCHECK_H
302 td->blzcheck = AccountNumberCheck_new();
305 builder = gtk_builder_new();
306 gnc_builder_add_from_file (builder,
"dialog-ab.glade",
"Transaction Dialog");
307 td->dialog = GTK_WIDGET(gtk_builder_get_object (builder,
"Transaction Dialog"));
310 gtk_window_set_transient_for(GTK_WINDOW(td->dialog), GTK_WINDOW(parent));
313 trans_vbox = GTK_WIDGET(gtk_builder_get_object (builder,
"trans_vbox"));
314 heading_label = GTK_WIDGET(gtk_builder_get_object (builder,
"heading_label"));
315 recp_name_heading = GTK_WIDGET(gtk_builder_get_object (builder,
"recp_name_heading"));
316 td->recp_name_entry = GTK_WIDGET(gtk_builder_get_object (builder,
"recp_name_entry"));
317 recp_account_heading = GTK_WIDGET(gtk_builder_get_object (builder,
"recp_account_heading"));
318 td->recp_account_entry = GTK_WIDGET(gtk_builder_get_object (builder,
"recp_account_entry"));
319 recp_bankcode_heading = GTK_WIDGET(gtk_builder_get_object (builder,
"recp_bankcode_heading"));
320 td->recp_bankcode_entry = GTK_WIDGET(gtk_builder_get_object (builder,
"recp_bankcode_entry"));
321 td->recp_bankname_label = GTK_WIDGET(gtk_builder_get_object (builder,
"recp_bankname_label"));
322 amount_hbox = GTK_WIDGET(gtk_builder_get_object (builder,
"amount_hbox"));
323 td->purpose_entry = GTK_WIDGET(gtk_builder_get_object (builder,
"purpose_entry"));
324 td->purpose_cont_entry = GTK_WIDGET(gtk_builder_get_object (builder,
"purpose_cont_entry"));
325 td->purpose_cont2_entry = GTK_WIDGET(gtk_builder_get_object (builder,
"purpose_cont2_entry"));
326 td->purpose_cont3_entry = GTK_WIDGET(gtk_builder_get_object (builder,
"purpose_cont3_entry"));
327 td->exec_button = GTK_WIDGET(gtk_builder_get_object(builder,
"exec_now_button"));
328 orig_name_heading = GTK_WIDGET(gtk_builder_get_object (builder,
"orig_name_heading"));
329 td->orig_name_entry = GTK_WIDGET(gtk_builder_get_object (builder,
"orig_name_label"));
330 orig_account_heading = GTK_WIDGET(gtk_builder_get_object (builder,
"orig_account_heading"));
331 orig_account_label = GTK_WIDGET(gtk_builder_get_object (builder,
"orig_account_label"));
332 orig_bankname_heading = GTK_WIDGET(gtk_builder_get_object (builder,
"orig_bankname_heading"));
333 orig_bankname_label = GTK_WIDGET(gtk_builder_get_object (builder,
"orig_bankname_label"));
334 orig_bankcode_heading = GTK_WIDGET(gtk_builder_get_object (builder,
"orig_bankcode_heading"));
335 orig_bankcode_label = GTK_WIDGET(gtk_builder_get_object (builder,
"orig_bankcode_label"));
336 td->template_gtktreeview =
337 GTK_TREE_VIEW(gtk_builder_get_object (builder,
"template_list"));
340 td->amount_edit = gnc_amount_edit_new();
341 gtk_box_pack_start(GTK_BOX(amount_hbox), td->amount_edit, TRUE, TRUE, 0);
342 gnc_amount_edit_set_evaluate_on_enter(GNC_AMOUNT_EDIT(td->amount_edit),
344 gnc_amount_edit_set_fraction(GNC_AMOUNT_EDIT(td->amount_edit),
348 g_signal_connect_swapped (gnc_amount_edit_gtk_entry(GNC_AMOUNT_EDIT(td->amount_edit)),
"focus-out-event",
349 G_CALLBACK(gnc_ab_trans_dialog_verify_values), td);
355 case SINGLE_TRANSFER:
356 case SINGLE_INTERNAL_TRANSFER:
360 gtk_label_set_text(GTK_LABEL (heading_label),
371 _(
"Enter a SEPA Online Transfer"));
372 gtk_label_set_text(GTK_LABEL(recp_account_heading),
373 _(
"Recipient IBAN (International Account Number)"));
374 gtk_label_set_text(GTK_LABEL(recp_bankcode_heading),
375 _(
"Recipient BIC (Bank Code)"));
377 gtk_label_set_text(GTK_LABEL(orig_account_heading),
378 _(
"Originator IBAN (International Account Number)"));
379 gtk_label_set_text(GTK_LABEL(orig_bankcode_heading),
380 _(
"Originator BIC (Bank Code)"));
383 case SINGLE_DEBITNOTE:
384 gtk_label_set_text(GTK_LABEL (heading_label),
385 _(
"Enter an Online Direct Debit Note"));
387 gtk_label_set_text(GTK_LABEL(recp_name_heading),
388 _(
"Debited Account Owner"));
389 gtk_label_set_text(GTK_LABEL(recp_account_heading),
390 _(
"Debited Account Number"));
391 gtk_label_set_text(GTK_LABEL(recp_bankcode_heading),
392 _(
"Debited Account Bank Code"));
394 gtk_label_set_text(GTK_LABEL(orig_name_heading),
395 _(
"Credited Account Owner"));
396 gtk_label_set_text(GTK_LABEL(orig_account_heading),
397 _(
"Credited Account Number"));
398 gtk_label_set_text(GTK_LABEL(orig_bankcode_heading),
399 _(
"Credited Account Bank Code"));
403 gtk_label_set_text(GTK_LABEL (heading_label),
404 _(
"Enter a SEPA Online Direct Debit Note"));
406 gtk_label_set_text(GTK_LABEL(recp_name_heading),
407 _(
"Debited Account Owner"));
408 gtk_label_set_text(GTK_LABEL(recp_account_heading),
409 _(
"Debited IBAN (International Account Number)"));
410 gtk_label_set_text(GTK_LABEL(recp_bankcode_heading),
411 _(
"Debited BIC (Bank Code)"));
413 gtk_label_set_text(GTK_LABEL(orig_name_heading),
414 _(
"Credited Account Owner"));
415 gtk_label_set_text(GTK_LABEL(orig_account_heading),
416 _(
"Credited IBAN (International Account Number)"));
417 gtk_label_set_text(GTK_LABEL(orig_bankcode_heading),
418 _(
"Credited BIC (Bank Code)"));
422 g_critical(
"gnc_ab_trans_dialog_new: Oops, unknown GncABTransType %d",
431 gtk_entry_set_max_length(GTK_ENTRY(td->recp_bankcode_entry), 11);
432 gtk_entry_set_max_length(GTK_ENTRY(td->recp_account_entry), 34);
435 gtk_entry_set_text(GTK_ENTRY(td->orig_name_entry), ab_ownername);
436 gtk_label_set_text(GTK_LABEL(orig_bankname_label), ab_bankname);
439 gtk_widget_set_sensitive(GTK_WIDGET(td->orig_name_entry), TRUE);
440 ab_accountnumber = AB_Account_GetIBAN(ab_acc);
441 ab_bankcode = AB_Account_GetBIC(ab_acc);
442 gtk_label_set_text(GTK_LABEL(orig_account_label), ab_accountnumber);
443 gtk_label_set_text (GTK_LABEL (orig_bankcode_label), ab_bankcode);
447 gtk_widget_set_sensitive(GTK_WIDGET(td->orig_name_entry), FALSE);
448 gtk_label_set_text(GTK_LABEL(orig_account_label), ab_accountnumber);
449 gtk_label_set_text (GTK_LABEL (orig_bankcode_label), ab_bankcode);
453 td->template_list_store = gtk_list_store_new(TEMPLATE_NUM_COLUMNS,
454 G_TYPE_STRING, G_TYPE_POINTER);
455 g_list_foreach(templates, gnc_ab_trans_dialog_fill_templ_helper, td->template_list_store);
456 gtk_tree_view_set_model(td->template_gtktreeview,
457 GTK_TREE_MODEL(td->template_list_store));
458 td->templ_changed = FALSE;
462 renderer = gtk_cell_renderer_text_new();
463 column = gtk_tree_view_column_new_with_attributes(
464 "Template Name", renderer,
"text", TEMPLATE_NAME, NULL);
465 gtk_tree_view_append_column(td->template_gtktreeview, column);
468 gtk_builder_connect_signals_full(builder, gnc_builder_connect_full_func, td);
470 g_object_unref(G_OBJECT(builder));
473 gnc_ab_trans_dialog_verify_values(td);
479 gnc_ab_trans_dialog_entry_set (GtkWidget* entry,
480 const gchar* message,
481 const gchar* stock_icon)
484 "secondary-icon-stock", stock_icon,
485 "secondary-icon-tooltip-text", message,
491 const AB_TRANSACTION *trans)
495 int rv = AB_Banking_CheckIban(AB_Transaction_GetRemoteIban(trans));
497 gchar *message = g_strdup_printf(_(
"The internal check of the destination IBAN '%s' "
498 "failed. This means "
499 "the account number might contain an error."),
500 AB_Transaction_GetRemoteIban(trans));
501 gnc_ab_trans_dialog_entry_set (td->recp_account_entry, message,
502 GTK_STOCK_DIALOG_WARNING);
506 gnc_ab_trans_dialog_entry_set (td->recp_account_entry,
"",
508 gnc_ab_trans_dialog_entry_set (td->recp_bankcode_entry,
"",
514 #ifndef HAVE_KTOBLZCHECK_H
526 LEAVE(
"No ktoblzcheck implemented for IBAN");
530 blzresult = AccountNumberCheck_check(
532 AB_Transaction_GetRemoteBankCode(trans),
533 AB_Transaction_GetRemoteAccountNumber(trans));
537 message = g_strdup_printf(_(
"The internal check of the destination account number '%s' "
538 "at the specified bank with bank code '%s' failed. This means "
539 "the account number might contain an error."),
540 AB_Transaction_GetRemoteAccountNumber(trans),
541 AB_Transaction_GetRemoteBankCode(trans));
542 gnc_ab_trans_dialog_entry_set (td->recp_bankcode_entry, message,
543 GTK_STOCK_DIALOG_WARNING);
544 gnc_ab_trans_dialog_entry_set (td->recp_account_entry, message,
545 GTK_STOCK_DIALOG_WARNING);
547 blztext =
"Kontonummer wahrscheinlich falsch";
550 blztext =
"Kontonummer ok";
553 blztext =
"bank unbekannt";
557 blztext =
"unbekannt aus unbekanntem grund";
563 gnc_ab_trans_dialog_entry_set (td->recp_bankcode_entry,
"",
565 gnc_ab_trans_dialog_entry_set (td->recp_account_entry,
"",
569 LEAVE(
"KtoBlzCheck said check is %d = %s",
570 blzresult, blztext ? blztext :
"(none)");
578 AB_Transaction_free(td->ab_trans);
587 const gchar* account;
588 const gchar* bankcode;
590 gboolean values_ok = TRUE;
592 GtkWidget *amount_entry = gnc_amount_edit_gtk_entry(GNC_AMOUNT_EDIT(td->amount_edit));
596 td->ab_trans = gnc_ab_trans_dialog_fill_values(td);
601 const char* localBIC = AB_Transaction_GetLocalBic(td->ab_trans);
602 const char* localIBAN = AB_Transaction_GetLocalIban(td->ab_trans);
603 if (!localBIC || !localIBAN
604 || (strlen(localBIC) == 0) || (strlen(localIBAN) == 0))
606 const char* localBankCode = AB_Transaction_GetLocalBankCode(td->ab_trans);
607 const char* localAccountCode = AB_Transaction_GetLocalAccountNumber(td->ab_trans);
609 gnc_error_dialog(td->dialog,
610 _(
"Your local bank account does not yet have the SEPA account information stored."
611 " We are sorry, but in this development version one additional step is necessary "
612 "which has not yet been implemented directly in gnucash. "
613 "Please execute the command line program \"aqhbci-tool\" for your account, as follows: "
614 "aqhbci-tool4 getaccsepa -b %s -a %s"),
615 (localBankCode ? localBankCode :
""),
616 (localAccountCode ? localAccountCode :
""));
622 if (!othername || !strlen(othername))
624 gnc_ab_trans_dialog_entry_set (td->recp_name_entry,
625 _(
"You did not enter a recipient name. A recipient name is "
626 "required for an online transfer.\n"),
634 gnc_ab_trans_dialog_entry_set (td->recp_name_entry,
"", NULL);
640 ? AB_Transaction_GetRemoteIban(td->ab_trans)
641 : AB_Transaction_GetRemoteAccountNumber(td->ab_trans);
642 if (!account || !strlen(account))
644 gnc_ab_trans_dialog_entry_set (td->recp_account_entry,
645 _(
"You did not enter a recipient account. A recipient account is "
646 "required for an online transfer.\n"),
652 gnc_ab_trans_dialog_entry_set (td->recp_account_entry,
"", NULL);
656 ? AB_Transaction_GetRemoteBic(td->ab_trans)
657 : AB_Transaction_GetRemoteBankCode(td->ab_trans);
660 gnc_ab_trans_dialog_entry_set (td->recp_bankcode_entry,
661 _(
"You did not enter a recipient bank. A recipient bank is "
662 "required for an online transfer.\n"),
668 gnc_ab_trans_dialog_entry_set (td->recp_bankcode_entry,
"", NULL);
672 gnc_ab_trans_dialog_check_ktoblzcheck(td, td->ab_trans);
675 if (AB_Value_GetValueAsDouble(AB_Transaction_GetValue(td->ab_trans))
678 gnc_ab_trans_dialog_entry_set (amount_entry,
679 _(
"The amount is zero or the amount field could not be "
680 "interpreted correctly. You might have mixed up decimal "
681 "point and comma, compared to your locale settings. "
682 "This does not result in a valid online transfer job."),
688 gnc_ab_trans_dialog_entry_set (amount_entry,
"", NULL);
693 if (!purpose || !strlen(purpose))
695 gnc_ab_trans_dialog_entry_set (td->purpose_entry,
696 _(
"You did not enter any transaction purpose. A purpose is "
697 "required for an online transfer.\n"),
704 gnc_ab_trans_dialog_entry_set (td->purpose_entry,
"", NULL);
717 gnc_ab_trans_dialog_entry_set (td->recp_name_entry,
718 _(
"The text you entered contained at least one character that is invalid for a SEPA transaction. "
719 "In SEPA, unfortunately only exactly the following characters are allowed: "
720 "a...z, A...Z, 0...9, and the following punctuations: ' : ? , - ( + . ) / "
722 "In particular, neither Umlauts nor an ampersand (&) is allowed, "
723 "neither in the recipient or sender name nor in any purpose line."),
729 gtk_widget_set_sensitive(td->exec_button, values_ok);
730 gnc_ab_trans_dialog_clear_transaction(td);
738 const AB_TRANSACTION_LIMITS *joblimits;
739 guint8 max_purpose_lines;
742 job = gnc_ab_trans_dialog_get_available_empty_job(td->ab_acc, td->trans_type);
745 g_warning(
"gnc_ab_trans_dialog_run_until_ok: Oops, job not available");
746 return GTK_RESPONSE_CANCEL;
751 #ifdef AQBANKING_VERSION_GREATER_5_2_0
752 AB_Job_GetFieldLimits
754 AB_JobSingleTransfer_GetFieldLimits
757 max_purpose_lines = joblimits ?
758 AB_TransactionLimits_GetMaxLinesPurpose(joblimits) : 2;
759 gtk_widget_set_sensitive(td->purpose_cont_entry, max_purpose_lines > 1);
760 gtk_widget_set_sensitive(td->purpose_cont2_entry, max_purpose_lines > 2);
761 gtk_widget_set_sensitive(td->purpose_cont3_entry, max_purpose_lines > 3);
764 gtk_entry_set_max_length(GTK_ENTRY(td->purpose_entry),
765 AB_TransactionLimits_GetMaxLenPurpose(joblimits));
766 gtk_entry_set_max_length(GTK_ENTRY(td->purpose_cont_entry),
767 AB_TransactionLimits_GetMaxLenPurpose(joblimits));
768 gtk_entry_set_max_length(GTK_ENTRY(td->purpose_cont2_entry),
769 AB_TransactionLimits_GetMaxLenPurpose(joblimits));
770 gtk_entry_set_max_length(GTK_ENTRY(td->purpose_cont3_entry),
771 AB_TransactionLimits_GetMaxLenPurpose(joblimits));
772 gtk_entry_set_max_length(GTK_ENTRY(td->recp_name_entry),
773 AB_TransactionLimits_GetMaxLenRemoteName(joblimits));
777 gtk_widget_show(td->dialog);
780 result = gtk_dialog_run (GTK_DIALOG (td->dialog));
787 if (result != GNC_RESPONSE_NOW && result != GNC_RESPONSE_LATER)
789 gtk_widget_destroy(td->dialog);
795 td->ab_trans = gnc_ab_trans_dialog_fill_values(td);
805 gtk_widget_hide(td->dialog);
811 gnc_ab_trans_dialog_clear_templ_helper(GtkTreeModel *model,
818 g_return_val_if_fail(model && iter, TRUE);
820 gtk_tree_model_get(model, iter, TEMPLATE_POINTER, &templ, -1);
830 AB_Transaction_free(td->ab_trans);
832 gtk_widget_destroy(td->dialog);
833 if (td->template_list_store)
835 gtk_tree_model_foreach(GTK_TREE_MODEL(td->template_list_store),
836 gnc_ab_trans_dialog_clear_templ_helper, NULL);
837 g_object_unref(td->template_list_store);
839 #if HAVE_KTOBLZCHECK_H
840 AccountNumberCheck_delete(td->blzcheck);
846 gnc_ab_trans_dialog_get_templ_helper(GtkTreeModel *model,
854 g_return_val_if_fail(model && iter, TRUE);
856 gtk_tree_model_get(model, iter, TEMPLATE_POINTER, &templ, -1);
857 *list = g_list_prepend(*list, templ);
866 g_return_val_if_fail(td, NULL);
870 *changed = td->templ_changed;
875 gtk_tree_model_foreach(GTK_TREE_MODEL(td->template_list_store),
876 gnc_ab_trans_dialog_get_templ_helper, &list);
877 list = g_list_reverse(list);
884 g_return_val_if_fail(td, NULL);
888 const AB_TRANSACTION *
891 g_return_val_if_fail(td, NULL);
896 gnc_ab_trans_dialog_get_available_empty_job(AB_ACCOUNT *ab_acc, GncABTransType trans_type)
902 case SINGLE_DEBITNOTE:
903 job = AB_JobSingleDebitNote_new(ab_acc);
905 case SINGLE_INTERNAL_TRANSFER:
906 job = AB_JobInternalTransfer_new(ab_acc);
909 job = AB_JobSepaTransfer_new(ab_acc);
912 job = AB_JobSepaDebitNote_new(ab_acc);
914 case SINGLE_TRANSFER:
916 job = AB_JobSingleTransfer_new(ab_acc);
920 if (!job || AB_Job_CheckAvailability(job
921 #ifndef AQBANKING_VERSION_5_PLUS
926 if (job) AB_Job_free(job);
935 g_return_val_if_fail(td, NULL);
941 GncABTransType trans_type)
945 g_return_val_if_fail(ab_acc && ab_trans, NULL);
947 job = gnc_ab_trans_dialog_get_available_empty_job(ab_acc, trans_type);
950 #ifdef AQBANKING_VERSION_GREATER_5_2_0
951 AB_Job_SetTransaction(job, ab_trans);
955 case SINGLE_DEBITNOTE:
956 AB_JobSingleDebitNote_SetTransaction(job, ab_trans);
958 case SINGLE_INTERNAL_TRANSFER:
959 AB_JobInternalTransfer_SetTransaction(job, ab_trans);
962 AB_JobSepaTransfer_SetTransaction(job, ab_trans);
965 AB_JobSepaDebitNote_SetTransaction(job, ab_trans);
967 case SINGLE_TRANSFER:
969 AB_JobSingleTransfer_SetTransaction(job, ab_trans);
978 gnc_ab_trans_dialog_templ_list_row_activated_cb(GtkTreeView *view,
980 GtkTreeViewColumn *column,
986 const gchar *old_name, *new_name;
987 const gchar *old_account, *new_account;
988 const gchar *old_bankcode, *new_bankcode;
989 const gchar *old_purpose, *new_purpose;
990 const gchar *old_purpose_cont, *new_purpose_cont;
991 GtkWidget *amount_widget;
992 const gchar *old_amount_text;
995 g_return_if_fail(td);
998 if (!gtk_tree_model_get_iter(GTK_TREE_MODEL(td->template_list_store), &iter,
1001 LEAVE(
"Could not get iter");
1004 gtk_tree_model_get(GTK_TREE_MODEL(td->template_list_store), &iter,
1005 TEMPLATE_POINTER, &templ, -1);
1008 old_name = gtk_entry_get_text(GTK_ENTRY(td->recp_name_entry));
1009 old_account = gtk_entry_get_text(GTK_ENTRY(td->recp_account_entry));
1010 old_bankcode = gtk_entry_get_text(GTK_ENTRY(td->recp_bankcode_entry));
1011 old_purpose = gtk_entry_get_text(GTK_ENTRY(td->purpose_entry));
1012 old_purpose_cont = gtk_entry_get_text(GTK_ENTRY(td->purpose_cont_entry));
1013 amount_widget = gnc_amount_edit_gtk_entry(GNC_AMOUNT_EDIT(td->amount_edit));
1014 old_amount_text = gtk_entry_get_text(GTK_ENTRY(amount_widget));
1015 old_amount = gnc_amount_edit_get_amount(GNC_AMOUNT_EDIT(td->amount_edit));
1024 if (!new_name) new_name =
"";
1025 if (!new_account) new_account =
"";
1026 if (!new_bankcode) new_bankcode =
"";
1027 if (!new_purpose) new_purpose =
"";
1028 if (!new_purpose_cont) new_purpose_cont =
"";
1031 gtk_entry_set_text(GTK_ENTRY(td->recp_name_entry), new_name);
1032 gtk_entry_set_text(GTK_ENTRY(td->recp_account_entry), new_account);
1033 gtk_entry_set_text(GTK_ENTRY(td->recp_bankcode_entry), new_bankcode);
1034 gtk_entry_set_text(GTK_ENTRY(td->purpose_entry), new_purpose);
1035 gtk_entry_set_text(GTK_ENTRY(td->purpose_cont_entry), new_purpose_cont);
1036 gnc_amount_edit_set_amount(GNC_AMOUNT_EDIT(td->amount_edit), new_amount);
1041 gnc_ab_trans_dialog_bankcode_changed_cb(GtkEditable *editable, gpointer user_data)
1043 #if HAVE_KTOBLZCHECK_H
1045 const AccountNumberCheck_Record *record;
1046 const gchar *input = gtk_entry_get_text(GTK_ENTRY(td->recp_bankcode_entry));
1048 g_return_if_fail(td);
1056 ENTER(
"td=%p, input=%s", td, input);
1057 record = AccountNumberCheck_findBank(td->blzcheck, input);
1061 const char *bankname = AccountNumberCheck_Record_bankName(record);
1062 GError *error = NULL;
1063 const char *ktoblzcheck_encoding =
1064 #ifdef KTOBLZCHECK_VERSION_MAJOR
1068 AccountNumberCheck_stringEncoding()
1075 gchar *utf8_bankname = g_convert(bankname, strlen(bankname),
"UTF-8",
1076 ktoblzcheck_encoding, NULL, NULL,
1081 g_critical(
"Error converting bankname \"%s\" to UTF-8", bankname);
1082 g_error_free (error);
1084 utf8_bankname = g_strdup(_(
"(unknown)"));
1086 gtk_label_set_text(GTK_LABEL(td->recp_bankname_label),
1087 *utf8_bankname ? utf8_bankname : _(
"(unknown)"));
1088 DEBUG(
"Found: %s", utf8_bankname);
1089 g_free(utf8_bankname);
1093 gtk_label_set_text(GTK_LABEL(td->recp_bankname_label), _(
"(unknown)"));
1095 gnc_ab_trans_dialog_verify_values(td);
1107 find_templ_helper(GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter,
1115 g_return_val_if_fail(model && data, TRUE);
1116 gtk_tree_model_get(model, iter,
1117 TEMPLATE_NAME, &name,
1118 TEMPLATE_POINTER, &templ,
1123 g_return_val_if_fail(!data->pointer, TRUE);
1124 match = strcmp(name, data->name) == 0;
1125 if (match) data->pointer = templ;
1130 g_return_val_if_fail(!data->name, TRUE);
1131 match = templ == data->pointer;
1132 if (match) data->name = g_strdup(name);
1139 gnc_ab_trans_dialog_add_templ_cb(GtkButton *button, gpointer user_data)
1142 GtkBuilder *builder;
1149 GtkTreeSelection *selection;
1150 GtkTreeIter cur_iter;
1151 GtkTreeIter new_iter;
1153 g_return_if_fail(td);
1156 builder = gtk_builder_new();
1157 gnc_builder_add_from_file (builder,
"dialog-ab.glade",
"Template Name Dialog");
1158 dialog = GTK_WIDGET(gtk_builder_get_object (builder,
"Template Name Dialog"));
1160 entry = GTK_WIDGET(gtk_builder_get_object (builder,
"template_name"));
1163 gtk_entry_set_text(GTK_ENTRY(entry),
1164 gtk_entry_get_text(GTK_ENTRY(td->recp_name_entry)));
1168 retval = gtk_dialog_run(GTK_DIALOG(dialog));
1169 if (retval != GTK_RESPONSE_OK)
1172 name = gtk_entry_get_text(GTK_ENTRY(entry));
1177 data.pointer = NULL;
1178 gtk_tree_model_foreach(GTK_TREE_MODEL(td->template_list_store),
1179 find_templ_helper, &data);
1182 gnc_error_dialog(dialog,
"%s",
1183 _(
"A template with the given name already exists. "
1184 "Please enter another name."));
1191 gtk_entry_get_text(GTK_ENTRY(td->recp_name_entry)),
1192 gtk_entry_get_text(GTK_ENTRY(td->recp_account_entry)),
1193 gtk_entry_get_text(GTK_ENTRY(td->recp_bankcode_entry)),
1194 gnc_amount_edit_get_amount(GNC_AMOUNT_EDIT(td->amount_edit)),
1195 gtk_entry_get_text(GTK_ENTRY(td->purpose_entry)),
1196 gtk_entry_get_text (GTK_ENTRY(td->purpose_cont_entry)));
1199 selection = gtk_tree_view_get_selection(td->template_gtktreeview);
1200 if (gtk_tree_selection_get_selected(selection, NULL, &cur_iter))
1202 gtk_list_store_insert_after(td->template_list_store,
1203 &new_iter, &cur_iter);
1207 gtk_list_store_append(td->template_list_store, &new_iter);
1209 gtk_list_store_set(td->template_list_store, &new_iter,
1210 TEMPLATE_NAME, name,
1211 TEMPLATE_POINTER, templ,
1213 td->templ_changed = TRUE;
1214 DEBUG(
"Added template with name %s", name);
1219 g_object_unref(G_OBJECT(builder));
1221 gtk_widget_destroy(dialog);
1227 gnc_ab_trans_dialog_moveup_templ_cb(GtkButton *button, gpointer user_data)
1230 GtkTreeSelection *selection;
1231 GtkTreeModel *model;
1233 GtkTreePath *prev_path;
1234 GtkTreeIter prev_iter;
1236 g_return_if_fail(td);
1238 selection = gtk_tree_view_get_selection(td->template_gtktreeview);
1239 if (!gtk_tree_selection_get_selected(selection, &model, &iter))
1242 prev_path = gtk_tree_model_get_path(model, &iter);
1243 if (gtk_tree_path_prev(prev_path))
1245 if (gtk_tree_model_get_iter(model, &prev_iter, prev_path))
1247 gtk_list_store_move_before(GTK_LIST_STORE(model), &iter, &prev_iter);
1248 td->templ_changed = TRUE;
1251 gtk_tree_path_free(prev_path);
1255 gnc_ab_trans_dialog_movedown_templ_cb(GtkButton *button, gpointer user_data)
1258 GtkTreeSelection *selection;
1259 GtkTreeModel *model;
1261 GtkTreeIter next_iter;
1263 g_return_if_fail(td);
1265 selection = gtk_tree_view_get_selection(td->template_gtktreeview);
1266 if (!gtk_tree_selection_get_selected (selection, &model, &iter))
1270 if (gtk_tree_model_iter_next(model, &next_iter))
1272 gtk_list_store_move_after(GTK_LIST_STORE(model), &iter, &next_iter);
1273 td->templ_changed = TRUE;
1278 gnc_ab_trans_dialog_sort_templ_cb(GtkButton *button, gpointer user_data)
1282 g_return_if_fail(td);
1285 gtk_tree_sortable_set_sort_column_id(
1286 GTK_TREE_SORTABLE(td->template_list_store),
1287 TEMPLATE_NAME, GTK_SORT_ASCENDING);
1288 gtk_tree_sortable_set_sort_column_id(
1289 GTK_TREE_SORTABLE(td->template_list_store),
1290 GTK_TREE_SORTABLE_UNSORTED_SORT_COLUMN_ID,
1291 GTK_SORT_ASCENDING);
1292 td->templ_changed = TRUE;
1297 gnc_ab_trans_dialog_del_templ_cb(GtkButton *button, gpointer user_data)
1300 GtkTreeSelection *selection;
1301 GtkTreeModel *model;
1305 g_return_if_fail(td);
1308 selection = gtk_tree_view_get_selection(td->template_gtktreeview);
1309 if (!gtk_tree_selection_get_selected (selection, &model, &iter))
1311 LEAVE(
"None selected");
1315 gtk_tree_model_get(model, &iter, TEMPLATE_NAME, &name, -1);
1316 if (gnc_verify_dialog(
1318 _(
"Do you really want to delete the template with the name \"%s\"?"),
1321 gtk_list_store_remove(GTK_LIST_STORE(model), &iter);
1322 td->templ_changed = TRUE;
1323 DEBUG(
"Deleted template with name %s", name);
1330 gnc_ab_trans_dialog_ibanentry_filter_cb (GtkEditable *editable,
1336 GString* result = g_string_new(NULL);
1341 length = strlen(text);
1345 for (i = 0; i < length; i++)
1352 if (*position + i < 2)
1354 if (g_ascii_isalpha(c))
1355 g_string_append_c(result, g_ascii_toupper(c));
1359 if (g_ascii_isdigit(c))
1360 g_string_append_c(result, c);
1366 if (g_ascii_isdigit(c))
1368 g_string_append_c(result, c);
1373 g_signal_handlers_block_by_func (editable,
1374 (gpointer) gnc_ab_trans_dialog_ibanentry_filter_cb, data);
1375 gtk_editable_insert_text (editable, result->str, result->len, position);
1376 g_signal_handlers_unblock_by_func (editable,
1377 (gpointer) gnc_ab_trans_dialog_ibanentry_filter_cb, data);
1378 g_signal_stop_emission_by_name (editable,
"insert_text");
1379 g_string_free (result, TRUE);
1383 gnc_ab_trans_dialog_bicentry_filter_cb (GtkEditable *editable,
1389 GString* result = g_string_new(NULL);
1394 length = strlen(text);
1398 for (i = 0; i < length; i++)
1405 if (*position + i < 6)
1407 if (g_ascii_isalpha(c))
1408 g_string_append_c(result, g_ascii_toupper(c));
1412 if (g_ascii_isalnum(c))
1413 g_string_append_c(result, g_ascii_toupper(c));
1419 if (g_ascii_isdigit(c))
1421 g_string_append_c(result, c);
1426 g_signal_handlers_block_by_func (editable,
1427 (gpointer) gnc_ab_trans_dialog_bicentry_filter_cb, data);
1428 gtk_editable_insert_text (editable, result->str, result->len, position);
1429 g_signal_handlers_unblock_by_func (editable,
1430 (gpointer) gnc_ab_trans_dialog_bicentry_filter_cb, data);
1431 g_signal_stop_emission_by_name (editable,
"insert_text");
1432 g_string_free (result, TRUE);
typedefG_BEGIN_DECLS struct _GncABTransTempl GncABTransTempl
Dialog for AqBanking transaction data.
const gchar * gnc_ab_trans_templ_get_purpose(const GncABTransTempl *t)
void gnc_ab_trans_templ_free(GncABTransTempl *t)
gchar * gnc_ab_get_remote_name(const AB_TRANSACTION *ab_trans)
GncABTransDialog * gnc_ab_trans_dialog_new(GtkWidget *parent, AB_ACCOUNT *ab_acc, gint commodity_scu, GncABTransType trans_type, GList *templates)
Templates for AqBanking transactions.
gboolean gnc_ab_trans_isSEPA(GncABTransType t)
#define G_LOG_DOMAIN
Functions providing the SX List as a plugin page.
gchar * gnc_ab_get_purpose(const AB_TRANSACTION *ab_trans)
#define DEBUG(format, args...)
const gchar * gnc_ab_trans_templ_get_recp_account(const GncABTransTempl *t)
AB_JOB * gnc_ab_trans_dialog_get_job(const GncABTransDialog *td)
#define ENTER(format, args...)
GList * gnc_ab_trans_dialog_get_templ(const GncABTransDialog *td, gboolean *changed)
const gchar * gnc_ab_trans_templ_get_name(const GncABTransTempl *t)
gnc_numeric gnc_ab_trans_templ_get_amount(const GncABTransTempl *t)
const gchar * gnc_ab_trans_templ_get_recp_bankcode(const GncABTransTempl *t)
const gchar * gnc_ab_trans_templ_get_recp_name(const GncABTransTempl *t)
GncABTransTempl * gnc_ab_trans_templ_new_full(const gchar *name, const gchar *recp_name, const gchar *recp_account, const gchar *recp_bankcode, gnc_numeric amount, const gchar *purpose, const gchar *purpose_cont)
const gchar * gnc_ab_trans_templ_get_purpose_cont(const GncABTransTempl *t)
void gnc_ab_trans_dialog_free(GncABTransDialog *td)
#define LEAVE(format, args...)
AB_JOB * gnc_ab_get_trans_job(AB_ACCOUNT *ab_acc, const AB_TRANSACTION *ab_trans, GncABTransType trans_type)
const AB_TRANSACTION * gnc_ab_trans_dialog_get_ab_trans(const GncABTransDialog *td)
GtkWidget * gnc_ab_trans_dialog_get_parent(const GncABTransDialog *td)
gint gnc_ab_trans_dialog_run_until_ok(GncABTransDialog *td)
AqBanking utility functions.
const gchar * QofLogModule