mirror of
https://github.com/Gnucash/gnucash.git
synced 2024-11-30 04:33:55 -06:00
83d14e1c1c
It is split into - /libgnucash (for the non-gui bits) - /gnucash (for the gui) - /common (misc source files used by both) - /bindings (currently only holds python bindings) This is the first step in restructuring the code. It will need much more fine tuning later on.
226 lines
12 KiB
Plaintext
226 lines
12 KiB
Plaintext
/** \page budgetplan Some Thoughts about GnuCash Budgeting
|
|
|
|
API: \ref Budget
|
|
|
|
Bob Drzyzgula
|
|
|
|
18-April-1998
|
|
|
|
\section budgetabstract Abstract
|
|
|
|
At this point, this document contains my personal thoughts about possible
|
|
design criteria for a budgeting engine in GnuCash. These should not
|
|
at this writing be taken as consensus opinion, and may in places be
|
|
at odds with conventions inside GnuCash code (and with general accounting
|
|
principals... I am in no way an accountant), and thus may not be practical.
|
|
However, I believe that they provide a self-consistent view of how
|
|
one might do this, and I hope that this document will serve to continue
|
|
the discussion that began on the GnuCash/Xacc mailing list.
|
|
|
|
\section bugettoc tableofcontents
|
|
|
|
\subsection budgetdefines Definitions
|
|
|
|
As with any design paper, we'll need a few definitions. I'll try to
|
|
stick as close to possible to the Xacc usage of these terms, but I'm
|
|
not intimately familiar with the code, so I may have made some errors
|
|
here.
|
|
|
|
- Journal A journal is a simply a list of transactions with minimal
|
|
characterization. For the purposes of this paper, the journal is
|
|
defined to include only transactions that have already occurred,
|
|
i.e., expected or up-coming expenses would not appear in the journal.
|
|
- Calendar For the purposes of this paper, the calendar as a list of
|
|
fully-defined future transactions, organized by date. A transaction
|
|
would only appear in the calendar if there was a low likelihood
|
|
that it would change. Future transactions that would only change
|
|
by surprise (e.g. the cable TV bill) could appear in the calendar,
|
|
but utility bills such as from the natural gas company would appear
|
|
in the calendar only after receipt.
|
|
- Template A template is in effect a partially defined transaction,
|
|
possibly containing constraints. For example, one might have a template
|
|
that would identify the price, payee, description, asset account
|
|
and expense account (but not the date) for buying a Value Meal #4
|
|
at the corner McDonald's, so every time you get the Value Meal #4
|
|
you could pull it out of a GUI pick list and just specify the date.
|
|
Alternatively, one could have a template that specified much of
|
|
the data for the natural gas bill but not the amount, so that (a)
|
|
entering the transaction when the bill came could be simplified,
|
|
and (b) the partial information could be recorded, in effect as
|
|
a reminder. A template could include such information as a confidence
|
|
interval, so that, for example, if you and your family go out to
|
|
dinner every Friday night and it usually costs $20-50, you could
|
|
create a template that had $35 +/- $15 as the amount. Such templates
|
|
could be extremely useful in making projections. Quicken, of course,
|
|
has similar things called ``memorized transactions,'' but Quicken
|
|
gives less control over their creation, meaning and use.
|
|
- Schedule The schedule is a supplement to the calendar that contains
|
|
only dated references to templates, which could be further narrowed
|
|
as part of the reference, e.g. an undated template could be given
|
|
a date but not a firm value when referenced from the schedule.
|
|
- Ledger The ledger is in effect documentation of the journal, in that
|
|
it describes the meaning of the transactions with respect to the
|
|
balances in the various accounts. In Xacc, this appears also to
|
|
be known as the register. It isn't clear to me that Xacc maintans
|
|
the journal and the ledger separately. The ledger could easily be
|
|
expanded to include documentation of the calendar transactions,
|
|
but it is less clear that one would want to include the template
|
|
references from the schedule directly in the ledger; it may make
|
|
more sense for the schedule to be a ledger unto itself.
|
|
- Budget A budget is an allocation of monetary flows. As funds enter
|
|
the system through the income accounts, they must be transferred
|
|
to other accounts; a direct deposit would be a transfer to an asset
|
|
account, a loan payment through payroll deduction a transfer to
|
|
a liability account, and tax withholding a transfer to an expense
|
|
account. Of course, secondary transfers - check payments to credit
|
|
card accounts, for example - are expected. The budget must cover
|
|
a certain time period; one year is typical but not necessary. Typically
|
|
one begins with the expected income over the budget period and describes
|
|
what is expected to become of the money. In addition, it is typically
|
|
the case that one will begin a budget period with initial assets
|
|
and liabilities, that assets may be transferred to expense and liability
|
|
accounts, and that new liabilities may be created as a way to obtain
|
|
additional assets or cover expenses. It is not necessary and is
|
|
in fact (in my view) undesirable for the budget to make specific
|
|
reference to any transactions or templates; it is not even necessary
|
|
to describe the precise path of the funds through accounts. Thus,
|
|
while the budget documents one's goals for where the funds wind
|
|
up, the schedule, calendar, journal and ledger describe the actual
|
|
mechanics of the process. Finally, it should be noted that, in addition
|
|
to describing the endpoints of the budget period, one typically
|
|
will set a certain checkpoint frequency in the budget so that (a)
|
|
the time dependence of the various flows is more obvious, and (b)
|
|
one can conduct periodic verification of the accounts' status with
|
|
respect to the budget. Most often this checkpoint frequency is either
|
|
monthly or per-four-weeks. The former might be referred to as ``budgeting
|
|
on a monthly basis.''
|
|
|
|
\subsection budgetdocs Documenting the Budget
|
|
|
|
One possible way to document a budget might be as a classic ``input-output
|
|
table''. Consider the following table:
|
|
\verbatim
|
|
+---------+----------+---------+-----+------+------+-----+------+------+
|
|
| | Checking | Savings | MMA | Cash | Visa | Tax | Food | Rent |
|
|
+---------+----------+---------+-----+------+------+-----+------+------+
|
|
+---------+----------+---------+-----+------+------+-----+------+------+
|
|
|Checking | x | 3 | 2 | 7 | 3 | | | 5 |
|
|
+---------+----------+---------+-----+------+------+-----+------+------+
|
|
|Savings | | x | 1 | | | | | |
|
|
+---------+----------+---------+-----+------+------+-----+------+------+
|
|
| MMA | | | x | | | | | |
|
|
+---------+----------+---------+-----+------+------+-----+------+------+
|
|
| Cash | | | | x | | | 6 | |
|
|
+---------+----------+---------+-----+------+------+-----+------+------+
|
|
| Visa | | | | 8 | x | | 7 | |
|
|
+---------+----------+---------+-----+------+------+-----+------+------+
|
|
|Paycheck | 20 | | | | | 5 | | |
|
|
+---------+----------+---------+-----+------+------+-----+------+------+
|
|
|Interest | | 2 | 3 | | | | | |
|
|
+---------+----------+---------+-----+------+------+-----+------+------+
|
|
\endverbatim
|
|
|
|
The first five data columns and the first five data rows have the same
|
|
names. These are the asset and liability accounts. The last three
|
|
columns are the expense accounts, and the last two rows are the income
|
|
accounts (When I learn a little more SGML I'll try to make the table
|
|
a little more readable). Notice:
|
|
|
|
- If you sum across the income rows, you obtain the total income for
|
|
each account: $25 from paychecks and $5 from interest, for a total
|
|
of $30. If you sum down the expense rows, you obtain the total expenses
|
|
for each account: $5 for taxes, $13 for food, and $5 for rent (OK,
|
|
so we eat a lot). Just looking at these two figures, we can immediately
|
|
see that we expect to make $30 and spend $23 of it.
|
|
- The sense of each amount is positive from the row account to the
|
|
column account. Thus, $20 of pay is direct-deposited to the checking
|
|
account, and the remaining $5 is withheld for taxes. $1 is transferred
|
|
from the savings account to the money market account. We plan to
|
|
use the Visa card to buy $7 worth of food and to take a $8 cash
|
|
advance. We also plan to pay Visa bills totalling $3 from the checking
|
|
account.
|
|
- If you sum down an asset/liability column, you will obtain the total
|
|
amount we expect to add to that account (e.g. $6 added to the MMA,
|
|
$20 added to checking, $3 to Visa). If you sum across an asset/liability
|
|
row, you will obtain the total amount we expect to remove from that
|
|
account (e.g. none from the MMA, $20 from checking, $15 from Visa).
|
|
Thus, if you subtract the row sum from the column sum for a single
|
|
asset or liability account, you may obtain the planned net change
|
|
in that account for the budget period. Thus, we expect checking
|
|
to be a wash, the MMA to grow by $6, and to go $12 further in the
|
|
hole on our Visa card.
|
|
- Again, what is documented here is the planned account-to-account
|
|
flow across the entire period, not individual transactions.
|
|
|
|
\subsection budgetcontrib Contributing Data
|
|
|
|
(to be done)
|
|
================================================================
|
|
|
|
|
|
Where I'm headed for the rest of it is this:
|
|
|
|
- I expect to point out that the Journal, Calendar and
|
|
Ledger as I have described them are only tangentially
|
|
related to the budget. They are the emperical data and
|
|
the Budget and the Schedule are the models. The goal
|
|
would be to have an engine that would allow one to
|
|
measure the deviation of the emperical data from
|
|
the model in various ways.
|
|
- I expect to talk about the task of generating both
|
|
the schedule and the budget. When one prepares this
|
|
stuff, one usually has a rather diverse collection of
|
|
data to work with. Bi-weekly paychecks, monthly
|
|
interest income, quarterly dividends, five-day-per-week
|
|
lunch charges, etc. What I would very much like to do
|
|
is describe a mechanism whereby one could simply enter
|
|
all these kinds of data into the engine, and it will
|
|
digest it all into the budget and/or schedule formats.
|
|
I expect to do this by preparing projected transactions
|
|
as "templates", and then specifying a time series of
|
|
instantiations of the templates.
|
|
- I expect to describe a design for a sort of OO
|
|
time series engine, where "time series" is a class.
|
|
Instances of "time series" will have begin dates,
|
|
end dates, frequencies, and the data series itself.
|
|
Time series arithmetic will be defined, and these may
|
|
entail frequency conversions to force the operand series
|
|
to commensurate frequencies before combination. Thus,
|
|
explicit conversion functions, say "monthly_to_daily"
|
|
will need to be defined.
|
|
- Once these pieces are in place, then one should be
|
|
able to use the time series engine to digest the
|
|
scraps of paper with scribbles saying "Katie's lunch,
|
|
$2.30 every Monday through Thursday except only
|
|
$0.40 on Friday because they have burritos on
|
|
Friday and she hates them and brings her lunch but
|
|
still needs milk" into something usable as a
|
|
budget -or- as a schedule (these being two separate
|
|
outputs).
|
|
- While I expect that such an engine would be extremely
|
|
useful for about 80% of the data that would go into
|
|
a budget, there will of course be other data for which
|
|
this would be overkill or cumbersome. Like "$85 each
|
|
February and October for spraying the hemlocks with
|
|
dormant oil". I can't imagine that anyone would rather
|
|
make up some bogus time series for this than to open
|
|
up a spreadsheet and type in two numbers, or even
|
|
add a couple of records to an input data file. Thus, there
|
|
should be some mechanism for this, where hand-entered
|
|
data can be merged into the final budget or schedule.
|
|
it should not, however, be implemented as hand edits to the
|
|
draft table coming out of the time series engine,
|
|
because one will want to be able to iterate on this.
|
|
- Nonetheless, it probably remains true that users
|
|
would wish to take the final budget output of all this
|
|
automated stuff, and hack it up into something
|
|
that somehow pleases them better. Thus it probably
|
|
*does* make sense to allow hand edits at the final
|
|
stage, and/or to simply enter an entire budget by
|
|
hand if that is what you want to do.
|
|
- So far, I don't see any simple way to implement
|
|
something like Quicken's SuperCategories. Maybe this
|
|
is related to why it works so poorly in Quicken. :-)
|
|
|
|
*/
|