34 #include <glib/gi18n.h>
38 #include "gnc-component-manager.h"
39 #include "dialog-utils.h"
40 #include "gnc-gui-query.h"
49 GtkWidget *entryFilename;
60 void gnc_bi_import_gui_ok_cb (GtkWidget *widget, gpointer data);
61 void gnc_bi_import_gui_cancel_cb (GtkWidget *widget, gpointer data);
62 void gnc_bi_import_gui_help_cb (GtkWidget *widget, gpointer data);
63 void gnc_bi_import_gui_destroy_cb (GtkWidget *widget, gpointer data);
64 static void gnc_bi_import_gui_close_handler (gpointer user_data);
65 void gnc_bi_import_gui_buttonOpen_cb (GtkWidget *widget, gpointer data);
66 void gnc_bi_import_gui_filenameChanged_cb (GtkWidget *widget, gpointer data);
67 void gnc_bi_import_gui_option1_cb (GtkWidget *widget, gpointer data);
68 void gnc_bi_import_gui_option2_cb (GtkWidget *widget, gpointer data);
69 void gnc_bi_import_gui_option3_cb (GtkWidget *widget, gpointer data);
70 void gnc_bi_import_gui_option4_cb (GtkWidget *widget, gpointer data);
71 void gnc_bi_import_gui_option5_cb (GtkWidget *widget, gpointer data);
72 void gnc_bi_import_gui_open_mode_cb (GtkWidget *widget, gpointer data);
73 void gnc_import_gui_type_cb (GtkWidget *widget, gpointer data);
76 static gchar *gnc_input_dialog (GtkWidget *parent,
const gchar *title,
const gchar *msg,
const gchar *default_input);
77 static void gnc_info2_dialog (GtkWidget *parent,
const gchar *title,
const gchar *msg);
86 GtkCellRenderer *renderer;
87 GtkTreeViewColumn *column;
90 glist = gnc_find_gui_components (
"dialog-bi-import-gui", NULL, NULL);
94 gui = g_list_nth_data (glist, 0);
96 gtk_window_present (GTK_WINDOW(gui->dialog));
101 gui = g_new0 (BillImportGui, 1);
103 gui->open_mode =
"ALL";
105 builder = gtk_builder_new();
106 gnc_builder_add_from_file (builder,
"dialog-bi-import-gui.glade",
"bi-import Dialog");
107 gui->dialog = GTK_WIDGET(gtk_builder_get_object (builder,
"bi-import Dialog"));
108 gui->tree_view = GTK_WIDGET(gtk_builder_get_object (builder,
"treeview1"));
109 gui->entryFilename = GTK_WIDGET(gtk_builder_get_object (builder,
"entryFilename"));
111 gui->book = gnc_get_current_book();
113 gui->regexp = g_string_new (
"^(?<id>[^;]*);(?<date_opened>[^;]*);(?<owner_id>[^;]*);(?<billing_id>[^;]*);?(?<notes>[^;]*);?(?<date>[^;]*);?(?<desc>[^;]*);?(?<action>[^;]*);?(?<account>[^;]*);?(?<quantity>[^;]*);?(?<price>[^;]*);?(?<disc_type>[^;]*);?(?<disc_how>[^;]*);?(?<discount>[^;]*);?(?<taxable>[^;]*);?(?<taxincluded>[^;]*);?(?<tax_table>[^;]*);(?<date_posted>[^;]*);(?<due_date>[^;]*);(?<account_posted>[^;]*);(?<memo_posted>[^;]*);(?<accu_splits>[^;]*)$");
116 gui->store = gtk_list_store_new (N_COLUMNS,
117 G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING,
118 G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING,
119 G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING);
120 gtk_tree_view_set_model( GTK_TREE_VIEW(gui->tree_view), GTK_TREE_MODEL(gui->store) );
121 #define CREATE_COLUMN(description,column_id) \
122 renderer = gtk_cell_renderer_text_new (); \
123 column = gtk_tree_view_column_new_with_attributes (description, renderer, "text", column_id, NULL); \
124 gtk_tree_view_column_set_resizable (column, TRUE); \
125 gtk_tree_view_append_column (GTK_TREE_VIEW (gui->tree_view), column);
126 CREATE_COLUMN (
"id", ID);
127 CREATE_COLUMN (
"date__opened", DATE_OPENED);
128 CREATE_COLUMN (
"owner__id", OWNER_ID);
129 CREATE_COLUMN (
"billing__id", BILLING_ID);
130 CREATE_COLUMN (
"notes", NOTES);
132 CREATE_COLUMN (
"date", DATE);
133 CREATE_COLUMN (
"desc", DESC);
134 CREATE_COLUMN (
"action", ACTION);
135 CREATE_COLUMN (
"account", ACCOUNT);
136 CREATE_COLUMN (
"quantity", QUANTITY);
137 CREATE_COLUMN (
"price", PRICE);
138 CREATE_COLUMN (
"disc__type", DISC_TYPE);
139 CREATE_COLUMN (
"disc__how", DISC_HOW);
140 CREATE_COLUMN (
"discount", DISCOUNT);
141 CREATE_COLUMN (
"taxable", TAXABLE);
142 CREATE_COLUMN (
"taxincluded", TAXINCLUDED);
143 CREATE_COLUMN (
"tax__table", TAX_TABLE);
145 CREATE_COLUMN (
"date__posted", DATE_POSTED);
146 CREATE_COLUMN (
"due__date", DUE_DATE);
147 CREATE_COLUMN (
"account__posted", ACCOUNT_POSTED);
148 CREATE_COLUMN (
"memo__posted", MEMO_POSTED);
149 CREATE_COLUMN (
"accu__splits", ACCU_SPLITS);
151 gui->component_id = gnc_register_gui_component (
"dialog-bi-import-gui",
153 gnc_bi_import_gui_close_handler,
157 gtk_builder_connect_signals_full (builder, gnc_builder_connect_full_func, gui);
159 gtk_widget_show_all ( gui->dialog );
161 g_object_unref(G_OBJECT(builder));
167 gnc_plugin_bi_import_getFilename(
void)
172 GtkFileFilter *filter;
174 filter = gtk_file_filter_new ();
175 gtk_file_filter_set_name (filter,
"comma separated values (*.csv)");
176 gtk_file_filter_add_pattern (filter,
"*.csv");
177 filters = g_list_append( filters, filter );
178 filter = gtk_file_filter_new ();
179 gtk_file_filter_set_name (filter,
"text files (*.txt)");
180 gtk_file_filter_add_pattern (filter,
"*.txt");
181 filters = g_list_append( filters, filter );
182 filename = gnc_file_dialog(_(
"Import Bills or Invoices from csv"), filters, NULL, GNC_FILE_DIALOG_IMPORT);
188 gnc_bi_import_gui_ok_cb (GtkWidget *widget, gpointer data)
190 BillImportGui *gui = data;
191 gchar *filename = g_strdup( gtk_entry_get_text( GTK_ENTRY(gui->entryFilename) ) );
193 bi_import_result res;
194 guint n_fixed, n_deleted, n_invoices_created, n_invoices_updated;
198 info = g_string_new(
"");
200 gtk_list_store_clear (gui->store);
201 res = gnc_bi_import_read_file (filename, gui->regexp->str, gui->store, 0, &stats);
202 if (res == RESULT_OK)
206 gnc_info_dialog (gui->dialog,
"%s", info->str);
207 g_string_free( info, TRUE );
208 gnc_bi_import_create_bis (gui->store, gui->book, &n_invoices_created, &n_invoices_updated, gui->type, gui->open_mode, info);
209 gnc_info_dialog (gui->dialog, _(
"Import results:\n%i lines were ignored\n%i lines imported:\n %u fixes\n %u ignored (not fixable)\n\n %u created\n %u updated (based on id)"), stats.n_ignored, stats.n_imported, n_fixed, n_deleted, n_invoices_created, n_invoices_updated);
211 if (stats.n_ignored > 0)
212 gnc_info2_dialog (gui->dialog, _(
"These lines were ignored during import"), stats.ignored_lines->str);
214 g_string_free (stats.ignored_lines, TRUE);
215 gnc_close_gui_component (gui->component_id);
217 else if (res == RESULT_OPEN_FAILED)
219 gnc_error_dialog (gui->dialog, _(
"The input file can not be opened."));
221 else if (res == RESULT_ERROR_IN_REGEXP)
228 gnc_bi_import_gui_cancel_cb (GtkWidget *widget, gpointer data)
230 BillImportGui *gui = data;
232 gnc_close_gui_component (gui->component_id);
236 gnc_bi_import_gui_help_cb (GtkWidget *widget, gpointer data)
242 gnc_bi_import_gui_close_handler (gpointer user_data)
244 BillImportGui *gui = user_data;
246 gtk_widget_destroy (gui->dialog);
252 gnc_bi_import_gui_destroy_cb (GtkWidget *widget, gpointer data)
254 BillImportGui *gui = data;
256 gnc_suspend_gui_refresh ();
257 gnc_unregister_gui_component (gui->component_id);
258 gnc_resume_gui_refresh ();
260 g_object_unref (gui->store);
261 g_string_free (gui->regexp, TRUE);
265 void gnc_bi_import_gui_buttonOpen_cb (GtkWidget *widget, gpointer data)
268 BillImportGui *gui = data;
270 filename = gnc_plugin_bi_import_getFilename();
274 gtk_entry_set_text( GTK_ENTRY(gui->entryFilename), filename );
280 void gnc_bi_import_gui_filenameChanged_cb (GtkWidget *widget, gpointer data)
282 BillImportGui *gui = data;
283 gchar *filename = g_strdup( gtk_entry_get_text( GTK_ENTRY(gui->entryFilename) ) );
286 gtk_list_store_clear (gui->store);
287 gnc_bi_import_read_file (filename, gui->regexp->str, gui->store, 10, NULL);
292 void gnc_bi_import_gui_option1_cb (GtkWidget *widget, gpointer data)
294 BillImportGui *gui = data;
295 if (!gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON(widget) ))
297 g_string_assign (gui->regexp,
"^(?<id>[^;]*);(?<date_opened>[^;]*);(?<owner_id>[^;]*);(?<billing_id>[^;]*);?(?<notes>[^;]*);?(?<date>[^;]*);?(?<desc>[^;]*);?(?<action>[^;]*);?(?<account>[^;]*);?(?<quantity>[^;]*);?(?<price>[^;]*);?(?<disc_type>[^;]*);?(?<disc_how>[^;]*);?(?<discount>[^;]*);?(?<taxable>[^;]*);?(?<taxincluded>[^;]*);?(?<tax_table>[^;]*);(?<date_posted>[^;]*);(?<due_date>[^;]*);(?<account_posted>[^;]*);(?<memo_posted>[^;]*);(?<accu_splits>[^;]*)$");
298 gnc_bi_import_gui_filenameChanged_cb (gui->entryFilename, gui);
301 void gnc_bi_import_gui_option2_cb (GtkWidget *widget, gpointer data)
303 BillImportGui *gui = data;
304 if (!gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON(widget) ))
306 g_string_assign (gui->regexp,
"^(?<id>[^,]*),(?<date_opened>[^,]*),(?<owner_id>[^,]*),(?<billing_id>[^,]*),?(?<notes>[^,]*),?(?<date>[^,]*),?(?<desc>[^,]*),?(?<action>[^,]*),?(?<account>[^,]*),?(?<quantity>[^,]*),?(?<price>[^,]*),?(?<disc_type>[^,]*),?(?<disc_how>[^,]*),?(?<discount>[^,]*),?(?<taxable>[^,]*),?(?<taxincluded>[^,]*),?(?<tax_table>[^,]*),(?<date_posted>[^,]*),(?<due_date>[^,]*),(?<account_posted>[^,]*),(?<memo_posted>[^,]*),(?<accu_splits>[^,]*)$");
307 gnc_bi_import_gui_filenameChanged_cb (gui->entryFilename, gui);
310 void gnc_bi_import_gui_option3_cb (GtkWidget *widget, gpointer data)
312 BillImportGui *gui = data;
313 if (!gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON(widget) ))
315 g_string_assign (gui->regexp,
"^((?<id>[^\";]*)|\"(?<id>[^\"]*)\");((?<date_opened>[^\";]*)|\"(?<date_opened>[^\"]*)\");((?<owner_id>[^\";]*)|\"(?<owner_id>[^\"]*)\");((?<billing_id>[^\";]*)|\"(?<billing_id>[^\"]*)\");((?<notes>[^\";]*)|\"(?<notes>[^\"]*)\");((?<date>[^\";]*)|\"(?<date>[^\"]*)\");((?<desc>[^\";]*)|\"(?<desc>[^\"]*)\");((?<action>[^\";]*)|\"(?<action>[^\"]*)\");((?<account>[^\";]*)|\"(?<account>[^\"]*)\");((?<quantity>[^\";]*)|\"(?<quantity>[^\"]*)\");((?<price>[^\";]*)|\"(?<price>[^\"]*)\");((?<disc_type>[^\";]*)|\"(?<disc_type>[^\"]*)\");((?<disc_how>[^\";]*)|\"(?<disc_how>[^\"]*)\");((?<discount>[^\";]*)|\"(?<discount>[^\"]*)\");((?<taxable>[^\";]*)|\"(?<taxable>[^\"]*)\");((?<taxincluded>[^\";]*)|\"(?<taxincluded>[^\"]*)\");((?<tax_table>[^\";]*)|\"(?<tax_table>[^\"]*)\");((?<date_posted>[^\";]*)|\"(?<date_posted>[^\"]*)\");((?<due_date>[^\";]*)|\"(?<due_date>[^\"]*)\");((?<account_posted>[^\";]*)|\"(?<account_posted>[^\"]*)\");((?<memo_posted>[^\";]*)|\"(?<memo_posted>[^\"]*)\");((?<accu_splits>[^\";]*)|\"(?<accu_splits>[^\"]*)\")$");
316 gnc_bi_import_gui_filenameChanged_cb (gui->entryFilename, gui);
319 void gnc_bi_import_gui_option4_cb (GtkWidget *widget, gpointer data)
321 BillImportGui *gui = data;
322 if (!gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON(widget) ))
324 g_string_assign (gui->regexp,
"^((?<id>[^\",]*)|\"(?<id>[^\"]*)\"),((?<date_opened>[^\",]*)|\"(?<date_opened>[^\"]*)\"),((?<owner_id>[^\",]*)|\"(?<owner_id>[^\"]*)\"),((?<billing_id>[^\",]*)|\"(?<billing_id>[^\"]*)\"),((?<notes>[^\",]*)|\"(?<notes>[^\"]*)\"),((?<date>[^\",]*)|\"(?<date>[^\"]*)\"),((?<desc>[^\",]*)|\"(?<desc>[^\"]*)\"),((?<action>[^\",]*)|\"(?<action>[^\"]*)\"),((?<account>[^\",]*)|\"(?<account>[^\"]*)\"),((?<quantity>[^\",]*)|\"(?<quantity>[^\"]*)\"),((?<price>[^\",]*)|\"(?<price>[^\"]*)\"),((?<disc_type>[^\",]*)|\"(?<disc_type>[^\"]*)\"),((?<disc_how>[^\",]*)|\"(?<disc_how>[^\"]*)\"),((?<discount>[^\",]*)|\"(?<discount>[^\"]*)\"),((?<taxable>[^\",]*)|\"(?<taxable>[^\"]*)\"),((?<taxincluded>[^\",]*)|\"(?<taxincluded>[^\"]*)\"),((?<tax_table>[^\",]*)|\"(?<tax_table>[^\"]*)\"),((?<date_posted>[^\",]*)|\"(?<date_posted>[^\"]*)\"),((?<due_date>[^\",]*)|\"(?<due_date>[^\"]*)\"),((?<account_posted>[^\",]*)|\"(?<account_posted>[^\"]*)\"),((?<memo_posted>[^\",]*)|\"(?<memo_posted>[^\"]*)\"),((?<accu_splits>[^\",]*)|\"(?<accu_splits>[^\"]*)\")$");
325 gnc_bi_import_gui_filenameChanged_cb (gui->entryFilename, gui);
328 void gnc_bi_import_gui_option5_cb (GtkWidget *widget, gpointer data)
330 BillImportGui *gui = data;
332 if (!gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON(widget) ))
334 temp = gnc_input_dialog (0, _(
"Adjust regular expression used for import"), _(
"This regular expression is used to parse the import file. Modify according to your needs.\n"), gui->regexp->str);
337 g_string_assign (gui->regexp, temp);
339 gnc_bi_import_gui_filenameChanged_cb (gui->entryFilename, gui);
343 void gnc_bi_import_gui_open_mode_cb (GtkWidget *widget, gpointer data)
345 BillImportGui *gui = data;
347 name = gtk_buildable_get_name(GTK_BUILDABLE(widget));
348 if (!gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON(widget) ))
350 if (g_ascii_strcasecmp(name,
"radiobuttonOpenAll") == 0)gui->open_mode =
"ALL";
351 else if (g_ascii_strcasecmp(name,
"radiobuttonOpenNotPosted") == 0)gui->open_mode =
"NOT_POSTED";
352 else if (g_ascii_strcasecmp(name,
"radiobuttonOpenNone") == 0)gui->open_mode =
"NONE";
359 void gnc_import_gui_type_cb (GtkWidget *widget, gpointer data)
361 BillImportGui *gui = data;
363 name = gtk_buildable_get_name(GTK_BUILDABLE(widget));
364 if (!gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON(widget) ))
366 if (g_ascii_strcasecmp(name,
"radiobuttonInvoice") == 0)gui->type =
"INVOICE";
367 else if (g_ascii_strcasecmp(name,
"radiobuttonBill") == 0)gui->type =
"BILL";
388 gnc_input_dialog (GtkWidget *parent,
const gchar *title,
const gchar *msg,
const gchar *default_input)
390 GtkWidget *dialog, *label, *content_area;
393 GtkTextBuffer *buffer;
395 GtkTextIter start, end;
398 dialog = gtk_dialog_new_with_buttons (title, GTK_WINDOW (parent),
399 GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
400 GTK_STOCK_OK, GTK_RESPONSE_ACCEPT,
401 GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT,
404 content_area = gtk_dialog_get_content_area (GTK_DIALOG (dialog));
406 content_area = GTK_DIALOG (dialog)->vbox;
410 label = gtk_label_new (msg);
411 gtk_container_add (GTK_CONTAINER (content_area), label);
414 view = gtk_text_view_new ();
415 gtk_text_view_set_wrap_mode (GTK_TEXT_VIEW (view), GTK_WRAP_WORD_CHAR);
416 buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (view));
417 gtk_text_buffer_set_text (buffer, default_input, -1);
418 gtk_container_add (GTK_CONTAINER (content_area), view);
421 gtk_widget_show_all (dialog);
422 result = gtk_dialog_run (GTK_DIALOG (dialog));
424 if (result == GTK_RESPONSE_REJECT)
428 gtk_text_buffer_get_start_iter (buffer, &start);
429 gtk_text_buffer_get_end_iter (buffer, &end);
430 user_input = gtk_text_buffer_get_text (buffer,
431 &start, &end, FALSE);
434 gtk_widget_destroy (dialog);
452 gnc_info2_dialog (GtkWidget *parent,
const gchar *title,
const gchar *msg)
454 GtkWidget *dialog, *scrolledwindow, *content_area;
456 GtkTextBuffer *buffer;
460 dialog = gtk_dialog_new_with_buttons (title, GTK_WINDOW (parent),
461 GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
462 GTK_STOCK_OK, GTK_RESPONSE_ACCEPT,
465 content_area = gtk_dialog_get_content_area (GTK_DIALOG (dialog));
467 content_area = GTK_DIALOG (dialog)->vbox;
471 scrolledwindow = gtk_scrolled_window_new (NULL, NULL);
472 gtk_container_add (GTK_CONTAINER (content_area), scrolledwindow);
475 view = gtk_text_view_new ();
477 gtk_text_view_set_editable (GTK_TEXT_VIEW (view), FALSE);
478 buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (view));
479 gtk_text_buffer_set_text (buffer, msg, -1);
480 gtk_container_add (GTK_CONTAINER (scrolledwindow), view);
485 gtk_window_get_size (GTK_WINDOW(parent), &width, &height);
486 gtk_window_set_default_size (GTK_WINDOW(dialog), width, height);
488 gtk_widget_show_all (dialog);
489 gtk_dialog_run (GTK_DIALOG (dialog));
490 gtk_widget_destroy (dialog);
core import functions for invoice import plugin
GUI handling for bi-import plugin.
utility functions for the GnuCash UI
void gnc_gnome_help(const char *file_name, const char *anchor)