diff --git a/src/business/business-gnome/dialog-invoice.c b/src/business/business-gnome/dialog-invoice.c index 9582a5b75e..c90c119d35 100644 --- a/src/business/business-gnome/dialog-invoice.c +++ b/src/business/business-gnome/dialog-invoice.c @@ -98,6 +98,7 @@ void gnc_invoice_terms_changed_cb (GtkWidget *widget, gpointer data); #define ENUM_INVOICE_TYPE(_) \ _(NEW_INVOICE, ) \ _(MOD_INVOICE, ) \ + _(DUP_INVOICE, ) \ _(EDIT_INVOICE, ) \ _(VIEW_INVOICE, ) @@ -269,12 +270,22 @@ iw_get_invoice (InvoiceWindow *iw) return gncInvoiceLookup (iw->book, &iw->invoice_guid); } +static void +set_gncEntry_switch_type (gpointer data, gpointer user_data) +{ + GncEntry *entry = data; + //g_warning("Modifying date for entry with desc=\"%s\"", gncEntryGetDescription(entry)); + + gncEntrySetQuantity (entry, gnc_numeric_neg (gncEntryGetQuantity (entry))); +} + static void gnc_ui_to_invoice (InvoiceWindow *iw, GncInvoice *invoice) { GtkTextBuffer* text_buffer; GtkTextIter start, end; gchar *text; Timespec ts; + gboolean is_credit_note = gncInvoiceGetIsCreditNote (invoice); if (iw->dialog_type == VIEW_INVOICE) return; @@ -329,10 +340,19 @@ static void gnc_ui_to_invoice (InvoiceWindow *iw, GncInvoice *invoice) gncInvoiceSetBillTo (invoice, &iw->proj_cust); } - /* Document type can only be modified for a new invoice/credit note */ - if (iw->dialog_type == NEW_INVOICE) + /* Document type can only be modified for a new or duplicated invoice/credit note */ + if (iw->dialog_type == NEW_INVOICE || iw->dialog_type == DUP_INVOICE) gncInvoiceSetIsCreditNote (invoice, iw->is_credit_note); + /* If the document type changed on a duplicated invoice, + * its entries should be updated + */ + if (iw->dialog_type == DUP_INVOICE && iw->is_credit_note != is_credit_note) + { + g_list_foreach(gncInvoiceGetEntries(invoice), + &set_gncEntry_switch_type, NULL); + } + gncInvoiceCommitEdit (invoice); gnc_resume_gui_refresh (); } @@ -407,11 +427,12 @@ gnc_invoice_window_ok_cb (GtkWidget *widget, gpointer data) /* Ok, we don't need this anymore */ iw->invoice_guid = *guid_null (); - /* if this is a NEW_INVOICE, and created_invoice is NON-NULL, then - * open up a new window with the invoice. This used to be done + /* if this is a new or duplicated invoice, and created_invoice is NON-NULL, + * then open up a new window with the invoice. This used to be done * in gnc_ui_invoice_new() but cannot be done anymore */ - if (iw->dialog_type == NEW_INVOICE && iw->created_invoice) + if ((iw->dialog_type == NEW_INVOICE || iw->dialog_type == DUP_INVOICE) + && iw->created_invoice) gnc_ui_invoice_edit (iw->created_invoice); gnc_close_gui_component (iw->component_id); @@ -1227,6 +1248,7 @@ gnc_invoice_update_job_choice (InvoiceWindow *iw) break; case NEW_INVOICE: case MOD_INVOICE: + case DUP_INVOICE: iw->job_choice = gnc_general_search_new (GNC_JOB_MODULE_NAME, _("Select..."), TRUE, gnc_invoice_select_job_cb, iw, iw->book); @@ -1298,6 +1320,7 @@ gnc_invoice_update_proj_job (InvoiceWindow *iw) break; case NEW_INVOICE: case MOD_INVOICE: + case DUP_INVOICE: if (iw->proj_cust.owner.undefined == NULL) { iw->proj_job_choice = NULL; @@ -1603,6 +1626,7 @@ gnc_invoice_update_window (InvoiceWindow *iw, GtkWidget *widget) break; case NEW_INVOICE: case MOD_INVOICE: + case DUP_INVOICE: iw->owner_choice = gnc_owner_select_create (iw->owner_label, iw->owner_box, iw->book, &(iw->owner)); @@ -1706,7 +1730,9 @@ gnc_invoice_update_window (InvoiceWindow *iw, GtkWidget *widget) } gnc_invoice_id_changed_cb(NULL, iw); - if (iw->dialog_type == NEW_INVOICE || iw->dialog_type == MOD_INVOICE) + if (iw->dialog_type == NEW_INVOICE || + iw->dialog_type == DUP_INVOICE || + iw->dialog_type == MOD_INVOICE) { if (widget) gtk_widget_show (widget); @@ -1808,6 +1834,7 @@ gnc_invoice_get_title (InvoiceWindow *iw) : _("New Invoice"); break; case MOD_INVOICE: + case DUP_INVOICE: case EDIT_INVOICE: wintitle = iw->is_credit_note ? _("Edit Credit Note") : _("Edit Invoice"); @@ -1826,6 +1853,7 @@ gnc_invoice_get_title (InvoiceWindow *iw) : _("New Bill"); break; case MOD_INVOICE: + case DUP_INVOICE: case EDIT_INVOICE: wintitle = iw->is_credit_note ? _("Edit Credit Note") : _("Edit Bill"); @@ -1844,6 +1872,7 @@ gnc_invoice_get_title (InvoiceWindow *iw) : _("New Expense Voucher"); break; case MOD_INVOICE: + case DUP_INVOICE: case EDIT_INVOICE: wintitle = iw->is_credit_note ? _("Edit Credit Note") : _("Edit Expense Voucher"); @@ -1925,7 +1954,7 @@ gnc_invoice_new_page (QofBook *bookp, InvoiceDialogType type, GncOwner *billto; GncPluginPage *new_page; - g_assert (type != NEW_INVOICE && type != MOD_INVOICE); + g_assert (type != NEW_INVOICE && type != MOD_INVOICE && type != DUP_INVOICE); g_assert (invoice != NULL); /* @@ -2291,14 +2320,17 @@ gnc_invoice_create_page (InvoiceWindow *iw, gpointer page) } static InvoiceWindow * -gnc_invoice_window_new_invoice (QofBook *bookp, const GncOwner *owner, - GncInvoice *invoice) +gnc_invoice_window_new_invoice (InvoiceDialogType dialog_type, QofBook *bookp, + const GncOwner *owner, GncInvoice *invoice) { InvoiceWindow *iw; GtkBuilder *builder; GtkWidget *hbox; GncOwner *billto; const GncOwner *start_owner; + GncBillTerm *owner_terms = NULL; + + g_assert (dialog_type == NEW_INVOICE || dialog_type == MOD_INVOICE || dialog_type == DUP_INVOICE); if (invoice) { @@ -2323,11 +2355,13 @@ gnc_invoice_window_new_invoice (QofBook *bookp, const GncOwner *owner, */ iw = g_new0 (InvoiceWindow, 1); + iw->dialog_type = dialog_type; - if (invoice == NULL) + switch (dialog_type) { - GncBillTerm *owner_terms = NULL; - iw->dialog_type = NEW_INVOICE; + case NEW_INVOICE: + g_assert (bookp); + invoice = gncInvoiceCreate (bookp); gncInvoiceSetCurrency (invoice, gnc_default_currency ()); iw->book = bookp; @@ -2345,12 +2379,16 @@ gnc_invoice_window_new_invoice (QofBook *bookp, const GncOwner *owner, } if (owner_terms) gncInvoiceSetTerms (invoice, owner_terms); - } - else - { - iw->dialog_type = MOD_INVOICE; + break; + + case MOD_INVOICE: + case DUP_INVOICE: start_owner = gncInvoiceGetOwner (invoice); iw->book = gncInvoiceGetBook (invoice); + break; + default: + /* The assert at the beginning of this function should prevent this switch case ! */ + return NULL; } /* Save this for later */ @@ -2374,16 +2412,19 @@ gnc_invoice_window_new_invoice (QofBook *bookp, const GncOwner *owner, iw->type_hbox = GTK_WIDGET (gtk_builder_get_object (builder, "dialog_type_choice_hbox")); iw->type_choice = GTK_WIDGET (gtk_builder_get_object (builder, "dialog_type_invoice")); /* configure the type related widgets based on dialog type and invoice type */ - if (iw->dialog_type == NEW_INVOICE) + switch (dialog_type) { + case NEW_INVOICE: + case DUP_INVOICE: gtk_widget_show_all (iw->type_hbox); gtk_widget_hide (iw->type_label); - } - else - { + break; + case MOD_INVOICE: gtk_widget_hide_all (iw->type_hbox); gtk_widget_show (iw->type_label); - + break; + default: + break; } iw->id_entry = GTK_WIDGET (gtk_builder_get_object (builder, "dialog_id_entry")); @@ -2467,7 +2508,7 @@ gnc_ui_invoice_modify (GncInvoice *invoice) InvoiceWindow *iw; if (!invoice) return NULL; - iw = gnc_invoice_window_new_invoice (NULL, NULL, invoice); + iw = gnc_invoice_window_new_invoice (MOD_INVOICE, NULL, NULL, invoice); return iw; } @@ -2535,17 +2576,16 @@ InvoiceWindow * gnc_ui_invoice_duplicate (GncInvoice *old_invoice, gboolean open g_list_foreach(gncInvoiceGetEntries(new_invoice), &set_gncEntry_date, &new_date_gdate); - // Now open that newly created invoice in the "edit" window - iw = gnc_ui_invoice_edit (new_invoice); - iw->created_invoice = new_invoice; if (open_properties) { - // And also open the "properties" pop-up... however, changing the - // invoice ID won't be copied over to the tab title even though - // it's correctly copied into the invoice. - iw = gnc_ui_invoice_modify (new_invoice); - iw->created_invoice = new_invoice; + // Open the "properties" pop-up for the invoice... + iw = gnc_invoice_window_new_invoice (DUP_INVOICE, NULL, NULL, new_invoice); + } + else + { + // Open the newly created invoice in the "edit" window + iw = gnc_ui_invoice_edit (new_invoice); } return iw; @@ -2567,7 +2607,7 @@ gnc_ui_invoice_new (GncOwner *ownerp, QofBook *bookp) /* Make sure required options exist */ if (!bookp) return NULL; - iw = gnc_invoice_window_new_invoice (bookp, &owner, NULL); + iw = gnc_invoice_window_new_invoice (NEW_INVOICE, bookp, &owner, NULL); return iw; }