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" 54 #include "engine-helpers.h" 55 #include <aqbanking/gui/abgui.h> 58 G_GNUC_UNUSED
static QofLogModule log_module =
G_LOG_DOMAIN;
61 static AB_BANKING *gnc_AB_BANKING = NULL;
62 static gint gnc_AB_BANKING_refcount = 0;
64 static gpointer join_ab_strings_cb (
const gchar *str, gpointer user_data);
65 static Account *gnc_ab_accinfo_to_gnc_acc (GtkWidget *parent,
66 AB_IMEXPORTER_ACCOUNTINFO *account_info);
67 static Account *gnc_ab_txn_to_gnc_acc (GtkWidget *parent,
68 const AB_TRANSACTION *transaction);
69 static const AB_TRANSACTION *txn_transaction_cb (
const AB_TRANSACTION *element,
71 static AB_IMEXPORTER_ACCOUNTINFO *txn_accountinfo_cb (AB_IMEXPORTER_ACCOUNTINFO *element,
73 static AB_IMEXPORTER_ACCOUNTINFO *bal_accountinfo_cb (AB_IMEXPORTER_ACCOUNTINFO *element,
81 GNC_AB_ACCOUNT_SPEC *ab_acc;
82 gboolean execute_txns;
85 GNC_AB_JOB_LIST2 *job_list;
86 GNCImportMainMatcher *generic_importer;
90 static inline gboolean is_leap_year (
int year)
92 return (year % 400 == 0 || (year % 4 == 0 && year % 100 != 0 ));
96 gnc_gwen_date_to_time64 (
const GNC_GWEN_DATE* date)
98 int day = GWEN_Date_GetDay (date);
99 int month = GWEN_Date_GetMonth (date);
100 int year = GWEN_Date_GetYear (date);
107 while (month == 2 && day <= 30 && day > (is_leap_year (year) ? 29 : 28))
115 gchar* gwen_logging = g_strdup (g_getenv (
"GWEN_LOGLEVEL"));
116 gchar* aqb_logging = g_strdup (g_getenv (
"AQBANKING_LOGLEVEL"));
126 GWEN_Logger_SetLevel (NULL, GWEN_LoggerLevel_Info);
127 GWEN_Logger_SetLevel (GWEN_LOGDOMAIN, GWEN_LoggerLevel_Info);
130 GWEN_Logger_SetLevel (AQBANKING_LOGDOMAIN, GWEN_LoggerLevel_Debug);
136 GWEN_Logger_SetLevel (NULL, GWEN_LoggerLevel_Error);
137 GWEN_Logger_SetLevel (GWEN_LOGDOMAIN, GWEN_LoggerLevel_Error);
140 GWEN_Logger_SetLevel (AQBANKING_LOGDOMAIN, GWEN_LoggerLevel_Warning);
142 g_free (gwen_logging);
143 g_free (aqb_logging);
152 GWEN_Logger_SetLevel (NULL, GWEN_LoggerLevel_Error);
153 GWEN_Logger_SetLevel (GWEN_LOGDOMAIN, GWEN_LoggerLevel_Warning);
154 GWEN_Logger_SetLevel (AQBANKING_LOGDOMAIN, GWEN_LoggerLevel_Warning);
160 static GWEN_GUI *gnc_gwengui_extended_by_ABBanking;
170 api = gnc_AB_BANKING;
173 if (gnc_AB_BANKING_refcount == 0)
174 g_return_val_if_fail (AB_Banking_Init (api) == 0, NULL);
179 api = AB_Banking_new (PROJECT_NAME, NULL, 0);
180 g_return_val_if_fail (api, NULL);
188 AB_Banking_RuntimeConfig_SetCharValue (api,
"fintsRegistrationKey",
"412748A1836CDD07181CE1910");
189 AB_Banking_RuntimeConfig_SetCharValue (api,
"fintsApplicationVersionString", PROJECT_VERSION);
192 g_return_val_if_fail (AB_Banking_Init (api) == 0, NULL);
193 gnc_gwengui_extended_by_ABBanking = GWEN_Gui_GetGui ();
194 AB_Gui_Extend (gnc_gwengui_extended_by_ABBanking, api);
197 gnc_AB_BANKING = api;
198 gnc_AB_BANKING_refcount = 0;
201 gnc_AB_BANKING_refcount++;
210 api = gnc_AB_BANKING;
214 if (api == gnc_AB_BANKING)
216 gnc_AB_BANKING = NULL;
220 AB_Banking_free (api);
228 if (api == gnc_AB_BANKING)
230 if (--gnc_AB_BANKING_refcount == 0)
232 if (gnc_gwengui_extended_by_ABBanking)
233 AB_Gui_Unextend (gnc_gwengui_extended_by_ABBanking);
234 gnc_gwengui_extended_by_ABBanking = NULL;
235 return AB_Banking_Fini (api);
240 if (gnc_gwengui_extended_by_ABBanking)
241 AB_Gui_Unextend (gnc_gwengui_extended_by_ABBanking);
242 gnc_gwengui_extended_by_ABBanking = NULL;
243 return AB_Banking_Fini (api);
248 GNC_AB_ACCOUNT_SPEC *
251 GNC_AB_ACCOUNT_SPEC *ab_account = NULL;
252 const gchar *bankcode = NULL;
253 const gchar *accountid = NULL;
254 guint32 account_uid = 0;
264 rv = AB_Banking_GetAccountSpecByUniqueId (api, account_uid, &ab_account);
266 if ( (rv<0 || !ab_account) && bankcode && *bankcode &&
267 accountid && *accountid)
272 PINFO(
"gnc_ab_get_ab_account: No AB_ACCOUNT found for UID %d, " 273 "trying bank code\n", account_uid);
286 return g_strdup_printf (
"%.2f %s",
287 AB_Value_GetValueAsDouble (value),
288 AB_Value_GetCurrency (value));
290 return g_strdup_printf (
"%.2f", 0.0);
305 while (accountnumber && *accountnumber ==
'0')
308 online_id = g_strconcat (bankcode ? bankcode :
"",
309 accountnumber ? accountnumber :
"",
320 join_ab_strings_cb (
const gchar *str, gpointer user_data)
322 gchar **acc = user_data;
328 tmp = g_strdup (str);
334 gchar *join = g_strjoin (
" ", *acc, tmp, (gchar*) NULL);
349 const char* ab_remote_name;
350 gchar *gnc_other_name = NULL;
352 g_return_val_if_fail (ab_trans, NULL);
354 ab_remote_name = AB_Transaction_GetRemoteName (ab_trans);
356 gnc_other_name = g_strdup(ab_remote_name);
357 if (!gnc_other_name || !*gnc_other_name)
359 g_free (gnc_other_name);
360 gnc_other_name = NULL;
363 return gnc_other_name;
369 GWEN_STRINGLIST *ab_purpose;
370 const char *ab_transactionText = NULL;
371 gchar *gnc_description = NULL;
373 g_return_val_if_fail (ab_trans, g_strdup (
""));
375 if (!is_ofx &&
gnc_prefs_get_bool (GNC_PREFS_GROUP_AQBANKING, GNC_PREF_USE_TRANSACTION_TXT))
380 ab_transactionText = AB_Transaction_GetTransactionText (ab_trans);
381 if (ab_transactionText && *ab_transactionText)
382 gnc_description = g_strdup (ab_transactionText);
385 ab_purpose = AB_Transaction_GetPurposeAsStringList (ab_trans);
387 GWEN_StringList_ForEach (ab_purpose, join_ab_strings_cb,
390 GWEN_StringList_free (ab_purpose);
392 return gnc_description;
402 ab_ultimate_creditor_debtor_to_gnc (
const AB_TRANSACTION *ab_trans,
405 const gchar* ultimate;
410 ultimate = AB_Transaction_GetUltimateCreditor (ab_trans);
412 if (!ultimate || !*ultimate)
413 ultimate = AB_Transaction_GetUltimateDebtor (ab_trans);
415 if (!ultimate || !*ultimate)
418 return g_strdup (ultimate);
429 acc = g_list_prepend (acc, ab_ultimate_creditor_debtor_to_gnc (ab_trans, is_ofx));
432 g_list_free_full (acc, g_free);
433 return retval ? retval : g_strdup (_(
"Unspecified"));
439 const gchar *ab_remote_accountnumber =
440 AB_Transaction_GetRemoteAccountNumber (ab_trans);
441 const gchar *ab_remote_bankcode =
442 AB_Transaction_GetRemoteBankCode (ab_trans);
444 gchar *ab_other_accountid;
445 gchar *ab_other_bankcode;
447 gboolean have_accountid;
448 gboolean have_bankcode;
453 if (!ab_remote_accountnumber)
454 ab_remote_accountnumber = AB_Transaction_GetRemoteIban (ab_trans);
455 if (!ab_remote_bankcode)
456 ab_remote_bankcode = AB_Transaction_GetRemoteBic (ab_trans);
458 ab_other_accountid = g_strdup (ab_remote_accountnumber ? ab_remote_accountnumber :
"");
459 ab_other_bankcode = g_strdup (ab_remote_bankcode ? ab_remote_bankcode :
"");
466 g_strstrip (ab_other_accountid);
467 g_strstrip (ab_other_bankcode);
470 have_accountid = ab_other_accountid && *ab_other_accountid;
471 have_bankcode = ab_other_bankcode && *ab_other_bankcode;
473 if ( have_accountid || have_bankcode )
475 retval = g_strdup_printf (
"%s %s %s %s",
476 have_accountid ? _(
"Account") :
"",
477 have_accountid ? ab_other_accountid :
"",
478 have_bankcode ? _(
"Bank") :
"",
479 have_bankcode ? ab_other_bankcode :
"" 485 retval = g_strdup (
"");
488 g_free (ab_other_accountid);
489 g_free (ab_other_bankcode);
498 Transaction *gnc_trans;
500 const GNC_GWEN_DATE *value_date, *post_date;
507 g_return_val_if_fail (ab_trans && gnc_acc, NULL);
510 book = gnc_account_get_book (gnc_acc);
525 value_date = AB_Transaction_GetValutaDate (ab_trans);
527 post_time = gnc_gwen_date_to_time64 (value_date);
528 else if ((post_date = AB_Transaction_GetDate (ab_trans)))
529 post_time = gnc_gwen_date_to_time64 (post_date);
532 g_warning (
"transaction_cb: Import had no transaction date");
545 fitid = AB_Transaction_GetFiId (ab_trans);
550 g_free (description);
558 xaccSplitSetParent (split, gnc_trans);
559 xaccSplitSetAccount (split, gnc_acc);
563 custref = AB_Transaction_GetCustomerReference (ab_trans);
564 if (custref && *custref && g_ascii_strncasecmp (custref,
"NONREF", 6) != 0)
565 gnc_set_num_action (gnc_trans, split, custref, NULL);
569 gnc_import_set_split_online_id (split, fitid);
574 const AB_VALUE *ab_value = AB_Transaction_GetValue (ab_trans);
575 double d_value = ab_value ? AB_Value_GetValueAsDouble (ab_value) : 0.0;
576 AB_TRANSACTION_TYPE ab_type = AB_Transaction_GetType (ab_trans);
577 gnc_numeric gnc_amount;
583 if (d_value > 0.0 && ab_type == AB_Transaction_TypeTransfer)
591 g_warning (
"transaction_cb: Oops, value was NULL. Using 0");
612 gnc_ab_accinfo_to_gnc_acc (GtkWidget *parent, AB_IMEXPORTER_ACCOUNTINFO *acc_info)
614 const gchar *bankcode, *accountnumber;
618 g_return_val_if_fail (acc_info, NULL);
620 bankcode = AB_ImExporterAccountInfo_GetBankCode (acc_info);
621 accountnumber = AB_ImExporterAccountInfo_GetAccountNumber (acc_info);
624 AB_ImExporterAccountInfo_GetAccountName (acc_info),
628 g_warning (
"gnc_ab_accinfo_to_gnc_acc: Could not determine source account" 629 " for online_id %s", online_id);
646 gnc_ab_txn_to_gnc_acc (GtkWidget *parent,
const AB_TRANSACTION *transaction)
648 const gchar *bankcode, *accountnumber;
652 g_return_val_if_fail(transaction, NULL);
654 bankcode = AB_Transaction_GetLocalBankCode (transaction);
655 accountnumber = AB_Transaction_GetLocalAccountNumber (transaction);
656 if (!bankcode && !accountnumber)
663 AB_Transaction_GetLocalName (transaction),
667 g_warning (
"gnc_ab_txn_to_gnc_acc: Could not determine source account" 668 " for online_id %s", online_id);
675 static const AB_TRANSACTION *
676 txn_transaction_cb (
const AB_TRANSACTION *element, gpointer user_data)
678 GncABImExContextImport *data = user_data;
679 Transaction *gnc_trans;
680 GncABTransType trans_type;
683 g_return_val_if_fail (element && data, NULL);
686 txnacc = gnc_ab_txn_to_gnc_acc (GTK_WIDGET(data->parent), element);
689 if (data->execute_txns && data->ab_acc)
691 AB_TRANSACTION *ab_trans = AB_Transaction_dup (element);
696 AB_Transaction_SetLocalBankCode (
697 ab_trans, AB_AccountSpec_GetBankCode (data->ab_acc));
698 AB_Transaction_SetLocalAccountNumber (
699 ab_trans, AB_AccountSpec_GetAccountNumber (data->ab_acc));
700 AB_Transaction_SetLocalCountry (ab_trans,
"DE");
703 switch (AB_Transaction_GetType (ab_trans))
705 case AB_Transaction_TypeDebitNote:
706 trans_type = SINGLE_DEBITNOTE;
708 case AB_Transaction_TypeTransaction:
711 case AB_Transaction_TypeTransfer:
713 trans_type = SEPA_TRANSFER;
720 if (!job || AB_AccountSpec_GetTransactionLimitsForCommand (data->ab_acc, AB_Transaction_GetCommand (job)) == NULL)
723 if (gnc_verify_dialog (
724 GTK_WINDOW(data->parent), FALSE,
"%s",
725 _(
"The backend found an error during the preparation " 726 "of the job. It is not possible to execute this job.\n" 728 "Most probably the bank does not support your chosen " 729 "job or your Online Banking account does not have the permission " 730 "to execute this job. More error messages might be " 731 "visible on your console log.\n" 733 "Do you want to enter the job again?")))
735 gnc_error_dialog (GTK_WINDOW(data->parent),
736 "Sorry, not implemented yet. Please check the console or trace file logs to see which job was rejected.");
743 AB_Transaction_GetUniqueId (job));
747 AB_Transaction_free (ab_trans);
758 static void gnc_ab_trans_processed_cb (GNCImportTransInfo *trans_info,
762 GncABImExContextImport *data = user_data;
764 GNC_AB_JOB *job = g_datalist_get_data (&data->tmp_job_list, jobname);
768 AB_Transaction_List2_PushBack (data->job_list, job);
772 AB_Transaction_free (job);
775 g_datalist_remove_data (&data->tmp_job_list, jobname);
793 return g_strdup_printf (
"job_%lu", job_id);
798 static AB_IMEXPORTER_ACCOUNTINFO *
799 txn_accountinfo_cb (AB_IMEXPORTER_ACCOUNTINFO *element, gpointer user_data)
801 GncABImExContextImport *data = user_data;
804 g_return_val_if_fail (element && data, NULL);
806 if (data->awaiting & IGNORE_TRANSACTIONS)
810 if (!AB_ImExporterAccountInfo_GetFirstTransaction (element, AB_Transaction_TypeStatement, 0))
814 data->awaiting |= FOUND_TRANSACTIONS;
816 if (!(data->awaiting & AWAIT_TRANSACTIONS))
818 if (gnc_verify_dialog (GTK_WINDOW(data->parent), TRUE,
"%s",
819 _(
"The bank has sent transaction information " 822 "Do you want to import it?")))
824 data->awaiting |= AWAIT_TRANSACTIONS;
828 data->awaiting |= IGNORE_TRANSACTIONS;
834 gnc_acc = gnc_ab_accinfo_to_gnc_acc (GTK_WIDGET(data->parent), element);
835 if (!gnc_acc)
return NULL;
836 data->gnc_acc = gnc_acc;
838 if (data->execute_txns)
845 gnc_error_dialog (GTK_WINDOW(data->parent),
"%s",
846 _(
"No Online Banking account found for this " 847 "gnucash account. These transactions will " 848 "not be executed by Online Banking."));
856 if (!data->generic_importer)
860 if (data->execute_txns)
863 gnc_ab_trans_processed_cb, data);
869 AB_TRANSACTION_LIST *ab_trans_list = AB_ImExporterAccountInfo_GetTransactionList (element);
871 AB_Transaction_List_ForEachByType (ab_trans_list,
872 txn_transaction_cb, data,
873 AB_Transaction_TypeStatement, 0);
878 static AB_IMEXPORTER_ACCOUNTINFO *
879 bal_accountinfo_cb (AB_IMEXPORTER_ACCOUNTINFO *element, gpointer user_data)
881 GncABImExContextImport *data = user_data;
883 const AB_BALANCE *booked_bal, *noted_bal;
884 const AB_VALUE *booked_val = NULL, *noted_val = NULL;
885 gdouble booked_value, noted_value;
889 gboolean show_recn_window = FALSE;
891 g_return_val_if_fail (element && data, NULL);
893 if (data->awaiting & IGNORE_BALANCES)
897 if (!AB_ImExporterAccountInfo_GetFirstBalance (element))
901 data->awaiting |= FOUND_BALANCES;
904 booked_bal = AB_Balance_List_GetLatestByType (AB_ImExporterAccountInfo_GetBalanceList (element),
905 AB_Balance_TypeBooked);
907 if (!(data->awaiting & AWAIT_BALANCES))
909 GtkWindow *parent = data->generic_importer ?
911 GTK_WINDOW(data->parent);
912 const char* balance_msg =
913 _(
"The bank has sent balance information in its response.\n" 914 "Do you want to import it?");
916 if (!booked_bal || AB_Value_IsZero (AB_Balance_GetValue (booked_bal)))
920 if (gnc_verify_dialog (parent, TRUE,
"%s", balance_msg))
922 data->awaiting |= AWAIT_BALANCES;
926 data->awaiting |= IGNORE_BALANCES;
932 gnc_acc = gnc_ab_accinfo_to_gnc_acc (GTK_WIDGET(data->parent), element);
933 if (!gnc_acc)
return NULL;
934 data->gnc_acc = gnc_acc;
939 const GWEN_DATE *ti = AB_Balance_GetDate (booked_bal);
942 booked_tt = gnc_gwen_date_to_time64 (ti);
950 booked_val = AB_Balance_GetValue (booked_bal);
953 booked_value = AB_Value_GetValueAsDouble (booked_val);
957 g_warning (
"bal_accountinfo_cb: booked_val == NULL. Assuming 0");
963 g_warning (
"bal_accountinfo_cb: booked_bal == NULL. Assuming 0");
969 noted_bal = AB_Balance_List_GetLatestByType (AB_ImExporterAccountInfo_GetBalanceList (element),
970 AB_Balance_TypeNoted);
973 noted_val = AB_Balance_GetValue (noted_bal);
975 noted_value = AB_Value_GetValueAsDouble (noted_val);
978 g_warning (
"bal_accountinfo_cb: noted_val == NULL. Assuming 0");
984 g_warning (
"bal_accountinfo_cb: noted_bal == NULL. Assuming 0");
991 if (noted_value == 0.0 && booked_value == 0.0)
993 dialog = gtk_message_dialog_new (
994 GTK_WINDOW(data->parent),
995 GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
1006 _(
"The downloaded Online Banking Balance was zero.\n\n" 1007 "Either this is the correct balance, or your bank does not " 1008 "support Balance download in this Online Banking version. " 1009 "In the latter case you should choose a different " 1010 "Online Banking version number in the Online Banking " 1011 "(AqBanking or HBCI) Setup. After that, try again to " 1012 "download the Online Banking Balance."));
1013 gtk_dialog_run (GTK_DIALOG(dialog));
1014 gtk_widget_destroy (dialog);
1022 gchar *message1 = g_strdup_printf (
1023 _(
"Result of Online Banking job:\n" 1024 "Account booked balance is %s"),
1027 (noted_value == 0.0) ?
1029 g_strdup_printf (_(
"For your information: This account also " 1030 "has a noted balance of %s\n"),
1035 const gchar *message3 =
1036 _(
"The booked balance is identical to the current " 1037 "reconciled balance of the account.");
1038 dialog = gtk_message_dialog_new (
1039 GTK_WINDOW(data->parent),
1040 GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
1044 message1, message2, message3);
1045 gtk_dialog_run (GTK_DIALOG(dialog));
1046 gtk_widget_destroy (GTK_WIDGET(dialog));
1051 const char *message3 = _(
"Reconcile account now?");
1053 show_recn_window = gnc_verify_dialog (GTK_WINDOW(data->parent), TRUE,
"%s\n%s\n%s",
1054 message1, message2, message3);
1056 g_free (booked_str);
1062 if (show_recn_window)
1063 recnWindowWithBalance (GTK_WIDGET(data->parent), gnc_acc, value, booked_tt);
1068 GncABImExContextImport *
1070 guint awaiting, gboolean execute_txns,
1071 AB_BANKING *api, GtkWidget *parent)
1073 GncABImExContextImport *data = g_new (GncABImExContextImport, 1);
1074 AB_IMEXPORTER_ACCOUNTINFO_LIST *ab_ail;
1075 g_return_val_if_fail (context, NULL);
1077 g_return_val_if_fail (!(awaiting & AWAIT_BALANCES)
1078 || !(awaiting & IGNORE_BALANCES),
1080 g_return_val_if_fail (!(awaiting & AWAIT_TRANSACTIONS)
1081 || !(awaiting & IGNORE_TRANSACTIONS),
1084 g_return_val_if_fail (awaiting & AWAIT_TRANSACTIONS || !execute_txns, NULL);
1086 g_return_val_if_fail (!execute_txns || api, NULL);
1088 data->awaiting = awaiting;
1089 data->txn_found = FALSE;
1090 data->execute_txns = execute_txns;
1092 data->parent = parent;
1093 data->job_list = AB_Transaction_List2_new ();
1094 data->tmp_job_list = NULL;
1095 data->generic_importer = NULL;
1097 g_datalist_init (&data->tmp_job_list);
1100 ab_ail = AB_ImExporterContext_GetAccountInfoList (context);
1101 if (ab_ail && AB_ImExporterAccountInfo_List_GetCount (ab_ail))
1103 if (!(awaiting & IGNORE_TRANSACTIONS))
1104 AB_ImExporterAccountInfo_List_ForEach (ab_ail,
1109 if (data->generic_importer)
1113 if (!(awaiting & IGNORE_BALANCES))
1114 AB_ImExporterAccountInfo_List_ForEach (ab_ail,
1121 AB_MESSAGE * bankmsg = AB_ImExporterContext_GetFirstMessage (context);
1124 const char* subject = AB_Message_GetSubject (bankmsg);
1125 const char* text = AB_Message_GetText (bankmsg);
1126 gnc_info_dialog (GTK_WINDOW(data->parent),
"%s\n%s %s\n%s",
1127 _(
"The bank has sent a message in its response."),
1132 bankmsg = AB_Message_List_Next (bankmsg);
1142 g_return_val_if_fail (ieci, 0);
1144 return ieci->awaiting;
1150 g_return_val_if_fail (ieci, NULL);
1152 return ieci->job_list;
1158 g_return_val_if_fail (ieci, FALSE);
1167 GWEN_DB_NODE *perm_certs = NULL;
1170 g_return_val_if_fail (banking, NULL);
1171 rv = AB_Banking_LoadSharedConfig (banking,
"certs", &perm_certs);
1173 g_return_val_if_fail (rv >= 0, NULL);
1177 #if (AQBANKING_VERSION_INT >= 60400) 1179 gnc_ab_trans_templ_list_new_from_ref_accounts (GNC_AB_ACCOUNT_SPEC *ab_acc)
1181 GList *retval = NULL;
1182 AB_REFERENCE_ACCOUNT *ra;
1183 AB_REFERENCE_ACCOUNT_LIST *ral;
1184 GWEN_BUFFER *accNameForTemplate = GWEN_Buffer_new (0,120,0,0);
1185 gnc_numeric zero = gnc_numeric_zero ();
1188 ral = AB_AccountSpec_GetRefAccountList (ab_acc);
1189 ra = AB_ReferenceAccount_List_First (ral);
1195 const char *iban = AB_ReferenceAccount_GetIban (ra);
1196 const char *accName = AB_ReferenceAccount_GetAccountName (ra);
1197 GWEN_Buffer_Reset (accNameForTemplate);
1200 GWEN_Buffer_AppendString (accNameForTemplate, accName);
1201 GWEN_Buffer_AppendString (accNameForTemplate,
": ");
1203 GWEN_Buffer_AppendString (accNameForTemplate, iban);
1209 retval = g_list_prepend (retval, new_templ);
1210 ra = AB_ReferenceAccount_List_Next (ra);
1212 retval = g_list_reverse (retval);
1214 GWEN_Buffer_free (accNameForTemplate);
1222 return left ? (right ? g_strcmp0 (left->name, right->name) : -1) :
1229 GList* desc_list = NULL;
1230 GWEN_PLUGIN_DESCRIPTION_LIST2 *il =
1231 AB_Banking_GetImExporterDescrs (api);
1232 GWEN_PLUGIN_DESCRIPTION_LIST2_ITERATOR *ilit;
1233 g_return_val_if_fail (il, NULL);
1234 ilit = GWEN_PluginDescription_List2_First(il);
1236 for (GWEN_PLUGIN_DESCRIPTION *pd =
1237 GWEN_PluginDescription_List2Iterator_Data(ilit);
1239 pd = GWEN_PluginDescription_List2Iterator_Next(ilit))
1244 node->name = g_strdup(GWEN_PluginDescription_GetName(pd));
1245 node->descr = g_strdup(GWEN_PluginDescription_GetShortDescr(pd));
1246 desc_list = g_list_prepend (desc_list, node);
1248 GWEN_PluginDescription_List2_free(il);
1249 return g_list_sort (desc_list, (GCompareFunc)ab_node_pair_compare);
1255 GList* prof_list = NULL;
1256 GWEN_DB_NODE* db = AB_Banking_GetImExporterProfiles(api, importer_name);
1257 g_return_val_if_fail (db, NULL);
1259 for (GWEN_DB_NODE *profile = GWEN_DB_GetFirstGroup(db); profile;
1260 profile = GWEN_DB_GetNextGroup(profile))
1263 if (!profile)
continue;
1264 node->name = g_strdup(GWEN_DB_GetCharValue(profile,
"name", 0, NULL));
1265 node->descr = g_strdup(GWEN_DB_GetCharValue(profile,
"shortDescr", 0, NULL));
1266 prof_list = g_list_prepend (prof_list, node);
1268 return g_list_sort (prof_list, (GCompareFunc)ab_node_pair_compare);
Dialog for AqBanking transaction data.
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_create_online_id(const gchar *bankcode, const gchar *accountnumber)
Creates an online ID from bank code and account number.
gchar * gnc_ab_get_remote_name(const AB_TRANSACTION *ab_trans)
Retrieve the merged "remote name" fields from a transaction.
GList * gnc_ab_imexporter_list(AB_BANKING *api)
Retrieve the available AQBanking importers.
Transaction * xaccMallocTransaction(QofBook *book)
The xaccMallocTransaction() will malloc memory and initialize it.
gboolean gnc_numeric_equal(gnc_numeric a, gnc_numeric b)
Equivalence predicate: Returns TRUE (1) if a and b represent the same number.
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...
void xaccTransSetDatePostedSecsNormalized(Transaction *trans, time64 time)
This function sets the posted date of the transaction, specified by a time64 (see ctime(3))...
time64 gnc_dmy2time64_neutral(gint day, gint month, gint year)
Converts a day, month, and year to a time64 representing 11:00:00 UTC 11:00:00 UTC falls on the same ...
gnc_numeric double_to_gnc_numeric(double in, gint64 denom, gint how)
Convert a floating-point number to a gnc_numeric.
void gnc_gen_trans_list_show_all(GNCImportMainMatcher *info)
Shows widgets.
void gnc_GWEN_Gui_shutdown(void)
Free all memory related to both the full-blown and minimalistic GUI objects.
#define G_LOG_DOMAIN
Functions providing the SX List as a plugin page.
#define PINFO(format, args...)
Print an informational note.
int xaccAccountGetCommoditySCU(const Account *acc)
Return the SCU for the account.
gchar * gnc_ab_get_purpose(const AB_TRANSACTION *ab_trans, gboolean is_ofx)
Retrieve the merged purpose fields from a transaction.
void gnc_ab_trans_templ_set_amount(GncABTransTempl *t, gnc_numeric amount)
Replace the amount stored in a template.
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...
void xaccTransSetDescription(Transaction *trans, const char *desc)
Sets the transaction Description.
gchar * gnc_AB_JOB_ID_to_string(gulong job_id)
Return the job_id as string.
Transaction matcher main window.
void gnc_utf8_strip_invalid_and_controls(gchar *str)
Strip any non-utf8 characters and any control characters (everything < 0x20, , , ...
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 ...
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.
gboolean gnc_ab_ieci_run_matcher(GncABImExContextImport *ieci)
Run the generic transaction matcher dialog.
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_ab_trans_templ_set_recp_account(GncABTransTempl *t, const gchar *recp_account)
Replace the Account Number of the recipient stored in a template.
Generic and very flexible account matcher/picker.
GNC_AB_JOB_LIST2 * gnc_ab_ieci_get_job_list(GncABImExContextImport *ieci)
Extract the job list from data.
void gnc_ab_trans_templ_set_name(GncABTransTempl *t, const gchar *name)
Set the name of a template.
guint32 gnc_import_TransInfo_get_ref_id(const GNCImportTransInfo *info)
Returns the reference id for this TransInfo.
const gchar * gnc_ab_get_account_bankcode(const Account *a)
Return the bankcode string in the Account a.
void gnc_gen_trans_list_add_trans(GNCImportMainMatcher *gui, Transaction *trans)
Add a newly imported Transaction to the Transaction Importer.
GWEN_DB_NODE * gnc_ab_get_permanent_certs(void)
get the GWEN_DB_NODE from AqBanking configuration files
void xaccTransSetCurrency(Transaction *trans, gnc_commodity *curr)
Set a new currency on a transaction.
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.
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.
GncABTransTempl * gnc_ab_trans_templ_new()
Create a template with unset contents.
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...
GtkWidget * gnc_gen_trans_list_widget(GNCImportMainMatcher *info)
Returns the widget of this dialog.
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 xaccSplitSetMemo(Split *split, const char *memo)
The memo is an arbitrary string associated with a split.
gchar * gnc_AB_JOB_to_readable_string(const GNC_AB_JOB *job)
Return the job as string.
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.
AB_BANKING * gnc_AB_BANKING_new(void)
If there is a cached AB_BANKING object, return it initialized.
void gnc_utf8_strip_invalid(gchar *str)
Strip any non-UTF-8 characters from a string.
void xaccTransBeginEdit(Transaction *trans)
The xaccTransBeginEdit() method must be called before any changes are made to a transaction or any of...
gnc_numeric xaccAccountGetReconciledBalance(const Account *acc)
Get the current balance of the account, only including reconciled transactions.
GList * gnc_ab_imexporter_profile_list(AB_BANKING *api, const char *importer_name)
Retrieve the available format templates for an AQBanking importer.
gint gnc_AB_BANKING_fini(AB_BANKING *api)
Finish the AB_BANKING api.
Split * xaccMallocSplit(QofBook *book)
Constructor.
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...
Generic api to store and retrieve preferences.
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...
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.
void gnc_AB_BANKING_delete(AB_BANKING *api)
Delete the AB_BANKING api.
void gnc_GWEN_Fini(void)
Finalize the gwenhywfar library.
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.
gnc_commodity * xaccAccountGetCommodity(const Account *acc)
Get the account's commodity.
gboolean gnc_prefs_get_bool(const gchar *group, const gchar *pref_name)
Get a boolean value from the preferences backend.
bool gnc_gen_trans_list_run(GNCImportMainMatcher *info)
Run this dialog and return only after the user pressed Ok, Cancel, or closed the window.
Utility functions for writing import modules.
Round to the nearest integer, rounding away from zero when there are two equidistant nearest integers...
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.
time64 gnc_time(time64 *tbuf)
get the current time
gint64 time64
Most systems that are currently maintained, including Microsoft Windows, BSD-derived Unixes and Linux...
const gchar * gnc_ab_get_account_accountid(const Account *a)
Return accountid string in the Account a.
void xaccTransSetDateEnteredSecs(Transaction *trans, time64 secs)
Modify the date of when the transaction was entered.
void gnc_GWEN_Init(void)
Initialize the gwenhywfar library by calling GWEN_Init() and setting up gwenhywfar logging...
GUI callbacks for AqBanking.
guint gnc_ab_ieci_get_found(GncABImExContextImport *ieci)
Extract awaiting from data.
API for Transactions and Splits (journal entries)
void gnc_GWEN_Gui_log_init(void)
Hook our logging into the gwenhywfar logging framework by creating a minimalistic GWEN_GUI with only ...
AqBanking utility functions.
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...