summaryrefslogtreecommitdiff
path: root/README
diff options
context:
space:
mode:
Diffstat (limited to 'README')
-rw-r--r--README658
1 files changed, 655 insertions, 3 deletions
diff --git a/README b/README
index 54c3a9a9..b8954424 100644
--- a/README
+++ b/README
@@ -1,5 +1,11 @@
+#title Ledger: Command-Line Accounting
+
+<contents>
+
+* Building
+
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.
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,
enter these commands:
- make
- cp ledger /usr/local/bin
+<example>
+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.