From bc34c7b23b2f653a9afa2d3088215d17a83c1ab7 Mon Sep 17 00:00:00 2001 From: Christian Stimming Date: Tue, 16 Oct 2012 20:06:10 +0000 Subject: [PATCH] Add some initial implementation for international (European) SEPA online transfers. Needs testing, though - my bank doesn't offer it for me. git-svn-id: svn+ssh://svn.gnucash.org/repo/gnucash/trunk@22445 57a11ea4-9604-0410-9ed3-97b8803252fd --- src/import-export/aqbanking/dialog-ab-trans.c | 73 ++++++++++++++++++- src/import-export/aqbanking/dialog-ab-trans.h | 7 ++ src/import-export/aqbanking/gnc-ab-transfer.c | 10 +++ src/import-export/aqbanking/gnc-ab-utils.c | 4 +- .../aqbanking/gnc-plugin-aqbanking-ui.xml | 1 + .../aqbanking/gnc-plugin-aqbanking.c | 27 +++++++ 6 files changed, 117 insertions(+), 5 deletions(-) diff --git a/src/import-export/aqbanking/dialog-ab-trans.c b/src/import-export/aqbanking/dialog-ab-trans.c index 06e8de8db7..305379c77c 100644 --- a/src/import-export/aqbanking/dialog-ab-trans.c +++ b/src/import-export/aqbanking/dialog-ab-trans.c @@ -38,6 +38,8 @@ #include #include #include +#include +#include #include "dialog-ab-trans.h" #include "dialog-transfer.h" @@ -143,6 +145,18 @@ struct _GncABTransDialog #endif }; +gboolean gnc_ab_trans_isSEPA(GncABTransType t) +{ + switch (t) + { + case SEPA_TRANSFER: + case SEPA_DEBITNOTE: + return TRUE; + default: + return FALSE; + } +} + static void gnc_ab_trans_dialog_fill_templ_helper(gpointer data, gpointer user_data) { @@ -174,10 +188,20 @@ gnc_ab_trans_dialog_fill_values(GncABTransDialog *td) trans, AB_Account_GetAccountNumber(td->ab_acc)); AB_Transaction_SetLocalCountry(trans, "DE"); - AB_Transaction_SetRemoteBankCode( - trans, gtk_entry_get_text(GTK_ENTRY(td->recp_bankcode_entry))); - AB_Transaction_SetRemoteAccountNumber( - trans, gtk_entry_get_text(GTK_ENTRY(td->recp_account_entry))); + if (gnc_ab_trans_isSEPA(td->trans_type)) + { + AB_Transaction_SetRemoteBic( + trans, gtk_entry_get_text(GTK_ENTRY(td->recp_bankcode_entry))); + AB_Transaction_SetRemoteIban( + trans, gtk_entry_get_text(GTK_ENTRY(td->recp_account_entry))); + } + else + { + AB_Transaction_SetRemoteBankCode( + trans, gtk_entry_get_text(GTK_ENTRY(td->recp_bankcode_entry))); + AB_Transaction_SetRemoteAccountNumber( + trans, gtk_entry_get_text(GTK_ENTRY(td->recp_account_entry))); + } AB_Transaction_SetRemoteCountry(trans, "DE"); AB_Transaction_AddRemoteName( trans, gtk_entry_get_text(GTK_ENTRY(td->recp_name_entry)), FALSE); @@ -315,9 +339,11 @@ gnc_ab_trans_dialog_new(GtkWidget *parent, AB_ACCOUNT *ab_acc, { case SINGLE_TRANSFER: case SINGLE_INTERNAL_TRANSFER: + case SEPA_TRANSFER: /* all labels are already set */ break; case SINGLE_DEBITNOTE: + case SEPA_DEBITNOTE: gtk_label_set_text(GTK_LABEL (heading_label), /* Translators: Strings from this file are * needed only in countries that have one of @@ -352,6 +378,26 @@ gnc_ab_trans_dialog_new(GtkWidget *parent, AB_ACCOUNT *ab_acc, break; } + /* Additionally change the labels for the European (SEPA) transactions */ + switch (trans_type) + { + case SEPA_TRANSFER: + gtk_label_set_text(GTK_LABEL(recp_account_heading), + _("Recipient IBAN (International Account Number)")); + gtk_label_set_text(GTK_LABEL(recp_bankcode_heading), + _("Recipient BIC (Bank Code)")); + break; + case SEPA_DEBITNOTE: + gtk_label_set_text(GTK_LABEL(recp_account_heading), + _("Debited IBAN (International Account Number)")); + gtk_label_set_text(GTK_LABEL(recp_bankcode_heading), + _("Debited BIC (Bank Code)")); + break; + default: + // do nothing + break; + } + gtk_label_set_text(GTK_LABEL(orig_name_label), ab_ownername); gtk_label_set_text(GTK_LABEL(orig_account_label), ab_accountnumber); gtk_label_set_text(GTK_LABEL(orig_bankname_label), ab_bankname); @@ -407,6 +453,13 @@ gnc_ab_trans_dialog_check_ktoblzcheck(const GncABTransDialog *td, ENTER(" "); + if (gnc_ab_trans_isSEPA(td->trans_type)) + { + // FIXME: libktoblzcheck also has , maybe add this here? + LEAVE("No ktoblzcheck implemented for IBAN"); + return; + } + blzresult = AccountNumberCheck_check( td->blzcheck, AB_Transaction_GetRemoteBankCode(trans), @@ -718,6 +771,12 @@ gnc_ab_trans_dialog_get_available_empty_job(AB_ACCOUNT *ab_acc, GncABTransType t case SINGLE_INTERNAL_TRANSFER: job = AB_JobInternalTransfer_new(ab_acc); break; + case SEPA_TRANSFER: + job = AB_JobSepaTransfer_new(ab_acc); + break; + case SEPA_DEBITNOTE: + job = AB_JobSepaDebitNote_new(ab_acc); + break; case SINGLE_TRANSFER: default: job = AB_JobSingleTransfer_new(ab_acc); @@ -762,6 +821,12 @@ gnc_ab_get_trans_job(AB_ACCOUNT *ab_acc, const AB_TRANSACTION *ab_trans, case SINGLE_INTERNAL_TRANSFER: AB_JobInternalTransfer_SetTransaction(job, ab_trans); break; + case SEPA_TRANSFER: + AB_JobSepaTransfer_SetTransaction(job, ab_trans); + break; + case SEPA_DEBITNOTE: + AB_JobSepaDebitNote_SetTransaction(job, ab_trans); + break; case SINGLE_TRANSFER: default: AB_JobSingleTransfer_SetTransaction(job, ab_trans); diff --git a/src/import-export/aqbanking/dialog-ab-trans.h b/src/import-export/aqbanking/dialog-ab-trans.h index 8286633c4b..6e53c54830 100644 --- a/src/import-export/aqbanking/dialog-ab-trans.h +++ b/src/import-export/aqbanking/dialog-ab-trans.h @@ -53,7 +53,14 @@ enum _GncABTransType SINGLE_TRANSFER = 0, SINGLE_DEBITNOTE, SINGLE_INTERNAL_TRANSFER + , SEPA_TRANSFER + , SEPA_DEBITNOTE }; +/** + * Returns true if the given GncABTransType is an European (SEPA) transaction + * (transfer or debit note), otherwise false. + */ +gboolean gnc_ab_trans_isSEPA(GncABTransType t); /** * Create a new AqBanking transfer dialog diff --git a/src/import-export/aqbanking/gnc-ab-transfer.c b/src/import-export/aqbanking/gnc-ab-transfer.c index 98f3b56f42..09cf1be320 100644 --- a/src/import-export/aqbanking/gnc-ab-transfer.c +++ b/src/import-export/aqbanking/gnc-ab-transfer.c @@ -213,6 +213,16 @@ gnc_ab_maketrans(GtkWidget *parent, Account *gnc_acc, xfer_dialog, _("Online Banking Bank-Internal Transfer")); gnc_xfer_dialog_lock_from_account_tree(xfer_dialog); break; + case SEPA_TRANSFER: + gnc_xfer_dialog_set_title( + xfer_dialog, _("Online Banking European (SEPA) Transfer")); + gnc_xfer_dialog_lock_from_account_tree(xfer_dialog); + break; + case SEPA_DEBITNOTE: + gnc_xfer_dialog_set_title( + xfer_dialog, _("Online Banking European (SEPA) Debit Note")); + gnc_xfer_dialog_lock_to_account_tree(xfer_dialog); + break; case SINGLE_TRANSFER: default: gnc_xfer_dialog_set_title( diff --git a/src/import-export/aqbanking/gnc-ab-utils.c b/src/import-export/aqbanking/gnc-ab-utils.c index 8ef531d66b..206f29851e 100644 --- a/src/import-export/aqbanking/gnc-ab-utils.c +++ b/src/import-export/aqbanking/gnc-ab-utils.c @@ -623,10 +623,12 @@ txn_transaction_cb(const AB_TRANSACTION *element, gpointer user_data) case AB_Transaction_TypeDebitNote: trans_type = SINGLE_DEBITNOTE; break; + case AB_Transaction_TypeEuTransfer: + trans_type = SEPA_TRANSFER; + break; case AB_Transaction_TypeTransaction: /* trans_type = SINGLE_INTERNAL_TRANSFER; * break; */ - case AB_Transaction_TypeEuTransfer: case AB_Transaction_TypeTransfer: default: trans_type = SINGLE_TRANSFER; diff --git a/src/import-export/aqbanking/gnc-plugin-aqbanking-ui.xml b/src/import-export/aqbanking/gnc-plugin-aqbanking-ui.xml index 84e388b0ae..6a5fa8ab1c 100644 --- a/src/import-export/aqbanking/gnc-plugin-aqbanking-ui.xml +++ b/src/import-export/aqbanking/gnc-plugin-aqbanking-ui.xml @@ -21,6 +21,7 @@ + diff --git a/src/import-export/aqbanking/gnc-plugin-aqbanking.c b/src/import-export/aqbanking/gnc-plugin-aqbanking.c index 71d1aa69a5..549abdbf4d 100644 --- a/src/import-export/aqbanking/gnc-plugin-aqbanking.c +++ b/src/import-export/aqbanking/gnc-plugin-aqbanking.c @@ -71,6 +71,7 @@ static void gnc_plugin_ab_cmd_setup(GtkAction *action, GncMainWindowActionData * static void gnc_plugin_ab_cmd_get_balance(GtkAction *action, GncMainWindowActionData *data); static void gnc_plugin_ab_cmd_get_transactions(GtkAction *action, GncMainWindowActionData *data); static void gnc_plugin_ab_cmd_issue_transaction(GtkAction *action, GncMainWindowActionData *data); +static void gnc_plugin_ab_cmd_issue_sepatransaction(GtkAction *action, GncMainWindowActionData *data); static void gnc_plugin_ab_cmd_issue_inttransaction(GtkAction *action, GncMainWindowActionData *data); static void gnc_plugin_ab_cmd_issue_direct_debit(GtkAction *action, GncMainWindowActionData *data); static void gnc_plugin_ab_cmd_view_logwindow(GtkToggleAction *action, GncMainWindow *window); @@ -111,6 +112,11 @@ static GtkActionEntry gnc_plugin_actions [] = N_("Issue a new transaction online through Online Banking"), G_CALLBACK(gnc_plugin_ab_cmd_issue_transaction) }, + { + "ABIssueSepaTransAction", NULL, N_("_Issue SEPA Transaction..."), NULL, + N_("Issue a new international European (SEPA) transaction online through Online Banking"), + G_CALLBACK(gnc_plugin_ab_cmd_issue_sepatransaction) + }, { "ABIssueIntTransAction", NULL, N_("I_nternal Transaction..."), NULL, N_("Issue a new bank-internal transaction online through Online Banking"), @@ -534,6 +540,27 @@ gnc_plugin_ab_cmd_issue_transaction(GtkAction *action, LEAVE(" "); } +static void +gnc_plugin_ab_cmd_issue_sepatransaction(GtkAction *action, + GncMainWindowActionData *data) +{ + Account *account; + + ENTER("action %p, main window data %p", action, data); + account = main_window_to_account(data->window); + if (account == NULL) + { + g_message("No AqBanking account selected"); + LEAVE("no account"); + return; + } + + gnc_main_window = data->window; + gnc_ab_maketrans(GTK_WIDGET(data->window), account, SEPA_TRANSFER); + + LEAVE(" "); +} + static void gnc_plugin_ab_cmd_issue_inttransaction(GtkAction *action, GncMainWindowActionData *data)