Several small fixes.
This commit is contained in:
parent
250248fd9e
commit
83b7a0ea9c
5 changed files with 959 additions and 188 deletions
6
Makefile
6
Makefile
|
|
@ -3,8 +3,8 @@ OBJS = $(patsubst %.cc,%.o,$(CODE))
|
||||||
CFLAGS = #-Wall -ansi -pedantic
|
CFLAGS = #-Wall -ansi -pedantic
|
||||||
DFLAGS = -O3 -fomit-frame-pointer
|
DFLAGS = -O3 -fomit-frame-pointer
|
||||||
#DFLAGS = -g -DDEBUG=1
|
#DFLAGS = -g -DDEBUG=1
|
||||||
INCS = -I/usr/local/include
|
INCS = -I/sw/include
|
||||||
LIBS = -L/usr/local/lib -lgmpxx -lgmp -lpcre
|
LIBS = -L/sw/lib -lgmpxx -lgmp -lpcre
|
||||||
|
|
||||||
ifdef GNUCASH
|
ifdef GNUCASH
|
||||||
CODE := $(CODE) gnucash.cc
|
CODE := $(CODE) gnucash.cc
|
||||||
|
|
@ -25,7 +25,7 @@ ledger.info: ledger.texi
|
||||||
g++ $(CFLAGS) $(INCS) $(DFLAGS) -c -o $@ $<
|
g++ $(CFLAGS) $(INCS) $(DFLAGS) -c -o $@ $<
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
rm -f ledger ledger.info *.o *~ .\#*
|
rm -f ledger ledger.info *.o *~ .\#* *.elc
|
||||||
|
|
||||||
rebuild: clean deps all
|
rebuild: clean deps all
|
||||||
|
|
||||||
|
|
|
||||||
658
README
658
README
|
|
@ -1,5 +1,11 @@
|
||||||
|
#title Ledger: Command-Line Accounting
|
||||||
|
|
||||||
|
<contents>
|
||||||
|
|
||||||
|
* Building
|
||||||
|
|
||||||
Welcome to ledger, a command-line accounting program that uses a
|
Welcome to ledger, a command-line accounting program that uses a
|
||||||
text-based ledger file, yet provides full double-entry accouting, use
|
text-based ledger file, yet provides full double-entry accounting, use
|
||||||
of commodities, unlimited accounts, etc.
|
of commodities, unlimited accounts, etc.
|
||||||
|
|
||||||
Ledger is written in ANSI C++, and should compile on any platform. It
|
Ledger is written in ANSI C++, and should compile on any platform. It
|
||||||
|
|
@ -10,5 +16,651 @@ Also, this project was developed using GNU make and gcc 3.3.
|
||||||
To build and install, once you have these libraries on your system,
|
To build and install, once you have these libraries on your system,
|
||||||
enter these commands:
|
enter these commands:
|
||||||
|
|
||||||
make
|
<example>
|
||||||
cp ledger /usr/local/bin
|
make
|
||||||
|
cp ledger /usr/local/bin
|
||||||
|
</example>
|
||||||
|
|
||||||
|
* Introduction
|
||||||
|
|
||||||
|
Ledger is an accounting tool with the moxie to exist. It provides not
|
||||||
|
one bell or whistle for the money, and returns the user to the days
|
||||||
|
before user interfaces were even a twinkle in their father's CRT.
|
||||||
|
|
||||||
|
What it does do is provide a double-entry accounting ledger with all
|
||||||
|
of the flexibility and muscle of its modern day cousins -- without any
|
||||||
|
of the fat. Think of it as the bran muffin of accounting tools.
|
||||||
|
|
||||||
|
To begin with, you need to start keeping a ledger. This is the basis
|
||||||
|
of all accounting, and if you don't know how to do it, now is the time
|
||||||
|
to learn. The little booklet that comes with your checkbook is a
|
||||||
|
ledger, so we'll describe double-entry accounting in terms of that.
|
||||||
|
|
||||||
|
A checkbook ledger records debits (subtractions, or withdrawals) and
|
||||||
|
credits (additions, or deposits) with reference to a single account:
|
||||||
|
your checking account. Where the money comes from, and where it goes
|
||||||
|
to, are simply described in the memo field where you write the person
|
||||||
|
or the company's name. The ultimate aim of keeping a checkbook ledger
|
||||||
|
is so you know how much money is available to spend at all times.
|
||||||
|
That is really the aim of all ledgers.
|
||||||
|
|
||||||
|
What computers add is the ability to walk through all of those
|
||||||
|
transactions and tell you things about your spending habits; let you
|
||||||
|
devise budgets to get control over your spending; squirrel away money
|
||||||
|
into virtual savings account without having to physically move the
|
||||||
|
money around; etc. As you keep your checkbook ledger, you are
|
||||||
|
recording a lot of information about your life and your habits, and
|
||||||
|
sometimes that information can tell you things you aren't even aware
|
||||||
|
of. That is the aim of all good accounting tools.
|
||||||
|
|
||||||
|
The next step up from a checkbook ledger is a ledger that covers all
|
||||||
|
of your accounts, not just your checking account. In this ledger, you
|
||||||
|
write not only who the money goes to -- in the case of a debit -- but
|
||||||
|
where the money is coming from. In the checkbook ledger, its assumed
|
||||||
|
that all of the money is coming from your checking account. But in a
|
||||||
|
general ledger, you have to write two-lines: The source and target.
|
||||||
|
There must always be a debit from some account for any credit made to
|
||||||
|
anyone else. This is what is meant by "double-entry" accounting.
|
||||||
|
|
||||||
|
For example, let's say you have a checking account and a brokerage
|
||||||
|
account, and that you can write checks from both of them. Rather than
|
||||||
|
keeping two checkbooks, you decide to use one ledger for both. Once
|
||||||
|
you get the hang of this, you'll be ready to use one ledger for all of
|
||||||
|
your accounting needs, which gets you to the point of this
|
||||||
|
introduction.
|
||||||
|
|
||||||
|
So in your general ledger, you need to pay Pacific Bell Telephone for
|
||||||
|
your monthly phone bill. The cost is $23.00. In a checkbook ledger,
|
||||||
|
you would write out a line that credits your account with Pacific Bell
|
||||||
|
by $23 as follows:
|
||||||
|
|
||||||
|
<example>
|
||||||
|
9/29 100 Pacific Bell $23.00 $77.00
|
||||||
|
</example>
|
||||||
|
|
||||||
|
Very simple: You've written check #100 for $23 to Pacific Bell, which
|
||||||
|
leaves your balance in checking at $77.
|
||||||
|
|
||||||
|
But in a general ledger, you need to say where the money is coming
|
||||||
|
from. A general ledger entry would look like this:
|
||||||
|
|
||||||
|
<example>
|
||||||
|
9/29 100 Pacific Bell $23.00 $223.00
|
||||||
|
Checking $-23.00 $77.00
|
||||||
|
</example>
|
||||||
|
|
||||||
|
What does all of this mean? The first line shows a credit (or
|
||||||
|
payment) to Pacific Bell to the tune of $23.00. Then, because there
|
||||||
|
is no one "balance" in a general ledger, we've written in the total
|
||||||
|
balance of your payments to the account "Pacific Bell". This was done
|
||||||
|
by looking at the last entry for "Pacific Bell" in the general ledger,
|
||||||
|
adding $23.00 to that amount, and writing in the total in the balance
|
||||||
|
column.
|
||||||
|
|
||||||
|
Secondly, the money is coming from your "Checking" account, which
|
||||||
|
means a debit (or withdrawal) of $23.00, which will leave the ending
|
||||||
|
balance in your "Checking" account at $77.00.
|
||||||
|
|
||||||
|
The transaction itself must balance to $0: $23 goes to Pacific Bell,
|
||||||
|
$23 comes from Checking: there is nothing left over to be accounted
|
||||||
|
for. The money has in fact moved from one account to another. This
|
||||||
|
is basis of double-entry accounting: That money never pops out of
|
||||||
|
existence, it is always described as a transaction between accounts --
|
||||||
|
as a flow from one place to another.
|
||||||
|
|
||||||
|
Keeping a general ledger is the same as keeping two separate ledgers:
|
||||||
|
One for Pacific Bell and one for Checking. In that case, each time
|
||||||
|
you write a credit into one, you write a corresponding debit into the
|
||||||
|
other. This makes it much easier to write in the running balance,
|
||||||
|
since you don't have to go looking back for the last time an account
|
||||||
|
was referenced, but it also means having a lot of ledger books if you
|
||||||
|
deal with multiple accounts.
|
||||||
|
|
||||||
|
Enter the beauty of a computerized accounting tool. The purpose of
|
||||||
|
Ledger is to make general ledger accounting simple by keeping track of
|
||||||
|
the balances for you. Your only job is to enter credit/debit pairs
|
||||||
|
and make sure they balance. If a transaction does not balance, Ledger
|
||||||
|
will display an error and ignore the transaction.[1]
|
||||||
|
|
||||||
|
Your usage of Ledger will have two parts: Keeping the ledger, and
|
||||||
|
using the Ledger tool to provide you with information summaries
|
||||||
|
derived from your ledger's entries.
|
||||||
|
|
||||||
|
* Keeping a ledger
|
||||||
|
|
||||||
|
The most important part of accounting is keeping a good ledger. If
|
||||||
|
you have a good ledger, tools can be written to work whatever
|
||||||
|
mathematically tricks you need to better understand your spending
|
||||||
|
patterns. Without a good ledger, no tool, however smart, can help
|
||||||
|
you.
|
||||||
|
|
||||||
|
The Ledger program aims at making ledger entry as simple as possible.
|
||||||
|
Since it is a command-line tool, it does not provide a user interface
|
||||||
|
for keeping a ledger. If you like, you may use Gnucash to maintain
|
||||||
|
your ledger, in which case the Ledger program will read Gnucash's data
|
||||||
|
files directly. In that case, read the Gnucash manual now, and skip
|
||||||
|
to the next chapter.
|
||||||
|
|
||||||
|
If you are not using Gnucash, but a text editor to maintain your
|
||||||
|
ledger, read on. Ledger has been designed to make data entry as
|
||||||
|
simple as possible, by keeping the ledger format easy, and also by
|
||||||
|
automagically determining as much information as possible based on the
|
||||||
|
nature of your entries.
|
||||||
|
|
||||||
|
For example, you do not need to tell Ledger about the accounts you
|
||||||
|
use. Any time Ledger sees a debit or a credit to an account it knows
|
||||||
|
nothing about, it will create it. If you use a commodity that is new
|
||||||
|
to Ledger, it will create that commodity, and determine its display
|
||||||
|
characteristics (placement of the symbol before or after the amount,
|
||||||
|
display precision, etc) based on how you used the commodity in the
|
||||||
|
transaction.
|
||||||
|
|
||||||
|
Here is the Pacific Bell example from above, given as a Ledger
|
||||||
|
transaction:
|
||||||
|
|
||||||
|
<example>
|
||||||
|
9/29 (100) Pacific Bell
|
||||||
|
Expenses:Utilities:Telephone $23.00
|
||||||
|
Assets:Checking $-23.00
|
||||||
|
</example>
|
||||||
|
|
||||||
|
As you can see, it is very similar to what would be written on paper,
|
||||||
|
minus the computed balance totals, and adding in account names that
|
||||||
|
work better with Ledger's scheme of things. In fact, since Ledger is
|
||||||
|
smart about many things, you don't need to specify the balanced
|
||||||
|
amount, if it is the same as the first line:
|
||||||
|
|
||||||
|
<example>
|
||||||
|
9/29 (100) Pacific Bell
|
||||||
|
Expenses:Utilities:Telephone $23.00
|
||||||
|
Assets:Checking
|
||||||
|
</example>
|
||||||
|
|
||||||
|
For this entry, Ledger will figure out that $-23.00 must come from
|
||||||
|
"Assets:Checking" in order to balance the entry.
|
||||||
|
|
||||||
|
** Credits and Debits
|
||||||
|
|
||||||
|
Credit and debit are simple enough terms in themselves, but the usages
|
||||||
|
of the modern world have made them very hard to puzzle out.
|
||||||
|
|
||||||
|
Basically, a credit means you add something to an account, and a debit
|
||||||
|
means you take away. A debit card is correctly name: From your point
|
||||||
|
of view, it debits your checking account every time you use it.
|
||||||
|
|
||||||
|
The credit card is strangely named, because you have to look at it
|
||||||
|
from the merchant's point of view: Every time you use it, it credit's
|
||||||
|
*his* account right away. This was a giant leap from the days of cash
|
||||||
|
and checks, when the only other way to supply immediate credit was by
|
||||||
|
a wire transfer. But a credit card does not credit you anything at
|
||||||
|
all. In fact, from your point of view, it should be called a
|
||||||
|
liability card, since it increases your liability to the issuing bank
|
||||||
|
every time you use it.
|
||||||
|
|
||||||
|
In Ledger, credits and debits are given as they are, which means that
|
||||||
|
sometimes you will see a minus sign where you don't expect one. For
|
||||||
|
example, when you get paid, in order to credit your bank account, you
|
||||||
|
need to debit an income account:
|
||||||
|
|
||||||
|
<example>
|
||||||
|
9/29 My Employer
|
||||||
|
Assets:Checking $500.00
|
||||||
|
Income:Salary $-500.00
|
||||||
|
</example>
|
||||||
|
|
||||||
|
But wait, you say, why is the Income a negative figure? And when you
|
||||||
|
look at the balance totals for your ledger, you will certainly be
|
||||||
|
surprised to see Expenses as a positive figure, and Income as a
|
||||||
|
negative figure. Isn't that the opposite of how it should look?
|
||||||
|
|
||||||
|
It may take getting used to, but to properly use a general ledger you
|
||||||
|
will need to think in terms of correct debits and credits. Rather
|
||||||
|
than Ledger "fixing" the minus signs, let's understand why they are
|
||||||
|
there.
|
||||||
|
|
||||||
|
When you earn money, the money has to come from somewhere. Let's call
|
||||||
|
that somewhere "society". In order for society to give you an income,
|
||||||
|
you must take money away from society (debit) in order to put it into
|
||||||
|
your bank (credit). When you then spend that money, it leaves your
|
||||||
|
bank account (debit) and goes back to society (credit). This is why
|
||||||
|
Income will appear negative -- it reflects the money you have drawn
|
||||||
|
from society -- and why Expenses will be positive -- it is the amount
|
||||||
|
you've given back. These credits and debits will always cancel each
|
||||||
|
other out in the end, because you don't have the ability to create new
|
||||||
|
money: It must always come from somewhere, and in the end must always
|
||||||
|
leave. This is the beginning of economy, after which the explanation
|
||||||
|
gets terribly difficult.
|
||||||
|
|
||||||
|
Based on that explanation, here's another way to look at your balance
|
||||||
|
report: Every negative figure means that that account or person or
|
||||||
|
place has less money now than when you started your ledger; and every
|
||||||
|
positive figure means that that account or person or place has more
|
||||||
|
money now that when you started your ledger. Make sense?
|
||||||
|
|
||||||
|
Also, credit cards will have a negative value, because you are
|
||||||
|
spending *from* them (debit) in order pay someone else (credit). They
|
||||||
|
are called credit cards because you are able to instantly credit that
|
||||||
|
other person, by simply waving a card.
|
||||||
|
|
||||||
|
** Commodities and Currencies
|
||||||
|
|
||||||
|
Ledger makes no assumptions about the commodities you use; it only
|
||||||
|
requires that you specify a commodity. The commodity may be any
|
||||||
|
non-numeric string that does not contain a period, comma, forward
|
||||||
|
slash or at-sign. It may appear before or after the amount, although
|
||||||
|
it is assumed that symbols appearing before the amount refer to
|
||||||
|
currencies, while non-joined symbols appearing after the amount refer
|
||||||
|
to commodities. Here are some valid currency and commodity
|
||||||
|
specifiers:
|
||||||
|
|
||||||
|
<example>
|
||||||
|
$20.00 ; currency: twenty US dollars
|
||||||
|
USD 20 ; currency: the same
|
||||||
|
40 AAPL ; commodity: 40 shares of Apple stock
|
||||||
|
MD 60 ; currency: 60 Deutsch Mark
|
||||||
|
£50 ; currency: 50 British pounds
|
||||||
|
50e ; currency: 50 Euros (use symbol)
|
||||||
|
</example>
|
||||||
|
|
||||||
|
Ledger will examine the first use of any commodity to determine how
|
||||||
|
that commodity should be printed on reports. It pays attention to
|
||||||
|
whether the name of commodity was separated from the amount, whether
|
||||||
|
it came before or after, the precision used in specifying the amount,
|
||||||
|
whether thousand marks were used, etc. This is done so that printing
|
||||||
|
the commodity looks the same as the way you use it.
|
||||||
|
|
||||||
|
An account may contain multiple commodities, in which case it will
|
||||||
|
have separate totals for each. For example, if your brokerage account
|
||||||
|
contains both cash, gold, and several stock quantities, the balance
|
||||||
|
might look like:
|
||||||
|
|
||||||
|
<example>
|
||||||
|
$200.00
|
||||||
|
100.00 AU
|
||||||
|
AAPL 40
|
||||||
|
BORL 100
|
||||||
|
FEQTX 50 Assets:Brokerage
|
||||||
|
</example>
|
||||||
|
|
||||||
|
This balance report shows how much of each commodity is in your
|
||||||
|
brokerage account.
|
||||||
|
|
||||||
|
Sometimes, you will want to know the current street value of your
|
||||||
|
balance, and not the commodity totals. For this to happen, you must
|
||||||
|
specify what the current price is for each commodity. The price can
|
||||||
|
be in any commodity, in which case the balance will be computed in
|
||||||
|
terms of that commodity. The usual way to specify prices is with a
|
||||||
|
file of price settings, which might look like this:
|
||||||
|
|
||||||
|
<example>
|
||||||
|
AU=$357.00
|
||||||
|
AAPL=$37
|
||||||
|
BORL=$19
|
||||||
|
FEQTX=$32
|
||||||
|
</example>
|
||||||
|
|
||||||
|
Specify the prices file using the =-p= option:
|
||||||
|
|
||||||
|
<example>
|
||||||
|
/home/johnw $ ledger -p prices.db balance brokerage
|
||||||
|
</example>
|
||||||
|
|
||||||
|
Now the balance for your brokerage account will be given in US
|
||||||
|
dollars, since the prices database has specified conversion factors
|
||||||
|
from each commodity into dollars:
|
||||||
|
|
||||||
|
<example>
|
||||||
|
$40880.00 Assets:Brokerage
|
||||||
|
</example>
|
||||||
|
|
||||||
|
You can convert from any commodity to any other commodity. Let's say
|
||||||
|
you had $5000 in your checking account, and for whatever reason you
|
||||||
|
wanted to know many ounces of gold that would buy. If gold is
|
||||||
|
currently $357 per ounce, then each dollar is worth 1/357 AU:
|
||||||
|
|
||||||
|
<example>
|
||||||
|
/home/johnw $ ledger -p "$=0.00280112 AU" balance checking
|
||||||
|
</example>
|
||||||
|
|
||||||
|
<example>
|
||||||
|
14.01 AU Assets:Checking
|
||||||
|
</example>
|
||||||
|
|
||||||
|
$5000 would buy 14 ounces of gold, which becomes the new display
|
||||||
|
commodity since a conversion factor was provided.
|
||||||
|
|
||||||
|
Commodities conversions can also be chained, up to a depth of 10.
|
||||||
|
Here is a sample prices database that uses chaining:
|
||||||
|
|
||||||
|
<example>
|
||||||
|
AAPL=$15
|
||||||
|
$=0.00280112 AU
|
||||||
|
AU=300 Euro
|
||||||
|
Euro=MD 0.75
|
||||||
|
</example>
|
||||||
|
|
||||||
|
This is a roundabout way of reporting AAPL shares in their Deutsch
|
||||||
|
Mark equivalent.
|
||||||
|
|
||||||
|
** Accounts and Inventories
|
||||||
|
|
||||||
|
Since Ledger's accounts and commodity system is so flexible, you can
|
||||||
|
have accounts that don't really exist, and use commodities that no one
|
||||||
|
else recognizes. For example, let's say you are buying and selling
|
||||||
|
various items in EverQuest, and want to keep track of them using a
|
||||||
|
ledger. Just add items of whatever quantity you wish into your
|
||||||
|
EverQuest account:
|
||||||
|
|
||||||
|
<example>
|
||||||
|
9/29 Get some stuff at the Inn
|
||||||
|
Places:Black's Tavern -3 Apples
|
||||||
|
Places:Black's Tavern -5 Steaks
|
||||||
|
EverQuest:Inventory
|
||||||
|
</example>
|
||||||
|
|
||||||
|
Now your EverQuest:Inventory has 3 apples and 5 steaks in it. The
|
||||||
|
amounts are negative, because you are taking *from* Black's Tavern in
|
||||||
|
order to credit your Inventory account. Note that you don't have to
|
||||||
|
use "Places:Black's Tavern" as the source account. You could use
|
||||||
|
"EverQuest:System" to represent the fact that you acquired them
|
||||||
|
online. The only purpose for choosing one kind of source account over
|
||||||
|
another is for generate more informative reports later on. The more
|
||||||
|
you know, the better analysis you can perform.
|
||||||
|
|
||||||
|
If you later sell some of these items to another player, the entry
|
||||||
|
would look like:
|
||||||
|
|
||||||
|
<example>
|
||||||
|
10/2 Strum Brightblade
|
||||||
|
EverQuest:Inventory -2 Steaks
|
||||||
|
EverQuest:Inventory 15 Gold
|
||||||
|
</example>
|
||||||
|
|
||||||
|
Now you've turned 2 steaks into 15 gold, courtesy of your customer,
|
||||||
|
Strum Brightblade.
|
||||||
|
|
||||||
|
** Understanding Equity
|
||||||
|
|
||||||
|
The most confusing entry in any ledger will be your equity account --
|
||||||
|
because starting balances can't come out of nowhere.
|
||||||
|
|
||||||
|
When you first start your ledger, you will likely already have money
|
||||||
|
in some of your accounts. Let's say there's $100 in your checking
|
||||||
|
account; then add an entry to your ledger to reflect this amount.
|
||||||
|
Where will money come from? The answer: your equity.
|
||||||
|
|
||||||
|
<example>
|
||||||
|
10/2 Opening Balance
|
||||||
|
Assets:Checking $100.00
|
||||||
|
Equity:Opening Balances $-100.00
|
||||||
|
</example>
|
||||||
|
|
||||||
|
But what is equity? You may have heard of equity when people talked
|
||||||
|
about house mortgages, as "the part of the house that you own".
|
||||||
|
Basically, equity is like the value of something. If you own a car
|
||||||
|
worth $5000, then you have $5000 in equity in that car. In order to
|
||||||
|
turn that car (a commodity) into a cash flow, or a credit to your bank
|
||||||
|
account, you will have to debit the equity by selling it.
|
||||||
|
|
||||||
|
When you start a ledger, you are probably already worth something.
|
||||||
|
Your net worth is your current equity. By transferring the money in
|
||||||
|
the ledger from your equity to your bank accounts, you are crediting
|
||||||
|
the ledger account based on your prior equity value. That is why,
|
||||||
|
when you look at the balance report, you will see a large negative
|
||||||
|
number for Equity that never changes: Because that is what you were
|
||||||
|
worth (what you debited from yourself in order to start the ledger)
|
||||||
|
before the money started moving around. If the total positive value
|
||||||
|
of your assets is greater than the absolute value of your starting
|
||||||
|
equity, it means you are making money.
|
||||||
|
|
||||||
|
Clear as mud? Keep thinking about it. Until you figure it out, put
|
||||||
|
"-- -Equity" at the end of your balance command, to remove the
|
||||||
|
confusing figure from the totals.
|
||||||
|
|
||||||
|
* Using the Ledger Tool
|
||||||
|
|
||||||
|
Now that you have an orderly and well-organized general ledger, it's
|
||||||
|
time to start generating some orderly and well-organized reports.
|
||||||
|
This is where the Ledger tool comes in. With it, you can balance your
|
||||||
|
checkbook, see where your money is going, tell whether you've made a
|
||||||
|
profit this year, and even compute the present day value of your
|
||||||
|
retirement accounts. And all with the simplest of interfaces: the
|
||||||
|
command-line.
|
||||||
|
|
||||||
|
The most often used command will be the "balance" command:
|
||||||
|
|
||||||
|
<example>
|
||||||
|
/home/johnw $ export LEDGER=/home/johnw/doc/ledger.dat
|
||||||
|
/home/johnw $ ledger balance
|
||||||
|
</example>
|
||||||
|
|
||||||
|
Here I've set my Ledger environment variable to point to where my
|
||||||
|
ledger file is hiding. Thereafter, I needn't specify it again.
|
||||||
|
|
||||||
|
The balance command prints out the summarized balances of all my
|
||||||
|
top-level accounts, excluding sub-accounts. In order to see the
|
||||||
|
balances for a specific account, just specify a regular expression
|
||||||
|
after the balance command:
|
||||||
|
|
||||||
|
<example>
|
||||||
|
/home/johnw $ ledger balance expenses:food
|
||||||
|
</example>
|
||||||
|
|
||||||
|
This will show all the money that's been spent on food, since the
|
||||||
|
beginning of the ledger. For food spending just this month
|
||||||
|
(September), use:
|
||||||
|
|
||||||
|
<example>
|
||||||
|
/home/johnw $ ledger -d sep balance expenses:food
|
||||||
|
</example>
|
||||||
|
|
||||||
|
Or maybe I want to see all of my assets, in which case the -s (show
|
||||||
|
sub-accounts) option comes in handy:
|
||||||
|
|
||||||
|
<example>
|
||||||
|
/home/johnw $ ledger balance -s
|
||||||
|
</example>
|
||||||
|
|
||||||
|
To exclude a particular account, use a regular expression with a
|
||||||
|
leading minus sign. The following will show all expenses, but without
|
||||||
|
food spending:
|
||||||
|
|
||||||
|
<example>
|
||||||
|
/home/johnw $ ledger balance expenses -food
|
||||||
|
</example>
|
||||||
|
|
||||||
|
If you want to show all accounts but for one account, remember to use
|
||||||
|
"--" to separate the exclusion pattern from the options list:
|
||||||
|
|
||||||
|
<example>
|
||||||
|
/home/johnw $ ledger balance -- -equity
|
||||||
|
</example>
|
||||||
|
|
||||||
|
** Virtual transactions
|
||||||
|
|
||||||
|
A virtual transaction is when you, in your mind, see money as moving
|
||||||
|
to a certain place, when in reality that money has not moved at all.
|
||||||
|
There are several scenarios in which this type of tracking comes in
|
||||||
|
handy, and each of them will be discussed in detail.
|
||||||
|
|
||||||
|
To enter a virtual transaction, surround the account name in
|
||||||
|
parentheses. This form of usage does not need to balance. However,
|
||||||
|
if you want to ensure the virtual transaction balances with other
|
||||||
|
virtual transactions in the same entry, use square brackets. For
|
||||||
|
example:
|
||||||
|
|
||||||
|
<example>
|
||||||
|
10/2 Paycheck
|
||||||
|
Assets:Checking $1000.00
|
||||||
|
Income:Salary $-1000.00
|
||||||
|
(Debt:Alimony) $200.00
|
||||||
|
</example>
|
||||||
|
|
||||||
|
In this example, after receiving a paycheck an alimony debt is
|
||||||
|
increased -- even though no money has moved around yet.
|
||||||
|
|
||||||
|
<example>
|
||||||
|
10/2 Paycheck
|
||||||
|
Assets:Checking $1000.00
|
||||||
|
Income:Salary $-1000.00
|
||||||
|
[Savings:Trip] $200.00
|
||||||
|
[Assets:Checking] $-200.00
|
||||||
|
</example>
|
||||||
|
|
||||||
|
In this example, $200 has been deducted from checking toward savings
|
||||||
|
for a trip. It will appear as though the money has been moved from
|
||||||
|
the account into "Savings:Trip", although no money has actually moved
|
||||||
|
anywhere.
|
||||||
|
|
||||||
|
When balances are displayed, virtual transactions will be factored in.
|
||||||
|
To view balances without any virtual balances factored in, using the
|
||||||
|
"-R" flag, for "Reality".
|
||||||
|
|
||||||
|
*** Saving for a Special Occasion
|
||||||
|
|
||||||
|
*** Keeping a Budget
|
||||||
|
|
||||||
|
*** Tracking Allocated Funds
|
||||||
|
|
||||||
|
** Automated transactions
|
||||||
|
|
||||||
|
*** Computing Bahá'í Huqúqu'lláh
|
||||||
|
|
||||||
|
As a Bahá'í, I need to compute Huqúqu'lláh on some of my assets. The
|
||||||
|
exact details of this matter are rather complex, so if you have any
|
||||||
|
interest, I encourage you to do research on the Web.
|
||||||
|
|
||||||
|
For any fellow Bahá'ís out there who want to track Huqúqu'lláh, the
|
||||||
|
Ledger tool makes this extraordinarily easy. Just too easy, in fact.
|
||||||
|
Here's all you have to do: If an expense is exempt from Huqúqu'lláh --
|
||||||
|
a "necessary" expense -- put an exclamation mark before the account
|
||||||
|
name:
|
||||||
|
|
||||||
|
<example>
|
||||||
|
2002.12.31 Rent
|
||||||
|
!Expenses:Rent $450.00
|
||||||
|
Assets:Checking $-450.00
|
||||||
|
</example>
|
||||||
|
|
||||||
|
Even easier than that, simply put a list of regular expressions that
|
||||||
|
match the categories you consider exempt in a file called =.huquq=,
|
||||||
|
and the special marking will be done for you. Here is the file I use:
|
||||||
|
|
||||||
|
<example>
|
||||||
|
^Income:
|
||||||
|
^Retirement:
|
||||||
|
^Expenses:Rent
|
||||||
|
^Expenses:Taxes
|
||||||
|
</example>
|
||||||
|
|
||||||
|
When you're ready to pay Huqúqu'lláh, just write the check to the
|
||||||
|
account "Huququ'llah" (no accents, one apostrophe):
|
||||||
|
|
||||||
|
<example>
|
||||||
|
2003.01.20 * (101) Baha'i Huququ'llah Trust
|
||||||
|
Huququ'llah $1,000.00
|
||||||
|
Assets:Checking $-1,000.00
|
||||||
|
</example>
|
||||||
|
|
||||||
|
That's it. To see how much Huqúq is currently owed based on your
|
||||||
|
ledger data, type:
|
||||||
|
|
||||||
|
<example>
|
||||||
|
/home/johnw $ ledger balance ^huquq
|
||||||
|
</example>
|
||||||
|
|
||||||
|
* An easy way to add new entries
|
||||||
|
|
||||||
|
The three most laborious tasks of keeping a ledger are: adding new
|
||||||
|
entries, reconciling accounts, and generating reports. To address the
|
||||||
|
first of these, there is a sub-command to ledger called "entry". It
|
||||||
|
works on the principle that 80% of all transactions are variants of
|
||||||
|
earlier transactions. Here's how it works:
|
||||||
|
|
||||||
|
Let's say you have an old transaction of the following form:
|
||||||
|
|
||||||
|
<example>
|
||||||
|
2004/03/15 * Viva Italiano
|
||||||
|
Expenses:Food $12.45
|
||||||
|
Expenses:Tips $2.55
|
||||||
|
Liabilities:MasterCard $-15.00
|
||||||
|
</example>
|
||||||
|
|
||||||
|
Now it's 2004/4/9, and you've just eating at Viva Italiano again. The
|
||||||
|
exact amounts are different, but the overall form is the same. With
|
||||||
|
the "entry" command you can type:
|
||||||
|
|
||||||
|
<example>
|
||||||
|
ledger entry 2004/4/9 viva food 11.00 tips 2.50
|
||||||
|
</example>
|
||||||
|
|
||||||
|
This will produce the following output:
|
||||||
|
|
||||||
|
<example>
|
||||||
|
2004/04/09 Viva Italiano
|
||||||
|
Expenses:Food $11.00
|
||||||
|
Expenses:Tips $2.50
|
||||||
|
Liabilities:MasterCard $-13.50
|
||||||
|
</example>
|
||||||
|
|
||||||
|
This works by finding a transaction that matches the regexp "viva",
|
||||||
|
and then assuming that any accounts or amounts you specify will be the
|
||||||
|
same as that earlier transaction. If Ledger does not succeed in
|
||||||
|
generating a new entry for you, it will print an error and set the
|
||||||
|
exit code to 1.
|
||||||
|
|
||||||
|
There is a shell script in the distribution called "entry", which
|
||||||
|
simplifies the task of adding a new entry to your ledger, and then
|
||||||
|
launches =vi= to let you confirm that the entry looks appropriate.
|
||||||
|
|
||||||
|
* Using Emacs to Keep Your Ledger
|
||||||
|
|
||||||
|
In the Ledger tarball is an Emacs module, =ledger.el=. This module
|
||||||
|
makes the process of keeping a text ledger much easier for Emacs
|
||||||
|
users. I recommend putting this at the top of your ledger file:
|
||||||
|
|
||||||
|
<example>
|
||||||
|
; -*-ledger-*-
|
||||||
|
</example>
|
||||||
|
|
||||||
|
And this in your =.emacs= file, after copying =ledger.el= to your
|
||||||
|
site-lisp directory:
|
||||||
|
|
||||||
|
<example>
|
||||||
|
(load "ledger")
|
||||||
|
</example>
|
||||||
|
|
||||||
|
Now when you edit your ledger file, it will be in =ledger-mode=.
|
||||||
|
=ledger-mode= adds the following commands:
|
||||||
|
|
||||||
|
C-c C-a ::
|
||||||
|
For quickly adding new entries based on the form of older ones
|
||||||
|
(see previous section).
|
||||||
|
|
||||||
|
C-c C-c ::
|
||||||
|
Toggles the "cleared" flag of the transaction under point.
|
||||||
|
|
||||||
|
C-c C-r ::
|
||||||
|
Reconciles an account by displaying the transactions in another
|
||||||
|
buffer, where simply hitting the spacebar will toggle the cleared
|
||||||
|
flag of the transaction in the ledger. It also displays the current
|
||||||
|
cleared balance for the account in the modeline.
|
||||||
|
|
||||||
|
* Using GnuCash to Keep Your Ledger
|
||||||
|
|
||||||
|
The Ledger tool is fast and simple, but it gives you no special
|
||||||
|
method of actually editing the ledger. It assumes you know how to use
|
||||||
|
a text editor, and like doing so. Perhaps an Emacs mode will appear
|
||||||
|
someday soon to make editing Ledger's data files much easier.
|
||||||
|
|
||||||
|
Until then, you are free to use GnuCash to maintain your ledger, and
|
||||||
|
the Ledger program for querying and reporting on the contents
|
||||||
|
of that ledger. It takes a little longer to parse the XML data format
|
||||||
|
that GnuCash uses, but the end result is identical.
|
||||||
|
|
||||||
|
Then again, why would anyone use a Gnome-centric, 35 megabyte behemoth
|
||||||
|
to edit their data, and a 65 kilobyte binary to query it...
|
||||||
|
|
||||||
|
Footnotes:
|
||||||
|
[1] In some special cases, it will automatically balance the entry
|
||||||
|
for you.
|
||||||
|
|
|
||||||
16
entry
Executable file
16
entry
Executable file
|
|
@ -0,0 +1,16 @@
|
||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
if [ -z "$LEDGER" -o ! -r $LEDGER ]; then
|
||||||
|
echo Please set your LEDGER environment variable.
|
||||||
|
fi
|
||||||
|
|
||||||
|
line=`wc -l $LEDGER | awk '{print $1}'`
|
||||||
|
|
||||||
|
if ledger entry "$@" > /tmp/entry; then
|
||||||
|
cat /tmp/entry >> $LEDGER
|
||||||
|
else
|
||||||
|
echo "$@" >> $LEDGER
|
||||||
|
fi
|
||||||
|
rm /tmp/entry
|
||||||
|
|
||||||
|
vi +$line $LEDGER
|
||||||
|
|
@ -130,7 +130,8 @@
|
||||||
indent-tabs-mode nil)
|
indent-tabs-mode nil)
|
||||||
(let ((map (current-local-map)))
|
(let ((map (current-local-map)))
|
||||||
(define-key map [(control ?c) (control ?a)] 'ledger-add-entry)
|
(define-key map [(control ?c) (control ?a)] 'ledger-add-entry)
|
||||||
(define-key map [(control ?c) (control ?c)] 'ledger-toggle-current)))
|
(define-key map [(control ?c) (control ?c)] 'ledger-toggle-current)
|
||||||
|
(define-key map [(control ?c) (control ?r)] 'ledger-reconcile)))
|
||||||
|
|
||||||
(defun ledger-parse-entries (account &optional all-p after-date)
|
(defun ledger-parse-entries (account &optional all-p after-date)
|
||||||
(let (total entries)
|
(let (total entries)
|
||||||
|
|
|
||||||
440
ledger.texi
440
ledger.texi
|
|
@ -1,57 +1,70 @@
|
||||||
\input texinfo @c -*-texinfo-*-
|
\input texinfo @c -*-texinfo-*-
|
||||||
@comment $Id: ledger.texi,v 1.11 2003/10/10 19:12:31 johnw Exp $
|
|
||||||
@comment %**start of header
|
|
||||||
|
|
||||||
@setfilename ledger.info
|
@setfilename ledger.info
|
||||||
|
@settitle Ledger: Command-Line Accounting
|
||||||
|
|
||||||
@settitle Ledger Accouting Tool
|
@documentencoding iso-8859-1
|
||||||
@syncodeindex pg cp
|
|
||||||
@comment %**end of header
|
|
||||||
|
|
||||||
@dircategory Ledger Accouting Tool
|
@iftex
|
||||||
@direntry
|
@finalout
|
||||||
* ledger: (ledger)The Ledger Accouting Tool.
|
@end iftex
|
||||||
@end direntry
|
|
||||||
|
|
||||||
@titlepage
|
@titlepage
|
||||||
@title Ledger Accouting Tool
|
@title Ledger: Command-Line Accounting
|
||||||
@author John Wiegley <@email{johnw@@newartisans.com}>
|
@author John Wiegley
|
||||||
@page
|
|
||||||
@vskip 0pt plus 1filll
|
|
||||||
@c @insertcopying
|
|
||||||
@end titlepage
|
@end titlepage
|
||||||
|
|
||||||
@contents
|
@node Top, Building, (dir), (dir)
|
||||||
|
@top Overview
|
||||||
|
@c Page published by Emacs Muse begins here
|
||||||
|
|
||||||
@ifnottex
|
|
||||||
@node Top, Introduction, (dir), (dir)
|
|
||||||
@top Ledger Accouting Tool
|
|
||||||
|
|
||||||
@c @insertcopying
|
|
||||||
@end ifnottex
|
|
||||||
|
|
||||||
@menu
|
@menu
|
||||||
|
* Building::
|
||||||
* Introduction::
|
* Introduction::
|
||||||
* Keeping a ledger::
|
* Keeping a ledger::
|
||||||
|
* Using the Ledger Tool::
|
||||||
|
* An easy way to add new entries::
|
||||||
|
* Using Emacs to Keep Your Ledger::
|
||||||
* Using GnuCash to Keep Your Ledger::
|
* Using GnuCash to Keep Your Ledger::
|
||||||
@end menu
|
@end menu
|
||||||
|
|
||||||
@node Introduction, Keeping a ledger, Top, Top
|
@node Building, Introduction, Top, Top
|
||||||
|
@chapter Building
|
||||||
|
|
||||||
|
Welcome to ledger, a command-line accounting program that uses a
|
||||||
|
text-based ledger file, yet provides full double-entry accounting, use
|
||||||
|
of commodities, unlimited accounts, etc.
|
||||||
|
|
||||||
|
Ledger is written in ANSI C++, and should compile on any platform. It
|
||||||
|
only depends on the GNU multiprecision integer library (gmp, or
|
||||||
|
libgmp), and the Perl regular expression library (pcre, or libpcre).
|
||||||
|
Also, this project was developed using GNU make and gcc 3.3.
|
||||||
|
|
||||||
|
To build and install, once you have these libraries on your system,
|
||||||
|
enter these commands:
|
||||||
|
|
||||||
|
@example
|
||||||
|
make
|
||||||
|
cp ledger /usr/local/bin
|
||||||
|
@end example
|
||||||
|
|
||||||
|
@node Introduction, Keeping a ledger, Building, Top
|
||||||
@chapter Introduction
|
@chapter Introduction
|
||||||
|
|
||||||
@code{ledger} is an accouting tool that has the chutzpah to exist. It
|
Ledger is an accounting tool with the moxie to exist. It provides not
|
||||||
provides not one bell or whistle for the money, and returns the user
|
one bell or whistle for the money, and returns the user to the days
|
||||||
to the days before user interfaces were even a twinkle in their
|
before user interfaces were even a twinkle in their father's CRT.
|
||||||
father's CRT.
|
|
||||||
|
|
||||||
What it does do is provide a double-entry accouting ledger with all of
|
What it does do is provide a double-entry accounting ledger with all
|
||||||
the flexibility and muscle of its modern day cousins---without any of
|
of the flexibility and muscle of its modern day cousins---without any
|
||||||
the fat. Think of it as the bran muffin of accouting tools.
|
of the fat. Think of it as the bran muffin of accounting tools.
|
||||||
|
|
||||||
To begin with, you need to start keeping a ledger. This is the basis
|
To begin with, you need to start keeping a ledger. This is the basis
|
||||||
of all accouting, and if you don't know how to do it, now is the time
|
of all accounting, and if you don't know how to do it, now is the time
|
||||||
to learn. The little booklet that comes with your checkbook is a
|
to learn. The little booklet that comes with your checkbook is a
|
||||||
ledger, so we'll describe double-entry accouting in terms of that.
|
ledger, so we'll describe double-entry accounting in terms of that.
|
||||||
|
|
||||||
A checkbook ledger records debits (subtractions, or withdrawals) and
|
A checkbook ledger records debits (subtractions, or withdrawals) and
|
||||||
credits (additions, or deposits) with reference to a single account:
|
credits (additions, or deposits) with reference to a single account:
|
||||||
|
|
@ -68,7 +81,7 @@ into virtual savings account without having to physically move the
|
||||||
money around; etc. As you keep your checkbook ledger, you are
|
money around; etc. As you keep your checkbook ledger, you are
|
||||||
recording a lot of information about your life and your habits, and
|
recording a lot of information about your life and your habits, and
|
||||||
sometimes that information can tell you things you aren't even aware
|
sometimes that information can tell you things you aren't even aware
|
||||||
of. That is the aim of all good accouting tools.
|
of. That is the aim of all good accounting tools.
|
||||||
|
|
||||||
The next step up from a checkbook ledger is a ledger that covers all
|
The next step up from a checkbook ledger is a ledger that covers all
|
||||||
of your accounts, not just your checking account. In this ledger, you
|
of your accounts, not just your checking account. In this ledger, you
|
||||||
|
|
@ -77,13 +90,13 @@ where the money is coming from. In the checkbook ledger, its assumed
|
||||||
that all of the money is coming from your checking account. But in a
|
that all of the money is coming from your checking account. But in a
|
||||||
general ledger, you have to write two-lines: The source and target.
|
general ledger, you have to write two-lines: The source and target.
|
||||||
There must always be a debit from some account for any credit made to
|
There must always be a debit from some account for any credit made to
|
||||||
anyone else. This is what is meant by ``double-entry'' accouting.
|
anyone else. This is what is meant by ``double-entry'' accounting.
|
||||||
|
|
||||||
For example, let's say you have a checking account and a brokerage
|
For example, let's say you have a checking account and a brokerage
|
||||||
account, and that you can write checks from both of them. Rather than
|
account, and that you can write checks from both of them. Rather than
|
||||||
keeping two checkbooks, you decide to use one ledger for both. Once
|
keeping two checkbooks, you decide to use one ledger for both. Once
|
||||||
you get the hang of this, you'll be ready to use one ledger for all of
|
you get the hang of this, you'll be ready to use one ledger for all of
|
||||||
your accouting needs, which gets you to the point of this
|
your accounting needs, which gets you to the point of this
|
||||||
introduction.
|
introduction.
|
||||||
|
|
||||||
So in your general ledger, you need to pay Pacific Bell Telephone for
|
So in your general ledger, you need to pay Pacific Bell Telephone for
|
||||||
|
|
@ -109,10 +122,10 @@ from. A general ledger entry would look like this:
|
||||||
What does all of this mean? The first line shows a credit (or
|
What does all of this mean? The first line shows a credit (or
|
||||||
payment) to Pacific Bell to the tune of $23.00. Then, because there
|
payment) to Pacific Bell to the tune of $23.00. Then, because there
|
||||||
is no one ``balance'' in a general ledger, we've written in the total
|
is no one ``balance'' in a general ledger, we've written in the total
|
||||||
balance of your payments to the account ``Pacific Bell''. This was
|
balance of your payments to the account ``Pacific Bell''. This was done
|
||||||
done by looking at the last entry for ``Pacific Bell'' in the general
|
by looking at the last entry for ``Pacific Bell'' in the general ledger,
|
||||||
ledger, adding $23.00 to that amount, and writing in the total in the
|
adding $23.00 to that amount, and writing in the total in the balance
|
||||||
balance column.
|
column.
|
||||||
|
|
||||||
Secondly, the money is coming from your ``Checking'' account, which
|
Secondly, the money is coming from your ``Checking'' account, which
|
||||||
means a debit (or withdrawal) of $23.00, which will leave the ending
|
means a debit (or withdrawal) of $23.00, which will leave the ending
|
||||||
|
|
@ -122,8 +135,8 @@ The transaction itself must balance to $0: $23 goes to Pacific Bell,
|
||||||
$23 comes from Checking: there is nothing left over to be accounted
|
$23 comes from Checking: there is nothing left over to be accounted
|
||||||
for. The money has in fact moved from one account to another. This
|
for. The money has in fact moved from one account to another. This
|
||||||
is basis of double-entry accounting: That money never pops out of
|
is basis of double-entry accounting: That money never pops out of
|
||||||
existence, it is always described as a transaction between
|
existence, it is always described as a transaction between accounts---
|
||||||
accounts---as a flow from one place to another.
|
as a flow from one place to another.
|
||||||
|
|
||||||
Keeping a general ledger is the same as keeping two separate ledgers:
|
Keeping a general ledger is the same as keeping two separate ledgers:
|
||||||
One for Pacific Bell and one for Checking. In that case, each time
|
One for Pacific Bell and one for Checking. In that case, each time
|
||||||
|
|
@ -133,19 +146,18 @@ since you don't have to go looking back for the last time an account
|
||||||
was referenced, but it also means having a lot of ledger books if you
|
was referenced, but it also means having a lot of ledger books if you
|
||||||
deal with multiple accounts.
|
deal with multiple accounts.
|
||||||
|
|
||||||
Enter the beauty of a computerized accouting tool. The purpose of
|
Enter the beauty of a computerized accounting tool. The purpose of
|
||||||
@code{ledger} is to make general ledger accouting simple by keeping
|
Ledger is to make general ledger accounting simple by keeping track of
|
||||||
track of the balances for you. Your only job is to enter credit/debit
|
the balances for you. Your only job is to enter credit/debit pairs
|
||||||
pairs and make sure they balance. If a transaction does not balance,
|
and make sure they balance. If a transaction does not balance, Ledger
|
||||||
@code{ledger} will display an error and ignore the
|
will display an error and ignore the transaction.@footnote{In some special cases, it will automatically balance the entry
|
||||||
transaction.@footnote{In some special cases, it will automatically
|
for you.}
|
||||||
balance the entry for you.}
|
|
||||||
|
|
||||||
Your usage of @code{ledger} will have two parts: Keeping the ledger,
|
Your usage of Ledger will have two parts: Keeping the ledger, and
|
||||||
and using the @code{ledger} tool to provide you with information
|
using the Ledger tool to provide you with information summaries
|
||||||
summaries derived from your ledger's entries.
|
derived from your ledger's entries.
|
||||||
|
|
||||||
@node Keeping a ledger, Using GnuCash to Keep Your Ledger, Introduction, Top
|
@node Keeping a ledger, Using the Ledger Tool, Introduction, Top
|
||||||
@chapter Keeping a ledger
|
@chapter Keeping a ledger
|
||||||
|
|
||||||
The most important part of accounting is keeping a good ledger. If
|
The most important part of accounting is keeping a good ledger. If
|
||||||
|
|
@ -154,29 +166,28 @@ mathematically tricks you need to better understand your spending
|
||||||
patterns. Without a good ledger, no tool, however smart, can help
|
patterns. Without a good ledger, no tool, however smart, can help
|
||||||
you.
|
you.
|
||||||
|
|
||||||
The @code{ledger} program aims at making ledger entry as simple as
|
The Ledger program aims at making ledger entry as simple as possible.
|
||||||
possible. Since it is a command-line tool, it does not provide a user
|
Since it is a command-line tool, it does not provide a user interface
|
||||||
interface for keeping a ledger. If you like, you may use
|
for keeping a ledger. If you like, you may use Gnucash to maintain
|
||||||
@code{gnucash} to maintain your ledger, in which case the
|
your ledger, in which case the Ledger program will read Gnucash's data
|
||||||
@code{ledger} program will read @code{gnucash}'s data files directly.
|
files directly. In that case, read the Gnucash manual now, and skip
|
||||||
In that case, read the @code{gnucash} manual now, and skip to the next
|
to the next chapter.
|
||||||
chapter.
|
|
||||||
|
|
||||||
If you are not using @code{gnucash}, but a text editor to maintain
|
If you are not using Gnucash, but a text editor to maintain your
|
||||||
your ledger, read on. @code{ledger} has been designed to make data
|
ledger, read on. Ledger has been designed to make data entry as
|
||||||
entry as simple as possible, by keeping the ledger format easy, and
|
simple as possible, by keeping the ledger format easy, and also by
|
||||||
also by automagically determining as much information as possible
|
automagically determining as much information as possible based on the
|
||||||
based on the nature of your entries.
|
nature of your entries.
|
||||||
|
|
||||||
For example, you do not need to tell @code{ledger} about the accounts
|
For example, you do not need to tell Ledger about the accounts you
|
||||||
you use. Any time @code{ledger} sees a debit or a credit to an
|
use. Any time Ledger sees a debit or a credit to an account it knows
|
||||||
account it knows nothing about, it will create it. If you use a
|
nothing about, it will create it. If you use a commodity that is new
|
||||||
commodity that is new to @code{ledger}, it will create that commodity,
|
to Ledger, it will create that commodity, and determine its display
|
||||||
and determine its display characteristics (placement of the symbol
|
characteristics (placement of the symbol before or after the amount,
|
||||||
before or after the amount, display precision, etc) based on how you
|
display precision, etc) based on how you used the commodity in the
|
||||||
used the commodity in the transaction.
|
transaction.
|
||||||
|
|
||||||
Here is the Pacific Bell example from above, given as a @code{ledger}
|
Here is the Pacific Bell example from above, given as a Ledger
|
||||||
transaction:
|
transaction:
|
||||||
|
|
||||||
@example
|
@example
|
||||||
|
|
@ -187,9 +198,9 @@ transaction:
|
||||||
|
|
||||||
As you can see, it is very similar to what would be written on paper,
|
As you can see, it is very similar to what would be written on paper,
|
||||||
minus the computed balance totals, and adding in account names that
|
minus the computed balance totals, and adding in account names that
|
||||||
work better with @code{ledger}'s scheme of things. In fact, since
|
work better with Ledger's scheme of things. In fact, since Ledger is
|
||||||
@code{ledger} is smart about many things, you don't need to specify
|
smart about many things, you don't need to specify the balanced
|
||||||
the balanced amount, if it is the same as the first line:
|
amount, if it is the same as the first line:
|
||||||
|
|
||||||
@example
|
@example
|
||||||
9/29 (100) Pacific Bell
|
9/29 (100) Pacific Bell
|
||||||
|
|
@ -197,15 +208,14 @@ the balanced amount, if it is the same as the first line:
|
||||||
Assets:Checking
|
Assets:Checking
|
||||||
@end example
|
@end example
|
||||||
|
|
||||||
For this entry, @code{ledger} will figure out that $-23.00 must come
|
For this entry, Ledger will figure out that $-23.00 must come from
|
||||||
from ``Assets:Checking'' in order to balance the entry.
|
``Assets:Checking'' in order to balance the entry.
|
||||||
|
|
||||||
@menu
|
@menu
|
||||||
* Credits and Debits::
|
* Credits and Debits::
|
||||||
* Commodities and Currencies::
|
* Commodities and Currencies::
|
||||||
* Accounts and Inventories::
|
* Accounts and Inventories::
|
||||||
* Understanding Equity::
|
* Understanding Equity::
|
||||||
* Automated transactions::
|
|
||||||
@end menu
|
@end menu
|
||||||
|
|
||||||
@node Credits and Debits, Commodities and Currencies, Keeping a ledger, Keeping a ledger
|
@node Credits and Debits, Commodities and Currencies, Keeping a ledger, Keeping a ledger
|
||||||
|
|
@ -220,17 +230,17 @@ of view, it debits your checking account every time you use it.
|
||||||
|
|
||||||
The credit card is strangely named, because you have to look at it
|
The credit card is strangely named, because you have to look at it
|
||||||
from the merchant's point of view: Every time you use it, it credit's
|
from the merchant's point of view: Every time you use it, it credit's
|
||||||
@emph{his} account right away. This was a giant leap from the days of
|
@emph{his} account right away. This was a giant leap from the days of cash
|
||||||
cash and checks, when the only other way to supply immediate credit
|
and checks, when the only other way to supply immediate credit was by
|
||||||
was by a wire transfer. But a credit card does not credit you
|
a wire transfer. But a credit card does not credit you anything at
|
||||||
anything at all. In fact, from your point of view, it should be
|
all. In fact, from your point of view, it should be called a
|
||||||
called a liability card, since it increases your liability to the
|
liability card, since it increases your liability to the issuing bank
|
||||||
issuing bank every time you use it.
|
every time you use it.
|
||||||
|
|
||||||
In @code{ledger}, credits and debits are given as they are, which
|
In Ledger, credits and debits are given as they are, which means that
|
||||||
means that sometimes you will see a minus sign where you don't expect
|
sometimes you will see a minus sign where you don't expect one. For
|
||||||
one. For example, when you get paid, in order to credit your bank
|
example, when you get paid, in order to credit your bank account, you
|
||||||
account, you need to debit an income account:
|
need to debit an income account:
|
||||||
|
|
||||||
@example
|
@example
|
||||||
9/29 My Employer
|
9/29 My Employer
|
||||||
|
|
@ -245,15 +255,15 @@ negative figure. Isn't that the opposite of how it should look?
|
||||||
|
|
||||||
It may take getting used to, but to properly use a general ledger you
|
It may take getting used to, but to properly use a general ledger you
|
||||||
will need to think in terms of correct debits and credits. Rather
|
will need to think in terms of correct debits and credits. Rather
|
||||||
than @code{ledger} ``fixing'' the minus signs, let's understand why
|
than Ledger ``fixing'' the minus signs, let's understand why they are
|
||||||
they are there.
|
there.
|
||||||
|
|
||||||
When you earn money, the money has to come from somewhere. Let's call
|
When you earn money, the money has to come from somewhere. Let's call
|
||||||
that somewhere ``society''. In order for society to give you an
|
that somewhere ``society''. In order for society to give you an income,
|
||||||
income, you must take money away from society (debit) in order to put
|
you must take money away from society (debit) in order to put it into
|
||||||
it into your bank (credit). When you then spend that money, it leaves
|
your bank (credit). When you then spend that money, it leaves your
|
||||||
your bank account (debit) and goes back to society (credit). This is
|
bank account (debit) and goes back to society (credit). This is why
|
||||||
why Income will appear negative---it reflects the money you have drawn
|
Income will appear negative---it reflects the money you have drawn
|
||||||
from society---and why Expenses will be positive---it is the amount
|
from society---and why Expenses will be positive---it is the amount
|
||||||
you've given back. These credits and debits will always cancel each
|
you've given back. These credits and debits will always cancel each
|
||||||
other out in the end, because you don't have the ability to create new
|
other out in the end, because you don't have the ability to create new
|
||||||
|
|
@ -267,41 +277,41 @@ place has less money now than when you started your ledger; and every
|
||||||
positive figure means that that account or person or place has more
|
positive figure means that that account or person or place has more
|
||||||
money now that when you started your ledger. Make sense?
|
money now that when you started your ledger. Make sense?
|
||||||
|
|
||||||
Alos, credit cards will have a negative value, because you are
|
Also, credit cards will have a negative value, because you are
|
||||||
spending @emph{from} them (debit) in order pay someone else (credit).
|
spending @emph{from} them (debit) in order pay someone else (credit). They
|
||||||
They are called credit cards because you are able to instantly credit
|
are called credit cards because you are able to instantly credit that
|
||||||
that other person, by simply waving a card.
|
other person, by simply waving a card.
|
||||||
|
|
||||||
@node Commodities and Currencies, Accounts and Inventories, Credits and Debits, Keeping a ledger
|
@node Commodities and Currencies, Accounts and Inventories, Credits and Debits, Keeping a ledger
|
||||||
@section Commodities and Currencies
|
@section Commodities and Currencies
|
||||||
|
|
||||||
@code{ledger} makes no assumptions about the commodities you use; it
|
Ledger makes no assumptions about the commodities you use; it only
|
||||||
only requires that you specify a commodity. The commodity may be any
|
requires that you specify a commodity. The commodity may be any
|
||||||
non-numeric string that does not contain a period, comma, forward
|
non-numeric string that does not contain a period, comma, forward
|
||||||
slash or at sign (@@). It may appear before or after the amount,
|
slash or at-sign. It may appear before or after the amount, although
|
||||||
although it is assumed that symbols appearing before the amount refer
|
it is assumed that symbols appearing before the amount refer to
|
||||||
to currencies, while non-joined symbols apearing after the amount
|
currencies, while non-joined symbols appearing after the amount refer
|
||||||
refer to commodities. Here are some valid currency and commodity
|
to commodities. Here are some valid currency and commodity
|
||||||
specifiers:
|
specifiers:
|
||||||
|
|
||||||
@example
|
@example
|
||||||
$20.00 ; currency: twenty US dollars
|
$20.00 ; currency: twenty US dollars
|
||||||
USD 20 ; currency: the same
|
USD 20 ; currency: the same
|
||||||
40 AAPL ; commodity: 40 shares of Apple Computer stock
|
40 AAPL ; commodity: 40 shares of Apple stock
|
||||||
DM 60 ; currency: 60 Deutsch Mark
|
MD 60 ; currency: 60 Deutsch Mark
|
||||||
£50 ; currency: 50 British pounds
|
£50 ; currency: 50 British pounds
|
||||||
50e ; currency: 50 Euros (use appropriate symbol)
|
50e ; currency: 50 Euros (use symbol)
|
||||||
@end example
|
@end example
|
||||||
|
|
||||||
@code{ledger} will examine the first use of any commodity to determine
|
Ledger will examine the first use of any commodity to determine how
|
||||||
how that commodity should be printed on reports. It pays attention to
|
that commodity should be printed on reports. It pays attention to
|
||||||
whether the name of commodity was separated from the amount, whether
|
whether the name of commodity was separated from the amount, whether
|
||||||
it came before or after, the precision used in specifying the amount,
|
it came before or after, the precision used in specifying the amount,
|
||||||
whether thousand marks were used, etc. This is done so that printing
|
whether thousand marks were used, etc. This is done so that printing
|
||||||
the commodity looks the same as the way you use it.
|
the commodity looks the same as the way you use it.
|
||||||
|
|
||||||
An account may contain multiple commodities, in which case it will
|
An account may contain multiple commodities, in which case it will
|
||||||
have separate totals for each. For example, if your brokage account
|
have separate totals for each. For example, if your brokerage account
|
||||||
contains both cash, gold, and several stock quantities, the balance
|
contains both cash, gold, and several stock quantities, the balance
|
||||||
might look like:
|
might look like:
|
||||||
|
|
||||||
|
|
@ -333,7 +343,7 @@ FEQTX=$32
|
||||||
Specify the prices file using the @samp{-p} option:
|
Specify the prices file using the @samp{-p} option:
|
||||||
|
|
||||||
@example
|
@example
|
||||||
/home/johnw $ ledger -f ledger.dat -p prices.db balance brokerage
|
/home/johnw $ ledger -p prices.db balance brokerage
|
||||||
@end example
|
@end example
|
||||||
|
|
||||||
Now the balance for your brokerage account will be given in US
|
Now the balance for your brokerage account will be given in US
|
||||||
|
|
@ -350,7 +360,7 @@ wanted to know many ounces of gold that would buy. If gold is
|
||||||
currently $357 per ounce, then each dollar is worth 1/357 AU:
|
currently $357 per ounce, then each dollar is worth 1/357 AU:
|
||||||
|
|
||||||
@example
|
@example
|
||||||
/home/johnw $ ledger -f ledger.dat -p "\$=0.00280112 AU" balance checking
|
/home/johnw $ ledger -p "$=0.00280112 AU" balance checking
|
||||||
@end example
|
@end example
|
||||||
|
|
||||||
@example
|
@example
|
||||||
|
|
@ -367,7 +377,7 @@ Here is a sample prices database that uses chaining:
|
||||||
AAPL=$15
|
AAPL=$15
|
||||||
$=0.00280112 AU
|
$=0.00280112 AU
|
||||||
AU=300 Euro
|
AU=300 Euro
|
||||||
Euro=DM 0.75
|
Euro=MD 0.75
|
||||||
@end example
|
@end example
|
||||||
|
|
||||||
This is a roundabout way of reporting AAPL shares in their Deutsch
|
This is a roundabout way of reporting AAPL shares in their Deutsch
|
||||||
|
|
@ -376,12 +386,12 @@ Mark equivalent.
|
||||||
@node Accounts and Inventories, Understanding Equity, Commodities and Currencies, Keeping a ledger
|
@node Accounts and Inventories, Understanding Equity, Commodities and Currencies, Keeping a ledger
|
||||||
@section Accounts and Inventories
|
@section Accounts and Inventories
|
||||||
|
|
||||||
Since @code{ledger}'s accounts and commodity system is so flexible,
|
Since Ledger's accounts and commodity system is so flexible, you can
|
||||||
you can have accounts that don't really exist, and use commodities
|
have accounts that don't really exist, and use commodities that no one
|
||||||
that no one else recognizes. For example, let's say you are buying
|
else recognizes. For example, let's say you are buying and selling
|
||||||
and selling various items in EverQuest, and want to keep track of them
|
various items in EverQuest, and want to keep track of them using a
|
||||||
using a ledger. Just add items of whatever quantity you wish into
|
ledger. Just add items of whatever quantity you wish into your
|
||||||
your EverQuest account:
|
EverQuest account:
|
||||||
|
|
||||||
@example
|
@example
|
||||||
9/29 Get some stuff at the Inn
|
9/29 Get some stuff at the Inn
|
||||||
|
|
@ -391,31 +401,31 @@ your EverQuest account:
|
||||||
@end example
|
@end example
|
||||||
|
|
||||||
Now your EverQuest:Inventory has 3 apples and 5 steaks in it. The
|
Now your EverQuest:Inventory has 3 apples and 5 steaks in it. The
|
||||||
amounts are negative, because you are taking @emph{from} Black's
|
amounts are negative, because you are taking @emph{from} Black's Tavern in
|
||||||
Tavern in order to credit your Inventory account. Note that you don't
|
order to credit your Inventory account. Note that you don't have to
|
||||||
have to use ``Places:Black's Tavern'' as the source account. You
|
use ``Places:Black's Tavern'' as the source account. You could use
|
||||||
could use ``EverQuest:System'' to represent the fact that you acquired
|
``EverQuest:System'' to represent the fact that you acquired them
|
||||||
them online. The only purpose for choosing one kind of source account
|
online. The only purpose for choosing one kind of source account over
|
||||||
over another is for generate more informative reports later on. The
|
another is for generate more informative reports later on. The more
|
||||||
more you know, the better analysis you can perform.
|
you know, the better analysis you can perform.
|
||||||
|
|
||||||
If you later sell some of these items to another player, the entry
|
If you later sell some of these items to another player, the entry
|
||||||
would look like:
|
would look like:
|
||||||
|
|
||||||
@example
|
@example
|
||||||
10/2 Sturm Brightblade
|
10/2 Strum Brightblade
|
||||||
EverQuest:Inventory -2 Steaks
|
EverQuest:Inventory -2 Steaks
|
||||||
EverQuest:Inventory 15 Gold
|
EverQuest:Inventory 15 Gold
|
||||||
@end example
|
@end example
|
||||||
|
|
||||||
Now you've turned 2 steaks into 15 gold, courtesy of your customer,
|
Now you've turned 2 steaks into 15 gold, courtesy of your customer,
|
||||||
Sturm Brightblade.
|
Strum Brightblade.
|
||||||
|
|
||||||
@node Understanding Equity, Automated transactions, Accounts and Inventories, Keeping a ledger
|
@node Understanding Equity, , Accounts and Inventories, Keeping a ledger
|
||||||
@section Understanding Equity
|
@section Understanding Equity
|
||||||
|
|
||||||
The most confusing entry in any ledger will be your equity
|
The most confusing entry in any ledger will be your equity account---
|
||||||
account---because starting balances can't come out of nowhere.
|
because starting balances can't come out of nowhere.
|
||||||
|
|
||||||
When you first start your ledger, you will likely already have money
|
When you first start your ledger, you will likely already have money
|
||||||
in some of your accounts. Let's say there's $100 in your checking
|
in some of your accounts. Let's say there's $100 in your checking
|
||||||
|
|
@ -450,25 +460,26 @@ Clear as mud? Keep thinking about it. Until you figure it out, put
|
||||||
``-- -Equity'' at the end of your balance command, to remove the
|
``-- -Equity'' at the end of your balance command, to remove the
|
||||||
confusing figure from the totals.
|
confusing figure from the totals.
|
||||||
|
|
||||||
@chapter Using the @code{ledger} Tool
|
@node Using the Ledger Tool, An easy way to add new entries, Keeping a ledger, Top
|
||||||
|
@chapter Using the Ledger Tool
|
||||||
|
|
||||||
Now that you have an orderly and well-organized general ledger, it's
|
Now that you have an orderly and well-organized general ledger, it's
|
||||||
time to start generating some orderly and well-organized reports.
|
time to start generating some orderly and well-organized reports.
|
||||||
This is where the @code{ledger} tool comes in. With it, you can
|
This is where the Ledger tool comes in. With it, you can balance your
|
||||||
balance your checkbook, see where your money is going, tell whether
|
checkbook, see where your money is going, tell whether you've made a
|
||||||
you've made a profit this year, and even compute the present day value
|
profit this year, and even compute the present day value of your
|
||||||
of your retirement accounts. And all with the simplest of interfaces:
|
retirement accounts. And all with the simplest of interfaces: the
|
||||||
the command-line.
|
command-line.
|
||||||
|
|
||||||
The most often used command will be the @code{balance} command:
|
The most often used command will be the ``balance'' command:
|
||||||
|
|
||||||
@example
|
@example
|
||||||
/home/johnw $ export LEDGER=/home/johnw/doc/finance/ledger.dat
|
/home/johnw $ export LEDGER=/home/johnw/doc/ledger.dat
|
||||||
/home/johnw $ ledger balance
|
/home/johnw $ ledger balance
|
||||||
@end example
|
@end example
|
||||||
|
|
||||||
Here I've set my @code{LEDGER} environment variable to point to where
|
Here I've set my Ledger environment variable to point to where my
|
||||||
my ledger file is hiding. Thereafter, I needn't specify it again.
|
ledger file is hiding. Thereafter, I needn't specify it again.
|
||||||
|
|
||||||
The balance command prints out the summarized balances of all my
|
The balance command prints out the summarized balances of all my
|
||||||
top-level accounts, excluding sub-accounts. In order to see the
|
top-level accounts, excluding sub-accounts. In order to see the
|
||||||
|
|
@ -503,23 +514,30 @@ food spending:
|
||||||
@end example
|
@end example
|
||||||
|
|
||||||
If you want to show all accounts but for one account, remember to use
|
If you want to show all accounts but for one account, remember to use
|
||||||
@samp{--} to separate the exclusion pattern from the options list:
|
``--'' to separate the exclusion pattern from the options list:
|
||||||
|
|
||||||
@example
|
@example
|
||||||
/home/johnw $ ledger balance -- -equity
|
/home/johnw $ ledger balance -- -equity
|
||||||
@end example
|
@end example
|
||||||
|
|
||||||
|
@menu
|
||||||
|
* Virtual transactions::
|
||||||
|
* Automated transactions::
|
||||||
|
@end menu
|
||||||
|
|
||||||
|
@node Virtual transactions, Automated transactions, Using the Ledger Tool, Using the Ledger Tool
|
||||||
@section Virtual transactions
|
@section Virtual transactions
|
||||||
|
|
||||||
A virtual transaction is when you, in your mind, see money as moving to
|
A virtual transaction is when you, in your mind, see money as moving
|
||||||
a certain place, when in reality that money has not moved at all. There
|
to a certain place, when in reality that money has not moved at all.
|
||||||
are several scenarios in which this type of tracking comes in handy, and
|
There are several scenarios in which this type of tracking comes in
|
||||||
each of them will be discussed in detail.
|
handy, and each of them will be discussed in detail.
|
||||||
|
|
||||||
To enter a virtual transaction, surround the account name in
|
To enter a virtual transaction, surround the account name in
|
||||||
parentheses. This form of usage does not need to balance. However, if
|
parentheses. This form of usage does not need to balance. However,
|
||||||
you want to ensure the virtual transaction balances with other virtual
|
if you want to ensure the virtual transaction balances with other
|
||||||
transactions in the same entry, use square brackets. For example:
|
virtual transactions in the same entry, use square brackets. For
|
||||||
|
example:
|
||||||
|
|
||||||
@example
|
@example
|
||||||
10/2 Paycheck
|
10/2 Paycheck
|
||||||
|
|
@ -539,14 +557,14 @@ increased---even though no money has moved around yet.
|
||||||
[Assets:Checking] $-200.00
|
[Assets:Checking] $-200.00
|
||||||
@end example
|
@end example
|
||||||
|
|
||||||
In this example, $200 has been deducted from checking toward savings for
|
In this example, $200 has been deducted from checking toward savings
|
||||||
a trip. It will appear as though the money has been moved from the
|
for a trip. It will appear as though the money has been moved from
|
||||||
account into ``Savings:Trip'', although no money has actually moved
|
the account into ``Savings:Trip'', although no money has actually moved
|
||||||
anywhere.
|
anywhere.
|
||||||
|
|
||||||
When balances are displayed, virtual transactions will be factored in.
|
When balances are displayed, virtual transactions will be factored in.
|
||||||
To view balances without any virtual balances factored in, using the
|
To view balances without any virtual balances factored in, using the
|
||||||
@samp{-R} flag, for ``Reality''.
|
``-R'' flag, for ``Reality''.
|
||||||
|
|
||||||
@menu
|
@menu
|
||||||
* Saving for a Special Occasion::
|
* Saving for a Special Occasion::
|
||||||
|
|
@ -554,16 +572,16 @@ To view balances without any virtual balances factored in, using the
|
||||||
* Tracking Allocated Funds::
|
* Tracking Allocated Funds::
|
||||||
@end menu
|
@end menu
|
||||||
|
|
||||||
@node Saving for a Special Occasion, Keeping a Budget, Understanding Equity, Understanding Equity
|
@node Saving for a Special Occasion, Keeping a Budget, Virtual transactions, Virtual transactions
|
||||||
@subsection Saving for a Special Occasion
|
@subsection Saving for a Special Occasion
|
||||||
|
|
||||||
@node Keeping a Budget, Tracking Allocated Funds, Saving for a Special Occasion, Understanding Equity
|
@node Keeping a Budget, Tracking Allocated Funds, Saving for a Special Occasion, Virtual transactions
|
||||||
@subsection Keeping a Budget
|
@subsection Keeping a Budget
|
||||||
|
|
||||||
@node Tracking Allocated Funds, , Keeping a Budget, Understanding Equity
|
@node Tracking Allocated Funds, , Keeping a Budget, Virtual transactions
|
||||||
@subsection Tracking Allocated Funds
|
@subsection Tracking Allocated Funds
|
||||||
|
|
||||||
@node Automated transactions, , Understanding Equity, Keeping a ledger
|
@node Automated transactions, , Virtual transactions, Using the Ledger Tool
|
||||||
@section Automated transactions
|
@section Automated transactions
|
||||||
|
|
||||||
@menu
|
@menu
|
||||||
|
|
@ -578,10 +596,10 @@ exact details of this matter are rather complex, so if you have any
|
||||||
interest, I encourage you to do research on the Web.
|
interest, I encourage you to do research on the Web.
|
||||||
|
|
||||||
For any fellow Bahá'ís out there who want to track Huqúqu'lláh, the
|
For any fellow Bahá'ís out there who want to track Huqúqu'lláh, the
|
||||||
@code{ledger} tool makes this extraordinarily easy. Just too easy, in
|
Ledger tool makes this extraordinarily easy. Just too easy, in fact.
|
||||||
fact. Here's all you have to do: If an expense is exempt from
|
Here's all you have to do: If an expense is exempt from Huqúqu'lláh---
|
||||||
Huqúqu'lláh---a ``necessary'' expense---put an exclamation mark befroe
|
a ``necessary'' expense---put an exclamation mark before the account
|
||||||
the account name:
|
name:
|
||||||
|
|
||||||
@example
|
@example
|
||||||
2002.12.31 Rent
|
2002.12.31 Rent
|
||||||
|
|
@ -590,9 +608,8 @@ the account name:
|
||||||
@end example
|
@end example
|
||||||
|
|
||||||
Even easier than that, simply put a list of regular expressions that
|
Even easier than that, simply put a list of regular expressions that
|
||||||
match the categories you consider exempt in a file called
|
match the categories you consider exempt in a file called @samp{.huquq},
|
||||||
@file{.huquq}, and the special marking will be done for you. Here is
|
and the special marking will be done for you. Here is the file I use:
|
||||||
the file I use:
|
|
||||||
|
|
||||||
@example
|
@example
|
||||||
^Income:
|
^Income:
|
||||||
|
|
@ -614,23 +631,108 @@ That's it. To see how much Huq
|
||||||
ledger data, type:
|
ledger data, type:
|
||||||
|
|
||||||
@example
|
@example
|
||||||
/home/johnw $ ledger -f ledger.dat balance ^huquq
|
/home/johnw $ ledger balance ^huquq
|
||||||
@end example
|
@end example
|
||||||
|
|
||||||
@node Using GnuCash to Keep Your Ledger, , Keeping a ledger, Top
|
@node An easy way to add new entries, Using Emacs to Keep Your Ledger, Using the Ledger Tool, Top
|
||||||
|
@chapter An easy way to add new entries
|
||||||
|
|
||||||
|
The three most laborious tasks of keeping a ledger are: adding new
|
||||||
|
entries, reconciling accounts, and generating reports. To address the
|
||||||
|
first of these, there is a sub-command to ledger called ``entry''. It
|
||||||
|
works on the principle that 80% of all transactions are variants of
|
||||||
|
earlier transactions. Here's how it works:
|
||||||
|
|
||||||
|
Let's say you have an old transaction of the following form:
|
||||||
|
|
||||||
|
@example
|
||||||
|
2004/03/15 * Viva Italiano
|
||||||
|
Expenses:Food $12.45
|
||||||
|
Expenses:Tips $2.55
|
||||||
|
Liabilities:MasterCard $-15.00
|
||||||
|
@end example
|
||||||
|
|
||||||
|
Now it's 2004/4/9, and you've just eating at Viva Italiano again. The
|
||||||
|
exact amounts are different, but the overall form is the same. With
|
||||||
|
the ``entry'' command you can type:
|
||||||
|
|
||||||
|
@example
|
||||||
|
ledger entry 2004/4/9 viva food 11.00 tips 2.50
|
||||||
|
@end example
|
||||||
|
|
||||||
|
This will produce the following output:
|
||||||
|
|
||||||
|
@example
|
||||||
|
2004/04/09 Viva Italiano
|
||||||
|
Expenses:Food $11.00
|
||||||
|
Expenses:Tips $2.50
|
||||||
|
Liabilities:MasterCard $-13.50
|
||||||
|
@end example
|
||||||
|
|
||||||
|
This works by finding a transaction that matches the regexp ``viva'',
|
||||||
|
and then assuming that any accounts or amounts you specify will be the
|
||||||
|
same as that earlier transaction. If Ledger does not succeed in
|
||||||
|
generating a new entry for you, it will print an error and set the
|
||||||
|
exit code to 1.
|
||||||
|
|
||||||
|
There is a shell script in the distribution called ``entry'', which
|
||||||
|
simplifies the task of adding a new entry to your ledger, and then
|
||||||
|
launches @samp{vi} to let you confirm that the entry looks appropriate.
|
||||||
|
|
||||||
|
@node Using Emacs to Keep Your Ledger, Using GnuCash to Keep Your Ledger, An easy way to add new entries, Top
|
||||||
|
@chapter Using Emacs to Keep Your Ledger
|
||||||
|
|
||||||
|
In the Ledger tarball is an Emacs module, @samp{ledger.el}. This module
|
||||||
|
makes the process of keeping a text ledger much easier for Emacs
|
||||||
|
users. I recommend putting this at the top of your ledger file:
|
||||||
|
|
||||||
|
@example
|
||||||
|
; -*-ledger-*-
|
||||||
|
@end example
|
||||||
|
|
||||||
|
And this in your @samp{.emacs} file, after copying @samp{ledger.el} to your
|
||||||
|
site-lisp directory:
|
||||||
|
|
||||||
|
@example
|
||||||
|
(load "ledger")
|
||||||
|
@end example
|
||||||
|
|
||||||
|
Now when you edit your ledger file, it will be in @samp{ledger-mode}.
|
||||||
|
@samp{ledger-mode} adds the following commands:
|
||||||
|
|
||||||
|
@table @strong
|
||||||
|
@item C-c C-a
|
||||||
|
For quickly adding new entries based on the form of older ones
|
||||||
|
(see previous section).
|
||||||
|
|
||||||
|
@item C-c C-c
|
||||||
|
Toggles the ``cleared'' flag of the transaction under point.
|
||||||
|
|
||||||
|
@item C-c C-r
|
||||||
|
Reconciles an account by displaying the transactions in another
|
||||||
|
buffer, where simply hitting the spacebar will toggle the cleared
|
||||||
|
flag of the transaction in the ledger. It also displays the current
|
||||||
|
cleared balance for the account in the modeline.
|
||||||
|
|
||||||
|
@end table
|
||||||
|
|
||||||
|
@node Using GnuCash to Keep Your Ledger, , Using Emacs to Keep Your Ledger, Top
|
||||||
@chapter Using GnuCash to Keep Your Ledger
|
@chapter Using GnuCash to Keep Your Ledger
|
||||||
|
|
||||||
The @code{ledger} tool is fast and simple, but it gives you no special
|
The Ledger tool is fast and simple, but it gives you no special
|
||||||
method of actually editing the ledger. It assumes you know how to use
|
method of actually editing the ledger. It assumes you know how to use
|
||||||
a text editor, and like doing so. Perhaps an Emacs mode will appear
|
a text editor, and like doing so. Perhaps an Emacs mode will appear
|
||||||
someday soon to make editing @code{ledger}'s data files much easier.
|
someday soon to make editing Ledger's data files much easier.
|
||||||
|
|
||||||
Until then, you are free to use GnuCash to maintain your ledger, and
|
Until then, you are free to use GnuCash to maintain your ledger, and
|
||||||
the @code{ledger} program for querying and reporting on the contents
|
the Ledger program for querying and reporting on the contents
|
||||||
of that ledger. It takes a little longer to parse the XML data format
|
of that ledger. It takes a little longer to parse the XML data format
|
||||||
that GnuCash uses, but the end result is identical.
|
that GnuCash uses, but the end result is identical.
|
||||||
|
|
||||||
Then again, why would anyone use a Gnome-centric, 35 megabyte behemoth
|
Then again, why would anyone use a Gnome-centric, 35 megabyte behemoth
|
||||||
to edit their data, and a 65 kilobyte executable to query it@dots{}
|
to edit their data, and a 65 kilobyte binary to query it...
|
||||||
|
|
||||||
|
|
||||||
|
@c Page published by Emacs Muse ends here
|
||||||
|
@contents
|
||||||
@bye
|
@bye
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue