34 #include <glib/gi18n.h> 36 #if (AQBANKING_VERSION_INT >= 60400) 37 #include <aqbanking/types/transaction.h> 39 #include <gnc-aqbanking-templates.h> 42 #include "dialog-transfer.h" 43 #include "dialog-utils.h" 44 #include "gnc-amount-edit.h" 50 #if (AQBANKING_VERSION_INT >= 60400) 52 static void gnc_ab_trans_dialog_fill_templ_helper(gpointer data, gpointer user_data);
53 static gboolean gnc_ab_trans_dialog_clear_templ_helper(GtkTreeModel *model,
57 static gboolean gnc_ab_trans_dialog_get_templ_helper(GtkTreeModel *model,
62 static AB_TRANSACTION *gnc_ab_trans_dialog_fill_values(GncABTransDialog *td);
63 static GNC_AB_JOB *gnc_ab_trans_dialog_get_available_empty_job(GNC_AB_ACCOUNT_SPEC *ab_acc,
64 GncABTransType trans_type);
66 static void gnc_ab_trans_dialog_check_iban(
const GncABTransDialog *td,
67 const AB_TRANSACTION *trans);
70 void gnc_ab_trans_dialog_add_templ_cb(GtkButton *button, gpointer user_data);
71 void gnc_ab_trans_dialog_moveup_templ_cb(GtkButton *button, gpointer user_data);
72 void gnc_ab_trans_dialog_movedown_templ_cb(GtkButton *button, gpointer user_data);
73 void gnc_ab_trans_dialog_sort_templ_cb(GtkButton *button, gpointer user_data);
74 void gnc_ab_trans_dialog_del_templ_cb(GtkButton *button, gpointer user_data);
75 void gnc_ab_trans_dialog_ibanentry_filter_cb (GtkEditable *editable,
80 void gnc_ab_trans_dialog_bicentry_filter_cb (GtkEditable *editable,
85 void gnc_ab_trans_dialog_templ_list_row_activated_cb(GtkTreeView *view,
87 GtkTreeViewColumn *column,
90 static void gnc_ab_trans_dialog_verify_values(GncABTransDialog *td);
105 GNC_AB_ACCOUNT_SPEC *ab_acc;
108 GncABTransType trans_type;
111 GtkWidget *recp_name_entry;
112 GtkWidget *recp_account_entry;
113 GtkWidget *recp_bankcode_entry;
116 GtkWidget *amount_edit;
119 GtkWidget *purpose_entry;
120 GtkWidget *purpose_cont_entry;
121 GtkWidget *purpose_cont2_entry;
122 GtkWidget *purpose_cont3_entry;
125 GtkWidget *recp_bankname_label;
128 GtkWidget *orig_name_entry;
131 GtkTreeView *template_gtktreeview;
132 GtkListStore *template_list_store;
135 GtkWidget *exec_button;
138 gboolean templ_changed;
141 AB_TRANSACTION *ab_trans;
144 Transaction *gnc_trans;
152 #if (AQBANKING_VERSION_INT >= 60400) 153 case SEPA_INTERNAL_TRANSFER:
162 #if (AQBANKING_VERSION_INT >= 60400) 164 gnc_ab_trans_dialog_fill_templ_helper(gpointer data, gpointer user_data)
166 GncABTransTempl *templ = data;
167 GtkListStore *store = user_data;
170 g_return_if_fail(templ && store);
171 gtk_list_store_append(store, &iter);
172 gtk_list_store_set(store, &iter,
174 TEMPLATE_POINTER, templ,
182 static AB_TRANSACTION *
183 gnc_ab_trans_dialog_fill_values(GncABTransDialog *td)
186 AB_TRANSACTION *trans = AB_Transaction_new();
189 AB_Banking_FillTransactionFromAccountSpec(trans, td->ab_acc);
193 AB_Transaction_SetRemoteBic(
194 trans, gtk_entry_get_text(GTK_ENTRY(td->recp_bankcode_entry)));
195 AB_Transaction_SetRemoteIban(
196 trans, gtk_entry_get_text(GTK_ENTRY(td->recp_account_entry)));
197 AB_Transaction_SetLocalName(
198 trans, gtk_entry_get_text(GTK_ENTRY(td->orig_name_entry)));
202 AB_Transaction_SetRemoteBankCode(
203 trans, gtk_entry_get_text(GTK_ENTRY(td->recp_bankcode_entry)));
204 AB_Transaction_SetRemoteAccountNumber(
205 trans, gtk_entry_get_text(GTK_ENTRY(td->recp_account_entry)));
207 AB_Transaction_SetRemoteCountry(trans,
"DE");
208 AB_Transaction_SetRemoteName(
209 trans, gtk_entry_get_text(GTK_ENTRY(td->recp_name_entry)));
211 AB_Transaction_AddPurposeLine(
212 trans, gtk_entry_get_text(GTK_ENTRY(td->purpose_entry)));
213 AB_Transaction_AddPurposeLine(
214 trans, gtk_entry_get_text(GTK_ENTRY(td->purpose_cont_entry)));
215 AB_Transaction_AddPurposeLine(
216 trans, gtk_entry_get_text(GTK_ENTRY(td->purpose_cont2_entry)));
217 value = AB_Value_fromDouble(gnc_amount_edit_get_damount(
218 GNC_AMOUNT_EDIT(td->amount_edit)));
220 AB_Value_SetCurrency(value,
"EUR");
221 AB_Transaction_SetValue(trans, value);
222 AB_Value_free(value);
226 switch (td->trans_type)
228 case SINGLE_DEBITNOTE:
230 AB_Transaction_SetTextKey(trans, 05);
234 AB_Transaction_SetTextKey (trans, 51);
243 gint commodity_scu, GncABTransType trans_type,
246 GncABTransDialog *td;
248 const gchar *ab_ownername;
249 const gchar *ab_accountnumber;
250 const gchar *ab_bankname;
251 const gchar *ab_bankcode;
252 G_GNUC_UNUSED GtkWidget *trans_vbox;
253 GtkWidget *heading_label;
254 GtkWidget *recp_name_heading;
255 GtkWidget *recp_account_heading;
256 GtkWidget *recp_bankcode_heading;
257 GtkWidget *amount_hbox, *amount_label;
258 GtkWidget *orig_name_heading;
259 GtkWidget *orig_account_heading;
260 GtkWidget *orig_account_label;
261 G_GNUC_UNUSED GtkWidget *orig_bankname_heading;
262 GtkWidget *orig_bankname_label;
263 GtkWidget *orig_bankcode_heading;
264 GtkWidget *orig_bankcode_label;
265 GtkCellRenderer *renderer;
266 GtkTreeViewColumn *column;
267 #if (AQBANKING_VERSION_INT >= 60400) 268 GtkExpander *template_expander;
269 GtkWidget *template_label;
270 GtkWidget *add_templ_button;
271 GtkWidget *del_templ_button;
274 g_return_val_if_fail(ab_acc, NULL);
276 ab_ownername = AB_AccountSpec_GetOwnerName(ab_acc);
279 ab_accountnumber = AB_AccountSpec_GetAccountNumber(ab_acc);
280 ab_bankcode = AB_AccountSpec_GetBankCode(ab_acc);
281 ab_bankname = _(
"(unknown)");
283 td = g_new0(GncABTransDialog, 1);
286 td->trans_type = trans_type;
288 builder = gtk_builder_new();
289 gnc_builder_add_from_file (builder,
"dialog-ab.glade",
"aqbanking_transaction_dialog");
290 td->dialog = GTK_WIDGET(gtk_builder_get_object (builder,
"aqbanking_transaction_dialog"));
293 gtk_window_set_transient_for(GTK_WINDOW(td->dialog), GTK_WINDOW(parent));
296 trans_vbox = GTK_WIDGET(gtk_builder_get_object (builder,
"trans_vbox"));
297 heading_label = GTK_WIDGET(gtk_builder_get_object (builder,
"heading_label"));
298 recp_name_heading = GTK_WIDGET(gtk_builder_get_object (builder,
"recp_name_heading"));
299 td->recp_name_entry = GTK_WIDGET(gtk_builder_get_object (builder,
"recp_name_entry"));
300 recp_account_heading = GTK_WIDGET(gtk_builder_get_object (builder,
"recp_account_heading"));
301 td->recp_account_entry = GTK_WIDGET(gtk_builder_get_object (builder,
"recp_account_entry"));
302 recp_bankcode_heading = GTK_WIDGET(gtk_builder_get_object (builder,
"recp_bankcode_heading"));
303 td->recp_bankcode_entry = GTK_WIDGET(gtk_builder_get_object (builder,
"recp_bankcode_entry"));
304 td->recp_bankname_label = GTK_WIDGET(gtk_builder_get_object (builder,
"recp_bankname_label"));
305 amount_hbox = GTK_WIDGET(gtk_builder_get_object (builder,
"amount_hbox"));
306 amount_label = GTK_WIDGET(gtk_builder_get_object (builder,
"amount_label"));
307 td->purpose_entry = GTK_WIDGET(gtk_builder_get_object (builder,
"purpose_entry"));
308 td->purpose_cont_entry = GTK_WIDGET(gtk_builder_get_object (builder,
"purpose_cont_entry"));
309 td->purpose_cont2_entry = GTK_WIDGET(gtk_builder_get_object (builder,
"purpose_cont2_entry"));
310 td->purpose_cont3_entry = GTK_WIDGET(gtk_builder_get_object (builder,
"purpose_cont3_entry"));
311 td->exec_button = GTK_WIDGET(gtk_builder_get_object(builder,
"exec_now_button"));
312 orig_name_heading = GTK_WIDGET(gtk_builder_get_object (builder,
"orig_name_heading"));
313 td->orig_name_entry = GTK_WIDGET(gtk_builder_get_object (builder,
"orig_name_label"));
314 orig_account_heading = GTK_WIDGET(gtk_builder_get_object (builder,
"orig_account_heading"));
315 orig_account_label = GTK_WIDGET(gtk_builder_get_object (builder,
"orig_account_label"));
316 orig_bankname_heading = GTK_WIDGET(gtk_builder_get_object (builder,
"orig_bankname_heading"));
317 orig_bankname_label = GTK_WIDGET(gtk_builder_get_object (builder,
"orig_bankname_label"));
318 orig_bankcode_heading = GTK_WIDGET(gtk_builder_get_object (builder,
"orig_bankcode_heading"));
319 orig_bankcode_label = GTK_WIDGET(gtk_builder_get_object (builder,
"orig_bankcode_label"));
320 td->template_gtktreeview =
321 GTK_TREE_VIEW(gtk_builder_get_object (builder,
"template_list"));
322 #if (AQBANKING_VERSION_INT >= 60400) 323 template_expander = GTK_EXPANDER(gtk_builder_get_object (builder,
"expander1"));
324 template_label = GTK_WIDGET(gtk_builder_get_object (builder,
"label1"));
325 add_templ_button= GTK_WIDGET(gtk_builder_get_object(builder,
"add_templ_button"));
326 del_templ_button= GTK_WIDGET(gtk_builder_get_object(builder,
"del_templ_button"));
330 td->amount_edit = gnc_amount_edit_new();
331 gtk_box_pack_start(GTK_BOX(amount_hbox), td->amount_edit, TRUE, TRUE, 0);
332 gnc_amount_edit_make_mnemonic_target(GNC_AMOUNT_EDIT(td->amount_edit), amount_label);
333 gnc_amount_edit_set_evaluate_on_enter(GNC_AMOUNT_EDIT(td->amount_edit),
335 gnc_amount_edit_set_fraction(GNC_AMOUNT_EDIT(td->amount_edit),
339 g_signal_connect_swapped (gnc_amount_edit_gtk_entry(GNC_AMOUNT_EDIT(td->amount_edit)),
"focus-out-event",
340 G_CALLBACK(gnc_ab_trans_dialog_verify_values), td);
346 case SINGLE_TRANSFER:
347 case SINGLE_INTERNAL_TRANSFER:
351 gtk_label_set_text(GTK_LABEL (heading_label),
362 _(
"Enter a SEPA Online Transfer"));
363 gtk_label_set_text(GTK_LABEL(recp_account_heading),
364 _(
"Recipient IBAN (International Account Number)"));
365 gtk_label_set_text(GTK_LABEL(recp_bankcode_heading),
366 _(
"Recipient BIC (Bank Code)"));
368 gtk_label_set_text(GTK_LABEL(orig_account_heading),
369 _(
"Originator IBAN (International Account Number)"));
370 gtk_label_set_text(GTK_LABEL(orig_bankcode_heading),
371 _(
"Originator BIC (Bank Code)"));
374 #if (AQBANKING_VERSION_INT >= 60400) 375 case SEPA_INTERNAL_TRANSFER:
376 gtk_label_set_text(GTK_LABEL (heading_label),
377 _(
"Enter a SEPA Internal Transfer"));
378 gtk_label_set_text(GTK_LABEL(recp_account_heading),
379 _(
"Recipient IBAN (International Account Number)"));
380 gtk_label_set_text(GTK_LABEL(recp_bankcode_heading),
381 _(
"Recipient BIC (Bank Code)"));
383 gtk_label_set_text(GTK_LABEL(orig_account_heading),
384 _(
"Originator IBAN (International Account Number)"));
385 gtk_label_set_text(GTK_LABEL(orig_bankcode_heading),
386 _(
"Originator BIC (Bank Code)"));
388 gtk_widget_set_sensitive(td->recp_name_entry, FALSE);
389 gtk_widget_set_sensitive(td->recp_account_entry, FALSE);
390 gtk_widget_set_sensitive(td->recp_bankcode_entry, FALSE);
391 gtk_widget_set_sensitive(add_templ_button, FALSE);
392 gtk_widget_set_visible(add_templ_button, FALSE);
393 gtk_widget_set_can_focus(add_templ_button, FALSE);
394 gtk_widget_set_sensitive(del_templ_button, FALSE);
395 gtk_widget_set_visible(del_templ_button, FALSE);
396 gtk_widget_set_can_focus(del_templ_button, FALSE);
397 gtk_label_set_text(GTK_LABEL(template_label),
398 _(
"Target Accounts"));
399 gtk_expander_set_expanded(template_expander, TRUE);
403 case SINGLE_DEBITNOTE:
408 gtk_label_set_text(GTK_LABEL (heading_label),
409 _(
"Enter a SEPA Online Direct Debit Note"));
411 gtk_label_set_text(GTK_LABEL(recp_name_heading),
412 _(
"Debited Account Owner"));
413 gtk_label_set_text(GTK_LABEL(recp_account_heading),
414 _(
"Debited IBAN (International Account Number)"));
415 gtk_label_set_text(GTK_LABEL(recp_bankcode_heading),
416 _(
"Debited BIC (Bank Code)"));
418 gtk_label_set_text(GTK_LABEL(orig_name_heading),
419 _(
"Credited Account Owner"));
420 gtk_label_set_text(GTK_LABEL(orig_account_heading),
421 _(
"Credited IBAN (International Account Number)"));
422 gtk_label_set_text(GTK_LABEL(orig_bankcode_heading),
423 _(
"Credited BIC (Bank Code)"));
427 g_critical(
"gnc_ab_trans_dialog_new: Oops, unknown GncABTransType %d",
436 gtk_entry_set_max_length(GTK_ENTRY(td->recp_bankcode_entry), 11);
437 gtk_entry_set_max_length(GTK_ENTRY(td->recp_account_entry), 34);
440 gtk_entry_set_text(GTK_ENTRY(td->orig_name_entry), ab_ownername);
441 gtk_label_set_text(GTK_LABEL(orig_bankname_label), ab_bankname);
444 gtk_widget_set_sensitive(GTK_WIDGET(td->orig_name_entry), TRUE);
445 ab_accountnumber = AB_AccountSpec_GetIban(ab_acc);
446 ab_bankcode = AB_AccountSpec_GetBic(ab_acc);
447 gtk_label_set_text(GTK_LABEL(orig_account_label), ab_accountnumber);
448 gtk_label_set_text (GTK_LABEL (orig_bankcode_label), ab_bankcode);
452 gtk_widget_set_sensitive(GTK_WIDGET(td->orig_name_entry), FALSE);
453 gtk_label_set_text(GTK_LABEL(orig_account_label), ab_accountnumber);
454 gtk_label_set_text (GTK_LABEL (orig_bankcode_label), ab_bankcode);
457 #if (AQBANKING_VERSION_INT >= 60400) 459 td->template_list_store = gtk_list_store_new(TEMPLATE_NUM_COLUMNS,
460 G_TYPE_STRING, G_TYPE_POINTER);
461 g_list_foreach(templates, gnc_ab_trans_dialog_fill_templ_helper, td->template_list_store);
462 gtk_tree_view_set_model(td->template_gtktreeview,
463 GTK_TREE_MODEL(td->template_list_store));
464 td->templ_changed = FALSE;
468 renderer = gtk_cell_renderer_text_new();
469 column = gtk_tree_view_column_new_with_attributes(
470 "Template Name", renderer,
"text", TEMPLATE_NAME, NULL);
471 gtk_tree_view_append_column(td->template_gtktreeview, column);
474 gtk_builder_connect_signals_full(builder, gnc_builder_connect_full_func, td);
476 g_object_unref(G_OBJECT(builder));
479 gnc_ab_trans_dialog_verify_values(td);
485 gnc_ab_trans_dialog_entry_set (GtkWidget* entry,
486 const gchar* message,
487 const gchar* icon_name)
490 "secondary-icon-name", icon_name,
491 "secondary-icon-tooltip-text", message,
496 gnc_ab_trans_dialog_check_iban(
const GncABTransDialog *td,
497 const AB_TRANSACTION *trans)
502 int rv = AB_Banking_CheckIban(AB_Transaction_GetRemoteIban(trans));
504 gchar *message = g_strdup_printf(_(
"The internal check of the destination IBAN '%s' " 505 "failed. This means " 506 "the account number might contain an error."),
507 AB_Transaction_GetRemoteIban(trans));
508 gnc_ab_trans_dialog_entry_set (td->recp_account_entry, message,
513 gnc_ab_trans_dialog_entry_set (td->recp_account_entry,
"",
515 gnc_ab_trans_dialog_entry_set (td->recp_bankcode_entry,
"",
527 gnc_ab_trans_dialog_clear_transaction(GncABTransDialog *td)
529 AB_Transaction_free(td->ab_trans);
534 gnc_ab_trans_dialog_verify_values(GncABTransDialog *td)
538 const gchar* account;
539 const gchar* bankcode;
541 gboolean values_ok = TRUE;
543 GtkWidget *amount_entry = gnc_amount_edit_gtk_entry(GNC_AMOUNT_EDIT(td->amount_edit));
547 td->ab_trans = gnc_ab_trans_dialog_fill_values(td);
552 const char* localIBAN = AB_Transaction_GetLocalIban(td->ab_trans);
553 if (!localIBAN || (strlen(localIBAN) == 0))
555 const char* localBankCode = AB_Transaction_GetLocalBankCode(td->ab_trans);
556 const char* localAccountCode = AB_Transaction_GetLocalAccountNumber(td->ab_trans);
558 gnc_error_dialog(GTK_WINDOW (td->dialog),
559 _(
"Your local bank account does not yet have the SEPA account information stored." 560 " We are sorry, but in this development version one additional step is necessary " 561 "which has not yet been implemented directly in gnucash. " 562 "Please execute the command line program \"aqhbci-tool\" for your account, as follows: " 563 "aqhbci-tool4 getaccsepa -b %s -a %s"),
564 (localBankCode ? localBankCode :
""),
565 (localAccountCode ? localAccountCode :
""));
571 if (!othername || !strlen(othername))
573 gnc_ab_trans_dialog_entry_set (td->recp_name_entry,
574 _(
"You did not enter a recipient name. A recipient name is " 575 "required for an online transfer.\n"),
583 gnc_ab_trans_dialog_entry_set (td->recp_name_entry,
"", NULL);
589 ? AB_Transaction_GetRemoteIban(td->ab_trans)
590 : AB_Transaction_GetRemoteAccountNumber(td->ab_trans);
591 if (!account || !strlen(account))
593 gnc_ab_trans_dialog_entry_set (td->recp_account_entry,
594 _(
"You did not enter a recipient account. A recipient account is " 595 "required for an online transfer.\n"),
601 gnc_ab_trans_dialog_entry_set (td->recp_account_entry,
"", NULL);
605 ? AB_Transaction_GetRemoteBic(td->ab_trans)
606 : AB_Transaction_GetRemoteBankCode(td->ab_trans);
609 gnc_ab_trans_dialog_entry_set (td->recp_bankcode_entry,
610 _(
"You did not enter a recipient bank. A recipient bank is " 611 "required for an online transfer.\n"),
617 gnc_ab_trans_dialog_entry_set (td->recp_bankcode_entry,
"", NULL);
621 gnc_ab_trans_dialog_check_iban(td, td->ab_trans);
624 if (AB_Value_GetValueAsDouble(AB_Transaction_GetValue(td->ab_trans))
627 gnc_ab_trans_dialog_entry_set (amount_entry,
628 _(
"The amount is zero or the amount field could not be " 629 "interpreted correctly. You might have mixed up decimal " 630 "point and comma, compared to your locale settings. " 631 "This does not result in a valid online transfer job."),
637 gnc_ab_trans_dialog_entry_set (amount_entry,
"", NULL);
642 if (!purpose || !strlen(purpose))
644 gnc_ab_trans_dialog_entry_set (td->purpose_entry,
645 _(
"You did not enter any transaction purpose. A purpose is " 646 "required for an online transfer.\n"),
653 gnc_ab_trans_dialog_entry_set (td->purpose_entry,
"", NULL);
657 gtk_widget_set_sensitive(td->exec_button, values_ok);
658 gnc_ab_trans_dialog_clear_transaction(td);
666 const AB_TRANSACTION_LIMITS *joblimits;
667 guint8 max_purpose_lines;
670 job = gnc_ab_trans_dialog_get_available_empty_job(td->ab_acc, td->trans_type);
673 g_warning(
"gnc_ab_trans_dialog_run_until_ok: Oops, job not available");
674 return GTK_RESPONSE_CANCEL;
678 joblimits = AB_AccountSpec_GetTransactionLimitsForCommand(td->ab_acc, AB_Transaction_GetCommand(job));
679 max_purpose_lines = joblimits ?
680 AB_TransactionLimits_GetMaxLinesPurpose(joblimits) : 2;
681 gtk_widget_set_sensitive(td->purpose_cont_entry, max_purpose_lines > 1);
682 gtk_widget_set_sensitive(td->purpose_cont2_entry, max_purpose_lines > 2);
683 gtk_widget_set_sensitive(td->purpose_cont3_entry, max_purpose_lines > 3);
686 gtk_entry_set_max_length(GTK_ENTRY(td->purpose_entry),
687 AB_TransactionLimits_GetMaxLenPurpose(joblimits));
688 gtk_entry_set_max_length(GTK_ENTRY(td->purpose_cont_entry),
689 AB_TransactionLimits_GetMaxLenPurpose(joblimits));
690 gtk_entry_set_max_length(GTK_ENTRY(td->purpose_cont2_entry),
691 AB_TransactionLimits_GetMaxLenPurpose(joblimits));
692 gtk_entry_set_max_length(GTK_ENTRY(td->purpose_cont3_entry),
693 AB_TransactionLimits_GetMaxLenPurpose(joblimits));
694 gtk_entry_set_max_length(GTK_ENTRY(td->recp_name_entry),
695 AB_TransactionLimits_GetMaxLenRemoteName(joblimits));
699 gtk_widget_show(td->dialog);
702 result = gtk_dialog_run (GTK_DIALOG (td->dialog));
709 if (result != GNC_RESPONSE_NOW && result != GNC_RESPONSE_LATER)
711 gtk_widget_destroy(td->dialog);
717 td->ab_trans = gnc_ab_trans_dialog_fill_values(td);
727 gtk_widget_hide(td->dialog);
732 #if (AQBANKING_VERSION_INT >= 60400) 734 gnc_ab_trans_dialog_clear_templ_helper(GtkTreeModel *model,
739 GncABTransTempl *templ;
741 g_return_val_if_fail(model && iter, TRUE);
743 gtk_tree_model_get(model, iter, TEMPLATE_POINTER, &templ, -1);
753 AB_Transaction_free(td->ab_trans);
755 gtk_widget_destroy(td->dialog);
757 #if (AQBANKING_VERSION_INT >= 60400) 758 if (td->template_list_store)
760 gtk_tree_model_foreach(GTK_TREE_MODEL(td->template_list_store),
761 gnc_ab_trans_dialog_clear_templ_helper, NULL);
762 g_object_unref(td->template_list_store);
768 #if (AQBANKING_VERSION_INT >= 60400) 770 gnc_ab_trans_dialog_get_templ_helper(GtkTreeModel *model,
776 GncABTransTempl *templ;
778 g_return_val_if_fail(model && iter, TRUE);
780 gtk_tree_model_get(model, iter, TEMPLATE_POINTER, &templ, -1);
781 *list = g_list_prepend(*list, templ);
786 gnc_ab_trans_dialog_get_templ(
const GncABTransDialog *td, gboolean *changed)
790 g_return_val_if_fail(td, NULL);
794 *changed = td->templ_changed;
799 gtk_tree_model_foreach(GTK_TREE_MODEL(td->template_list_store),
800 gnc_ab_trans_dialog_get_templ_helper, &list);
801 list = g_list_reverse(list);
809 g_return_val_if_fail(td, NULL);
813 const AB_TRANSACTION *
816 g_return_val_if_fail(td, NULL);
821 gnc_ab_trans_dialog_get_available_empty_job(GNC_AB_ACCOUNT_SPEC *ab_acc, GncABTransType trans_type)
824 AB_TRANSACTION_COMMAND cmd = AB_Transaction_CommandUnknown;
828 case SINGLE_DEBITNOTE:
829 cmd=AB_Transaction_CommandDebitNote;
831 case SINGLE_INTERNAL_TRANSFER:
832 cmd=AB_Transaction_CommandInternalTransfer;
835 cmd=AB_Transaction_CommandSepaTransfer;
837 #if (AQBANKING_VERSION_INT >= 60400) 838 case SEPA_INTERNAL_TRANSFER:
839 cmd=AB_Transaction_CommandSepaInternalTransfer;
843 cmd=AB_Transaction_CommandSepaDebitNote;
846 cmd=AB_Transaction_CommandTransfer;
849 if (!AB_AccountSpec_GetTransactionLimitsForCommand(ab_acc, cmd))
852 job = AB_Transaction_new();
853 AB_Transaction_SetCommand(job, cmd);
854 AB_Transaction_SetUniqueAccountId(job, AB_AccountSpec_GetUniqueId(ab_acc));
861 g_return_val_if_fail(td, NULL);
867 const AB_TRANSACTION *ab_trans,
868 GncABTransType trans_type)
872 g_return_val_if_fail(ab_acc && ab_trans, NULL);
874 job = gnc_ab_trans_dialog_get_available_empty_job(ab_acc, trans_type);
877 AB_TRANSACTION *new_job;
880 new_job=AB_Transaction_dup(ab_trans);
881 AB_Transaction_SetCommand(new_job, AB_Transaction_GetCommand(job));
882 AB_Transaction_SetUniqueAccountId(new_job,
883 AB_Transaction_GetUniqueAccountId(job));
885 AB_Transaction_free(job);
892 #if (AQBANKING_VERSION_INT >= 60400) 894 gnc_ab_trans_dialog_templ_list_row_activated_cb(GtkTreeView *view,
896 GtkTreeViewColumn *column,
899 GncABTransDialog *td = user_data;
901 GncABTransTempl *templ;
902 const gchar *new_name;
903 const gchar *new_account;
904 const gchar *new_bankcode;
905 const gchar *new_purpose;
906 const gchar *new_purpose_cont;
907 gnc_numeric new_amount;
909 g_return_if_fail(td);
912 if (!gtk_tree_model_get_iter(GTK_TREE_MODEL(td->template_list_store), &iter,
915 LEAVE(
"Could not get iter");
918 gtk_tree_model_get(GTK_TREE_MODEL(td->template_list_store), &iter,
919 TEMPLATE_POINTER, &templ, -1);
928 if (!new_name) new_name =
"";
929 if (!new_account) new_account =
"";
930 if (!new_bankcode) new_bankcode =
"";
931 if (!new_purpose) new_purpose =
"";
932 if (!new_purpose_cont) new_purpose_cont =
"";
935 gtk_entry_set_text(GTK_ENTRY(td->recp_name_entry), new_name);
936 gtk_entry_set_text(GTK_ENTRY(td->recp_account_entry), new_account);
937 gtk_entry_set_text(GTK_ENTRY(td->recp_bankcode_entry), new_bankcode);
938 gtk_entry_set_text(GTK_ENTRY(td->purpose_entry), new_purpose);
939 gtk_entry_set_text(GTK_ENTRY(td->purpose_cont_entry), new_purpose_cont);
940 gnc_amount_edit_set_amount(GNC_AMOUNT_EDIT(td->amount_edit), new_amount);
945 struct _FindTemplData
948 const GncABTransTempl *pointer;
952 find_templ_helper(GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter,
955 struct _FindTemplData *data = user_data;
957 GncABTransTempl *templ;
960 g_return_val_if_fail(model && data, TRUE);
961 gtk_tree_model_get(model, iter,
962 TEMPLATE_NAME, &name,
963 TEMPLATE_POINTER, &templ,
968 g_return_val_if_fail(!data->pointer, TRUE);
969 match = strcmp(name, data->name) == 0;
970 if (match) data->pointer = templ;
975 g_return_val_if_fail(!data->name, TRUE);
976 match = templ == data->pointer;
977 if (match) data->name = g_strdup(name);
984 gnc_ab_trans_dialog_add_templ_cb(GtkButton *button, gpointer user_data)
986 GncABTransDialog *td = user_data;
992 GncABTransTempl *templ;
993 struct _FindTemplData data;
994 GtkTreeSelection *selection;
995 GtkTreeIter cur_iter;
996 GtkTreeIter new_iter;
998 g_return_if_fail(td);
1001 builder = gtk_builder_new();
1002 gnc_builder_add_from_file (builder,
"dialog-ab.glade",
"aqbanking_template_name_dialog");
1003 dialog = GTK_WIDGET(gtk_builder_get_object (builder,
"aqbanking_template_name_dialog"));
1005 entry = GTK_WIDGET(gtk_builder_get_object (builder,
"template_name"));
1008 gtk_entry_set_text(GTK_ENTRY(entry),
1009 gtk_entry_get_text(GTK_ENTRY(td->recp_name_entry)));
1013 retval = gtk_dialog_run(GTK_DIALOG(dialog));
1014 if (retval != GTK_RESPONSE_OK)
1017 name = gtk_entry_get_text(GTK_ENTRY(entry));
1022 data.pointer = NULL;
1023 gtk_tree_model_foreach(GTK_TREE_MODEL(td->template_list_store),
1024 find_templ_helper, &data);
1027 gnc_error_dialog(GTK_WINDOW (dialog),
"%s",
1028 _(
"A template with the given name already exists. " 1029 "Please enter another name."));
1036 gtk_entry_get_text(GTK_ENTRY(td->recp_name_entry)),
1037 gtk_entry_get_text(GTK_ENTRY(td->recp_account_entry)),
1038 gtk_entry_get_text(GTK_ENTRY(td->recp_bankcode_entry)),
1039 gnc_amount_edit_get_amount(GNC_AMOUNT_EDIT(td->amount_edit)),
1040 gtk_entry_get_text(GTK_ENTRY(td->purpose_entry)),
1041 gtk_entry_get_text (GTK_ENTRY(td->purpose_cont_entry)));
1044 selection = gtk_tree_view_get_selection(td->template_gtktreeview);
1045 if (gtk_tree_selection_get_selected(selection, NULL, &cur_iter))
1047 gtk_list_store_insert_after(td->template_list_store,
1048 &new_iter, &cur_iter);
1052 gtk_list_store_append(td->template_list_store, &new_iter);
1054 gtk_list_store_set(td->template_list_store, &new_iter,
1055 TEMPLATE_NAME, name,
1056 TEMPLATE_POINTER, templ,
1058 td->templ_changed = TRUE;
1059 DEBUG(
"Added template with name %s", name);
1064 g_object_unref(G_OBJECT(builder));
1066 gtk_widget_destroy(dialog);
1073 gnc_ab_trans_dialog_moveup_templ_cb(GtkButton *button, gpointer user_data)
1075 GncABTransDialog *td = user_data;
1076 GtkTreeSelection *selection;
1077 GtkTreeModel *model;
1079 GtkTreePath *prev_path;
1080 GtkTreeIter prev_iter;
1082 g_return_if_fail(td);
1084 selection = gtk_tree_view_get_selection(td->template_gtktreeview);
1085 if (!gtk_tree_selection_get_selected(selection, &model, &iter))
1088 prev_path = gtk_tree_model_get_path(model, &iter);
1089 if (gtk_tree_path_prev(prev_path))
1091 if (gtk_tree_model_get_iter(model, &prev_iter, prev_path))
1093 gtk_list_store_move_before(GTK_LIST_STORE(model), &iter, &prev_iter);
1094 td->templ_changed = TRUE;
1097 gtk_tree_path_free(prev_path);
1101 gnc_ab_trans_dialog_movedown_templ_cb(GtkButton *button, gpointer user_data)
1103 GncABTransDialog *td = user_data;
1104 GtkTreeSelection *selection;
1105 GtkTreeModel *model;
1107 GtkTreeIter next_iter;
1109 g_return_if_fail(td);
1111 selection = gtk_tree_view_get_selection(td->template_gtktreeview);
1112 if (!gtk_tree_selection_get_selected (selection, &model, &iter))
1116 if (gtk_tree_model_iter_next(model, &next_iter))
1118 gtk_list_store_move_after(GTK_LIST_STORE(model), &iter, &next_iter);
1119 td->templ_changed = TRUE;
1124 gnc_ab_trans_dialog_sort_templ_cb(GtkButton *button, gpointer user_data)
1126 GncABTransDialog *td = user_data;
1128 g_return_if_fail(td);
1131 gtk_tree_sortable_set_sort_column_id(
1132 GTK_TREE_SORTABLE(td->template_list_store),
1133 TEMPLATE_NAME, GTK_SORT_ASCENDING);
1134 gtk_tree_sortable_set_sort_column_id(
1135 GTK_TREE_SORTABLE(td->template_list_store),
1136 GTK_TREE_SORTABLE_UNSORTED_SORT_COLUMN_ID,
1137 GTK_SORT_ASCENDING);
1138 td->templ_changed = TRUE;
1143 gnc_ab_trans_dialog_del_templ_cb(GtkButton *button, gpointer user_data)
1145 GncABTransDialog *td = user_data;
1146 GtkTreeSelection *selection;
1147 GtkTreeModel *model;
1151 g_return_if_fail(td);
1154 selection = gtk_tree_view_get_selection(td->template_gtktreeview);
1155 if (!gtk_tree_selection_get_selected (selection, &model, &iter))
1157 LEAVE(
"None selected");
1161 gtk_tree_model_get(model, &iter, TEMPLATE_NAME, &name, -1);
1162 if (gnc_verify_dialog (
1163 GTK_WINDOW (td->parent), FALSE,
1164 _(
"Do you really want to delete the template with the name \"%s\"?"),
1167 gtk_list_store_remove(GTK_LIST_STORE(model), &iter);
1168 td->templ_changed = TRUE;
1169 DEBUG(
"Deleted template with name %s", name);
1176 gnc_ab_trans_dialog_ibanentry_filter_cb (GtkEditable *editable,
1182 GString* result = g_string_new(NULL);
1184 GncABTransDialog *td = data;
1187 length = strlen(text);
1191 for (i = 0; i < length; i++)
1201 } allowed_characterclass;
1204 if (*position + i < 2)
1206 allowed_characterclass = ALPHA;
1209 else if (*position + i < 4)
1211 allowed_characterclass = NUMERIC;
1216 const gchar* acct_text = gtk_entry_get_text(GTK_ENTRY(td->recp_account_entry));
1218 if (acct_text[0] ==
'D' && acct_text[1] ==
'E')
1220 allowed_characterclass = NUMERIC;
1224 allowed_characterclass = ALNUM;
1230 switch (allowed_characterclass)
1233 if (g_ascii_isalpha(c))
1234 g_string_append_c(result, g_ascii_toupper(c));
1237 if (g_ascii_isalnum(c))
1238 g_string_append_c(result, g_ascii_toupper(c));
1241 if (g_ascii_isdigit(c))
1242 g_string_append_c(result, c);
1249 if (g_ascii_isdigit(c))
1251 g_string_append_c(result, c);
1256 g_signal_handlers_block_by_func (editable,
1257 (gpointer) gnc_ab_trans_dialog_ibanentry_filter_cb, data);
1258 gtk_editable_insert_text (editable, result->str, result->len, position);
1259 g_signal_handlers_unblock_by_func (editable,
1260 (gpointer) gnc_ab_trans_dialog_ibanentry_filter_cb, data);
1261 g_signal_stop_emission_by_name (editable,
"insert_text");
1262 g_string_free (result, TRUE);
1266 gnc_ab_trans_dialog_bicentry_filter_cb (GtkEditable *editable,
1272 GString* result = g_string_new(NULL);
1274 GncABTransDialog *td = data;
1277 length = strlen(text);
1281 for (i = 0; i < length; i++)
1288 if (*position + i < 6)
1290 if (g_ascii_isalpha(c))
1291 g_string_append_c(result, g_ascii_toupper(c));
1295 if (g_ascii_isalnum(c))
1296 g_string_append_c(result, g_ascii_toupper(c));
1302 if (g_ascii_isdigit(c))
1304 g_string_append_c(result, c);
1309 g_signal_handlers_block_by_func (editable,
1310 (gpointer) gnc_ab_trans_dialog_bicentry_filter_cb, data);
1311 gtk_editable_insert_text (editable, result->str, result->len, position);
1312 g_signal_handlers_unblock_by_func (editable,
1313 (gpointer) gnc_ab_trans_dialog_bicentry_filter_cb, data);
1314 g_signal_stop_emission_by_name (editable,
"insert_text");
1315 g_string_free (result, TRUE);
Dialog for AqBanking transaction data.
const gchar * gnc_ab_trans_templ_get_purpose(const GncABTransTempl *t)
void gnc_ab_trans_templ_free(GncABTransTempl *t)
Free the memory used by a template.
gchar * gnc_ab_get_remote_name(const AB_TRANSACTION *ab_trans)
Retrieve the merged "remote name" fields from a transaction.
gboolean gnc_ab_trans_isSEPA(GncABTransType t)
Returns true if the given GncABTransType is an European (SEPA) transaction (transfer or debit note)...
#define G_LOG_DOMAIN
Functions providing the SX List as a plugin page.
gchar * gnc_ab_get_purpose(const AB_TRANSACTION *ab_trans, gboolean is_ofx)
Retrieve the merged purpose fields from a transaction.
#define DEBUG(format, args...)
Print a debugging message.
GncABTransDialog * gnc_ab_trans_dialog_new(GtkWidget *parent, GNC_AB_ACCOUNT_SPEC *ab_acc, gint commodity_scu, GncABTransType trans_type, GList *templates)
Create a new AqBanking transfer dialog.
GNC_AB_JOB * gnc_ab_trans_dialog_get_job(const GncABTransDialog *td)
Receive the Aqbanking job filled by the dialog.
const gchar * gnc_ab_trans_templ_get_recp_account(const GncABTransTempl *t)
#define ENTER(format, args...)
Print a function entry debugging message.
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)
GNC_AB_JOB * gnc_ab_get_trans_job(GNC_AB_ACCOUNT_SPEC *ab_acc, const AB_TRANSACTION *ab_trans, GncABTransType trans_type)
Return the AqBanking job associated with the transaction.
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)
Create a template with given contents.
const gchar * gnc_ab_trans_templ_get_purpose_cont(const GncABTransTempl *t)
void gnc_ab_trans_dialog_free(GncABTransDialog *td)
Free a Aqbanking transfer dialog.
#define LEAVE(format, args...)
Print a function exit debugging message.
const AB_TRANSACTION * gnc_ab_trans_dialog_get_ab_trans(const GncABTransDialog *td)
Receive the Aqbanking Transaction filled by the dialog.
GtkWidget * gnc_ab_trans_dialog_get_parent(const GncABTransDialog *td)
Retrieve the widget used as parent.
gint gnc_ab_trans_dialog_run_until_ok(GncABTransDialog *td)
Run the Aqbanking transfer dialog until correct values where entered or the user cancelled the dialog...
AqBanking utility functions.