mirror of
https://github.com/Gnucash/gnucash.git
synced 2024-11-26 02:40:43 -06:00
[scrub.c] xaccTransScrubSplits calls Begin/Commit only if required
This commit is contained in:
parent
872e20c555
commit
81902ba8bb
@ -43,6 +43,7 @@
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <stdint.h>
|
||||
#include <stdbool.h>
|
||||
|
||||
#include "Account.h"
|
||||
#include "AccountP.h"
|
||||
@ -231,8 +232,10 @@ xaccAccountScrubSplits (Account *account)
|
||||
scrub_depth--;
|
||||
}
|
||||
|
||||
void
|
||||
xaccSplitScrub (Split *split)
|
||||
/* if dry_run is true, this function will analyze the split and
|
||||
return true if the split will be modified during the actual scrub. */
|
||||
static bool
|
||||
split_scrub_or_dry_run (Split *split, bool dry_run)
|
||||
{
|
||||
Account *account;
|
||||
Transaction *trans;
|
||||
@ -240,14 +243,14 @@ xaccSplitScrub (Split *split)
|
||||
gnc_commodity *currency, *acc_commodity;
|
||||
int scu;
|
||||
|
||||
if (!split) return;
|
||||
if (!split) return false;
|
||||
ENTER ("(split=%p)", split);
|
||||
|
||||
trans = xaccSplitGetParent (split);
|
||||
if (!trans)
|
||||
{
|
||||
LEAVE("no trans");
|
||||
return;
|
||||
return false;
|
||||
}
|
||||
|
||||
account = xaccSplitGetAccount (split);
|
||||
@ -257,7 +260,10 @@ xaccSplitScrub (Split *split)
|
||||
*/
|
||||
if (!account)
|
||||
{
|
||||
xaccTransScrubOrphans (trans);
|
||||
if (dry_run)
|
||||
return true;
|
||||
else
|
||||
xaccTransScrubOrphans (trans);
|
||||
account = xaccSplitGetAccount (split);
|
||||
}
|
||||
|
||||
@ -269,7 +275,7 @@ xaccSplitScrub (Split *split)
|
||||
{
|
||||
PINFO ("Free Floating Transaction!");
|
||||
LEAVE ("no account");
|
||||
return;
|
||||
return false;
|
||||
}
|
||||
|
||||
/* Split amounts and values should be valid numbers */
|
||||
@ -277,14 +283,20 @@ xaccSplitScrub (Split *split)
|
||||
if (gnc_numeric_check (value))
|
||||
{
|
||||
value = gnc_numeric_zero();
|
||||
xaccSplitSetValue (split, value);
|
||||
if (dry_run)
|
||||
return true;
|
||||
else
|
||||
xaccSplitSetValue (split, value);
|
||||
}
|
||||
|
||||
amount = xaccSplitGetAmount (split);
|
||||
if (gnc_numeric_check (amount))
|
||||
{
|
||||
amount = gnc_numeric_zero();
|
||||
xaccSplitSetAmount (split, amount);
|
||||
if (dry_run)
|
||||
return true;
|
||||
else
|
||||
xaccSplitSetAmount (split, amount);
|
||||
}
|
||||
|
||||
currency = xaccTransGetCurrency (trans);
|
||||
@ -295,12 +307,15 @@ xaccSplitScrub (Split *split)
|
||||
acc_commodity = xaccAccountGetCommodity(account);
|
||||
if (!acc_commodity)
|
||||
{
|
||||
xaccAccountScrubCommodity (account);
|
||||
if (dry_run)
|
||||
return true;
|
||||
else
|
||||
xaccAccountScrubCommodity (account);
|
||||
}
|
||||
if (!acc_commodity || !gnc_commodity_equiv(acc_commodity, currency))
|
||||
{
|
||||
LEAVE ("(split=%p) inequiv currency", split);
|
||||
return;
|
||||
return false;
|
||||
}
|
||||
|
||||
scu = MIN (xaccAccountGetCommoditySCU (account),
|
||||
@ -309,9 +324,12 @@ xaccSplitScrub (Split *split)
|
||||
if (gnc_numeric_same (amount, value, scu, GNC_HOW_RND_ROUND_HALF_UP))
|
||||
{
|
||||
LEAVE("(split=%p) different values", split);
|
||||
return;
|
||||
return false;
|
||||
}
|
||||
|
||||
if (dry_run)
|
||||
return true;
|
||||
|
||||
/*
|
||||
* This will be hit every time you answer yes to the dialog "The
|
||||
* current transaction has changed. Would you like to record it.
|
||||
@ -327,6 +345,7 @@ xaccSplitScrub (Split *split)
|
||||
xaccSplitSetAmount (split, value);
|
||||
xaccTransCommitEdit (trans);
|
||||
LEAVE ("(split=%p)", split);
|
||||
return true;
|
||||
}
|
||||
|
||||
/* ================================================================ */
|
||||
@ -340,6 +359,15 @@ xaccTransScrubSplits (Transaction *trans)
|
||||
if (!currency)
|
||||
PERR ("Transaction doesn't have a currency!");
|
||||
|
||||
bool must_scrub = false;
|
||||
|
||||
for (GList *n = xaccTransGetSplitList (trans); !must_scrub && n; n = g_list_next (n))
|
||||
if (split_scrub_or_dry_run (n->data, true))
|
||||
must_scrub = true;
|
||||
|
||||
if (!must_scrub)
|
||||
return;
|
||||
|
||||
xaccTransBeginEdit(trans);
|
||||
/* The split scrub expects the transaction to have a currency! */
|
||||
|
||||
@ -349,6 +377,13 @@ xaccTransScrubSplits (Transaction *trans)
|
||||
xaccTransCommitEdit(trans);
|
||||
}
|
||||
|
||||
/* ================================================================ */
|
||||
|
||||
void
|
||||
xaccSplitScrub (Split *split)
|
||||
{
|
||||
split_scrub_or_dry_run (split, false);
|
||||
}
|
||||
|
||||
/* ================================================================ */
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user