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
This commit is contained in:
Christian Stimming 2012-10-16 20:06:10 +00:00
parent fb6993ef1c
commit bc34c7b23b
6 changed files with 117 additions and 5 deletions

View File

@ -38,6 +38,8 @@
#include <aqbanking/jobsingletransfer.h>
#include <aqbanking/jobsingledebitnote.h>
#include <aqbanking/jobinternaltransfer.h>
#include <aqbanking/jobsepatransfer.h>
#include <aqbanking/jobsepadebitnote.h>
#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");
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 <iban.h>, 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);

View File

@ -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

View File

@ -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(

View File

@ -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;

View File

@ -21,6 +21,7 @@
<menuitem name="ABGetTrans" action="ABGetTransAction"/>
<separator name="OnlineActionsSep1"/>
<menuitem name="ABIssueTrans" action="ABIssueTransAction"/>
<menuitem name="ABIssueSepaTrans" action="ABIssueSepaTransAction"/>
<menuitem name="ABIssueIntTrans" action="ABIssueIntTransAction"/>
<menuitem name="ABIssueDirectDebit" action="ABIssueDirectDebitAction"/>
<separator name="OnlineActionsSep2"/>

View File

@ -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)