Branch data Line data Source code
1 : : /********************************************************************\
2 : : * gnc-features.c -- manage GnuCash features table *
3 : : * Copyright (C) 2011 Derek Atkins <derek@ihtfp.com> *
4 : : * Copyright (C) 2012 Geert Janssens <geert@kobaltwit.be> *
5 : : * *
6 : : * This program is free software; you can redistribute it and/or *
7 : : * modify it under the terms of the GNU General Public License as *
8 : : * published by the Free Software Foundation; either version 2 of *
9 : : * the License, or (at your option) any later version. *
10 : : * *
11 : : * This program is distributed in the hope that it will be useful, *
12 : : * but WITHOUT ANY WARRANTY; without even the implied warranty of *
13 : : * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
14 : : * GNU General Public License for more details. *
15 : : * *
16 : : * You should have received a copy of the GNU General Public License*
17 : : * along with this program; if not, write to the Free Software *
18 : : * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. *
19 : : * *
20 : : \********************************************************************/
21 : :
22 : : #include <unordered_map>
23 : : #include <string>
24 : : #include <numeric>
25 : : #include <algorithm>
26 : :
27 : : #include <config.h>
28 : :
29 : : #include <glib.h>
30 : : #include <glib/gi18n.h>
31 : : #include "qofbook.h"
32 : : #include "qofbook.hpp"
33 : :
34 : : #include "gnc-features.h"
35 : :
36 : : static const FeaturesTable features_table
37 : : {
38 : : { GNC_FEATURE_CREDIT_NOTES, "Customer and vendor credit notes (requires at least GnuCash 2.5.0)" },
39 : : { GNC_FEATURE_NUM_FIELD_SOURCE, "User specifies source of 'num' field'; either transaction number or split action (requires at least GnuCash 2.5.0)" },
40 : : { GNC_FEATURE_KVP_EXTRA_DATA, "Extra data for addresses, jobs or invoice entries (requires at least GnuCash 2.6.4)" },
41 : : { GNC_FEATURE_GUID_BAYESIAN, "Use account GUID as key for Bayesian data (requires at least GnuCash 2.6.12)" },
42 : : { GNC_FEATURE_GUID_FLAT_BAYESIAN, "Use account GUID as key for bayesian data and store KVP flat (requires at least Gnucash 2.6.19)" },
43 : : { GNC_FEATURE_SQLITE3_ISO_DATES, "Use ISO formatted date-time strings in SQLite3 databases (requires at least GnuCash 2.6.20)"},
44 : : { GNC_FEATURE_REG_SORT_FILTER, "Store the register sort and filter settings in .gcm metadata file (requires at least GnuCash 3.3)"},
45 : : { GNC_FEATURE_BUDGET_UNREVERSED, "Store budget amounts unreversed (i.e. natural) signs (requires at least Gnucash 3.8)"},
46 : : { GNC_FEATURE_BUDGET_SHOW_EXTRA_ACCOUNT_COLS, "Show extra account columns in the Budget View (requires at least Gnucash 3.8)"},
47 : : { GNC_FEATURE_EQUITY_TYPE_OPENING_BALANCE, GNC_FEATURE_EQUITY_TYPE_OPENING_BALANCE " (requires at least Gnucash 4.3)" },
48 : : };
49 : :
50 : : /* To obsolete a feature leave the #define in gnc-features.h and move the
51 : : * feature from features_table to obsolete_features after removing all of the
52 : : * code that depends on the feature. The feature will be removed from the book's
53 : : * KVP, allowing the book to be opened with GnuCash versions that don't support
54 : : * the feature.
55 : : *
56 : : * Do this only if the book's data is restored to compatibility with older
57 : : * GnuCash versions lacking the feature. In general this can be used only in
58 : : * cases where a feature was created but never implemented in a way that affects
59 : : * the book's data.
60 : : */
61 : : static const FeaturesTable obsolete_features{
62 : : {GNC_FEATURE_BOOK_CURRENCY, "User-specified book currency stored in KVP. Never implemented but some user managed to get it set anyway. (requires at least GnuCash 2.7.0)"},
63 : : };
64 : :
65 : : /* This static indicates the debugging module that this .o belongs to. */
66 : : static QofLogModule log_module = G_LOG_DOMAIN;
67 : :
68 : : /********************************************************************\
69 : : \********************************************************************/
70 : :
71 : : static const char*
72 : : header = N_("This Dataset contains features not supported "
73 : : "by this version of GnuCash. You must use a "
74 : : "newer version of GnuCash in order to support "
75 : : "the following features:");
76 : :
77 : : /* Check if the session requires features unknown to this version of GnuCash.
78 : : *
79 : : * Returns a message to display if we found unknown features, NULL if
80 : : * we're okay.
81 : : */
82 : 6 : gchar *gnc_features_test_unknown (QofBook *book)
83 : : {
84 : 6 : auto unknowns {qof_book_get_unknown_features (book, features_table)};
85 : 6 : if (unknowns.empty())
86 : 4 : return nullptr;
87 : :
88 : 2 : auto obsolete = std::remove_if(unknowns.begin(), unknowns.end(),
89 : 2 : [](auto& unknown){
90 : 2 : return obsolete_features.find(unknown.first) != obsolete_features.end();
91 : : });
92 : 3 : while (obsolete != unknowns.end())
93 : : {
94 : 1 : qof_book_unset_feature(book, obsolete->first.data());
95 : 1 : obsolete = unknowns.erase(obsolete);
96 : : }
97 : :
98 : 2 : if (unknowns.empty())
99 : 1 : return nullptr;
100 : :
101 : 1 : auto accum = [](const auto& a, const auto& b){ return a + "\n* " + b.second.data(); };
102 : : auto msg {std::accumulate (unknowns.begin(), unknowns.end(),
103 : 1 : std::string (_(header)), accum)};
104 : 2 : return g_strdup (msg.c_str());
105 : 6 : }
106 : :
107 : 38 : void gnc_features_set_used (QofBook *book, const gchar *feature)
108 : : {
109 : 38 : g_return_if_fail (book);
110 : 38 : g_return_if_fail (feature);
111 : :
112 : : /* Can't set an unknown feature */
113 : 38 : auto iter = features_table.find (feature);
114 : 38 : if (iter == features_table.end ())
115 : : {
116 : 0 : PWARN("Tried to set unknown feature as used.");
117 : 0 : return;
118 : : }
119 : :
120 : 38 : qof_book_set_feature (book, feature, iter->second.data());
121 : : }
122 : :
123 : :
124 : 1 : void gnc_features_set_unused (QofBook *book, const gchar *feature)
125 : : {
126 : 1 : g_return_if_fail (book);
127 : 1 : g_return_if_fail (feature);
128 : :
129 : : /* Can't set an unknown feature */
130 : 1 : auto iter = features_table.find (feature);
131 : 1 : if (iter == features_table.end ())
132 : : {
133 : 0 : PWARN("Tried to set unknown feature as unused.");
134 : 0 : return;
135 : : }
136 : :
137 : 1 : qof_book_unset_feature (book, feature);
138 : : }
139 : :
140 : 26 : gboolean gnc_features_check_used (QofBook *book, const gchar * feature)
141 : : {
142 : 26 : return qof_book_test_feature (book, feature);
143 : : }
144 : :
|