diff --git a/src/base-typemaps.i b/src/base-typemaps.i index 727949fb05..187b64ea63 100644 --- a/src/base-typemaps.i +++ b/src/base-typemaps.i @@ -72,23 +72,23 @@ typedef char gchar; %typemap(in) time64 * (time64 t) "t = scm_to_int64($input); $1 = &t;" %typemap(out) time64 * " $result = ($1) ? scm_from_int64(*($1)) : SCM_BOOL_F; " -%typemap(in) struct tm * { +%typemap(in) struct tm * (struct tm t) { SCM tm = $input; - struct tm t = { - scm_to_int(SCM_SIMPLE_VECTOR_REF(tm, 0)), - scm_to_int(SCM_SIMPLE_VECTOR_REF(tm, 1)), - scm_to_int(SCM_SIMPLE_VECTOR_REF(tm, 2)), - scm_to_int(SCM_SIMPLE_VECTOR_REF(tm, 3)), - scm_to_int(SCM_SIMPLE_VECTOR_REF(tm, 4)), - scm_to_int(SCM_SIMPLE_VECTOR_REF(tm, 5)), - scm_to_int(SCM_SIMPLE_VECTOR_REF(tm, 6)), - scm_to_int(SCM_SIMPLE_VECTOR_REF(tm, 7)), - scm_to_int(SCM_SIMPLE_VECTOR_REF(tm, 8)), -#ifdef HAVE_STRUCT_TM_GMTOFF - scm_to_int(SCM_SIMPLE_VECTOR_REF(tm, 9)), - scm_to_locale_string(SCM_SIMPLE_VECTOR_REF(tm, 10)), -#endif - }; + SCM zone; + t.tm_sec = scm_to_int(SCM_SIMPLE_VECTOR_REF(tm, 0)); + t.tm_min = scm_to_int(SCM_SIMPLE_VECTOR_REF(tm, 1)); + t.tm_hour = scm_to_int(SCM_SIMPLE_VECTOR_REF(tm, 2)); + t.tm_mday = scm_to_int(SCM_SIMPLE_VECTOR_REF(tm, 3)); + t.tm_mon = scm_to_int(SCM_SIMPLE_VECTOR_REF(tm, 4)); + t.tm_year = scm_to_int(SCM_SIMPLE_VECTOR_REF(tm, 5)); + t.tm_wday = scm_to_int(SCM_SIMPLE_VECTOR_REF(tm, 6)); + t.tm_yday = scm_to_int(SCM_SIMPLE_VECTOR_REF(tm, 7)); + t.tm_isdst = scm_to_int(SCM_SIMPLE_VECTOR_REF(tm, 8)); +%#ifdef HAVE_STRUCT_TM_GMTOFF + t.tm_gmtoff = scm_to_int(SCM_SIMPLE_VECTOR_REF(tm, 9)); + zone = SCM_SIMPLE_VECTOR_REF(tm, 10); + t.tm_zone = SCM_UNBNDP(zone) ? NULL : scm_to_locale_string(zone); +%#endif $1 = &t; } @@ -104,15 +104,38 @@ typedef char gchar; SCM_SIMPLE_VECTOR_SET(tm, 6, scm_from_int(t->tm_wday)); SCM_SIMPLE_VECTOR_SET(tm, 7, scm_from_int(t->tm_yday)); SCM_SIMPLE_VECTOR_SET(tm, 8, scm_from_int(t->tm_isdst)); -#ifdef HAVE_STRUCT_TM_GMTOFF +%#ifdef HAVE_STRUCT_TM_GMTOFF SCM_SIMPLE_VECTOR_SET(tm, 9, scm_from_long(t->tm_gmtoff)); - SCM_SIMPLE_VECTOR_SET(tm, 10, scm_from_locale_string(t->tm_zone)); -#else + SCM_SIMPLE_VECTOR_SET(tm, 10, scm_from_locale_string(t->tm_zone?t->tm_zone:"Unset")); +%#else SCM_SIMPLE_VECTOR_SET(tm, 9, scm_from_long(0)); SCM_SIMPLE_VECTOR_SET(tm, 10, scm_from_locale_string("GMT")); -#endif +%#endif $result = tm; } + +%typemap(newfree) struct tm * "gnc_tm_free($1);" + +%typemap(argout) struct tm * { + struct tm* t = $1; + SCM tm = $input; + SCM_SIMPLE_VECTOR_SET(tm, 0, scm_from_int(t->tm_sec)); + SCM_SIMPLE_VECTOR_SET(tm, 1, scm_from_int(t->tm_min)); + SCM_SIMPLE_VECTOR_SET(tm, 2, scm_from_int(t->tm_hour)); + SCM_SIMPLE_VECTOR_SET(tm, 3, scm_from_int(t->tm_mday)); + SCM_SIMPLE_VECTOR_SET(tm, 4, scm_from_int(t->tm_mon)); + SCM_SIMPLE_VECTOR_SET(tm, 5, scm_from_int(t->tm_year)); + SCM_SIMPLE_VECTOR_SET(tm, 6, scm_from_int(t->tm_wday)); + SCM_SIMPLE_VECTOR_SET(tm, 7, scm_from_int(t->tm_yday)); + SCM_SIMPLE_VECTOR_SET(tm, 8, scm_from_int(t->tm_isdst)); +%#ifdef HAVE_STRUCT_TM_GMTOFF + SCM_SIMPLE_VECTOR_SET(tm, 9, scm_from_long(t->tm_gmtoff)); + SCM_SIMPLE_VECTOR_SET(tm, 10, scm_from_locale_string(t->tm_zone?t->tm_zone:"Unset")); +%#else + SCM_SIMPLE_VECTOR_SET(tm, 9, scm_from_long(0)); + SCM_SIMPLE_VECTOR_SET(tm, 10, scm_from_locale_string("GMT")); +%#endif + } %define GLIST_HELPER_INOUT(ListType, ElemSwigType) %typemap(in) ListType * { diff --git a/src/doc/xml/gnucash-v2.rnc b/src/doc/xml/gnucash-v2.rnc index 7a66c92db3..752b03a3c6 100644 --- a/src/doc/xml/gnucash-v2.rnc +++ b/src/doc/xml/gnucash-v2.rnc @@ -199,7 +199,7 @@ Price = element price { # from the doc string of gnc_price_class_init in src/engine/gnc-pricedb.c - element price:type { "bid" | "ask" | "last" | "nav" | "unknown" }?, + element price:type { "bid" | "ask" | "last" | "nav" | "transaction" | "unknown" }?, element price:value { GncNumeric } } diff --git a/src/engine/engine.i b/src/engine/engine.i index 551ddfe594..55a158df37 100644 --- a/src/engine/engine.i +++ b/src/engine/engine.i @@ -108,6 +108,9 @@ functions. */ %newobject xaccSplitGetCorrAccountFullName; %newobject gnc_numeric_to_string; +%newobject gnc_localtime; +%newobject gnc_gmtime; + /* Parse the header file to generate wrappers */ %inline { static QofIdType QOF_ID_BOOK_SCM (void) { return QOF_ID_BOOK; } @@ -166,6 +169,7 @@ QofBook * qof_session_get_book (QofSession *session); const char *qof_session_get_url (QofSession *session); %ignore qof_print_date_time_buff; +%ignore gnc_tm_free; %include extern const char *gnc_default_strftime_date_format; diff --git a/src/engine/gnc-pricedb.c b/src/engine/gnc-pricedb.c index 45adba3598..6a29aab880 100644 --- a/src/engine/gnc-pricedb.c +++ b/src/engine/gnc-pricedb.c @@ -263,7 +263,8 @@ gnc_price_class_init(GNCPriceClass *klass) "Quote type", "The quote type is a string describing the " "type of a price quote. Types possible now " - "are 'bid', 'ask', 'last', 'nav' and 'unknown'.", + "are 'bid', 'ask', 'last', 'nav', 'transaction', " + "and 'unknown'.", NULL, G_PARAM_READWRITE)); diff --git a/src/engine/gnc-pricedb.h b/src/engine/gnc-pricedb.h index 002cd51e60..1f8670d31c 100644 --- a/src/engine/gnc-pricedb.h +++ b/src/engine/gnc-pricedb.h @@ -116,8 +116,10 @@ GType gnc_pricedb_get_type(void); many strings in users' databases, so this string must be translated on output instead of always being used in untranslated form). - - type: the type of quote - types possible right now are bid, ask, - last, nav, and unknown. + - type: the type of quote - types possible right now are bid, ask, last, + nav, transaction, and unknown. 'Transaction' is set when the price is + created from an amount and value in a Split and is not available for users + to set via the GUI. \par Implementation Details: diff --git a/src/import-export/aqb/dialog-ab.glade b/src/import-export/aqb/dialog-ab.glade index 543e06dba1..b5c4ee3b82 100644 --- a/src/import-export/aqb/dialog-ab.glade +++ b/src/import-export/aqb/dialog-ab.glade @@ -852,6 +852,25 @@ 12 + + + Use Non-SWIFT _transaction text + True + True + True + False + True + True + + + 4 + 3 + 4 + GTK_FILL + + 12 + + _Verbose debug messages @@ -864,8 +883,8 @@ 4 - 3 - 4 + 4 + 5 GTK_FILL 12 diff --git a/src/import-export/aqb/gnc-ab-utils.c b/src/import-export/aqb/gnc-ab-utils.c index 48c6845d90..131481cb9e 100644 --- a/src/import-export/aqb/gnc-ab-utils.c +++ b/src/import-export/aqb/gnc-ab-utils.c @@ -321,7 +321,7 @@ join_ab_strings_cb(const gchar *str, gpointer user_data) if (!str || !*str) return NULL; - + tmp = g_strdup(str); g_strstrip(tmp); gnc_utf8_strip_invalid(tmp); @@ -366,10 +366,21 @@ gchar * gnc_ab_get_purpose(const AB_TRANSACTION *ab_trans) { const GWEN_STRINGLIST *ab_purpose; + const char *ab_transactionText = NULL; gchar *gnc_description = NULL; g_return_val_if_fail(ab_trans, g_strdup("")); + if (gnc_prefs_get_bool(GNC_PREFS_GROUP_AQBANKING, GNC_PREF_USE_TRANSACTION_TXT)) + { + /* According to AqBanking, some of the non-swift lines have a special + * meaning. Some banks place valuable text into the transaction text, + * hence we put this text in front of the purpose. */ + ab_transactionText = AB_Transaction_GetTransactionText(ab_trans); + if (ab_transactionText) + gnc_description = g_strdup(ab_transactionText); + } + ab_purpose = AB_Transaction_GetPurpose(ab_trans); if (ab_purpose) GWEN_StringList_ForEach(ab_purpose, join_ab_strings_cb, diff --git a/src/import-export/aqb/gnc-ab-utils.h b/src/import-export/aqb/gnc-ab-utils.h index feec881d06..ca7153dec4 100644 --- a/src/import-export/aqb/gnc-ab-utils.h +++ b/src/import-export/aqb/gnc-ab-utils.h @@ -70,11 +70,12 @@ G_BEGIN_DECLS # define AQBANKING_VERSION_4_EXACTLY #endif -#define GNC_PREFS_GROUP_AQBANKING "dialogs.import.hbci" -#define GNC_PREF_FORMAT_SWIFT940 "format-swift-mt940" -#define GNC_PREF_FORMAT_SWIFT942 "format-swift-mt942" -#define GNC_PREF_FORMAT_DTAUS "format-dtaus" -#define GNC_PREF_VERBOSE_DEBUG "verbose-debug" +#define GNC_PREFS_GROUP_AQBANKING "dialogs.import.hbci" +#define GNC_PREF_FORMAT_SWIFT940 "format-swift-mt940" +#define GNC_PREF_FORMAT_SWIFT942 "format-swift-mt942" +#define GNC_PREF_FORMAT_DTAUS "format-dtaus" +#define GNC_PREF_USE_TRANSACTION_TXT "use-ns-transaction-text" +#define GNC_PREF_VERBOSE_DEBUG "verbose-debug" typedef struct _GncABImExContextImport GncABImExContextImport; diff --git a/src/import-export/aqb/gschemas/org.gnucash.dialogs.import.hbci.gschema.xml.in.in b/src/import-export/aqb/gschemas/org.gnucash.dialogs.import.hbci.gschema.xml.in.in index f12289c392..4eccf0f59c 100644 --- a/src/import-export/aqb/gschemas/org.gnucash.dialogs.import.hbci.gschema.xml.in.in +++ b/src/import-export/aqb/gschemas/org.gnucash.dialogs.import.hbci.gschema.xml.in.in @@ -20,6 +20,11 @@ Remember the PIN in memory If active, the PIN for HBCI/AqBanking actions will be remembered in memory during a session. Otherwise it will have to be entered again each time during a session when it is needed. + + true + Put the transaction text in front of the purpose of a transaction. + Some banks place part of transaction description as "transaction text" in the MT940 file. Normally GNUcash ignores this text. However by activating this option, the transaction text is used for the transaction description too. + false Verbose HBCI debug messages