first round of fixes for computing reconciled balance correctly

for stock accounts


git-svn-id: svn+ssh://svn.gnucash.org/repo/gnucash/trunk@293 57a11ea4-9604-0410-9ed3-97b8803252fd
This commit is contained in:
Linas Vepstas 1997-12-05 21:06:05 +00:00
parent efc60b618c
commit 238561ab85
2 changed files with 44 additions and 7 deletions

View File

@ -485,6 +485,27 @@ double xaccGetClearedBalance (Account *acc, Transaction *trans)
/********************************************************************\ /********************************************************************\
\********************************************************************/ \********************************************************************/
double xaccGetReconciledBalance (Account *acc, Transaction *trans)
{
double themount; /* amount */
/* for a double-entry, determine if this is a credit or a debit */
if ( trans->credit == ((struct _account *) acc) ) {
themount = trans->credit_reconciled_balance;
} else
if ( trans->debit == ((struct _account *) acc) ) {
themount = trans->debit_reconciled_balance;
} else {
printf ("Internal Error: xaccGetReconciledBalance: missing double entry \n");
printf ("this error should not occur. Please report the problem. \n");
themount = 0.0; /* punt */
}
return themount;
}
/********************************************************************\
\********************************************************************/
double xaccGetShareBalance (Account *acc, Transaction *trans) double xaccGetShareBalance (Account *acc, Transaction *trans)
{ {
double themount; /* amount */ double themount; /* amount */
@ -537,8 +558,10 @@ xaccRecomputeBalance( Account * acc )
int i; int i;
double dbalance = 0.0; double dbalance = 0.0;
double dcleared_balance = 0.0; double dcleared_balance = 0.0;
double dreconciled_balance = 0.0;
double share_balance = 0.0; double share_balance = 0.0;
double share_cleared_balance = 0.0; double share_cleared_balance = 0.0;
double share_reconciled_balance = 0.0;
double amt = 0.0; double amt = 0.0;
Transaction *trans, *last_trans=NULL; Transaction *trans, *last_trans=NULL;
Account *tracc; Account *tracc;
@ -557,6 +580,11 @@ xaccRecomputeBalance( Account * acc )
dcleared_balance += amt * (trans->share_price); dcleared_balance += amt * (trans->share_price);
} }
if( YREC == trans->reconciled ) {
share_reconciled_balance += amt;
dreconciled_balance += amt * (trans->share_price);
}
tracc = (Account *) trans->credit; tracc = (Account *) trans->credit;
if (tracc == acc) { if (tracc == acc) {
/* For bank accounts, the invarient subtotal is the dollar /* For bank accounts, the invarient subtotal is the dollar
@ -564,13 +592,17 @@ xaccRecomputeBalance( Account * acc )
if ( (STOCK == tracc->type) || ( MUTUAL == tracc->type) ) { if ( (STOCK == tracc->type) || ( MUTUAL == tracc->type) ) {
trans -> credit_share_balance = share_balance; trans -> credit_share_balance = share_balance;
trans -> credit_share_cleared_balance = share_cleared_balance; trans -> credit_share_cleared_balance = share_cleared_balance;
trans -> credit_share_reconciled_balance = share_reconciled_balance;
trans -> credit_balance = trans->share_price * share_balance; trans -> credit_balance = trans->share_price * share_balance;
trans -> credit_cleared_balance = trans->share_price * share_cleared_balance; trans -> credit_cleared_balance = trans->share_price * share_cleared_balance;
trans -> credit_reconciled_balance = trans->share_price * share_reconciled_balance;
} else { } else {
trans -> credit_share_balance = dbalance; trans -> credit_share_balance = dbalance;
trans -> credit_share_cleared_balance = dcleared_balance; trans -> credit_share_cleared_balance = dcleared_balance;
trans -> credit_share_reconciled_balance = dreconciled_balance;
trans -> credit_balance = dbalance; trans -> credit_balance = dbalance;
trans -> credit_cleared_balance = dcleared_balance; trans -> credit_cleared_balance = dcleared_balance;
trans -> credit_reconciled_balance = dreconciled_balance;
} }
} }
tracc = (Account *) trans->debit; tracc = (Account *) trans->debit;
@ -578,13 +610,17 @@ xaccRecomputeBalance( Account * acc )
if ( (STOCK == tracc->type) || ( MUTUAL == tracc->type) ) { if ( (STOCK == tracc->type) || ( MUTUAL == tracc->type) ) {
trans -> debit_share_balance = share_balance; trans -> debit_share_balance = share_balance;
trans -> debit_share_cleared_balance = share_cleared_balance; trans -> debit_share_cleared_balance = share_cleared_balance;
trans -> debit_share_reconciled_balance = share_reconciled_balance;
trans -> debit_balance = trans->share_price * share_balance; trans -> debit_balance = trans->share_price * share_balance;
trans -> debit_cleared_balance = trans->share_price * share_cleared_balance; trans -> debit_cleared_balance = trans->share_price * share_cleared_balance;
trans -> debit_reconciled_balance = trans->share_price * share_reconciled_balance;
} else { } else {
trans -> debit_share_balance = dbalance; trans -> debit_share_balance = dbalance;
trans -> debit_share_cleared_balance = dcleared_balance; trans -> debit_share_cleared_balance = dcleared_balance;
trans -> debit_share_reconciled_balance = dreconciled_balance;
trans -> debit_balance = dbalance; trans -> debit_balance = dbalance;
trans -> debit_cleared_balance = dcleared_balance; trans -> debit_cleared_balance = dcleared_balance;
trans -> debit_reconciled_balance = dreconciled_balance;
} }
} }
@ -595,13 +631,16 @@ xaccRecomputeBalance( Account * acc )
if (last_trans) { if (last_trans) {
acc -> balance = share_balance * (last_trans->share_price); acc -> balance = share_balance * (last_trans->share_price);
acc -> cleared_balance = share_cleared_balance * (last_trans->share_price); acc -> cleared_balance = share_cleared_balance * (last_trans->share_price);
acc -> reconciled_balance = share_reconciled_balance * (last_trans->share_price);
} else { } else {
acc -> balance = 0.0; acc -> balance = 0.0;
acc -> cleared_balance = 0.0; acc -> cleared_balance = 0.0;
acc -> reconciled_balance = 0.0;
} }
} else { } else {
acc -> balance = dbalance; acc -> balance = dbalance;
acc -> cleared_balance = dcleared_balance; acc -> cleared_balance = dcleared_balance;
acc -> reconciled_balance = dreconciled_balance;
} }
return; return;

View File

@ -239,18 +239,16 @@ startRecnWindow( Widget parent, Account *acc, double *diff )
widget, endB, newB; widget, endB, newB;
Transaction *trans; Transaction *trans;
char buf[BUFSIZE]; char buf[BUFSIZE];
int j;
double dendBalance; double dendBalance;
int done=-1; int done=-1;
setBusyCursor( parent ); setBusyCursor( parent );
/* Figure out previous ending balance: */ /* Get the previous ending balance. Use the published
dendBalance=0.0; * account interface for this, since the ending balance
j=0; * may have to be adjusted for stock price fluctuations.
while( (trans = getTransaction(acc,j++)) != NULL ) */
if( trans->reconciled == YREC ) dendBalance = acc->reconciled_balance;
dendBalance += xaccGetAmount (acc, trans);
/* Create the dialog box... XmNdeleteResponse is set to /* Create the dialog box... XmNdeleteResponse is set to
* XmDESTROY so the dialog's memory is freed when it is closed */ * XmDESTROY so the dialog's memory is freed when it is closed */