diff --git a/src/engine/Makefile.am b/src/engine/Makefile.am index a977dff9b7..b7de73168a 100644 --- a/src/engine/Makefile.am +++ b/src/engine/Makefile.am @@ -44,6 +44,7 @@ gncinclude_HEADERS = \ FreqSpec.h \ GNCId.h \ Group.h \ + Period.h \ SchedXaction.h \ SX-ttinfo.h \ Query.h \ diff --git a/src/engine/Period.c b/src/engine/Period.c index c1b271a3b5..1bbf211eef 100644 --- a/src/engine/Period.c +++ b/src/engine/Period.c @@ -15,59 +15,13 @@ Open questions: how do we deal with the backends ??? * Copyright (c) 2001 Linas Vepstas */ - -#ifndef XACC_PERIOD_H -#define XACC_PERIOD_H - -#include "gnc-book.h" -#include "gnc-engine.h" -#include "Query.h" - -/* The gnc_book_partition() uses the result of the indicated query - * to partition an existing book into two parts. It returns - * a newly created book, containing a copy of all of the accounts, - * and it moves all of the transactions returned by the query to - * the copied accounts. - -The intent is that the 'typical' query will be a date that splits -the book into a 'before and after'; but in fact, any general query -will do. - -Note that this routine is 'special' in that it works hard to make sure -that the partitioned accounts, transactions and splits are really -moved to a new book -- things like entity tables must be cleared -and repopulated correctly. - -This routine intentionally does not copy scheduled/recurring -transactions. - -TBD: --- Make an equity transfer so that we can carry forward the balances. --- set kvp values indicating that the books were split. - - */ -GNCBook * gnc_book_partition (GNCBook *, Query *); - -/* The gnc_book_insert_trans() routine takes an existing transaction - * that is located in one book, and moves it to another book. - * It moves all of the splits as well. In the course of the - * move, the transaction is literally deleted from the first - * book as its placed into the second. The transaction and - * split GUID's are not changed in the move. This routine - * assumes that twin accounts already exist in both books - * (and can be located with the standard twining proceedure). - */ - -void gnc_book_insert_trans (GNCBook *book, Transaction *trans); - -#endif /* XACC_PERIOD_H */ - #include "AccountP.h" #include "gnc-book-p.h" #include "gnc-engine-util.h" #include "gnc-event-p.h" #include "GroupP.h" #include "kvp-util-p.h" +#include "Period.h" #include "TransactionP.h" /* This static indicates the debugging module that this .o belongs to. */ @@ -143,13 +97,18 @@ gnc_book_partition (GNCBook *existing_book, Query *query) partition_book = gnc_book_new(); - /* first, copy all of the accounts */ + /* First, copy the book's KVP tree */ + kvp_frame_delete (partition_book->kvp_data); + partition_book->kvp_data = kvp_frame_copy (existing_book->kvp_data); + + /* Next, copy all of the accounts */ xaccGroupCopyGroup (partition_book->topgroup, existing_book->topgroup); - /* next, run the query */ + /* Next, run the query */ + xaccQuerySetGroup (query, existing_book->topgroup); split_list = xaccQueryGetSplitsUniqueTrans (query); - /* and start moving transactions over */ + /* And start moving transactions over */ xaccAccountGroupBeginEdit (partition_book->topgroup); xaccAccountGroupBeginEdit (existing_book->topgroup); for (snode = split_list; snode; snode=snode->next) @@ -174,4 +133,47 @@ gnc_book_partition (GNCBook *existing_book, Query *query) /* ================================================================ */ +GNCBook * +gnc_book_calve_period (GNCBook *existing_book, Timespec calve_date) +{ + Query *query; + GNCBook *partition_book; + kvp_frame *exist_cwd, partn_cwd; + kvp_value *vvv; + Timespec ts; + + /* Get all transactions that are *earlier* than the calve date, + * and put them in the new book. */ + query = xaccMallocQuery(); + xaccQueryAddDateMatchTS (query, FALSE, calve_date, + TRUE, calve_date, + QUERY_OR); + partition_book = gnc_book_partition (existing_book, query); + + xaccFreeQuery (query); + + /* Now add the various identifying kvp's */ + /* cwd == 'current working directory' */ + exist_cwd = kvp_frame_get_frame_slash (existing_book->kvp_data, "/book/"); + partn_cwd = kvp_frame_get_frame_slash (partition_book->kvp_data, "/book/"); + + vvv = kvp_value_new_timespec (calve_date); + kvp_frame_set_slot_nc (exist_cwd, "start-date", vvv); + kvp_frame_set_slot_nc (partn_cwd, "end-date", vvv); + + /* mark partition as being closed */ + ts.tv_sec = time(0); + ts.tv_nsec = 0; + vvv = kvp_value_new_timespec (ts); + kvp_frame_set_slot_nc (partn_cwd, "close-date", vvv); + + vvv = kvp_value_new_guid (existing_book->guid); + kvp_frame_set_slot_nc (partn_cwd, "next-book", vvv); + + vvv = kvp_value_new_guid (partition_book->guid); + kvp_frame_set_slot_nc (exist_cwd, "prev-book", vvv); + + return partition_book; +} + /* ============================= END OF FILE ====================== */ diff --git a/src/engine/Period.h b/src/engine/Period.h index 18a3e81a3c..5d29f87404 100644 --- a/src/engine/Period.h +++ b/src/engine/Period.h @@ -28,14 +28,20 @@ * -- It will use the /book/blah-blah kvp value to denote xxx. -- Make an equity transfer so that we can carry forward the balances. -/book/close-date +-- hack alert -- should not allow closed books to have unreconciled + transactions ??? + +Implemented: +/book/start-date earliest date in this 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 + +Mot imlemented (yet): /book/closing-balance-of-account-guid -/book/previous-guid /book/name=some-user-supplied-name /book/notes=user-supplied-descriptive-comments -/book/start-date=xxx -/book/end-date=xxx -/book/previous-book-guids=(list 0xa 0xb 0xc) /book/accounting-period=enum {none, week, month, quarter, trimester, year} diff --git a/src/engine/kvp_doc.txt b/src/engine/kvp_doc.txt index 1648f8dbfe..6d056bb6bd 100644 --- a/src/engine/kvp_doc.txt +++ b/src/engine/kvp_doc.txt @@ -46,11 +46,13 @@ Entities: Transaction Use: Identifies that the Transaction was created from a ScheduledTransaction, and stores the GUID of that SX. +----------------------- + Name: /gemini/ Type: kvp_frame Entities: Account, Book -Use: subdirectory holding identification of accounts that are copies - of this account. +Use: kvp subdirectory holding identification of accounts or books + that are copies of this account. Name: /gemini/ncopies Type: int64 @@ -72,13 +74,17 @@ Use: guid of another account that is a copy of this one. Name: /gemini/0/book_guid Type: guid Entities: Account, Book -Use: guid of the book that the other account belongs to. +Use: When this appears in an account, then it contains the guid of + the book that the other account belongs to. When this appears + in a book, then this is the guid of the other book. Name: /gemini/0/date Type: timespec Entities: Account, Book Use: date that the copy was created. +----------------------- + Name: last-num Type: string Entities: Account