mirror of
https://github.com/simonmichael/hledger.git
synced 2024-12-28 21:02:04 +03:00
;doc: hledger: merge examples, options, commands files
[ci skip]
This commit is contained in:
parent
d60b053e11
commit
078e9c8e9c
File diff suppressed because it is too large
Load Diff
@ -1,190 +0,0 @@
|
||||
# COMMANDS
|
||||
|
||||
hledger provides a number of subcommands; `hledger` with no arguments
|
||||
shows a list.
|
||||
|
||||
If you install additional `hledger-*` packages, or if you put programs
|
||||
or scripts named `hledger-NAME` in your PATH, these will also be
|
||||
listed as subcommands.
|
||||
|
||||
Run a subcommand by writing its name as first argument (eg `hledger
|
||||
incomestatement`). You can also write one of the standard short aliases
|
||||
displayed in parentheses in the command list (`hledger b`), or any
|
||||
any unambiguous prefix of a command name (`hledger inc`).
|
||||
|
||||
Here are all the builtin commands in alphabetical order.
|
||||
See also `hledger` for a more organised command list,
|
||||
and `hledger CMD -h` for detailed command help.
|
||||
|
||||
## accounts
|
||||
|
||||
_include_(Hledger/Cli/Commands/Accounts.md)
|
||||
|
||||
## activity
|
||||
|
||||
_include_(Hledger/Cli/Commands/Activity.md)
|
||||
|
||||
## add
|
||||
|
||||
_include_(Hledger/Cli/Commands/Add.md)
|
||||
|
||||
## balance
|
||||
|
||||
_include_({{Hledger/Cli/Commands/Balance.md}})
|
||||
|
||||
## balancesheet
|
||||
|
||||
_include_({{Hledger/Cli/Commands/Balancesheet.md}})
|
||||
|
||||
## balancesheetequity
|
||||
|
||||
_include_({{Hledger/Cli/Commands/Balancesheetequity.md}})
|
||||
|
||||
## cashflow
|
||||
|
||||
_include_({{Hledger/Cli/Commands/Cashflow.md}})
|
||||
|
||||
## check-dates
|
||||
|
||||
_include_({{Hledger/Cli/Commands/Checkdates.md}})
|
||||
|
||||
## check-dupes
|
||||
|
||||
_include_({{Hledger/Cli/Commands/Checkdupes.md}})
|
||||
|
||||
## close
|
||||
|
||||
_include_({{Hledger/Cli/Commands/Close.md}})
|
||||
|
||||
## commodities
|
||||
|
||||
_include_({{Hledger/Cli/Commands/Commodities.md}})
|
||||
|
||||
## descriptions
|
||||
|
||||
_include_({{Hledger/Cli/Commands/Descriptions.md}})
|
||||
|
||||
## diff
|
||||
|
||||
_include_({{Hledger/Cli/Commands/Diff.md}})
|
||||
|
||||
## files
|
||||
|
||||
_include_({{Hledger/Cli/Commands/Files.md}})
|
||||
|
||||
## help
|
||||
|
||||
_include_({{Hledger/Cli/Commands/Help.md}})
|
||||
|
||||
## import
|
||||
|
||||
_include_({{Hledger/Cli/Commands/Import.md}})
|
||||
|
||||
## incomestatement
|
||||
|
||||
_include_({{Hledger/Cli/Commands/Incomestatement.md}})
|
||||
|
||||
## notes
|
||||
|
||||
_include_({{Hledger/Cli/Commands/Notes.md}})
|
||||
|
||||
## payees
|
||||
|
||||
_include_({{Hledger/Cli/Commands/Payees.md}})
|
||||
|
||||
## prices
|
||||
|
||||
_include_({{Hledger/Cli/Commands/Prices.md}})
|
||||
|
||||
## print
|
||||
|
||||
_include_({{Hledger/Cli/Commands/Print.md}})
|
||||
|
||||
## print-unique
|
||||
|
||||
_include_({{Hledger/Cli/Commands/Printunique.md}})
|
||||
|
||||
## register
|
||||
|
||||
_include_({{Hledger/Cli/Commands/Register.md}})
|
||||
|
||||
## register-match
|
||||
|
||||
_include_({{Hledger/Cli/Commands/Registermatch.md}})
|
||||
|
||||
## rewrite
|
||||
|
||||
_include_({{Hledger/Cli/Commands/Rewrite.md}})
|
||||
|
||||
## roi
|
||||
|
||||
_include_({{Hledger/Cli/Commands/Roi.md}})
|
||||
|
||||
## stats
|
||||
|
||||
_include_({{Hledger/Cli/Commands/Stats.md}})
|
||||
|
||||
## tags
|
||||
|
||||
_include_({{Hledger/Cli/Commands/Tags.md}})
|
||||
|
||||
## test
|
||||
|
||||
_include_({{Hledger/Cli/Commands/Test.md}})
|
||||
|
||||
|
||||
## Add-on Commands
|
||||
|
||||
hledger also searches for external add-on commands, and will include these in the commands list.
|
||||
These are programs or scripts in your PATH whose name starts with `hledger-`
|
||||
and ends with a recognised file extension
|
||||
(currently: no extension, `bat`,`com`,`exe`, `hs`,`lhs`,`pl`,`py`,`rb`,`rkt`,`sh`).
|
||||
|
||||
Add-ons can be invoked like any hledger command, but there are a few things to be aware of.
|
||||
Eg if the `hledger-web` add-on is installed,
|
||||
|
||||
- `hledger -h web` shows hledger's help, while `hledger web -h` shows hledger-web's help.
|
||||
|
||||
- Flags specific to the add-on must have a preceding `--` to hide them from hledger.
|
||||
So `hledger web --serve --port 9000` will be rejected; you must use `hledger web -- --serve --port 9000`.
|
||||
|
||||
- You can always run add-ons directly if preferred: `hledger-web --serve --port 9000`.
|
||||
|
||||
Add-ons are a relatively easy way to add local features or experiment with new ideas.
|
||||
They can be written in any language, but haskell scripts have a big advantage:
|
||||
they can use the same hledger (and haskell) library functions that built-in commands do,
|
||||
for command-line options, journal parsing, reporting, etc.
|
||||
|
||||
Two important add-ons are the hledger-ui and hledger-web user interfaces.
|
||||
These are maintained and released along with hledger:
|
||||
|
||||
### ui
|
||||
[hledger-ui](hledger-ui.html) provides an efficient terminal interface.
|
||||
|
||||
### web
|
||||
[hledger-web](hledger-web.html) provides a simple web interface.
|
||||
|
||||
Third party add-ons, maintained separately from hledger, include:
|
||||
|
||||
### iadd
|
||||
|
||||
[hledger-iadd](http://hackage.haskell.org/package/hledger-iadd)
|
||||
is a more interactive, terminal UI replacement for the [add command](hledger.html#add).
|
||||
|
||||
### interest
|
||||
|
||||
[hledger-interest](http://hackage.haskell.org/package/hledger-interest)
|
||||
generates interest transactions for an account according to various schemes.
|
||||
|
||||
<!-- ### autosync -->
|
||||
|
||||
<!-- [hledger-autosync](https://github.com/simonmichael/hledger/blob/master/bin/hledger-autosync) -->
|
||||
<!-- is a symbolic link for easily running -->
|
||||
<!-- [ledger-autosync](https://pypi.python.org/pypi/ledger-autosync) if you make a symbolic -->
|
||||
<!-- ledger-autosync does deduplicating conversion of OFX data and some CSV formats, -->
|
||||
<!-- and can also download the data -->
|
||||
<!-- [if your bank offers OFX Direct Connect](http://wiki.gnucash.org/wiki/OFX_Direct_Connect_Bank_Settings). -->
|
||||
|
||||
A few more experimental or old add-ons can be found in hledger's bin/
|
||||
directory. These are typically prototypes and not guaranteed to work.
|
||||
|
@ -1,377 +0,0 @@
|
||||
# COMMON TASKS
|
||||
|
||||
Here are some quick examples of how to do some basic tasks with hledger.
|
||||
For more details, see the reference section below, the hledger_journal(5) manual,
|
||||
or the more extensive docs at <https://hledger.org>.
|
||||
|
||||
## Getting help
|
||||
|
||||
```shell
|
||||
$ hledger # show available commands
|
||||
$ hledger --help # show common options
|
||||
$ hledger CMD --help # show common and command options, and command help
|
||||
$ hledger help # show available manuals/topics
|
||||
$ hledger help hledger # show hledger manual as info/man/text (auto-chosen)
|
||||
$ hledger help journal --man # show the journal manual as a man page
|
||||
$ hledger help --help # show more detailed help for the help command
|
||||
```
|
||||
|
||||
Find more docs, chat, mail list, reddit, issue tracker:
|
||||
<https://hledger.org#help-feedback>
|
||||
|
||||
## Constructing command lines
|
||||
|
||||
hledger has an extensive and powerful command line interface. We
|
||||
strive to keep it simple and ergonomic, but you may run into one of
|
||||
the confusing real world details described in OPTIONS, below.
|
||||
If that happens, here are some tips that may help:
|
||||
|
||||
- command-specific options must go after the command (it's fine to put all options there) (`hledger CMD OPTS ARGS`)
|
||||
- running add-on executables directly simplifies command line parsing (`hledger-ui OPTS ARGS`)
|
||||
- enclose "problematic" args in single quotes
|
||||
- if needed, also add a backslash to hide regular expression metacharacters from the shell
|
||||
- to see how a misbehaving command is being parsed, add `--debug=2`.
|
||||
|
||||
## Starting a journal file
|
||||
|
||||
hledger looks for your accounting data in a journal file, `$HOME/.hledger.journal` by default:
|
||||
```shell
|
||||
$ hledger stats
|
||||
The hledger journal file "/Users/simon/.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.
|
||||
```
|
||||
|
||||
You can override this by setting the `LEDGER_FILE` environment variable.
|
||||
It's a good practice to keep this important file under version control,
|
||||
and to start a new file each year. So you could do something like this:
|
||||
```shell
|
||||
$ mkdir ~/finance
|
||||
$ cd ~/finance
|
||||
$ git init
|
||||
Initialized empty Git repository in /Users/simon/finance/.git/
|
||||
$ touch 2020.journal
|
||||
$ echo "export LEDGER_FILE=$HOME/finance/2020.journal" >> ~/.bashrc
|
||||
$ source ~/.bashrc
|
||||
$ hledger stats
|
||||
Main file : /Users/simon/finance/2020.journal
|
||||
Included files :
|
||||
Transactions span : to (0 days)
|
||||
Last transaction : none
|
||||
Transactions : 0 (0.0 per day)
|
||||
Transactions last 30 days: 0 (0.0 per day)
|
||||
Transactions last 7 days : 0 (0.0 per day)
|
||||
Payees/descriptions : 0
|
||||
Accounts : 0 (depth 0)
|
||||
Commodities : 0 ()
|
||||
Market prices : 0 ()
|
||||
```
|
||||
|
||||
## Setting opening balances
|
||||
|
||||
Pick a starting date for which you can look up the balances of some
|
||||
real-world assets (bank accounts, wallet..) and liabilities (credit cards..).
|
||||
|
||||
To avoid a lot of data entry, you may want to start with just one or
|
||||
two accounts, like your checking account or cash wallet; and pick a
|
||||
recent starting date, like today or the start of the week. You can
|
||||
always come back later and add more accounts and older transactions,
|
||||
eg going back to january 1st.
|
||||
|
||||
Add an opening balances transaction to the journal, declaring the
|
||||
balances on this date. Here are two ways to do it:
|
||||
|
||||
- The first way: open the journal in any text editor and save an entry like this:
|
||||
```journal
|
||||
2020-01-01 * opening balances
|
||||
assets:bank:checking $1000 = $1000
|
||||
assets:bank:savings $2000 = $2000
|
||||
assets:cash $100 = $100
|
||||
liabilities:creditcard $-50 = $-$50
|
||||
equity:opening/closing balances
|
||||
```
|
||||
These are start-of-day balances, ie whatever was in the account at the
|
||||
end of the previous day.
|
||||
|
||||
The * after the date is an optional status flag.
|
||||
Here it means "cleared & confirmed".
|
||||
|
||||
The currency symbols are optional, but usually a good idea as you'll
|
||||
be dealing with multiple currencies sooner or later.
|
||||
|
||||
The = amounts are optional balance assertions, providing extra error checking.
|
||||
|
||||
- The second way: run `hledger add` and follow the prompts to record a similar transaction:
|
||||
```shell
|
||||
$ hledger add
|
||||
Adding transactions to journal file /Users/simon/finance/2020.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 go one step backward.
|
||||
To end a transaction, enter . when prompted.
|
||||
To quit, enter . at a date prompt or press control-d or control-c.
|
||||
Date [2020-02-07]: 2020-01-01
|
||||
Description: * opening balances
|
||||
Account 1: assets:bank:checking
|
||||
Amount 1: $1000
|
||||
Account 2: assets:bank:savings
|
||||
Amount 2 [$-1000]: $2000
|
||||
Account 3: assets:cash
|
||||
Amount 3 [$-3000]: $100
|
||||
Account 4: liabilities:creditcard
|
||||
Amount 4 [$-3100]: $-50
|
||||
Account 5: equity:opening/closing balances
|
||||
Amount 5 [$-3050]:
|
||||
Account 6 (or . or enter to finish this transaction): .
|
||||
2020-01-01 * opening balances
|
||||
assets:bank:checking $1000
|
||||
assets:bank:savings $2000
|
||||
assets:cash $100
|
||||
liabilities:creditcard $-50
|
||||
equity:opening/closing balances $-3050
|
||||
|
||||
Save this transaction to the journal ? [y]:
|
||||
Saved.
|
||||
Starting the next transaction (. or ctrl-D/ctrl-C to quit)
|
||||
Date [2020-01-01]: .
|
||||
```
|
||||
|
||||
If you're using version control, this could be a good time to commit the journal. Eg:
|
||||
```shell
|
||||
$ git commit -m 'initial balances' 2020.journal
|
||||
```
|
||||
|
||||
## Recording transactions
|
||||
|
||||
As you spend or receive money, you can record these transactions
|
||||
using one of the methods above (text editor, hledger add)
|
||||
or by using the [hledger-iadd](#iadd) or [hledger-web](#web) add-ons,
|
||||
or by using the [import command](#import) to convert CSV data downloaded from your bank.
|
||||
|
||||
Here are some simple transactions, see the hledger_journal(5) manual
|
||||
and hledger.org for more ideas:
|
||||
|
||||
```journal
|
||||
2020/1/10 * gift received
|
||||
assets:cash $20
|
||||
income:gifts
|
||||
|
||||
2020.1.12 * farmers market
|
||||
expenses:food $13
|
||||
assets:cash
|
||||
|
||||
2020-01-15 paycheck
|
||||
income:salary
|
||||
assets:bank:checking $1000
|
||||
```
|
||||
|
||||
## Reconciling
|
||||
|
||||
Periodically you should reconcile - compare your hledger-reported balances
|
||||
against external sources of truth, like bank statements or your bank's website -
|
||||
to be sure that your ledger accurately represents the real-world balances
|
||||
(and, that the real-world institutions have not made a mistake!).
|
||||
This gets easy and fast with (1) practice and (2) frequency.
|
||||
If you do it daily, it can take 2-10 minutes.
|
||||
If you let it pile up, expect it to take longer as you hunt down errors and discrepancies.
|
||||
|
||||
A typical workflow:
|
||||
|
||||
1. Reconcile cash.
|
||||
Count what's in your wallet.
|
||||
Compare with what hledger reports (`hledger bal cash`).
|
||||
If they are different, try to remember the missing transaction,
|
||||
or look for the error in the already-recorded transactions.
|
||||
A register report can be helpful (`hledger reg cash`).
|
||||
If you can't find the error, add an adjustment transaction.
|
||||
Eg if you have $105 after the above, and can't explain the missing $2, it could be:
|
||||
```journal
|
||||
2020-01-16 * adjust cash
|
||||
assets:cash $-2 = $105
|
||||
expenses:misc
|
||||
```
|
||||
|
||||
2. Reconcile checking.
|
||||
Log in to your bank's website.
|
||||
Compare today's (cleared) balance with hledger's cleared balance (`hledger bal checking -C`).
|
||||
If they are different, track down the error or record the missing transaction(s)
|
||||
or add an adjustment transaction, similar to the above.
|
||||
Unlike the cash case, you can usually compare the transaction history and running balance from your bank
|
||||
with the one reported by `hledger reg checking -C`.
|
||||
This will be easier if you generally record transaction dates
|
||||
quite similar to your bank's clearing dates.
|
||||
|
||||
3. Repeat for other asset/liability accounts.
|
||||
|
||||
Tip: instead of the register command, use hledger-ui to see a
|
||||
live-updating register while you edit the journal:
|
||||
`hledger-ui --watch --register checking -C`
|
||||
|
||||
After reconciling, it could be a good time to mark the reconciled
|
||||
transactions' status as "cleared and confirmed", if you want to track
|
||||
that, by adding the `*` marker.
|
||||
Eg in the paycheck transaction above, insert `*` between `2020-01-15` and `paycheck`
|
||||
|
||||
If you're using version control, this can be another good time to commit:
|
||||
```shell
|
||||
$ git commit -m 'txns' 2020.journal
|
||||
```
|
||||
|
||||
## Reporting
|
||||
|
||||
Here are some basic reports.
|
||||
|
||||
Show all transactions:
|
||||
```shell
|
||||
$ hledger print
|
||||
2020-01-01 * opening balances
|
||||
assets:bank:checking $1000
|
||||
assets:bank:savings $2000
|
||||
assets:cash $100
|
||||
liabilities:creditcard $-50
|
||||
equity:opening/closing balances $-3050
|
||||
|
||||
2020-01-10 * gift received
|
||||
assets:cash $20
|
||||
income:gifts
|
||||
|
||||
2020-01-12 * farmers market
|
||||
expenses:food $13
|
||||
assets:cash
|
||||
|
||||
2020-01-15 * paycheck
|
||||
income:salary
|
||||
assets:bank:checking $1000
|
||||
|
||||
2020-01-16 * adjust cash
|
||||
assets:cash $-2 = $105
|
||||
expenses:misc
|
||||
|
||||
```
|
||||
|
||||
Show account names, and their hierarchy:
|
||||
```shell
|
||||
$ hledger accounts --tree
|
||||
assets
|
||||
bank
|
||||
checking
|
||||
savings
|
||||
cash
|
||||
equity
|
||||
opening/closing balances
|
||||
expenses
|
||||
food
|
||||
misc
|
||||
income
|
||||
gifts
|
||||
salary
|
||||
liabilities
|
||||
creditcard
|
||||
```
|
||||
|
||||
Show all account totals:
|
||||
```shell
|
||||
$ hledger balance
|
||||
$4105 assets
|
||||
$4000 bank
|
||||
$2000 checking
|
||||
$2000 savings
|
||||
$105 cash
|
||||
$-3050 equity:opening/closing balances
|
||||
$15 expenses
|
||||
$13 food
|
||||
$2 misc
|
||||
$-1020 income
|
||||
$-20 gifts
|
||||
$-1000 salary
|
||||
$-50 liabilities:creditcard
|
||||
--------------------
|
||||
0
|
||||
```
|
||||
|
||||
Show only asset and liability balances, as a flat list, limited to depth 2:
|
||||
```shell
|
||||
$ hledger bal assets liabilities --flat -2
|
||||
$4000 assets:bank
|
||||
$105 assets:cash
|
||||
$-50 liabilities:creditcard
|
||||
--------------------
|
||||
$4055
|
||||
```
|
||||
|
||||
Show the same thing without negative numbers, formatted as a simple balance sheet:
|
||||
```shell
|
||||
$ hledger bs --flat -2
|
||||
Balance Sheet 2020-01-16
|
||||
|
||||
|| 2020-01-16
|
||||
========================++============
|
||||
Assets ||
|
||||
------------------------++------------
|
||||
assets:bank || $4000
|
||||
assets:cash || $105
|
||||
------------------------++------------
|
||||
|| $4105
|
||||
========================++============
|
||||
Liabilities ||
|
||||
------------------------++------------
|
||||
liabilities:creditcard || $50
|
||||
------------------------++------------
|
||||
|| $50
|
||||
========================++============
|
||||
Net: || $4055
|
||||
```
|
||||
The final total is your "net worth" on the end date.
|
||||
(Or use `bse` for a full balance sheet with equity.)
|
||||
|
||||
Show income and expense totals, formatted as an income statement:
|
||||
```shell
|
||||
hledger is
|
||||
Income Statement 2020-01-01-2020-01-16
|
||||
|
||||
|| 2020-01-01-2020-01-16
|
||||
===============++=======================
|
||||
Revenues ||
|
||||
---------------++-----------------------
|
||||
income:gifts || $20
|
||||
income:salary || $1000
|
||||
---------------++-----------------------
|
||||
|| $1020
|
||||
===============++=======================
|
||||
Expenses ||
|
||||
---------------++-----------------------
|
||||
expenses:food || $13
|
||||
expenses:misc || $2
|
||||
---------------++-----------------------
|
||||
|| $15
|
||||
===============++=======================
|
||||
Net: || $1005
|
||||
```
|
||||
The final total is your net income during this period.
|
||||
|
||||
Show transactions affecting your wallet, with running total:
|
||||
```shell
|
||||
$ hledger register cash
|
||||
2020-01-01 opening balances assets:cash $100 $100
|
||||
2020-01-10 gift received assets:cash $20 $120
|
||||
2020-01-12 farmers market assets:cash $-13 $107
|
||||
2020-01-16 adjust cash assets:cash $-2 $105
|
||||
```
|
||||
|
||||
Show weekly posting counts as a bar chart:
|
||||
```shell
|
||||
$ hledger activity -W
|
||||
2019-12-30 *****
|
||||
2020-01-06 ****
|
||||
2020-01-13 ****
|
||||
```
|
||||
## Migrating to a new file
|
||||
|
||||
At the end of the year, you may want to continue your journal in a new file,
|
||||
so that old transactions don't slow down or clutter your reports,
|
||||
and to help ensure the integrity of your accounting history.
|
||||
See the [close command](#close).
|
||||
|
||||
If using version control, don't forget to `git add` the new file.
|
@ -1,910 +0,0 @@
|
||||
# OPTIONS
|
||||
|
||||
## General options
|
||||
|
||||
To see general usage help, including general options
|
||||
which are supported by most hledger commands, run `hledger -h`.
|
||||
|
||||
General help options:
|
||||
|
||||
_helpoptions_
|
||||
|
||||
General input options:
|
||||
|
||||
_inputoptions_
|
||||
|
||||
General reporting options:
|
||||
|
||||
_reportingoptions_
|
||||
|
||||
## Command options
|
||||
|
||||
To see options for a particular command, including command-specific options, run: `hledger COMMAND -h`.
|
||||
|
||||
Command-specific options must be written after the command name, eg: `hledger print -x`.
|
||||
|
||||
Additionally, if the command is an [addon](#commands),
|
||||
you may need to put its options after a double-hyphen, eg: `hledger ui -- --watch`.
|
||||
Or, you can run the addon executable directly: `hledger-ui --watch`.
|
||||
|
||||
## Command arguments
|
||||
|
||||
Most hledger commands accept arguments after the command name,
|
||||
which are often a [query](#queries), filtering the data in some way.
|
||||
|
||||
You can save a set of command line options/arguments in a file,
|
||||
and then reuse them by writing `@FILENAME` as a command line argument.
|
||||
Eg: `hledger bal @foo.args`.
|
||||
(To prevent this, eg if you have an argument that begins with a literal `@`,
|
||||
precede it with `--`, eg: `hledger bal -- @ARG`).
|
||||
|
||||
Inside the argument file, each line should contain just one option or argument.
|
||||
Avoid the use of spaces, except inside quotes (or you'll see a confusing error).
|
||||
Between a flag and its argument, use = (or nothing).
|
||||
Bad:
|
||||
|
||||
assets depth:2
|
||||
-X USD
|
||||
|
||||
Good:
|
||||
|
||||
assets
|
||||
depth:2
|
||||
-X=USD
|
||||
|
||||
For special characters (see below), use one less level of quoting than
|
||||
you would at the command prompt.
|
||||
Bad:
|
||||
|
||||
-X"$"
|
||||
|
||||
Good:
|
||||
|
||||
-X$
|
||||
|
||||
See also: [Save frequently used options](save-frequently-used-options.html).
|
||||
|
||||
## Queries
|
||||
|
||||
One of hledger's strengths is being able to quickly report on precise subsets of your data.
|
||||
Most commands accept an optional query expression, written as arguments after the command name,
|
||||
to filter the data by date, account name or other criteria.
|
||||
The syntax is similar to a web search:
|
||||
one or more space-separated search terms,
|
||||
quotes to enclose whitespace,
|
||||
prefixes to match specific fields,
|
||||
a not: prefix to negate the match.
|
||||
|
||||
We do not yet support arbitrary boolean combinations of search terms;
|
||||
instead most commands show transactions/postings/accounts which match (or negatively match):
|
||||
|
||||
- any of the description terms AND
|
||||
- any of the account terms AND
|
||||
- any of the status terms AND
|
||||
- all the other terms.
|
||||
|
||||
The [print](hledger.html#print) command instead shows transactions which:
|
||||
|
||||
- match any of the description terms AND
|
||||
- have any postings matching any of the positive account terms AND
|
||||
- have no postings matching any of the negative account terms AND
|
||||
- match all the other terms.
|
||||
|
||||
The following kinds of search terms can be used.
|
||||
Remember these can also be prefixed with **`not:`**, eg to exclude a particular subaccount.
|
||||
|
||||
**`REGEX`, `acct:REGEX`**
|
||||
: match account names by this regular expression. (With no prefix, `acct:` is assumed.)
|
||||
|
||||
: same as above
|
||||
|
||||
**`amt:N, amt:<N, amt:<=N, amt:>N, amt:>=N`**
|
||||
: match postings with a single-commodity amount that is equal to, less
|
||||
than, or greater than N. (Multi-commodity amounts are not tested, and
|
||||
will always match.) The comparison has two modes: if N is preceded by
|
||||
a + or - sign (or is 0), the two signed numbers are
|
||||
compared. Otherwise, the absolute magnitudes are compared, ignoring
|
||||
sign.
|
||||
|
||||
**`code:REGEX`**
|
||||
: match by transaction code (eg check number)
|
||||
|
||||
**`cur:REGEX`**
|
||||
: match postings or transactions including any amounts whose
|
||||
currency/commodity symbol is fully matched by REGEX. (For a partial
|
||||
match, use `.*REGEX.*`). Note, to match characters which are
|
||||
regex-significant, like the dollar sign (`$`), you need to prepend `\`.
|
||||
And when using the command line you need to add one more level of
|
||||
quoting to hide it from the shell, so eg do: `hledger print cur:'\$'`
|
||||
or `hledger print cur:\\$`.
|
||||
|
||||
**`desc:REGEX`**
|
||||
: match transaction descriptions.
|
||||
|
||||
**`date:PERIODEXPR`**
|
||||
: match dates within the specified period.
|
||||
PERIODEXPR is a [period expression](hledger.html#period-expressions) (with no report interval).
|
||||
Examples: `date:2016`, `date:thismonth`, `date:2000/2/1-2/15`, `date:lastweek-`.
|
||||
If the `--date2` command line flag is present, this matches [secondary dates](journal.html#secondary-dates) instead.
|
||||
|
||||
**`date2:PERIODEXPR`**
|
||||
: match secondary dates within the specified period.
|
||||
|
||||
**`depth:N`**
|
||||
: match (or display, depending on command) accounts at or above this depth
|
||||
|
||||
**`note:REGEX`**
|
||||
: match transaction [notes](journal.html#payee-and-note)
|
||||
(part of description right of `|`, or whole description when there's no `|`)
|
||||
|
||||
**`payee:REGEX`**
|
||||
: match transaction [payee/payer names](journal.html#payee-and-note)
|
||||
(part of description left of `|`, or whole description when there's no `|`)
|
||||
|
||||
**`real:, real:0`**
|
||||
: match real or virtual postings respectively
|
||||
|
||||
**`status:, status:!, status:*`**
|
||||
: match unmarked, pending, or cleared transactions respectively
|
||||
|
||||
**`tag:REGEX[=REGEX]`**
|
||||
: match by tag name, and optionally also by tag value. Note a
|
||||
tag: query is considered to match a transaction if it matches any of
|
||||
the postings. Also remember that postings inherit the tags of their
|
||||
parent transaction.
|
||||
|
||||
The following special search term is used automatically in hledger-web, only:
|
||||
|
||||
**`inacct:ACCTNAME`**
|
||||
: tells hledger-web to show the transaction register for this account.
|
||||
Can be filtered further with `acct` etc.
|
||||
|
||||
Some of these can also be expressed as command-line options (eg `depth:2` is equivalent to `--depth 2`).
|
||||
Generally you can mix options and query arguments, and the resulting query will be their intersection
|
||||
(perhaps excluding the `-p/--period` option).
|
||||
|
||||
## Special characters in arguments and queries
|
||||
|
||||
In shell command lines, option and argument values which contain "problematic" characters,
|
||||
ie spaces,
|
||||
and also characters significant to your shell such as `<`, `>`, `(`, `)`, `|` and `$`,
|
||||
should be escaped by enclosing them in quotes or by writing backslashes before the characters.
|
||||
Eg:
|
||||
|
||||
`hledger register -p 'last year' "accounts receivable (receivable|payable)" amt:\>100`.
|
||||
|
||||
### More escaping
|
||||
|
||||
Characters significant both to the shell and in [regular expressions](#regular-expressions)
|
||||
may need one extra level of escaping. These include parentheses, the pipe symbol and the dollar sign.
|
||||
Eg, to match the dollar symbol, bash users should do:
|
||||
|
||||
`hledger balance cur:'\$'`
|
||||
|
||||
or:
|
||||
|
||||
`hledger balance cur:\\$`
|
||||
|
||||
### Even more escaping
|
||||
|
||||
When hledger runs an addon executable (eg you type `hledger ui`, hledger runs `hledger-ui`),
|
||||
it de-escapes command-line options and arguments once, so you might need to *triple*-escape.
|
||||
Eg in bash, running the ui command and matching the dollar sign, it's:
|
||||
|
||||
`hledger ui cur:'\\$'`
|
||||
|
||||
or:
|
||||
|
||||
`hledger ui cur:\\\\$`
|
||||
|
||||
If you asked why *four* slashes above, this may help:
|
||||
|
||||
----------------- --------
|
||||
unescaped: `$`
|
||||
escaped: `\$`
|
||||
double-escaped: `\\$`
|
||||
triple-escaped: `\\\\$`
|
||||
----------------- --------
|
||||
|
||||
(The number of backslashes in fish shell is left as an exercise for the reader.)
|
||||
|
||||
You can always avoid the extra escaping for addons by running the addon directly:
|
||||
|
||||
`hledger-ui cur:\\$`
|
||||
|
||||
### Less escaping
|
||||
|
||||
Inside an [argument file](#argument-expansion),
|
||||
or in the search field of hledger-ui or hledger-web,
|
||||
or at a GHCI prompt,
|
||||
you need one less level of escaping than at the command line.
|
||||
And backslashes may work better than quotes.
|
||||
Eg:
|
||||
|
||||
`ghci> :main balance cur:\$`
|
||||
|
||||
## Unicode characters
|
||||
|
||||
hledger is expected to handle non-ascii characters correctly:
|
||||
|
||||
- they should be parsed correctly in input files and on the command
|
||||
line, by all hledger tools (add, iadd, hledger-web's search/add/edit
|
||||
forms, etc.)
|
||||
|
||||
- they should be displayed correctly by all hledger tools,
|
||||
and on-screen alignment should be preserved.
|
||||
|
||||
This requires a well-configured environment. Here are some tips:
|
||||
|
||||
- A system locale must be configured, and it must be one that can
|
||||
decode the characters being used.
|
||||
In bash, you can set a locale like this: `export LANG=en_US.UTF-8`.
|
||||
There are some more details in [Troubleshooting](#troubleshooting).
|
||||
This step is essential - without it, hledger will quit on encountering
|
||||
a non-ascii character (as with all GHC-compiled programs).
|
||||
|
||||
- your terminal software (eg Terminal.app, iTerm, CMD.exe, xterm..) must support unicode
|
||||
|
||||
- the terminal must be using a font which includes the required unicode glyphs
|
||||
|
||||
- the terminal should be configured to display wide characters as double width (for report alignment)
|
||||
|
||||
- on Windows, for best results you should run hledger in the same kind of environment in which it was built.
|
||||
Eg hledger built in the standard CMD.EXE environment (like the binaries on our download page)
|
||||
might show display problems when run in a cygwin or msys terminal, and vice versa.
|
||||
(See eg [#961](https://github.com/simonmichael/hledger/issues/961#issuecomment-471229644)).
|
||||
|
||||
|
||||
|
||||
## Input files
|
||||
|
||||
hledger reads transactions from a data file (and the add command writes to it).
|
||||
By default this file is `$HOME/.hledger.journal`
|
||||
(or on Windows, something like `C:/Users/USER/.hledger.journal`).
|
||||
You can override this with the `$LEDGER_FILE` environment variable:
|
||||
```shell
|
||||
$ setenv LEDGER_FILE ~/finance/2016.journal
|
||||
$ hledger stats
|
||||
```
|
||||
or with the `-f/--file` option:
|
||||
```shell
|
||||
$ hledger -f /some/file stats
|
||||
```
|
||||
|
||||
The file name `-` (hyphen) means standard input:
|
||||
```shell
|
||||
$ cat some.journal | hledger -f-
|
||||
```
|
||||
|
||||
Usually the data file is in hledger's journal format,
|
||||
but it can also be one of several other formats, listed below.
|
||||
hledger detects the format automatically based on the file extension,
|
||||
or if that is not recognised, by trying each built-in "reader" in turn:
|
||||
|
||||
| Reader: | Reads: | Used for file extensions: |
|
||||
|-------------|-----------------------------------------------------|-----------------------------------------------------|
|
||||
| `journal` | hledger's journal format, also some Ledger journals | `.journal` `.j` `.hledger` `.ledger` |
|
||||
| `timeclock` | timeclock files (precise time logging) | `.timeclock` |
|
||||
| `timedot` | timedot files (approximate time logging) | `.timedot` |
|
||||
| `csv` | comma-separated values (data interchange) | `.csv` |
|
||||
|
||||
If needed (eg to ensure correct error messages when a file has the "wrong" extension),
|
||||
you can force a specific reader/format by prepending it to the file path with a colon.
|
||||
Examples:
|
||||
```shell
|
||||
$ hledger -f csv:/some/csv-file.dat stats
|
||||
$ echo 'i 2009/13/1 08:00:00' | hledger print -ftimeclock:-
|
||||
```
|
||||
|
||||
You can also specify multiple `-f` options, to read multiple files as one big journal.
|
||||
There are some limitations with this:
|
||||
|
||||
- directives in one file will not affect the other files
|
||||
- [balance assertions](journal.html#balance-assertions) will not see any account balances from previous files
|
||||
|
||||
If you need those, either use the [include directive](journal.html#including-other-files),
|
||||
or concatenate the files, eg: `cat a.journal b.journal | hledger -f- CMD`.
|
||||
|
||||
## Output destination
|
||||
|
||||
Some commands (print, register, stats, the balance commands)
|
||||
can write their output to a destination other than the console.
|
||||
This is controlled by the `-o/--output-file` option.
|
||||
|
||||
```shell
|
||||
$ hledger balance -o - # write to stdout (the default)
|
||||
$ hledger balance -o FILE # write to FILE
|
||||
```
|
||||
|
||||
## Output format
|
||||
|
||||
Some commands can write their output in other formats.
|
||||
Eg print and register can output CSV, and the balance commands can output CSV or HTML.
|
||||
This is controlled by the `-O/--output-format` option, or by specifying a `.csv` or `.html` file extension with `-o/--output-file`.
|
||||
|
||||
```shell
|
||||
$ hledger balance -O csv # write CSV to stdout
|
||||
$ hledger balance -o FILE.csv # write CSV to FILE.csv
|
||||
```
|
||||
|
||||
## Regular expressions
|
||||
|
||||
hledger uses [regular expressions](http://www.regular-expressions.info) in a number of places:
|
||||
|
||||
- [query terms](#queries), on the command line and in the hledger-web search form: `REGEX`, `desc:REGEX`, `cur:REGEX`, `tag:...=REGEX`
|
||||
- [CSV rules](#csv-rules) conditional blocks: `if REGEX ...`
|
||||
- [account alias](#rewriting-accounts) directives and options: `alias /REGEX/ = REPLACEMENT`, `--alias /REGEX/=REPLACEMENT`
|
||||
|
||||
hledger's regular expressions come from the
|
||||
[regex-tdfa](http://hackage.haskell.org/package/regex-tdfa/docs/Text-Regex-TDFA.html)
|
||||
library. In general they:
|
||||
|
||||
- are case insensitive
|
||||
- are infix matching (do not need to match the entire thing being matched)
|
||||
- are [POSIX extended regular expressions](http://www.regular-expressions.info/posix.html#ere)
|
||||
- also support [GNU word boundaries](http://www.regular-expressions.info/wordboundaries.html) (\\<, \\>, \\b, \\B)
|
||||
- and parenthesised [capturing groups](http://www.regular-expressions.info/refcapture.html) and numeric backreferences in replacement strings
|
||||
- do not support [mode modifiers](http://www.regular-expressions.info/modifiers.html) like (?s)
|
||||
|
||||
Some things to note:
|
||||
|
||||
- In the `alias` directive and `--alias` option, regular expressions
|
||||
must be enclosed in forward slashes (`/REGEX/`). Elsewhere in hledger,
|
||||
these are not required.
|
||||
|
||||
- In queries, to match a regular expression metacharacter like `$`
|
||||
as a literal character, prepend a backslash. Eg to search for amounts with the
|
||||
dollar sign in hledger-web, write `cur:\$`.
|
||||
|
||||
- On the command line, some metacharacters like `$` have a special
|
||||
meaning to the shell and so must be escaped at least once more.
|
||||
See [Special characters](#special-characters).
|
||||
|
||||
## Smart dates
|
||||
|
||||
hledger's user interfaces accept a flexible "smart date" syntax (unlike dates in the journal file).
|
||||
Smart dates allow some english words, can be relative to today's date,
|
||||
and can have less-significant date parts omitted (defaulting to 1).
|
||||
|
||||
Examples:
|
||||
|
||||
--------------------------------------------- -----------------------------------------------------------------------------
|
||||
`2004/10/1`, `2004-01-01`, `2004.9.1` exact date, several separators allowed. Year is 4+ digits, month is 1-12, day is 1-31
|
||||
`2004` start of year
|
||||
`2004/10` start of month
|
||||
`10/1` month and day in current year
|
||||
`21` day in current month
|
||||
`october, oct` start of month in current year
|
||||
`yesterday, today, tomorrow` -1, 0, 1 days from today
|
||||
`last/this/next day/week/month/quarter/year` -1, 0, 1 periods from the current period
|
||||
`20181201` 8 digit YYYYMMDD with valid year month and day
|
||||
`201812` 6 digit YYYYMM with valid year and month
|
||||
--------------------------------------------- -----------------------------------------------------------------------------
|
||||
|
||||
Counterexamples - malformed digit sequences might give surprising results:
|
||||
|
||||
--------------------------------------------- -----------------------------------------------------------------------------
|
||||
`201813` 6 digits with an invalid month is parsed as start of 6-digit year
|
||||
`20181301` 8 digits with an invalid month is parsed as start of 8-digit year
|
||||
`20181232` 8 digits with an invalid day gives an error
|
||||
`201801012` 9+ digits beginning with a valid YYYYMMDD gives an error
|
||||
--------------------------------------------- -----------------------------------------------------------------------------
|
||||
|
||||
## Report start & end date
|
||||
|
||||
Most hledger reports show the full span of time represented by the journal data, by default.
|
||||
So, the effective report start and end dates will be the earliest and latest transaction or posting dates found in the journal.
|
||||
|
||||
Often you will want to see a shorter time span, such as the current month.
|
||||
You can specify a start and/or end date using
|
||||
[`-b/--begin`](#reporting-options),
|
||||
[`-e/--end`](#reporting-options),
|
||||
[`-p/--period`](#period-expressions)
|
||||
or a [`date:` query](#queries) (described below).
|
||||
All of these accept the [smart date](#smart-dates) syntax.
|
||||
|
||||
Some notes:
|
||||
|
||||
- As in Ledger, end dates are exclusive, so you need to write the date *after*
|
||||
the last day you want to include.
|
||||
- As noted in [reporting options](#general-options):
|
||||
among start/end dates specified with *options*, the last (i.e. right-most)
|
||||
option takes precedence.
|
||||
- The effective report start and end dates are the intersection of the
|
||||
start/end dates from options and that from `date:` queries.
|
||||
That is, `date:2019-01 date:2019 -p'2000 to 2030'` yields January 2019, the
|
||||
smallest common time span.
|
||||
|
||||
Examples:
|
||||
|
||||
----------------------------------- -------------------------------------------------------------------------------------------
|
||||
`-b 2016/3/17` begin on St. Patrick's day 2016
|
||||
`-e 12/1` end at the start of december 1st of the current year (11/30 will be the last date included)
|
||||
`-b thismonth` all transactions on or after the 1st of the current month
|
||||
`-p thismonth` all transactions in the current month
|
||||
`date:2016/3/17-` the above written as queries instead
|
||||
`date:-12/1`
|
||||
`date:thismonth-`
|
||||
`date:thismonth`
|
||||
---
|
||||
|
||||
## Report intervals
|
||||
|
||||
A report interval can be specified so that commands like
|
||||
[register](#register), [balance](#balance) and [activity](#activity) will divide their
|
||||
reports into multiple subperiods. The basic intervals can be
|
||||
selected with one of `-D/--daily`, `-W/--weekly`, `-M/--monthly`,
|
||||
`-Q/--quarterly`, or `-Y/--yearly`. More complex intervals may be
|
||||
specified with a [period expression](#period-expressions).
|
||||
Report intervals can not be specified with a [query](#queries).
|
||||
|
||||
## Period expressions
|
||||
|
||||
The `-p/--period` option accepts period expressions, a shorthand way
|
||||
of expressing a start date, end date, and/or report interval all at
|
||||
once.
|
||||
|
||||
Here's a basic period expression specifying the first quarter of 2009. Note,
|
||||
hledger always treats start dates as inclusive and end dates as exclusive:
|
||||
|
||||
`-p "from 2009/1/1 to 2009/4/1"`
|
||||
|
||||
Keywords like "from" and "to" are optional, and so are the spaces, as long
|
||||
as you don't run two dates together. "to" can also be written as "-".
|
||||
These are equivalent to the above:
|
||||
|
||||
------------------------------
|
||||
`-p "2009/1/1 2009/4/1"`
|
||||
`-p2009/1/1to2009/4/1`
|
||||
`-p2009/1/1-2009/4/1`
|
||||
------------------------------
|
||||
|
||||
Dates are [smart dates](#smart-dates), so if the current year is 2009, the
|
||||
above can also be written as:
|
||||
|
||||
------------------------------
|
||||
`-p "1/1 4/1"`
|
||||
`-p "january-apr"`
|
||||
`-p "this year to 4/1"`
|
||||
------------------------------
|
||||
|
||||
If you specify only one date, the missing start or end date will be the
|
||||
earliest or latest transaction in your journal:
|
||||
|
||||
---------------------------- ---------------------------------
|
||||
`-p "from 2009/1/1"` everything after january 1, 2009
|
||||
`-p "from 2009/1"` the same
|
||||
`-p "from 2009"` the same
|
||||
`-p "to 2009"` everything before january 1, 2009
|
||||
---------------------------- ---------------------------------
|
||||
|
||||
A single date with no "from" or "to" defines both the start and end date
|
||||
like so:
|
||||
|
||||
--------------------- ------------------------------------------------------
|
||||
`-p "2009"` the year 2009; equivalent to "2009/1/1 to 2010/1/1"
|
||||
`-p "2009/1"` the month of jan; equivalent to "2009/1/1 to 2009/2/1"
|
||||
`-p "2009/1/1"` just that day; equivalent to "2009/1/1 to 2009/1/2"
|
||||
--------------------- ------------------------------------------------------
|
||||
|
||||
The argument of `-p` can also begin with, or be, a [report interval](#report-intervals) expression.
|
||||
The basic report intervals are `daily`, `weekly`, `monthly`, `quarterly`, or `yearly`,
|
||||
which have the same effect as the `-D`,`-W`,`-M`,`-Q`, or `-Y` flags.
|
||||
Between report interval and start/end dates (if any), the word `in` is optional.
|
||||
Examples:
|
||||
|
||||
------------------------------------------
|
||||
`-p "weekly from 2009/1/1 to 2009/4/1"`
|
||||
`-p "monthly in 2008"`
|
||||
`-p "quarterly"`
|
||||
------------------------------------------
|
||||
|
||||
Note that `weekly`, `monthly`, `quarterly` and `yearly` intervals will
|
||||
always start on the first day on week, month, quarter or year
|
||||
accordingly, and will end on the last day of same period, even if
|
||||
associated period expression specifies different explicit start and end date.
|
||||
|
||||
For example:
|
||||
|
||||
------------------------------------------
|
||||
`-p "weekly from 2009/1/1 to 2009/4/1"` -- starts on 2008/12/29, closest preceding Monday
|
||||
`-p "monthly in 2008/11/25"` -- starts on 2018/11/01
|
||||
`-p "quarterly from 2009-05-05 to 2009-06-01"` - starts on 2009/04/01, ends on 2009/06/30, which are first and last days of Q2 2009
|
||||
`-p "yearly from 2009-12-29"` - starts on 2009/01/01, first day of 2009
|
||||
------------------------------------------
|
||||
|
||||
The following more complex report intervals are also supported:
|
||||
`biweekly`,
|
||||
`bimonthly`,
|
||||
`every day|week|month|quarter|year`,
|
||||
`every N days|weeks|months|quarters|years`.
|
||||
|
||||
|
||||
All of these will start on the first day of the requested period and end on the last one, as described above.
|
||||
|
||||
Examples:
|
||||
|
||||
------------------------------------------
|
||||
`-p "bimonthly from 2008"` -- periods will have boundaries on 2008/01/01, 2008/03/01, ...
|
||||
`-p "every 2 weeks"` -- starts on closest preceding Monday
|
||||
`-p "every 5 month from 2009/03"` -- periods will have boundaries on 2009/03/01, 2009/08/01, ...
|
||||
------------------------------------------
|
||||
|
||||
If you want intervals that start on arbitrary day of your choosing and span a week, month or year, you need to use any of the following:
|
||||
|
||||
`every Nth day of week`,
|
||||
`every <weekday>`,
|
||||
`every Nth day [of month]`,
|
||||
`every Nth weekday [of month]`,
|
||||
`every MM/DD [of year]`,
|
||||
`every Nth MMM [of year]`,
|
||||
`every MMM Nth [of year]`.
|
||||
|
||||
Examples:
|
||||
|
||||
------------------------------------------
|
||||
`-p "every 2nd day of week"` -- periods will go from Tue to Tue
|
||||
`-p "every Tue"` -- same
|
||||
`-p "every 15th day"` -- period boundaries will be on 15th of each month
|
||||
`-p "every 2nd Monday"` -- period boundaries will be on second Monday of each month
|
||||
`-p "every 11/05"` -- yearly periods with boundaries on 5th of Nov
|
||||
`-p "every 5th Nov"` -- same
|
||||
`-p "every Nov 5th"` -- same
|
||||
------------------------------------------
|
||||
|
||||
|
||||
Show historical balances at end of 15th each month (N is exclusive end date):
|
||||
|
||||
`hledger balance -H -p "every 16th day"`
|
||||
|
||||
Group postings from start of wednesday to end of next tuesday (N is start date and exclusive end date):
|
||||
|
||||
`hledger register checking -p "every 3rd day of week"`
|
||||
|
||||
## Depth limiting
|
||||
|
||||
With the `--depth N` option (short form: `-N`), commands like [account](#account), [balance](#balance)
|
||||
and [register](#register) will show only the uppermost accounts in the account
|
||||
tree, down to level N. Use this when you want a summary with less detail.
|
||||
This flag has the same effect as a `depth:` query argument
|
||||
(so `-2`, `--depth=2` or `depth:2` are basically equivalent).
|
||||
|
||||
## Pivoting
|
||||
|
||||
Normally hledger sums amounts, and organizes them in a hierarchy, based on account name.
|
||||
The `--pivot FIELD` option causes it to sum and organize hierarchy based on the value of some other field instead.
|
||||
FIELD can be:
|
||||
`code`, `description`, `payee`, `note`,
|
||||
or the full name (case insensitive) of any [tag](journal.html#tags).
|
||||
As with account names, values containing `colon:separated:parts` will be displayed hierarchically in reports.
|
||||
|
||||
`--pivot` is a general option affecting all reports; you can think of hledger transforming
|
||||
the journal before any other processing, replacing every posting's account name with
|
||||
the value of the specified field on that posting, inheriting it from the transaction
|
||||
or using a blank value if it's not present.
|
||||
|
||||
An example:
|
||||
|
||||
```journal
|
||||
2016/02/16 Member Fee Payment
|
||||
assets:bank account 2 EUR
|
||||
income:member fees -2 EUR ; member: John Doe
|
||||
```
|
||||
Normal balance report showing account names:
|
||||
```shell
|
||||
$ hledger balance
|
||||
2 EUR assets:bank account
|
||||
-2 EUR income:member fees
|
||||
--------------------
|
||||
0
|
||||
```
|
||||
Pivoted balance report, using member: tag values instead:
|
||||
```shell
|
||||
$ hledger balance --pivot member
|
||||
2 EUR
|
||||
-2 EUR John Doe
|
||||
--------------------
|
||||
0
|
||||
```
|
||||
One way to show only amounts with a member: value (using a [query](#queries), described below):
|
||||
```shell
|
||||
$ hledger balance --pivot member tag:member=.
|
||||
-2 EUR John Doe
|
||||
--------------------
|
||||
-2 EUR
|
||||
```
|
||||
Another way (the acct: query matches against the pivoted "account name"):
|
||||
```shell
|
||||
$ hledger balance --pivot member acct:.
|
||||
-2 EUR John Doe
|
||||
--------------------
|
||||
-2 EUR
|
||||
```
|
||||
|
||||
## Valuation
|
||||
|
||||
### -B: Cost
|
||||
|
||||
The `-B/--cost` flag converts amounts to their cost (or selling price) at transaction time,
|
||||
if they have a [transaction price](journal.html#transaction-prices) specified.
|
||||
This flag is equivalent to `--value=cost`, described below.
|
||||
|
||||
### -V: Market value
|
||||
|
||||
The `-V/--market` flag converts reported amounts to their market value in a default valuation commodity,
|
||||
using the [market prices](journal.html#market-prices) in effect on a default valuation date.
|
||||
For single period reports, the valuation date is today (equivalent to `--value=now`);
|
||||
for [multiperiod reports](#report-intervals), it is the last day of each subperiod (equivalent to `--value=end`).
|
||||
|
||||
The default valuation commodity is the one referenced in the latest
|
||||
applicable market price dated on or before the valuation date.
|
||||
If most of your P declarations lead to a single home currency, this will usually be what you want.
|
||||
(To specify the commodity, see -X below.)
|
||||
|
||||
Note that in hledger, market prices are always declared explicitly with P directives;
|
||||
we do not infer them from [transaction prices](journal.html#transaction-prices) as Ledger does.
|
||||
|
||||
Here's a quick example of -V:
|
||||
|
||||
```journal
|
||||
; one euro is worth this many dollars from nov 1
|
||||
P 2016/11/01 € $1.10
|
||||
|
||||
; purchase some euros on nov 3
|
||||
2016/11/3
|
||||
assets:euros €100
|
||||
assets:checking
|
||||
|
||||
; the euro is worth fewer dollars by dec 21
|
||||
P 2016/12/21 € $1.03
|
||||
```
|
||||
How many euros do I have ?
|
||||
```shell
|
||||
$ hledger -f t.j bal -N euros
|
||||
€100 assets:euros
|
||||
```
|
||||
What are they worth at end of nov 3 ?
|
||||
```shell
|
||||
$ hledger -f t.j bal -N euros -V -e 2016/11/4
|
||||
$110.00 assets:euros
|
||||
```
|
||||
What are they worth after 2016/12/21 ? (no report end date specified, defaults to today)
|
||||
```shell
|
||||
$ hledger -f t.j bal -N euros -V
|
||||
$103.00 assets:euros
|
||||
```
|
||||
|
||||
### -X: Market value in specified commodity
|
||||
|
||||
The `-X/--exchange` option is like `-V`, except it specifies the target commodity you would like to convert to.
|
||||
It is equivalent to `--value=now,COMM` or `--value=end,COMM`.
|
||||
|
||||
### --value: Flexible valuation
|
||||
|
||||
*(experimental, added 201905)*
|
||||
|
||||
`-B`, `-V` and `-X` are special cases of the more general `--value` option:
|
||||
|
||||
--value=TYPE[,COMM] TYPE is cost, end, now or YYYY-MM-DD.
|
||||
COMM is an optional commodity symbol.
|
||||
Shows amounts converted to:
|
||||
- cost commodity using transaction prices (then optionally to COMM using market prices at period end(s))
|
||||
- default valuation commodity (or COMM) using market prices at period end(s)
|
||||
- default valuation commodity (or COMM) using current market prices
|
||||
- default valuation commodity (or COMM) using market prices at some date
|
||||
|
||||
The TYPE part basically selects either "cost", or "market value" plus a valuation date:
|
||||
|
||||
`--value=cost`
|
||||
: Convert amounts to cost, using the prices recorded in transactions.
|
||||
|
||||
`--value=end`
|
||||
: Convert amounts to their value in a default valuation commodity, using market prices
|
||||
on the last day of the report period (or if unspecified, the journal's end date);
|
||||
or in multiperiod reports, market prices on the last day of each subperiod.
|
||||
|
||||
`--value=now`
|
||||
: Convert amounts to their value in default valuation commodity using current market prices
|
||||
(as of when report is generated).
|
||||
|
||||
`--value=YYYY-MM-DD`
|
||||
: Convert amounts to their value in default valuation commodity using market prices
|
||||
on this date.
|
||||
|
||||
The default valuation commodity is the commodity mentioned in the most
|
||||
recent applicable market price declaration. When all your price
|
||||
declarations lead to a single home currency, this will usually do what
|
||||
you want.
|
||||
|
||||
To select a different valuation commodity, add the optional `,COMM` part:
|
||||
a comma, then the target commodity's symbol. Eg: **`--value=now,EUR`**.
|
||||
hledger will do its best to convert amounts to this commodity, using:
|
||||
|
||||
- declared prices (from source commodity to valuation commodity)
|
||||
- reverse prices (declared prices from valuation to source commodity, inverted)
|
||||
- indirect prices (prices calculated from the shortest chain of declared or reverse prices from source to valuation commodity)
|
||||
|
||||
in that order.
|
||||
|
||||
Here are some examples showing the effect of `--value` as seen with `print`:
|
||||
|
||||
```journal
|
||||
P 2000-01-01 A 1 B
|
||||
P 2000-02-01 A 2 B
|
||||
P 2000-03-01 A 3 B
|
||||
P 2000-04-01 A 4 B
|
||||
|
||||
2000-01-01
|
||||
(a) 1 A @ 5 B
|
||||
|
||||
2000-02-01
|
||||
(a) 1 A @ 6 B
|
||||
|
||||
2000-03-01
|
||||
(a) 1 A @ 7 B
|
||||
```
|
||||
|
||||
Show the cost of each posting:
|
||||
```shell
|
||||
$ hledger -f- print --value=cost
|
||||
2000-01-01
|
||||
(a) 5 B
|
||||
|
||||
2000-02-01
|
||||
(a) 6 B
|
||||
|
||||
2000-03-01
|
||||
(a) 7 B
|
||||
|
||||
```
|
||||
|
||||
Show the value as of the last day of the report period (2000-02-29):
|
||||
```shell
|
||||
$ hledger -f- print --value=end date:2000/01-2000/03
|
||||
2000-01-01
|
||||
(a) 2 B
|
||||
|
||||
2000-02-01
|
||||
(a) 2 B
|
||||
|
||||
```
|
||||
|
||||
With no report period specified, that shows the value as of the last day of the journal (2000-03-01):
|
||||
```shell
|
||||
$ hledger -f- print --value=end
|
||||
2000-01-01
|
||||
(a) 3 B
|
||||
|
||||
2000-02-01
|
||||
(a) 3 B
|
||||
|
||||
2000-03-01
|
||||
(a) 3 B
|
||||
|
||||
```
|
||||
|
||||
Show the current value (the 2000-04-01 price is still in effect today):
|
||||
```shell
|
||||
$ hledger -f- print --value=now
|
||||
2000-01-01
|
||||
(a) 4 B
|
||||
|
||||
2000-02-01
|
||||
(a) 4 B
|
||||
|
||||
2000-03-01
|
||||
(a) 4 B
|
||||
|
||||
```
|
||||
|
||||
Show the value on 2000/01/15:
|
||||
```shell
|
||||
$ hledger -f- print --value=2000-01-15
|
||||
2000-01-01
|
||||
(a) 1 B
|
||||
|
||||
2000-02-01
|
||||
(a) 1 B
|
||||
|
||||
2000-03-01
|
||||
(a) 1 B
|
||||
|
||||
```
|
||||
|
||||
You may need to explicitly set a commodity's display style, when reverse prices are used.
|
||||
Eg this output might be surprising:
|
||||
```
|
||||
P 2000-01-01 A 2B
|
||||
|
||||
2000-01-01
|
||||
a 1B
|
||||
b
|
||||
```
|
||||
```
|
||||
$ hledger print -x -X A
|
||||
2000-01-01
|
||||
a 0
|
||||
b 0
|
||||
|
||||
```
|
||||
Explanation: because there's no amount or commodity directive specifying a display style
|
||||
for A, 0.5A gets the default style, which shows no decimal digits. Because the displayed
|
||||
amount looks like zero, the commodity symbol and minus sign are not displayed either.
|
||||
Adding a commodity directive sets a more useful display style for A:
|
||||
```
|
||||
P 2000-01-01 A 2B
|
||||
commodity 0.00A
|
||||
|
||||
2000-01-01
|
||||
a 1B
|
||||
b
|
||||
```
|
||||
```
|
||||
$ hledger print -X A
|
||||
2000-01-01
|
||||
a 0.50A
|
||||
b -0.50A
|
||||
|
||||
```
|
||||
|
||||
### Effect of --value on reports
|
||||
|
||||
Here is a reference for how `--value` currently affects each part of hledger's reports.
|
||||
It's work in progress, but may be useful for troubleshooting or reporting bugs.
|
||||
See also the definitions and notes below.
|
||||
If you find problems, please report them, ideally with a reproducible example.
|
||||
Related:
|
||||
[#329](https://github.com/simonmichael/hledger/issues/329),
|
||||
[#1083](https://github.com/simonmichael/hledger/issues/1083).
|
||||
|
||||
| Report type | `-B`, `--value=cost` | `-V`, `-X` | `--value=end` | `--value=DATE`, `--value=now` |
|
||||
|:------------------------------------------------|:----------------------------------------------|:-------------------------------------------------|:---------------------------------------------------|:----------------------------------------|
|
||||
| **print** | | | | |
|
||||
| posting amounts | cost | value at report end or today | value at report or journal end | value at DATE/today |
|
||||
| balance assertions / assignments | unchanged | unchanged | unchanged | unchanged |
|
||||
| <br> | | | | |
|
||||
| **register** | | | | |
|
||||
| starting balance (with -H) | cost | value at day before report or journal start | value at day before report or journal start | value at DATE/today |
|
||||
| posting amounts (no report interval) | cost | value at report end or today | value at report or journal end | value at DATE/today |
|
||||
| summary posting amounts (with report interval) | summarised cost | value at period ends | value at period ends | value at DATE/today |
|
||||
| running total/average | sum/average of displayed values | sum/average of displayed values | sum/average of displayed values | sum/average of displayed values |
|
||||
| <br> | | | | |
|
||||
| **balance (bs, bse, cf, is..)** | | | | |
|
||||
| balances (no report interval) | sums of costs | value at report end or today of sums of postings | value at report or journal end of sums of postings | value at DATE/today of sums of postings |
|
||||
| balances (with report interval) | sums of costs | value at period ends of sums of postings | value at period ends of sums of postings | value at DATE/today of sums of postings |
|
||||
| starting balances (with report interval and -H) | sums of costs of postings before report start | sums of postings before report start | sums of postings before report start | sums of postings before report start |
|
||||
| budget amounts with --budget | like balances | like balances | like balances | like balances |
|
||||
| grand total (no report interval) | sum of displayed values | sum of displayed values | sum of displayed values | sum of displayed values |
|
||||
| row totals/averages (with report interval) | sums/averages of displayed values | sums/averages of displayed values | sums/averages of displayed values | sums/averages of displayed values |
|
||||
| column totals | sums of displayed values | sums of displayed values | sums of displayed values | sums of displayed values |
|
||||
| grand total/average | sum/average of column totals | sum/average of column totals | sum/average of column totals | sum/average of column totals |
|
||||
| <br> | | | | |
|
||||
|
||||
**Additional notes**
|
||||
|
||||
*cost*
|
||||
: calculated using price(s) recorded in the transaction(s).
|
||||
|
||||
*value*
|
||||
: market value using available market price declarations, or the unchanged amount if no conversion rate can be found.
|
||||
|
||||
*report start*
|
||||
: the first day of the report period specified with -b or -p or date:, otherwise today.
|
||||
|
||||
*report or journal start*
|
||||
: the first day of the report period specified with -b or -p or date:, otherwise the earliest transaction date in the journal, otherwise today.
|
||||
|
||||
*report end*
|
||||
: the last day of the report period specified with -e or -p or date:, otherwise today.
|
||||
|
||||
*report or journal end*
|
||||
: the last day of the report period specified with -e or -p or date:, otherwise the latest transaction date in the journal, otherwise today.
|
||||
|
||||
*report interval*
|
||||
: a flag (-D/-W/-M/-Q/-Y) or period expression that activates the report's multi-period mode (whether showing one or many subperiods).
|
||||
|
||||
|
||||
### Combining -B, -V, -X, --value
|
||||
|
||||
The rightmost of these flags wins.
|
||||
|
Loading…
Reference in New Issue
Block a user