diff options
-rw-r--r-- | ledger.texi | 1885 |
1 files changed, 1885 insertions, 0 deletions
diff --git a/ledger.texi b/ledger.texi new file mode 100644 index 00000000..a1ada658 --- /dev/null +++ b/ledger.texi @@ -0,0 +1,1885 @@ +\input texinfo @c -*-texinfo-*- + +@setfilename ledger.info +@settitle Ledger: Command-Line Accounting + +@documentencoding iso-8859-1 + +@iftex +@finalout +@end iftex + +@titlepage +@title Ledger: Command-Line Accounting +@author John Wiegley +@end titlepage + +@node Top, Introduction, (dir), (dir) +@top Overview +@c Page published by Emacs Muse begins here + + + +@menu +* Introduction:: +* Keeping a ledger:: +* Running Ledger:: +@end menu + +@node Introduction, Keeping a ledger, Top, Top +@chapter Introduction + +Ledger is an accounting tool with the moxie to exist. It provides no +bells or whistles, and returns the user to the days before user +interfaces were even a twinkling in their father's CRT. + +What it does offer is a double-entry accounting ledger with all 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 use it, you need to start keeping a ledger. This is the basis of +all accounting, and if you haven't started yet, 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: +the checking account. Where the money comes from, and where it goes +to, are described in the payee field, where you write the person or +company's name. The ultimate aim of keeping a checkbook ledger is to +know how much money is available to spend. That's really the aim of +all ledgers. + +What computers add is the ability to walk through these transactions, +and tell you things about your spending habits; to let you devise +budgets and get control over your spending; to squirrel away money +into virtual savings account without having to physically move money +around; etc. As you keep your ledger, you are recording information +about your life and habits, and sometimes that information can start +telling you things you aren't aware of. Such is the aim of all good +accounting tools. + +The next step up from a checkbook ledger, is a ledger that keeps track +of all your accounts, not just checking. In such a ledger, you record +not only who gets paid---in the case of a debit---but where the +money came from. In a checkbook ledger, its assumed that all the +money comes from your checking account. But in a general ledger, you +write transaction two-lines: the source account and target account. +@emph{There must always be a debit from at least one account for every +credit made to another account}. This is what is meant by +``double-entry'' accounting: the ledger must always balance to zero, +with an equal number of debits and credits. + +For example, let's say you have a checking account and a brokerage +account, and you can write checks from both of them. Rather than keep +two checkbooks, you decide to use one ledger for both. In this +general ledger you need to record a payment to Pacific Bell for your +monthly phone bill. The cost is $23.00, let's say, and you want to +pay it from your checking account. In the general ledger you need to +say where the money came from, in addition to where it's going to. +The entry might look like this: + +@example +9/29 BAL Pacific Bell $-200.00 $-200.00 + Equity:Opening Balances $200.00 +9/29 BAL Checking $100.00 $100.00 + Equity:Opening Balances $-100.00 +9/29 100 Pacific Bell $23.00 $223.00 + Checking $-23.00 $77.00 +@end example + +The first line shows a payment to Pacific Bell for $23.00. Because +there is no ``balance'' in a general ledger---it's always zero---we +write in the total balance of all payments to ``Pacific Bell'', which +now is $223.00 (previously the balance was $200.00). This is done by +looking at the last entry for ``Pacific Bell'' in the ledger, adding +$23.00 to that amount, and writing the total in the balance column. +And the money came from ``Checking''---a withdrawal of $23.00---which +leaves the ending balance in ``Checking'' at $77.00. This is a very +manual procedure; but that's where computers come in... + +The transaction must balance to $0: $23 went to Pacific Bell, $23 came +from Checking. There is nothing left over to be accounted for, since +the money has simply moved from one account to another. This is the +basis of double-entry accounting: that money never pops in or out of +existence; it is always a transaction from one account 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 a +payment is written into one, you write a corresponding withdrawal into +the other. This makes it easier to write in a ``running balance'', +since you don't have to look back at the last time the account was +referenced---but it also means having a lot of ledger books, if you +deal with multiple accounts. + +Enter the beauty of computerized accounting. The purpose of the +Ledger program is to make general ledger accounting simple, by keeping +track of the balances for you. Your only job is to enter the +transactions. If a transaction does not balance, Ledger will display +an error and indicate which transaction is wrong.@footnote{In some +special cases, it will automatically balance the entry for you.} + +In summary, there are two aspects of Ledger use: updating the ledger +data file, and using the Ledger tool to view the summarized result of +your entries. + +And just for the sake of example---as a starting point for those who +want to dive in head-first---here are the ledger entries from above, +formatting as the ledger program wishes to see them: + +@example +; Set the year for subsequent entries to 2004 +Y 2004 + +9/29 Pacific Bell + Payable:Pacific Bell $-200.00 + Equity:Opening Balances + +9/29 Checking + Accounts:Checking $100.00 + Equity:Opening Balances + +9/29 Pacific Bell + Payable:Pacific Bell $23.00 + Accounts:Checking +@end example + +The account balances and registers in this file, if saved as +@samp{ledger.dat}, could be reported using: + +@example +$ ledger -f ledger.dat balance +$ ledger -f ledger.dat register checking +$ ledger -f ledger.dat register bell +@end example + +@menu +* Building the program:: +@end menu + +@node Building the program, , Introduction, Introduction +@section Building the program + +Ledger is written in ANSI C++, and should compile on any platform. It +depends only on the GNU multiprecision integer library (libgmp), and +the Perl regular expression library (libpcre). It 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 + +Note that when building GNUmp, make sure to pass the +@samp{--enable-cxx} flag to configure, otherwise it will not build +@strong{libgmpxx.a}. And in case it is not already on your system, +@strong{xmlparse.h} is part of the libxmltok package, and not expat. + +@node Keeping a ledger, Running Ledger, Introduction, Top +@chapter 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 transaction involving 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 +@end 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 +@end example + +For this entry, Ledger will figure out that $-23.00 must come from +``Assets:Checking'' in order to balance the entry. + +@menu +* Stating where money goes:: +* Assets and Liabilities:: +* Commodities and Currencies:: +* Accounts and Inventories:: +* Understanding Equity:: +* Dealing with Petty Cash:: +* Archiving previous years:: +* Virtual transactions:: +* Automated transactions:: +* Differences to Accounting Conventions:: +* Using Emacs to Keep Your Ledger:: +* Using GnuCash to Keep Your Ledger:: +* Using timeclock to record billable time:: +@end menu + +@node Stating where money goes, Assets and Liabilities, Keeping a ledger, Keeping a ledger +@section Stating where money goes + +Accountants will talk of `credits' and `debits', but their meaning is +often different from the layman's definitions. To avoid this semantic +overloading, we will refer to subtractions and additions. See +@uref{README.texi#DtAC, ``Differences to Accounting Conventions''} for how to +reconcile the two systems. + +Recall that every transaction will involve two or more accounts. +Money is transferred from one group of accounts to another group. To +record the transaction, @emph{subtract} an amount from the source +accounts, and @emph{add} the same amount to the target accounts. + +In order to write the Ledger entry correctly, you must determine where +the money comes from, and where it goes to. For example, when you are +paid, in order to add to your bank account, you must subtract from an +income account: + +@example +9/29 My Employer + Assets:Checking $500.00 + Income:Salary $-500.00 +@end 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 money flows. 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 (withdraw) from society in order to +put it into (make a payment to) your bank. When you then spend that +money, it leaves your bank account (a withdrawal) and goes back to +society (a payment). 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 additions and +subtractions 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? + +@node Assets and Liabilities, Commodities and Currencies, Stating where money goes, Keeping a ledger +@section Assets and Liabilities + +Assets are money that you have, and Liabilities are money that you +owe. ``Liabilities'' is just a more inclusive name for Debts. + +An Asset is typically increased by transferring money from an Income +account, such as when you get paid. Here is a typical entry: + +@example +2004/09/29 My Employer + Assets:Checking $500.00 + Income:Salary +@end example + +Money, here, is coming from an Income account belonging to ``My +Employer'', and is being transferred to an account that belongs to you. +The money is now yours, which makes it an asset. + +Liability accounts track money you owe to others. They come into play +whenever you borrow money to buy something, or if you owe someone +money. The usual way a liability is changed is by expending money, +thus transferring it to an Expenses account. For example: + +@example +2004/09/30 Restaurant + Expenses:Dining $25.00 + Liabilities:MasterCard +@end example + +Your account balance will now show $25 spent on Dining, and a +corresponding $25 owed on your MasterCard. The MasterCard liability +will show up as negative, since it offsets the value of your assets. +@emph{The combined total of your Assets and Liabilities is your net +worth}. To see your current net worth, use this command: + +@example +$ ledger balance ^assets ^liabilities +@end example + +Relatedly, your Income accounts will show up negative, because they +transfer money @emph{from} an account in order to increase your +assets. Your Expenses accounts will show up positive, because that is +where the money went. The combined total your Income and Expenses is +your cash flow. A negative cash flow means that you are spending more +cash than you make. To see your current cash flow, use this command: + +@example +$ ledger balance ^income ^expenses +@end example + +Often, it is only important to view your income and expenses when +asking questions like, ``Where did my money go? Am I spending too +much on X? Am I making enough to cover my expenses?'' But most of +the time, you will usually want to ask other questions like, ``Is +there enough money in my checking account to cover my next credit card +bill?'' For these reasons, I recommend creating a script that removes +Income, Expenses, and Equity by default from your basic balance +report. The provided script ``bal'' does this for you, as well as +making it easier to run the balance command: + +@example +$ bal +@end example + +To use this script, it must be copied from the @strong{scripts} +directory in the ledger distribution, to a directory along your +@samp{PATH}. Also, you must set the environment variable +@samp{LEDGER} to point to your main ledger file. + +Another common question to ask of your expenses is: How much do I +spend each month on X? Ledger provides a simple way of displaying +monthly totals for any account. Here is an example that summarizes +monthly automobile expenses: + +@example +$ ledger -M register expenses:auto +@end example + +This assumes, of course, that you use accounts like Expenses:Auto:Gas +and Expenses:Auto:Repair. + +@menu +* Tracking reimbursable expenses:: +@end menu + +@node Tracking reimbursable expenses, , Assets and Liabilities, Assets and Liabilities +@subsection Tracking reimbursable expenses + +Sometimes you will want to spend money on behalf of someone else, +which will eventually get repaid. Since the money is still ``yours'', +it is really an asset. And since the expenditure was for someone +else, you don't want it contaminating your Expenses reports. You will +need to keep an account for tracking reimbursements. + +This is fairly easy to do in ledger. When spending the money, spend +it @emph{to} your Assets:Reimbursements, using a different account for +each person or business that you spend money for. For example: + +@example +2004/09/29 Circuit City + Assets:Reimbursements:Company XYZ $100.00 + Liabilities:MasterCard +@end example + +This shows that you spent $100.00 on your MasterCard at Circuit City, +but that the expense was made on behalf of Company XYZ. Later, when +Company XYZ pays you back, you will transfer the money from your +reimbursement account to a regular asset account: + +@example +2004/09/29 Company XYZ + Assets:Checking $100.00 + Assets:Reimbursements:Company XYZ +@end example + +This deposits the money owed from Company XYZ into your checking +account, presumably because they paid you back with a check. + +But what to do if you run your own business, and you want to keep +track of expenses made on your own behalf, while still tracking +everything in a single ledger file? This is more complex, because you +need to track two separate things: 1) The fact that the money should +be reimbursed to you, and 2) What the expense account was, so that you +can later determine where your company is spending its money. + +This kind of transaction is best handled with mirrored transactions in +two different files, one for your personal accounts, and one for your +company accounts. But keeping them in one file involves the same +kinds of transactions, so those are what is shown here. First, the +personal entry, which shows the need for reimbursement: + +@example +2004/09/29 Circuit City + Assets:Reimbursements:Company XYZ $100.00 + Liabilities:MasterCard +@end example + +This is the same as above, except that you own Company XYZ, and are +keeping track of its expenses in the same ledger file. This entry +should be immediately followed by an equivalent entry, which shows the +kind of expense, and also notes the fact that $100.00 is now payable +to you: + +@example +2004/09/29 Circuit City + Company XYZ:Expenses:Computer:Software $100.00 + Company XYZ:Accounts Payable:Your Name +@end example + +This second entry shows that Company XYZ has just spent $100.00 on +software, and that this $100.00 came from Your Name, which must be +paid back. + +These two entries can also be merged, to make things a little clearer. +Note that all amounts must be specified now: + +@example +2004/09/29 Circuit City + Assets:Reimbursements:Company XYZ $100.00 + Liabilities:MasterCard $-100.00 + Company XYZ:Expenses:Computer:Software $100.00 + Company XYZ:Accounts Payable:Your Name $-100.00 +@end example + +To ``pay back'' the reimbursement, just reverse the order of everything, +except this time drawing the money from a company asset, paying it to +accounts payable, and then drawing it again from the reimbursement +account, and paying it to your personal asset account. It's easier +shown than said: + +@example +2004/10/15 Company XYZ + Assets:Checking $100.00 + Assets:Reimbursements:Company XYZ $-100.00 + Company XYZ:Accounts Payable:Your Name $100.00 + Company XYZ:Assets:Checking $-100.00 +@end example + +And now the reimbursements account is paid off, accounts payable is +paid off, and the $100.00 has been effectively transferred from the +company's checking account to your personal checking account. The +money simply ``waited''---in both Assets:Reimbursements:Company XYZ, +and Company XYZ:Accounts Payable:Your Name---until such time as it +could be paid off. + +The value of tracking expenses from both sides like that is that you +do not contaminate your personal expense report with expenses made on +behalf of others, while at the same time making it possible to +generate accurate reports of your company's expenditures. It is more +verbose than just paying for things with your personal assets, but it +gives you a very accurate information trail. + +The advantage to keep these doubled entries together is that they +always stay in sync. The advantage to keeping them apart is that it +clarifies the transfer's point of view. To keep the transactions in +separate files, just separate the two entries that were joined above. +For example, for both the expense and the pay-back shown above, the +following four entries would be created. Two in your personal ledger +file: + +@example +2004/09/29 Circuit City + Assets:Reimbursements:Company XYZ $100.00 + Liabilities:MasterCard $-100.00 + +2004/10/15 Company XYZ + Assets:Checking $100.00 + Assets:Reimbursements:Company XYZ $-100.00 +@end example + +And two in your company ledger file: + +@example +@@ Company XYZ + +2004/09/29 Circuit City + Expenses:Computer:Software $100.00 + Accounts Payable:Your Name $-100.00 + +2004/10/15 Company XYZ + Accounts Payable:Your Name $100.00 + Assets:Checking $-100.00 + +@@@@ +@end example + +(Note: The @ above command means that all accounts mentioned in the +file are children of the specified account. In this case it means +that all activity in file relates to Company XYZ). + +After creating these entries, you will always know that $100.00 was +spent using your MasterCard on behalf of Company XYZ, and that Company +XYZ spent the money on computer software and paid it back about two +weeks later. + +@node Commodities and Currencies, Accounts and Inventories, Assets and Liabilities, Keeping a ledger +@section 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 +40 AAPL ; commodity: 40 shares of Apple stock +60 DM ; currency: 60 Deutsch Mark +£50 ; currency: 50 British pounds +50e ; currency: 50 Euros (use appropriate symbol) +@end 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 +@end 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 +@end example + +Specify the prices file using the @samp{-p} option: + +@example +ledger -p prices.db balance brokerage +@end 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 +@end 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 +ledger -p "$=0.00280112 AU" balance checking +@end example + +@example +14.01 AU Assets:Checking +@end 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 +@end example + +This is a roundabout way of reporting AAPL shares in their Deutsch +Mark equivalent. + +@menu +* Commodity price histories:: +@end menu + +@node Commodity price histories, , Commodities and Currencies, Commodities and Currencies +@subsection Commodity price histories + +Whenever a commodity is purchased using a different commodity (such as +a share of common stock using dollars), it establishes a price for +that commodity on that day. It is also possible, by recording price +details in a ledger file, to specify other prices for commodities at +any given time. Such price entries might look like those below: + +@example +P 2004/06/21 02:17:58 TWCUX $27.76 +P 2004/06/21 02:17:59 AGTHX $25.41 +P 2004/06/21 02:18:00 OPTFX $39.31 +P 2004/06/21 02:18:01 FEQTX $22.49 +P 2004/06/21 02:18:02 AAPL $32.91 +@end example + +By default, ledger will not consider commodity prices when generating +its various reports. It will always report balances in terms of the +commodity total, rather than the current value of those commodities. +To enable pricing reports, several options are possible: + +@table @strong +@item @strong{-P FILE} +With this option, or if the environment variable @samp{PRICE_HIST} is +set, pricing information obtained from the Internet will be kept +in this file. Also, this file will be read after all other ledger +files are read, so that full history information is available for +reports. + +@item @strong{-O} +Report commodity totals only, not their market value or basis cost. + +@item @strong{-V} +Report commodity values in terms of their last known market price. + +@item @strong{-B} +Report commodities in terms of their ``basis cost'', or what they cost +at time of purchase. Thus, totals in the register and balance +report reflect the total amount spent. + +@item @strong{-G} +Report commodities in terms of their net gain, which is: the market +value minus the cost basis. A balance report using this option +shows very quickly the performance of investments. + +@item @strong{-Q} +When needed (see the @samp{-L} option) pricing quotes are obtained by +calling the script @samp{getquote} (a sample Perl script is provided, but +the interface is kept simple so replacements may be made). + +@item @strong{-L MINS} +When using the @samp{-Q} flag, new quotes are obtained only if current +pricing data is older than MINS minutes. The default is one day, +or 1440 minutes. + +@item @strong{-p ARG} +If a string, such as ``COMM=$1.20'', the commodity COMM will be +reported only in terms of the conversion factor, which supersedes +all other pricing histories for that commodity. This can be used to +perform arbitrary value substitutions. For example, to report the +value of your dollars in terms of the ounces of gold they would buy, +use: -p ``$=0.00280112 AU'' (or whatever the current exchange rate +is). + +@end table + +Note that the @samp{-B}, @samp{-O}, @samp{-V}, and @samp{-G} are mutually exclusive. + +@node Accounts and Inventories, Understanding Equity, Commodities and Currencies, Keeping a ledger +@section 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 +@end example + +Now your EverQuest:Inventory has 3 apples and 5 steaks in it. The +amounts are negative, because you are taking @emph{from} Black's Tavern in +order to add to 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 +@end example + +Now you've turned 2 steaks into 15 gold, courtesy of your customer, +Strum Brightblade. + +@node Understanding Equity, Dealing with Petty Cash, Accounts and Inventories, Keeping a ledger +@section 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 +@end 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 +``@samp{-- -Equity}'' at the end of your balance command, to remove the +confusing figure from the totals. + +@node Dealing with Petty Cash, Archiving previous years, Understanding Equity, Keeping a ledger +@section Dealing with Petty Cash + +Something that stops many people from keeping a ledger at all is the +insanity of tracking small cash expenses. They rarely generate a +receipt, and there are often a lot of small transactions, rather than +a few large ones, as with checks. + +One solution is: don't bother. Move your spending to a debit card, +but in general ignore cash. Once you withdraw it from the ATM, mark +it as already spent to an ``Expenses:Cash'' category: + +@example +2004/03/15 ATM + Expenses:Cash $100.00 + Assets:Checking +@end example + +If at some point you make a large cash expense that you want to track, +just ``move'' the amount of the expense from ``Expenses:Cash'' into the +target account: + +@example +2004/03/20 Somebody + Expenses:Food $65.00 + Expenses:Cash +@end example + +This way, you can still track large cash expenses, while ignoring all +of the smaller ones. + +@node Archiving previous years, Virtual transactions, Dealing with Petty Cash, Keeping a ledger +@section Archiving previous years + +After a while, your ledger can get to be pretty large. While this +will not slow down the ledger program much---it's designed to process +ledger files very quickly---things can start to feel ``messy''; and +it's a universal complaint that when finances feel messy, people avoid +them. + +Thus, archiving the data from previous years into their own files can +offer a sense of completion, and freedom from the past. But how to +best accomplish this with the ledger program? There are two commands +that make it very simple: ``print'', and ``equity''. + +Let's take an example file, with data ranging from year 2000 until +2004. We want to archive years 2000 and 2001 to their own file, +leaving just 2003 and 2004 in the current file. So, use ``print'' to +output all the earlier entries to a file called @samp{ledger-old.dat}. +(Keeping in mind that the ending date is not inclusive, which is why +2002 is mentioned in the following command): + +@example +$ ledger -f ledger.dat -b 2000/1/1 -e 2002/1/1 print \ + > ledger-old.dat +@end example + +To delete older data from the current ledger file, use ``print'' again, +this time specifying year 2002 as the starting date: + +@example +$ ledger -f ledger.dat -b 2002/1/1 print > x +$ mv x ledger.dat +@end example + +However, now the current file contains @emph{only} transactions from 2002 +onward, which will not yield accurate present-day balances, because +the net income from previous years is no longer being tallied. To +compensate for this, we must append an equity report for the old +ledger at the beginning of the new one: + +@example +$ ledger -f ledger-old.dat equity > equity.dat +$ cat equity.dat ledger.dat > x +$ mv x ledger.dat +$ rm equity.dat +@end example + +Now the balances reported from @samp{ledger.dat} are identical to what +they were before the data was split. + +How often should you split your ledger? You never need to, if you +don't want to. Even eighty years of data will not slow down ledger +much---and that's just using present day hardware! Or, you can keep +the previous and current year in one file, and each year before that +in its own file. It's really up to you, and how you want to organize +your finances. For those who also keep an accurate paper trail, it +might be useful to archive the older years to their own files, then +burn those files to a CD to keep with the paper records---along with +any electronic statements received during the year. In the arena of +organization, just keep in mind this maxim: Do whatever keeps you +doing it. + +@node Virtual transactions, Automated transactions, Archiving previous years, Keeping a ledger +@section 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 +@end 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 +@end 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''. + +Write about: Saving for a Special Occasion; Keeping a Budget; Tracking +Allocated Funds. + +@node Automated transactions, Differences to Accounting Conventions, Virtual transactions, Keeping a ledger +@section Automated transactions + +As a Bahá'í, I need to compute Huqúqu'lláh whenever I acquire assets. +The exact details of this are a bit complex, so if you have further +interest, please consult the Web. + +For any fellow Bahá'ís out there who want to track Huqúqu'lláh, the +Ledger tool makes this extremely easy. Just set up the following +automated transaction at the top of your ledger file: + +@example +; These entries will compute Huqúqu'lláh based on the +; contents of the ledger. + += ^Income: += ^Expenses:Rent$ += ^Expenses:Furnishings += ^Expenses:Business += ^Expenses:Taxes += ^Expenses:Insurance + (Liabilities:Huqúqu'lláh) 0.19 +@end example + +This automated transaction works by looking at each transaction +appearing afterward in the ledger file. If any match the account +regexps, occurring after the equal signs above, 19% of the value of +that transaction is applied to the ``Liabilities:Huqúqu'lláh'' account. +So if $1000 is earned through Income:Salary, which is seen as a debit +from Income, a debit of $190 is applied to ``Liabilities:Huqúqu'lláh''; +if $1000 is spent on Rent---seen as a credit to the Expense account---a credit of $190 is applied to Huqúqu'lláh. The ultimate balance +of Huqúqu'lláh reflects how much must be paid to that account in order +to balance it to zero. + +When you're ready to pay, just write a check directly to the account +``Liabilities:Huqúqu'lláh'': + +@example +2003/01/01 (101) Baha'i Huqúqu'lláh Trust + Liabilities:Huqúqu'lláh $1,000.00 + Assets:Checking +@end example + +That's it. To see how much Huqúq is currently owed based on your +ledger entries, use: + +@example +ledger balance Liabilities:Huqúq +@end example + + +@node Differences to Accounting Conventions, Using Emacs to Keep Your Ledger, Automated transactions, Keeping a ledger +@section Differences to Accounting Conventions +If you are an accountant, or you are familiar with accounting +terminology, then you might be tearing your hair out after reading the +above. Please don't! + +Ledger is intended to make people comfortable with their finances; to +help them better control the flow of their money. Contemporary +accounting practices, on the other hand, often seem counter-intuitive +and confusing to the layman. To make Ledger more accessible, it +avoids the use of standard accounting conventions and terminology. +However, Ledger is flexible enough that you may interpret what is +happening however you wish. + +Most probably, the following section will confuse you, and you should +skip it if you've managed to understand everything so far. However, +if you intend to communicate your accounting practices to a +professional accountant, the following explanations may be useful. + +@table @strong +@item The entity +The individual or organisation under consideration: the someone or +something on whose behalf you are accounting. Probably you. + +@item Assets +Future economic benefits controlled by the entity as a result of a +past transaction or event. + +@item Liabilities +Future sacrifices of economic benefits that the entity is obliged to +make as a result of a past transaction or event. + +@end table + +The format of the data files used by Ledger is more akin to a general +journal than a ledger. In an accounting ledger, transactions are +grouped by account. In a general journal, transactions are commonly +listed in chronological order. + +Often ``cash'' is used to refer to a liquid savings account at a bank, +rather than the physical notes and coins you may withdraw. + +In general, an ``addition'' in Ledger is an accounting debit, and a +``subtraction'' in Ledger is an accounting credit. The following table +shows the ``normal'' balances for the different types of accounts. +Accountants avoid using negative balances where possible, instead +prefering a positive amount in ``credit'' balance. + +@multitable @columnfractions 0.2 0.2 0.2 0.2 0.2 +@item System @tab Asset @tab Liability @tab Income @tab Expense +@item @strong{Accounting} @tab debit @tab credit @tab credit @tab debit +@item @strong{Ledger} @tab positive @tab negative @tab negative @tab positive +@end multitable + +That's correct: accountants call an addition to their cash a debit! +However, from the bank's perspective it is a credit: the accountant's +cash is a liability for the bank. Consequently, payments to the +account will show up as credits on his bank statement. + +@node Using Emacs to Keep Your Ledger, Using GnuCash to Keep Your Ledger, Differences to Accounting Conventions, Keeping a ledger +@section 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 timeclock to record billable time, Using Emacs to Keep Your Ledger, Keeping a ledger +@section Using GnuCash to Keep Your Ledger + +The Ledger tool is fast and simple, but it offers no custom method for +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... + +@node Using timeclock to record billable time, , Using GnuCash to Keep Your Ledger, Keeping a ledger +@section Using timeclock to record billable time + +The timeclock tool makes it easy to track time events, like clocking +into and out of a particular job. These events accumulate in a +timelog file. + +Each in/out event may have an optional description. If the ``in'' +description is a ledger account name, these in/out pairs may be viewed +as virtual transactions, adding time commodities (hours) to that +account. + +For example, the command-line version of the timeclock tool (which is +written in Python) could be used to begin a timelog file like: + +@example +$ export TIMELOG=$HOME/.timelog +$ ti ClientOne category +$ sleep 10 +$ to waited for ten seconds +@end example + +The @strong{.timelog} file now contains: + +@example +i 2004/10/06 15:21:00 ClientOne category +o 2004/10/06 15:21:10 waited for ten seconds +@end example + +Ledger can parse this directly, as if it had seen the following ledger +entry: + +@example +2004/10/06 category + (ClientOne) 0.00277h +@end example + +In other words, the timelog event pair is seen as adding 0.00277h (ten +seconds) worth of time to the ClientOne account. This would be +considered billable time, which later could be invoiced and credited +to accounts receivable: + +@example +2004/11/01 (INV#1) ClientOne, Inc. + Receivable:ClientOne $0.10 + ClientOne -0.00277h @@ $35.00 +@end example + +The above transaction converts the clocked time into an invoice for +the time spent, at an hourly rate of $35. Once the invoice is paid, +the money is deposited from the receivable account into a checking +account: + +@example +2004/12/01 ClientOne, Inc. + Assets:Checking $0.10 + Receivable:ClientOne +@end example + +And now the time spent has been turned into hard cash in the checking +account. + +The advantage to using timeclock and invoicing to bill time is that +you will always know, by looking at the balance report, exactly how +much unbilled and unpaid time you've spent working for any particular +client. + +I like to @samp{!include} my timelog at the top of my company's accounting +ledger, with the attached prefix ``Billable'': + +@example +; -*-ledger-*- + +; This is the ledger file for my company. But first, include the +; timelog data, entering all of the time events within the umbrella +; account "Billable". + +!include /home/johnw/.timelog Billable + +; Here follows this fiscal year's transactions for the company. + +2004/11/01 (INV#1) ClientOne, Inc. + Receivable:ClientOne $0.10 + Billable:ClientOne -0.00277h @@ $35.00 + +2004/12/01 ClientOne, Inc. + Assets:Checking $0.10 + Receivable:ClientOne +@end example + +@node Running Ledger, , Keeping a ledger, Top +@chapter Running Ledger + +@menu +* Commands:: +* Options:: +* Format strings:: +* Value expressions:: +* Interval expressions:: +* Plotting register data:: +* Typical queries:: +* File format:: +* Command summary:: +* Using command options:: +@end menu + +@node Commands, Options, Running Ledger, Running Ledger +@section Commands + +@node Options, Format strings, Commands, Running Ledger +@section Options + +@subsection Environment variables + +Every option to ledger may be set using an environment variable. If +the option has a long option named @samp{--this-option}, then setting +the environment variable @samp{LEDGER_THIS_OPTION} will have the same +affect. Options on the command-line always take precedence over +environment variable settings. + +@node Format strings, Value expressions, Options, Running Ledger +@section Format strings + +@node Value expressions, Interval expressions, Format strings, Running Ledger +@section Value expressions + +A value expression is a language used by ledger wherever a value is +involved. Some examples are: + +@itemize +@item Values displayed in reports +@item Predicates, or which transactions get calculated/displayed +@item Sorting criteria, or how transactions are sorted +@end itemize + +Value expressions support most simple math and logic operators, in +addition to a set of one letter functions and variables. A function's +argument is whatever follows it. Here are some value expression +examples: + +@example +t = the transaction's value + +MT = the average total + +t*3+T = three times the amount plus the total + +At>@{$100@}?t:T = if the absolute value of the amount + is in dollars, and greater than $100, use the amount, + otherwise use the total. + +d<N&t+T = if the date is less than today, use the + amount plus the total, otherwise zero. +@end example + +@subsection Variables + +Below are the one letter variables available in any value expression: + +@table @asis +@item a +The transaction's amount; the balance of an account, without +considering children. + +@item B +The balance before the current transaction, which is the same as +@samp{O-a}; the subtotal of an account's children. + +@item C +The total cost of all transactions seen so far; the total cost of an +account and all its children. + +@item c +The cost of a transaction; the cost of an account, without its +children. + +@item d +A transaction's date, as the number of seconds past the epoch. This +is zero for an account. + +@item G +The total net gain (market value minus cost basis), for a series of +transactions, or an account and its children. It is the same as +@samp{V-C}. + +@item g +The net gain (market value minus cost basis), for a transaction or an +account without its children. It is the same as @samp{v-c}. + +@item l +The depth (``level'') of an account. If an account has one parent, +it's depth is one. + +@item N +The present date. + +@item n +The index of a transaction, or the count of transactions affecting an +account (including children). + +@item O +The total of all transactions seen so far, or the total of an account +and all its children. + +@item R +The value one, if a transaction is not virtual. + +@item T +This maps to whatever the user specified using @samp{-T}. + +@item t +This maps to whatever the user specified using @samp{-t}. + +@item V +The market value of all transactions seen so far, or of an account and +all its children. + +@item v +The market value of a transaction, or an account without its children. + +@item X +The value one, if a transaction's entry has been cleared. +@end table + +@subsection Functions + +The available one letter functions are: + +@table @asis +@item - +Negates the argument. + +@item A +The absolute value of the argument. + +@item S +Strips the commodity from the argument. + +@item M +The median of the argument; @samp{Mx} is the same as @samp{x/n}. + +@item D +The deviation of the argument; @samp{Dx} is the same as @samp{x-x/n}. + +@item P +The present market value of the argument. The syntax @samp{P(x,d)} is +supported, which yields the market value at time @samp{d}. +@end table + +@subsection Operators + +The binary and ternary operators, in order of precedence, are: + +@enumerate +@item @samp{* /} +@item @samp{+ -} +@item @samp{! < > =} +@item @samp{& | ?:} +@end enumerate + +@subsection Complex expressions + +More complicated expressions are possible using: + +@table @asis +@item NUM +A plain integer represents a commodity-less amount. + +@item @{AMOUNT@} +An amount in braces can be any kind of amount supported by ledger, +with or without a commodity. Use this for decimal values. + +@item /REGEXP/ +A regular expression that matches against an account's full name. If +a transaction, this will match against the account affected by the +transaction. + +@item //REGEXP/ +A regular expression that matches against an entry's payee name. + +@item ///REGEXP/ +A regular expression that matches against an account's base name. If +a transaction, this will match against the account affected by the +transaction. + +@item (EXPR) +A sub-expression is nested in parenthesis. This can be useful passing +more complicated arguments to functions, or for overriding the natural +precedence order of operators. + +@item [DATE] +Useful specifying a date in plain terms. For example, you could say +@samp{[2004/06/01]}. +@end table + +@node Interval expressions, Plotting register data, Value expressions, Running Ledger +@section Interval expressions + +@node Plotting register data, Typical queries, Interval expressions, Running Ledger +@section Plotting register data + +@node Typical queries, File format, Plotting register data, Running Ledger +@section Typical queries + +Once you have an orderly and well-organized general ledger, the next +step is to generate orderly and well-organized reports. This is where +the Ledger command-line 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 compute the present 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 +export LEDGER=/home/johnw/doc/ledger.dat +ledger balance +@end 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 +ledger balance expenses:food +@end 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 +ledger -d sep balance expenses:food +@end example + +Or maybe I want to see all of my assets, in which case the -s (show +sub-accounts) option comes in handy: + +@example +ledger balance -s +@end 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 +ledger balance expenses -food +@end 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 +ledger balance -- -equity +@end example + +@node File format, Command summary, Typical queries, Running Ledger +@section File format + +The ledger file format is quite simple, but supports many options. +These are summarized here. + +The initial character of each line determines what that line means, +and how it should be parsed. The possibilities are: + +@table @strong +@item NUMBER +A line starting with a number denotes a regular ledger entry. It +may be followed by any number of lines that beginning whitespace, to +denote account transactions. The format of the header line is: +@example +DATE [*] [(CODE)] DESC +@end example + +@item + +If a line begins with plus, it denotes an inclusion regexp that +will always be considered, as if it had been specified by the user +at the end of their command-line. + +@item @strong{-} +If a line begins with minus, it denotes an exclusion regexp that +will always be considered, as if it had been specified by the user +at the end of their command-line. + +@item @strong{=} +If a line begins with equals, it denotes an automated transaction. +The next item on the line must be a regular expression. Any number +of such lines may appear, with no intervening whitespace. +Following this block of lines can be a list of account transactions +preceded by whitespace. + +@item !WORD +A line beginning with an exclamation mark denotes a command +directive. It must be immediately followed by a word specifying +which directories. At the moment, only @samp{!include} is supported, for +including the content of other ledger files into the current one. + +@item whitespace +A line beginning with whitespace, which is not part of a regular or +automated transaction, is ignored. + +@end table + +@quotation +If a line begins with semicolon it is ignored. This is the +preferred method of entering comments. +@end quotation + +@table @strong +@item Y NUM +If a line begins with a capital Y, it denotes the year to be used +for all subsequent entries that specify a date, whatever their type. +This sets the ``default year'', which ordinarily is the current year +at the time the program is run. Useful at the beginning of a file +to specify the file's year. + +@item P DATE SYMBOL PRICE +Capital P specifies a historical price for a commodity. Any such +number of entries are allowed. These are usually found in a pricing +history file (see the @samp{-Q} option). + +@item C SYMBOL PRICE +Capital C specifies a conversion price for a commodity. This has +no reference to time, and always takes precedence over any +historical price (even very current prices). + +@item N SYMBOL +Capital N indicates that no implicit price conversions should be +obtained for the given symbol. This means that no quotes will ever +be downloaded for that symbol. Useful for a home currency, such as +the dollar ($). Be aware that these pricing options will set the +default reporting characteristics for a commodity. Thus it is +recommended that pricing options occur only after all regular ledger +entries have been parsed. + +@item i DATE TIME ACCOUNT [DESC] +Lowercase (and capital) i indicate an time-in event. This will +start accumulating hours in the account specified. Usually these +entries are created in a timelog file by the timeclock program, +which is distributed with ledger. There must be two spaces between +the account name, and the optional description, if one is used. + +@item o DATE TIME ACCOUNT [DESC] +Lowercase (and capital) o indicate an time-out event. This will +accumulate hours in the account specified. Usually these entries +are created in a timelog file by the timeclock program, which is +distributed with ledger. There must be two spaces between the +account name, and the optional description, if one is used. + +@item b, h +Entries beginning with lowercase b and h are ignored. These are +special entries used by timeclock, but ignored by ledger. + +@end table + +@node Command summary, Using command options, File format, Running Ledger +@section Command summary + +@menu +* balance:: +* register:: +* print:: +* equity:: +* price:: +* entry:: +@end menu + +@node balance, register, Command summary, Command summary +@subsection balance + +The ``balance'' command reports the current balance of any account. +This command accepts a list of optional regexps, which will confine +the balance report to only matching accounts. By default, the +balances for all accounts will be printed. If an account contains +multiple types of commodities, each commodity's total is separately +reported. + +@node register, print, balance, Command summary +@subsection register + +The ``register'' command displays all the transactions occurring in a +single account, line by line. The account regexp must be specified as +the only argument to this command. If any regexps occur after the +required account name, the register will contain only those +transactions that match. Very useful for hunting down a particular +transaction. + +The output from ``register'' is very close to what a typical checkbook, +or single account ledger, would look like. It also shows a running +balance. The final running balance of any register should always be +the same as the current balance of that account. + +@node print, equity, register, Command summary +@subsection print + +The ``print'' command prints out ledger entries just as they appear in +the original ledger. They will be properly formatted, and output in +the most economic form possible. The ``print'' command also takes a +list of optional regexps, which will cause only those transactions +which match in some way to be printed. + +The ``print'' command is a handy way to clean up a ledger file whose +formatting has gotten out of hand. + +@node equity, price, print, Command summary +@subsection equity + +Equity transactions are used to establish the starting value of an +account. You might think of equity as the ``ether'' from which initial +balances appear. + +@node price, entry, equity, Command summary +@subsection price + +This commands displays the last known current price for a given +commodity, using the specified end date for the cutoff (default is the +present moment). It takes a list of regexps, which can match the +commodities used in the ledger file. This command is helpful to +quickly seeing the last current price for a specific commodity, or all +commodities referenced by a ledger. + +@node entry, , price, Command summary +@subsection entry + +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 command options, , Command summary, Running Ledger +@section Using command options + +With all of the commands, various command-line options are allowed +that will modify the behavior of the command in some way. And while +the basic commands themselves are useful, you will often find +yourselves adding option flags to the command-line to modify those +commands. + +The command-line options always occur before the command word. This +is done to distinguish them from the matching expressions that always +occur after the command word. The basic form of any command is: + +@example +ledger [OPTIONS] COMMAND [MATCH] +@end example + +Both the OPTIONS and MATCH expressions are optional. You could, for +example, just use ``ledger balance'' without any modification. This +would print the summarized total of all account types. But to get +more specific reporting, or to change the way the output looks, you +must use the options. + +@menu +* Basic options:: +* Filtering options:: +* Output formatting options:: +* Commodity reporting options:: +@end menu + +@node Basic options, Filtering options, Using command options, Using command options +@subsection Basic options + +The @samp{--help} (@samp{-h}) option causes ledger to print a summary of all the +options, and what they are used for. This can be a handy way to +remember which options do what. This help screen is also printed if +ledger is run without a command. + +@samp{--version} (@samp{-v}) prints the current version of ledger and exits. +This is useful for sending bug reports (to @email{johnw@@newartisans.com}), to +let the author know which version of ledger you are using. + +@samp{--init FILE} (@samp{-i FILE}) causes FILE to be read by ledger before any +other ledger file. This file may not contain any transactions, but it +may contain option settings. To specify options in the init file, use +the same syntax as the command-line. Here's an example init file: + +@example +--price-db ~/finance/.pricedb +@end example + +Option settings on the command-line or in the environment always take +precedence over settings in the init file. + +@samp{--file FILE} (@samp{-f FILE}) reads FILE as a ledger file. This command +may be used multiple times. FILE may also be a list of file names +separated by colons. Typically, the environment variable +@samp{LEDGER_FILE} is set, rather than using this command-line option. + +@samp{--cache FILE} identifies FILE as the default binary cache file. That +is, if the ledger files to be read are specified using the environment +variable @samp{LEDGER_FILE}, then whenever a command is finished a binary +copy will be written to the specified cache, to speed up the loading +time of subsequent queries. This filename can also be given using the +environment variable @samp{LEDGER_CACHE}, or by putting the option into +your init file. + +@samp{--output FILE} (@samp{-o FILE}) redirects output from any command to +@samp{FILE}. By default, all output goes to standard output. + +@node Filtering options, Output formatting options, Basic options, Using command options +@subsection Filtering options + +@table @strong +@item @strong{-b DATE} +Only consider entries occuring on or after the given date. + +@item @strong{-e DATE} +Only consider entries occuring before the given date. The date is +not inclusive, so any entries occurring on that date will not be +used. + +@item @strong{-c} +Only consider entries occurring on or before the current date. + +@item @strong{-d DATE} +Only consider entries fitting the given date mask. DATE in this +case may be the name of a month, or a year, or a year and month, +such as ``2004/05''. It's a shorthand for having to specify -b and -e +together. + +@item @strong{-C} +Only consider entries whose cleared flag has been set. The default +is to consider both. + +@item @strong{-U} +Show only uncleared transactions. The default is to consider both. + +@item @strong{-l AMT} +Limit balance reports to those which are greater than AMT. + +@item @strong{-N REGEXP} +If an account matches REGEXP, only display it in the balance report +if its total is negative. Useful to avoid seeing credit in accounts +where one cannot spend that credit, and it will soon become negative +anyway (such as credit cards). + +@item @strong{-R} +Ignore all virtual transactions, and report only the real balance +for each account. + +@end table + +@node Output formatting options, Commodity reporting options, Filtering options, Using command options +@subsection Output formatting options + +@table @strong +@item @strong{-n} +Do not show subtotals in the balance report, or split transactions +in the register report. + +@item @strong{-s} +If an account has children, show them in the balance report. + +@item @strong{-S} +Sort the ledger after reading it. This may affect ``register'' and +``print'' output. + +@item @strong{-E} +Also show empty accounts in the balance totals report. + +@item @strong{-F} +Print full account names in all cases, such as ``Assets:Checking'' +instead of just ``Checking''. Only used current by the ``balance'' +command. + +@item @strong{-M} +When used with the ``register'' command, causes only monthly subtotals +to appear. This can be useful for looking at spending patterns. +TODO: Accept an argument specifying the period to use. + +@item @strong{-A} +Report totals in terms of the arithmetic mean (sum of all items +divided by the count). This does not work when multiple commodities +are used in the same account, in which case this option is ignored. +This option works both for balance reports, and for register reports +(where it displays the running total average). Be aware that in the +balance report, parent account totals reflect the arithmetic mean of +all the transactions---not the mean average of the subaccount +totals. + +@item @strong{-T} +Report totals in terms of the average deviation from the average +value (i.e., the trend). The final total will indicate the amount +over or above the average value which it is expected you will next +spend/earn. When spending is regular, the trend will very slowly +move to zero. + +@item @strong{-X} +Report totals in terms of the expected value of the next +transaction. This is determined by adding the average deviation to +the average value. + +@item @strong{-W} +Report totals in terms of a time-weighted trend. Whereas @samp{-T} +reports the exact value trend irrespective of when the transactions +occurred, @samp{-W} takes into account the time between entries. If a +transaction occurs shortly after another, it will not affect the +running trend as much as if it occurs very much later. This style +of reports always adds a null transaction for the current date, so +that a current lack of spending is taken into account. + +@end table + +@node Commodity reporting options, , Output formatting options, Using command options +@subsection Commodity reporting options + +@table @strong +@item @strong{-P FILE} +With this option, or if the environment variable @samp{PRICE_HIST} is +set, pricing information obtained from the Internet will be kept +in this file. Also, this file will be read after all other ledger +files are read, so that full history information is available for +reports. + +@item @strong{-O} +Report commodity totals only, not their market value or basis cost. + +@item @strong{-V} +Report commodity values in terms of their last known market price. + +@item @strong{-B} +Report commodities in terms of their ``basis cost'', or what they cost +at time of purchase. Thus, totals in the register and balance +report reflect the total amount spent. + +@item @strong{-G} +Report commodities in terms of their net gain, which is: the market +value minus the cost basis. A balance report using this option +shows very quickly the performance of investments. + +@item @strong{-Q} +When needed (see the @samp{-L} option) pricing quotes are obtained by +calling the script @samp{getquote} (a sample Perl script is provided, but +the interface is kept simple so replacements may be made). + +@item @strong{-L MINS} +When using the @samp{-Q} flag, new quotes are obtained only if current +pricing data is older than MINS minutes. The default is one day, +or 1440 minutes. + +@item @strong{-p ARG} +If a string, such as ``COMM=$1.20'', the commodity COMM will be +reported only in terms of the conversion factor, which supersedes +all other pricing histories for that commodity. This can be used to +perform arbitrary value substitutions. For example, to report the +value of your dollars in terms of the ounces of gold they would buy, +use: -p ``$=0.00280112 AU'' (or whatever the current exchange rate +is). + +@end table + + +@c Page published by Emacs Muse ends here +@contents +@bye |