mirror of
https://github.com/Gnucash/gnucash.git
synced 2025-02-25 18:55:30 -06:00
add derek's double-balance idea
git-svn-id: svn+ssh://svn.gnucash.org/repo/gnucash/trunk@7807 57a11ea4-9604-0410-9ed3-97b8803252fd
This commit is contained in:
parent
ebc555fe43
commit
feeec1f6e0
@ -1,9 +1,10 @@
|
|||||||
|
|
||||||
Lots
|
Lots
|
||||||
====
|
====
|
||||||
Implementation Proposal
|
Implementation Proposal
|
||||||
|
|
||||||
Linas Vepstas April 2002
|
Linas Vepstas <linas@linas.org>
|
||||||
|
Last Revised January 2003
|
||||||
|
|
||||||
|
|
||||||
'Lots' capture a fundamental accounting idea behind AR/AP, billing,
|
'Lots' capture a fundamental accounting idea behind AR/AP, billing,
|
||||||
@ -175,6 +176,83 @@ all of the lots that were closed stay with that book. That is,
|
|||||||
closed lots are not propagated forward into the currently open book.
|
closed lots are not propagated forward into the currently open book.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
The "Double Balance" Proposal
|
||||||
|
=============================
|
||||||
|
The following is a proposal for how to handle both realized
|
||||||
|
and unrealized gains/losses by means of "adjusting transactions."
|
||||||
|
It works for simple cases, but has issues for more complex cases.
|
||||||
|
|
||||||
|
------------------
|
||||||
|
Canonical transaction balancing: If all splits in a transaction
|
||||||
|
are in the same 'currency' as the transaction currency, then the
|
||||||
|
sum of the splits *must* equal zero. This is the old, existing
|
||||||
|
double-entry requirement as implemented in Gnucash, and doesn't
|
||||||
|
change.
|
||||||
|
|
||||||
|
If some splits are in one commodity, and others in another, then
|
||||||
|
we can't force a zero balance as above. Instead, we will force
|
||||||
|
a different requirement, the 'double-balance' requirement:
|
||||||
|
|
||||||
|
-- All splits that are *not* in the transaction currency C
|
||||||
|
must be made a part of a lot. (Thus, for example,
|
||||||
|
the transaction currency C is dollars, whereas the split
|
||||||
|
commodity is 'S', shares of RHAT. If a transaction
|
||||||
|
has C in dollars, and 'S' in RHAT, then the S split must
|
||||||
|
be made a part of a Lot.)
|
||||||
|
|
||||||
|
-- The lot will have a designated 'lot currency' L that must
|
||||||
|
be the same as the C of every split in the lot. One
|
||||||
|
cannot enter a split into the lot if C != L. (That is,
|
||||||
|
if I'm working with a Lot of RHAT shares, then *all*
|
||||||
|
splits in the lot must belong to dollar-denominated
|
||||||
|
transactions.)
|
||||||
|
|
||||||
|
-- When a lot is closed, we must have the 'double-balance'
|
||||||
|
condition: The sum total of all 'S' is zero, and the
|
||||||
|
sum total of all 'C' is zero. Thus, if I buy 100 shares
|
||||||
|
of RHAT for $5 and sell 100 shares of RHAT for $10, then
|
||||||
|
I *must* also add an 'adjusting transaction' for zero
|
||||||
|
shares of RHAT, at $500. If there is no adjusting transaction,
|
||||||
|
then the lot cannot be closed. If sum 'S' is zero,
|
||||||
|
while sum 'C' is not zero, then the lot is declared to
|
||||||
|
be 'out-of-balance', and an 'adjusting transaction' must
|
||||||
|
be forced.
|
||||||
|
|
||||||
|
It is only by 'closing a lot' that one is able to regain
|
||||||
|
'perfect balance' in the books. That is, the 'double-balance'
|
||||||
|
requirement is the generalization of the 'double-entry'
|
||||||
|
requirement for stock accounts.
|
||||||
|
|
||||||
|
Note that because the 'adjusting transaction' has one split
|
||||||
|
in dollars, and another split in RHAT shares (albeit for zero
|
||||||
|
RHAT shares), it evades the old double-entry requriement,
|
||||||
|
and will not be flagged as 'out of balance'. Note also
|
||||||
|
that because the 'adjusting transaction' contains a split
|
||||||
|
holding S (albeit zero S), it *must* be a part of a Lot.
|
||||||
|
|
||||||
|
------------------
|
||||||
|
The above seems to work for simple stock-transactions, but
|
||||||
|
fails in other more complex cases. Here's an example.
|
||||||
|
|
||||||
|
Imagine 'S' is in euros, instead of 'RHAT'. So I sell
|
||||||
|
100 dollars, and buy 110 euros. This causes a lot to open
|
||||||
|
up for the euros, with the lot currency 'L' in dollars.
|
||||||
|
Now I try to transfer the euros to other euro accounts.
|
||||||
|
What happens to the lot? Do I have to give up on it?
|
||||||
|
How can I save this bad situation?
|
||||||
|
|
||||||
|
A similar problem occurs for more complex stock transactions:
|
||||||
|
If I buy 100 shares of RHAT with Schwab, and transfer them
|
||||||
|
to another account with Etrade, then I have the same lot
|
||||||
|
closing problem. There's an even worse scenario, where
|
||||||
|
I move to brazil, and take my RHAT stock (purchased in dollars)
|
||||||
|
to my brazilian broker (who will sell them for cruzeiros).
|
||||||
|
|
||||||
|
Is the correct answer to just 'punt' in these cases?
|
||||||
|
How is teh closing of books to be handled in such a case?
|
||||||
|
|
||||||
|
|
||||||
Implementation
|
Implementation
|
||||||
==============
|
==============
|
||||||
Every split has a pointer to a lot (which may be null). A lot has a list
|
Every split has a pointer to a lot (which may be null). A lot has a list
|
||||||
@ -192,7 +270,7 @@ account, but this is a painful process.)
|
|||||||
|
|
||||||
Status
|
Status
|
||||||
======
|
======
|
||||||
Core support for Lots in the engine is complete (but untested).
|
Core support for Lots in the engine is complete (April 2002).
|
||||||
See src/engine/gnc-lot.h for the public API.
|
See src/engine/gnc-lot.h for the public API.
|
||||||
FIFO's have not been started.
|
FIFO's have not been started.
|
||||||
The XML backend support for lot is complete (but untested).
|
The XML backend support for lot is complete (but untested).
|
||||||
|
Loading…
Reference in New Issue
Block a user