696 lines
		
	
	
		
			22 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
			
		
		
	
	
			696 lines
		
	
	
		
			22 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
| <style>
 | |
| #toc > ol > li > a { display:none; }
 | |
| #toc > ol > li > ol > li { padding-left:0; }
 | |
| </style>
 | |
| * toc
 | |
| 
 | |
| # hledger Step by Step
 | |
| 
 | |
| Here you can learn hledger (and a little double-entry bookkeeping)
 | |
| by practicing, one hands-on exercise at a time. You'll need:
 | |
| 
 | |
| 1. A little familiarity with
 | |
|    the [command](http://tutorial.djangogirls.org/en/intro_to_command_line/index.html)
 | |
|    [line](https://en.flossmanuals.net/command-line/).
 | |
|    Or, the ability to ask for help on the IRC channel.
 | |
| 
 | |
| 2. hledger. [Download](download.html) and install it if you haven't already.
 | |
| 
 | |
| You'll learn the most if you master each small step, in order.  Most
 | |
| steps give you a task with a clear goal; if not, your task is to run
 | |
| the examples and understand them.
 | |
| 
 | |
| If you get stuck, find a problem, or have feedback, please report it on the
 | |
| [IRC channel or mail list](developer-guide.html#quick-links),
 | |
| or send a pull request for this page.
 | |
| 
 | |
| Let's get started!
 | |
| 
 | |
| <div class="clearfix"></div>
 | |
| ## SETUP
 | |
| 
 | |
| ### Check your hledger installation
 | |
| 
 | |
| Get a command prompt, and run hledger to check the version. It should be reasonably [up to date](release-notes.html). These exercises were last tested with this version:
 | |
| 
 | |
| ```shell
 | |
| $ hledger --version
 | |
| hledger 0.26
 | |
| ```
 | |
| 
 | |
| 
 | |
| 
 | |
| ## BASIC DATA ENTRY & REPORTING
 | |
| 
 | |
| ### Locate your journal file with "hledger stats"
 | |
| 
 | |
| hledger reads financial transactions from a "journal file" (so named because it represents a [General Journal](http://en.wikipedia.org/wiki/General_Journal)).
 | |
| The default journal file is in your home directory; check its path using the [stats](manual.html#stats) command.
 | |
| You should see something like:
 | |
| ```shell
 | |
| $ hledger stats
 | |
| The hledger journal file "/home/YOU/.hledger.journal" was not found.
 | |
| Please create it first, eg with "hledger add" or a text editor.
 | |
| Or, specify an existing journal file with -f or LEDGER_FILE.
 | |
| ```
 | |
| 
 | |
| Most hledger commands read this file but can not change it; the `add` and `web` commands can also write it.
 | |
| 
 | |
| (If `stats` reports that the file exists, eg because you previously created it, move it out of the way temporarily for these exercises.)
 | |
| 
 | |
| ### Record a transaction with "hledger add"
 | |
| 
 | |
| Follow the help and use the [add](manual.html#add) command to record your first transaction,
 | |
| an imaginary purchase at the supermarket.
 | |
| We'll go through this in detail. Later you'll learn other ways to enter data.
 | |
| 
 | |
| ```shell
 | |
| $ hledger add
 | |
| Creating hledger journal file "/home/YOU/.hledger.journal".
 | |
| Adding transactions to journal file /home/YOU/.hledger.journal
 | |
| Any command line arguments will be used as defaults.
 | |
| Use tab key to complete, readline keys to edit, enter to accept defaults.
 | |
| An optional (CODE) may follow transaction dates.
 | |
| An optional ; COMMENT may follow descriptions or amounts.
 | |
| If you make a mistake, enter < at any prompt to restart the transaction.
 | |
| To end a transaction, enter . when prompted.
 | |
| To quit, enter . at a date prompt or press control-d or control-c.
 | |
| Date [2015/05/25]:
 | |
| ```
 | |
| 
 | |
| `add` prompts for each transaction field. The first is the date.
 | |
| The value in square brackets is the suggested default (today's date). Press enter to accept it.
 | |
| 
 | |
| ```{.shell .continued}
 | |
| Description: trip to the supermarket
 | |
| ```
 | |
| 
 | |
| Transactions have an optional description (a single line of text) to help you understand them.
 | |
| You can describe the transaction here, or put a payee name, or leave it blank. 
 | |
| Type `trip to the supermarket` and press enter.
 | |
| 
 | |
| ```{.shell .continued}
 | |
| Account 1: expenses
 | |
| ```
 | |
| 
 | |
| Transactions have two or more accounts. Keep it simple; just enter `expenses` for the first one.
 | |
| 
 | |
| If you're thinking "expenses sounds more like a category": it is, but double entry accounting calls those "accounts", too.
 | |
| A purchase is a transfer of money from an asset account to an expense account.
 | |
| An asset is something you own, like some money in a bank account or in your pocket.
 | |
| Once the money has been "moved" to an expense, you no longer own it, but the increasing balance in the expense account reminds you where it went.
 | |
| 
 | |
| ```{.shell .continued}
 | |
| Amount  1: $10
 | |
| ```
 | |
| 
 | |
| The amount being "moved" to `expenses`. In this case 10 US dollars.
 | |
| 
 | |
| ```{.shell .continued}
 | |
| Account 2: assets
 | |
| ```
 | |
| 
 | |
| Next, specify which account the money comes from. Just say `assets`.
 | |
| 
 | |
| ```{.shell .continued}
 | |
| Amount  2 ? [$-10.0]: 
 | |
| ```
 | |
| 
 | |
| Now you're asked for the amount to "move" to or from the `assets` account.
 | |
| As the default, hledger offers the amount required to "balance" the postings entered so far.
 | |
| The minus sign indicates the money is moving from this account.
 | |
| (hledger uses the positive and negative sign instead of accounting's traditional "debit" and "credit" terminology.)
 | |
| In a balanced transaction, the sum of posted amounts is zero, in other words no money disappears into thin air.
 | |
| hledger does not allow unbalanced transactions.
 | |
| Press enter to accept the default. It has an extra decimal place, but never mind.
 | |
| 
 | |
| ```{.shell .continued}
 | |
| Account 3 (or . to finish this transaction): .
 | |
| ```
 | |
| 
 | |
| Type `.` (period) and press enter.
 | |
| 
 | |
| ```{.shell .continued}
 | |
| 2015/05/25 trip to the supermarket
 | |
|     expenses           $10
 | |
|     assets          $-10.0
 | |
| 
 | |
| Save this transaction to the journal ? [y]:
 | |
| ```
 | |
| 
 | |
| You are given a chance to review the transaction just entered.
 | |
| Here you see hledger's plain text data format for journal entries:
 | |
| a non-indented YYYY/MM/DD date, space, and description,
 | |
| followed by two or more indented posting lines, each containing an account name,
 | |
| two or more spaces, and an amount. 
 | |
| (Account names can contain spaces, so at least two spaces are needed to separate them from the amount.)
 | |
| Press enter.
 | |
| 
 | |
| ```{.shell .continued}
 | |
| Saved.
 | |
| Starting the next transaction (. or ctrl-D/ctrl-C to quit)
 | |
| Date [2015/05/25]: <CTRL-D>
 | |
| ```
 | |
| 
 | |
| hledger has saved it to the journal file and is ready for the next
 | |
| entry.  Press control-d (on Windows, control-c) once to exit.
 | |
| 
 | |
| `stats` should now report that your journal exists and contains one transaction:
 | |
| 
 | |
| ```shell
 | |
| $ hledger stats
 | |
| Main journal file        : /home/YOU/.hledger.journal
 | |
| Included journal files   : 
 | |
| Transactions span        : 2015-05-25 to 2015-05-26 (1 days)
 | |
| Last transaction         : 2015-05-25 (0 days ago)
 | |
| Transactions             : 1 (1.0 per day)
 | |
| Transactions last 30 days: 1 (0.0 per day)
 | |
| Transactions last 7 days : 1 (0.1 per day)
 | |
| Payees/descriptions      : 1
 | |
| Accounts                 : 2 (depth 1)
 | |
| Commodities              : 1 ($)
 | |
| ```
 | |
| 
 | |
| ### Show transactions with "hledger print"
 | |
| 
 | |
| The [print](manual.html#print) command shows a tidied-up view of the transaction entries in your journal.
 | |
| Since there's just one so far, you should see:
 | |
| 
 | |
| ```shell
 | |
| $ hledger print
 | |
| 2015/05/25 trip to the supermarket
 | |
|     expenses           $10
 | |
|     assets            $-10
 | |
| 
 | |
| ```
 | |
| 
 | |
| ### Examine your journal file
 | |
| 
 | |
| List and print the journal file (on Windows, use `dir` and `type` and the file path from `hledger stats`):
 | |
| 
 | |
| ```shell
 | |
| $ ls -l ~/.hledger.journal
 | |
| -rw-r--r--  1 YOU  YOU  114 May 25 16:55 /home/YOU/.hledger.journal
 | |
| $ cat ~/.hledger.journal
 | |
| ; journal created 2015-05-25 by hledger
 | |
| 
 | |
| 2015/05/25 trip to the supermarket
 | |
|     expenses           $10
 | |
|     assets
 | |
| ```
 | |
| 
 | |
| ### A convenience: inferred amounts
 | |
| 
 | |
| Why is the amount missing from the assets posting above ?
 | |
| As a convenience to make manual data entry easier, if one amount is missing
 | |
| hledger infers it so as to balance the transaction ($-10 in this case).
 | |
| For consistency, `add` uses the same convention when it writes an entry.
 | |
| (But `print` shows the inferred amount, for clarity.)
 | |
| Only one missing amount is allowed in each transaction.
 | |
| 
 | |
| ### Edit the journal file
 | |
| 
 | |
| Since the journal file is plain text, you can edit it directly with any text editor.
 | |
| Edit the file and change it to test whether two missing amounts is reported as an error. Eg:
 | |
| 
 | |
| ```shell
 | |
| $ emacs ~/.hledger.journal
 | |
| ```
 | |
| 
 | |
| Remove the expenses amount and save the file. It now looks like this:
 | |
| 
 | |
| ```journal
 | |
| 2015/05/25 trip to the supermarket
 | |
|     expenses           
 | |
|     assets
 | |
| ```
 | |
| 
 | |
| Running `print` again, you should see:
 | |
| 
 | |
| ```shell
 | |
| hledger: could not balance this transaction (can't have more than one missing amount; remember to put 2 or more spaces before amounts)
 | |
| 2015/05/25 trip to the supermarket
 | |
|     expenses
 | |
|     assets
 | |
| 
 | |
| 
 | |
| ```
 | |
| 
 | |
| All hledger commands expect the journal to be well-formed, and will report an error and exit otherwise.
 | |
| 
 | |
| ### Two spaces
 | |
| 
 | |
| Notice the last part of that error message: "`... remember to put 2 or more spaces before amounts)`".
 | |
| Another cause of this error is forgetting to put two spaces before the
 | |
| amount, like this:
 | |
| 
 | |
| ```journal
 | |
| 2015/05/25 trip to the supermarket
 | |
|     expenses $10  ; <- problem: only one space between expenses and $10
 | |
|     assets
 | |
| ```
 | |
| 
 | |
| Since account names may contain spaces, hledger thinks the first
 | |
| posting is to an account named "`expenses $10`", with a missing
 | |
| amount.  So remember: two or more spaces.
 | |
| 
 | |
| ### Unbalanced transactions
 | |
| 
 | |
| Edit the file to look like this:
 | |
| 
 | |
| ```journal
 | |
| 2015/05/25 trip to the supermarket
 | |
|     expenses           $10
 | |
|     assets             $10  ; <- deliberate problem: both amounts are positive
 | |
| ```
 | |
| 
 | |
| Here, we wrote both posting amounts but got the sign wrong on one of them, so they don't add up to zero.
 | |
| hledger should detect this mistake. Verify it by running some command, eg `print`. You should see:
 | |
| 
 | |
| ```shell
 | |
| $ hledger print
 | |
| hledger: could not balance this transaction (real postings are off by $20)
 | |
| 2015/05/25 trip to the supermarket
 | |
|     expenses           $10
 | |
|     assets             $10
 | |
| 
 | |
| 
 | |
| ```
 | |
| 
 | |
| That makes sense. (It calls them "real" postings because there are some other kinds of posting you haven't learned about yet; they aren't important.)
 | |
| 
 | |
| Correct the mistake by adding the minus sign, or just removing the assets amount entirely, and verify
 | |
| that `print` works again:
 | |
| ```shell
 | |
| $ hledger print
 | |
| 2015/05/25 trip to the supermarket
 | |
|     expenses           $10
 | |
|     assets            $-10
 | |
| 
 | |
| ```
 | |
| 
 | |
| ### Record a transaction by editing
 | |
| 
 | |
| Edit the file again and manually add a second purchase transaction.
 | |
| It's often quickest to copy & paste a similar entry, then change it.
 | |
| Make the file look like this:
 | |
| 
 | |
| ```journal
 | |
| 2015/05/25 trip to the supermarket
 | |
|     expenses           $10
 | |
|     assets            $-10
 | |
| 
 | |
| 2015/05/26 forgot the bread
 | |
|     expenses            $5
 | |
|     assets
 | |
| ```
 | |
| 
 | |
| The blank line between transactions is customary, though not required.
 | |
| Test your work with `print`. You should see:
 | |
| 
 | |
| ```shell
 | |
| $ hledger print
 | |
| 2015/05/25 trip to the supermarket
 | |
|     expenses           $10
 | |
|     assets            $-10
 | |
| 
 | |
| 2015/05/26 forgot the bread
 | |
|     expenses            $5
 | |
|     assets             $-5
 | |
| 
 | |
| ```
 | |
| 
 | |
| ### Show postings and a running total with "hledger register"
 | |
| 
 | |
| The [register](manual.html#register) command shows transactions in a different format. More precisely, it shows postings.
 | |
| Remember, a posting is an increase or decrease of some account by some amount, and a transaction contains two or more of them.
 | |
| Run `register` and compare with the output of `print` above. You should see:
 | |
| 
 | |
| ```shell
 | |
| $ hledger register
 | |
| 2015/05/25 trip to the supermarket  expenses                          $10           $10
 | |
|                                     assets                           $-10             0
 | |
| 2015/05/26 forgot the bread         expenses                           $5            $5
 | |
|                                     assets                            $-5             0
 | |
| ```
 | |
| 
 | |
| Postings are displayed one per line.
 | |
| The transaction's date and description is displayed only for the first posting in each transaction.
 | |
| Next we see the posted account's name and the amount posted.
 | |
| The final column is a running total of the posted amounts.
 | |
| 
 | |
| ### Show a per-account register report
 | |
| 
 | |
| Notice how the running total above keeps resetting to 0.
 | |
| This makes sense (since we know each transaction's postings add up to zero) but isn't very useful.
 | |
| The register report is more useful when we restrict it to a subset of postings -
 | |
| say, only the postings within a single account.
 | |
| You can do this by specifying the account name as a command line argument.
 | |
| 
 | |
| Run a register report for the `expenses` account. You should see something like the below.
 | |
| (On POSIX platforms, this command uses the terminal width so the output may look slightly different.
 | |
| You can force it to look like the below by running `export COLUMNS=80` first:
 | |
| 
 | |
| ```shell
 | |
| $ hledger register expenses
 | |
| 2015/05/25 trip to the super..  expenses                       $10           $10
 | |
| 2015/05/26 forgot the bread     expenses                        $5           $15
 | |
| ```
 | |
| 
 | |
| Now it's clear that your `expenses` balance - ie, the total amount spent - has increased to $15.
 | |
| 
 | |
| Your `assets` balance should have dropped accordingly. Check it:
 | |
| 
 | |
| ```shell
 | |
| $ hledger register assets
 | |
| 2015/05/25 trip to the super..  assets                        $-10          $-10
 | |
| 2015/05/26 forgot the bread     assets                         $-5          $-15
 | |
| ```
 | |
| 
 | |
| ### Query expressions
 | |
| 
 | |
| The account name argument above is an example of a
 | |
| [query expression](manual.html#queries), a search pattern which restricts a report to a subset of the data.
 | |
| In this way  you can make very precise queries.
 | |
| 
 | |
| Note that it is a case-insensitive regular expression which matches anywhere inside the account name.
 | |
| So "`e`" would match both `expenses` and `assets`.
 | |
| 
 | |
| And if you had an account named `other assets`, "`assets`" would also match that, so to match only the `assets`
 | |
| account you'd need a more precise pattern like "`^assets$`".
 | |
| (In a regular expression `^` means "match at the beginning" and `$` means "match at the end".)
 | |
| If this doesn't make sense, read a little about [regular expressions](manual.html#regular-expressions).
 | |
| 
 | |
| Multiple query arguments are ANDed and ORed together in a fixed way - follow the link for details.
 | |
| Basically queries on the same field are ORed, and queries on different fields are ANDed.
 | |
| 
 | |
| Run the following examples and make sure they make sense, consulting the manual as needed.
 | |
| 
 | |
| Show only transactions whose description ends with "bread":
 | |
| ```shell
 | |
| $ hledger print desc:bread$
 | |
| 2015/05/26 forgot the bread
 | |
|     expenses            $5
 | |
|     assets             $-5
 | |
| 
 | |
| ```
 | |
| 
 | |
| <!-- Note how the account-matching pattern `es$` needs to be quoted here, -->
 | |
| <!-- because it contains the regular expression metacharacter `$` which would otherwise be interpreted by the unix shell. -->
 | |
| 
 | |
| Show only postings on or after a certain date to an account whose name contains "exp":
 | |
| ```shell
 | |
| $ hledger register date:2015/5/26- exp
 | |
| 2015/05/26 forgot the bread     expenses                        $5            $5
 | |
| ```
 | |
| 
 | |
| ### Show accounts and their balances with "hledger balance"
 | |
| 
 | |
| The third of hledger's three core reporting commands is [balance](manual.html#balance).
 | |
| Use it to list all the accounts posted to, and their ending balance.
 | |
| You should see account balances agreeing with the final running total in the register reports above:
 | |
| 
 | |
| ```{.shell .nobold}
 | |
| $ hledger balance
 | |
|                 $-15  assets
 | |
|                  $15  expenses
 | |
| --------------------
 | |
|                    0
 | |
| ```
 | |
| 
 | |
| The overall total of these balances is also shown. As with other reports, you can use a query expression to select a subset of the data to report on.
 | |
| Eg:
 | |
| 
 | |
| ```shell
 | |
| $ hledger balance assets
 | |
|                 $-15  assets
 | |
| --------------------
 | |
|                 $-15
 | |
| ```
 | |
| 
 | |
| ### balance shows the sum of matched posting amounts
 | |
| 
 | |
| Here's a balance report based only on the postings dated 2013/2/13:
 | |
| ```shell
 | |
| $ hledger balance date:2015/5/26
 | |
|                  $-5  assets
 | |
|                   $5  expenses
 | |
| --------------------
 | |
|                    0
 | |
| ```
 | |
| 
 | |
| As you can see from this, `balance` does not always report the current
 | |
| real-world account balance, rather it shows the sum of the postings
 | |
| you have selected.
 | |
| If you're not sure what those are, run a `register` report with the same arguments to see them:
 | |
| 
 | |
| ```shell
 | |
| $ hledger register date:2015/5/26
 | |
| 2015/05/26 forgot the bread     expenses                        $5            $5
 | |
|                                 assets                         $-5             0
 | |
| ```
 | |
| 
 | |
| ### Review
 | |
| 
 | |
| You have learned:
 | |
| 
 | |
| - a simple plain text notation for recording financial transactions, used by hledger, Ledger and others
 | |
| 
 | |
| - what is the journal file, where it is, and how to get statistics on it with `hledger stats`
 | |
| 
 | |
| - how to record new transactions using `hledger add`
 | |
| 
 | |
| - how to record transactions by editing the journal file
 | |
| 
 | |
| - what the journal entry for a purchase looks like
 | |
| 
 | |
| - how to detect some common errors, by eye or with hledger
 | |
| 
 | |
| - how hledger selects data to report on, and how to select by account, description, or date
 | |
| 
 | |
| - how to list transactions with `hledger print`
 | |
| 
 | |
| - how to list postings and see an account's balance over time with `hledger register`
 | |
| 
 | |
| - how to list accounts and their current balance, or the sum of their postings in some period, with `hledger balance`
 | |
| 
 | |
| <!--
 | |
| 
 | |
| ### Test yourself
 | |
| 
 | |
| Start a journal tracking the cash in your pocket or wallet. Every day for one week,
 | |
| 
 | |
| 1. record each and every outflow and inflow of this cash, to the penny
 | |
| 2. run reports showing the transactions, per-account running balance, and current account balances
 | |
| 
 | |
| After seven days, do an audit:
 | |
| 
 | |
| - Count the cash. Does it exactly match the final balance in your hledger reports ?
 | |
|   If not, try to identify how and when things went wrong.
 | |
|   If you're confident you found the mistake, have corrected the journal and it now agrees with reality, that counts as a pass.
 | |
| 
 | |
| - Can you easily recall and understand the purpose of each transaction, with the help of your descriptions ?
 | |
| 
 | |
| You don't need to categorise, you don't need to track anything other than the amount of cash in your pocket, and it's only for seven days.
 | |
| Can you complete this challenge ? Keep at it! :)
 | |
| I couldn't do this when I started using hledger, but I can now. Build that muscle.
 | |
| 
 | |
| -->
 | |
| 
 | |
| 
 | |
| ## USEFUL ACCOUNTING CONCEPTS
 | |
| 
 | |
| ### Assets, Liabilities and Equity
 | |
| 
 | |
| Accounting describes the status of a business, person or other entity at any point in time in terms of three amounts:
 | |
| 
 | |
| - **Assets**      - Things owned
 | |
| - **Liabilities** - Things owed
 | |
| - **Equity**      - The amount invested by owners/shareholders
 | |
| 
 | |
| The foundation of double-entry accounting is the [accounting equation](http://en.wikipedia.org/wiki/accounting_equation), which says
 | |
| Equity is always equal to Assets minus Liabilities (or, Net Assets).
 | |
| 
 | |
| This is also written as: Assets = Liabilities + Equity.
 | |
| Another way to say it: what the entity owns is funded either by debt or by the capital provided by its owners.
 | |
| 
 | |
| These three are called the Balance Sheet accounts. Their balances summarise the overall financial status at some point in time.
 | |
| 
 | |
| 
 | |
| ### Revenue and Expenses
 | |
| 
 | |
| Two more amounts are used to describe changes in the above during a given period:
 | |
| 
 | |
| - **Revenue**     - Money flowing in
 | |
| - **Expenses**    - Money flowing out
 | |
| 
 | |
| You may be accustomed to using the word Income instead Revenue.
 | |
| That's fine, just remember that Income is sometimes used to mean Net
 | |
| Income, which is Revenue - Expenses.
 | |
| 
 | |
| These two are called the Income Statement accounts.  The balances they
 | |
| accumulate during some period of time indicate the inflows and
 | |
| outflows during that period (which will affect the Assets and
 | |
| Liabilities balances).
 | |
| 
 | |
| 
 | |
| ### Chart of Accounts
 | |
| 
 | |
| Five numbers do not give a lot of detail. If you want to know what
 | |
| portion of expenses went to buy food, you could add up just the
 | |
| transactions with (say) "supermarket" in their description. You know how to do this with hledger:
 | |
| 
 | |
| ```shell
 | |
| $ hledger register desc:supermarket expenses
 | |
| 2015/05/25 trip to the super..  expenses                       $10           $10
 | |
| ```
 | |
| 
 | |
| But descriptions are irregular, and as you can see we missed the $5 purchase on the following day.
 | |
| 
 | |
| Instead, the major "top-level" accounts above are subdivided into subaccounts which can be used
 | |
| in transactions, thereby categorising them in a more structured way.
 | |
| If needed, these subaccounts can be subdivided further.
 | |
| This tree of accounts is called the Chart of Accounts. Here's a simple example
 | |
| where `assets`, `revenue` and `expenses` each have a few subaccounts:
 | |
| 
 | |
| ```
 | |
| assets
 | |
|   checking
 | |
|   cash
 | |
| liabilities
 | |
| equity
 | |
| revenue
 | |
|   business income
 | |
|   gifts received
 | |
| expenses
 | |
|   food
 | |
|   rent
 | |
|   supplies
 | |
| ```
 | |
| 
 | |
| In some organisations and accounting systems (eg, QuickBooks), the
 | |
| tree structure is de-emphasised, so the above is represented more
 | |
| like:
 | |
| 
 | |
| ```
 | |
|  Account name      Account type
 | |
|  ------------------------------- 
 | |
|  checking          ASSET
 | |
|  cash              ASSET
 | |
|  business income   REVENUE
 | |
|  gifts received    REVENUE
 | |
|  food              EXPENSE
 | |
|  rent              EXPENSE
 | |
|  supplies          EXPENSE
 | |
| ```
 | |
| 
 | |
| In others, the tree structure is encoded as decimal account numbers, something like this:
 | |
| 
 | |
| ```
 | |
| 1000 assets
 | |
| 1100   checking
 | |
| 1200   cash
 | |
| 2000 liabilities
 | |
| 3000 equity
 | |
| 4000 revenue
 | |
| 4100   business income
 | |
| 4200   gifts received
 | |
| 5000 expenses
 | |
| 5100   food
 | |
| 5200   rent
 | |
| 5300   supplies
 | |
| ```
 | |
| 
 | |
| ### Subaccounts in hledger
 | |
| 
 | |
| With hledger, tree structure is implied by writing account names like `ACCOUNT:SUBACCOUNT`.
 | |
| Try it: edit your journal file and change the account names like so:
 | |
| 
 | |
| ```shell
 | |
| $ cat ~/.hledger.journal
 | |
| 
 | |
| 2015/05/25 trip to the supermarket
 | |
|     expenses:supplies           $10
 | |
|     assets:checking            $-10
 | |
| 
 | |
| 2015/05/26 forgot the bread
 | |
|     expenses:food            $5
 | |
|     assets:cash
 | |
| ```
 | |
| 
 | |
| hledger will infer the chart of accounts from these names.
 | |
| The `accounts` command will list all accounts posted to:
 | |
| ```shell
 | |
| $ hledger accounts
 | |
| assets:cash
 | |
| assets:checking
 | |
| expenses:food
 | |
| expenses:supplies
 | |
| ```
 | |
| 
 | |
| and `accounts --tree` will show the tree structure, indenting subaccounts below their parents (and eliding the common part of their names):
 | |
| ```shell
 | |
| assets
 | |
|   cash
 | |
|   checking
 | |
| expenses
 | |
|   food
 | |
|   supplies
 | |
| ```
 | |
| 
 | |
| Conversely, the `balance` command shows the tree structure by default:
 | |
| ```shell
 | |
| $ hledger balance
 | |
|                 $-15  assets
 | |
|                  $-5    cash
 | |
|                 $-10    checking
 | |
|                  $15  expenses
 | |
|                   $5    food
 | |
|                  $10    supplies
 | |
| --------------------
 | |
|                    0
 | |
| ```
 | |
| 
 | |
| As you can see, the balance reported for parent accounts includes the
 | |
| balances of any subaccounts (it would also include any postings to the
 | |
| parent account itself.)
 | |
| 
 | |
| To see full account names in a flat list, use `--flat`:
 | |
| 
 | |
| ```shell
 | |
| $ hledger balance --flat
 | |
|                  $-5  assets:cash
 | |
|                 $-10  assets:checking
 | |
|                   $5  expenses:food
 | |
|                  $10  expenses:supplies
 | |
| --------------------
 | |
|                    0
 | |
| ```
 | |
| 
 | |
| hledger accepts whatever account names you choose, so you can use as much or as little account hierarchy as you need.
 | |
| Most users have at least two levels of accounts.
 | |
| You can limit the amount of detail in a balance report by hiding accounts below a certain depth:
 | |
| 
 | |
| ```shell
 | |
| $ hledger balance --depth 1
 | |
|                 $-15  assets
 | |
|                  $15  expenses
 | |
| --------------------
 | |
|                    0
 | |
| ```
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| <!--
 | |
| 
 | |
| ### Transactions
 | |
| 
 | |
| A transaction is a movement of money from some account(s) to some
 | |
| other account(s).  There are many common types of transaction.  A
 | |
| purchase is where money moves from an asset account to an expense
 | |
| account.  Eg, buying food.
 | |
| 
 | |
| -->
 |