mirror of
https://github.com/Gnucash/gnucash.git
synced 2025-02-25 18:55:30 -06:00
Check more splits while running check & repair on business accounts
In addition, speed up the process a bit by already deleting empty splits as soon as they're encountered
This commit is contained in:
parent
a9c624bfad
commit
254b4fbc2f
@ -200,7 +200,6 @@ scrub_start:
|
|||||||
if (!sl_split)
|
if (!sl_split)
|
||||||
continue; // next scrub lot split
|
continue; // next scrub lot split
|
||||||
|
|
||||||
// Only lot link transactions need to be scrubbed
|
|
||||||
ll_txn = xaccSplitGetParent (sl_split);
|
ll_txn = xaccSplitGetParent (sl_split);
|
||||||
|
|
||||||
if (!ll_txn)
|
if (!ll_txn)
|
||||||
@ -212,9 +211,19 @@ scrub_start:
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (xaccTransGetTxnType (ll_txn) != TXN_TYPE_LINK)
|
// Don't scrub invoice type transactions
|
||||||
|
if (xaccTransGetTxnType (ll_txn) == TXN_TYPE_INVOICE)
|
||||||
continue; // next scrub lot split
|
continue; // next scrub lot split
|
||||||
|
|
||||||
|
// Empty splits can be removed immediately
|
||||||
|
if (gnc_numeric_zero_p (xaccSplitGetValue (sl_split)) ||
|
||||||
|
gnc_numeric_zero_p(xaccSplitGetValue (sl_split)))
|
||||||
|
{
|
||||||
|
xaccSplitDestroy (sl_split);
|
||||||
|
modified = TRUE;
|
||||||
|
goto scrub_start;
|
||||||
|
}
|
||||||
|
|
||||||
// Iterate over all splits in the lot link transaction
|
// Iterate over all splits in the lot link transaction
|
||||||
for (lts_iter = xaccTransGetSplitList (ll_txn); lts_iter; lts_iter = lts_iter->next)
|
for (lts_iter = xaccTransGetSplitList (ll_txn); lts_iter; lts_iter = lts_iter->next)
|
||||||
{
|
{
|
||||||
@ -229,20 +238,22 @@ scrub_start:
|
|||||||
if (sl_split == ll_txn_split)
|
if (sl_split == ll_txn_split)
|
||||||
continue; // next lot link transaction split
|
continue; // next lot link transaction split
|
||||||
|
|
||||||
|
// Skip empty other splits. They'll be scrubbed in the outer for loop later
|
||||||
|
if (gnc_numeric_zero_p (xaccSplitGetValue (ll_txn_split)) ||
|
||||||
|
gnc_numeric_zero_p(xaccSplitGetValue (ll_txn_split)))
|
||||||
|
continue;
|
||||||
|
|
||||||
// Only splits of opposite signed values can be scrubbed
|
// Only splits of opposite signed values can be scrubbed
|
||||||
if (gnc_numeric_positive_p (xaccSplitGetValue (sl_split)) ==
|
if (gnc_numeric_positive_p (xaccSplitGetValue (sl_split)) ==
|
||||||
gnc_numeric_positive_p (xaccSplitGetValue (ll_txn_split)))
|
gnc_numeric_positive_p (xaccSplitGetValue (ll_txn_split)))
|
||||||
continue; // next lot link transaction split
|
continue; // next lot link transaction split
|
||||||
|
|
||||||
// Find linked lot via split
|
// We can only scrub if the other split is in a lot as well
|
||||||
|
// Link transactions always have their other split in another lot
|
||||||
|
// however ordinary payment transactions may not
|
||||||
remote_lot = xaccSplitGetLot (ll_txn_split);
|
remote_lot = xaccSplitGetLot (ll_txn_split);
|
||||||
if (!remote_lot)
|
if (!remote_lot)
|
||||||
{
|
|
||||||
// This is unexpected - write a warning message and skip this split
|
|
||||||
PWARN("Encountered a Lot Link transaction with a split that's not in any lot. "
|
|
||||||
"This is unexpected! Skipping split %p from transaction %p.", ll_txn_split, ll_txn);
|
|
||||||
continue;
|
continue;
|
||||||
}
|
|
||||||
|
|
||||||
sl_is_doc_lot = (gncInvoiceGetInvoiceFromLot (scrub_lot) != NULL);
|
sl_is_doc_lot = (gncInvoiceGetInvoiceFromLot (scrub_lot) != NULL);
|
||||||
rl_is_doc_lot = (gncInvoiceGetInvoiceFromLot (remote_lot) != NULL);
|
rl_is_doc_lot = (gncInvoiceGetInvoiceFromLot (remote_lot) != NULL);
|
||||||
@ -550,10 +561,16 @@ gncScrubBusinessSplit (Split *split)
|
|||||||
*/
|
*/
|
||||||
else if (gnc_numeric_zero_p (xaccSplitGetAmount(split)) && !gncInvoiceGetInvoiceFromTxn (txn))
|
else if (gnc_numeric_zero_p (xaccSplitGetAmount(split)) && !gncInvoiceGetInvoiceFromTxn (txn))
|
||||||
{
|
{
|
||||||
|
GNCLot *lot = xaccSplitGetLot (split);
|
||||||
time64 pdate = xaccTransGetDate (txn);
|
time64 pdate = xaccTransGetDate (txn);
|
||||||
gchar *pdatestr = gnc_ctime (&pdate);
|
gchar *pdatestr = gnc_ctime (&pdate);
|
||||||
PINFO ("Destroying empty split %p from transaction %s (%s)", split, pdatestr, xaccTransGetDescription(txn));
|
PINFO ("Destroying empty split %p from transaction %s (%s)", split, pdatestr, xaccTransGetDescription(txn));
|
||||||
xaccSplitDestroy (split);
|
xaccSplitDestroy (split);
|
||||||
|
|
||||||
|
// Also delete the lot containing this split if it was the last split in that lot
|
||||||
|
if (lot && (gnc_lot_count_splits (lot) == 0))
|
||||||
|
gnc_lot_destroy (lot);
|
||||||
|
|
||||||
deleted_split = TRUE;
|
deleted_split = TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user