35 #include <glib/gi18n.h> 39 #include "gnc-component-manager.h" 40 #include "dialog-utils.h" 41 #include "gnc-gui-query.h" 51 GtkWidget *entryFilename;
62 void gnc_bi_import_gui_ok_cb (GtkWidget *widget, gpointer data);
63 void gnc_bi_import_gui_cancel_cb (GtkWidget *widget, gpointer data);
64 void gnc_bi_import_gui_help_cb (GtkWidget *widget, gpointer data);
65 void gnc_bi_import_gui_destroy_cb (GtkWidget *widget, gpointer data);
66 static void gnc_bi_import_gui_close_handler (gpointer user_data);
67 void gnc_bi_import_gui_buttonOpen_cb (GtkWidget *widget, gpointer data);
68 void gnc_bi_import_gui_filenameChanged_cb (GtkWidget *widget, gpointer data);
69 void gnc_bi_import_gui_option1_cb (GtkWidget *widget, gpointer data);
70 void gnc_bi_import_gui_option2_cb (GtkWidget *widget, gpointer data);
71 void gnc_bi_import_gui_option3_cb (GtkWidget *widget, gpointer data);
72 void gnc_bi_import_gui_option4_cb (GtkWidget *widget, gpointer data);
73 void gnc_bi_import_gui_option5_cb (GtkWidget *widget, gpointer data);
74 void gnc_bi_import_gui_open_mode_cb (GtkWidget *widget, gpointer data);
75 void gnc_import_gui_type_cb (GtkWidget *widget, gpointer data);
77 #define UNUSED_VAR __attribute__ ((unused)) 79 static QofLogModule UNUSED_VAR log_module =
G_LOG_DOMAIN;
87 GtkCellRenderer *renderer;
88 GtkTreeViewColumn *column;
91 glist = gnc_find_gui_components (
"dialog-bi-import-gui", NULL, NULL);
95 gui = g_list_nth_data (glist, 0);
98 gtk_window_set_transient_for(GTK_WINDOW(gui->dialog), GTK_WINDOW(parent));
100 gtk_window_present (GTK_WINDOW(gui->dialog));
105 gui = g_new0 (BillImportGui, 1);
107 gui->open_mode =
"ALL";
109 builder = gtk_builder_new();
110 gnc_builder_add_from_file (builder,
"dialog-bi-import-gui.glade",
"bi_import_dialog");
111 gui->dialog = GTK_WIDGET(gtk_builder_get_object (builder,
"bi_import_dialog"));
112 gtk_window_set_transient_for(GTK_WINDOW(gui->dialog), GTK_WINDOW(parent));
113 gui->parent = parent;
114 gui->tree_view = GTK_WIDGET(gtk_builder_get_object (builder,
"treeview1"));
115 gui->entryFilename = GTK_WIDGET(gtk_builder_get_object (builder,
"entryFilename"));
118 gtk_widget_set_name (GTK_WIDGET(gui->dialog),
"gnc-id-bill-import");
119 gnc_widget_style_context_add_class (GTK_WIDGET(gui->dialog),
"gnc-class-imports");
121 gtk_window_set_transient_for (GTK_WINDOW (gui->dialog), parent);
123 gui->book = gnc_get_current_book();
125 gui->regexp = g_string_new (
"^(\\x{FEFF})?(?<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>[^;]*)$");
128 gui->store = gtk_list_store_new (N_COLUMNS,
129 G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING,
130 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,
131 G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING);
132 gtk_tree_view_set_model( GTK_TREE_VIEW(gui->tree_view), GTK_TREE_MODEL(gui->store) );
133 #define CREATE_COLUMN(description,column_id) \ 134 renderer = gtk_cell_renderer_text_new (); \ 135 column = gtk_tree_view_column_new_with_attributes (description, renderer, "text", column_id, NULL); \ 136 gtk_tree_view_column_set_resizable (column, TRUE); \ 137 gtk_tree_view_append_column (GTK_TREE_VIEW (gui->tree_view), column); 138 CREATE_COLUMN (_(
"ID"), ID);
139 CREATE_COLUMN (_(
"Date Opened"), DATE_OPENED);
140 CREATE_COLUMN (_(
"Owner-ID"), OWNER_ID);
141 CREATE_COLUMN (_(
"Billing-ID"), BILLING_ID);
142 CREATE_COLUMN (_(
"Notes"), NOTES);
144 CREATE_COLUMN (_(
"Date"), DATE);
145 CREATE_COLUMN (_(
"Description"), DESC);
146 CREATE_COLUMN (_(
"Action"), ACTION);
147 CREATE_COLUMN (_(
"Account"), ACCOUNT);
148 CREATE_COLUMN (_(
"Quantity"), QUANTITY);
149 CREATE_COLUMN (_(
"Price"), PRICE);
150 CREATE_COLUMN (_(
"Disc-type"), DISC_TYPE);
151 CREATE_COLUMN (_(
"Disc-how"), DISC_HOW);
152 CREATE_COLUMN (_(
"Discount"), DISCOUNT);
153 CREATE_COLUMN (_(
"Taxable"), TAXABLE);
154 CREATE_COLUMN (_(
"Taxincluded"), TAXINCLUDED);
155 CREATE_COLUMN (_(
"Tax-table"), TAX_TABLE);
157 CREATE_COLUMN (_(
"Date Posted"), DATE_POSTED);
158 CREATE_COLUMN (_(
"Due Date"), DUE_DATE);
159 CREATE_COLUMN (_(
"Account-posted"), ACCOUNT_POSTED);
160 CREATE_COLUMN (_(
"Memo-posted"), MEMO_POSTED);
161 CREATE_COLUMN (_(
"Accu-splits"), ACCU_SPLITS);
163 gui->component_id = gnc_register_gui_component (
"dialog-bi-import-gui",
165 gnc_bi_import_gui_close_handler,
169 gtk_builder_connect_signals_full (builder, gnc_builder_connect_full_func, gui);
171 gtk_widget_show_all ( gui->dialog );
173 g_object_unref(G_OBJECT(builder));
179 gnc_plugin_bi_import_getFilename(GtkWindow *parent)
182 gchar *filename = NULL;
184 GtkFileFilter *filter;
186 filter = gtk_file_filter_new ();
187 gtk_file_filter_set_name (filter,
"comma separated values (*.csv)");
188 gtk_file_filter_add_pattern (filter,
"*.csv");
189 filters = g_list_append( filters, filter );
190 filter = gtk_file_filter_new ();
191 gtk_file_filter_set_name (filter,
"text files (*.txt)");
192 gtk_file_filter_add_pattern (filter,
"*.txt");
193 filters = g_list_append( filters, filter );
194 filename = gnc_file_dialog(parent, _(
"Import Bills or Invoices from csv"), filters, NULL, GNC_FILE_DIALOG_IMPORT);
200 gnc_bi_import_gui_ok_cb (GtkWidget *widget, gpointer data)
202 BillImportGui *gui = data;
203 gchar *filename = g_strdup( gtk_entry_get_text( GTK_ENTRY(gui->entryFilename) ) );
204 bi_import_stats stats;
205 bi_import_result res;
206 guint n_fixed, n_deleted, n_invoices_created, n_invoices_updated;
210 info = g_string_new(
"");
212 gtk_list_store_clear (gui->store);
214 if (res == RESULT_OK)
218 gui->type, gui->open_mode, info, gui->parent);
220 gnc_info_dialog (GTK_WINDOW (gui->dialog),
"%s", info->str);
221 g_string_free( info, TRUE );
222 gnc_info_dialog (GTK_WINDOW (gui->dialog), _(
"Import:\n- rows ignored: %i\n- rows imported: %i\n\nValidation & processing:\n- rows fixed: %u\n- rows ignored: %u\n- invoices created: %u\n- invoices updated: %u"),
223 stats.n_ignored, stats.n_imported, n_fixed, n_deleted, n_invoices_created, n_invoices_updated);
224 if (stats.n_ignored > 0)
225 gnc_info2_dialog (gui->dialog, _(
"These lines were ignored during import"), stats.ignored_lines->str);
227 g_string_free (stats.ignored_lines, TRUE);
228 gnc_close_gui_component (gui->component_id);
230 else if (res == RESULT_OPEN_FAILED)
232 gnc_error_dialog (GTK_WINDOW (gui->dialog), _(
"The input file can not be opened."));
234 else if (res == RESULT_ERROR_IN_REGEXP)
241 gnc_bi_import_gui_cancel_cb (GtkWidget *widget, gpointer data)
243 BillImportGui *gui = data;
245 gnc_close_gui_component (gui->component_id);
249 gnc_bi_import_gui_help_cb (GtkWidget *widget, gpointer data)
251 BillImportGui *gui = data;
256 gnc_bi_import_gui_close_handler (gpointer user_data)
258 BillImportGui *gui = user_data;
260 gtk_widget_destroy (gui->dialog);
266 gnc_bi_import_gui_destroy_cb (GtkWidget *widget, gpointer data)
268 BillImportGui *gui = data;
270 gnc_suspend_gui_refresh ();
271 gnc_unregister_gui_component (gui->component_id);
272 gnc_resume_gui_refresh ();
274 g_object_unref (gui->store);
275 g_string_free (gui->regexp, TRUE);
279 void gnc_bi_import_gui_buttonOpen_cb (GtkWidget *widget, gpointer data)
281 gchar *filename = NULL;
282 BillImportGui *gui = data;
288 gtk_entry_set_text( GTK_ENTRY(gui->entryFilename), filename );
294 void gnc_bi_import_gui_filenameChanged_cb (GtkWidget *widget, gpointer data)
296 BillImportGui *gui = data;
297 gchar *filename = g_strdup( gtk_entry_get_text( GTK_ENTRY(gui->entryFilename) ) );
300 gtk_list_store_clear (gui->store);
307 void gnc_bi_import_gui_option1_cb (GtkWidget *widget, gpointer data)
309 BillImportGui *gui = data;
310 if (!gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON(widget) ))
312 g_string_assign (gui->regexp,
"^(\\x{FEFF})?(?<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>[^;]*)$");
313 gnc_bi_import_gui_filenameChanged_cb (gui->entryFilename, gui);
317 void gnc_bi_import_gui_option2_cb (GtkWidget *widget, gpointer data)
319 BillImportGui *gui = data;
320 if (!gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON(widget) ))
322 g_string_assign (gui->regexp,
"^(\\x{FEFF})?(?<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>[^,]*)$");
323 gnc_bi_import_gui_filenameChanged_cb (gui->entryFilename, gui);
327 void gnc_bi_import_gui_option3_cb (GtkWidget *widget, gpointer data)
329 BillImportGui *gui = data;
330 if (!gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON(widget) ))
332 g_string_assign (gui->regexp,
"^(\\x{FEFF})?((?<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>[^\"]*)\")$");
333 gnc_bi_import_gui_filenameChanged_cb (gui->entryFilename, gui);
337 void gnc_bi_import_gui_option4_cb (GtkWidget *widget, gpointer data)
339 BillImportGui *gui = data;
340 if (!gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON(widget) ))
342 g_string_assign (gui->regexp,
"^(\\x{FEFF})?((?<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>[^\"]*)\")$");
343 gnc_bi_import_gui_filenameChanged_cb (gui->entryFilename, gui);
347 void gnc_bi_import_gui_option5_cb (GtkWidget *widget, gpointer data)
349 BillImportGui *gui = data;
351 if (!gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON(widget) ))
353 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);
356 g_string_assign (gui->regexp, temp);
358 gnc_bi_import_gui_filenameChanged_cb (gui->entryFilename, gui);
362 void gnc_bi_import_gui_open_mode_cb (GtkWidget *widget, gpointer data)
364 BillImportGui *gui = data;
365 const gchar *name = NULL;
366 name = gtk_buildable_get_name(GTK_BUILDABLE(widget));
367 if (!gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON(widget) ))
369 if (g_ascii_strcasecmp(name,
"radiobuttonOpenAll") == 0)gui->open_mode =
"ALL";
370 else if (g_ascii_strcasecmp(name,
"radiobuttonOpenNotPosted") == 0)gui->open_mode =
"NOT_POSTED";
371 else if (g_ascii_strcasecmp(name,
"radiobuttonOpenNone") == 0)gui->open_mode =
"NONE";
378 void gnc_import_gui_type_cb (GtkWidget *widget, gpointer data)
380 BillImportGui *gui = data;
381 const gchar *name = NULL;
382 name = gtk_buildable_get_name(GTK_BUILDABLE(widget));
383 if (!gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON(widget) ))
385 if (g_ascii_strcasecmp(name,
"radiobuttonInvoice") == 0)gui->type =
"INVOICE";
386 else if (g_ascii_strcasecmp(name,
"radiobuttonBill") == 0)gui->type =
"BILL";
core import functions for invoice import plugin
GUI handling for bi-import plugin.
utility functions for the GnuCash UI
#define G_LOG_DOMAIN
Functions providing the SX List as a plugin page.
GtkWindow * gnc_ui_get_gtk_window(GtkWidget *widget)
Get a pointer to the widget's immediate top level GtkWindow.
void gnc_gnome_help(GtkWindow *parent, const char *file_name, const char *anchor)
Launch the systems default help browser, gnome's yelp for linux, and open to a given link within a gi...