doc: move most non-manual docs to the wiki
This commit is contained in:
parent
669e6f0e18
commit
7ffdcc509d
40
Shake.hs
40
Shake.hs
@ -60,7 +60,6 @@ usage = unlines
|
|||||||
-- ,"./Shake infomanpages # generate info files for info"
|
-- ,"./Shake infomanpages # generate info files for info"
|
||||||
-- ,"./Shake webmanpages # generate individual web man pages for hakyll"
|
-- ,"./Shake webmanpages # generate individual web man pages for hakyll"
|
||||||
-- ,"./Shake webmanall # generate all-in-one web manual for hakyll"
|
-- ,"./Shake webmanall # generate all-in-one web manual for hakyll"
|
||||||
-- ,"./Shake guideall # generate all-in-one web user guide for hakyll"
|
|
||||||
,"./Shake site/doc/VER/.snapshot # generate and save a versioned web site snapshot"
|
,"./Shake site/doc/VER/.snapshot # generate and save a versioned web site snapshot"
|
||||||
,"./Shake all # generate everything"
|
,"./Shake all # generate everything"
|
||||||
,"./Shake clean # clean generated files"
|
,"./Shake clean # clean generated files"
|
||||||
@ -155,28 +154,6 @@ main = do
|
|||||||
-- manuals rendered to markdown and combined, ready for web output by hakyll
|
-- manuals rendered to markdown and combined, ready for web output by hakyll
|
||||||
webmanall = "site/manual.md"
|
webmanall = "site/manual.md"
|
||||||
|
|
||||||
-- user guide pages in markdown, ready for web output by hakyll (site/csv-import.md).
|
|
||||||
-- Keeping these in the main site directory allows hakyll-std to see them (and simpler urls).
|
|
||||||
-- These should be kept ordered like the links on the docs page, so that the
|
|
||||||
-- combined guide follows the same order.
|
|
||||||
-- XXX This, as well as keeping page link, heading, and filename synced, will be a bit tricky.
|
|
||||||
-- Current policy:
|
|
||||||
-- filenames are simple and stable as possible, beginning with TOPIC- prefix when appropriate
|
|
||||||
-- titles are succinct and practical/action/verb-oriented
|
|
||||||
guidepages = [
|
|
||||||
"site/start-journal.md"
|
|
||||||
,"site/version-control.md"
|
|
||||||
,"site/entries.md"
|
|
||||||
,"site/csv-import.md"
|
|
||||||
,"site/account-aliases.md"
|
|
||||||
,"site/account-separator.md"
|
|
||||||
,"site/investments.md"
|
|
||||||
,"site/argfiles.md"
|
|
||||||
]
|
|
||||||
|
|
||||||
-- guide pages combined, ready for web output by hakyll
|
|
||||||
guideall = "site/guide.md"
|
|
||||||
|
|
||||||
-- hledger.1 -> hledger/doc, hledger_journal.5 -> hledger-lib/doc
|
-- hledger.1 -> hledger/doc, hledger_journal.5 -> hledger-lib/doc
|
||||||
manpageDir m
|
manpageDir m
|
||||||
| '_' `elem` m = "hledger-lib"
|
| '_' `elem` m = "hledger-lib"
|
||||||
@ -266,7 +243,6 @@ main = do
|
|||||||
need $
|
need $
|
||||||
webmanpages ++
|
webmanpages ++
|
||||||
[webmanall
|
[webmanall
|
||||||
,guideall
|
|
||||||
,hakyllstd
|
,hakyllstd
|
||||||
]
|
]
|
||||||
cmd Shell (Cwd "site") "hakyll-std/hakyll-std" "build"
|
cmd Shell (Cwd "site") "hakyll-std/hakyll-std" "build"
|
||||||
@ -316,20 +292,6 @@ main = do
|
|||||||
">>" webmanall :: Action ExitCode
|
">>" webmanall :: Action ExitCode
|
||||||
|
|
||||||
-- adjust and combine recipe mds for single-page web output, using pandoc
|
-- adjust and combine recipe mds for single-page web output, using pandoc
|
||||||
phony "guideall" $ need [ guideall ]
|
|
||||||
|
|
||||||
guideall %> \out -> do
|
|
||||||
need $ guidepages ++ pandocFilters -- XXX seems not to work, not rebuilt when a recipe changes
|
|
||||||
liftIO $ writeFile guideall "* toc\n\n" -- # User Guide\n\n -- TOC style is better without main heading,
|
|
||||||
forM_ guidepages $ \f -> do -- site/csv-import.md, site/account-aliases.md, ...
|
|
||||||
cmd Shell ("printf '\\n\\n' >>") guideall :: Action ExitCode
|
|
||||||
cmd Shell "pandoc" f "-t markdown-fenced_divs --atx-headers"
|
|
||||||
-- "--filter tools/pandoc-drop-man-blocks"
|
|
||||||
"--filter tools/pandoc-drop-toc"
|
|
||||||
-- "--filter tools/pandoc-capitalize-headers"
|
|
||||||
"--filter tools/pandoc-demote-headers"
|
|
||||||
">>" guideall :: Action ExitCode
|
|
||||||
|
|
||||||
-- build the currently checked out web docs and save as a named snapshot
|
-- build the currently checked out web docs and save as a named snapshot
|
||||||
"site/doc/*/.snapshot" %> \out -> do
|
"site/doc/*/.snapshot" %> \out -> do
|
||||||
need [ webmanall ]
|
need [ webmanall ]
|
||||||
@ -359,7 +321,7 @@ main = do
|
|||||||
phony "clean" $ do
|
phony "clean" $ do
|
||||||
putNormal "Cleaning generated files"
|
putNormal "Cleaning generated files"
|
||||||
removeFilesAfter "." webmanpages
|
removeFilesAfter "." webmanpages
|
||||||
removeFilesAfter "." [webmanall, guideall]
|
removeFilesAfter "." [webmanall]
|
||||||
|
|
||||||
phony "Clean" $ do
|
phony "Clean" $ do
|
||||||
need ["clean"]
|
need ["clean"]
|
||||||
|
|||||||
@ -1,51 +0,0 @@
|
|||||||
# Rewrite account names
|
|
||||||
|
|
||||||
Here's an example of using [account aliases](manual.html#account-aliases).
|
|
||||||
|
|
||||||
Say a sole proprietor has a `personal.journal`:
|
|
||||||
```journal
|
|
||||||
2014/1/2
|
|
||||||
expenses:food $1
|
|
||||||
assets:cash
|
|
||||||
```
|
|
||||||
|
|
||||||
and a `business.journal`:
|
|
||||||
```journal
|
|
||||||
2014/1/1
|
|
||||||
expenses:office supplies $1
|
|
||||||
assets:business checking
|
|
||||||
```
|
|
||||||
|
|
||||||
So each entity (the business owner, and the business) has their own file with its own simple chart of accounts.
|
|
||||||
However, at tax reporting time we need to view these as a single entity (at least in the US).
|
|
||||||
In `unified.journal`, we include both files, and rewrite the personal
|
|
||||||
account names to fit into the business chart of accounts,
|
|
||||||
```journal
|
|
||||||
alias expenses = equity:draw:personal
|
|
||||||
alias assets:cash = assets:personal cash
|
|
||||||
include personal.journal
|
|
||||||
end aliases
|
|
||||||
|
|
||||||
include business.journal
|
|
||||||
```
|
|
||||||
|
|
||||||
Now we can see the data from both files at once, and the personal account names have changed:
|
|
||||||
```shell
|
|
||||||
$ hledger -f unified.journal print
|
|
||||||
2014/01/01 # from business.journal - no aliases applied
|
|
||||||
expenses:office supplies $1
|
|
||||||
assets:business checking $-1
|
|
||||||
|
|
||||||
2014/01/02 # from personal.journal
|
|
||||||
equity:draw:personal:food $1 # <- was expenses:food
|
|
||||||
assets:personal cash $-1 # <- was assets:cash
|
|
||||||
```
|
|
||||||
|
|
||||||
You can also specify aliases on the command line. This could be useful to
|
|
||||||
quickly rewrite account names when sharing a report with someone else, such as
|
|
||||||
your accountant:
|
|
||||||
```shell
|
|
||||||
$ hledger --alias 'my earning=income:business' ...
|
|
||||||
```
|
|
||||||
|
|
||||||
See also [How to use another account separator character](how-to-use-another-account-separator-character.html).
|
|
||||||
@ -1,48 +0,0 @@
|
|||||||
# Use another account separator character
|
|
||||||
|
|
||||||
[Timedot format](manual.html#timedot) makes me want to use dots (`.`) for separating account components, instead of colon (`:`).
|
|
||||||
For example, instead of `fos:hledger:timedot` I'd like to write `fos.hledger.timedot`.
|
|
||||||
We can use the powerful [account aliases](manual.html#account-aliases) feature
|
|
||||||
to rewrite account names before hledger's account name parser sees them.
|
|
||||||
|
|
||||||
In journal files, we can use an alias directive.
|
|
||||||
Note the backslash which tells the regular expression engine it's a literal `.` not a wildcard:
|
|
||||||
|
|
||||||
```journal
|
|
||||||
# alias /REGEX/=REPLACEMENT
|
|
||||||
alias /\./=:
|
|
||||||
|
|
||||||
2008/01/01 income
|
|
||||||
assets.bank.checking $1
|
|
||||||
income.salary
|
|
||||||
```
|
|
||||||
Check that subaccounts are recognised:
|
|
||||||
```shell
|
|
||||||
$ hledger -f t.journal bal --no-elide
|
|
||||||
$1 assets
|
|
||||||
$1 bank
|
|
||||||
$1 checking
|
|
||||||
$-1 income
|
|
||||||
$-1 salary
|
|
||||||
--------------------
|
|
||||||
0
|
|
||||||
```
|
|
||||||
|
|
||||||
Alias directives aren't supported in the timedot format,
|
|
||||||
|
|
||||||
```timedot
|
|
||||||
2016/2/4
|
|
||||||
fos.hledger.timedot 2
|
|
||||||
fos.ledger 1
|
|
||||||
```
|
|
||||||
so we would use the `--alias` command line option instead.
|
|
||||||
The second backslash tells the shell that's a literal backslash, not a shell escape sequence:
|
|
||||||
```shell
|
|
||||||
$ hledger --alias /\\./=: -f t.timedot bal --no-elide
|
|
||||||
3.00 fos
|
|
||||||
2.00 hledger
|
|
||||||
2.00 timedot
|
|
||||||
1.00 ledger
|
|
||||||
--------------------
|
|
||||||
3.00
|
|
||||||
```
|
|
||||||
@ -1,80 +0,0 @@
|
|||||||
# Save frequently used options
|
|
||||||
|
|
||||||
You can save frequently used options and arguments in an
|
|
||||||
[argument file](manual#argument-files), one per
|
|
||||||
line, then reuse them via a @FILE argument on the command line.
|
|
||||||
(hledger 1.4+)
|
|
||||||
|
|
||||||
Here's an example.
|
|
||||||
I keep frequently-used options for quick daily reports in a file
|
|
||||||
called `simple.args`. The name can be anything; I use a `.args` suffix
|
|
||||||
so I can find these easily. Here's the content of `simple.args`:
|
|
||||||
```
|
|
||||||
--alias=/:(business|personal):/=:
|
|
||||||
--alias=/:(bank|cash|online):/=:
|
|
||||||
--alias=/:bofi:/=:b
|
|
||||||
--alias=/:unify:/=:u
|
|
||||||
--alias=/:wf:/=:w
|
|
||||||
-2
|
|
||||||
cur:.
|
|
||||||
```
|
|
||||||
|
|
||||||
The format is one command-line flag or command-line argument per line.
|
|
||||||
Now if I write `@simple.args` in a hledger command line, it will be replaced
|
|
||||||
by all of the above options/flags.
|
|
||||||
|
|
||||||
The options above are just an example, but in case you're wondering:
|
|
||||||
|
|
||||||
- the [aliases](manual.html#account-aliases) simplify the chart of accounts, hiding some distinctions (eg business vs. personal) and flattening some bank account names
|
|
||||||
- the `-2` [depth flag](manual.html#depth-limiting) limits account depth to 2, hiding deeper subaccounts
|
|
||||||
- the `cur:.` [query argument](manual.html#queries) shows only single-character currencies, hiding a bunch of cluttersome commodities I don't want to see
|
|
||||||
|
|
||||||
Ie they remove some detail, giving simplified reports which are easier for me to read at a glance.
|
|
||||||
|
|
||||||
## Usage
|
|
||||||
|
|
||||||
Generate a balance report showing the simplified accounts:
|
|
||||||
```shell
|
|
||||||
$ hledger bal @simple.args
|
|
||||||
```
|
|
||||||
Start a live-updating hledger-ui showing the simplified asset accounts only:
|
|
||||||
```shell
|
|
||||||
$ hledger-ui --watch @simple.args assets
|
|
||||||
```
|
|
||||||
|
|
||||||
Options in the arguments file can be overridden by similar options later on
|
|
||||||
the command line, in the [usual way](manual.html#options).
|
|
||||||
Eg, to show just a little more account detail:
|
|
||||||
```shell
|
|
||||||
$ hledger bal @simple.args -3
|
|
||||||
```
|
|
||||||
|
|
||||||
## Quoting
|
|
||||||
|
|
||||||
[Special characters](manual.html#special-characters) in the arguments file
|
|
||||||
may need to be quoted, depending on your shell (bash, fish etc.)
|
|
||||||
They'll need one less level of quoting than on the command line.
|
|
||||||
I think
|
|
||||||
```shell
|
|
||||||
$ hledger bal @simple.args
|
|
||||||
```
|
|
||||||
is equivalent to writing:
|
|
||||||
```shell
|
|
||||||
$ hledger bal "--alias=/:(business|personal):/=:" "--alias=/:(bank|cash|online):/=:" "--alias=/:bofi:/=:b" "--alias=/:unify:/=:u" "--alias=/:wf:/=:w" "-2" "cur:."
|
|
||||||
```
|
|
||||||
So in this example, using the bash shell, the `|` pipe character did
|
|
||||||
not need to be quoted in the arguments file (and should not be).
|
|
||||||
|
|
||||||
## Suppressing this feature
|
|
||||||
|
|
||||||
If you actually need to write an argument beginning with @,
|
|
||||||
eg let's say you have an account pattern beginning with that character,
|
|
||||||
you'll want a way to disable this feature. On unix systems at least,
|
|
||||||
you can do that by inserting a `--` (double hyphen) argument first. Eg:
|
|
||||||
```
|
|
||||||
$ hledger bal @somewhere.com # looks for additional arguments in the ./somewhere.com file
|
|
||||||
$ hledger bal -- @somewhere.com # matches account names containing "@somewhere.com"
|
|
||||||
```
|
|
||||||
|
|
||||||
On windows, this double hyphen trick [might](https://ghc.haskell.org/trac/ghc/ticket/13287) require a hledger built with GHC 8.2+.
|
|
||||||
(Let us know.)
|
|
||||||
@ -1,323 +0,0 @@
|
|||||||
# Budgeting and forecasting
|
|
||||||
|
|
||||||
Budgeting and forecasting allows you to keep better track of your expenses and future financial situation.
|
|
||||||
If you write down your expectations of what your income/expenses/investment yields/etc should be, you can use them to:
|
|
||||||
- check how far off are your expectations from reality (budgeting)
|
|
||||||
- project your future account activity or balances (forecasting)
|
|
||||||
|
|
||||||
(This section uses examples/bcexample.hledger from hledger source repository).
|
|
||||||
|
|
||||||
## Periodic budget
|
|
||||||
To start budgeting, you need to know what your average yearly or weekly expenditures are. Hledger could help you with that.
|
|
||||||
Usually the interval for which you compute budget figures will be the same as the interval between
|
|
||||||
your paychecks -- monthly or weekly.
|
|
||||||
|
|
||||||
Lets create monthly (-M) report for years 2013-2014 (-b 2013) of all
|
|
||||||
top-level expense categories (--depth 2 Expenses), looking for average
|
|
||||||
figures (-A) in the cost at the time of transaction (-B), limiting
|
|
||||||
ourselves to USD transactions only, to save screen space:
|
|
||||||
|
|
||||||
```shell
|
|
||||||
$ hledger balance -f bcexample.hledger -MBA -b 2013 --depth 2 Expenses cur:USD
|
|
||||||
Balance changes in 2013/01/01-2014/10/31:
|
|
||||||
|
|
||||||
|| 2013/01 2013/02 2013/03 ... 2014/07 2014/08 2014/09 2014/10 Average
|
|
||||||
====================++========================================...==================================================================
|
|
||||||
Expenses:Financial || 4.00 USD 12.95 USD 39.80 USD ... 30.85 USD 21.90 USD 12.95 USD 4.00 USD 17.83 USD
|
|
||||||
Expenses:Food || 396.46 USD 481.48 USD 603.32 USD ... 871.20 USD 768.23 USD 466.72 USD 83.00 USD 562.10 USD
|
|
||||||
Expenses:Health || 290.70 USD 193.80 USD 193.80 USD ... 290.70 USD 193.80 USD 193.80 USD 96.90 USD 207.01 USD
|
|
||||||
Expenses:Home || 2544.98 USD 2545.02 USD 2544.97 USD ... 2545.12 USD 2545.01 USD 2545.10 USD 0 2429.33 USD
|
|
||||||
Expenses:Taxes || 5976.60 USD 3984.40 USD 4901.83 USD ... 5976.60 USD 3984.40 USD 3984.40 USD 1992.20 USD 4322.27 USD
|
|
||||||
Expenses:Transport || 120.00 USD 120.00 USD 120.00 USD ... 0 120.00 USD 120.00 USD 120.00 USD 109.09 USD
|
|
||||||
--------------------++----------------------------------------...------------------------------------------------------------------
|
|
||||||
|| 9332.74 USD 7337.65 USD 8403.72 USD ... 9714.47 USD 7633.34 USD 7322.97 USD 2296.10 USD 7647.64 USD
|
|
||||||
```
|
|
||||||
|
|
||||||
This report is rather wide and portion of it had been cut out for
|
|
||||||
brevity. Most interesting column is the last one, it shows average
|
|
||||||
monthly expenses for each category. Expenses in Food, Health, Home and
|
|
||||||
Transport categories seem to roughly similar month to month, so lets
|
|
||||||
create a budget for them.
|
|
||||||
|
|
||||||
Budgets are described with periodic transactions. Periodic transaction
|
|
||||||
has `~` instead of date and period expression instead of description. In this case
|
|
||||||
we want to create a monthly budget that will come into effect starting from January 2013,
|
|
||||||
which will include income of 10000 USD that is partically spent on Food, Health, Home and Transport
|
|
||||||
and the rest becomes our Assets:
|
|
||||||
|
|
||||||
```journal
|
|
||||||
~ monthly from 2013/01
|
|
||||||
Expenses:Food 500 USD
|
|
||||||
Expenses:Health 200 USD
|
|
||||||
Expenses:Home 2545 USD
|
|
||||||
Expenses:Transport 120 USD
|
|
||||||
Income:US -10700 USD ;; Taken as monthy average of Income account group
|
|
||||||
Assets:US
|
|
||||||
```
|
|
||||||
|
|
||||||
This transaction could be put into separate file (budget.journal) or
|
|
||||||
could be kept in the main journal. Normally hledger will ignore it and
|
|
||||||
will not include it in any computations or reports.
|
|
||||||
|
|
||||||
To put it into action, you need to add `--budget` switch to your balance invocation. If you do that,
|
|
||||||
you would be able to see how your past expenses aligned with the budget that you just created. This
|
|
||||||
time, lets not limit accounts in any way:
|
|
||||||
```shell
|
|
||||||
$ hledger balance -f bcexample.hledger -f budget.journal -MB -b 2013 --budget cur:USD
|
|
||||||
Balance changes in 2013/01/01-2014/10/31:
|
|
||||||
|
|
||||||
|| 2013/01 2013/02 2013/03
|
|
||||||
==========================++===========================================================================================================
|
|
||||||
<unbudgeted>:Expenses || 5980.60 USD 3997.35 USD 4941.63 USD
|
|
||||||
<unbudgeted>:Liabilities || 293.09 USD -147.51 USD -66.01 USD
|
|
||||||
Assets:US || 1893.32 USD [26% of 7335 USD] 2929.77 USD [40% of 7335 USD] -3898.89 USD [-53% of 7335 USD]
|
|
||||||
Expenses:Food || 396.46 USD [79% of 500 USD] 481.48 USD [96% of 500 USD] 603.32 USD [121% of 500 USD]
|
|
||||||
Expenses:Health || 290.70 USD [145% of 200 USD] 193.80 USD [97% of 200 USD] 193.80 USD [97% of 200 USD]
|
|
||||||
Expenses:Home || 2544.98 USD [100% of 2545 USD] 2545.02 USD [100% of 2545 USD] 2544.97 USD [100% of 2545 USD]
|
|
||||||
Expenses:Transport || 120.00 USD [100% of 120 USD] 120.00 USD [100% of 120 USD] 120.00 USD [100% of 120 USD]
|
|
||||||
Income:US || -15119.10 USD [141% of -10700 USD] -10331.21 USD [97% of -10700 USD] -11079.40 USD [104% of -10700 USD]
|
|
||||||
--------------------------++-----------------------------------------------------------------------------------------------------------
|
|
||||||
|| -3599.95 USD -211.30 USD -6640.58 USD
|
|
||||||
|
|
||||||
```
|
|
||||||
|
|
||||||
Numbers in square brackets give you your budget estimate and percentage of it used by your real expenses. Numbers below 100% mean
|
|
||||||
that you have some of your budget left, numbers over 100% mean that you went over your budget.
|
|
||||||
|
|
||||||
You can notice that actual numbers for Assets:US seem to be well below computed budget of 7335 USD. Why? Answer to this is in the first
|
|
||||||
row of the report: we have quite a lot of unbudgeted Expenses!
|
|
||||||
|
|
||||||
Notice that even though we have not limited accounts in any way, report includes just those mentioned in the budget. This is on purpose,
|
|
||||||
assumption is that when you are checking your budgets you probably do not want unbudgeted accounts getting in your way. Another thing to
|
|
||||||
note is that budget numbers have been allocated to top-level expense subcategories (like Expenses:Food). Journal has subaccounts under
|
|
||||||
Food, but to compute budget report they have all been rolled up into a nearest parent with budget number associated with it. Accounts that
|
|
||||||
do not have such parent went into `<unbudgeted>` row.
|
|
||||||
|
|
||||||
Allright, it seems that for Jan 2013 we have ~3000 USD of budgeted expenses and almost twice as much unbudgeted. Lets figure out what they are.
|
|
||||||
We can see more details if we add `--show-unbudgeted` switch:
|
|
||||||
```shell
|
|
||||||
$ hledger balance -f bcexample.hledger -f budget.journal -M -b 2013-01 -e 2013-02 --budget cur:USD --show-unbudgeted
|
|
||||||
Balance changes in 2013/01:
|
|
||||||
|
|
||||||
|| 2013/01
|
|
||||||
==================================++====================================
|
|
||||||
Assets:US || 1893.32 USD [26% of 7335 USD]
|
|
||||||
Expenses:Financial:Fees || 4.00 USD
|
|
||||||
Expenses:Food || 396.46 USD [79% of 500 USD]
|
|
||||||
Expenses:Health || 290.70 USD [145% of 200 USD]
|
|
||||||
Expenses:Home || 2544.98 USD [100% of 2545 USD]
|
|
||||||
Expenses:Taxes:Y2013:US:CityNYC || 524.76 USD
|
|
||||||
Expenses:Taxes:Y2013:US:Federal || 3188.76 USD
|
|
||||||
Expenses:Taxes:Y2013:US:Medicare || 319.86 USD
|
|
||||||
Expenses:Taxes:Y2013:US:SDI || 3.36 USD
|
|
||||||
Expenses:Taxes:Y2013:US:SocSec || 844.62 USD
|
|
||||||
Expenses:Taxes:Y2013:US:State || 1095.24 USD
|
|
||||||
Expenses:Transport || 120.00 USD [100% of 120 USD]
|
|
||||||
Income:US || -15119.10 USD [141% of -10700 USD]
|
|
||||||
Liabilities:US:Chase:Slate || 293.09 USD
|
|
||||||
----------------------------------++------------------------------------
|
|
||||||
|| -3599.95 USD
|
|
||||||
|
|
||||||
```
|
|
||||||
|
|
||||||
All the accounts that were rolled up into `<unbudgeted>` category are now shown with their original name, but budgeted accounts are still rolled up. It
|
|
||||||
is easy to see now that we forgot taxes. Lets add them to our budget:
|
|
||||||
```journal
|
|
||||||
~ monthly from 2013/01
|
|
||||||
Expenses:Food 500 USD
|
|
||||||
Expenses:Health 200 USD
|
|
||||||
Expenses:Home 2545 USD
|
|
||||||
Expenses:Transport 120 USD
|
|
||||||
Expenses:Taxes 4300 USD ;; Taken from monthly average report
|
|
||||||
Income:US -10700 USD
|
|
||||||
Assets:US
|
|
||||||
```
|
|
||||||
|
|
||||||
Lets try again for a couple of month with this updated budget:
|
|
||||||
```shell
|
|
||||||
$ hledger balance -f bcexample.hledger -f budget.journal -M -b 2013-01 -e 2013-04 --budget cur:USD
|
|
||||||
Balance changes in 2013q1:
|
|
||||||
|
|
||||||
|| 2013/01 2013/02 2013/03
|
|
||||||
==========================++===========================================================================================================
|
|
||||||
<unbudgeted>:Expenses || 4.00 USD 12.95 USD 39.80 USD
|
|
||||||
<unbudgeted>:Liabilities || 293.09 USD -147.51 USD -66.01 USD
|
|
||||||
Assets:US || 1893.32 USD [62% of 3035 USD] 2929.77 USD [97% of 3035 USD] -3898.89 USD [-128% of 3035 USD]
|
|
||||||
Expenses:Food || 396.46 USD [79% of 500 USD] 481.48 USD [96% of 500 USD] 603.32 USD [121% of 500 USD]
|
|
||||||
Expenses:Health || 290.70 USD [145% of 200 USD] 193.80 USD [97% of 200 USD] 193.80 USD [97% of 200 USD]
|
|
||||||
Expenses:Home || 2544.98 USD [100% of 2545 USD] 2545.02 USD [100% of 2545 USD] 2544.97 USD [100% of 2545 USD]
|
|
||||||
Expenses:Taxes || 5976.60 USD [139% of 4300 USD] 3984.40 USD [93% of 4300 USD] 4901.83 USD [114% of 4300 USD]
|
|
||||||
Expenses:Transport || 120.00 USD [100% of 120 USD] 120.00 USD [100% of 120 USD] 120.00 USD [100% of 120 USD]
|
|
||||||
Income:US || -15119.10 USD [141% of -10700 USD] -10331.21 USD [97% of -10700 USD] -11079.40 USD [104% of -10700 USD]
|
|
||||||
--------------------------++-----------------------------------------------------------------------------------------------------------
|
|
||||||
|| -3599.95 USD -211.30 USD -6640.58 USD
|
|
||||||
|
|
||||||
```
|
|
||||||
|
|
||||||
Now unbudgeted amounts are much smaller and some of them could be dismissed as noise, and we can see that budget created is actually
|
|
||||||
close enough to the real numbers, meaning that they are usually close to average that we put in our budget.
|
|
||||||
|
|
||||||
## Envelope budget
|
|
||||||
|
|
||||||
Budget report that we have used so far assumes that any unused budget amount for a given (monthly) period will not contribute to the
|
|
||||||
budget of the next period. Alternative popular "envelope budget" strategy assumes that you put a certain amount of money into an envelope
|
|
||||||
each month, and any unused amount stays there for future expenses. This is easy to simulate by adding --cumulative switch. Lets redo
|
|
||||||
the last report with it:
|
|
||||||
```shell
|
|
||||||
$ hledger balance -f bcexample.hledger -f budget.journal -M -b 2013-01 -e 2013-04 --cumulative --budget cur:USD
|
|
||||||
Ending balances (cumulative) in 2013q1:
|
|
||||||
|
|
||||||
|| 2013/01/31 2013/02/28 2013/03/31
|
|
||||||
==========================++============================================================================================================
|
|
||||||
<unbudgeted>:Expenses || 4.00 USD 16.95 USD 56.75 USD
|
|
||||||
<unbudgeted>:Liabilities || 293.09 USD 145.58 USD 79.57 USD
|
|
||||||
Assets:US || 1893.32 USD [62% of 3035 USD] 4823.09 USD [79% of 6070 USD] 924.20 USD [10% of 9105 USD]
|
|
||||||
Expenses:Food || 396.46 USD [79% of 500 USD] 877.94 USD [88% of 1000 USD] 1481.26 USD [99% of 1500 USD]
|
|
||||||
Expenses:Health || 290.70 USD [145% of 200 USD] 484.50 USD [121% of 400 USD] 678.30 USD [113% of 600 USD]
|
|
||||||
Expenses:Home || 2544.98 USD [100% of 2545 USD] 5090.00 USD [100% of 5090 USD] 7634.97 USD [100% of 7635 USD]
|
|
||||||
Expenses:Taxes || 5976.60 USD [139% of 4300 USD] 9961.00 USD [116% of 8600 USD] 14862.83 USD [115% of 12900 USD]
|
|
||||||
Expenses:Transport || 120.00 USD [100% of 120 USD] 240.00 USD [100% of 240 USD] 360.00 USD [100% of 360 USD]
|
|
||||||
Income:US || -15119.10 USD [141% of -10700 USD] -25450.31 USD [119% of -21400 USD] -36529.71 USD [114% of -32100 USD]
|
|
||||||
--------------------------++------------------------------------------------------------------------------------------------------------
|
|
||||||
|| -3599.95 USD -3811.25 USD -10451.83 USD
|
|
||||||
|
|
||||||
```
|
|
||||||
|
|
||||||
If you look at Expenses:Food category, you will see that every month budget is increased by 500 USD, and by March total amount budgeted
|
|
||||||
is 1500 USD, of which 1481.26 USD is spent. If you look back at the previous non-cumulative monthly budget report, you will see that in March food expenses
|
|
||||||
were 121% of the budgeted amount, but cumulative report shows that taking into account budget carry-over from Jan and Feb we are well withing planned numbers.
|
|
||||||
|
|
||||||
# Forecasting
|
|
||||||
|
|
||||||
Budget transaction that was created could be used to predict what would be our financial situation in the future. If you add `--forecast` switch, you will
|
|
||||||
see how budgeted income and expense affects you past the last transaction in the journal. Since journal ends in Oct 2014, lets see next two month:
|
|
||||||
|
|
||||||
```shell
|
|
||||||
$ hledger balance -f bcexample.hledger -f budget.journal -M -b 2014-10 -e 2015 --forecast cur:USD
|
|
||||||
Balance changes in 2014q4:
|
|
||||||
|
|
||||||
|| 2014/10 2014/11 2014/12
|
|
||||||
====================================++======================================
|
|
||||||
Assets:US || 0 3035 USD 3035 USD
|
|
||||||
Assets:US:BofA:Checking || -2453.40 USD 0 0
|
|
||||||
Assets:US:ETrade:Cash || 5000.00 USD 0 0
|
|
||||||
Expenses:Financial:Fees || 4.00 USD 0 0
|
|
||||||
Expenses:Food || 0 500 USD 500 USD
|
|
||||||
Expenses:Food:Restaurant || 83.00 USD 0 0
|
|
||||||
Expenses:Health || 0 200 USD 200 USD
|
|
||||||
Expenses:Health:Dental:Insurance || 2.90 USD 0 0
|
|
||||||
Expenses:Health:Life:GroupTermLife || 24.32 USD 0 0
|
|
||||||
Expenses:Health:Medical:Insurance || 27.38 USD 0 0
|
|
||||||
Expenses:Health:Vision:Insurance || 42.30 USD 0 0
|
|
||||||
Expenses:Home || 0 2545 USD 2545 USD
|
|
||||||
Expenses:Taxes || 0 4300 USD 4300 USD
|
|
||||||
Expenses:Taxes:Y2014:US:CityNYC || 174.92 USD 0 0
|
|
||||||
Expenses:Taxes:Y2014:US:Federal || 1062.92 USD 0 0
|
|
||||||
Expenses:Taxes:Y2014:US:Medicare || 106.62 USD 0 0
|
|
||||||
Expenses:Taxes:Y2014:US:SDI || 1.12 USD 0 0
|
|
||||||
Expenses:Taxes:Y2014:US:SocSec || 281.54 USD 0 0
|
|
||||||
Expenses:Taxes:Y2014:US:State || 365.08 USD 0 0
|
|
||||||
Expenses:Transport || 0 120 USD 120 USD
|
|
||||||
Expenses:Transport:Tram || 120.00 USD 0 0
|
|
||||||
Income:US || 0 -10700 USD -10700 USD
|
|
||||||
Income:US:Hoogle:GroupTermLife || -24.32 USD 0 0
|
|
||||||
Income:US:Hoogle:Salary || -4615.38 USD 0 0
|
|
||||||
Liabilities:US:Chase:Slate || -203.00 USD 0 0
|
|
||||||
------------------------------------++--------------------------------------
|
|
||||||
|| 0 0 0
|
|
||||||
```
|
|
||||||
|
|
||||||
Note that this time there is no roll-up of accounts. Unlike `--budget`, which could be used with `balance` command only, `--forecast`
|
|
||||||
could be used with any report. Forecast transactions would be added to your real journal and would appear in the report you requested as
|
|
||||||
if you have entered them on the scheduled dates.
|
|
||||||
|
|
||||||
Since quite a lot of accounts do not have any budgeted transactions, lets limit the depth of the report to avoid seeing lots of zeroes:
|
|
||||||
```shell
|
|
||||||
$ hledger balance -f bcexample.hledger -f budget.journal -M -b 2014-10 -e 2015 --forecast cur:USD --depth 2
|
|
||||||
Balance changes in 2014q4:
|
|
||||||
|
|
||||||
|| 2014/10 2014/11 2014/12
|
|
||||||
====================++======================================
|
|
||||||
Assets:US || 2546.60 USD 3035 USD 3035 USD
|
|
||||||
Expenses:Financial || 4.00 USD 0 0
|
|
||||||
Expenses:Food || 83.00 USD 500 USD 500 USD
|
|
||||||
Expenses:Health || 96.90 USD 200 USD 200 USD
|
|
||||||
Expenses:Home || 0 2545 USD 2545 USD
|
|
||||||
Expenses:Taxes || 1992.20 USD 4300 USD 4300 USD
|
|
||||||
Expenses:Transport || 120.00 USD 120 USD 120 USD
|
|
||||||
Income:US || -4639.70 USD -10700 USD -10700 USD
|
|
||||||
Liabilities:US || -203.00 USD 0 0
|
|
||||||
--------------------++--------------------------------------
|
|
||||||
|| 0 0 0
|
|
||||||
```
|
|
||||||
|
|
||||||
As you can see, we should expect 3035 USD to be added into Assets:US each month. It is quite easy to see how overal amount of Assets will change with time if you use
|
|
||||||
`--cumulative` switch:
|
|
||||||
```shell
|
|
||||||
$ hledger balance -f bcexample.hledger -f budget.journal -M -b 2014-10 -e 2015 --forecast cur:USD --depth 2 --cumulative
|
|
||||||
Ending balances (cumulative) in 2014q4:
|
|
||||||
|
|
||||||
|| 2014/10/31 2014/11/30 2014/12/31
|
|
||||||
====================++============================================
|
|
||||||
Assets:US || 2546.60 USD 5581.60 USD 8616.60 USD
|
|
||||||
Expenses:Financial || 4.00 USD 4.00 USD 4.00 USD
|
|
||||||
Expenses:Food || 83.00 USD 583.00 USD 1083.00 USD
|
|
||||||
Expenses:Health || 96.90 USD 296.90 USD 496.90 USD
|
|
||||||
Expenses:Home || 0 2545 USD 5090 USD
|
|
||||||
Expenses:Taxes || 1992.20 USD 6292.20 USD 10592.20 USD
|
|
||||||
Expenses:Transport || 120.00 USD 240.00 USD 360.00 USD
|
|
||||||
Income:US || -4639.70 USD -15339.70 USD -26039.70 USD
|
|
||||||
Liabilities:US || -203.00 USD -203.00 USD -203.00 USD
|
|
||||||
--------------------++--------------------------------------------
|
|
||||||
|| 0 0 0
|
|
||||||
```
|
|
||||||
|
|
||||||
According to forecast, assets are expected to grow to 8600+ USD by the end of 2014. However, our forecast does not include a couple
|
|
||||||
of big one-off year end expenses. First, we plan to buy prize turkey for the Christmas table every year from 2014, spending up to 500 USD on it.
|
|
||||||
And on 17th Nov 2014 we would celebrate birthday of significant other, spending up to 6000 USD in a fancy restaurant:
|
|
||||||
```journal
|
|
||||||
~ every 20th Dec from 2014
|
|
||||||
Expenses:Food 500 USD ; Prize turkey, the biggest of the big
|
|
||||||
Assets:US
|
|
||||||
|
|
||||||
~ 2014/11/17
|
|
||||||
Assets:US
|
|
||||||
Expenses:Food 6000 USD ; Birthday, lots of guests
|
|
||||||
```
|
|
||||||
|
|
||||||
Note that turkey transaction is not entered as "yearly from 2014/12/20", since yearly/quarterly/monthy/weekly periodic expressions always generate
|
|
||||||
entries at the first day of the calendar year/quarter/month/week. Thus "monthly from 2014/12" will occur on 2014/12/01, 2015/01/01, ..., whereas
|
|
||||||
"every 20th of month from 2014/12" will happen on 2014/12/20, 2015/12/20, etc.
|
|
||||||
|
|
||||||
With latest additions forecast now looks like this:
|
|
||||||
```shell
|
|
||||||
hledger balance -f bcexample.hledger -f budget.journal -M -b 2014-10 -e 2015 --forecast cur:USD --depth 2 --cumulative
|
|
||||||
Ending balances (cumulative) in 2014q4:
|
|
||||||
|
|
||||||
|| 2014/10/31 2014/11/30 2014/12/31
|
|
||||||
====================++============================================
|
|
||||||
Assets:US || 2546.60 USD -418.40 USD 2116.60 USD
|
|
||||||
Expenses:Financial || 4.00 USD 4.00 USD 4.00 USD
|
|
||||||
Expenses:Food || 83.00 USD 6583.00 USD 7583.00 USD
|
|
||||||
Expenses:Health || 96.90 USD 296.90 USD 496.90 USD
|
|
||||||
Expenses:Home || 0 2545 USD 5090 USD
|
|
||||||
Expenses:Taxes || 1992.20 USD 6292.20 USD 10592.20 USD
|
|
||||||
Expenses:Transport || 120.00 USD 240.00 USD 360.00 USD
|
|
||||||
Income:US || -4639.70 USD -15339.70 USD -26039.70 USD
|
|
||||||
Liabilities:US || -203.00 USD -203.00 USD -203.00 USD
|
|
||||||
--------------------++--------------------------------------------
|
|
||||||
|| 0 0 0
|
|
||||||
```
|
|
||||||
|
|
||||||
It is easy to see that in Nov 2014 we will run out of Assets. Using `register` we can figure out when or why it would happen:
|
|
||||||
```shell
|
|
||||||
$ hledger register -f bcexample.hledger -f budget.journal -b 2014-10 -e 2014-12 --forecast cur:USD Assets
|
|
||||||
2014/10/04 "BANK FEES" | "Monthly bank fee" Assets:US:BofA:Checking -4.00 USD -4.00 USD
|
|
||||||
2014/10/09 "Hoogle" | "Payroll" Assets:US:BofA:Checking 2550.60 USD 2546.60 USD
|
|
||||||
2014/10/10 "Transfering accumulated savings to o.. Assets:US:BofA:Checking -5000.00 USD -2453.40 USD
|
|
||||||
Assets:US:ETrade:Cash 5000.00 USD 2546.60 USD
|
|
||||||
2014/11/01 Forecast transaction Assets:US 3035 USD 5581.60 USD
|
|
||||||
2014/11/17 Forecast transaction Assets:US -6000 USD -418.40 USD
|
|
||||||
```
|
|
||||||
|
|
||||||
It is 6000 USD planned for birthday! Something will have to be done about the birthday plans.
|
|
||||||
@ -1,59 +0,0 @@
|
|||||||
# Convert CSV files
|
|
||||||
|
|
||||||
Here's a quick example of reading CSV data with hledger.
|
|
||||||
|
|
||||||
Say we have downloaded `checking.csv` from a bank for the first time:
|
|
||||||
```csv
|
|
||||||
"Date","Note","Amount"
|
|
||||||
"2012/3/22","DEPOSIT","50.00"
|
|
||||||
"2012/3/23","TRANSFER TO SAVINGS","-10.00"
|
|
||||||
```
|
|
||||||
|
|
||||||
We tell hledger how to intepret this with a file named `checking.csv.rules`, using the [CSV rules syntax](manual.html#csv-format). Eg:
|
|
||||||
```rules
|
|
||||||
# skip the first CSV line (headings)
|
|
||||||
skip 1
|
|
||||||
|
|
||||||
# use the first three fields in each CSV record as transaction date, description and amount respectively
|
|
||||||
fields date, description, amount
|
|
||||||
|
|
||||||
# prepend $ to CSV amounts
|
|
||||||
currency $
|
|
||||||
|
|
||||||
# always set the first account to assets:bank:checking
|
|
||||||
account1 assets:bank:checking
|
|
||||||
|
|
||||||
# if the CSV record contains ‘SAVINGS’, set the second account to assets:bank:savings
|
|
||||||
# (if not set, it will be expenses:unknown or income:unknown)
|
|
||||||
if SAVINGS
|
|
||||||
account2 assets:bank:savings
|
|
||||||
```
|
|
||||||
|
|
||||||
Now hledger can read this CSV file as journal data:
|
|
||||||
|
|
||||||
```shell
|
|
||||||
$ hledger -f checking.csv print
|
|
||||||
using conversion rules file checking.csv.rules
|
|
||||||
2012/03/22 DEPOSIT
|
|
||||||
income:unknown $-50.00
|
|
||||||
assets:bank:checking $50.00
|
|
||||||
|
|
||||||
2012/03/23 TRANSFER TO SAVINGS
|
|
||||||
assets:bank:savings $10.00
|
|
||||||
assets:bank:checking $-10.00
|
|
||||||
```
|
|
||||||
|
|
||||||
We might save this output as `checking.journal`, and/or merge it (manually) into the main journal file.
|
|
||||||
We could also run other commands:
|
|
||||||
```shell
|
|
||||||
$ hledger -f checking.csv balance
|
|
||||||
using conversion rules file checking.csv.rules
|
|
||||||
$50.00 assets:bank
|
|
||||||
$40.00 checking
|
|
||||||
$10.00 savings
|
|
||||||
$-50.00 income:unknown
|
|
||||||
--------------------
|
|
||||||
0
|
|
||||||
```
|
|
||||||
|
|
||||||
Here are more [CSV rules examples](https://github.com/simonmichael/hledger/tree/master/examples/csv).
|
|
||||||
94
site/docs.md
94
site/docs.md
@ -33,7 +33,6 @@ For more docs relevant to all ledger-likes, see [plaintextaccounting.org](http:/
|
|||||||
### What is hledger?
|
### What is hledger?
|
||||||
An enhanced, well-documented rewrite of the original plain text accounting tool.\
|
An enhanced, well-documented rewrite of the original plain text accounting tool.\
|
||||||
[hledger intro](http://hledger.org)\
|
[hledger intro](http://hledger.org)\
|
||||||
[Frequently Asked Questions](faq.html)\
|
|
||||||
[Download](download.html)\
|
[Download](download.html)\
|
||||||
[Release notes](release-notes.html)\
|
[Release notes](release-notes.html)\
|
||||||
|
|
||||||
@ -45,67 +44,10 @@ Using plain text data formats and modular free software tools for robust, effici
|
|||||||
|
|
||||||
### What is Accounting?
|
### What is Accounting?
|
||||||
Tracking your use of valuable commodities, such as money or time, for increased awareness and effectiveness.\
|
Tracking your use of valuable commodities, such as money or time, for increased awareness and effectiveness.\
|
||||||
[Selected accounting links](more-docs.html#accounting)\
|
[Selected accounting links](http://github.com/simonmichael/hledger/wiki/more-docs)\
|
||||||
|
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<div class="col-sm-3">
|
|
||||||
|
|
||||||
## [Guide](guide.html){title="all on one page"}
|
|
||||||
|
|
||||||
A growing collection of tutorials, how-tos and discussion of general topics.
|
|
||||||
|
|
||||||
### Getting started
|
|
||||||
|
|
||||||
[hledger Step by Step](step-by-step.html) tutorial\
|
|
||||||
|
|
||||||
|
|
||||||
### Journal management
|
|
||||||
|
|
||||||
[Start a journal](start-journal.html)\
|
|
||||||
[Track changes with version control](version-control.html)\
|
|
||||||
|
|
||||||
|
|
||||||
### Account names
|
|
||||||
|
|
||||||
[PTA: choosing accounts](http://plaintextaccounting.org/#choosing-accounts)\
|
|
||||||
[Rewrite account names](account-aliases.html)\
|
|
||||||
[Use another account separator character](account-separator.html)\
|
|
||||||
|
|
||||||
|
|
||||||
### Journal entries
|
|
||||||
|
|
||||||
[Basic journal entries](entries.html)\
|
|
||||||
[Project accounting](project-accounting.html)\
|
|
||||||
|
|
||||||
|
|
||||||
### Data entry/import
|
|
||||||
|
|
||||||
[Convert CSV files](csv-import.html)\
|
|
||||||
|
|
||||||
|
|
||||||
### Budgeting/forecasting
|
|
||||||
|
|
||||||
[Budgeting and forecasting](budgeting-and-forecasting.html)\
|
|
||||||
|
|
||||||
|
|
||||||
### Investing
|
|
||||||
|
|
||||||
[Track investments](investments.html)\
|
|
||||||
|
|
||||||
|
|
||||||
### More..
|
|
||||||
|
|
||||||
[Save frequently used options](argfiles.html)\
|
|
||||||
[PTA: Common tasks](http://plaintextaccounting.org/#common-tasks)\
|
|
||||||
|
|
||||||
</div>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<div class="col-sm-3">
|
<div class="col-sm-3">
|
||||||
|
|
||||||
## [Reference](manual.html){title="all on one page"}
|
## [Reference](manual.html){title="all on one page"}
|
||||||
@ -140,39 +82,17 @@ is for precise time logging with clock-in/clock-out
|
|||||||
[timedot format](timedot.html)
|
[timedot format](timedot.html)
|
||||||
is for human-friendly approximate time logging
|
is for human-friendly approximate time logging
|
||||||
|
|
||||||
### Addon tools
|
</div>
|
||||||
|
|
||||||
[hledger-diff](http://hackage.haskell.org/package/hledger-diff)
|
<div class="col-sm-3">
|
||||||
shows differences in an account's transactions between one journal file and another.
|
|
||||||
|
|
||||||
[hledger-iadd](http://hackage.haskell.org/package/hledger-iadd)
|
## Wiki / Cookbook
|
||||||
is a curses-style replacement for hledger's add command.
|
|
||||||
|
|
||||||
[hledger-interest](http://hackage.haskell.org/package/hledger-interest)
|
Tutorials, how-tos and discussion of general topics.
|
||||||
generates interest transactions for an account according to various schemes.
|
|
||||||
|
|
||||||
[hledger-irr](http://hackage.haskell.org/package/hledger-irr)
|
https://github.com/simonmichael/hledger/wiki
|
||||||
calculates the internal rate of return of an investment account.
|
|
||||||
|
|
||||||
Some experimental tools:
|
</div>
|
||||||
|
|
||||||
[hledger-budget.hs](https://github.com/simonmichael/hledger/blob/master/bin/hledger-budget.hs#L10)
|
|
||||||
adds Ledger-style periodic transactions and budget reports.
|
|
||||||
|
|
||||||
[hledger-check.hs](https://github.com/simonmichael/hledger/blob/master/bin/hledger-check.hs)
|
|
||||||
checks more powerful account balance assertions.
|
|
||||||
|
|
||||||
Also:
|
|
||||||
|
|
||||||
[ledger-autosync](https://pypi.python.org/pypi/ledger-autosync),
|
|
||||||
can download, deduplicate and/or convert OFX data (includes hledger support,
|
|
||||||
rename/symlink it to hledger-autosync to see it in commands list)
|
|
||||||
|
|
||||||
[PTA: related tools](http://plaintextaccounting.org/#related-tools)
|
|
||||||
lists all known plain text accounting helper tools
|
|
||||||
|
|
||||||
|
|
||||||
</div> <!-- col -->
|
|
||||||
|
|
||||||
</div> <!-- row -->
|
</div> <!-- row -->
|
||||||
</div> <!-- container -->
|
</div> <!-- container -->
|
||||||
|
|||||||
@ -1,12 +0,0 @@
|
|||||||
# Example journal entries
|
|
||||||
|
|
||||||
Example hledger journal entries for various kinds of transaction.
|
|
||||||
|
|
||||||
A purchase:
|
|
||||||
|
|
||||||
```journal
|
|
||||||
2017/1/26 market
|
|
||||||
expenses:food $10
|
|
||||||
assets:cash
|
|
||||||
```
|
|
||||||
|
|
||||||
286
site/faq.md
286
site/faq.md
@ -1,286 +0,0 @@
|
|||||||
<style>
|
|
||||||
#toc > ol > li > a { display:none; }
|
|
||||||
#toc > ol > li > ol > li { padding-left:0; }
|
|
||||||
</style>
|
|
||||||
* toc
|
|
||||||
|
|
||||||
# Frequently asked questions
|
|
||||||
|
|
||||||
## hledger & Ledger
|
|
||||||
|
|
||||||
### History
|
|
||||||
|
|
||||||
I discovered John Wiegley's [Ledger](http://ledger-cli.org) in 2006,
|
|
||||||
and was very happy to find this efficient command-line reporting tool with a transparent data format.
|
|
||||||
|
|
||||||
Initially, I used it to generate time reports for my job.
|
|
||||||
Before long I wanted that to work differently - splitting sessions at day boundaries, reporting in hours, etc.
|
|
||||||
John had got busy elsewhere and the Ledger project now stalled, with unfixed bugs, wrong documentation and a confusing release situation persisting for a long time.
|
|
||||||
I did what I could to help build momentum, reporting bugs, supporting newcomers, and contributing a new domain and website.
|
|
||||||
But, I didn't want to spend time learning C++.
|
|
||||||
|
|
||||||
I was learning Haskell, which I did want to spend time in.
|
|
||||||
I felt Ledger could be implemented well and, in the long run, more efficiently in that language,
|
|
||||||
which has some compelling advantages such as lower maintenance costs.
|
|
||||||
<!-- ([eg](http://neilmitchell.blogspot.com/2016/02/selling-haskell-in-pub.html)). -->
|
|
||||||
<!-- (It encourages the coding style known as pure functional programming, -->
|
|
||||||
<!-- allowing more bug-free, concise and maintainable software. It provides -->
|
|
||||||
<!-- a more abstracted, portable platform making installation easier. It is -->
|
|
||||||
<!-- attractive for contributors to work on.) -->
|
|
||||||
I urgently needed a reliable accounting tool that I enjoyed using.
|
|
||||||
I also wanted to see what I could do to reduce roadbumps and confusion for newcomers.
|
|
||||||
|
|
||||||
I couldn't expect John to start over - at that time he was not the Haskell fan he is now!
|
|
||||||
So in 2007 I began experimenting.
|
|
||||||
I built a toy parser in a few different languages, and it was easiest in Haskell.
|
|
||||||
I kept tinkering.
|
|
||||||
Goals included:
|
|
||||||
|
|
||||||
- to get better at Haskell by building something useful to me,
|
|
||||||
- to learn how well Haskell could work for real-world applications,
|
|
||||||
- and eventually: to provide a new implementation focussing more on
|
|
||||||
ease of use, absence of user-visible bugs, and high-quality documentation and web presence.
|
|
||||||
Also to experiment with new user interfaces, APIs, etc.
|
|
||||||
|
|
||||||
Before too long I had a tool that was useful to me. With Ledger still installed,
|
|
||||||
and by maintaining high compatibility, I now had two tools with different strengths,
|
|
||||||
each providing a comparison for the other in case of confusion or suspected bugs,
|
|
||||||
which was itself quite valuable.
|
|
||||||
|
|
||||||
Happily, the Ledger project later revived and has attracted new active contributors.
|
|
||||||
I have remained active in that community, sharing discoveries and
|
|
||||||
design discussions, and we have seen many ideas travelling in both directions.
|
|
||||||
hledger shared #ledger's IRC channel until 2014, when I added
|
|
||||||
[#hledger](irc://irc.freenode.net/#hledger) to allow us more space.
|
|
||||||
|
|
||||||
I think having independent but compatible implementations has been
|
|
||||||
quite helpful for troubleshooting, exploring the design space, and
|
|
||||||
growing the "Ledger-likes" community.
|
|
||||||
My other projects in that direction include
|
|
||||||
the [ledger-cli.org](http://ledger-cli.org) site,
|
|
||||||
[LedgerTips](http://twitter.com/LedgerTips),
|
|
||||||
IRC support on #ledger,
|
|
||||||
and now [plaintextaccounting.org](http://plaintextaccounting.org).
|
|
||||||
|
|
||||||
### Features
|
|
||||||
|
|
||||||
Compared to Ledger, hledger builds quickly and has a complete and
|
|
||||||
accurate manual, an easier report query syntax, multi-column balance
|
|
||||||
reports, better depth limiting, an interactive data entry assistant,
|
|
||||||
and optional web and curses interfaces.
|
|
||||||
|
|
||||||
Compared to hledger, Ledger has additional power-user features such as
|
|
||||||
periodic and modifier transactions, budget reports, and the built in
|
|
||||||
value expressions language, and it remains faster and more memory
|
|
||||||
efficient (for now).
|
|
||||||
|
|
||||||
We currently support:
|
|
||||||
|
|
||||||
- Ledger's journal format, mostly
|
|
||||||
- csv format
|
|
||||||
- timeclock format
|
|
||||||
- regular journal transactions
|
|
||||||
- multiple commodities
|
|
||||||
- fixed transaction prices
|
|
||||||
- varying market prices
|
|
||||||
- virtual postings
|
|
||||||
- some basic output formatting
|
|
||||||
- the print, register & balance commands
|
|
||||||
- report filtering, using a different query syntax
|
|
||||||
|
|
||||||
We do not support:
|
|
||||||
|
|
||||||
- automated transactions
|
|
||||||
- value expressions
|
|
||||||
- budget reports
|
|
||||||
|
|
||||||
And we add these commands:
|
|
||||||
|
|
||||||
- add
|
|
||||||
- balancesheet
|
|
||||||
- cashflow
|
|
||||||
- chart
|
|
||||||
- incomestatement
|
|
||||||
- irr
|
|
||||||
- interest
|
|
||||||
- ui
|
|
||||||
- web
|
|
||||||
|
|
||||||
### File formats
|
|
||||||
|
|
||||||
hledger's journal file format is mostly identical with Ledger's, by design.
|
|
||||||
Generally, it's easy to keep a journal file that works with both hledger
|
|
||||||
and Ledger if you avoid Ledger's and hledger's more specialised syntax
|
|
||||||
(or keep it in separate files which you include only when appropriate).
|
|
||||||
|
|
||||||
Some Ledger syntax is parsed but ignored (such as
|
|
||||||
[automated transactions](http://ledger-cli.org/3.0/doc/ledger3.html#Automated-Transactions)
|
|
||||||
and [periodic transactions](http://ledger-cli.org/3.0/doc/ledger3.html#Periodic-Transactions)).
|
|
||||||
Some features are not currently parsed and will cause an error, eg
|
|
||||||
Ledger's more recent top-level directives. There can also be subtle
|
|
||||||
differences in parser behaviour, such as with
|
|
||||||
[hledger comments](manual.html#comments) vs [Ledger comments](http://ledger-cli.org/3.0/doc/ledger3.html#Commenting-on-your-Journal),
|
|
||||||
or [balance assertions](manual.html#assertions-and-ordering).
|
|
||||||
|
|
||||||
### Functional differences
|
|
||||||
|
|
||||||
- hledger recognises description and negative patterns by "desc:"
|
|
||||||
and "not:" prefixes, unlike Ledger 3's free-form parser
|
|
||||||
|
|
||||||
- hledger does not require a space between command-line flags and their values,
|
|
||||||
eg `-fFILE` works as well as `-f FILE`
|
|
||||||
|
|
||||||
- hledger's weekly reporting intervals always start on mondays
|
|
||||||
|
|
||||||
- hledger shows start and end dates of the intervals requested,
|
|
||||||
not just the span containing data
|
|
||||||
|
|
||||||
- hledger always shows time balances (from the timeclock/timedot formats) in hours, with two decimal places
|
|
||||||
|
|
||||||
- hledger splits multi-day time sessions at midnight by default (Ledger does this with an option)
|
|
||||||
|
|
||||||
- hledger's output follows the decimal point character, digit grouping,
|
|
||||||
and digit group separator character used in the journal.
|
|
||||||
|
|
||||||
- hledger print shows amounts for all postings, and shows unit prices for
|
|
||||||
amounts which have them. (This means that it does not currently print
|
|
||||||
multi-commodity transactions in valid journal format.)
|
|
||||||
|
|
||||||
- hledger print ignores the --date2 flag, always showing both dates.
|
|
||||||
ledger print shows only the secondary date with --aux-date, but not
|
|
||||||
vice versa.
|
|
||||||
|
|
||||||
- hledger's default commodity directive (D) sets the commodity to be
|
|
||||||
used for subsequent commodityless amounts, and also sets that
|
|
||||||
commodity's display settings if such an amount is the first
|
|
||||||
seen. Ledger uses D only for commodity display settings and for the
|
|
||||||
entry command.
|
|
||||||
|
|
||||||
- hledger's [include directive](manual.html#including-other-files) does not support
|
|
||||||
shell glob patterns (eg `include *.journal` ), as Ledger's does.
|
|
||||||
|
|
||||||
- when checking [balance assertions](manual.html#balance-assertions)
|
|
||||||
hledger sorts the account's postings first by date and then (for
|
|
||||||
postings with the same date) by parse order. Ledger checks assertions
|
|
||||||
in parse order, ignoring dates.
|
|
||||||
|
|
||||||
- Ledger allows amounts to have a fixed lot price (the {} syntax ?)
|
|
||||||
and a regular price in any order (and uses whichever appears
|
|
||||||
first). hledger requires the fixed lot price to come last (and
|
|
||||||
ignores it).
|
|
||||||
|
|
||||||
- hledger uses --ignore-assertions/-I to disable balance assertions.
|
|
||||||
Ledger uses --permissive, and -I means something else (--prices).
|
|
||||||
|
|
||||||
- hledger's -p option doesn't combine nicely with -b/-e/-D/-W/-M/-Q/-Y.
|
|
||||||
Basically if there's a -p, all those others are ignored.
|
|
||||||
There's an open issue.
|
|
||||||
With hledger you can also specify start and/or end dates with a query argument,
|
|
||||||
date:START-END, which probably doesn't combine perfectly with the options.
|
|
||||||
|
|
||||||
- in hledger version 1.3 onward,
|
|
||||||
the "uncleared" status has been renamed to "unmarked",
|
|
||||||
it is matched by the -U/--unmarked flag.
|
|
||||||
Also, the --unmarked/--pending/--cleared flags can be combined,
|
|
||||||
so eg -UP matches unmarked and pending, similar to Ledger's --uncleared flag.
|
|
||||||
(#564)
|
|
||||||
|
|
||||||
- hledger's -P flag is short for --pending. Ledger uses it for grouping by payee.
|
|
||||||
|
|
||||||
- hledger's journal and timeclock formats are separate; you can't use
|
|
||||||
[both syntaxes in the same file](https://www.reddit.com/r/plaintextaccounting/comments/7buf8q/how_to_balance_working_hours/dpligsd/)
|
|
||||||
unlike Ledger. ([Include](journal.html#including-other-files) a separate timeclock file instead.)
|
|
||||||
|
|
||||||
### Future ?
|
|
||||||
|
|
||||||
There is a [ledger4](https://github.com/ledger/ledger4) repo on
|
|
||||||
github; this is John's 2012/2013 rewrite of some parts of Ledger 3,
|
|
||||||
including the parser, in Haskell. We have a plan to add this parser to
|
|
||||||
hledger in 2015/2016, increasing its ability to read Ledger's files.
|
|
||||||
|
|
||||||
|
|
||||||
## UI surprises
|
|
||||||
|
|
||||||
### Why does it complain about missing amounts even though I wrote one ?
|
|
||||||
|
|
||||||
This is an easy mistake at first. This journal entry:
|
|
||||||
```journal
|
|
||||||
1/1
|
|
||||||
a 1
|
|
||||||
b
|
|
||||||
```
|
|
||||||
will give a parse error (`...can't have more than one real posting with no amount...`).
|
|
||||||
|
|
||||||
There must always be at least two spaces between the account name and amount. So instead, it should be:
|
|
||||||
```journal
|
|
||||||
1/1
|
|
||||||
a 1
|
|
||||||
b
|
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
### Why do some amounts appear on their own line with no account name ?
|
|
||||||
|
|
||||||
When hledger needs to show a multi-commodity amount, each commodity is displayed on its own line, one above the other (like Ledger).
|
|
||||||
|
|
||||||
Here are some examples. With this journal, the implicit balancing amount drawn from the `b` account will be a multicommodity amount (a euro and a dollar):
|
|
||||||
```journal
|
|
||||||
2015/1/1
|
|
||||||
a EUR 1
|
|
||||||
a USD 1
|
|
||||||
b
|
|
||||||
```
|
|
||||||
the `print` command shows the `b` posting's amount on two lines, bottom-aligned:
|
|
||||||
```shell
|
|
||||||
$ hledger -f t.j print
|
|
||||||
2015/01/01
|
|
||||||
a USD 1
|
|
||||||
a EUR 1
|
|
||||||
EUR -1 ; <-
|
|
||||||
b USD -1 ; <- a euro and a dollar is drawn from b
|
|
||||||
```
|
|
||||||
the `balance` command shows that both `a` and `b` have a multi-commodity balance (again, bottom-aligned):
|
|
||||||
```shell
|
|
||||||
$ hledger -f t.j balance
|
|
||||||
EUR 1 ; <-
|
|
||||||
USD 1 a ; <- a's balance is a euro and a dollar
|
|
||||||
EUR -1 ; <-
|
|
||||||
USD -1 b ; <- b's balance is a negative euro and dollar
|
|
||||||
--------------------
|
|
||||||
0
|
|
||||||
```
|
|
||||||
while the `register` command shows (top-aligned, this time!) a multi-commodity running total after the second posting,
|
|
||||||
and a multi-commodity amount in the third posting:
|
|
||||||
```shell
|
|
||||||
$ hledger -f t.j register --width 50
|
|
||||||
2015/01/01 a EUR 1 EUR 1
|
|
||||||
a USD 1 EUR 1 ; <- the running total is now a euro and a dollar
|
|
||||||
USD 1 ;
|
|
||||||
b EUR -1 ; <- the amount posted to b is a negative euro and dollar
|
|
||||||
USD -1 0 ;
|
|
||||||
```
|
|
||||||
|
|
||||||
Newer reports like [multi-column balance reports](manual.html#multicolumn-balance-reports) show multi-commodity amounts on one line instead, comma-separated.
|
|
||||||
Although wider, this seems clearer and we should probably use it more:
|
|
||||||
```shell
|
|
||||||
$ hledger -f t.j balance --yearly
|
|
||||||
Balance changes in 2015:
|
|
||||||
|
|
||||||
|| 2015
|
|
||||||
===++================
|
|
||||||
a || EUR 1, USD 1
|
|
||||||
b || EUR -1, USD -1
|
|
||||||
---++----------------
|
|
||||||
|| 0
|
|
||||||
```
|
|
||||||
|
|
||||||
You will also see amounts without a corresponding account name if you remove too many account name segments with [`--drop`](manual.html#balance):
|
|
||||||
```shell
|
|
||||||
$ hledger -f t.j balance --drop 1
|
|
||||||
EUR 1
|
|
||||||
USD 1
|
|
||||||
EUR -1
|
|
||||||
USD -1
|
|
||||||
--------------------
|
|
||||||
0
|
|
||||||
```
|
|
||||||
@ -1,145 +0,0 @@
|
|||||||
# Track investments
|
|
||||||
|
|
||||||
You can use hledger to track stock investments.
|
|
||||||
In fact, the double-entry accounting is flexible enough to support most constellations you will come across.
|
|
||||||
However, you may find that some transactions could be better supported.
|
|
||||||
Caveats are:
|
|
||||||
- hledger does not validate the cost basis during a sale.
|
|
||||||
- historical mark-to-market performance is not supported
|
|
||||||
(but the market value at one instant, like today, can be calculated)
|
|
||||||
|
|
||||||
## Example
|
|
||||||
### Buying a stock
|
|
||||||
|
|
||||||
Let's go over a simple example using [prices](/journal.html#prices):
|
|
||||||
|
|
||||||
```journal
|
|
||||||
2017/1/1 opening balance
|
|
||||||
(assets:depot) $3000
|
|
||||||
|
|
||||||
2017/1/2 buy shares at $200
|
|
||||||
; let's assume no fees
|
|
||||||
assets:shares 10 TSLA @ $200 ; transaction/purchase price
|
|
||||||
assets:depot
|
|
||||||
|
|
||||||
```
|
|
||||||
|
|
||||||
Some reports.
|
|
||||||
We start with $3000.
|
|
||||||
After the 1/2 purchase, we have $1000 remaining and 10 TSLA shares:
|
|
||||||
```shell
|
|
||||||
$ hledger -f t.j bal --flat -HD
|
|
||||||
Ending balances (historical) in 2017/01/01-2017/01/02:
|
|
||||||
|
|
||||||
|| 2017/01/01 2017/01/02
|
|
||||||
===============++============================
|
|
||||||
assets:depot || $3000 $1000
|
|
||||||
assets:shares || 0 10 TSLA
|
|
||||||
---------------++----------------------------
|
|
||||||
|| $3000 $1000, 10 TSLA
|
|
||||||
```
|
|
||||||
|
|
||||||
Show the shares' value at cost, with [`-B/--cost`](/hledger.html#reporting-options):
|
|
||||||
```shell
|
|
||||||
$ hledger -f t.j bal --flat -HD -B
|
|
||||||
Ending balances (historical) in 2017/01/01-2017/01/02:
|
|
||||||
|
|
||||||
|| 2017/01/01 2017/01/02
|
|
||||||
===============++=========================
|
|
||||||
assets:depot || $3000 $1000
|
|
||||||
assets:shares || 0 $2000
|
|
||||||
---------------++-------------------------
|
|
||||||
|| $3000 $3000
|
|
||||||
```
|
|
||||||
|
|
||||||
## Value reporting
|
|
||||||
Add the following to the journal file.
|
|
||||||
```journal
|
|
||||||
; market price, has jumped since yesterday's purchase!
|
|
||||||
P 2017/1/3 TSLA $250
|
|
||||||
```
|
|
||||||
|
|
||||||
Show the shares's value using the latest applicable market price,
|
|
||||||
with [`-V/--value`](/hledger.html#market-value).
|
|
||||||
A $500 capital gain is apparent in the totals:
|
|
||||||
```shell
|
|
||||||
$ hledger -f t.j bal --flat -HD -V
|
|
||||||
Ending balances (historical) in 2017/01/01-2017/01/02:
|
|
||||||
|
|
||||||
|| 2017/01/01 2017/01/02
|
|
||||||
===============++=========================
|
|
||||||
assets:depot || $3000 $1000
|
|
||||||
assets:shares || 0 $2500
|
|
||||||
---------------++-------------------------
|
|
||||||
|| $3000 $3500
|
|
||||||
```
|
|
||||||
|
|
||||||
There are still limitations in the value reporting that hledger can currently do.
|
|
||||||
More information can be found in [Github issue #131](https://github.com/simonmichael/hledger/issues/131) and [Github issue #329](https://github.com/simonmichael/hledger/issues/329).
|
|
||||||
|
|
||||||
You may want to investigate the output after adding more prices to the journal file.
|
|
||||||
```journal
|
|
||||||
P 2017/1/1 TSLA $210
|
|
||||||
P 2017/1/4 TSLA $250
|
|
||||||
P 2017/1/8 TSLA $270
|
|
||||||
```
|
|
||||||
|
|
||||||
### Selling a stock and tracking capital gains
|
|
||||||
At some point you will probably sell shares.
|
|
||||||
It may seem intuitive to model such a sale as follows.
|
|
||||||
```journal
|
|
||||||
2017/1/4 sell shares at $250 ; NOTE: You probably want to model capital gains too; see below
|
|
||||||
assets:shares -10 TSLA @ $250 ; sell price
|
|
||||||
assets:depot
|
|
||||||
```
|
|
||||||
|
|
||||||
This leads to the following evolution
|
|
||||||
```shell
|
|
||||||
hledger -f t.j balance --flat -HD
|
|
||||||
Ending balances (historical) in 2017/01/01-2017/01/04:
|
|
||||||
|
|
||||||
|| 2017/01/01 2017/01/02 2017/01/03 2017/01/04
|
|
||||||
===============++=======================================================
|
|
||||||
assets:depot || $3000 $1000 $1000 $3500
|
|
||||||
assets:shares || 0 10 TSLA 10 TSLA 0
|
|
||||||
---------------++-------------------------------------------------------
|
|
||||||
|| $3000 $1000, 10 TSLA $1000, 10 TSLA $3500
|
|
||||||
```
|
|
||||||
|
|
||||||
You end up with the correct amount in your depot.
|
|
||||||
At some point, however, you will have to report the capital gain that you realized with your sale.
|
|
||||||
This gain is currently invisible.
|
|
||||||
In fact, we have violated the double-entry principle and created money out of nowhere.
|
|
||||||
|
|
||||||
Let's report our sale in a different way.
|
|
||||||
```journal
|
|
||||||
2017/1/4 sell shares at $250
|
|
||||||
assets:shares -10 TSLA @ $200 ; cost basis (must be tracked by user!)
|
|
||||||
assets:depot $2500 ; cash proceeds
|
|
||||||
revenue:capital_gains ; deduce profit
|
|
||||||
```
|
|
||||||
|
|
||||||
Now, the new $500 are correctly balanced with the capital gains account.
|
|
||||||
```shell
|
|
||||||
hledger -f t.j balance --flat -HD
|
|
||||||
Ending balances (historical) in 2017/01/01-2017/01/04:
|
|
||||||
|
|
||||||
|| 2017/01/01 2017/01/02 2017/01/03 2017/01/04
|
|
||||||
=======================++=======================================================
|
|
||||||
assets:depot || $3000 $1000 $1000 $3500
|
|
||||||
assets:shares || 0 10 TSLA 10 TSLA 0
|
|
||||||
revenue:capital_gains || 0 0 0 $-500
|
|
||||||
-----------------------++-------------------------------------------------------
|
|
||||||
|| $3000 $1000, 10 TSLA $1000, 10 TSLA $3000
|
|
||||||
```
|
|
||||||
|
|
||||||
## Further reading
|
|
||||||
|
|
||||||
- Beancount guides (general double-entry accounting advice from another tool)
|
|
||||||
- [Cookbook][beancount_cookbook]: Account naming, basic trading transactions
|
|
||||||
- [Trading guide][beancount_trading]: More complicated trading transactions, discussion on tricky cost basis adjustments
|
|
||||||
- [Github #624 on investment tracking](https://github.com/simonmichael/hledger/issues/624)
|
|
||||||
- [Discussion on investment modeling from the mailing list](https://groups.google.com/forum/#!topic/hledger/e8Ss7ZL4ADI)
|
|
||||||
|
|
||||||
[beancount_cookbook]: http://furius.ca/beancount/doc/cookbook
|
|
||||||
[beancount_trading]: http://furius.ca/beancount/doc/trading
|
|
||||||
@ -1,124 +0,0 @@
|
|||||||
<style>
|
|
||||||
#toc > ol > li > a { display:none; }
|
|
||||||
#toc > ol > li > ol > li { padding-left:0; }
|
|
||||||
</style>
|
|
||||||
* toc
|
|
||||||
|
|
||||||
# More docs...
|
|
||||||
|
|
||||||
Most of this has been contributed to the new **[plaintextaccounting.org](http://plaintextaccounting.org)** site,
|
|
||||||
but not yet eg the [accounting](#accounting) links.
|
|
||||||
|
|
||||||
## Blog posts & articles
|
|
||||||
|
|
||||||
- Simon Michael:
|
|
||||||
[Introducing hledger!](http://joyful.com/blog/2013-10-18-introducing-hledger.html),
|
|
||||||
[More on ledger](http://joyful.com/blog/2013-10-19-more-on-ledger.html),
|
|
||||||
[What is hledger ?](http://joyful.com/blog/2013-10-20-what-is-hledger.html),
|
|
||||||
[more...](http://joyful.com/tags/hledger.html) 2013-
|
|
||||||
- [Joey Hess: hledger](http://joeyh.name/blog/entry/hledger) 2012
|
|
||||||
- [Magnus Henoch: monspuraj programoj](http://חנוך.se/diary/monspuraj_programoj/index.eo.html) ([english](http://translate.google.com/translate?hl=en&sl=eo&u=http://xn--9dbdkw.se/diary/monspuraj_programoj/index.eo.html)) 2012
|
|
||||||
- [Sascha Welter: Doing my own accounting](http://betabug.ch/blogs/ch-athens/1221) 2011
|
|
||||||
- [Clint Adams: Accounting at SFLC](http://www.softwarefreedom.org/blog/2011/sep/07/accounting-at-sflc/) 2011
|
|
||||||
- [Christine Spang: [h]ledger rocks my world](http://blog.spang.cc/posts/hledger_rocks_my_world/) 2010
|
|
||||||
- [Roman Cheplyaka: hledger](http://ro-che.blogspot.com/2010/02/hledger.html) 2010
|
|
||||||
- [Fabrice Niessen on Ledger, hledger, beancount, CSV2Ledger](http://www.mygooglest.com/fni/ledger.html) 2010
|
|
||||||
- [советы: Ledger — бухучёт в командной строке](http://s.arboreus.com/2009/05/personal-accounting-in-command-line.html) ([english](http://translate.google.com/translate?hl=en&sl=ru&u=http://s.arboreus.com/2009/05/personal-accounting-in-command-line.html)) 2009
|
|
||||||
|
|
||||||
- Hacker News mentions:\
|
|
||||||
[Hledger – Double-entry accounting from the Unix tools perspective (2012)](https://news.ycombinator.com/item?id=8806056) 2014\
|
|
||||||
[Ledger, a powerful CLI accounting tool](https://news.ycombinator.com/item?id=7707262) 2014\
|
|
||||||
[Command Line Accounting With Ledger and Reckon](https://news.ycombinator.com/item?id=5233255) 2013\
|
|
||||||
[Ledger: Command-line double-entry accounting](https://news.ycombinator.com/item?id=872244) 2009
|
|
||||||
|
|
||||||
## Related info
|
|
||||||
|
|
||||||
John Wiegley's [Ledger](http://www.ledger-cli.org/) inspired hledger.
|
|
||||||
Here are some good intros, which also serve as a good orientation for hledger:
|
|
||||||
|
|
||||||
- [Ledger CLI Accounting for Geeks](http://blog.loadingdata.nl/accounting-for-geeks/#/) slides by Daniël Bos, 2014
|
|
||||||
(press space to advance)
|
|
||||||
- [ledger basics and habits](http://matthewturland.com/2014/03/29/ledger-basics-and-habits/) blog post by Matthew Turland, 2014
|
|
||||||
- [Hacking Your Finances for Fun and Profit](http://matthewturland.com/slides/ledger-stats/) slides by Matthew Turland, 2013
|
|
||||||
- [The accounting quest: Ledger](http://lwn.net/Articles/501681/) LWN.net, 2012
|
|
||||||
- [Ledger: Command-line double-entry accounting](https://news.ycombinator.com/item?id=872244) Hacker News discussion, 2009
|
|
||||||
- [Ledger's informative manual](http://ledger-cli.org/3.0/doc/ledger3.html),
|
|
||||||
and the [Ledger wiki](http://wiki.ledger-cli.org)
|
|
||||||
- [Non-Profit Accounting With Ledger CLI, A Tutorial](https://gitorious.org/ledger/npo-ledger-cli/source/npo-ledger-cli-tutorial.md)
|
|
||||||
describes Software Freedom Conservancy's setup, 2013
|
|
||||||
|
|
||||||
Martin Blais' [beancount](http://furius.ca/beancount/) is another Ledger-inspired tool, written in Python.
|
|
||||||
It has good [documentation](http://furius.ca/beancount/doc/index), some of which may be useful to hledger users:
|
|
||||||
|
|
||||||
- Command-line Accounting in Context
|
|
||||||
- The Double-Entry Counting Method
|
|
||||||
- [Command-line Accounting Cookbook](http://furius.ca/beancount/doc/cookbook) example real-world journal entries
|
|
||||||
- A Comparison of Beancount and Ledger & HLedger
|
|
||||||
|
|
||||||
See also the two Twitter feeds:
|
|
||||||
|
|
||||||
- <a href="https://twitter.com/LedgerTips">@LedgerTips</a> Tips and tricks for Ledger, hledger, beancount, etc.
|
|
||||||
- [#ledgercli](https://twitter.com/search?q=%23ledgercli&src=typd&f=realtime) Search for latest mentions of the `#ledgercli` hash tag
|
|
||||||
|
|
||||||
## Accounting
|
|
||||||
|
|
||||||
-
|
|
||||||
[Accounting](http://en.wikipedia.org/wiki/Accounting),
|
|
||||||
[Bookkeeping](http://en.wikipedia.org/wiki/Bookkeeping),
|
|
||||||
[Double-entry bookkeeping system](http://en.wikipedia.org/wiki/Double_entry_bookkeeping_system),
|
|
||||||
[General journal](http://en.wikipedia.org/wiki/General_journal)
|
|
||||||
etc. at Wikipedia
|
|
||||||
- [Accounting For Dragons](http://podcastle.org/2009/10/09/pc-miniature-38-accounting-for-dragons) why you should know accounting
|
|
||||||
- [Bean Counter](http://www.dwmbeancounter.com/) - tutorials, such as
|
|
||||||
[So, you want to learn Bookkeeping!](http://www.dwmbeancounter.com/tutorial/Tutorial.html).
|
|
||||||
This has been recommended on the ledger list.
|
|
||||||
- [Accounting Basics](http://www.accountingverse.com/accounting-basics/)
|
|
||||||
- [Guru 99 Accounting Tutorials](http://www.guru99.com/accounting.html)
|
|
||||||
- [principlesofaccounting.com](http://www.principlesofaccounting.com)
|
|
||||||
- [Double Entry Bookkeeping](http://c2.com/cgi/wiki?DoubleEntryBookkeeping) discussion by software developers at the WikiWikiWeb
|
|
||||||
- [The Vanished Grandeur of Accounting](http://www.bostonglobe.com/ideas/2014/06/07/the-vanished-grandeur-accounting/3zcbRBoPDNIryWyNYNMvbO/story.html) (Boston Globe) & [discussion](https://news.ycombinator.com/item?id=7933746)
|
|
||||||
- [Winning Financially is Simple](http://directory.libsyn.com/episode/index/show/youneedabudget/id/2657122) and other good episodes from the [YNAB Podcast](http://directory.libsyn.com/shows/view/id/youneedabudget)
|
|
||||||
- [Back to the Stone Age: Low-Tech Expense Tracking](http://www.getrichslowly.org/blog/2011/02/28/back-to-the-stone-age-low-tech-expense-tracking/) Get Rich Slowly
|
|
||||||
- [Track Every Penny You Spend](http://www.getrichslowly.org/blog/2006/09/22/track-every-penny-you-spend/) Get Rich Slowly
|
|
||||||
- [I’ve Tracked My Expenses — Now What?](http://www.getrichslowly.org/blog/2011/04/08/ask-the-readers-ive-tracked-my-expenses-now-what/) Get Rich Slowly
|
|
||||||
- [A Slow-Tech Approach to Tracking Spending](http://mobile.nytimes.com/2014/05/12/your-money/household-budgeting/a-slow-tech-approach-to-tracking-spending.html)
|
|
||||||
- [Your Financial Network Map](http://www.bargaineering.com/articles/financial-network-map.html)
|
|
||||||
- [The Accountancy Model and The Accountancy Model Examples](http://timriley.net/appahost/accountancy_model.html) - two free books by Tim Riley
|
|
||||||
- [Gnucash and double entry accounting](http://www.austintek.com/gnucash/ncsa-gnucash-talk.html) - double entry accounting introduction with examples
|
|
||||||
- [Accounting for Computer Scientists](http://martin.kleppmann.com/2011/03/07/accounting-for-computer-scientists.html)
|
|
||||||
- [Closing Entries](http://www.cliffsnotes.com/more-subjects/accounting/accounting-principles-i/completion-of-the-accounting-cycle/closing-entries)
|
|
||||||
- [Tutorial on multiple currency accounting](http://www.mscs.dal.ca/~selinger/accounting/tutorial.html) by Peter Selinger
|
|
||||||
|
|
||||||
## hledger add-ons
|
|
||||||
|
|
||||||
- [hledger-interest](http://hackage.haskell.org/package/hledger-interest) generates various kinds of interest transaction
|
|
||||||
- [hledger-irr](http://hackage.haskell.org/package/hledger-irr) reports internal rate of return (effective interest rate)
|
|
||||||
- [ledger-autosync](https://bitbucket.org/egh/ledger-autosync) downloads/converts/deduplicates OFX data
|
|
||||||
- [hledger-chart](http://hackage.haskell.org/package/hledger-chart) generates simple pie charts (unmaintained)
|
|
||||||
- [hledger-vty](http://hackage.haskell.org/package/hledger-vty) a simple curses-style UI (unmaintained)
|
|
||||||
- More in [bin/](https://github.com/simonmichael/hledger/tree/master/bin/)
|
|
||||||
|
|
||||||
## Scripting examples
|
|
||||||
|
|
||||||
- <https://gist.github.com/4172604> printing average expenses by month
|
|
||||||
- <https://gist.github.com/4210558> calculating historical account balances
|
|
||||||
- More in [bin/](https://github.com/simonmichael/hledger/tree/master/bin/)
|
|
||||||
|
|
||||||
## Similar projects
|
|
||||||
|
|
||||||
In addition to hledger and Ledger, there are other [Ledger ports](ledgerwiki>Ports) and Ledger-likes, incompatible but similar in concept:
|
|
||||||
|
|
||||||
- Martin Blais' [beancount](https://furius.ca/beancount/) (python)
|
|
||||||
- Harshad RJ's [Abandon](https://github.com/hrj/abandon) (scala)
|
|
||||||
- dimonf's [ledger.pl](https://github.com/dimonf/ledger.pl) (perl)
|
|
||||||
- Omari Norman's [penny](https://github.com/massysett/penny) (haskell)
|
|
||||||
- Uwe Hollerbach's [umm](http://hackage.haskell.org/package/UMM) (haskell)
|
|
||||||
|
|
||||||
Other things of interest:
|
|
||||||
|
|
||||||
- [bill](http://darcsden.com/alex/bill), [bill-atomo](http://darcsden.com/alex/bill-atomo) - small time-tracking and billing app
|
|
||||||
- [debts](http://darcsden.com/ozamosi/debts) - small debt tracking web app
|
|
||||||
- [housetab-multi](http://darcsden.com/dbp/housetab-multi), [housetab.org](http://housetab.org) - a web app to manage expenses between a group of friends
|
|
||||||
- [You Need A Budget](http://www.youneedabudget.com/)
|
|
||||||
- Software Freedom Conservancy's [npo-acct](http://npoacct.sfconservancy.org) project
|
|
||||||
|
|
||||||
@ -1,68 +0,0 @@
|
|||||||
# Project accounting
|
|
||||||
|
|
||||||
Some ways to track small business/freelancer activity - orders, budgets, invoices, payments..
|
|
||||||
|
|
||||||
## Accrual method
|
|
||||||
|
|
||||||
Revenue is declared when work is performed:
|
|
||||||
|
|
||||||
```journal
|
|
||||||
; budget:* - virtual accounts tracking what customers have committed
|
|
||||||
; to pay for various things. Should not go below 0.
|
|
||||||
2017/10/30 Order from CUSTOMER (order id)
|
|
||||||
(budget:CUSTOMER:PROJECT_ID:pos1) 1000
|
|
||||||
(budget:CUSTOMER:PROJECT_ID:pos2) 3000
|
|
||||||
|
|
||||||
; some work was done on pos1 and pos2, invoice for it.
|
|
||||||
; Using accrual accounting method
|
|
||||||
; (revenue is declared when work is done, ~= when invoiced)
|
|
||||||
2017/10/31 Invoice (invoice id) - (PROJECT_ID)
|
|
||||||
(budget:CUSTOMER:PROJECT_ID:pos1) -500 ; update project budget
|
|
||||||
(budget:CUSTOMER:PROJECT_ID:pos2) -1000
|
|
||||||
assets:receivable:CUSTOMER:PROJECT_ID:pos1 500
|
|
||||||
assets:receivable:CUSTOMER:PROJECT_ID:pos2 1000
|
|
||||||
revenues:CUSTOMER
|
|
||||||
(liabilities:tax:federal) -150 ; note tax due, eg 15% of revenue
|
|
||||||
|
|
||||||
; a customer payment is received
|
|
||||||
2017/11/15 Payment for INVOICE_ID
|
|
||||||
assets:receivable:CUSTOMER:PROJECT_ID:pos1 -500
|
|
||||||
assets:receivable:CUSTOMER:PROJECT_ID:pos2 -1000
|
|
||||||
assets:bank:checking
|
|
||||||
|
|
||||||
; make a tax payment
|
|
||||||
2018/4/15 Pay taxes due from 2017
|
|
||||||
liabilities:tax:federal 5000
|
|
||||||
assets:bank:checking
|
|
||||||
```
|
|
||||||
|
|
||||||
## Cash method
|
|
||||||
|
|
||||||
Revenue is declared when payment is received:
|
|
||||||
|
|
||||||
```journal
|
|
||||||
2017/10/30 Order from CUSTOMER (order id)
|
|
||||||
(budget:CUSTOMER:PROJECT_ID:pos1) 1000
|
|
||||||
(budget:CUSTOMER:PROJECT_ID:pos2) 3000
|
|
||||||
|
|
||||||
; record an invoice sent. Not a real transaction in cash accounting,
|
|
||||||
; but we can balance it with the project budget as shown:
|
|
||||||
2017/10/31 Invoice (invoice id) - (PROJECT_ID)
|
|
||||||
budget:CUSTOMER:PROJECT_ID:pos1 -500
|
|
||||||
assets:receivable:CUSTOMER:PROJECT_ID:pos1 500
|
|
||||||
budget:CUSTOMER:PROJECT_ID:pos2 -1000
|
|
||||||
assets:receivable:CUSTOMER:PROJECT_ID:pos2 1000
|
|
||||||
|
|
||||||
; receive payment. Cash basis, so revenue declared here.
|
|
||||||
2017/11/15 Payment for INVOICE_ID
|
|
||||||
(assets:receivable:CUSTOMER:PROJECT_ID:pos1) -500
|
|
||||||
(assets:receivable:CUSTOMER:PROJECT_ID:pos2) -1000
|
|
||||||
revenues:CUSTOMER -1500
|
|
||||||
(liabilities:tax:federal) -150 ; note tax due, eg 15% of revenue
|
|
||||||
assets:bank:checking
|
|
||||||
|
|
||||||
; make a tax payment
|
|
||||||
2018/4/15 Pay taxes due from 2017
|
|
||||||
liabilities:tax:federal 5000
|
|
||||||
assets:bank:checking
|
|
||||||
```
|
|
||||||
@ -1,61 +0,0 @@
|
|||||||
# Start a journal
|
|
||||||
|
|
||||||
## by hand
|
|
||||||
|
|
||||||
(power users)
|
|
||||||
|
|
||||||
The simplest possible journal is just an empty file:\
|
|
||||||
`echo >2017.journal`
|
|
||||||
|
|
||||||
The name doesn't matter much and can be changed later.
|
|
||||||
One file per year is common,
|
|
||||||
and so is a `.journal` or `.hledger` extension.
|
|
||||||
|
|
||||||
Record a transaction, using [journal format](/journal.html):
|
|
||||||
```shell
|
|
||||||
$ cat >>2017.journal
|
|
||||||
2017/1/26
|
|
||||||
expenses:food $10
|
|
||||||
assets:cash
|
|
||||||
<CTRL-D>
|
|
||||||
```
|
|
||||||
|
|
||||||
[Account names](/journal.html#account-names) can be anything
|
|
||||||
and you can change them later by search and replace.
|
|
||||||
If you don't know what to [choose](http://plaintextaccounting.org/#choosing-accounts),
|
|
||||||
start with these five:\
|
|
||||||
`expenses`, `income`, `assets`, `liabilities`, and `equity`,\
|
|
||||||
perhaps with one extra subcategory as above.
|
|
||||||
|
|
||||||
## by text editor
|
|
||||||
|
|
||||||
Write transactions in a [text editor](/journal.html#editor-support) and save the file.
|
|
||||||
|
|
||||||
## by add
|
|
||||||
|
|
||||||
Use the [add](/hledger.html#add) command:\
|
|
||||||
`hledger add -f 2017.journal`\
|
|
||||||
enter one or more transactions
|
|
||||||
|
|
||||||
## set `LEDGER_FILE`
|
|
||||||
|
|
||||||
To avoid typing `-f FILE` every time, set the
|
|
||||||
[`LEDGER_FILE` environment variable](/hledger.html#input-files). Eg:\
|
|
||||||
`echo "export LEDGER_FILE=~/finance/2017.journal" >> ~/.bash_profile && source ~/.bash_profile`
|
|
||||||
|
|
||||||
Most examples here assume you have done this.
|
|
||||||
|
|
||||||
## by hledger-iadd
|
|
||||||
|
|
||||||
ensure $LEDGER_FILE exists\
|
|
||||||
`hledger iadd`\
|
|
||||||
enter one or more transactions
|
|
||||||
|
|
||||||
## by hledger-web
|
|
||||||
|
|
||||||
ensure $LEDGER_FILE exists\
|
|
||||||
`hledger web`\
|
|
||||||
wait for web browser to open\
|
|
||||||
click "add transaction" or press "a"\
|
|
||||||
enter a transaction, click ok or press enter
|
|
||||||
|
|
||||||
@ -1,697 +0,0 @@
|
|||||||
<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](contributing.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).
|
|
||||||
Only one missing amount is allowed in each transaction.
|
|
||||||
`add` uses the same convention when it writes an entry.
|
|
||||||
(To see all such inferred amounts in full, you can use `hledger print -x`.)
|
|
||||||
|
|
||||||
### 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 2015/5/26:
|
|
||||||
```shell
|
|
||||||
$ hledger balance date:2015/5/26
|
|
||||||
$-5 assets
|
|
||||||
$5 expenses
|
|
||||||
--------------------
|
|
||||||
0
|
|
||||||
```
|
|
||||||
|
|
||||||
As you can see from this, `balance` does not necessarily report
|
|
||||||
real-world account balances; 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.
|
|
||||||
|
|
||||||
-->
|
|
||||||
|
|
||||||
<!-- TODO make date-independent -->
|
|
||||||
@ -1,26 +0,0 @@
|
|||||||
# Track changes with version control
|
|
||||||
|
|
||||||
You don't need to do this, but it's a nice way to keep track of changes to your data.
|
|
||||||
|
|
||||||
## git
|
|
||||||
|
|
||||||
Start tracking changes:\
|
|
||||||
`git init && git add 2017.journal && git commit 2017.journal -m "first commit"`
|
|
||||||
|
|
||||||
View uncommitted changes: `git status`, `git diff`
|
|
||||||
|
|
||||||
Commit changes: `git commit 2017.journal -m "updates"`
|
|
||||||
|
|
||||||
View past commits: `git log`
|
|
||||||
|
|
||||||
## darcs
|
|
||||||
|
|
||||||
`darcs init && darcs add 2017.journal && darcs record 2017.journal -m "first commit"`
|
|
||||||
|
|
||||||
`darcs whatsnew`, `darcs diff`
|
|
||||||
|
|
||||||
`darcs record 2017.journal -m "updates"`
|
|
||||||
|
|
||||||
`darcs log`
|
|
||||||
|
|
||||||
## etc.
|
|
||||||
Loading…
Reference in New Issue
Block a user