34#include <glib/gi18n.h>
35#include <gwenhywfar/gwenhywfar.h>
36#include <aqbanking/banking.h>
37#include <aqbanking/types/balance.h>
38#if (AQBANKING_VERSION_INT >= 60400)
39#include <aqbanking/types/refaccount.h>
40#include <gnc-aqbanking-templates.h>
42#include "window-reconcile.h"
53#include "engine-helpers.h"
54#include <aqbanking/gui/abgui.h>
57G_GNUC_UNUSED
static QofLogModule log_module = G_LOG_DOMAIN;
60static AB_BANKING *gnc_AB_BANKING = NULL;
61static gint gnc_AB_BANKING_refcount = 0;
63static gpointer join_ab_strings_cb (
const gchar *str, gpointer user_data);
64static Account *gnc_ab_accinfo_to_gnc_acc (GtkWidget *parent,
65 AB_IMEXPORTER_ACCOUNTINFO *account_info);
66static Account *gnc_ab_txn_to_gnc_acc (GtkWidget *parent,
67 const AB_TRANSACTION *transaction);
68static const AB_TRANSACTION *txn_transaction_cb (
const AB_TRANSACTION *element,
70static AB_IMEXPORTER_ACCOUNTINFO *txn_accountinfo_cb (AB_IMEXPORTER_ACCOUNTINFO *element,
72static AB_IMEXPORTER_ACCOUNTINFO *bal_accountinfo_cb (AB_IMEXPORTER_ACCOUNTINFO *element,
80 GNC_AB_ACCOUNT_SPEC *ab_acc;
81 gboolean execute_txns;
84 GNC_AB_JOB_LIST2 *job_list;
85 GNCImportMainMatcher *generic_importer;
89static inline gboolean is_leap_year (
int year)
91 return (year % 400 == 0 || (year % 4 == 0 && year % 100 != 0 ));
95gnc_gwen_date_to_time64 (
const GNC_GWEN_DATE* date)
97 int day = GWEN_Date_GetDay (date);
98 int month = GWEN_Date_GetMonth (date);
99 int year = GWEN_Date_GetYear (date);
106 while (month == 2 && day <= 30 && day > (is_leap_year (year) ? 29 : 28))
108 return gnc_dmy2time64_neutral (day, month, year);
114 gchar* gwen_logging = g_strdup (g_getenv (
"GWEN_LOGLEVEL"));
115 gchar* aqb_logging = g_strdup (g_getenv (
"AQBANKING_LOGLEVEL"));
125 GWEN_Logger_SetLevel (NULL, GWEN_LoggerLevel_Info);
126 GWEN_Logger_SetLevel (GWEN_LOGDOMAIN, GWEN_LoggerLevel_Info);
129 GWEN_Logger_SetLevel (AQBANKING_LOGDOMAIN, GWEN_LoggerLevel_Debug);
135 GWEN_Logger_SetLevel (NULL, GWEN_LoggerLevel_Error);
136 GWEN_Logger_SetLevel (GWEN_LOGDOMAIN, GWEN_LoggerLevel_Error);
139 GWEN_Logger_SetLevel (AQBANKING_LOGDOMAIN, GWEN_LoggerLevel_Warning);
141 g_free (gwen_logging);
142 g_free (aqb_logging);
151 GWEN_Logger_SetLevel (NULL, GWEN_LoggerLevel_Error);
152 GWEN_Logger_SetLevel (GWEN_LOGDOMAIN, GWEN_LoggerLevel_Warning);
153 GWEN_Logger_SetLevel (AQBANKING_LOGDOMAIN, GWEN_LoggerLevel_Warning);
159static GWEN_GUI *gnc_gwengui_extended_by_ABBanking;
169 api = gnc_AB_BANKING;
172 if (gnc_AB_BANKING_refcount == 0)
173 g_return_val_if_fail (AB_Banking_Init (api) == 0, NULL);
178 api = AB_Banking_new (PROJECT_NAME, NULL, 0);
179 g_return_val_if_fail (api, NULL);
187 AB_Banking_RuntimeConfig_SetCharValue (api,
"fintsRegistrationKey",
"412748A1836CDD07181CE1910");
188 AB_Banking_RuntimeConfig_SetCharValue (api,
"fintsApplicationVersionString", PROJECT_VERSION);
191 g_return_val_if_fail (AB_Banking_Init (api) == 0, NULL);
192 gnc_gwengui_extended_by_ABBanking = GWEN_Gui_GetGui ();
193 AB_Gui_Extend (gnc_gwengui_extended_by_ABBanking, api);
196 gnc_AB_BANKING = api;
197 gnc_AB_BANKING_refcount = 0;
200 gnc_AB_BANKING_refcount++;
209 api = gnc_AB_BANKING;
213 if (api == gnc_AB_BANKING)
215 gnc_AB_BANKING = NULL;
219 AB_Banking_free (api);
227 if (api == gnc_AB_BANKING)
229 if (--gnc_AB_BANKING_refcount == 0)
231 if (gnc_gwengui_extended_by_ABBanking)
232 AB_Gui_Unextend (gnc_gwengui_extended_by_ABBanking);
233 gnc_gwengui_extended_by_ABBanking = NULL;
234 return AB_Banking_Fini (api);
239 if (gnc_gwengui_extended_by_ABBanking)
240 AB_Gui_Unextend (gnc_gwengui_extended_by_ABBanking);
241 gnc_gwengui_extended_by_ABBanking = NULL;
242 return AB_Banking_Fini (api);
250 GNC_AB_ACCOUNT_SPEC *ab_account = NULL;
251 const gchar *bankcode = NULL;
252 const gchar *accountid = NULL;
253 guint32 account_uid = 0;
263 rv = AB_Banking_GetAccountSpecByUniqueId (api, account_uid, &ab_account);
265 if ( (rv<0 || !ab_account) && bankcode && *bankcode &&
266 accountid && *accountid)
271 PINFO(
"gnc_ab_get_ab_account: No AB_ACCOUNT found for UID %d, "
272 "trying bank code\n", account_uid);
285 return g_strdup_printf (
"%.2f %s",
286 AB_Value_GetValueAsDouble (value),
287 AB_Value_GetCurrency (value));
289 return g_strdup_printf (
"%.2f", 0.0);
304 while (accountnumber && *accountnumber ==
'0')
307 online_id = g_strconcat (bankcode ? bankcode :
"",
308 accountnumber ? accountnumber :
"",
319join_ab_strings_cb (
const gchar *str, gpointer user_data)
321 gchar **acc = user_data;
327 tmp = g_utf8_normalize (str, -1, G_NORMALIZE_NFC);
333 if (!strstr (*acc, tmp))
335 gchar *join = g_strjoin (
" ", *acc, tmp, (gchar*) NULL);
351 const char* ab_remote_name;
352 gchar *gnc_other_name = NULL;
354 g_return_val_if_fail (ab_trans, NULL);
356 ab_remote_name = AB_Transaction_GetRemoteName (ab_trans);
358 gnc_other_name = g_strdup(ab_remote_name);
359 if (!gnc_other_name || !*gnc_other_name)
361 g_free (gnc_other_name);
362 gnc_other_name = NULL;
365 return gnc_other_name;
371 GWEN_STRINGLIST *ab_purpose;
372 const char *ab_transactionText = NULL;
373 gchar *gnc_description = NULL;
375 g_return_val_if_fail (ab_trans, g_strdup (
""));
377 if (!is_ofx &&
gnc_prefs_get_bool (GNC_PREFS_GROUP_AQBANKING, GNC_PREF_USE_TRANSACTION_TXT))
382 ab_transactionText = AB_Transaction_GetTransactionText (ab_trans);
383 if (ab_transactionText && *ab_transactionText)
384 gnc_description = g_utf8_normalize (ab_transactionText, -1, G_NORMALIZE_NFC);
387 ab_purpose = AB_Transaction_GetPurposeAsStringList (ab_trans);
389 GWEN_StringList_ForEach (ab_purpose, join_ab_strings_cb,
392 GWEN_StringList_free (ab_purpose);
394 return gnc_description;
404ab_ultimate_creditor_debtor_to_gnc (
const AB_TRANSACTION *ab_trans,
407 const gchar* ultimate;
412 ultimate = AB_Transaction_GetUltimateCreditor (ab_trans);
414 if (!ultimate || !*ultimate)
415 ultimate = AB_Transaction_GetUltimateDebtor (ab_trans);
417 if (!ultimate || !*ultimate)
420 return g_strdup (ultimate);
431 acc = g_list_prepend (acc, ab_ultimate_creditor_debtor_to_gnc (ab_trans, is_ofx));
434 g_list_free_full (acc, g_free);
435 return retval ? retval : g_strdup (_(
"Unspecified"));
441 const gchar *ab_remote_accountnumber =
442 AB_Transaction_GetRemoteAccountNumber (ab_trans);
443 const gchar *ab_remote_bankcode =
444 AB_Transaction_GetRemoteBankCode (ab_trans);
446 gchar *ab_other_accountid;
447 gchar *ab_other_bankcode;
449 gboolean have_accountid;
450 gboolean have_bankcode;
455 if (!ab_remote_accountnumber)
456 ab_remote_accountnumber = AB_Transaction_GetRemoteIban (ab_trans);
457 if (!ab_remote_bankcode)
458 ab_remote_bankcode = AB_Transaction_GetRemoteBic (ab_trans);
460 ab_other_accountid = g_strdup (ab_remote_accountnumber ? ab_remote_accountnumber :
"");
461 ab_other_bankcode = g_strdup (ab_remote_bankcode ? ab_remote_bankcode :
"");
468 g_strstrip (ab_other_accountid);
469 g_strstrip (ab_other_bankcode);
472 have_accountid = ab_other_accountid && *ab_other_accountid;
473 have_bankcode = ab_other_bankcode && *ab_other_bankcode;
475 if ( have_accountid || have_bankcode )
477 retval = g_strdup_printf (
"%s %s %s %s",
478 have_accountid ? _(
"Account") :
"",
479 have_accountid ? ab_other_accountid :
"",
480 have_bankcode ? _(
"Bank") :
"",
481 have_bankcode ? ab_other_bankcode :
""
487 retval = g_strdup (
"");
490 g_free (ab_other_accountid);
491 g_free (ab_other_bankcode);
500 Transaction *gnc_trans;
502 const GNC_GWEN_DATE *value_date, *post_date;
509 g_return_val_if_fail (ab_trans && gnc_acc, NULL);
512 book = gnc_account_get_book (gnc_acc);
527 value_date = AB_Transaction_GetValutaDate (ab_trans);
529 post_time = gnc_gwen_date_to_time64 (value_date);
530 else if ((post_date = AB_Transaction_GetDate (ab_trans)))
531 post_time = gnc_gwen_date_to_time64 (post_date);
534 g_warning (
"transaction_cb: Import had no transaction date");
547 fitid = AB_Transaction_GetFiId (ab_trans);
552 g_free (description);
560 xaccSplitSetParent (split, gnc_trans);
561 xaccSplitSetAccount (split, gnc_acc);
565 custref = AB_Transaction_GetCustomerReference (ab_trans);
566 if (custref && *custref && g_ascii_strncasecmp (custref,
"NONREF", 6) != 0)
567 gnc_set_num_action (gnc_trans, split, custref, NULL);
576 const AB_VALUE *ab_value = AB_Transaction_GetValue (ab_trans);
577 double d_value = ab_value ? AB_Value_GetValueAsDouble (ab_value) : 0.0;
578 AB_TRANSACTION_TYPE ab_type = AB_Transaction_GetType (ab_trans);
579 gnc_numeric gnc_amount;
585 if (d_value > 0.0 && ab_type == AB_Transaction_TypeTransfer)
593 g_warning (
"transaction_cb: Oops, value was NULL. Using 0");
614gnc_ab_accinfo_to_gnc_acc (GtkWidget *parent, AB_IMEXPORTER_ACCOUNTINFO *acc_info)
616 const gchar *bankcode, *accountnumber;
620 g_return_val_if_fail (acc_info, NULL);
622 bankcode = AB_ImExporterAccountInfo_GetBankCode (acc_info);
623 accountnumber = AB_ImExporterAccountInfo_GetAccountNumber (acc_info);
626 AB_ImExporterAccountInfo_GetAccountName (acc_info),
630 g_warning (
"gnc_ab_accinfo_to_gnc_acc: Could not determine source account"
631 " for online_id %s", online_id);
648gnc_ab_txn_to_gnc_acc (GtkWidget *parent,
const AB_TRANSACTION *transaction)
650 const gchar *bankcode, *accountnumber;
654 g_return_val_if_fail(transaction, NULL);
656 bankcode = AB_Transaction_GetLocalBankCode (transaction);
657 accountnumber = AB_Transaction_GetLocalAccountNumber (transaction);
658 if (!bankcode && !accountnumber)
665 AB_Transaction_GetLocalName (transaction),
669 g_warning (
"gnc_ab_txn_to_gnc_acc: Could not determine source account"
670 " for online_id %s", online_id);
677static const AB_TRANSACTION *
678txn_transaction_cb (
const AB_TRANSACTION *element, gpointer user_data)
680 GncABImExContextImport *data = user_data;
681 Transaction *gnc_trans;
682 GncABTransType trans_type;
685 g_return_val_if_fail (element && data, NULL);
688 txnacc = gnc_ab_txn_to_gnc_acc (GTK_WIDGET(data->parent), element);
691 if (data->execute_txns && data->ab_acc)
693 AB_TRANSACTION *ab_trans = AB_Transaction_dup (element);
698 AB_Transaction_SetLocalBankCode (
699 ab_trans, AB_AccountSpec_GetBankCode (data->ab_acc));
700 AB_Transaction_SetLocalAccountNumber (
701 ab_trans, AB_AccountSpec_GetAccountNumber (data->ab_acc));
702 AB_Transaction_SetLocalCountry (ab_trans,
"DE");
705 switch (AB_Transaction_GetType (ab_trans))
707 case AB_Transaction_TypeDebitNote:
708 trans_type = SINGLE_DEBITNOTE;
710 case AB_Transaction_TypeTransaction:
713 case AB_Transaction_TypeTransfer:
715 trans_type = SEPA_TRANSFER;
722 if (!job || AB_AccountSpec_GetTransactionLimitsForCommand (data->ab_acc, AB_Transaction_GetCommand (job)) == NULL)
725 if (gnc_verify_dialog (
726 GTK_WINDOW(data->parent), FALSE,
"%s",
727 _(
"The backend found an error during the preparation "
728 "of the job. It is not possible to execute this job.\n"
730 "Most probably the bank does not support your chosen "
731 "job or your Online Banking account does not have the permission "
732 "to execute this job. More error messages might be "
733 "visible on your console log.\n"
735 "Do you want to enter the job again?")))
737 gnc_error_dialog (GTK_WINDOW(data->parent),
738 "Sorry, not implemented yet. Please check the console or trace file logs to see which job was rejected.");
745 AB_Transaction_GetUniqueId (job));
749 AB_Transaction_free (ab_trans);
760static void gnc_ab_trans_processed_cb (GNCImportTransInfo *trans_info,
764 GncABImExContextImport *data = user_data;
766 GNC_AB_JOB *job = g_datalist_get_data (&data->tmp_job_list, jobname);
770 AB_Transaction_List2_PushBack (data->job_list, job);
774 AB_Transaction_free (job);
777 g_datalist_remove_data (&data->tmp_job_list, jobname);
795 return g_strdup_printf (
"job_%lu", job_id);
798static const AB_TRANSACTION *
799get_first_importable_transaction (AB_IMEXPORTER_ACCOUNTINFO *element,
800 gboolean import_noted_txns)
802 const AB_TRANSACTION *trans;
804 trans = AB_ImExporterAccountInfo_GetFirstTransaction (
805 element, AB_Transaction_TypeStatement, 0);
809 if (!import_noted_txns)
812 return AB_ImExporterAccountInfo_GetFirstTransaction (
813 element, AB_Transaction_TypeNotedStatement, 0);
817import_account_transactions (AB_TRANSACTION_LIST *ab_trans_list,
818 GncABImExContextImport *data,
819 gboolean import_noted_txns)
821 AB_Transaction_List_ForEachByType (ab_trans_list, txn_transaction_cb, data,
822 AB_Transaction_TypeStatement, 0);
824 if (import_noted_txns)
825 AB_Transaction_List_ForEachByType (ab_trans_list, txn_transaction_cb,
827 AB_Transaction_TypeNotedStatement, 0);
830static AB_IMEXPORTER_ACCOUNTINFO *
831txn_accountinfo_cb (AB_IMEXPORTER_ACCOUNTINFO *element, gpointer user_data)
833 GncABImExContextImport *data = user_data;
835 gboolean import_noted_txns;
837 g_return_val_if_fail (element && data, NULL);
839 if (data->awaiting & IGNORE_TRANSACTIONS)
844 GNC_PREF_IMPORT_NOTED_TXNS);
846 if (!get_first_importable_transaction (element, import_noted_txns))
850 data->awaiting |= FOUND_TRANSACTIONS;
852 if (!(data->awaiting & AWAIT_TRANSACTIONS))
854 if (gnc_verify_dialog (GTK_WINDOW(data->parent), TRUE,
"%s",
855 _(
"The bank has sent transaction information "
858 "Do you want to import it?")))
860 data->awaiting |= AWAIT_TRANSACTIONS;
864 data->awaiting |= IGNORE_TRANSACTIONS;
870 gnc_acc = gnc_ab_accinfo_to_gnc_acc (GTK_WIDGET(data->parent), element);
871 if (!gnc_acc)
return NULL;
872 data->gnc_acc = gnc_acc;
874 if (data->execute_txns)
881 gnc_error_dialog (GTK_WINDOW(data->parent),
"%s",
882 _(
"No Online Banking account found for this "
883 "gnucash account. These transactions will "
884 "not be executed by Online Banking."));
892 if (!data->generic_importer)
896 if (data->execute_txns)
899 gnc_ab_trans_processed_cb, data);
905 AB_TRANSACTION_LIST *ab_trans_list = AB_ImExporterAccountInfo_GetTransactionList (element);
907 import_account_transactions (ab_trans_list, data, import_noted_txns);
912static AB_IMEXPORTER_ACCOUNTINFO *
913bal_accountinfo_cb (AB_IMEXPORTER_ACCOUNTINFO *element, gpointer user_data)
915 GncABImExContextImport *data = user_data;
917 const AB_BALANCE *booked_bal, *noted_bal;
918 const AB_VALUE *booked_val = NULL, *noted_val = NULL;
919 gdouble booked_value, noted_value;
923 gboolean show_recn_window = FALSE;
925 g_return_val_if_fail (element && data, NULL);
927 if (data->awaiting & IGNORE_BALANCES)
931 if (!AB_ImExporterAccountInfo_GetFirstBalance (element))
935 data->awaiting |= FOUND_BALANCES;
938 booked_bal = AB_Balance_List_GetLatestByType (AB_ImExporterAccountInfo_GetBalanceList (element),
939 AB_Balance_TypeBooked);
941 if (!(data->awaiting & AWAIT_BALANCES))
943 GtkWindow *parent = data->generic_importer ?
945 GTK_WINDOW(data->parent);
946 const char* balance_msg =
947 _(
"The bank has sent balance information in its response.\n"
948 "Do you want to import it?");
950 if (!booked_bal || AB_Value_IsZero (AB_Balance_GetValue (booked_bal)))
954 if (gnc_verify_dialog (parent, TRUE,
"%s", balance_msg))
956 data->awaiting |= AWAIT_BALANCES;
960 data->awaiting |= IGNORE_BALANCES;
966 gnc_acc = gnc_ab_accinfo_to_gnc_acc (GTK_WIDGET(data->parent), element);
967 if (!gnc_acc)
return NULL;
968 data->gnc_acc = gnc_acc;
973 const GWEN_DATE *ti = AB_Balance_GetDate (booked_bal);
976 booked_tt = gnc_gwen_date_to_time64 (ti);
984 booked_val = AB_Balance_GetValue (booked_bal);
987 booked_value = AB_Value_GetValueAsDouble (booked_val);
991 g_warning (
"bal_accountinfo_cb: booked_val == NULL. Assuming 0");
997 g_warning (
"bal_accountinfo_cb: booked_bal == NULL. Assuming 0");
1003 noted_bal = AB_Balance_List_GetLatestByType (AB_ImExporterAccountInfo_GetBalanceList (element),
1004 AB_Balance_TypeNoted);
1007 noted_val = AB_Balance_GetValue (noted_bal);
1009 noted_value = AB_Value_GetValueAsDouble (noted_val);
1012 g_warning (
"bal_accountinfo_cb: noted_val == NULL. Assuming 0");
1018 g_warning (
"bal_accountinfo_cb: noted_bal == NULL. Assuming 0");
1024 GNC_HOW_RND_ROUND_HALF_UP);
1025 if (noted_value == 0.0 && booked_value == 0.0)
1027 dialog = gtk_message_dialog_new (
1028 GTK_WINDOW(data->parent),
1029 GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
1040 _(
"The downloaded Online Banking Balance was zero.\n\n"
1041 "Either this is the correct balance, or your bank does not "
1042 "support Balance download in this Online Banking version. "
1043 "In the latter case you should choose a different "
1044 "Online Banking version number in the Online Banking "
1045 "(AqBanking or HBCI) Setup. After that, try again to "
1046 "download the Online Banking Balance."));
1047 gtk_dialog_run (GTK_DIALOG(dialog));
1048 gtk_widget_destroy (dialog);
1056 gchar *message1 = g_strdup_printf (
1057 _(
"Result of Online Banking job:\n"
1058 "Account booked balance is %s"),
1061 (noted_value == 0.0) ?
1063 g_strdup_printf (
_(
"For your information: This account also "
1064 "has a noted balance of %s\n"),
1069 const gchar *message3 =
1070 _(
"The booked balance is identical to the current "
1071 "reconciled balance of the account.");
1072 dialog = gtk_message_dialog_new (
1073 GTK_WINDOW(data->parent),
1074 GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
1078 message1, message2, message3);
1079 gtk_dialog_run (GTK_DIALOG(dialog));
1080 gtk_widget_destroy (GTK_WIDGET(dialog));
1085 const char *message3 =
_(
"Reconcile account now?");
1087 show_recn_window = gnc_verify_dialog (GTK_WINDOW(data->parent), TRUE,
"%s\n%s\n%s",
1088 message1, message2, message3);
1090 g_free (booked_str);
1096 if (show_recn_window)
1097 recnWindowWithBalance (GTK_WIDGET(data->parent), gnc_acc, value, booked_tt);
1102GncABImExContextImport *
1104 guint awaiting, gboolean execute_txns,
1105 AB_BANKING *api, GtkWidget *parent)
1107 GncABImExContextImport *data = g_new (GncABImExContextImport, 1);
1108 AB_IMEXPORTER_ACCOUNTINFO_LIST *ab_ail;
1109 g_return_val_if_fail (context, NULL);
1111 g_return_val_if_fail (!(awaiting & AWAIT_BALANCES)
1112 || !(awaiting & IGNORE_BALANCES),
1114 g_return_val_if_fail (!(awaiting & AWAIT_TRANSACTIONS)
1115 || !(awaiting & IGNORE_TRANSACTIONS),
1118 g_return_val_if_fail (awaiting & AWAIT_TRANSACTIONS || !execute_txns, NULL);
1120 g_return_val_if_fail (!execute_txns || api, NULL);
1122 data->awaiting = awaiting;
1123 data->txn_found = FALSE;
1124 data->execute_txns = execute_txns;
1126 data->parent = parent;
1127 data->job_list = AB_Transaction_List2_new ();
1128 data->tmp_job_list = NULL;
1129 data->generic_importer = NULL;
1131 g_datalist_init (&data->tmp_job_list);
1134 ab_ail = AB_ImExporterContext_GetAccountInfoList (context);
1135 if (ab_ail && AB_ImExporterAccountInfo_List_GetCount (ab_ail))
1137 if (!(awaiting & IGNORE_TRANSACTIONS))
1138 AB_ImExporterAccountInfo_List_ForEach (ab_ail,
1143 if (data->generic_importer)
1147 if (!(awaiting & IGNORE_BALANCES))
1148 AB_ImExporterAccountInfo_List_ForEach (ab_ail,
1155 AB_MESSAGE * bankmsg = AB_ImExporterContext_GetFirstMessage (context);
1158 const char* subject = AB_Message_GetSubject (bankmsg);
1159 const char* text = AB_Message_GetText (bankmsg);
1160 gnc_info_dialog (GTK_WINDOW(data->parent),
"%s\n%s %s\n%s",
1161 _(
"The bank has sent a message in its response."),
1166 bankmsg = AB_Message_List_Next (bankmsg);
1176 g_return_val_if_fail (ieci, 0);
1178 return ieci->awaiting;
1184 g_return_val_if_fail (ieci, NULL);
1186 return ieci->job_list;
1192 g_return_val_if_fail (ieci, FALSE);
1201 GWEN_DB_NODE *perm_certs = NULL;
1204 g_return_val_if_fail (banking, NULL);
1205 rv = AB_Banking_LoadSharedConfig (banking,
"certs", &perm_certs);
1207 g_return_val_if_fail (rv >= 0, NULL);
1211#if (AQBANKING_VERSION_INT >= 60400)
1213gnc_ab_trans_templ_list_new_from_ref_accounts (GNC_AB_ACCOUNT_SPEC *ab_acc)
1215 GList *retval = NULL;
1216 AB_REFERENCE_ACCOUNT *ra;
1217 AB_REFERENCE_ACCOUNT_LIST *ral;
1218 GWEN_BUFFER *accNameForTemplate = GWEN_Buffer_new (0,120,0,0);
1219 gnc_numeric zero = gnc_numeric_zero ();
1222 ral = AB_AccountSpec_GetRefAccountList (ab_acc);
1223 ra = AB_ReferenceAccount_List_First (ral);
1229 const char *iban = AB_ReferenceAccount_GetIban (ra);
1230 const char *accName = AB_ReferenceAccount_GetAccountName (ra);
1231 GWEN_Buffer_Reset (accNameForTemplate);
1234 GWEN_Buffer_AppendString (accNameForTemplate, accName);
1235 GWEN_Buffer_AppendString (accNameForTemplate,
": ");
1237 GWEN_Buffer_AppendString (accNameForTemplate, iban);
1243 retval = g_list_prepend (retval, new_templ);
1244 ra = AB_ReferenceAccount_List_Next (ra);
1246 retval = g_list_reverse (retval);
1248 GWEN_Buffer_free (accNameForTemplate);
1256 return left ? (right ? g_strcmp0 (left->name, right->name) : -1) :
1263 GList* desc_list = NULL;
1264 GWEN_PLUGIN_DESCRIPTION_LIST2 *il =
1265 AB_Banking_GetImExporterDescrs (api);
1266 GWEN_PLUGIN_DESCRIPTION_LIST2_ITERATOR *ilit;
1267 g_return_val_if_fail (il, NULL);
1268 ilit = GWEN_PluginDescription_List2_First(il);
1270 for (GWEN_PLUGIN_DESCRIPTION *pd =
1271 GWEN_PluginDescription_List2Iterator_Data(ilit);
1273 pd = GWEN_PluginDescription_List2Iterator_Next(ilit))
1278 node->name = g_strdup(GWEN_PluginDescription_GetName(pd));
1279 node->descr = g_strdup(GWEN_PluginDescription_GetShortDescr(pd));
1280 desc_list = g_list_prepend (desc_list, node);
1282 GWEN_PluginDescription_List2_free(il);
1283 return g_list_sort (desc_list, (GCompareFunc)ab_node_pair_compare);
1289 GList* prof_list = NULL;
1290 GWEN_DB_NODE* db = AB_Banking_GetImExporterProfiles(api, importer_name);
1291 g_return_val_if_fail (db, NULL);
1293 for (GWEN_DB_NODE *profile = GWEN_DB_GetFirstGroup(db); profile;
1294 profile = GWEN_DB_GetNextGroup(profile))
1297 if (!profile)
continue;
1298 node->name = g_strdup(GWEN_DB_GetCharValue(profile,
"name", 0, NULL));
1299 node->descr = g_strdup(GWEN_DB_GetCharValue(profile,
"shortDescr", 0, NULL));
1300 prof_list = g_list_prepend (prof_list, node);
1302 return g_list_sort (prof_list, (GCompareFunc)ab_node_pair_compare);
API for Transactions and Splits (journal entries)
Dialog for AqBanking transaction data.
AqBanking utility functions.
GUI callbacks for AqBanking.
Generic api to store and retrieve preferences.
int xaccAccountGetCommoditySCU(const Account *acc)
Return the SCU for the account.
gnc_numeric xaccAccountGetReconciledBalance(const Account *acc)
Get the current balance of the account, only including reconciled transactions.
gnc_commodity * xaccAccountGetCommodity(const Account *acc)
Get the account's commodity
@ ACCT_TYPE_NONE
Not a type.
gboolean gnc_ab_ieci_run_matcher(GncABImExContextImport *ieci)
Run the generic transaction matcher dialog.
const gchar * gnc_ab_get_account_bankcode(const Account *a)
Return the bankcode string in the Account a.
void gnc_ab_trans_templ_set_recp_bankcode(GncABTransTempl *t, const gchar *recp_bankcode)
Replace the Bank Code of the recipient stored in a template.
GNC_AB_ACCOUNT_SPEC * gnc_ab_get_ab_account(const AB_BANKING *api, Account *gnc_acc)
Get the corresponding AqBanking account to the GnuCash account gnc_acc.
void gnc_ab_trans_templ_set_recp_account(GncABTransTempl *t, const gchar *recp_account)
Replace the Account Number of the recipient stored in a template.
gchar * gnc_ab_memo_to_gnc(const AB_TRANSACTION *ab_trans)
Create the appropriate memo field for a GnuCash Split by the information given in the AB_TRANSACTION ...
void gnc_ab_trans_templ_set_name(GncABTransTempl *t, const gchar *name)
Set the name of a template.
void gnc_ab_trans_templ_set_recp_name(GncABTransTempl *t, const gchar *recp_name)
Replace the Account Number of the recipient stored in a template.
gchar * gnc_ab_create_online_id(const gchar *bankcode, const gchar *accountnumber)
Creates an online ID from bank code and account number.
GList * gnc_ab_imexporter_list(AB_BANKING *api)
Retrieve the available AQBanking importers.
gchar * gnc_AB_JOB_to_readable_string(const GNC_AB_JOB *job)
Return the job as string.
guint gnc_ab_ieci_get_found(GncABImExContextImport *ieci)
Extract awaiting from data.
GncABImExContextImport * gnc_ab_import_context(AB_IMEXPORTER_CONTEXT *context, guint awaiting, gboolean execute_txns, AB_BANKING *api, GtkWidget *parent)
Import balances and transactions found in a AB_IMEXPORTER_CONTEXT into GnuCash.
gchar * gnc_ab_description_to_gnc(const AB_TRANSACTION *ab_trans, gboolean is_ofx)
Create the appropriate description field for a GnuCash Transaction by the information given in the AB...
GncABTransTempl * gnc_ab_trans_templ_new()
Create a template with unset contents.
gchar * gnc_AB_VALUE_to_readable_string(const AB_VALUE *value)
Print the value of value with two decimal places and value's currency appended, or 0....
GNC_AB_JOB_LIST2 * gnc_ab_ieci_get_job_list(GncABImExContextImport *ieci)
Extract the job list from data.
void gnc_GWEN_Gui_log_init(void)
Hook our logging into the gwenhywfar logging framework by creating a minimalistic GWEN_GUI with only ...
GList * gnc_ab_imexporter_profile_list(AB_BANKING *api, const char *importer_name)
Retrieve the available format templates for an AQBanking importer.
Transaction * gnc_ab_trans_to_gnc(const AB_TRANSACTION *ab_trans, Account *gnc_acc)
Create an unbalanced and dirty GnuCash transaction with a split to gnc_acc from the information avail...
void gnc_AB_BANKING_delete(AB_BANKING *api)
Delete the AB_BANKING api.
const gchar * gnc_ab_get_account_accountid(const Account *a)
Return accountid string in the Account a.
gint gnc_AB_BANKING_fini(AB_BANKING *api)
Finish the AB_BANKING api.
void gnc_GWEN_Fini(void)
Finalize the gwenhywfar library.
void gnc_GWEN_Init(void)
Initialize the gwenhywfar library by calling GWEN_Init() and setting up gwenhywfar logging.
gchar * gnc_ab_get_purpose(const AB_TRANSACTION *ab_trans, gboolean is_ofx)
Retrieve the merged purpose fields from a transaction.
guint32 gnc_ab_get_account_uid(const Account *a)
Return the unique id for the AB_BANKING account in the Account a.
gchar * gnc_ab_get_remote_name(const AB_TRANSACTION *ab_trans)
Retrieve the merged "remote name" fields from a transaction.
AB_BANKING * gnc_AB_BANKING_new(void)
If there is a cached AB_BANKING object, return it initialized.
gchar * gnc_AB_JOB_ID_to_string(gulong job_id)
Return the job_id as string.
void gnc_ab_trans_templ_set_amount(GncABTransTempl *t, gnc_numeric amount)
Replace the amount stored in a template.
void gnc_GWEN_Gui_shutdown(void)
Free all memory related to both the full-blown and minimalistic GUI objects.
GWEN_DB_NODE * gnc_ab_get_permanent_certs(void)
get the GWEN_DB_NODE from AqBanking configuration files
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.
gint64 time64
Most systems that are currently maintained, including Microsoft Windows, BSD-derived Unixes and Linux...
time64 gnc_time64_get_day_neutral(time64 time_val)
The gnc_time64_get_day_neutral() routine will take the given time in seconds and adjust it to 10:59:0...
time64 gnc_time(time64 *tbuf)
get the current time
void xaccTransSetDescription(Transaction *trans, const char *desc)
Sets the transaction Description.
void xaccTransSetDateEnteredSecs(Transaction *trans, time64 secs)
Modify the date of when the transaction was entered.
Transaction * xaccMallocTransaction(QofBook *book)
The xaccMallocTransaction() will malloc memory and initialize it.
void xaccTransSetDatePostedSecsNormalized(Transaction *trans, time64 time)
This function sets the posted date of the transaction, specified by a time64 (see ctime(3)).
void xaccTransSetCurrency(Transaction *trans, gnc_commodity *curr)
Set a new currency on a transaction.
void xaccTransBeginEdit(Transaction *trans)
The xaccTransBeginEdit() method must be called before any changes are made to a transaction or any of...
gchar * gnc_g_list_stringjoin_nodups(GList *list_of_strings, const gchar *sep)
Like stringjoin but ensures that the string to be added isn't already part of the return string.
void gnc_utf8_strip_invalid(gchar *str)
Strip any non-UTF-8 characters from a string.
void gnc_utf8_strip_invalid_and_controls(gchar *str)
Strip any non-utf8 characters and any control characters (everything < 0x20, , \f,...
GNCImportMainMatcher * gnc_gen_trans_list_new(GtkWidget *parent, const gchar *heading, bool all_from_same_account, gint match_date_hardlimit, bool show_all)
Create a new generic transaction dialog window and return it.
guint32 gnc_import_TransInfo_get_ref_id(const GNCImportTransInfo *info)
Returns the reference id for this TransInfo.
void gnc_gen_trans_list_add_trans(GNCImportMainMatcher *gui, Transaction *trans)
Add a newly imported Transaction to the Transaction Importer.
void gnc_gen_trans_list_add_tp_cb(GNCImportMainMatcher *info, GNCTransactionProcessedCB trans_processed_cb, gpointer user_data)
Add transaction processed callback to the transaction importer.
void gnc_gen_trans_list_show_all(GNCImportMainMatcher *info)
Shows widgets.
void gnc_gen_trans_list_add_trans_with_ref_id(GNCImportMainMatcher *gui, Transaction *trans, guint32 ref_id)
Add a newly imported Transaction to the Transaction Importer and provide an external reference id for...
Account * gnc_import_select_account(GtkWidget *parent, const gchar *account_online_id_value, gboolean prompt_on_no_match, const gchar *account_human_description, const gnc_commodity *new_account_default_commodity, GNCAccountType new_account_default_type, Account *default_selection, gboolean *ok_pressed)
Must be called with a string containing a unique identifier for the account.
GtkWidget * gnc_gen_trans_list_widget(GNCImportMainMatcher *info)
Returns the widget of this dialog.
bool gnc_gen_trans_list_run(GNCImportMainMatcher *info)
Run this dialog and return only after the user pressed Ok, Cancel, or closed the window.
#define PINFO(format, args...)
Print an informational note.
gnc_numeric double_to_gnc_numeric(double in, gint64 denom, gint how)
Convert a floating-point number to a gnc_numeric.
gboolean gnc_numeric_equal(gnc_numeric a, gnc_numeric b)
Equivalence predicate: Returns TRUE (1) if a and b represent the same number.
@ GNC_HOW_RND_ROUND_HALF_UP
Round to the nearest integer, rounding away from zero when there are two equidistant nearest integers...
gboolean gnc_prefs_get_bool(const gchar *group, const gchar *pref_name)
Get a boolean value from the preferences backend.
void xaccSplitSetMemo(Split *split, const char *memo)
The memo is an arbitrary string associated with a split.
Split * xaccMallocSplit(QofBook *book)
Constructor.
void xaccSplitSetOnlineID(Split *split, const char *id)
The online_id is the OFX/HBCI "FITID" recorded on a split when it is imported.
void xaccSplitSetBaseValue(Split *s, gnc_numeric value, const gnc_commodity *base_currency)
Depending on the base_currency, set either the value or the amount of this split or both: If the base...
Generic and very flexible account matcher/picker.
Transaction matcher main window.