41 #include <glib/gi18n.h> 47 constexpr
auto group_prefix =
"Import csv,transaction - ";
49 #define CSV_COL_TYPES "ColumnTypes" 51 #define CSV_ACCOUNT "BaseAccount" 52 #define CSV_ACCOUNT_GUID "BaseAccountGuid" 53 #define CSV_MULTI_SPLIT "MultiSplit" 55 G_GNUC_UNUSED
static QofLogModule log_module = GNC_MOD_IMPORT;
57 preset_vec_trans presets_trans;
59 static std::shared_ptr<CsvTransImpSettings> create_int_no_preset(
void)
61 auto preset = std::make_shared<CsvTransImpSettings>();
62 preset->m_name = get_no_settings();
67 static std::shared_ptr<CsvTransImpSettings> create_int_gnc_exp_preset(
void)
69 auto preset = std::make_shared<CsvTransImpSettings>();
70 preset->m_name = get_gnc_exp();
71 preset->m_skip_start_lines = 1;
72 preset->m_multi_split =
true;
80 preset->m_column_types = {
81 GncTransPropType::DATE,
82 GncTransPropType::UNIQUE_ID,
83 GncTransPropType::NUM,
84 GncTransPropType::DESCRIPTION,
85 GncTransPropType::NOTES,
86 GncTransPropType::COMMODITY,
87 GncTransPropType::VOID_REASON,
88 GncTransPropType::ACTION,
89 GncTransPropType::MEMO,
90 GncTransPropType::ACCOUNT,
91 GncTransPropType::NONE,
92 GncTransPropType::NONE,
93 GncTransPropType::AMOUNT,
94 GncTransPropType::NONE,
95 GncTransPropType::VALUE,
96 GncTransPropType::REC_STATE,
97 GncTransPropType::REC_DATE,
98 GncTransPropType::PRICE
103 static std::shared_ptr<CsvTransImpSettings> create_int_gnc_exp_4_preset(
void)
105 auto preset = std::make_shared<CsvTransImpSettings>();
106 preset->m_name = get_gnc_exp_4();
107 preset->m_skip_start_lines = 1;
108 preset->m_multi_split =
true;
116 preset->m_column_types = {
117 GncTransPropType::DATE,
118 GncTransPropType::UNIQUE_ID,
119 GncTransPropType::NUM,
120 GncTransPropType::DESCRIPTION,
121 GncTransPropType::NOTES,
122 GncTransPropType::COMMODITY,
123 GncTransPropType::VOID_REASON,
124 GncTransPropType::ACTION,
125 GncTransPropType::MEMO,
126 GncTransPropType::ACCOUNT,
127 GncTransPropType::NONE,
128 GncTransPropType::NONE,
129 GncTransPropType::AMOUNT,
130 GncTransPropType::REC_STATE,
131 GncTransPropType::REC_DATE,
132 GncTransPropType::PRICE
146 auto preset_names = std::vector<std::string>();
149 gchar **groups = g_key_file_get_groups (keyfile, &grouplength);
152 for (gsize i=0; i < grouplength; i++)
154 auto group = std::string(groups[i]);
155 auto gp = std::string {group_prefix};
156 auto pos = group.find(gp);
157 if (pos == std::string::npos)
160 preset_names.push_back(group.substr(gp.size()));
166 std::sort(preset_names.begin(), preset_names.end());
169 presets_trans.clear();
172 presets_trans.push_back(create_int_no_preset());
173 presets_trans.push_back(create_int_gnc_exp_preset());
174 presets_trans.push_back(create_int_gnc_exp_4_preset());
177 for (
auto preset_name : preset_names)
179 auto preset = std::make_shared<CsvTransImpSettings>();
180 preset->m_name = preset_name;
182 presets_trans.push_back(preset);
184 return presets_trans;
198 GError *key_error =
nullptr;
199 m_load_error =
false;
201 auto group = get_group_prefix() + m_name;
206 m_multi_split = g_key_file_get_boolean (keyfile, group.c_str(), CSV_MULTI_SPLIT, &key_error);
207 m_load_error |= handle_load_error (&key_error, group);
209 gchar *key_char = g_key_file_get_string (keyfile, group.c_str(), CSV_ACCOUNT_GUID, &key_error);
210 if (key_char && *key_char !=
'\0')
212 QofBook* book = gnc_get_current_book ();
218 m_load_error |= handle_load_error (&key_error, group);
222 key_char = g_key_file_get_string (keyfile, group.c_str(), CSV_ACCOUNT, &key_error);
223 if (key_char && *key_char !=
'\0')
225 if (m_base_account ==
nullptr)
233 g_key_file_set_string (keyfile, group.c_str(), CSV_ACCOUNT_GUID, acct_guid);
240 if (g_strcmp0 (key_char, full_name) != 0)
241 g_key_file_set_string (keyfile, group.c_str(), CSV_ACCOUNT, full_name);
245 m_load_error |= handle_load_error (&key_error, group);
250 m_column_types.clear();
251 gchar** col_types_str = g_key_file_get_string_list (keyfile, group.c_str(), CSV_COL_TYPES,
252 &list_len, &key_error);
253 for (uint32_t i = 0; i < list_len; i++)
256 const char *col_type_str = col_types_str[i];
257 if (!g_strcmp0(col_type_str,
"Deposit"))
258 col_type_str = gnc_csv_col_type_strs[GncTransPropType::AMOUNT];
259 if (!g_strcmp0(col_type_str,
"Withdrawal"))
260 col_type_str = gnc_csv_col_type_strs[GncTransPropType::AMOUNT_NEG];
261 if (!g_strcmp0(col_type_str,
"Num"))
262 col_type_str = gnc_csv_col_type_strs[GncTransPropType::NUM];
263 auto col_types_it = std::find_if (gnc_csv_col_type_strs.begin(),
265 auto prop = GncTransPropType::NONE;
266 if (col_types_it != gnc_csv_col_type_strs.end())
270 prop = sanitize_trans_prop (col_types_it->first, m_multi_split);
271 if (prop != col_types_it->first)
272 PWARN(
"Found column type '%s', but this is blacklisted when multi-split mode is %s. " 273 "Inserting column type 'NONE' instead'.",
274 col_types_it->second, m_multi_split ?
"enabled" :
"disabled");
277 PWARN(
"Found invalid column type '%s'. Inserting column type 'NONE' instead'.",
279 m_column_types.push_back(prop);
282 g_strfreev (col_types_str);
297 PWARN (
"Ignoring attempt to save to reserved name '%s'", m_name.c_str());
301 if ((m_name.find(
'[') != std::string::npos))
303 PWARN (
"Name '%s' contains invalid characters '[]'. Refusing to save", m_name.c_str());
308 auto group = get_group_prefix() + m_name;
311 g_key_file_remove_group (keyfile, group.c_str(),
nullptr);
319 g_key_file_set_boolean (keyfile, group.c_str(), CSV_MULTI_SPLIT, m_multi_split);
325 g_key_file_set_string (keyfile, group.c_str(), CSV_ACCOUNT_GUID, acct_guid);
328 g_key_file_set_string (keyfile, group.c_str(), CSV_ACCOUNT, full_name);
332 std::vector<const char*> col_types_str;
333 for (
auto col_type : m_column_types)
334 col_types_str.push_back(gnc_csv_col_type_strs[col_type]);
336 if (!col_types_str.empty())
337 g_key_file_set_string_list (keyfile, group.c_str(), CSV_COL_TYPES,
338 col_types_str.data(), col_types_str.size());
353 CsvTransImpSettings::get_group_prefix (
void)
Functions to load, save and get gui state.
bool save(void)
Save the gathered widget properties to a key File.
utility functions for the GnuCash UI
gboolean string_to_guid(const gchar *string, GncGUID *guid)
Given a string, replace the given guid with the parsed one unless the given value is null...
void remove(void)
Remove the preset from the state file.
gchar * guid_to_string_buff(const GncGUID *guid, gchar *str)
The guid_to_string_buff() routine puts a null-terminated string encoding of the id into the memory po...
GKeyFile * gnc_state_get_current(void)
Returns a pointer to the most recently loaded state.
#define PWARN(format, args...)
Log a warning.
#define xaccAccountGetGUID(X)
gchar * gnc_account_get_full_name(const Account *account)
The gnc_account_get_full_name routine returns the fully qualified name of the account using the given...
Account handling public routines.
bool preset_is_reserved_name(const std::string &name)
Check whether name can be used as a preset name.
Functor to check if the above map has an element of which the value equals name.
#define GUID_ENCODING_LENGTH
Number of characters needed to encode a guid as a string not including the null terminator.
Account * gnc_account_lookup_by_full_name(const Account *any_acc, const gchar *name)
The gnc_account_lookup_full_name() subroutine works like gnc_account_lookup_by_name, but uses fully-qualified names using the given separator.
bool load(void)
Load the widget properties from a key File.
const preset_vec_trans & get_import_presets_trans(void)
Creates a vector of CsvTransImpSettings which combines.
void remove(void)
Remove the preset from the state file.
bool save(void)
Save the gathered widget properties to a key File.
The type used to store guids in C.
Account * xaccAccountLookup(const GncGUID *guid, QofBook *book)
The xaccAccountLookup() subroutine will return the account associated with the given id...
bool load(void)
Load the widget properties from a key File.