mirror of
https://github.com/Gnucash/gnucash.git
synced 2025-02-25 18:55:30 -06:00
* src/engine/Account.[ch]: add an xaccAccountRemoveLot() function to allow
the LOT code to clear memory when you destroy a lot. Fixes a crash when you destroy a lot. * src/engine/Transaction.[ch]: add an xaccTransClearReadOnly() function to let you clear the flag so you can then remove an transaction. Only for internal uses only! This is used by the Invoice UnPost code. * src/engine/gnc-lot.c: remove the lot from the account's list of lots when the last split is gone. * src/business/business-core/gncInvoice.[ch]: implement Unpost function * src/business/business-ledger/gncEntryLedger.[ch]: change the set_readonly() function to let you toggle back and forth between readonly and readwrite ledgers. * src/business/business-gnome/dialog-invoice.c: implement unpost; set back to readwrite if the unpost succeeds * src/business/business-gnome/dialog-order.c: use new set_readonly() API FIXES BUG #101452 git-svn-id: svn+ssh://svn.gnucash.org/repo/gnucash/trunk@7750 57a11ea4-9604-0410-9ed3-97b8803252fd
This commit is contained in:
parent
05809c5a38
commit
5c8944868d
17
ChangeLog
17
ChangeLog
@ -28,6 +28,23 @@
|
|||||||
* src/business/business-gnome/dialog-payment.c: move logic to
|
* src/business/business-gnome/dialog-payment.c: move logic to
|
||||||
apply payment to business-core.
|
apply payment to business-core.
|
||||||
|
|
||||||
|
* src/engine/Account.[ch]: add an xaccAccountRemoveLot() function to allow
|
||||||
|
the LOT code to clear memory when you destroy a lot. Fixes a crash
|
||||||
|
when you destroy a lot.
|
||||||
|
* src/engine/Transaction.[ch]: add an xaccTransClearReadOnly() function
|
||||||
|
to let you clear the flag so you can then remove an transaction. Only
|
||||||
|
for internal uses only! This is used by the Invoice UnPost code.
|
||||||
|
* src/engine/gnc-lot.c: remove the lot from the account's list of lots
|
||||||
|
when the last split is gone.
|
||||||
|
|
||||||
|
* src/business/business-core/gncInvoice.[ch]: implement Unpost function
|
||||||
|
* src/business/business-ledger/gncEntryLedger.[ch]: change the
|
||||||
|
set_readonly() function to let you toggle back and forth between
|
||||||
|
readonly and readwrite ledgers.
|
||||||
|
* src/business/business-gnome/dialog-invoice.c: implement unpost; set back
|
||||||
|
to readwrite if the unpost succeeds
|
||||||
|
* src/business/business-gnome/dialog-order.c: use new set_readonly() API
|
||||||
|
FIXES BUG #101452
|
||||||
|
|
||||||
2002-12-30 Benoit Grégoire <bock@step.polymtl.ca>
|
2002-12-30 Benoit Grégoire <bock@step.polymtl.ca>
|
||||||
* src/import-export/hbci/druid-hbci-initial.c
|
* src/import-export/hbci/druid-hbci-initial.c
|
||||||
|
@ -514,7 +514,18 @@ gboolean gncInvoiceIsDirty (GncInvoice *invoice)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
gncInvoiceAttachInvoiceToLot (GncInvoice *invoice, GNCLot *lot)
|
gncInvoiceDetachFromLot (GNCLot *lot)
|
||||||
|
{
|
||||||
|
kvp_frame *kvp;
|
||||||
|
|
||||||
|
if (!lot) return;
|
||||||
|
|
||||||
|
kvp = gnc_lot_get_slots (lot);
|
||||||
|
kvp_frame_set_slot_path (kvp, NULL, GNC_INVOICE_ID, GNC_INVOICE_GUID, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
gncInvoiceAttachToLot (GncInvoice *invoice, GNCLot *lot)
|
||||||
{
|
{
|
||||||
kvp_frame *kvp;
|
kvp_frame *kvp;
|
||||||
kvp_value *value;
|
kvp_value *value;
|
||||||
@ -552,7 +563,7 @@ GncInvoice * gncInvoiceGetInvoiceFromLot (GNCLot *lot)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
gncInvoiceAttachInvoiceToTxn (GncInvoice *invoice, Transaction *txn)
|
gncInvoiceAttachToTxn (GncInvoice *invoice, Transaction *txn)
|
||||||
{
|
{
|
||||||
kvp_frame *kvp;
|
kvp_frame *kvp;
|
||||||
kvp_value *value;
|
kvp_value *value;
|
||||||
@ -775,8 +786,8 @@ Transaction * gncInvoicePostToAccount (GncInvoice *invoice, Account *acc,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Now attach this invoice to the txn, lot, and account */
|
/* Now attach this invoice to the txn, lot, and account */
|
||||||
gncInvoiceAttachInvoiceToLot (invoice, lot);
|
gncInvoiceAttachToLot (invoice, lot);
|
||||||
gncInvoiceAttachInvoiceToTxn (invoice, txn);
|
gncInvoiceAttachToTxn (invoice, txn);
|
||||||
gncInvoiceSetPostedAcc (invoice, acc);
|
gncInvoiceSetPostedAcc (invoice, acc);
|
||||||
|
|
||||||
xaccTransSetReadOnly (txn, _("Generated from an invoice. Try unposting the invoice."));
|
xaccTransSetReadOnly (txn, _("Generated from an invoice. Try unposting the invoice."));
|
||||||
@ -843,6 +854,49 @@ Transaction * gncInvoicePostToAccount (GncInvoice *invoice, Account *acc,
|
|||||||
return txn;
|
return txn;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
gboolean
|
||||||
|
gncInvoiceUnpost (GncInvoice *invoice)
|
||||||
|
{
|
||||||
|
Transaction *txn;
|
||||||
|
GNCLot *lot;
|
||||||
|
|
||||||
|
if (!invoice) return FALSE;
|
||||||
|
if (!gncInvoiceIsPosted (invoice)) return FALSE;
|
||||||
|
|
||||||
|
txn = gncInvoiceGetPostedTxn (invoice);
|
||||||
|
g_return_val_if_fail (txn, FALSE);
|
||||||
|
|
||||||
|
lot = gncInvoiceGetPostedLot (invoice);
|
||||||
|
g_return_val_if_fail (lot, FALSE);
|
||||||
|
|
||||||
|
/* Destroy the Posted Transaction */
|
||||||
|
xaccTransClearReadOnly (txn);
|
||||||
|
xaccTransBeginEdit (txn);
|
||||||
|
xaccTransDestroy (txn);
|
||||||
|
xaccTransCommitEdit (txn);
|
||||||
|
|
||||||
|
/* Disconnect the lot from the invoice; re-attach to the invoice owner */
|
||||||
|
gncInvoiceDetachFromLot (lot);
|
||||||
|
gncOwnerAttachToLot (&invoice->owner, lot);
|
||||||
|
|
||||||
|
/* If the lot has no splits, then destroy it */
|
||||||
|
if (!gnc_lot_count_splits (lot))
|
||||||
|
gnc_lot_destroy (lot);
|
||||||
|
|
||||||
|
/* Clear out the invoice posted information */
|
||||||
|
gncInvoiceBeginEdit (invoice);
|
||||||
|
|
||||||
|
invoice->posted_acc = NULL;
|
||||||
|
invoice->posted_txn = NULL;
|
||||||
|
invoice->posted_lot = NULL;
|
||||||
|
invoice->date_posted.tv_sec = invoice->date_posted.tv_nsec = 0;
|
||||||
|
|
||||||
|
mark_invoice (invoice);
|
||||||
|
gncInvoiceCommitEdit (invoice);
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
gnc_lot_match_invoice_owner (GNCLot *lot, gpointer user_data)
|
gnc_lot_match_invoice_owner (GNCLot *lot, gpointer user_data)
|
||||||
{
|
{
|
||||||
|
@ -78,6 +78,16 @@ gncInvoicePostToAccount (GncInvoice *invoice, Account *acc,
|
|||||||
Timespec *posted_date, Timespec *due_date,
|
Timespec *posted_date, Timespec *due_date,
|
||||||
const char *memo);
|
const char *memo);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* UNpost this invoice. This will destroy the posted transaction
|
||||||
|
* and return the invoice to its unposted state. It may leave empty
|
||||||
|
* lots out there.
|
||||||
|
*
|
||||||
|
* Returns TRUE if successful, FALSE if there is a problem.
|
||||||
|
*/
|
||||||
|
gboolean
|
||||||
|
gncInvoiceUnpost (GncInvoice *invoice);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Apply a payment of "amount" for the owner, between the xfer_account
|
* Apply a payment of "amount" for the owner, between the xfer_account
|
||||||
* (bank or other asset) and the posted_account (A/R or A/P).
|
* (bank or other asset) and the posted_account (A/R or A/P).
|
||||||
|
@ -572,11 +572,11 @@ gnc_invoice_window_postCB (GtkWidget *widget, gpointer data)
|
|||||||
|
|
||||||
/* Reset the type; change to read-only! */
|
/* Reset the type; change to read-only! */
|
||||||
iw->dialog_type = VIEW_INVOICE;
|
iw->dialog_type = VIEW_INVOICE;
|
||||||
gnc_entry_ledger_set_readonly (iw->ledger);
|
gnc_entry_ledger_set_readonly (iw->ledger, TRUE);
|
||||||
|
|
||||||
/* ... and redisplay here. */
|
/* ... and redisplay here. */
|
||||||
gnc_invoice_update_window (iw);
|
gnc_invoice_update_window (iw);
|
||||||
gnc_table_refresh_gui (gnc_entry_ledger_get_table (iw->ledger), TRUE);
|
gnc_table_refresh_gui (gnc_entry_ledger_get_table (iw->ledger), FALSE);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@ -598,7 +598,17 @@ gnc_invoice_window_unpostCB (GtkWidget *widget, gpointer data)
|
|||||||
|
|
||||||
if (!result) return;
|
if (!result) return;
|
||||||
|
|
||||||
|
/* Attempt to unpost the invoice */
|
||||||
|
gnc_suspend_gui_refresh ();
|
||||||
|
result = gncInvoiceUnpost (invoice);
|
||||||
|
gnc_resume_gui_refresh ();
|
||||||
|
if (!result) return;
|
||||||
|
|
||||||
|
/* if we get here, we succeeded in unposting -- reset the ledger and redisplay */
|
||||||
|
iw->dialog_type = EDIT_INVOICE;
|
||||||
|
gnc_entry_ledger_set_readonly (iw->ledger, FALSE);
|
||||||
|
gnc_invoice_update_window (iw);
|
||||||
|
gnc_table_refresh_gui (gnc_entry_ledger_get_table (iw->ledger), FALSE);
|
||||||
}
|
}
|
||||||
|
|
||||||
void gnc_invoice_window_cut_cb (GtkWidget *widget, gpointer data)
|
void gnc_invoice_window_cut_cb (GtkWidget *widget, gpointer data)
|
||||||
@ -1469,7 +1479,7 @@ gnc_invoice_update_window (InvoiceWindow *iw)
|
|||||||
* XXX: right now we always can, but there
|
* XXX: right now we always can, but there
|
||||||
* may be times in the future when we cannot.
|
* may be times in the future when we cannot.
|
||||||
*/
|
*/
|
||||||
//can_unpost = TRUE;
|
can_unpost = TRUE;
|
||||||
|
|
||||||
ts = gncInvoiceGetDatePosted (invoice);
|
ts = gncInvoiceGetDatePosted (invoice);
|
||||||
gnc_date_edit_set_time_ts (GNC_DATE_EDIT (iw->posted_date), ts);
|
gnc_date_edit_set_time_ts (GNC_DATE_EDIT (iw->posted_date), ts);
|
||||||
|
@ -277,7 +277,7 @@ gnc_order_window_close_order_cb (GtkWidget *widget, gpointer data)
|
|||||||
|
|
||||||
/* Reset the type; change to read-only */
|
/* Reset the type; change to read-only */
|
||||||
ow->dialog_type = VIEW_ORDER;
|
ow->dialog_type = VIEW_ORDER;
|
||||||
gnc_entry_ledger_set_readonly (ow->ledger);
|
gnc_entry_ledger_set_readonly (ow->ledger, TRUE);
|
||||||
|
|
||||||
/* And redisplay the window */
|
/* And redisplay the window */
|
||||||
gnc_order_update_window (ow);
|
gnc_order_update_window (ow);
|
||||||
|
@ -511,11 +511,12 @@ gboolean gnc_entry_ledger_find_entry (GncEntryLedger *ledger, GncEntry *entry,
|
|||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
void gnc_entry_ledger_set_readonly (GncEntryLedger *ledger)
|
void gnc_entry_ledger_set_readonly (GncEntryLedger *ledger, gboolean readonly)
|
||||||
{
|
{
|
||||||
if (!ledger) return;
|
if (!ledger) return;
|
||||||
|
|
||||||
/* reset the ledger type to a viewer */
|
/* reset the ledger type appropriately */
|
||||||
|
if (readonly) {
|
||||||
switch (ledger->type) {
|
switch (ledger->type) {
|
||||||
case GNCENTRY_ORDER_ENTRY:
|
case GNCENTRY_ORDER_ENTRY:
|
||||||
ledger->type = GNCENTRY_ORDER_VIEWER;
|
ledger->type = GNCENTRY_ORDER_VIEWER;
|
||||||
@ -531,11 +532,29 @@ void gnc_entry_ledger_set_readonly (GncEntryLedger *ledger)
|
|||||||
default:
|
default:
|
||||||
return; /* Nothing to do */
|
return; /* Nothing to do */
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
switch (ledger->type) {
|
||||||
|
case GNCENTRY_ORDER_VIEWER:
|
||||||
|
ledger->type = GNCENTRY_ORDER_ENTRY;
|
||||||
|
break;
|
||||||
|
case GNCENTRY_INVOICE_VIEWER:
|
||||||
|
ledger->type = GNCENTRY_INVOICE_ENTRY;
|
||||||
|
create_invoice_query (ledger);
|
||||||
|
break;
|
||||||
|
case GNCENTRY_BILL_VIEWER:
|
||||||
|
ledger->type = GNCENTRY_BILL_ENTRY;
|
||||||
|
create_invoice_query (ledger);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return; /* Nothing to do */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* reset the model */
|
/* reset the model */
|
||||||
gnc_table_model_set_read_only (ledger->table->model, TRUE);
|
gnc_table_model_set_read_only (ledger->table->model, readonly);
|
||||||
|
|
||||||
/* get rid of the blank entry, if it exists */
|
/* if readonly is TRUE, get rid of the blank entry. */
|
||||||
|
if (readonly)
|
||||||
gnc_entry_ledger_clear_blank_entry (ledger);
|
gnc_entry_ledger_clear_blank_entry (ledger);
|
||||||
|
|
||||||
/* and refresh the display */
|
/* and refresh the display */
|
||||||
|
@ -86,7 +86,7 @@ void gnc_entry_ledger_set_colors (GncEntryLedgerColors reg_colors_new);
|
|||||||
|
|
||||||
void gnc_entry_ledger_set_parent (GncEntryLedger *ledger, gncUIWidget parent);
|
void gnc_entry_ledger_set_parent (GncEntryLedger *ledger, gncUIWidget parent);
|
||||||
|
|
||||||
void gnc_entry_ledger_set_readonly (GncEntryLedger *ledger);
|
void gnc_entry_ledger_set_readonly (GncEntryLedger *ledger, gboolean readonly);
|
||||||
|
|
||||||
gboolean gnc_entry_ledger_changed (GncEntryLedger *ledger);
|
gboolean gnc_entry_ledger_changed (GncEntryLedger *ledger);
|
||||||
|
|
||||||
|
@ -963,6 +963,18 @@ xaccClearMarkDownGr (AccountGroup *grp, short val)
|
|||||||
/********************************************************************\
|
/********************************************************************\
|
||||||
\********************************************************************/
|
\********************************************************************/
|
||||||
|
|
||||||
|
void
|
||||||
|
xaccAccountRemoveLot (Account *acc, GNCLot *lot)
|
||||||
|
{
|
||||||
|
if (!acc || !lot) return;
|
||||||
|
ENTER ("(acc=%p, lot=%p)", acc, lot);
|
||||||
|
|
||||||
|
xaccAccountBeginEdit (acc);
|
||||||
|
acc->lots = g_list_remove (acc->lots, lot);
|
||||||
|
xaccAccountCommitEdit (acc);
|
||||||
|
LEAVE ("(acc=%p, lot=%p)", acc, lot);
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
xaccAccountInsertLot (Account *acc, GNCLot *lot)
|
xaccAccountInsertLot (Account *acc, GNCLot *lot)
|
||||||
{
|
{
|
||||||
@ -990,7 +1002,7 @@ xaccAccountInsertLot (Account *acc, GNCLot *lot)
|
|||||||
lot->account = acc;
|
lot->account = acc;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Move all slots over to the new account. At worst,
|
/* Move all splits over to the new account. At worst,
|
||||||
* this is a no-op. */
|
* this is a no-op. */
|
||||||
if (lot->splits)
|
if (lot->splits)
|
||||||
{
|
{
|
||||||
|
@ -203,6 +203,7 @@ gboolean xaccAccountEqual(Account *a, Account* b, gboolean check_guids);
|
|||||||
* the lot, and all of the splits in it, will be moved from that
|
* the lot, and all of the splits in it, will be moved from that
|
||||||
* account to this account. */
|
* account to this account. */
|
||||||
void xaccAccountInsertLot (Account *, GNCLot *);
|
void xaccAccountInsertLot (Account *, GNCLot *);
|
||||||
|
void xaccAccountRemoveLot (Account *, GNCLot *);
|
||||||
|
|
||||||
/** The xaccAccountInsertSplit() method will insert the indicated
|
/** The xaccAccountInsertSplit() method will insert the indicated
|
||||||
* split into the indicated account. If the split already
|
* split into the indicated account. If the split already
|
||||||
|
@ -2578,6 +2578,13 @@ xaccTransSetTxnType (Transaction *trans, char type)
|
|||||||
kvp_value_delete (value);
|
kvp_value_delete (value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void xaccTransClearReadOnly (Transaction *trans)
|
||||||
|
{
|
||||||
|
if (!trans) return;
|
||||||
|
|
||||||
|
kvp_frame_set_slot_path (trans->kvp_data, NULL, TRANS_READ_ONLY_REASON, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
xaccTransSetReadOnly (Transaction *trans, const char *reason)
|
xaccTransSetReadOnly (Transaction *trans, const char *reason)
|
||||||
{
|
{
|
||||||
|
@ -232,6 +232,7 @@ SplitList * xaccTransGetSplitList (const Transaction *trans);
|
|||||||
|
|
||||||
/** Set the transaction to be ReadOnly */
|
/** Set the transaction to be ReadOnly */
|
||||||
void xaccTransSetReadOnly (Transaction *trans, const char *reason);
|
void xaccTransSetReadOnly (Transaction *trans, const char *reason);
|
||||||
|
void xaccTransClearReadOnly (Transaction *trans);
|
||||||
/** FIXME: document me */
|
/** FIXME: document me */
|
||||||
const char * xaccTransGetReadOnly (const Transaction *trans);
|
const char * xaccTransGetReadOnly (const Transaction *trans);
|
||||||
/** FIXME: document me */
|
/** FIXME: document me */
|
||||||
|
@ -258,6 +258,7 @@ gnc_lot_remove_split (GNCLot *lot, Split *split)
|
|||||||
|
|
||||||
if (NULL == lot->splits)
|
if (NULL == lot->splits)
|
||||||
{
|
{
|
||||||
|
xaccAccountRemoveLot (lot->account, lot);
|
||||||
lot->account = NULL;
|
lot->account = NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user