mirror of
https://github.com/Gnucash/gnucash.git
synced 2025-02-25 18:55:30 -06:00
more implementation .. add equity-balancing transactions
git-svn-id: svn+ssh://svn.gnucash.org/repo/gnucash/trunk@6175 57a11ea4-9604-0410-9ed3-97b8803252fd
This commit is contained in:
parent
442541d7fe
commit
e5fe29e6c1
@ -178,35 +178,136 @@ find_nearest_equity_acct (Account *acc)
|
||||
/* traverse all accounts, get account balances */
|
||||
|
||||
static void
|
||||
add_closing_balances (AccountGroup *closed_grp, GNCBook *open_book)
|
||||
add_closing_balances (AccountGroup *closed_grp,
|
||||
GNCBook *open_book,
|
||||
GNCBook *closed_book,
|
||||
Timespec *post_date, Timespec *date_entered,
|
||||
const char *desc)
|
||||
{
|
||||
AccountList *acc_list, *node;
|
||||
|
||||
if (!closed_grp) return;
|
||||
|
||||
/* walk accounts in closed book */
|
||||
acc_list = xaccGroupGetAccountList (closed_grp);
|
||||
for (node=acc_list; node; node=node->next)
|
||||
{
|
||||
kvp_frame *cwd;
|
||||
kvp_value *vvv;
|
||||
Account *twin;
|
||||
AccountGroup *childs;
|
||||
Account * candidate = (Account *) node->data;
|
||||
GNCAccountType tip = xaccAccountGetType (candidate);
|
||||
|
||||
if (EQUITY == tip)
|
||||
/* find the peer account of this account in the open book */
|
||||
twin = xaccAccountLookupTwin (candidate, open_book);
|
||||
|
||||
/* -------------------------------- */
|
||||
/* add KVP to open account, indicating the progenitor
|
||||
* of this account. */
|
||||
xaccAccountBeginEdit (twin);
|
||||
cwd = xaccAccountGetSlots (twin);
|
||||
cwd = kvp_frame_get_frame_slash (cwd, "/book/");
|
||||
|
||||
vvv = kvp_value_new_guid (xaccAccountGetGUID (candidate));
|
||||
kvp_frame_set_slot_nc (cwd, "prev-acct", vvv);
|
||||
|
||||
vvv = kvp_value_new_guid (&closed_book->guid);
|
||||
kvp_frame_set_slot_nc (cwd, "prev-book", vvv);
|
||||
|
||||
xaccAccountCommitEdit (twin);
|
||||
|
||||
/* -------------------------------- */
|
||||
/* add KVP to closed account, indicating where
|
||||
* the next book is. */
|
||||
xaccAccountBeginEdit (candidate);
|
||||
cwd = xaccAccountGetSlots (candidate);
|
||||
cwd = kvp_frame_get_frame_slash (cwd, "/book/");
|
||||
|
||||
vvv = kvp_value_new_guid (&open_book->guid);
|
||||
kvp_frame_set_slot_nc (cwd, "next-book", vvv);
|
||||
|
||||
vvv = kvp_value_new_guid (xaccAccountGetGUID (twin));
|
||||
kvp_frame_set_slot_nc (cwd, "next-acct", vvv);
|
||||
|
||||
/* -------------------------------- */
|
||||
/* We need to carry a balance on any account that is not
|
||||
* and income or expense or equity account */
|
||||
if ((INCOME != tip) && (EXPENSE != tip) && (EQUITY != tip))
|
||||
{
|
||||
Split *se, *st;
|
||||
Transaction *trans;
|
||||
Account *equity;
|
||||
gnc_numeric baln;
|
||||
|
||||
baln = xaccAccountGetBalance (candidate);
|
||||
|
||||
/* find the equity account into which we'll poke the
|
||||
* balancing transaction */
|
||||
equity = find_nearest_equity_acct (twin);
|
||||
|
||||
/* -------------------------------- */
|
||||
/* create the balancing transaction */
|
||||
trans = xaccMallocTransaction (open_book);
|
||||
xaccTransBeginEdit (trans);
|
||||
st = xaccMallocSplit(open_book);
|
||||
xaccAccountInsertSplit (twin, st);
|
||||
|
||||
se = xaccMallocSplit(open_book);
|
||||
xaccAccountInsertSplit (equity, se);
|
||||
|
||||
xaccSplitSetValue (st, baln);
|
||||
xaccSplitSetValue (se, gnc_numeric_neg(baln));
|
||||
|
||||
xaccTransSetDatePostedTS (trans, post_date);
|
||||
xaccTransSetDateEnteredTS (trans, date_entered);
|
||||
xaccTransSetDescription (trans, desc);
|
||||
|
||||
/* add KVP data showing where the balancing
|
||||
* transaction came from */
|
||||
cwd = xaccTransGetSlots (trans);
|
||||
cwd = kvp_frame_get_frame_slash (cwd, "/book/");
|
||||
|
||||
vvv = kvp_value_new_guid (&closed_book->guid);
|
||||
kvp_frame_set_slot_nc (cwd, "closed-book", vvv);
|
||||
|
||||
vvv = kvp_value_new_guid (xaccAccountGetGUID(candidate));
|
||||
kvp_frame_set_slot_nc (cwd, "closed-acct", vvv);
|
||||
|
||||
xaccTransCommitEdit (trans);
|
||||
|
||||
/* -------------------------------- */
|
||||
/* add KVP to closed account, indicating where the
|
||||
* balance was carried forward to. */
|
||||
xaccAccountBeginEdit (candidate);
|
||||
cwd = xaccAccountGetSlots (candidate);
|
||||
cwd = kvp_frame_get_frame_slash (cwd, "/book/");
|
||||
|
||||
vvv = kvp_value_new_guid (xaccTransGetGUID(trans));
|
||||
kvp_frame_set_slot_nc (cwd, "balancing-trans", vvv);
|
||||
xaccAccountCommitEdit (candidate);
|
||||
}
|
||||
|
||||
/* we left an open dangling above ... */
|
||||
xaccAccountCommitEdit (candidate);
|
||||
|
||||
|
||||
/* recurse down to the children */
|
||||
childs = xaccAccountGetChildren(candidate);
|
||||
if (childs)
|
||||
{
|
||||
add_closing_balances (childs, open_book, closed_book,
|
||||
post_date, date_entered, desc);
|
||||
}
|
||||
}
|
||||
|
||||
#if 0
|
||||
for each
|
||||
|
||||
|
||||
|
||||
#endif
|
||||
}
|
||||
|
||||
/* ================================================================ */
|
||||
/* split a book into two by date */
|
||||
|
||||
GNCBook *
|
||||
gnc_book_calve_period (GNCBook *existing_book, Timespec calve_date)
|
||||
gnc_book_calve_period (GNCBook *existing_book, Timespec calve_date,
|
||||
const char * memo)
|
||||
{
|
||||
Query *query;
|
||||
GNCBook *partition_book;
|
||||
@ -247,6 +348,11 @@ gnc_book_calve_period (GNCBook *existing_book, Timespec calve_date)
|
||||
vvv = kvp_value_new_guid (&partition_book->guid);
|
||||
kvp_frame_set_slot_nc (exist_cwd, "prev-book", vvv);
|
||||
|
||||
/* add in transactions to equity accounts that will
|
||||
* hold the colsing balances */
|
||||
add_closing_balances (gnc_book_get_group(partition_book),
|
||||
existing_book, partition_book,
|
||||
&calve_date, &ts, memo);
|
||||
return partition_book;
|
||||
}
|
||||
|
||||
|
@ -26,30 +26,49 @@
|
||||
* book into two books, returning a newly created book with
|
||||
* the older transactions placed in it.
|
||||
*
|
||||
* The 'memo' is used as the description in the transaction that
|
||||
* creates the opening balances for the accounts. Typically,
|
||||
* it should be _("Opening Balance")
|
||||
*
|
||||
-- Make an equity transfer so that we can carry forward the balances.
|
||||
the equity account is created if not found. only the peers and
|
||||
immediate parents of an account is searchd for the qeuity account.
|
||||
|
||||
-- hack alert -- should not allow closed books to have unreconciled
|
||||
transactions ???
|
||||
-- It will use the following kvp entries in /book/:
|
||||
|
||||
Implemented in book:
|
||||
/book/start-date earliest date in this book.
|
||||
Implemented in the closed book:
|
||||
/book/end-date latest date in this book. must not change ...
|
||||
/book/close-date date on which book was closed.
|
||||
/book/next-book guid of next book
|
||||
/book/prev-book guid of previous book
|
||||
/book/next-book guid of next book (the still-open book)
|
||||
|
||||
Mot imlemented (yet):
|
||||
/book/closing-balance-of-account-guid
|
||||
Implemented in still-open book:
|
||||
/book/start-date earliest date in this book.
|
||||
/book/prev-book guid of previous book (the closed book)
|
||||
|
||||
Implemented in the balancing transaction:
|
||||
/book/closed-acct guid of account whose balance was brought forward
|
||||
/book/closed-book guid of book whose balance was brought forward
|
||||
|
||||
Implemented in the closed account:
|
||||
/book/balancing-trans GUID of equity-balancing transaction.
|
||||
/book/next-book GUID of equity-balancing book.
|
||||
/book/next-acct GUID of twin of this account in the open book.
|
||||
|
||||
Implemented in the still-open account:
|
||||
/book/prev-acct GUID of twin of this account in the closed book.
|
||||
/book/prev-book guid of previous book (the closed book)
|
||||
|
||||
Not imlemented (yet), these should go into book:
|
||||
/book/name=some-user-supplied-name
|
||||
/book/notes=user-supplied-descriptive-comments
|
||||
/book/accounting-period=enum {none, week, month, quarter, trimester, year}
|
||||
|
||||
To go into account:
|
||||
/book/balancing-trans GUID of equity-balancing transaction.
|
||||
|
||||
|
||||
*/
|
||||
GNCBook * gnc_book_calve_period (GNCBook *, Timespec);
|
||||
GNCBook * gnc_book_calve_period (GNCBook *, Timespec, const char *memo);
|
||||
|
||||
/* The gnc_book_partition() uses the result of the indicated query
|
||||
* to partition an existing book into two parts. It returns
|
||||
|
Loading…
Reference in New Issue
Block a user