hledger/site/step-by-step.md

696 lines
22 KiB
Markdown
Raw Normal View History

<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
2014-11-11 18:13:36 +03:00
### 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:
2015-05-26 03:43:50 +03:00
```shell
$ hledger --version
2015-07-14 07:56:39 +03:00
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:
2015-05-26 03:43:50 +03:00
```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.
2015-05-26 03:43:50 +03:00
```shell
$ hledger add
2015-05-26 03:43:50 +03:00
Creating hledger journal file "/home/YOU/.hledger.journal".
Adding transactions to journal file /home/YOU/.hledger.journal
2015-05-26 03:43:50 +03:00
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.
2015-05-26 03:43:50 +03:00
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.
2015-05-26 03:43:50 +03:00
```{.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.
2015-05-26 03:43:50 +03:00
```{.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.
2015-05-26 03:43:50 +03:00
```{.shell .continued}
Amount 1: $10
```
The amount being "moved" to `expenses`. In this case 10 US dollars.
2015-05-26 03:43:50 +03:00
```{.shell .continued}
Account 2: assets
```
Next, specify which account the money comes from. Just say `assets`.
2015-05-26 03:43:50 +03:00
```{.shell .continued}
Amount 2 ? [$-10.0]:
```
2016-02-21 04:38:11 +03:00
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.
2016-02-21 03:59:42 +03:00
(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.
2015-05-26 03:43:50 +03:00
```{.shell .continued}
Account 3 (or . to finish this transaction): .
```
Type `.` (period) and press enter.
2015-05-26 03:43:50 +03:00
```{.shell .continued}
2015/05/25 trip to the supermarket
expenses $10
assets $-10.0
2015-05-26 03:43:50 +03:00
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.
2015-05-26 03:43:50 +03:00
```{.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:
2015-05-26 03:43:50 +03:00
```shell
$ hledger stats
Main journal file : /home/YOU/.hledger.journal
Included journal files :
2015-05-26 03:43:50 +03:00
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:
2015-05-26 03:43:50 +03:00
```shell
$ hledger print
2015-05-26 03:43:50 +03:00
2015/05/25 trip to the supermarket
expenses $10
assets $-10
2015-05-26 03:43:50 +03:00
```
### Examine your journal file
List and print the journal file (on Windows, use `dir` and `type` and the file path from `hledger stats`):
2015-05-26 03:43:50 +03:00
```shell
$ ls -l ~/.hledger.journal
2015-05-26 03:43:50 +03:00
-rw-r--r-- 1 YOU YOU 114 May 25 16:55 /home/YOU/.hledger.journal
$ cat ~/.hledger.journal
2015-05-26 03:43:50 +03:00
; journal created 2015-05-25 by hledger
2015-05-26 03:43:50 +03:00
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:
2015-05-26 03:43:50 +03:00
```shell
$ emacs ~/.hledger.journal
```
Remove the expenses amount and save the file. It now looks like this:
2015-05-26 03:43:50 +03:00
```journal
2016-02-21 03:59:42 +03:00
2015/05/25 trip to the supermarket
expenses
assets
```
Running `print` again, you should see:
2015-05-26 03:43:50 +03:00
```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-26 03:43:50 +03:00
2015/05/25 trip to the supermarket
expenses
assets
2015-05-26 03:43:50 +03:00
```
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:
2015-05-26 03:43:50 +03:00
```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:
2015-05-26 03:43:50 +03:00
```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:
2015-05-26 03:43:50 +03:00
```shell
$ hledger print
hledger: could not balance this transaction (real postings are off by $20)
2015-05-26 03:43:50 +03:00
2015/05/25 trip to the supermarket
expenses $10
assets $10
2015-05-26 03:43:50 +03:00
```
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
2015-05-26 03:43:50 +03:00
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:
2015-05-26 03:43:50 +03:00
```journal
2015/05/25 trip to the supermarket
expenses $10
2015-05-26 03:43:50 +03:00
assets $-10
2015-05-26 03:43:50 +03:00
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:
2015-05-26 03:43:50 +03:00
```shell
$ hledger print
2015-05-26 03:43:50 +03:00
2015/05/25 trip to the supermarket
expenses $10
assets $-10
2015-05-26 03:43:50 +03:00
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:
2015-05-26 03:43:50 +03:00
```shell
$ hledger register
2015-05-26 03:43:50 +03:00
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.
2015-05-26 03:43:50 +03:00
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:
2015-05-26 03:43:50 +03:00
```shell
$ hledger register expenses
2015-05-26 03:43:50 +03:00
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:
2015-05-26 03:43:50 +03:00
```shell
$ hledger register assets
2015-05-26 03:43:50 +03:00
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$`".
2015-05-26 03:43:50 +03:00
(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.
2015-05-26 03:43:50 +03:00
Show only transactions whose description ends with "bread":
```shell
$ hledger print desc:bread$
2015/05/26 forgot the bread
expenses $5
assets $-5
```
2015-05-26 03:43:50 +03:00
<!-- 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:
2015-05-26 03:43:50 +03:00
```{.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:
2015-05-26 03:43:50 +03:00
```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:
2015-05-26 03:43:50 +03:00
```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:
2015-05-26 03:43:50 +03:00
```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
2016-02-21 03:59:42 +03:00
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
2016-02-21 03:59:42 +03:00
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:
2015-05-26 03:43:50 +03:00
```shell
$ hledger register desc:supermarket expenses
2015-05-26 03:43:50 +03:00
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:
2015-05-26 03:43:50 +03:00
```shell
$ cat ~/.hledger.journal
2015-05-26 03:43:50 +03:00
2015/05/25 trip to the supermarket
expenses:supplies $10
assets:checking $-10
2015-05-26 03:43:50 +03:00
2015/05/26 forgot the bread
expenses:food $5
assets:cash
```
2015-05-26 03:43:50 +03:00
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
```
2015-05-26 03:43:50 +03:00
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
```
2015-05-26 03:43:50 +03:00
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
```
2015-05-26 03:43:50 +03:00
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.)
2015-05-26 03:43:50 +03:00
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.
2015-05-26 03:43:50 +03:00
You can limit the amount of detail in a balance report by hiding accounts below a certain depth:
2015-05-26 03:43:50 +03:00
```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.
-->