Merge branch 'aqb6' into maint

This commit is contained in:
John Ralls
2019-03-29 09:38:42 -07:00
12 changed files with 592 additions and 573 deletions

View File

@@ -357,8 +357,8 @@ endif ()
# ############################################################
if (WITH_AQBANKING)
gnc_pkg_check_modules (GWENHYWFAR REQUIRED gwenhywfar)
gnc_pkg_check_modules (AQBANKING REQUIRED aqbanking)
gnc_pkg_check_modules (GWENHYWFAR REQUIRED gwenhywfar>=4.9.99)
gnc_pkg_check_modules (AQBANKING REQUIRED aqbanking>=5.3.4)
if(WITH_GNUCASH)
gnc_pkg_check_modules (GWEN_GTK3 gwengui-gtk3)
if(GWEN_GTK3_FOUND AND GWEN_GTK3_VERSION VERSION_GREATER "4.20.0")

View File

@@ -85,8 +85,8 @@ Libraries/Deps
optional
--------
aqbanking 4.0.0 online banking; also requires
gwehywfar and ktoblzcheck
aqbanking 5.3.4 online banking; also requires
gwehywfar.
libdbi 0.8.3 SQL backend; also requires at
least one of libdbd-sqlite3,

View File

@@ -36,7 +36,13 @@
#include <windows.h>
#endif
#include "gnc-ab-utils.h" /* For version macros */
#include <aqbanking/banking.h>
#ifdef AQBANKING6
#include <aqbanking/types/account_spec.h>
#include <gwenhywfar/gui.h>
#endif
#include <glib.h>
#include <glib/gi18n.h>
#include <glib/gstdio.h>
@@ -57,12 +63,9 @@
#include "gnc-ui-util.h"
#include "gnc-session.h"
#include "import-account-matcher.h"
#if AQBANKING_VERSION_INT > 49908
/* For aqbanking > 4.99.8. See below. */
#ifndef AQBANKING6
# include <aqbanking/dlg_setup.h>
#endif
/* This static indicates the debugging module that this .o belongs to. */
static QofLogModule log_module = GNC_MOD_ASSISTANT;
@@ -91,12 +94,8 @@ void aai_match_page_prepare (GtkAssistant *assistant, gpointer user_data);
static gboolean banking_has_accounts(AB_BANKING *banking);
static void hash_from_kvp_acc_cb(Account *gnc_acc, gpointer user_data);
static ABInitialInfo *single_info = NULL;
#if AQBANKING_VERSION_INT <= 49908
static void child_exit_cb(GPid pid, gint status, gpointer data);
#endif
static gchar *ab_account_longname(const AB_ACCOUNT *ab_acc);
static AB_ACCOUNT *update_account_list_acc_cb(AB_ACCOUNT *ab_acc, gpointer user_data);
static gchar *ab_account_longname(const GNC_AB_ACCOUNT_SPEC *ab_acc);
static GNC_AB_ACCOUNT_SPEC *update_account_list_acc_cb(GNC_AB_ACCOUNT_SPEC *ab_acc, gpointer user_data);
static void update_account_list(ABInitialInfo *info);
static gboolean find_gnc_acc_cb(gpointer key, gpointer value, gpointer user_data);
static gboolean clear_line_cb(GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter, gpointer user_data);
@@ -141,7 +140,7 @@ struct _AccCbData
struct _RevLookupData
{
Account *gnc_acc;
AB_ACCOUNT *ab_acc;
GNC_AB_ACCOUNT_SPEC *ab_acc;
};
enum account_list_cols
@@ -195,9 +194,7 @@ aai_destroy_cb(GtkWidget *object, gpointer user_data)
if (info->gnc_hash)
{
#ifdef AQBANKING_VERSION_4_EXACTLY
AB_Banking_OnlineFini(info->api, 0);
#else
#ifndef AQBANKING6
AB_Banking_OnlineFini(info->api);
#endif
g_hash_table_destroy(info->gnc_hash);
@@ -241,12 +238,6 @@ aai_wizard_button_clicked_cb(GtkButton *button, gpointer user_data)
GtkWidget *page = gtk_assistant_get_nth_page (GTK_ASSISTANT(info->window), num);
AB_BANKING *banking = info->api;
#if AQBANKING_VERSION_INT <= 49908
GWEN_BUFFER *buf;
gboolean wizard_exists;
const gchar *wizard_path;
gboolean qt_probably_unavailable = FALSE;
#endif /* AQBANKING_VERSION_INT */
g_return_if_fail(banking);
ENTER("user_data: %p", user_data);
@@ -257,17 +248,17 @@ aai_wizard_button_clicked_cb(GtkButton *button, gpointer user_data)
return;
}
#if AQBANKING_VERSION_INT > 49908
/* For aqbanking5 > 4.99.8: Use AB_Banking_GetNewUserDialog(). */
{
GWEN_DIALOG *dlg =
AB_SetupDialog_new(banking);
#ifdef AQBANKING6
GWEN_DIALOG *dlg = AB_Banking_CreateSetupDialog(banking);
#else
GWEN_DIALOG *dlg = AB_SetupDialog_new(banking);
if (AB_Banking_OnlineInit(banking) != 0)
{
PERR("Got error on AB_Banking_OnlineInit!");
}
#endif
if (!dlg)
{
PERR("Could not lookup Setup Dialog of aqbanking!");
@@ -282,113 +273,13 @@ aai_wizard_button_clicked_cb(GtkButton *button, gpointer user_data)
}
GWEN_Dialog_free(dlg);
}
#ifndef AQBANKING6
if (AB_Banking_OnlineFini(banking) != 0)
{
PERR("Got error on AB_Banking_OnlineFini!");
}
}
#else
/* Previous implementation for aqbanking <= 4.99.8: Use the
* external application. */
/* This is the point where we look for and start an external
* application shipped with aqbanking that contains the setup assistant
* for AqBanking related stuff. It requires qt (but not kde). This
* application contains the very verbose step-by-step setup wizard
* for the AqBanking account, and the application is shared with
* other AqBanking-based financial managers that offer the AqBanking
* features (e.g. KMyMoney). See gnucash-devel discussion here
* https://lists.gnucash.org/pipermail/gnucash-devel/2004-December/012351.html
*/
buf = GWEN_Buffer_new(NULL, 300, 0, 0);
AB_Banking_FindWizard(banking, "", NULL, buf);
wizard_exists = *GWEN_Buffer_GetStart(buf) != 0;
wizard_path = GWEN_Buffer_GetStart(buf);
if (wizard_exists)
{
/* Really check whether the file exists */
gint fd = g_open(wizard_path, O_RDONLY, 0);
if (fd == -1)
wizard_exists = FALSE;
else
close(fd);
}
#ifdef G_OS_WIN32
{
const char *check_file = "qtdemo.exe";
gchar *found_program = g_find_program_in_path(check_file);
if (found_program)
{
g_debug("Yes, we found the Qt demo program in %s\n", found_program);
g_free(found_program);
}
else
{
g_warning("Ouch, no Qt demo program was found. Qt not installed?\n");
qt_probably_unavailable = TRUE;
}
}
#endif
if (wizard_exists)
{
/* Call the qt wizard. See the note above about why this
* approach is chosen. */
GPid pid;
GError *error = NULL;
gchar *argv[2];
gboolean spawned;
argv[0] = g_strdup (wizard_path);
argv[1] = NULL;
spawned = g_spawn_async (NULL, argv, NULL, G_SPAWN_DO_NOT_REAP_CHILD,
NULL, NULL, &pid, &error);
g_free (argv[0]);
if (error)
g_critical(
"Error on starting AqBanking setup wizard: Code %d: %s",
error->code, error->message ? error->message : "(null)");
if (!spawned)
{
g_critical("Could not start AqBanking setup wizard: %s",
error->message ? error->message : "(null)");
g_error_free (error);
}
else
{
/* Keep a reference to info that can survive info */
info->deferred_info = g_new0(DeferredInfo, 1);
info->deferred_info->initial_info = info;
info->deferred_info->wizard_path = g_strdup(wizard_path);
info->deferred_info->qt_probably_unavailable =
qt_probably_unavailable;
g_child_watch_add (pid, child_exit_cb, info->deferred_info);
}
}
else
{
g_warning("on_aqhbci_button: Oops, no aqhbci setup wizard found.");
gnc_error_dialog
(GTK_WINDOW (info->window),
_("The external program \"AqBanking Setup Wizard\" has not "
"been found. \n\n"
"The %s package should include the "
"program \"qt3-wizard\". Please check your installation to "
"ensure this program is present. On some distributions this "
"may require installing additional packages."),
QT3_WIZARD_PACKAGE);
}
GWEN_Buffer_free(buf);
#endif
/* Enable the Assistant Buttons if we accounts */
if (banking_has_accounts(info->api))
@@ -414,10 +305,8 @@ aai_match_page_prepare (GtkAssistant *assistant, gpointer user_data)
/* Do not run this twice */
if (!info->match_page_prepared)
{
#ifndef AQBANKING6
/* Load aqbanking accounts */
#ifdef AQBANKING_VERSION_4_EXACTLY
AB_Banking_OnlineInit(info->api, 0);
#else
AB_Banking_OnlineInit(info->api);
#endif
/* Determine current mapping */
@@ -456,29 +345,27 @@ aai_on_finish (GtkAssistant *assistant, gpointer user_data)
static gboolean
banking_has_accounts(AB_BANKING *banking)
{
AB_ACCOUNT_LIST2 *accl;
gboolean result;
GNC_AB_ACCOUNT_SPEC_LIST *accl = NULL;
gboolean result = FALSE;
g_return_val_if_fail(banking, FALSE);
#ifdef AQBANKING_VERSION_4_EXACTLY
AB_Banking_OnlineInit(banking, 0);
#ifdef AQBANKING6
if (AB_Banking_GetAccountSpecList (banking, &accl) >= 0 &&
accl && AV_AccountSpec_List_GetCount (accl))
result = TRUE;
if (accl)
AB_AccountSpec_List_Free (accl);
#else
AB_Banking_OnlineInit(banking);
#endif
accl = AB_Banking_GetAccounts(banking);
if (accl && (AB_Account_List2_GetSize(accl) > 0))
result = TRUE;
else
result = FALSE;
if (accl)
AB_Account_List2_free(accl);
#ifdef AQBANKING_VERSION_4_EXACTLY
AB_Banking_OnlineFini(banking, 0);
#else
AB_Banking_OnlineFini(banking);
#endif
@@ -489,109 +376,37 @@ static void
hash_from_kvp_acc_cb(Account *gnc_acc, gpointer user_data)
{
AccCbData *data = user_data;
AB_ACCOUNT *ab_acc;
GNC_AB_ACCOUNT_SPEC *ab_acc;
ab_acc = gnc_ab_get_ab_account(data->api, gnc_acc);
if (ab_acc)
g_hash_table_insert(data->hash, ab_acc, gnc_acc);
}
#if AQBANKING_VERSION_INT <= 49908
static void
child_exit_cb(GPid pid, gint status, gpointer data)
{
DeferredInfo *deferred_info = data;
ABInitialInfo *info = deferred_info->initial_info;
gint num = gtk_assistant_get_current_page (GTK_ASSISTANT(info->window));
GtkWidget *page = gtk_assistant_get_nth_page (GTK_ASSISTANT(info->window), num);
gint exit_status;
#ifdef G_OS_WIN32
exit_status = status;
#else
exit_status = WEXITSTATUS(status);
#endif
g_spawn_close_pid(pid);
if (!info)
{
g_message("Online Banking wizard exited, but the assistant has been "
"destroyed already");
goto cleanup_child_exit_cb;
}
if (exit_status == 0)
{
gtk_assistant_set_page_complete (GTK_ASSISTANT(info->window), page, TRUE);
}
else
{
if (deferred_info->qt_probably_unavailable)
{
g_warning("on_aqhbci_button: Oops, aqhbci wizard return nonzero "
"value: %d. The called program was \"%s\".\n",
exit_status, deferred_info->wizard_path);
gnc_error_dialog
(GTK_WINDOW (info->window), "%s",
_("The external program \"AqBanking Setup Wizard\" failed "
"to run successfully because the "
"additional software \"Qt\" was not found. "
"Please install the \"Qt/Windows Open Source Edition\" "
"from Trolltech by downloading it from www.trolltech.com"
"\n\n"
"If you have installed Qt already, you will have to adapt "
"the PATH variable of your system appropriately. "
"Contact the GnuCash developers if you need further "
"assistance on how to install Qt correctly."
"\n\n"
"Online Banking cannot be setup without Qt. Press \"Close\" "
"now, then \"Cancel\" to cancel the Online Banking setup."));
}
else
{
g_warning("on_aqhbci_button: Oops, aqhbci wizard return nonzero "
"value: %d. The called program was \"%s\".\n",
exit_status, deferred_info->wizard_path);
gnc_error_dialog
(GTK_WINDOW (info->window), "%s",
_("The external program \"AqBanking Setup Wizard\" failed "
"to run successfully. Online Banking can only be setup "
"if this wizard has run successfully. "
"Please try running the \"AqBanking Setup Wizard\" again."));
}
gtk_assistant_set_page_complete (GTK_ASSISTANT(info->window), page, FALSE);
}
cleanup_child_exit_cb:
g_free(deferred_info->wizard_path);
g_free(deferred_info);
if (info)
info->deferred_info = NULL;
}
#endif /* AQBANKING_VERSION_INT <= 49908 */
static gchar *
ab_account_longname(const AB_ACCOUNT *ab_acc)
ab_account_longname(const GNC_AB_ACCOUNT_SPEC *ab_acc)
{
gchar *bankname;
gchar *result;
const char *ab_bankname, *bankcode, *subAccountId;
gchar *bankname = "";
gchar *result = NULL;
const char *ab_bankname, *bankcode, *subAccountId, *account_number;
g_return_val_if_fail(ab_acc, NULL);
#ifdef AQBANKING6
bankcode = AB_AccountSpec_GetBankCode(ab_acc);
subAccountId = AB_AccountSpec_GetSubAccountId(ab_acc);
account_number = AB_AccountSpec_GetAccountNumber (ab_acc);
#else
ab_bankname = AB_Account_GetBankName(ab_acc);
bankname = ab_bankname ? gnc_utf8_strip_invalid_strdup(ab_bankname) : NULL;
bankname = ab_bankname ? gnc_utf8_strip_invalid_strdup(ab_bankname) : "";
bankcode = AB_Account_GetBankCode(ab_acc);
subAccountId = AB_Account_GetSubAccountId(ab_acc);
account_number = AB_Account_GetAccountNumber (ab_acc);
#endif
/* Translators: Strings are 1. Bank code, 2. Bank name,
* 3. Account Number, 4. Subaccount ID */
result = g_strdup_printf(_("Bank code %s (%s), Account %s (%s)"),
bankcode,
bankname ? bankname : "",
AB_Account_GetAccountNumber(ab_acc),
bankcode, bankname, account_number,
subAccountId ? subAccountId : "");
g_free(bankname);
@@ -599,8 +414,8 @@ ab_account_longname(const AB_ACCOUNT *ab_acc)
}
static AB_ACCOUNT *
update_account_list_acc_cb(AB_ACCOUNT *ab_acc, gpointer user_data)
static GNC_AB_ACCOUNT_SPEC *
update_account_list_acc_cb(GNC_AB_ACCOUNT_SPEC *ab_acc, gpointer user_data)
{
ABInitialInfo *info = user_data;
gchar *gnc_name, *ab_name;
@@ -637,7 +452,7 @@ update_account_list_acc_cb(AB_ACCOUNT *ab_acc, gpointer user_data)
static void
update_account_list(ABInitialInfo *info)
{
AB_ACCOUNT_LIST2 *acclist;
GNC_AB_ACCOUNT_SPEC_LIST *acclist = NULL;
g_return_if_fail(info && info->api && info->gnc_hash);
@@ -647,9 +462,14 @@ update_account_list(ABInitialInfo *info)
/* Refill the list */
gtk_list_store_clear(info->account_store);
#ifdef AQBANKING6
if (AB_Banking_GetAccountSpecList(info->api, &acclist) >= 0 && acclist)
AB_AccountSpec_List_ForEach(acclist, update_account_list_acc_cb, info);
#else
acclist = AB_Banking_GetAccounts(info->api);
if (acclist)
AB_Account_List2_ForEach(acclist, update_account_list_acc_cb, info);
#endif
else
g_warning("update_account_list: Oops, account list from AB_Banking "
"is NULL");
@@ -670,7 +490,7 @@ find_gnc_acc_cb(gpointer key, gpointer value, gpointer user_data)
if (value == data->gnc_acc)
{
data->ab_acc = (AB_ACCOUNT*) key;
data->ab_acc = (GNC_AB_ACCOUNT_SPEC*) key;
return TRUE;
}
return FALSE;
@@ -704,7 +524,7 @@ account_list_clicked_cb (GtkTreeView *view, GtkTreePath *path,
ABInitialInfo *info = user_data;
GtkTreeModel *model;
GtkTreeIter iter;
AB_ACCOUNT *ab_acc;
GNC_AB_ACCOUNT_SPEC *ab_acc;
gchar *longname, *gnc_name;
Account *old_value, *gnc_acc;
const gchar *currency;
@@ -727,7 +547,11 @@ account_list_clicked_cb (GtkTreeView *view, GtkTreePath *path,
old_value = g_hash_table_lookup(info->gnc_hash, ab_acc);
longname = ab_account_longname(ab_acc);
#ifdef AQBANKING6
currency = AB_AccountSpec_GetCurrency(ab_acc);
#else
currency = AB_Account_GetCurrency(ab_acc);
#endif
if (currency && *currency)
{
commodity = gnc_commodity_table_lookup(
@@ -797,7 +621,7 @@ clear_kvp_acc_cb(Account *gnc_acc, gpointer user_data)
static void
save_kvp_acc_cb(gpointer key, gpointer value, gpointer user_data)
{
AB_ACCOUNT *ab_acc = key;
GNC_AB_ACCOUNT_SPEC *ab_acc = key;
Account *gnc_acc = value;
guint32 ab_account_uid;
const gchar *ab_accountid, *gnc_accountid;
@@ -805,18 +629,30 @@ save_kvp_acc_cb(gpointer key, gpointer value, gpointer user_data)
g_return_if_fail(ab_acc && gnc_acc);
#ifdef AQBANKING6
ab_account_uid = AB_AccountSpec_GetUniqueId(ab_acc);
#else
ab_account_uid = AB_Account_GetUniqueId(ab_acc);
#endif
if (gnc_ab_get_account_uid(gnc_acc) != ab_account_uid)
gnc_ab_set_account_uid(gnc_acc, ab_account_uid);
#ifdef AQBANKING6
ab_accountid = AB_AccountSpec_GetAccountNumber(ab_acc);
#else
ab_accountid = AB_Account_GetAccountNumber(ab_acc);
#endif
gnc_accountid = gnc_ab_get_account_accountid(gnc_acc);
if (ab_accountid
&& (!gnc_accountid
|| (strcmp(ab_accountid, gnc_accountid) != 0)))
gnc_ab_set_account_accountid(gnc_acc, ab_accountid);
#ifdef AQBANKING6
ab_bankcode = AB_AccountSpec_GetBankCode(ab_acc);
#else
ab_bankcode = AB_Account_GetBankCode(ab_acc);
#endif
gnc_bankcode = gnc_ab_get_account_bankcode(gnc_acc);
if (ab_bankcode
&& (!gnc_bankcode

View File

@@ -37,6 +37,9 @@
#include <aqbanking/jobinternaltransfer.h>
#include <aqbanking/jobsepatransfer.h>
#include <aqbanking/jobsepadebitnote.h>
#ifdef AQBANKING6
# include <aqbanking/types/transaction.h>
#endif
#include <gnc-aqbanking-templates.h>
#include "dialog-ab-trans.h"
@@ -46,11 +49,6 @@
#include "gnc-amount-edit.h"
#include "gnc-ui.h"
#if AQBANKING_VERSION_INT > 50200 || ((AQBANKING_VERSION_INT == 50200) && (AQBANKING_VERSION_BUILD > 0))
/** Defined for aqbanking > 5.2.0 */
# define AQBANKING_VERSION_GREATER_5_2_0
#endif
/* This static indicates the debugging module that this .o belongs to. */
static QofLogModule log_module = G_LOG_DOMAIN;
@@ -66,7 +64,7 @@ static gboolean gnc_ab_trans_dialog_get_templ_helper(GtkTreeModel *model,
gpointer data);
static AB_TRANSACTION *gnc_ab_trans_dialog_fill_values(GncABTransDialog *td);
static AB_JOB *gnc_ab_trans_dialog_get_available_empty_job(AB_ACCOUNT *ab_acc,
static GNC_AB_JOB *gnc_ab_trans_dialog_get_available_empty_job(GNC_AB_ACCOUNT_SPEC *ab_acc,
GncABTransType trans_type);
static void gnc_ab_trans_dialog_check_iban(const GncABTransDialog *td,
@@ -107,7 +105,7 @@ struct _GncABTransDialog
/* The dialog itself */
GtkWidget *dialog;
GtkWidget *parent;
AB_ACCOUNT *ab_acc;
GNC_AB_ACCOUNT_SPEC *ab_acc;
/* Whether this is a transfer or a direct debit */
GncABTransType trans_type;
@@ -187,11 +185,11 @@ gnc_ab_trans_dialog_fill_values(GncABTransDialog *td)
AB_TRANSACTION *trans = AB_Transaction_new();
AB_VALUE *value;
#ifdef AQBNKING6
AB_Banking_FillTransactionFromAccountSpec(trans, td->ab_acc);
#else
AB_Transaction_FillLocalFromAccount(trans, td->ab_acc);
//AB_Transaction_SetLocalBankCode(trans, AB_Account_GetBankCode(td->ab_acc));
//AB_Transaction_SetLocalAccountNumber(
// trans, AB_Account_GetAccountNumber(td->ab_acc));
//AB_Transaction_SetLocalCountry(trans, "DE");
#endif
if (gnc_ab_trans_isSEPA(td->trans_type))
{
@@ -210,6 +208,17 @@ gnc_ab_trans_dialog_fill_values(GncABTransDialog *td)
trans, gtk_entry_get_text(GTK_ENTRY(td->recp_account_entry)));
}
AB_Transaction_SetRemoteCountry(trans, "DE");
#ifdef AQBANKING6
AB_Transaction_SetRemoteName(
trans, gtk_entry_get_text(GTK_ENTRY(td->recp_name_entry)));
AB_Transaction_AddPurposeLine(
trans, gtk_entry_get_text(GTK_ENTRY(td->purpose_entry)));
AB_Transaction_AddPurposeLine(
trans, gtk_entry_get_text(GTK_ENTRY(td->purpose_cont_entry)));
AB_Transaction_AddPurposeLine(
trans, gtk_entry_get_text(GTK_ENTRY(td->purpose_cont2_entry)));
#else
AB_Transaction_AddRemoteName(
trans, gtk_entry_get_text(GTK_ENTRY(td->recp_name_entry)), FALSE);
@@ -221,7 +230,7 @@ gnc_ab_trans_dialog_fill_values(GncABTransDialog *td)
trans, gtk_entry_get_text(GTK_ENTRY(td->purpose_cont2_entry)), FALSE);
AB_Transaction_AddPurpose(
trans, gtk_entry_get_text(GTK_ENTRY(td->purpose_cont3_entry)), FALSE);
#endif
value = AB_Value_fromDouble(gnc_amount_edit_get_damount(
GNC_AMOUNT_EDIT(td->amount_edit)));
/* FIXME: Replace "EUR" by account-dependent string here. */
@@ -247,7 +256,7 @@ gnc_ab_trans_dialog_fill_values(GncABTransDialog *td)
}
GncABTransDialog *
gnc_ab_trans_dialog_new(GtkWidget *parent, AB_ACCOUNT *ab_acc,
gnc_ab_trans_dialog_new(GtkWidget *parent, GNC_AB_ACCOUNT_SPEC *ab_acc,
gint commodity_scu, GncABTransType trans_type,
GList *templates)
{
@@ -275,6 +284,14 @@ gnc_ab_trans_dialog_new(GtkWidget *parent, AB_ACCOUNT *ab_acc,
g_return_val_if_fail(ab_acc, NULL);
#ifdef AQBANKING6
ab_ownername = AB_AccountSpec_GetOwnerName(ab_acc);
if (!ab_ownername)
ab_ownername = "";
ab_accountnumber = AB_AccountSpec_GetAccountNumber(ab_acc);
ab_bankcode = AB_AccountSpec_GetBankCode(ab_acc);
ab_bankname = _("(unknown)");
#else
ab_ownername = AB_Account_GetOwnerName(ab_acc);
if (!ab_ownername)
ab_ownername = "";
@@ -283,6 +300,7 @@ gnc_ab_trans_dialog_new(GtkWidget *parent, AB_ACCOUNT *ab_acc,
ab_bankname = AB_Account_GetBankName(ab_acc);
if (!ab_bankname || !*ab_bankname)
ab_bankname = _("(unknown)");
#endif
td = g_new0(GncABTransDialog, 1);
td->parent = parent;
@@ -409,8 +427,13 @@ gnc_ab_trans_dialog_new(GtkWidget *parent, AB_ACCOUNT *ab_acc,
if (gnc_ab_trans_isSEPA(trans_type))
{
gtk_widget_set_sensitive(GTK_WIDGET(td->orig_name_entry), TRUE);
#if AQBANKING6
ab_accountnumber = AB_AccountSpec_GetIBAN(ab_acc);
ab_bankcode = AB_AccountSpec_GetBIC(ab_acc);
#else
ab_accountnumber = AB_Account_GetIBAN(ab_acc);
ab_bankcode = AB_Account_GetBIC(ab_acc);
#endif
gtk_label_set_text(GTK_LABEL(orig_account_label), ab_accountnumber);
gtk_label_set_text (GTK_LABEL (orig_bankcode_label), ab_bankcode);
}
@@ -620,27 +643,6 @@ gnc_ab_trans_dialog_verify_values(GncABTransDialog *td)
g_free(purpose);
}
#if 0
// // AQBANKING_VERSION_INT >= 50307
// if (gnc_ab_trans_isSEPA(td->trans_type))
// {
// AB_USER *u = AH_Job_GetUser(j);
// uint32_t uflags;
// (AB_Transaction_CheckForSepaConformity(td->ab_trans, 0) != 0))
// need to check how to do this for aqbanking >= 5.3.7 when I have time
{
gnc_ab_trans_dialog_entry_set (td->recp_name_entry,
_("The text you entered contained at least one character that is invalid for a SEPA transaction. "
"In SEPA, unfortunately only exactly the following characters are allowed: "
"a...z, A...Z, 0...9, and the following punctuations: ' : ? , - ( + . ) / "
"\n\n"
"In particular, neither Umlauts nor an ampersand (&) is allowed, "
"neither in the recipient or sender name nor in any purpose line."),
"process-stop");
values_ok = FALSE;
}
#endif
gtk_widget_set_sensitive(td->exec_button, values_ok);
gnc_ab_trans_dialog_clear_transaction(td);
}
@@ -649,7 +651,7 @@ gint
gnc_ab_trans_dialog_run_until_ok(GncABTransDialog *td)
{
gint result;
AB_JOB *job;
GNC_AB_JOB *job;
const AB_TRANSACTION_LIMITS *joblimits;
guint8 max_purpose_lines;
@@ -662,13 +664,11 @@ gnc_ab_trans_dialog_run_until_ok(GncABTransDialog *td)
}
/* Activate as many purpose entries as available for the job */
joblimits =
#ifdef AQBANKING_VERSION_GREATER_5_2_0
AB_Job_GetFieldLimits
#ifdef AQBANKING6
joblimits = AB_AccountSpec_GetTransactionLimitsForCommand(td->ab_acc, AB_Transaction_GetCommand(job));
#else
AB_JobSingleTransfer_GetFieldLimits
joblimits = AB_Job_GetFieldLimits (job);
#endif
(job);
max_purpose_lines = joblimits ?
AB_TransactionLimits_GetMaxLinesPurpose(joblimits) : 2;
gtk_widget_set_sensitive(td->purpose_cont_entry, max_purpose_lines > 1);
@@ -804,11 +804,39 @@ gnc_ab_trans_dialog_get_ab_trans(const GncABTransDialog *td)
return td->ab_trans;
}
static AB_JOB *
gnc_ab_trans_dialog_get_available_empty_job(AB_ACCOUNT *ab_acc, GncABTransType trans_type)
static GNC_AB_JOB *
gnc_ab_trans_dialog_get_available_empty_job(GNC_AB_ACCOUNT_SPEC *ab_acc, GncABTransType trans_type)
{
AB_JOB *job;
GNC_AB_JOB *job;
#ifdef AQBANKING6
AB_TRANSACTION_COMMAND cmd = AB_Transaction_CommandUnknown;
switch (trans_type)
{
case SINGLE_DEBITNOTE:
cmd=AB_Transaction_CommandDebitNote;
break;
case SINGLE_INTERNAL_TRANSFER:
cmd=AB_Transaction_CommandInternalTransfer;
break;
case SEPA_TRANSFER:
cmd=AB_Transaction_CommandSepaTransfer;
break;
case SEPA_DEBITNOTE:
cmd=AB_Transaction_CommandSepaDebitNote;
break;
case SEPA_TRANSFER:
default:
cmd=AB_Transaction_CommandTransfer;
break;
};
if (!AB_AccountSpec_GetTransactionLimitsForCommand(ab_acc, cmd))
return NULL;
job = AB_Transaction_new();
AB_Transaction_SetCommand(job, cmd);
AB_Transaction_SetUniqueAccountId(job, AB_AccountSpec_GetUniqueId(ab_acc));
#else
switch (trans_type)
{
case SINGLE_DEBITNOTE:
@@ -828,62 +856,56 @@ gnc_ab_trans_dialog_get_available_empty_job(AB_ACCOUNT *ab_acc, GncABTransType t
job = AB_JobSepaTransfer_new(ab_acc);
break;
};
if (!job || AB_Job_CheckAvailability(job
#ifndef AQBANKING_VERSION_5_PLUS
, 0
#endif
))
if (!job || AB_Job_CheckAvailability(job))
{
if (job) AB_Job_free(job);
return NULL;
}
#endif
return job;
}
AB_JOB *
GNC_AB_JOB *
gnc_ab_trans_dialog_get_job(const GncABTransDialog *td)
{
g_return_val_if_fail(td, NULL);
return gnc_ab_get_trans_job(td->ab_acc, td->ab_trans, td->trans_type);
}
AB_JOB *
gnc_ab_get_trans_job(AB_ACCOUNT *ab_acc, const AB_TRANSACTION *ab_trans,
GNC_AB_JOB *
gnc_ab_get_trans_job(GNC_AB_ACCOUNT_SPEC *ab_acc,
const AB_TRANSACTION *ab_trans,
GncABTransType trans_type)
{
AB_JOB *job;
GNC_AB_JOB *job;
g_return_val_if_fail(ab_acc && ab_trans, NULL);
#ifdef AQBANKING6
job = gnc_ab_trans_dialog_get_available_empty_job(ab_acc, trans_type);
if (job)
{
#ifdef AQBANKING_VERSION_GREATER_5_2_0
AB_Job_SetTransaction(job, ab_trans);
AB_TRANSACTION *new_job;
/* merge transactions */
new_job=AB_Transaction_dup(ab_trans);
AB_Transaction_SetCommand(new_job, AB_Transaction_GetCommand(job));
AB_Transaction_SetUniqueAccountId(new_job,
AB_Transaction_GetUniqueAccountId(job));
AB_Transaction_free(job);
return new_job;
}
return NULL;
#else
switch (trans_type)
{
case SINGLE_DEBITNOTE:
AB_JobSingleDebitNote_SetTransaction(job, ab_trans);
break;
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);
break;
};
#endif
job = gnc_ab_trans_dialog_get_available_empty_job(ab_acc, trans_type);
if (job)
{
AB_Job_SetTransaction(job, ab_trans);
}
return job;
#endif
}
void

View File

@@ -35,6 +35,7 @@
#ifndef DIALOG_AB_TRANS_H
#define DIALOG_AB_TRANS_H
#include "gnc-ab-utils.h"
#include <gtk/gtk.h>
#include <aqbanking/banking.h>
@@ -74,7 +75,7 @@ gboolean gnc_ab_trans_isSEPA(GncABTransType t);
* gnc_ab_trans_dialog_get_templ()
* @return A new GncABTransDialog, free with gnc_ab_trans_dialog_free()
*/
GncABTransDialog *gnc_ab_trans_dialog_new(GtkWidget *parent, AB_ACCOUNT *ab_acc,
GncABTransDialog *gnc_ab_trans_dialog_new(GtkWidget *parent, GNC_AB_ACCOUNT_SPEC *ab_acc,
gint commodity_scu,
GncABTransType trans_type,
GList *templates);
@@ -125,25 +126,25 @@ GtkWidget *gnc_ab_trans_dialog_get_parent(const GncABTransDialog *td);
* @param td Transaction dialog
* @return An Aqbanking transaction
*/
const AB_TRANSACTION *gnc_ab_trans_dialog_get_ab_trans(
const GncABTransDialog *td);
const AB_TRANSACTION *gnc_ab_trans_dialog_get_ab_trans(const GncABTransDialog *td);
/**
* Receive the Aqbanking job associated with the transaction
* Receive the Aqbanking job filled by the dialog.
*
* @param td Transaction dialog
* @return An Aqbanking job
*/
AB_JOB *gnc_ab_trans_dialog_get_job(const GncABTransDialog *td);
GNC_AB_JOB *gnc_ab_trans_dialog_get_job(const GncABTransDialog *td);
/**
* FIXME
* Return the AqBanking job associated with the transaction.
*
* @param td Transaction dialog
* @return FIXME
* @return An AQBanking job
*/
AB_JOB *gnc_ab_get_trans_job(AB_ACCOUNT *ab_acc, const AB_TRANSACTION *ab_trans,
GncABTransType trans_type);
GNC_AB_JOB *gnc_ab_get_trans_job(GNC_AB_ACCOUNT_SPEC *ab_acc,
const AB_TRANSACTION *ab_trans,
GncABTransType trans_type);
G_END_DECLS

View File

@@ -29,13 +29,18 @@
#include <config.h>
#include "gnc-ab-utils.h"
#include <glib/gi18n.h>
#include <aqbanking/banking.h>
#ifdef AQBANKING6
# include <aqbanking/types/transaction.h>
#else
#include <aqbanking/jobgetbalance.h>
#endif
#include "gnc-ab-getbalance.h"
#include "gnc-ab-kvp.h"
#include "gnc-ab-utils.h"
#include "gnc-gwen-gui.h"
#include "gnc-ui.h"
@@ -47,13 +52,13 @@ gnc_ab_getbalance(GtkWidget *parent, Account *gnc_acc)
{
AB_BANKING *api;
gboolean online = FALSE;
AB_ACCOUNT *ab_acc;
AB_JOB *job = NULL;
AB_JOB_LIST2 *job_list = NULL;
GNC_AB_ACCOUNT_SPEC *ab_acc;
GNC_AB_JOB *job = NULL;
GNC_AB_JOB_LIST2 *job_list = NULL;
GncGWENGui *gui = NULL;
AB_IMEXPORTER_CONTEXT *context = NULL;
GncABImExContextImport *ieci = NULL;
AB_JOB_STATUS job_status;
GNC_AB_JOB_STATUS job_status;
g_return_if_fail(parent && gnc_acc);
@@ -64,17 +69,15 @@ gnc_ab_getbalance(GtkWidget *parent, Account *gnc_acc)
g_warning("gnc_ab_gettrans: Couldn't get AqBanking API");
return;
}
if (AB_Banking_OnlineInit(api
#ifdef AQBANKING_VERSION_4_EXACTLY
, 0
#endif
) != 0)
#ifndef AQBANKING6
if (AB_Banking_OnlineInit(api) != 0)
{
g_warning("gnc_ab_gettrans: Couldn't initialize AqBanking API");
goto cleanup;
}
online = TRUE;
#endif
/* Get the AqBanking Account */
ab_acc = gnc_ab_get_ab_account(api, gnc_acc);
if (!ab_acc)
@@ -85,21 +88,29 @@ gnc_ab_getbalance(GtkWidget *parent, Account *gnc_acc)
}
/* Get a GetBalance job and enqueue it */
#ifdef AQBANKING6
if (!AB_AccountSpec_GetTransactionLimitsForCommand(ab_acc, AB_Transaction_CommandGetBalance))
#else
job = AB_JobGetBalance_new(ab_acc);
if (!job || AB_Job_CheckAvailability(job
#ifndef AQBANKING_VERSION_5_PLUS
, 0
if (!job || AB_Job_CheckAvailability(job))
#endif
))
{
g_warning("gnc_ab_getbalance: JobGetBalance not available for this "
"account");
gnc_error_dialog (GTK_WINDOW (parent), _("Online action \"Get Balance\" not available for this account."));
goto cleanup;
}
#ifdef AQBANKING6
job = AB_Transaction_new();
AB_Transaction_SetCommand(job, AB_Transaction_CommandGetBalance);
AB_Transaction_SetUniqueAccountId(job, AB_AccountSpec_GetUniqueId(ab_acc));
job_list = AB_Transaction_List2_new();
AB_Transaction_List2_PushBack(job_list, job);
#else
job_list = AB_Job_List2_new();
AB_Job_List2_PushBack(job_list, job);
#endif
/* Get a GUI object */
gui = gnc_GWEN_Gui_get(parent);
if (!gui)
@@ -112,24 +123,34 @@ gnc_ab_getbalance(GtkWidget *parent, Account *gnc_acc)
context = AB_ImExporterContext_new();
/* Execute the job */
AB_Banking_ExecuteJobs(api, job_list, context
#ifndef AQBANKING_VERSION_5_PLUS
, 0
#ifdef AQBANKING6
AB_Banking_SendCommands(api, job_list, context);
#else
AB_Banking_ExecuteJobs(api, job_list, context);
#endif
);
/* Ignore the return value of AB_Banking_ExecuteJobs(), as the job's
* status always describes better whether the job was actually
* transferred to and accepted by the bank. See also
* http://lists.gnucash.org/pipermail/gnucash-de/2008-September/006389.html
*/
#ifdef AQBANKING6
#else
job_status = AB_Job_GetStatus(job);
if (job_status != AB_Job_StatusFinished
&& job_status != AB_Job_StatusPending)
#endif
{
g_warning("gnc_ab_getbalance: Error on executing job");
gnc_error_dialog (GTK_WINDOW (parent), _("Error on executing job.\n\nStatus: %s - %s"),
#ifdef AQBANKING6
gnc_error_dialog (GTK_WINDOW (parent),
_("Error on executing job.\n\nStatus: %s"),
AB_Transaction_Status_toString(job_status));
#else
gnc_error_dialog (GTK_WINDOW (parent),
_("Error on executing job.\n\nStatus: %s - %s"),
AB_Job_Status2Char(job_status),
AB_Job_GetResultText(job));
#endif
goto cleanup;
}
@@ -143,14 +164,17 @@ cleanup:
AB_ImExporterContext_free(context);
if (gui)
gnc_GWEN_Gui_release(gui);
#ifdef AQBANKING6
if (job_list)
AB_Transaction_List2_free(job_list);
if (job)
AB_Transaction_free(job);
#else
if (job_list)
AB_Job_List2_free(job_list);
if (job)
AB_Job_free(job);
if (online)
#ifdef AQBANKING_VERSION_4_EXACTLY
AB_Banking_OnlineFini(api, 0);
#else
AB_Banking_OnlineFini(api);
#endif
gnc_AB_BANKING_fini(api);

View File

@@ -29,15 +29,19 @@
#include <config.h>
#include "gnc-ab-utils.h"
#include <glib/gi18n.h>
#include <aqbanking/banking.h>
#include <aqbanking/jobgettransactions.h>
#ifdef AQBANKING6
# include <aqbanking/types/transaction.h>
#else
# include <aqbanking/jobgettransactions.h>
#endif
#include "Account.h"
#include "dialog-ab-daterange.h"
#include "gnc-ab-gettrans.h"
#include "gnc-ab-kvp.h"
#include "gnc-ab-utils.h"
#include "gnc-gwen-gui.h"
#include "gnc-ui.h"
@@ -98,15 +102,15 @@ gnc_ab_gettrans(GtkWidget *parent, Account *gnc_acc)
{
AB_BANKING *api;
gboolean online = FALSE;
AB_ACCOUNT *ab_acc;
GNC_AB_ACCOUNT_SPEC *ab_acc;
GWEN_TIME *from_date = NULL, *to_date = NULL;
time64 until;
AB_JOB *job = NULL;
AB_JOB_LIST2 *job_list = NULL;
GNC_AB_JOB *job = NULL;
GNC_AB_JOB_LIST2 *job_list = NULL;
GncGWENGui *gui = NULL;
AB_IMEXPORTER_CONTEXT *context = NULL;
GncABImExContextImport *ieci = NULL;
AB_JOB_STATUS job_status;
GNC_AB_JOB_STATUS job_status;
g_return_if_fail(parent && gnc_acc);
@@ -117,17 +121,14 @@ gnc_ab_gettrans(GtkWidget *parent, Account *gnc_acc)
g_warning("gnc_ab_gettrans: Couldn't get AqBanking API");
return;
}
if (AB_Banking_OnlineInit(api
#ifdef AQBANKING_VERSION_4_EXACTLY
, 0
#endif
) != 0)
#ifndef AQBANKING6
if (AB_Banking_OnlineInit(api) != 0)
{
g_warning("gnc_ab_gettrans: Couldn't initialize AqBanking API");
goto cleanup;
}
online = TRUE;
#endif
/* Get the AqBanking Account */
ab_acc = gnc_ab_get_ab_account(api, gnc_acc);
if (!ab_acc)
@@ -147,23 +148,49 @@ gnc_ab_gettrans(GtkWidget *parent, Account *gnc_acc)
until = GWEN_Time_toTime_t(to_date);
/* Get a GetTransactions job and enqueue it */
#ifdef AQBANKING6
if (!AB_AccountSpec_GetTransactionLimitsForCommand(ab_acc, AB_Transaction_CommandGetTransactions))
#else
job = AB_JobGetTransactions_new(ab_acc);
if (!job || AB_Job_CheckAvailability(job
#ifndef AQBANKING_VERSION_5_PLUS
, 0
if (!job || AB_Job_CheckAvailability(job))
#endif
))
{
g_warning("gnc_ab_gettrans: JobGetTransactions not available for this "
"account");
gnc_error_dialog (GTK_WINDOW (parent), _("Online action \"Get Transactions\" not available for this account."));
goto cleanup;
}
#ifdef AQBANKING6
job = AB_Transaction_new();
AB_Transaction_SetCommand(job, AB_Transaction_CommandGetTransactions);
AB_Transaction_SetUniqueAccountId(job, AB_AccountSpec_GetUniqueId(ab_acc));
if (from_date) /* TODO: this should be simplified */
{
GWEN_DATE *dt;
dt=GWEN_Date_fromLocalTime(GWEN_Time_toTime_t(from_date));
AB_Transaction_SetFirstDate(job, dt);
GWEN_Date_free(dt);
}
if (to_date)
{
GWEN_DATE *dt;
dt=GWEN_Date_fromLocalTime(GWEN_Time_toTime_t(to_date));
AB_Transaction_SetLastDate(job, dt);
GWEN_Date_free(dt);
}
job_list = AB_Transaction_List2_new();
AB_Transaction_List2_PushBack(job_list, job);
#else
AB_JobGetTransactions_SetFromTime(job, from_date);
AB_JobGetTransactions_SetToTime(job, to_date);
job_list = AB_Job_List2_new();
AB_Job_List2_PushBack(job_list, job);
#endif
/* Get a GUI object */
gui = gnc_GWEN_Gui_get(parent);
if (!gui)
@@ -176,24 +203,38 @@ gnc_ab_gettrans(GtkWidget *parent, Account *gnc_acc)
context = AB_ImExporterContext_new();
/* Execute the job */
AB_Banking_ExecuteJobs(api, job_list, context
#ifndef AQBANKING_VERSION_5_PLUS
, 0
#ifdef AQBANKING6
AB_Banking_SendCommands(api, job_list, context);
#else
AB_Banking_ExecuteJobs(api, job_list, context);
#endif
);
/* Ignore the return value of AB_Banking_ExecuteJobs(), as the job's
* status always describes better whether the job was actually
* transferred to and accepted by the bank. See also
* http://lists.gnucash.org/pipermail/gnucash-de/2008-September/006389.html
*/
#ifdef AQBANKING6
job_status = AB_Transaction_GetStatus(job);
if (job_status != AB_Transaction_StatusAccepted
&& job_status != AB_Transaction_StatusPending)
#else
job_status = AB_Job_GetStatus(job);
if (job_status != AB_Job_StatusFinished
&& job_status != AB_Job_StatusPending)
#endif
{
g_warning("gnc_ab_gettrans: Error on executing job");
gnc_error_dialog (GTK_WINDOW (parent), _("Error on executing job.\n\nStatus: %s - %s"),
#ifdef AQBANKING6
gnc_error_dialog (GTK_WINDOW (parent),
_("Error on executing job.\n\nStatus: %s (%d)"),
AB_Transaction_Status_toString(job_status),
job_status);
#else
gnc_error_dialog (GTK_WINDOW (parent),
_("Error on executing job.\n\nStatus: %s - %s"),
AB_Job_Status2Char(job_status),
AB_Job_GetResultText(job));
#endif
goto cleanup;
}
@@ -226,17 +267,23 @@ cleanup:
if (gui)
gnc_GWEN_Gui_release(gui);
if (job_list)
#ifdef AQBANKING6
AB_Transaction_List2_free(job_list);
#else
AB_Job_List2_free(job_list);
#endif
if (job)
#ifdef AQBANKING6
AB_Transaction_free(job);
#else
AB_Job_free(job);
#endif
if (to_date)
GWEN_Time_free(to_date);
if (from_date)
GWEN_Time_free(from_date);
#ifndef AQBANKING6
if (online)
#ifdef AQBANKING_VERSION_4_EXACTLY
AB_Banking_OnlineFini(api, 0);
#else
AB_Banking_OnlineFini(api);
#endif
gnc_AB_BANKING_fini(api);

View File

@@ -82,7 +82,7 @@ gnc_ab_maketrans(GtkWidget *parent, Account *gnc_acc,
{
AB_BANKING *api;
gboolean online = FALSE;
AB_ACCOUNT *ab_acc;
GNC_AB_ACCOUNT_SPEC *ab_acc;
GList *templates = NULL;
GncABTransDialog *td = NULL;
gboolean successful = FALSE;
@@ -97,17 +97,14 @@ gnc_ab_maketrans(GtkWidget *parent, Account *gnc_acc,
g_warning("gnc_ab_maketrans: Couldn't get AqBanking API");
return;
}
if (AB_Banking_OnlineInit(api
#ifdef AQBANKING_VERSION_4_EXACTLY
, 0
#endif
) != 0)
#ifndef AQBANKING6
if (AB_Banking_OnlineInit(api) != 0)
{
g_warning("gnc_ab_maketrans: Couldn't initialize AqBanking API");
goto cleanup;
}
online = TRUE;
#endif
/* Get the AqBanking Account */
ab_acc = gnc_ab_get_ab_account(api, gnc_acc);
if (!ab_acc)
@@ -134,15 +131,15 @@ gnc_ab_maketrans(GtkWidget *parent, Account *gnc_acc,
gint result;
gboolean changed;
const AB_TRANSACTION *ab_trans;
AB_JOB *job = NULL;
AB_JOB_LIST2 *job_list = NULL;
GNC_AB_JOB *job = NULL;
GNC_AB_JOB_LIST2 *job_list = NULL;
XferDialog *xfer_dialog = NULL;
gnc_numeric amount;
gchar *description;
gchar *memo;
Transaction *gnc_trans = NULL;
AB_IMEXPORTER_CONTEXT *context = NULL;
AB_JOB_STATUS job_status;
GNC_AB_JOB_STATUS job_status;
GncABImExContextImport *ieci = NULL;
/* Get a GUI object */
@@ -174,11 +171,11 @@ gnc_ab_maketrans(GtkWidget *parent, Account *gnc_acc,
/* Get a job and enqueue it */
ab_trans = gnc_ab_trans_dialog_get_ab_trans(td);
job = gnc_ab_trans_dialog_get_job(td);
if (!job || AB_Job_CheckAvailability(job
#ifndef AQBANKING_VERSION_5_PLUS
, 0
#ifdef AQBANKING6
if (!job || AB_AccountSpec_GetTransactionLimitsForCommand(ab_acc, AB_Transaction_GetCommand(job))==NULL)
#else
if (!job || AB_Job_CheckAvailability(job))
#endif
))
{
if (!gnc_verify_dialog (
GTK_WINDOW (parent), FALSE, "%s",
@@ -194,9 +191,13 @@ gnc_ab_maketrans(GtkWidget *parent, Account *gnc_acc,
aborted = TRUE;
goto repeat;
}
#ifdef AQBANKING6
job_list = AB_Transaction_List2_new();
AB_Transaction_List2_PushBack(job_list, job);
#else
job_list = AB_Job_List2_new();
AB_Job_List2_PushBack(job_list, job);
#endif
/* Setup a Transfer Dialog for the GnuCash transaction */
xfer_dialog = gnc_xfer_dialog(gnc_ab_trans_dialog_get_parent(td),
gnc_acc);
@@ -273,20 +274,25 @@ gnc_ab_maketrans(GtkWidget *parent, Account *gnc_acc,
}
/* Finally, execute the job */
AB_Banking_ExecuteJobs(api, job_list, context
#ifndef AQBANKING_VERSION_5_PLUS
, 0
#ifdef AQBANKING6
AB_Banking_SendCommands(api, job_list, context);
#else
AB_Banking_ExecuteJobs(api, job_list, context);
#endif
);
/* Ignore the return value of AB_Banking_ExecuteJobs(), as the job's
* status always describes better whether the job was actually
* transferred to and accepted by the bank. See also
* http://lists.gnucash.org/pipermail/gnucash-de/2008-September/006389.html
*/
#ifdef AQBANKING6
job_status = AB_Transaction_GetStatus(job);
if (job_status != AB_Transaction_StatusAccepted
&& job_status != AB_Transaction_StatusPending)
#else
job_status = AB_Job_GetStatus(job);
if (job_status != AB_Job_StatusFinished
&& job_status != AB_Job_StatusPending)
#endif
{
successful = FALSE;
if (!gnc_verify_dialog (
@@ -327,12 +333,20 @@ repeat:
AB_ImExporterContext_free(context);
if (job_list)
{
#ifdef AQBANKING6
AB_Transaction_List2_free(job_list);
#else
AB_Job_List2_free(job_list);
#endif
job_list = NULL;
}
if (job)
{
#ifdef AQBANKING6
AB_Transaction_free(job);
#else
AB_Job_free(job);
#endif
job = NULL;
}
if (gui)
@@ -347,10 +361,8 @@ repeat:
cleanup:
if (td)
gnc_ab_trans_dialog_free(td);
#ifndef AQBANKING6
if (online)
#ifdef AQBANKING_VERSION_4_EXACTLY
AB_Banking_OnlineFini(api, 0);
#else
AB_Banking_OnlineFini(api);
#endif
gnc_AB_BANKING_fini(api);

View File

@@ -29,15 +29,18 @@
#include <config.h>
#include "gnc-ab-utils.h"
#include <glib/gi18n.h>
#include <gwenhywfar/gwenhywfar.h>
#include <aqbanking/banking.h>
#ifdef AQBANKING6
# include <aqbanking/types/balance.h>
#endif
#include "window-reconcile.h"
#include "Transaction.h"
#include "dialog-ab-trans.h"
#include "gnc-ab-kvp.h"
#include "gnc-ab-utils.h"
#include "gnc-glib-utils.h"
#include "gnc-gwen-gui.h"
#include "gnc-prefs.h"
@@ -47,10 +50,7 @@
#include "import-utilities.h"
#include "qof.h"
#include "engine-helpers.h"
#ifdef AQBANKING_VERSION_5_PLUS
# include <aqbanking/abgui.h>
#endif /* AQBANKING_VERSION_5_PLUS */
#include <aqbanking/abgui.h>
/* This static indicates the debugging module that this .o belongs to. */
G_GNUC_UNUSED static QofLogModule log_module = G_LOG_DOMAIN;
@@ -76,11 +76,11 @@ struct _GncABImExContextImport
guint awaiting;
gboolean txn_found;
Account *gnc_acc;
AB_ACCOUNT *ab_acc;
GNC_AB_ACCOUNT_SPEC *ab_acc;
gboolean execute_txns;
AB_BANKING *api;
GtkWidget *parent;
AB_JOB_LIST2 *job_list;
GNC_AB_JOB_LIST2 *job_list;
GNCImportMainMatcher *generic_importer;
GData *tmp_job_list;
};
@@ -155,56 +155,31 @@ gnc_AB_BANKING_new(void)
api = AB_Banking_new("gnucash", NULL, 0);
g_return_val_if_fail(api, NULL);
#ifdef AQBANKING_VERSION_4_PLUS
/* Check for config migration */
if (AB_Banking_HasConf4(api
# ifndef AQBANKING_VERSION_5_PLUS
, 0
# endif
) != 0)
if (AB_Banking_HasConf4(api) != 0)
{
if (AB_Banking_HasConf3(api
# ifndef AQBANKING_VERSION_5_PLUS
, 0
# endif
) == 0)
if (AB_Banking_HasConf3(api) == 0)
{
g_message("gnc_AB_BANKING_new: importing aqbanking3 configuration\n");
if (AB_Banking_ImportConf3(api
# ifndef AQBANKING_VERSION_5_PLUS
, 0
# endif
) < 0)
if (AB_Banking_ImportConf3(api) < 0)
{
g_message("gnc_AB_BANKING_new: unable to import aqbanking3 configuration\n");
}
}
else if (AB_Banking_HasConf2(api
# ifndef AQBANKING_VERSION_5_PLUS
, 0
# endif
) == 0)
else if (AB_Banking_HasConf2(api) == 0)
{
g_message("gnc_AB_BANKING_new: importing aqbanking2 configuration\n");
if (AB_Banking_ImportConf2(api
# ifndef AQBANKING_VERSION_5_PLUS
, 0
# endif
) < 0)
if (AB_Banking_ImportConf2(api) < 0)
{
g_message("gnc_AB_BANKING_new: unable to import aqbanking2 configuration\n");
}
}
}
#endif /* AQBANKING_VERSION_4_PLUS */
/* Init the API */
g_return_val_if_fail(AB_Banking_Init(api) == 0, NULL);
#ifdef AQBANKING_VERSION_5_PLUS
gnc_gwengui_extended_by_ABBanking = GWEN_Gui_GetGui();
AB_Gui_Extend(gnc_gwengui_extended_by_ABBanking, api);
#endif /* AQBANKING_VERSION_5_PLUS */
/* Cache it */
gnc_AB_BANKING = api;
@@ -242,30 +217,26 @@ gnc_AB_BANKING_fini(AB_BANKING *api)
{
if (--gnc_AB_BANKING_refcount == 0)
{
#ifdef AQBANKING_VERSION_5_PLUS
if (gnc_gwengui_extended_by_ABBanking)
AB_Gui_Unextend(gnc_gwengui_extended_by_ABBanking);
gnc_gwengui_extended_by_ABBanking = NULL;
#endif /* AQBANKING_VERSION_5_PLUS */
return AB_Banking_Fini(api);
}
}
else
{
#ifdef AQBANKING_VERSION_5_PLUS
if (gnc_gwengui_extended_by_ABBanking)
AB_Gui_Unextend(gnc_gwengui_extended_by_ABBanking);
gnc_gwengui_extended_by_ABBanking = NULL;
#endif /* AQBANKING_VERSION_5_PLUS */
return AB_Banking_Fini(api);
}
return 0;
}
AB_ACCOUNT *
GNC_AB_ACCOUNT_SPEC *
gnc_ab_get_ab_account(const AB_BANKING *api, Account *gnc_acc)
{
AB_ACCOUNT *ab_account = NULL;
GNC_AB_ACCOUNT_SPEC *ab_account = NULL;
const gchar *bankcode = NULL;
const gchar *accountid = NULL;
guint32 account_uid = 0;
@@ -276,6 +247,23 @@ gnc_ab_get_ab_account(const AB_BANKING *api, Account *gnc_acc)
if (account_uid > 0)
{
#ifdef AQBANKING6
gint rv;
rv = AB_Banking_GetAccountSpecByUniqueId(api, account_uid, &ab_account);
if ( (rv<0 || !ab_account) && bankcode && *bankcode &&
accountid && *accountid)
{
/* Finding the account by code and number is suspended in AQBANKING 6 pending
* implementation of a replacement for AB_Banking_GetAccountByCodeAndNumber.
*/
g_message("gnc_ab_get_ab_account: No AB_ACCOUNT found for UID %d, "
"trying bank code\n", account_uid);
return NULL;
}
return ab_account;
#else
ab_account = AB_Banking_GetAccount(api, account_uid);
if (!ab_account && bankcode && *bankcode && accountid && *accountid)
@@ -283,7 +271,7 @@ gnc_ab_get_ab_account(const AB_BANKING *api, Account *gnc_acc)
g_message("gnc_ab_get_ab_account: No AB_ACCOUNT found for UID %d, "
"trying bank code\n", account_uid);
ab_account = AB_Banking_GetAccountByCodeAndNumber(api, bankcode,
accountid);
accountid);
}
return ab_account;
@@ -293,6 +281,7 @@ gnc_ab_get_ab_account(const AB_BANKING *api, Account *gnc_acc)
ab_account = AB_Banking_GetAccountByCodeAndNumber(api, bankcode,
accountid);
return ab_account;
#endif
}
return NULL;
@@ -343,16 +332,30 @@ join_ab_strings_cb(const gchar *str, gpointer user_data)
gchar *
gnc_ab_get_remote_name(const AB_TRANSACTION *ab_trans)
{
#ifndef AQBANKING6
const GWEN_STRINGLIST *ab_remote_name;
#endif
gchar *gnc_other_name = NULL;
g_return_val_if_fail(ab_trans, NULL);
ab_remote_name = AB_Transaction_GetRemoteName(ab_trans);
if (ab_remote_name)
#ifdef AQBANKING6
ab_transactionText = AB_Transaction_GetPurpose(ab_trans);
if (ab_transactionText)
{
gchar *tmp;
tmp = g_strdup(ab_transactionText);
g_strstrip(tmp);
gnc_utf8_strip_invalid(tmp);
gnc_description=tmp;
}
#else
GWEN_StringList_ForEach(ab_remote_name, join_ab_strings_cb,
&gnc_other_name);
#endif
if (!gnc_other_name || !*gnc_other_name)
{
g_free(gnc_other_name);
@@ -492,7 +495,7 @@ gnc_ab_trans_to_gnc(const AB_TRANSACTION *ab_trans, Account *gnc_acc)
QofBook *book;
Transaction *gnc_trans;
const gchar *fitid;
const GWEN_TIME *valuta_date;
const GNC_GWEN_DATE *valuta_date;
time64 current_time;
const char *custref;
gchar *description;
@@ -510,15 +513,23 @@ gnc_ab_trans_to_gnc(const AB_TRANSACTION *ab_trans, Account *gnc_acc)
valuta_date = AB_Transaction_GetValutaDate(ab_trans);
if (!valuta_date)
{
const GWEN_TIME *normal_date = AB_Transaction_GetDate(ab_trans);
const GNC_GWEN_DATE *normal_date = AB_Transaction_GetDate(ab_trans);
if (normal_date)
valuta_date = normal_date;
}
if (valuta_date)
xaccTransSetDatePostedSecsNormalized(gnc_trans, GWEN_Time_toTime_t(valuta_date));
{
#ifdef AQBANKING6
time64 secs = GWEN_Date_toLocalTime(valuta_date);
#else
time64 secs = GWEN_Time_toTime_t(valuta_date);
#endif
xaccTransSetDatePostedSecsNormalized(gnc_trans, secs);
}
else
{
g_warning("transaction_cb: Oops, date 'valuta_date' was NULL");
}
xaccTransSetDateEnteredSecs(gnc_trans, gnc_time (NULL));
/* Currency. We take simply the default currency of the gnucash account */
@@ -679,14 +690,21 @@ txn_transaction_cb(const AB_TRANSACTION *element, gpointer user_data)
if (data->execute_txns && data->ab_acc)
{
AB_TRANSACTION *ab_trans = AB_Transaction_dup(element);
AB_JOB *job;
GNC_AB_JOB *job;
/* NEW: The imported transaction has been imported into gnucash.
* Now also add it as a job to aqbanking */
#ifdef AQBANKING6
AB_Transaction_SetLocalBankCode(
ab_trans, AB_AccountSpec_GetBankCode(data->ab_acc));
AB_Transaction_SetLocalAccountNumber(
ab_trans, AB_AccountSpec_GetAccountNumber(data->ab_acc));
#else
AB_Transaction_SetLocalBankCode(
ab_trans, AB_Account_GetBankCode(data->ab_acc));
AB_Transaction_SetLocalAccountNumber(
ab_trans, AB_Account_GetAccountNumber(data->ab_acc));
#endif
AB_Transaction_SetLocalCountry(ab_trans, "DE");
@@ -708,11 +726,11 @@ txn_transaction_cb(const AB_TRANSACTION *element, gpointer user_data)
job = gnc_ab_get_trans_job(data->ab_acc, ab_trans, trans_type);
/* Check whether we really got a job */
if (!job || AB_Job_CheckAvailability(job
#ifndef AQBANKING_VERSION_5_PLUS
, 0
#ifdef AQBANKING6
if (!job || AB_AccountSpec_GetTransactionLimitsForCommand(data->ab_acc, AB_Transaction_GetCommand(job))==NULL)
#else
if (!job || AB_Job_CheckAvailability(job))
#endif
))
{
/* Oops, no job, probably not supported by bank */
if (gnc_verify_dialog(
@@ -733,8 +751,13 @@ txn_transaction_cb(const AB_TRANSACTION *element, gpointer user_data)
}
else
{
gnc_gen_trans_list_add_trans_with_ref_id(data->generic_importer, gnc_trans, AB_Job_GetJobId(job));
gnc_gen_trans_list_add_trans_with_ref_id(data->generic_importer,
gnc_trans,
#ifdef AQBANKING6
AB_Transaction_GetUniqueId));
#else
AB_Job_GetJobId(job));
#endif
/* AB_Job_List2_PushBack(data->job_list, job); -> delayed until trans is successfully imported */
g_datalist_set_data(&data->tmp_job_list, gnc_AB_JOB_to_readable_string(job), job);
}
@@ -755,26 +778,38 @@ static void gnc_ab_trans_processed_cb(GNCImportTransInfo *trans_info,
{
GncABImExContextImport *data = user_data;
gchar *jobname = gnc_AB_JOB_ID_to_string(gnc_import_TransInfo_get_ref_id(trans_info));
AB_JOB *job = g_datalist_get_data(&data->tmp_job_list, jobname);
GNC_AB_JOB *job = g_datalist_get_data(&data->tmp_job_list, jobname);
if (imported)
{
#ifdef AQBANKING6
AB_Transaction_List2_PushBack(data->job_list, job);
#else
AB_Job_List2_PushBack(data->job_list, job);
#endif
}
else
{
#ifdef AQBANKING6
AB_Transaction_free(job);
#else
AB_Job_free(job);
#endif
}
g_datalist_remove_data(&data->tmp_job_list, jobname);
}
gchar *
gnc_AB_JOB_to_readable_string(const AB_JOB *job)
gnc_AB_JOB_to_readable_string(const GNC_AB_JOB *job)
{
if (job)
{
#ifdef AQBANKING6
return gnc_AB_JOB_ID_to_string(AB_Transaction_GetUniqueId(job));
#else
return gnc_AB_JOB_ID_to_string(AB_Job_GetJobId(job));
#endif
}
else
{
@@ -801,8 +836,12 @@ txn_accountinfo_cb(AB_IMEXPORTER_ACCOUNTINFO *element, gpointer user_data)
/* Ignore them */
return NULL;
#ifdef AQBANKING6
if (!AB_ImExporterAccountInfo_GetFirstTransaction(element, AB_Transaction_TypeStatement, 0))
#else
if (!AB_ImExporterAccountInfo_GetFirstTransaction(element))
/* No transaction found */
#endif
/* No transaction found */
return NULL;
else
data->awaiting |= FOUND_TRANSACTIONS;
@@ -859,9 +898,16 @@ txn_accountinfo_cb(AB_IMEXPORTER_ACCOUNTINFO *element, gpointer user_data)
}
/* Iterate through all transactions */
#ifdef AQBANKING6
ab_trans_list = AB_ImExporterAccountInfo_GetTransactionList(element);
if (ab_trans_list)
AB_Transaction_List_ForEachByType(ab_trans_list,
txn_transaction_cb, data,
AB_Transaction_TypeStatement, 0);
#else
AB_ImExporterAccountInfo_TransactionsForEach(element, txn_transaction_cb,
data);
data);
#endif
return NULL;
}
@@ -886,12 +932,21 @@ bal_accountinfo_cb(AB_IMEXPORTER_ACCOUNTINFO *element, gpointer user_data)
/* Ignore them */
return NULL;
#ifdef AQBANKING6
if (!AB_ImExporterAccountInfo_GetFirstBalance(element))
#else
if (!AB_ImExporterAccountInfo_GetFirstAccountStatus(element))
#endif
/* No balance found */
return NULL;
else
data->awaiting |= FOUND_BALANCES;
#ifdef AQBANKING6
/* Lookup the most recent BALANCE available */
booked_bal=AB_Balance_List_GetLatestByType(AB_ImExporterAccountInfo_GetBalanceList(element),
AB_Balance_TypeBooked);
#else
/* Lookup the most recent ACCOUNT_STATUS available */
item = AB_ImExporterAccountInfo_GetFirstAccountStatus(element);
while (item)
@@ -906,6 +961,8 @@ bal_accountinfo_cb(AB_IMEXPORTER_ACCOUNTINFO *element, gpointer user_data)
}
booked_bal = AB_AccountStatus_GetBookedBalance(best);
#endif
if (!(data->awaiting & AWAIT_BALANCES))
{
/* Ignore zero balances if we don't await a balance */
@@ -936,10 +993,15 @@ bal_accountinfo_cb(AB_IMEXPORTER_ACCOUNTINFO *element, gpointer user_data)
/* Lookup booked balance and time */
if (booked_bal)
{
const GWEN_TIME *ti = AB_Balance_GetTime(booked_bal);
const GNC_GWEN_DATE *ti = AB_Balance_GetTime(booked_bal);
if (ti)
{
booked_tt = gnc_time64_get_day_neutral(GWEN_Time_toTime_t(ti));
#ifdef AQBANKING6
time64 secs = GWEN_Date_toLocalTime_t(dt);
#else
time64 secs = GWEN_Time_toTime_t(ti);
#endif
booked_tt = gnc_time64_get_day_neutral(secs);
}
else
{
@@ -966,7 +1028,12 @@ bal_accountinfo_cb(AB_IMEXPORTER_ACCOUNTINFO *element, gpointer user_data)
}
/* Lookup noted balance */
#ifdef AQBANKING6
noted_bal = AB_Balance_List_GetLatestByType(AB_ImExporterAccountInfo_GetBalanceList(element),
AB_Balance_TypeNoted);
#else
noted_bal = AB_AccountStatus_GetNotedBalance(best);
#endif
if (noted_bal)
{
noted_val = AB_Balance_GetValue(noted_bal);
@@ -1070,7 +1137,9 @@ gnc_ab_import_context(AB_IMEXPORTER_CONTEXT *context,
AB_BANKING *api, GtkWidget *parent)
{
GncABImExContextImport *data = g_new(GncABImExContextImport, 1);
#ifdef AQBANKING6
AB_IMEXPORTER_ACCOUNTINFO_LIST *ab_ail;
#endif
g_return_val_if_fail(context, NULL);
/* Do not await and ignore at the same time */
g_return_val_if_fail(!(awaiting & AWAIT_BALANCES)
@@ -1089,13 +1158,31 @@ gnc_ab_import_context(AB_IMEXPORTER_CONTEXT *context,
data->execute_txns = execute_txns;
data->api = api;
data->parent = parent;
#ifdef AQBANKING6
data->job_list = AB_Transaction_List2_new();
#else
data->job_list = AB_Job_List2_new();
#endif
data->tmp_job_list = NULL;
data->generic_importer = NULL;
g_datalist_init(&data->tmp_job_list);
/* Import transactions */
#ifdef AQBANKING6
ab_ail = AB_ImExporterContext_GetAccountInfoList(context);
if (ab_ail && AB_ImExporterAccountInfo_List_GetCount(ab_ail))
{
if (!(awaiting & IGNORE_TRANSACTIONS))
AB_ImExporterAccountInfo_List_ForEach(ab_ail, txn_accountinfo_cb,
data);
/* Check balances */
if (!(awaiting & IGNORE_BALANCES))
AB_ImExporterAccountInfo_List_ForEach(ab_ail, bal_accountinfo_cb,
data);
}
#else
if (!(awaiting & IGNORE_TRANSACTIONS))
AB_ImExporterContext_AccountInfoForEach(context, txn_accountinfo_cb,
data);
@@ -1104,6 +1191,7 @@ gnc_ab_import_context(AB_IMEXPORTER_CONTEXT *context,
if (!(awaiting & IGNORE_BALANCES))
AB_ImExporterContext_AccountInfoForEach(context, bal_accountinfo_cb,
data);
#endif
/* Check bank-messages */
{
@@ -1118,7 +1206,11 @@ gnc_ab_import_context(AB_IMEXPORTER_CONTEXT *context,
subject,
text);
#ifdef AQBANKING6
bankmsg = AB_Message_List_Next(bankmsg);
#else
bankmsg = AB_ImExporterContext_GetNextMessage(context); // The interator is incremented within aqbanking
#endif
}
}
@@ -1133,7 +1225,7 @@ gnc_ab_ieci_get_found(GncABImExContextImport *ieci)
return ieci->awaiting;
}
AB_JOB_LIST2 *
GNC_AB_JOB_LIST2 *
gnc_ab_ieci_get_job_list(GncABImExContextImport *ieci)
{
g_return_val_if_fail(ieci, NULL);
@@ -1157,18 +1249,7 @@ gnc_ab_get_permanent_certs(void)
AB_BANKING *banking = gnc_AB_BANKING_new();
g_return_val_if_fail(banking, NULL);
#ifdef AQBANKING_VERSION_4_PLUS
rv = AB_Banking_LoadSharedConfig(banking, "certs", &perm_certs
# ifndef AQBANKING_VERSION_5_PLUS
, 0
# endif
);
#else
/* FIXME: Add code for older AqBanking versions */
/* See QBankmanager 0.9.50 in src/kbanking/libs/kbanking.cpp lines 323ff
for a proper example of how to do this */
rv = 0;
#endif
rv = AB_Banking_LoadSharedConfig(banking, "certs", &perm_certs);
gnc_AB_BANKING_fini(banking);
g_return_val_if_fail(rv >= 0, NULL);
return perm_certs;

View File

@@ -52,22 +52,26 @@ G_BEGIN_DECLS
* in the interval [0..99]. */
#define GWENHYWFAR_VERSION_INT (10000 * GWENHYWFAR_VERSION_MAJOR + 100 * GWENHYWFAR_VERSION_MINOR + GWENHYWFAR_VERSION_PATCHLEVEL)
#if AQBANKING_VERSION_INT >= 39900
/** Defined if libaqbanking4 as opposed to libaqbanking3 or earlier is
* being used */
# define AQBANKING_VERSION_4_PLUS
#if AQBANKING_VERSION_INT >= 59900
# define AQBANKING6 1
# define GNC_AB_ACCOUNT_SPEC AB_ACCOUNT_SPEC
# define GNC_AB_ACCOUNT_SPEC_LIST AB_ACCOUNT_SPEC_LIST
# define GNC_AB_JOB AB_TRANSACTION
# define GNC_AB_JOB_LIST2 AB_TRANSACTION_LIST2
# define GNC_AB_JOB_LIST2_ITERATOR AB_TRANSACTION_LIST2_ITERATOR
# define GNC_AB_JOB_STATUS AB_TRANSACTION_STATUS
# define GNC_GWEN_DATE GWEN_DATE
#else
# define GNC_AB_ACCOUNT_SPEC AB_ACCOUNT
# define GNC_AB_ACCOUNT_SPEC_LIST AB_ACCOUNT_LIST2
# define GNC_AB_JOB AB_JOB
# define GNC_AB_JOB_LIST2 AB_JOB_LIST2
# define GNC_AB_JOB_LIST2_ITERATOR AB_JOB_LIST2_ITERATOR
# define GNC_AB_JOB_STATUS AB_JOB_STATUS
# define GNC_GWEN_DATE GWEN_TIME
#endif
#if AQBANKING_VERSION_INT >= 49900
/** Defined if libaqbanking5 as opposed to libaqbanking4 or earlier is
* being used */
# define AQBANKING_VERSION_5_PLUS
#endif
#if defined(AQBANKING_VERSION_4_PLUS) && !defined(AQBANKING_VERSION_5_PLUS)
/** Defined if libaqbanking4 is used and neither a newer nor an older
* version of libaqbanking. */
# define AQBANKING_VERSION_4_EXACTLY
#if GWENHYWFAR_VERSION_INT >= 49900
# define GWENHYWFAR5
#endif
#define GNC_PREFS_GROUP_AQBANKING "dialogs.import.hbci"
@@ -130,11 +134,11 @@ gint gnc_AB_BANKING_fini(AB_BANKING *api);
* Of course this only works after the GnuCash account has been set up for
* AqBanking use, i.e. the account's hbci data have been set up and populated.
*
* @param api The AB_BANKING to get the AB_ACCOUNT from
* @param gnc_acc The GnuCash account to query for AB_ACCOUNT reference data
* @return The AB_ACCOUNT found or NULL otherwise
* @param api The AB_BANKING to get the GNC_AB_ACCOUNT_SPEC from
* @param gnc_acc The GnuCash account to query for GNC_AB_ACCOUNT_SPEC reference data
* @return The GNC_AB_ACCOUNT_SPEC found or NULL otherwise
*/
AB_ACCOUNT *gnc_ab_get_ab_account(const AB_BANKING *api, Account *gnc_acc);
GNC_AB_ACCOUNT_SPEC *gnc_ab_get_ab_account(const AB_BANKING *api, Account *gnc_acc);
/**
* Print the value of @a value with two decimal places and @a value's
@@ -148,10 +152,10 @@ gchar *gnc_AB_VALUE_to_readable_string(const AB_VALUE *value);
/**
* Return the job as string.
*
* @param value AB_JOB or NULL
* @param value GNC_AB_JOB or NULL
* @return A newly allocated string
*/
gchar *gnc_AB_JOB_to_readable_string(const AB_JOB *job);
gchar *gnc_AB_JOB_to_readable_string(const GNC_AB_JOB *job);
/**
* Return the job_id as string.
@@ -226,7 +230,7 @@ Transaction *gnc_ab_trans_to_gnc(const AB_TRANSACTION *ab_trans, Account *gnc_ac
* create an aqbanking job for each of the transactions found
*
* @param api If @a execute_txns is TRUE, the AB_BANKING to get
* AB_ACCOUNTs from
* GNC_AB_ACCOUNT_SPECs from
*
* @param parent Widget to set new dialogs transient for, may be NULL
*
@@ -254,7 +258,7 @@ guint gnc_ab_ieci_get_found(GncABImExContextImport *ieci);
* @param ieci The return value of gnc_ab_import_context()
* @return The list of jobs, freeable with AB_Job_List2_FreeAll()
*/
AB_JOB_LIST2 *gnc_ab_ieci_get_job_list(GncABImExContextImport *ieci);
GNC_AB_JOB_LIST2 *gnc_ab_ieci_get_job_list(GncABImExContextImport *ieci);
/**
* Run the generic transaction matcher dialog.

View File

@@ -44,15 +44,9 @@
#include "gnc-ab-utils.h"
#ifdef AQBANKING_VERSION_5_PLUS
# include <gwenhywfar/syncio_file.h>
# include <gwenhywfar/syncio_buffered.h>
typedef GWEN_SYNCIO GWEN_IO_LAYER;
#else
# include <gwenhywfar/io_file.h>
# include <gwenhywfar/io_buffered.h>
# include <gwenhywfar/iomanager.h>
#endif
#include "dialog-ab-trans.h"
#include "dialog-utils.h"
@@ -85,10 +79,10 @@ gnc_file_aqbanking_import(GtkWindow *parent,
AB_IMEXPORTER_CONTEXT *context = NULL;
GWEN_IO_LAYER *io = NULL;
GncABImExContextImport *ieci = NULL;
AB_JOB_LIST2 *job_list = NULL;
AB_JOB_LIST2_ITERATOR *jit;
AB_JOB *job;
AB_JOB_STATUS job_status;
GNC_AB_JOB_LIST2 *job_list = NULL;
GNC_AB_JOB_LIST2_ITERATOR *jit;
GNC_AB_JOB *job;
GNC_AB_JOB_STATUS job_status;
gboolean successful = TRUE;
int num_jobs = 0;
int num_jobs_failed = 0;
@@ -111,13 +105,14 @@ gnc_file_aqbanking_import(GtkWindow *parent,
gnc_set_default_directory(GNC_PREFS_GROUP_AQBANKING, default_dir);
g_free(default_dir);
#ifndef AQBANKING6
dtaus_fd = g_open(selected_filename, O_RDONLY, 0);
if (dtaus_fd == -1)
{
DEBUG("Could not open file %s", selected_filename);
goto cleanup;
}
#endif
/* Get the API */
api = gnc_AB_BANKING_new();
if (!api)
@@ -125,11 +120,8 @@ gnc_file_aqbanking_import(GtkWindow *parent,
g_warning("gnc_file_aqbanking_import: Couldn't get AqBanking API");
goto cleanup;
}
if (AB_Banking_OnlineInit(api
#ifdef AQBANKING_VERSION_4_EXACTLY
, 0
#endif
) != 0)
#ifndef AQBANKING6
if (AB_Banking_OnlineInit(api) != 0)
{
g_warning("gnc_file_aqbanking_import: "
"Couldn't initialize AqBanking API");
@@ -176,12 +168,21 @@ gnc_file_aqbanking_import(GtkWindow *parent,
}
goto cleanup;
}
#endif
/* Create a context to store the results */
context = AB_ImExporterContext_new();
#ifdef AQBANKING6
if (AB_Banking_ImportFromFileLoadProfile(api, aqbanking_importername,
context, aqbanking_profilename,
NULL, selected_filename) < 0)
{
g_warning("gnc_file_aqbanking_import: Error on import");
goto cleanup;
}
#else
/* Wrap file in buffered gwen io */
#ifdef AQBANKING_VERSION_5_PLUS
close(dtaus_fd);
io = GWEN_SyncIo_File_new(selected_filename, GWEN_SyncIo_File_CreationMode_OpenExisting);
g_assert(io);
@@ -197,35 +198,19 @@ gnc_file_aqbanking_import(GtkWindow *parent,
}
g_assert(GWEN_SyncIo_GetStatus(io) == GWEN_SyncIo_Status_Connected);
}
#else
io = GWEN_Io_LayerFile_new(dtaus_fd, -1);
g_assert(io);
if (GWEN_Io_Manager_RegisterLayer(io))
{
g_warning("gnc_file_aqbanking_import: Failed to wrap file");
goto cleanup;
}
#endif
dtaus_fd = -1;
/* Run the import */
if (AB_ImExporter_Import(importer, context, io, db_profile
#ifndef AQBANKING_VERSION_5_PLUS
, 0
#endif
))
if (AB_ImExporter_Import(importer, context, io, db_profile))
{
g_warning("gnc_file_aqbanking_import: Error on import");
goto cleanup;
}
/* Close the file */
#ifdef AQBANKING_VERSION_5_PLUS
GWEN_SyncIo_free(io);
#else
GWEN_Io_Layer_free(io);
#endif
io = NULL;
#endif
/* Before importing the results, if this is a new book, let user specify
* book options, since they affect how transactions are created */
@@ -259,12 +244,11 @@ gnc_file_aqbanking_import(GtkWindow *parent,
}
/* And execute the jobs */
AB_Banking_ExecuteJobs(api, job_list, execution_context
#ifndef AQBANKING_VERSION_5_PLUS
, 0
#ifdef AQBANKING6
AB_Banking_SendCommands(api, job_list, execution_context);
#else
AB_Banking_ExecuteJobs(api, job_list, execution_context);
#endif
);
/* Ignore the return value of AB_Banking_ExecuteJobs(), as the job's
* status always describes better whether the job was actually
* transferred to and accepted by the bank. See also
@@ -275,33 +259,50 @@ gnc_file_aqbanking_import(GtkWindow *parent,
* to give the appropriate feedback if any of the jobs didn't
* work. */
#ifdef AQBANKING6
jit = AB_Transaction_List2_First(job_list);
#else
jit = AB_Job_List2_First(job_list);
#endif
if (jit)
{
job = AB_Job_List2Iterator_Data(jit);
while (job)
{
num_jobs += 1;
#ifdef AQBANKING6
job_status = AB_Transaction_GetStatus(job);
if (job_status != AB_Transaction_StatusFinished &&
job_status != AB_Transaction_StatusPending)
#else
job_status = AB_Job_GetStatus(job);
if (job_status != AB_Job_StatusFinished
&& job_status != AB_Job_StatusPending)
if (job_status != AB_Job_StatusFinished &&
job_status != AB_Job_StatusPending)
#endif
{
successful = FALSE;
num_jobs_failed += 1;
if (num_jobs_failed <= max_failures)
{
#ifdef AQBANKING6
gchar *fmt_str =_("Job %d status %d - %s\n");
#else
gchar *fmt_str =_("Job %d status %d - %s: %s\n");
#endif
if (num_jobs_failed == 1)
{
errstr = g_string_new("Failed jobs:\n");
}
g_string_append_printf(errstr, _("Job %d status %d - %s: %s \n")
, num_jobs
, job_status
, AB_Job_Status2Char(job_status)
, AB_Job_GetResultText(job));
}
g_string_append_printf(errstr, fmt_str, num_jobs,
job_status,
#ifdef AQBANKING6
AB_Transaction_Status_toString(job_status));
#else
AB_Job_Status2Char(job_status),
AB_Job_GetResultText(job));
#endif
}
else
{
if (num_jobs_failed == (max_failures + 1) )
@@ -311,10 +312,17 @@ gnc_file_aqbanking_import(GtkWindow *parent,
}
}
}
#ifdef AQBANKING6
job = AB_Transaction_List2Iterator_Next(jit);
#else
job = AB_Job_List2Iterator_Next(jit);
#endif
} /* while */
#ifdef AQBANKING6
AB_Job_List2Iterator_free(jit);
#else
AB_Job_List2Iterator_free(jit);
#endif
}
if (!successful)
@@ -349,38 +357,30 @@ gnc_file_aqbanking_import(GtkWindow *parent,
}
cleanup:
if (io)
{
#ifdef AQBANKING_VERSION_5_PLUS
GWEN_SyncIo_free(io);
#else
GWEN_Io_Layer_free(io);
#endif
}
if (job_list)
#ifdef AQBANKING6
AB_Transaction_List2_FreeAll(job_list);
#else
AB_Job_List2_FreeAll(job_list);
if (io)
GWEN_SyncIo_free(io);
if (db_profiles)
GWEN_DB_Group_free(db_profiles);
if (online)
AB_Banking_OnlineFini(api);
if (dtaus_fd != -1)
close(dtaus_fd);
#endif
if (ieci)
g_free(ieci);
if (context)
AB_ImExporterContext_free(context);
if (db_profiles)
GWEN_DB_Group_free(db_profiles);
if (gui)
gnc_GWEN_Gui_release(gui);
if (online)
#ifdef AQBANKING_VERSION_4_EXACTLY
AB_Banking_OnlineFini(api, 0);
#else
AB_Banking_OnlineFini(api);
#endif
if (api)
gnc_AB_BANKING_fini(api);
if (dtaus_fd != -1)
close(dtaus_fd);
if (selected_filename)
g_free(selected_filename);
if (errstr)
g_string_free(errstr, TRUE);
}

View File

@@ -46,14 +46,8 @@
#include "gnc-plugin-aqbanking.h"
#include "qof.h"
#if GWENHYWFAR_VERSION_INT >= 39921
/* For sufficiently new gwenhywfar (>=3.99.21) the gtk3 gui object is
* working fine and it is enabled here here. */
# define USING_GWENHYWFAR_GTK3_GUI
# define GNC_GWENHYWFAR_CB GWENHYWFAR_CB
#else
# define GNC_GWENHYWFAR_CB
#endif
#define GWEN_GUI_CM_CLASS "dialog-hbcilog"
#define GNC_PREFS_GROUP_CONNECTION GNC_PREFS_GROUP_AQBANKING ".connection-dialog"
@@ -196,7 +190,7 @@ static gint progress_advance_cb(GWEN_GUI *gwen_gui, uint32_t id,
static gint progress_log_cb(GWEN_GUI *gwen_gui, guint32 id,
GWEN_LOGGER_LEVEL level, const gchar *text);
static gint progress_end_cb(GWEN_GUI *gwen_gui, guint32 id);
#if GWENHYWFAR_VERSION_INT < 49900
#ifndef GWENHYWFAR5
static gint GNC_GWENHYWFAR_CB getpassword_cb(GWEN_GUI *gwen_gui, guint32 flags,
const gchar *token,
const gchar *title,
@@ -218,9 +212,7 @@ static gint GNC_GWENHYWFAR_CB setpasswordstatus_cb(GWEN_GUI *gwen_gui, const gch
GWEN_GUI_PASSWORD_STATUS status, guint32 guiid);
static gint GNC_GWENHYWFAR_CB loghook_cb(GWEN_GUI *gwen_gui, const gchar *log_domain,
GWEN_LOGGER_LEVEL priority, const gchar *text);
#ifdef AQBANKING_VERSION_5_PLUS
typedef GWEN_SYNCIO GWEN_IO_LAYER;
#endif
static gint GNC_GWENHYWFAR_CB checkcert_cb(GWEN_GUI *gwen_gui, const GWEN_SSLCERTDESCR *cert,
GWEN_IO_LAYER *io, guint32 guiid);
@@ -1417,7 +1409,7 @@ progress_end_cb(GWEN_GUI *gwen_gui, guint32 id)
}
static gint GNC_GWENHYWFAR_CB
#if GWENHYWFAR_VERSION_INT < 49900
#ifndef GWENHYWFAR5
getpassword_cb(GWEN_GUI *gwen_gui, guint32 flags, const gchar *token,
const gchar *title, const gchar *text, gchar *buffer,
gint min_len, gint max_len, guint32 guiid)