;regen manuals

This commit is contained in:
Simon Michael 2020-05-25 17:49:01 -07:00
parent 798a2c8674
commit 9417ee625e
22 changed files with 1963 additions and 1234 deletions

View File

@ -4,4 +4,4 @@ m4_dnl Program version. Updated by make setversion.
m4_define({{_version_}}, {{1.17.99}})m4_dnl m4_define({{_version_}}, {{1.17.99}})m4_dnl
m4_dnl m4_dnl
m4_dnl Date to show in man pages. Updated by make setdate. m4_dnl Date to show in man pages. Updated by make setdate.
m4_define({{_monthyear_}}, {{March 2020}})m4_dnl m4_define({{_monthyear_}}, {{May 2020}})m4_dnl

View File

@ -1,6 +1,6 @@
.\"t .\"t
.TH "hledger_csv" "5" "March 2020" "hledger 1.17.99" "hledger User Manuals" .TH "hledger_csv" "5" "May 2020" "hledger 1.17.99" "hledger User Manuals"
@ -19,7 +19,7 @@ file\f[R].
By default this is named like the CSV file with a \f[C].rules\f[R] By default this is named like the CSV file with a \f[C].rules\f[R]
extension added. extension added.
Eg when reading \f[C]FILE.csv\f[R], hledger also looks for Eg when reading \f[C]FILE.csv\f[R], hledger also looks for
\f[C]FILE.csv.rules\f[R] in the same directory. \f[C]FILE.csv.rules\f[R] in the same directory as \f[C]FILE.csv\f[R].
You can specify a different rules file with the \f[C]--rules-file\f[R] You can specify a different rules file with the \f[C]--rules-file\f[R]
option. option.
If a rules file is not found, hledger will create a sample rules file, If a rules file is not found, hledger will create a sample rules file,
@ -489,8 +489,8 @@ transaction\[aq]s first line.
.SS Posting field names .SS Posting field names
.SS account .SS account
.PP .PP
\f[C]accountN\f[R], where N is 1 to 9, causes a posting to be generated, \f[C]accountN\f[R], where N is 1 to 99, causes a posting to be
with that account name. generated, with that account name.
.PP .PP
Most often there are two postings, so you\[aq]ll want to set Most often there are two postings, so you\[aq]ll want to set
\f[C]account1\f[R] and \f[C]account2\f[R]. \f[C]account1\f[R] and \f[C]account2\f[R].
@ -504,14 +504,30 @@ below), a default account name will be chosen (like
.SS amount .SS amount
.PP .PP
\f[C]amountN\f[R] sets posting N\[aq]s amount. \f[C]amountN\f[R] sets posting N\[aq]s amount.
If the CSV uses separate fields for debit and credit amounts, you can If the CSV uses separate fields for inflows and outflows, you can use
use \f[C]amountN-in\f[R] and \f[C]amountN-out\f[R] instead. \f[C]amountN-in\f[R] and \f[C]amountN-out\f[R] instead.
By assigning to \f[C]amount1\f[R], \f[C]amount2\f[R], ...
etc.
you can generate anywhere from 0 to 99 postings.
.PP .PP
Also, for compatibility with hledger <1.17: \f[C]amount\f[R] or There is also an older, unnumbered form of these names, suitable for
\f[C]amount-in\f[R]/\f[C]amount-out\f[R] with no number sets the amount 2-posting transactions, which sets both posting 1\[aq]s and (negated)
for postings 1 and 2. posting 2\[aq]s amount: \f[C]amount\f[R], or \f[C]amount-in\f[R] and
For posting 2 the amount is negated, and converted to cost if \f[C]amount-out\f[R].
there\[aq]s a transaction price. This is still supported because it keeps pre-hledger-1.17 csv rules
files working, and because it can be more succinct, and because it
converts posting 2\[aq]s amount to cost if there\[aq]s a transaction
price, which can be useful.
.PP
If you have an existing rules file using the unnumbered form, you might
want to use the numbered form in certain conditional blocks, without
having to update and retest all the old rules.
To facilitate this, posting 1 ignores
\f[C]amount\f[R]/\f[C]amount-in\f[R]/\f[C]amount-out\f[R] if any of
\f[C]amount1\f[R]/\f[C]amount1-in\f[R]/\f[C]amount1-out\f[R] are
assigned, and posting 2 ignores them if any of
\f[C]amount2\f[R]/\f[C]amount2-in\f[R]/\f[C]amount2-out\f[R] are
assigned, avoiding conflicts.
.SS currency .SS currency
.PP .PP
If the CSV has the currency symbol in a separate field (ie, not part of If the CSV has the currency symbol in a separate field (ie, not part of
@ -620,13 +636,19 @@ REGEX
.PP .PP
REGEX is a case-insensitive regular expression which tries to match REGEX is a case-insensitive regular expression which tries to match
anywhere within the CSV record. anywhere within the CSV record.
It is a POSIX extended regular expressions with some additions (see It is a POSIX ERE (extended regular expression) that also supports GNU
Regular expressions in the hledger manual). word boundaries (\f[C]\[rs]b\f[R], \f[C]\[rs]B\f[R], \f[C]\[rs]<\f[R],
Note: the \[dq]CSV record\[dq] it is matched against is not the original \f[C]\[rs]>\f[R]), and nothing else.
record, but a synthetic one, with enclosing double quotes or whitespace If you have trouble, be sure to check our
removed, and always comma-separated. https://hledger.org/hledger.html#regular-expressions doc.
(Eg, an SSV record \f[C]2020-01-01; \[dq]Acme, Inc.\[dq]; 1,000\f[R] .PP
appears to REGEX as \f[C]2020-01-01,Acme, Inc.,1,000\f[R]). Important note: the record that is matched is not the original record,
but a synthetic one, with any enclosing double quotes (but not enclosing
whitespace) removed, and always comma-separated (which means that a
field containing a comma will appear like two fields).
Eg, if the original record is
\f[C]2020-01-01; \[dq]Acme, Inc.\[dq]; 1,000\f[R], the REGEX will
actually see \f[C]2020-01-01,Acme, Inc., 1,000\f[R]).
.PP .PP
Or, MATCHER can be a field matcher, like this: Or, MATCHER can be a field matcher, like this:
.IP .IP

View File

@ -16,9 +16,9 @@ CSV output.)
We describe each CSV file's format with a corresponding _rules file_. We describe each CSV file's format with a corresponding _rules file_.
By default this is named like the CSV file with a '.rules' extension By default this is named like the CSV file with a '.rules' extension
added. Eg when reading 'FILE.csv', hledger also looks for added. Eg when reading 'FILE.csv', hledger also looks for
'FILE.csv.rules' in the same directory. You can specify a different 'FILE.csv.rules' in the same directory as 'FILE.csv'. You can specify a
rules file with the '--rules-file' option. If a rules file is not different rules file with the '--rules-file' option. If a rules file is
found, hledger will create a sample rules file, which you'll need to not found, hledger will create a sample rules file, which you'll need to
adjust. adjust.
This file contains rules describing the CSV data (header line, fields This file contains rules describing the CSV data (header line, fields
@ -465,7 +465,7 @@ File: hledger_csv.info, Node: account, Next: amount, Up: Posting field names
2.2.2.1 account 2.2.2.1 account
............... ...............
'accountN', where N is 1 to 9, causes a posting to be generated, with 'accountN', where N is 1 to 99, causes a posting to be generated, with
that account name. that account name.
Most often there are two postings, so you'll want to set 'account1' Most often there are two postings, so you'll want to set 'account1'
@ -484,13 +484,25 @@ File: hledger_csv.info, Node: amount, Next: currency, Prev: account, Up: Pos
.............. ..............
'amountN' sets posting N's amount. If the CSV uses separate fields for 'amountN' sets posting N's amount. If the CSV uses separate fields for
debit and credit amounts, you can use 'amountN-in' and 'amountN-out' inflows and outflows, you can use 'amountN-in' and 'amountN-out'
instead. instead. By assigning to 'amount1', 'amount2', ... etc. you can
generate anywhere from 0 to 99 postings.
Also, for compatibility with hledger <1.17: 'amount' or There is also an older, unnumbered form of these names, suitable for
'amount-in'/'amount-out' with no number sets the amount for postings 1 2-posting transactions, which sets both posting 1's and (negated)
and 2. For posting 2 the amount is negated, and converted to cost if posting 2's amount: 'amount', or 'amount-in' and 'amount-out'. This is
there's a transaction price. still supported because it keeps pre-hledger-1.17 csv rules files
working, and because it can be more succinct, and because it converts
posting 2's amount to cost if there's a transaction price, which can be
useful.
If you have an existing rules file using the unnumbered form, you
might want to use the numbered form in certain conditional blocks,
without having to update and retest all the old rules. To facilitate
this, posting 1 ignores 'amount'/'amount-in'/'amount-out' if any of
'amount1'/'amount1-in'/'amount1-out' are assigned, and posting 2 ignores
them if any of 'amount2'/'amount2-in'/'amount2-out' are assigned,
avoiding conflicts.
 
File: hledger_csv.info, Node: currency, Next: balance, Prev: amount, Up: Posting field names File: hledger_csv.info, Node: currency, Next: balance, Prev: amount, Up: Posting field names
@ -599,13 +611,17 @@ descriptions.
REGEX REGEX
REGEX is a case-insensitive regular expression which tries to match REGEX is a case-insensitive regular expression which tries to match
anywhere within the CSV record. It is a POSIX extended regular anywhere within the CSV record. It is a POSIX ERE (extended regular
expressions with some additions (see Regular expressions in the hledger expression) that also supports GNU word boundaries ('\b', '\B', '\<',
manual). Note: the "CSV record" it is matched against is not the '\>'), and nothing else. If you have trouble, be sure to check our
original record, but a synthetic one, with enclosing double quotes or https://hledger.org/hledger.html#regular-expressions doc.
whitespace removed, and always comma-separated. (Eg, an SSV record
'2020-01-01; "Acme, Inc."; 1,000' appears to REGEX as '2020-01-01,Acme, Important note: the record that is matched is not the original
Inc.,1,000'). record, but a synthetic one, with any enclosing double quotes (but not
enclosing whitespace) removed, and always comma-separated (which means
that a field containing a comma will appear like two fields). Eg, if
the original record is '2020-01-01; "Acme, Inc."; 1,000', the REGEX will
actually see '2020-01-01,Acme, Inc., 1,000').
Or, MATCHER can be a field matcher, like this: Or, MATCHER can be a field matcher, like this:
@ -1019,74 +1035,74 @@ command the user specified.
 
Tag Table: Tag Table:
Node: Top72 Node: Top72
Node: EXAMPLES2099 Node: EXAMPLES2113
Ref: #examples2205 Ref: #examples2219
Node: Basic2413 Node: Basic2427
Ref: #basic2513 Ref: #basic2527
Node: Bank of Ireland3055 Node: Bank of Ireland3069
Ref: #bank-of-ireland3190 Ref: #bank-of-ireland3204
Node: Amazon4652 Node: Amazon4666
Ref: #amazon4770 Ref: #amazon4784
Node: Paypal6489 Node: Paypal6503
Ref: #paypal6583 Ref: #paypal6597
Node: CSV RULES14227 Node: CSV RULES14241
Ref: #csv-rules14336 Ref: #csv-rules14350
Node: skip14612 Node: skip14626
Ref: #skip14705 Ref: #skip14719
Node: fields15080 Node: fields15094
Ref: #fields15202 Ref: #fields15216
Node: Transaction field names16367 Node: Transaction field names16381
Ref: #transaction-field-names16527 Ref: #transaction-field-names16541
Node: Posting field names16638 Node: Posting field names16652
Ref: #posting-field-names16790 Ref: #posting-field-names16804
Node: account16860 Node: account16874
Ref: #account16976 Ref: #account16990
Node: amount17512 Node: amount17527
Ref: #amount17643 Ref: #amount17658
Node: currency18024 Node: currency18765
Ref: #currency18159 Ref: #currency18900
Node: balance18365 Node: balance19106
Ref: #balance18499 Ref: #balance19240
Node: comment18816 Node: comment19557
Ref: #comment18933 Ref: #comment19674
Node: field assignment19096 Node: field assignment19837
Ref: #field-assignment19239 Ref: #field-assignment19980
Node: separator20057 Node: separator20798
Ref: #separator20186 Ref: #separator20927
Node: if20597 Node: if21338
Ref: #if20699 Ref: #if21440
Node: end22618 Node: end23596
Ref: #end22724 Ref: #end23702
Node: date-format22948 Node: date-format23926
Ref: #date-format23080 Ref: #date-format24058
Node: newest-first23829 Node: newest-first24807
Ref: #newest-first23967 Ref: #newest-first24945
Node: include24650 Node: include25628
Ref: #include24779 Ref: #include25757
Node: balance-type25223 Node: balance-type26201
Ref: #balance-type25343 Ref: #balance-type26321
Node: TIPS26043 Node: TIPS27021
Ref: #tips26125 Ref: #tips27103
Node: Rapid feedback26381 Node: Rapid feedback27359
Ref: #rapid-feedback26498 Ref: #rapid-feedback27476
Node: Valid CSV26958 Node: Valid CSV27936
Ref: #valid-csv27088 Ref: #valid-csv28066
Node: File Extension27280 Node: File Extension28258
Ref: #file-extension27432 Ref: #file-extension28410
Node: Reading multiple CSV files27842 Node: Reading multiple CSV files28820
Ref: #reading-multiple-csv-files28027 Ref: #reading-multiple-csv-files29005
Node: Valid transactions28268 Node: Valid transactions29246
Ref: #valid-transactions28446 Ref: #valid-transactions29424
Node: Deduplicating importing29074 Node: Deduplicating importing30052
Ref: #deduplicating-importing29253 Ref: #deduplicating-importing30231
Node: Setting amounts30286 Node: Setting amounts31264
Ref: #setting-amounts30455 Ref: #setting-amounts31433
Node: Setting currency/commodity31441 Node: Setting currency/commodity32419
Ref: #setting-currencycommodity31633 Ref: #setting-currencycommodity32611
Node: Referencing other fields32436 Node: Referencing other fields33414
Ref: #referencing-other-fields32636 Ref: #referencing-other-fields33614
Node: How CSV rules are evaluated33533 Node: How CSV rules are evaluated34511
Ref: #how-csv-rules-are-evaluated33706 Ref: #how-csv-rules-are-evaluated34684
 
End Tag Table End Tag Table

View File

@ -15,9 +15,9 @@ DESCRIPTION
We describe each CSV file's format with a corresponding rules file. By We describe each CSV file's format with a corresponding rules file. By
default this is named like the CSV file with a .rules extension added. default this is named like the CSV file with a .rules extension added.
Eg when reading FILE.csv, hledger also looks for FILE.csv.rules in the Eg when reading FILE.csv, hledger also looks for FILE.csv.rules in the
same directory. You can specify a different rules file with the same directory as FILE.csv. You can specify a different rules file
--rules-file option. If a rules file is not found, hledger will create with the --rules-file option. If a rules file is not found, hledger
a sample rules file, which you'll need to adjust. will create a sample rules file, which you'll need to adjust.
This file contains rules describing the CSV data (header line, fields This file contains rules describing the CSV data (header line, fields
layout, date format etc.), and how to construct hledger journal entries layout, date format etc.), and how to construct hledger journal entries
@ -377,7 +377,7 @@ CSV RULES
Posting field names Posting field names
account account
accountN, where N is 1 to 9, causes a posting to be generated, with accountN, where N is 1 to 99, causes a posting to be generated, with
that account name. that account name.
Most often there are two postings, so you'll want to set account1 and Most often there are two postings, so you'll want to set account1 and
@ -391,27 +391,38 @@ CSV RULES
amount amount
amountN sets posting N's amount. If the CSV uses separate fields for amountN sets posting N's amount. If the CSV uses separate fields for
debit and credit amounts, you can use amountN-in and amountN-out in- inflows and outflows, you can use amountN-in and amountN-out instead.
stead. By assigning to amount1, amount2, ... etc. you can generate anywhere
from 0 to 99 postings.
Also, for compatibility with hledger <1.17: amount or amount-in/amount- There is also an older, unnumbered form of these names, suitable for
out with no number sets the amount for postings 1 and 2. For posting 2 2-posting transactions, which sets both posting 1's and (negated) post-
the amount is negated, and converted to cost if there's a transaction ing 2's amount: amount, or amount-in and amount-out. This is still
price. supported because it keeps pre-hledger-1.17 csv rules files working,
and because it can be more succinct, and because it converts posting
2's amount to cost if there's a transaction price, which can be useful.
If you have an existing rules file using the unnumbered form, you might
want to use the numbered form in certain conditional blocks, without
having to update and retest all the old rules. To facilitate this,
posting 1 ignores amount/amount-in/amount-out if any of
amount1/amount1-in/amount1-out are assigned, and posting 2 ignores them
if any of amount2/amount2-in/amount2-out are assigned, avoiding con-
flicts.
currency currency
If the CSV has the currency symbol in a separate field (ie, not part of If the CSV has the currency symbol in a separate field (ie, not part of
the amount field), you can use currencyN to prepend it to posting N's the amount field), you can use currencyN to prepend it to posting N's
amount. Or, currency with no number affects all postings. amount. Or, currency with no number affects all postings.
balance balance
balanceN sets a balance assertion amount (or if the posting amount is balanceN sets a balance assertion amount (or if the posting amount is
left empty, a balance assignment) on posting N. left empty, a balance assignment) on posting N.
Also, for compatibility with hledger <1.17: balance with no number is Also, for compatibility with hledger <1.17: balance with no number is
equivalent to balance1. equivalent to balance1.
You can adjust the type of assertion/assignment with the balance-type You can adjust the type of assertion/assignment with the balance-type
rule (see below). rule (see below).
comment comment
@ -423,11 +434,11 @@ CSV RULES
field assignment field assignment
HLEDGERFIELDNAME FIELDVALUE HLEDGERFIELDNAME FIELDVALUE
Instead of or in addition to a fields list, you can use a "field as- Instead of or in addition to a fields list, you can use a "field as-
signment" rule to set the value of a single hledger field, by writing signment" rule to set the value of a single hledger field, by writing
its name (any of the standard hledger field names above) followed by a its name (any of the standard hledger field names above) followed by a
text value. The value may contain interpolated CSV fields, referenced text value. The value may contain interpolated CSV fields, referenced
by their 1-based position in the CSV record (%N), or by the name they by their 1-based position in the CSV record (%N), or by the name they
were given in the fields list (%CSVFIELDNAME). Some examples: were given in the fields list (%CSVFIELDNAME). Some examples:
# set the amount to the 4th CSV field, with " USD" appended # set the amount to the 4th CSV field, with " USD" appended
@ -436,18 +447,18 @@ CSV RULES
# combine three fields to make a comment, containing note: and date: tags # combine three fields to make a comment, containing note: and date: tags
comment note: %somefield - %anotherfield, date: %1 comment note: %somefield - %anotherfield, date: %1
Interpolation strips outer whitespace (so a CSV value like " 1 " be- Interpolation strips outer whitespace (so a CSV value like " 1 " be-
comes 1 when interpolated) (#1051). See TIPS below for more about ref- comes 1 when interpolated) (#1051). See TIPS below for more about ref-
erencing other fields. erencing other fields.
separator separator
You can use the separator directive to read other kinds of character- You can use the separator directive to read other kinds of character-
separated data. Eg to read SSV (Semicolon Separated Values), use: separated data. Eg to read SSV (Semicolon Separated Values), use:
separator ; separator ;
The separator directive accepts exactly one single byte character as a The separator directive accepts exactly one single byte character as a
separator. To specify whitespace characters, you may use the special separator. To specify whitespace characters, you may use the special
words TAB or SPACE. Eg to read TSV (Tab Separated Values), use: words TAB or SPACE. Eg to read TSV (Tab Separated Values), use:
separator TAB separator TAB
@ -465,21 +476,26 @@ CSV RULES
RULE RULE
RULE RULE
Conditional blocks ("if blocks") are a block of rules that are applied Conditional blocks ("if blocks") are a block of rules that are applied
only to CSV records which match certain patterns. They are often used only to CSV records which match certain patterns. They are often used
for customising account names based on transaction descriptions. for customising account names based on transaction descriptions.
Each MATCHER can be a record matcher, which looks like this: Each MATCHER can be a record matcher, which looks like this:
REGEX REGEX
REGEX is a case-insensitive regular expression which tries to match REGEX is a case-insensitive regular expression which tries to match
anywhere within the CSV record. It is a POSIX extended regular expres- anywhere within the CSV record. It is a POSIX ERE (extended regular
sions with some additions (see Regular expressions in the hledger man- expression) that also supports GNU word boundaries (\b, \B, \<, \>),
ual). Note: the "CSV record" it is matched against is not the original and nothing else. If you have trouble, be sure to check our
record, but a synthetic one, with enclosing double quotes or whitespace https://hledger.org/hledger.html#regular-expressions doc.
removed, and always comma-separated. (Eg, an SSV record 2020-01-01;
"Acme, Inc."; 1,000 appears to REGEX as 2020-01-01,Acme, Inc.,1,000). Important note: the record that is matched is not the original record,
but a synthetic one, with any enclosing double quotes (but not enclos-
ing whitespace) removed, and always comma-separated (which means that a
field containing a comma will appear like two fields). Eg, if the
original record is 2020-01-01; "Acme, Inc."; 1,000, the REGEX will ac-
tually see 2020-01-01,Acme, Inc., 1,000).
Or, MATCHER can be a field matcher, like this: Or, MATCHER can be a field matcher, like this:
@ -834,4 +850,4 @@ SEE ALSO
hledger 1.17.99 March 2020 hledger_csv(5) hledger 1.17.99 May 2020 hledger_csv(5)

View File

@ -1,6 +1,6 @@
.\"t .\"t
.TH "hledger_journal" "5" "March 2020" "hledger 1.17.99" "hledger User Manuals" .TH "hledger_journal" "5" "May 2020" "hledger 1.17.99" "hledger User Manuals"
@ -63,7 +63,8 @@ a comment (any remaining text following a semicolon until end of line,
and any following indented lines beginning with a semicolon) and any following indented lines beginning with a semicolon)
.IP \[bu] 2 .IP \[bu] 2
0 or more indented \f[I]posting\f[R] lines, describing what was 0 or more indented \f[I]posting\f[R] lines, describing what was
transferred and the accounts involved. transferred and the accounts involved (indented comment lines are also
allowed, but not blank lines or non-indented lines).
.PP .PP
Here\[aq]s a simple journal file containing one transaction: Here\[aq]s a simple journal file containing one transaction:
.IP .IP
@ -409,7 +410,7 @@ amount.
This makes it easy to write account names containing spaces. This makes it easy to write account names containing spaces.
But if you accidentally leave only one space (or tab) before the amount, But if you accidentally leave only one space (or tab) before the amount,
the amount will be considered part of the account name. the amount will be considered part of the account name.
.SS Virtual Postings .SS Virtual postings
.PP .PP
A posting with a parenthesised account name is called a \f[I]virtual A posting with a parenthesised account name is called a \f[I]virtual
posting\f[R] or \f[I]unbalanced posting\f[R], which means it is exempt posting\f[R] or \f[I]unbalanced posting\f[R], which means it is exempt
@ -504,9 +505,9 @@ be enclosed in double quotes:
\f[R] \f[R]
.fi .fi
.PP .PP
Amounts can be negative. Amounts can be preceded by a minus sign (or a plus sign, though plus is
The minus sign can be written before or after a left-side commodity the default), The sign can be written before or after a left-side
symbol: commodity symbol:
.IP .IP
.nf .nf
\f[C] \f[C]
@ -515,6 +516,16 @@ $-1
\f[R] \f[R]
.fi .fi
.PP .PP
One or more spaces between the sign and the number are acceptable when
parsing (but they won\[aq]t be displayed in output):
.IP
.nf
\f[C]
+ $1
$- 1
\f[R]
.fi
.PP
Scientific E notation is allowed: Scientific E notation is allowed:
.IP .IP
.nf .nf
@ -586,7 +597,7 @@ the commodity, that format is used (see examples above).
Otherwise the format of the first posting amount in that commodity seen Otherwise the format of the first posting amount in that commodity seen
in the journal is used. in the journal is used.
But the number of decimal places (\[dq]precision\[dq]) will be the But the number of decimal places (\[dq]precision\[dq]) will be the
maximum from all posting amounts in that commmodity. maximum from all posting amounts in that commodity.
.IP \[bu] 2 .IP \[bu] 2
Or if there are no such amounts in the journal, a default format is used Or if there are no such amounts in the journal, a default format is used
(like \f[C]$1000.00\f[R]). (like \f[C]$1000.00\f[R]).
@ -659,9 +670,10 @@ hledger infer the price that balances the transaction:
\f[R] \f[R]
.fi .fi
.RE .RE
.PP .IP "5." 3
(Ledger users: Ledger uses a different syntax for fixed prices, Like 1 and 2, but the \f[C]\[at]\f[R] or \f[C]\[at]\[at]\f[R] is
\f[C]{=UNITPRICE}\f[R], which hledger currently ignores). parenthesised; this is for compatibility with Ledger journals (Virtual
posting costs), and in hledger is equivalent to 1 and 2.
.PP .PP
Use the \f[C]-B/--cost\f[R] flag to convert amounts to their transaction Use the \f[C]-B/--cost\f[R] flag to convert amounts to their transaction
price\[aq]s commodity, if any. price\[aq]s commodity, if any.
@ -700,7 +712,18 @@ $ hledger bal -N --flat -B
\[Eu]100 assets:euros \[Eu]100 assets:euros
\f[R] \f[R]
.fi .fi
.SS Balance Assertions .SS Lot prices and lot dates
.PP
Ledger allows another kind of price, lot price (four variants:
\f[C]{UNITPRICE}\f[R], \f[C]{{TOTALPRICE}}\f[R],
\f[C]{=FIXEDUNITPRICE}\f[R], \f[C]{{=FIXEDTOTALPRICE}}\f[R]), and/or a
lot date (\f[C][DATE]\f[R]) to be specified.
These are normally used to select a lot when selling investments.
hledger will parse these, for compatibility with Ledger journals, but
currently ignores them.
A transaction price, lot price and/or lot date may appear in any order,
after the posting amount and before the balance assertion if any.
.SS Balance assertions
.PP .PP
hledger supports Ledger-style balance assertions in journal files. hledger supports Ledger-style balance assertions in journal files.
These look like, for example, \f[C]= EXPECTEDBALANCE\f[R] following a These look like, for example, \f[C]= EXPECTEDBALANCE\f[R] following a
@ -856,7 +879,7 @@ always what is shown by reports.
Eg a commodity directive may limit the display precision, but this will Eg a commodity directive may limit the display precision, but this will
not affect balance assertions. not affect balance assertions.
Balance assertion failure messages show exact amounts. Balance assertion failure messages show exact amounts.
.SS Balance Assignments .SS Balance assignments
.PP .PP
Ledger-style balance assignments are also supported. Ledger-style balance assignments are also supported.
These are like balance assertions, but with no posting amount on the These are like balance assertions, but with no posting amount on the
@ -1237,7 +1260,7 @@ D $1,000.00
b b
\f[R] \f[R]
.fi .fi
.SS Market prices .SS Declaring market prices
.PP .PP
The \f[C]P\f[R] directive declares a market price, which is an exchange The \f[C]P\f[R] directive declares a market price, which is an exchange
rate between two commodities on a certain date. rate between two commodities on a certain date.
@ -1270,8 +1293,9 @@ P 2010/1/1 \[Eu] $1.40
\f[R] \f[R]
.fi .fi
.PP .PP
The \f[C]-V/--value\f[R] flag can be used to convert reported amounts to The \f[C]-V\f[R], \f[C]-X\f[R] and \f[C]--value\f[R] flags use these
another commodity using these prices. market prices to show amount values in another commodity.
See Valuation.
.SS Declaring accounts .SS Declaring accounts
.PP .PP
\f[C]account\f[R] directives can be used to pre-declare accounts. \f[C]account\f[R] directives can be used to pre-declare accounts.

View File

@ -62,7 +62,8 @@ optional fields, separated by spaces:
* a comment (any remaining text following a semicolon until end of * a comment (any remaining text following a semicolon until end of
line, and any following indented lines beginning with a semicolon) line, and any following indented lines beginning with a semicolon)
* 0 or more indented _posting_ lines, describing what was transferred * 0 or more indented _posting_ lines, describing what was transferred
and the accounts involved. and the accounts involved (indented comment lines are also allowed,
but not blank lines or non-indented lines).
Here's a simple journal file containing one transaction: Here's a simple journal file containing one transaction:
@ -81,8 +82,9 @@ optional fields, separated by spaces:
* Account names:: * Account names::
* Amounts:: * Amounts::
* Transaction prices:: * Transaction prices::
* Balance Assertions:: * Lot prices and lot dates::
* Balance Assignments:: * Balance assertions::
* Balance assignments::
* Directives:: * Directives::
* Periodic transactions:: * Periodic transactions::
* Auto postings:: * Auto postings::
@ -377,12 +379,12 @@ the amount, the amount will be considered part of the account name.
* Menu: * Menu:
* Virtual Postings:: * Virtual postings::
 
File: hledger_journal.info, Node: Virtual Postings, Up: Postings File: hledger_journal.info, Node: Virtual postings, Up: Postings
1.6.1 Virtual Postings 1.6.1 Virtual postings
---------------------- ----------------------
A posting with a parenthesised account name is called a _virtual A posting with a parenthesised account name is called a _virtual
@ -459,12 +461,19 @@ must be enclosed in double quotes:
3 "no. 42 green apples" 3 "no. 42 green apples"
Amounts can be negative. The minus sign can be written before or Amounts can be preceded by a minus sign (or a plus sign, though plus
after a left-side commodity symbol: is the default), The sign can be written before or after a left-side
commodity symbol:
-$1 -$1
$-1 $-1
One or more spaces between the sign and the number are acceptable
when parsing (but they won't be displayed in output):
+ $1
$- 1
Scientific E notation is allowed: Scientific E notation is allowed:
1E-6 1E-6
@ -529,7 +538,7 @@ as written). The display style is chosen as follows:
* Otherwise the format of the first posting amount in that commodity * Otherwise the format of the first posting amount in that commodity
seen in the journal is used. But the number of decimal places seen in the journal is used. But the number of decimal places
("precision") will be the maximum from all posting amounts in that ("precision") will be the maximum from all posting amounts in that
commmodity. commodity.
* Or if there are no such amounts in the journal, a default format is * Or if there are no such amounts in the journal, a default format is
used (like '$1000.00'). used (like '$1000.00').
@ -550,7 +559,7 @@ hledger 1.17.1 this could vary if hledger happened to be built with an
old version of Decimal (<0.5.1); since 1.17.1 it's guaranteed.) old version of Decimal (<0.5.1); since 1.17.1 it's guaranteed.)
 
File: hledger_journal.info, Node: Transaction prices, Next: Balance Assertions, Prev: Amounts, Up: Transactions File: hledger_journal.info, Node: Transaction prices, Next: Lot prices and lot dates, Prev: Amounts, Up: Transactions
1.9 Transaction prices 1.9 Transaction prices
====================== ======================
@ -584,8 +593,9 @@ certain date.
assets:euros €100 ; one hundred euros purchased assets:euros €100 ; one hundred euros purchased
assets:dollars $-135 ; for $135 assets:dollars $-135 ; for $135
(Ledger users: Ledger uses a different syntax for fixed prices, 4. 5. Like 1 and 2, but the '@' or '@@' is parenthesised; this is for
'{=UNITPRICE}', which hledger currently ignores). compatibility with Ledger journals (Virtual posting costs), and in
hledger is equivalent to 1 and 2.
Use the '-B/--cost' flag to convert amounts to their transaction Use the '-B/--cost' flag to convert amounts to their transaction
price's commodity, if any. (mnemonic: "B" is from "cost Basis", as in price's commodity, if any. (mnemonic: "B" is from "cost Basis", as in
@ -613,9 +623,24 @@ $ hledger bal -N --flat -B
€100 assets:euros €100 assets:euros
 
File: hledger_journal.info, Node: Balance Assertions, Next: Balance Assignments, Prev: Transaction prices, Up: Transactions File: hledger_journal.info, Node: Lot prices and lot dates, Next: Balance assertions, Prev: Transaction prices, Up: Transactions
1.10 Balance Assertions 1.10 Lot prices and lot dates
=============================
Ledger allows another kind of price, lot price (four variants:
'{UNITPRICE}', '{{TOTALPRICE}}', '{=FIXEDUNITPRICE}',
'{{=FIXEDTOTALPRICE}}'), and/or a lot date ('[DATE]') to be specified.
These are normally used to select a lot when selling investments.
hledger will parse these, for compatibility with Ledger journals, but
currently ignores them. A transaction price, lot price and/or lot date
may appear in any order, after the posting amount and before the balance
assertion if any.

File: hledger_journal.info, Node: Balance assertions, Next: Balance assignments, Prev: Lot prices and lot dates, Up: Transactions
1.11 Balance assertions
======================= =======================
hledger supports Ledger-style balance assertions in journal files. hledger supports Ledger-style balance assertions in journal files.
@ -651,9 +676,9 @@ does not disable balance assignments, below).
* Assertions and precision:: * Assertions and precision::
 
File: hledger_journal.info, Node: Assertions and ordering, Next: Assertions and included files, Up: Balance Assertions File: hledger_journal.info, Node: Assertions and ordering, Next: Assertions and included files, Up: Balance assertions
1.10.1 Assertions and ordering 1.11.1 Assertions and ordering
------------------------------ ------------------------------
hledger sorts an account's postings and assertions first by date and hledger sorts an account's postings and assertions first by date and
@ -670,9 +695,9 @@ control over the order of postings and assertions within a day, so you
can assert intra-day balances. can assert intra-day balances.
 
File: hledger_journal.info, Node: Assertions and included files, Next: Assertions and multiple -f options, Prev: Assertions and ordering, Up: Balance Assertions File: hledger_journal.info, Node: Assertions and included files, Next: Assertions and multiple -f options, Prev: Assertions and ordering, Up: Balance assertions
1.10.2 Assertions and included files 1.11.2 Assertions and included files
------------------------------------ ------------------------------------
With included files, things are a little more complicated. Including With included files, things are a little more complicated. Including
@ -682,18 +707,18 @@ and you also want to assert the account's balance on the same day,
you'll have to put the assertion in the right file. you'll have to put the assertion in the right file.
 
File: hledger_journal.info, Node: Assertions and multiple -f options, Next: Assertions and commodities, Prev: Assertions and included files, Up: Balance Assertions File: hledger_journal.info, Node: Assertions and multiple -f options, Next: Assertions and commodities, Prev: Assertions and included files, Up: Balance assertions
1.10.3 Assertions and multiple -f options 1.11.3 Assertions and multiple -f options
----------------------------------------- -----------------------------------------
Balance assertions don't work well across files specified with multiple Balance assertions don't work well across files specified with multiple
-f options. Use include or concatenate the files instead. -f options. Use include or concatenate the files instead.
 
File: hledger_journal.info, Node: Assertions and commodities, Next: Assertions and prices, Prev: Assertions and multiple -f options, Up: Balance Assertions File: hledger_journal.info, Node: Assertions and commodities, Next: Assertions and prices, Prev: Assertions and multiple -f options, Up: Balance assertions
1.10.4 Assertions and commodities 1.11.4 Assertions and commodities
--------------------------------- ---------------------------------
The asserted balance must be a simple single-commodity amount, and in The asserted balance must be a simple single-commodity amount, and in
@ -739,9 +764,9 @@ commodity into its own subaccount:
a:euro 0 == 1€ a:euro 0 == 1€
 
File: hledger_journal.info, Node: Assertions and prices, Next: Assertions and subaccounts, Prev: Assertions and commodities, Up: Balance Assertions File: hledger_journal.info, Node: Assertions and prices, Next: Assertions and subaccounts, Prev: Assertions and commodities, Up: Balance assertions
1.10.5 Assertions and prices 1.11.5 Assertions and prices
---------------------------- ----------------------------
Balance assertions ignore transaction prices, and should normally be Balance assertions ignore transaction prices, and should normally be
@ -757,9 +782,9 @@ to generate balance assertions with prices), and because balance
_assignments_ do use them (see below). _assignments_ do use them (see below).
 
File: hledger_journal.info, Node: Assertions and subaccounts, Next: Assertions and virtual postings, Prev: Assertions and prices, Up: Balance Assertions File: hledger_journal.info, Node: Assertions and subaccounts, Next: Assertions and virtual postings, Prev: Assertions and prices, Up: Balance assertions
1.10.6 Assertions and subaccounts 1.11.6 Assertions and subaccounts
--------------------------------- ---------------------------------
The balance assertions above ('=' and '==') do not count the balance The balance assertions above ('=' and '==') do not count the balance
@ -774,9 +799,9 @@ eg:
checking 1 ==* 11 checking 1 ==* 11
 
File: hledger_journal.info, Node: Assertions and virtual postings, Next: Assertions and precision, Prev: Assertions and subaccounts, Up: Balance Assertions File: hledger_journal.info, Node: Assertions and virtual postings, Next: Assertions and precision, Prev: Assertions and subaccounts, Up: Balance assertions
1.10.7 Assertions and virtual postings 1.11.7 Assertions and virtual postings
-------------------------------------- --------------------------------------
Balance assertions are checked against all postings, both real and Balance assertions are checked against all postings, both real and
@ -784,9 +809,9 @@ virtual. They are not affected by the '--real/-R' flag or 'real:'
query. query.
 
File: hledger_journal.info, Node: Assertions and precision, Prev: Assertions and virtual postings, Up: Balance Assertions File: hledger_journal.info, Node: Assertions and precision, Prev: Assertions and virtual postings, Up: Balance assertions
1.10.8 Assertions and precision 1.11.8 Assertions and precision
------------------------------- -------------------------------
Balance assertions compare the exactly calculated amounts, which are not Balance assertions compare the exactly calculated amounts, which are not
@ -795,9 +820,9 @@ display precision, but this will not affect balance assertions. Balance
assertion failure messages show exact amounts. assertion failure messages show exact amounts.
 
File: hledger_journal.info, Node: Balance Assignments, Next: Directives, Prev: Balance Assertions, Up: Transactions File: hledger_journal.info, Node: Balance assignments, Next: Directives, Prev: Balance assertions, Up: Transactions
1.11 Balance Assignments 1.12 Balance assignments
======================== ========================
Ledger-style balance assignments are also supported. These are like Ledger-style balance assignments are also supported. These are like
@ -832,9 +857,9 @@ hledger or do the calculations yourself, instead of just reading it.
* Balance assignments and prices:: * Balance assignments and prices::
 
File: hledger_journal.info, Node: Balance assignments and prices, Up: Balance Assignments File: hledger_journal.info, Node: Balance assignments and prices, Up: Balance assignments
1.11.1 Balance assignments and prices 1.12.1 Balance assignments and prices
------------------------------------- -------------------------------------
A transaction price in a balance assignment will cause the calculated A transaction price in a balance assignment will cause the calculated
@ -848,9 +873,9 @@ $ hledger print --explicit
(a) $1 @ €2 = $1 @ €2 (a) $1 @ €2 = $1 @ €2
 
File: hledger_journal.info, Node: Directives, Next: Periodic transactions, Prev: Balance Assignments, Up: Transactions File: hledger_journal.info, Node: Directives, Next: Periodic transactions, Prev: Balance assignments, Up: Transactions
1.12 Directives 1.13 Directives
=============== ===============
A directive is a line in the journal beginning with a special keyword, A directive is a line in the journal beginning with a special keyword,
@ -946,7 +971,7 @@ they affect, and whether they are focussed on input (parsing) or output
* Default year:: * Default year::
* Declaring commodities:: * Declaring commodities::
* Default commodity:: * Default commodity::
* Market prices:: * Declaring market prices::
* Declaring accounts:: * Declaring accounts::
* Rewriting accounts:: * Rewriting accounts::
* Default parent account:: * Default parent account::
@ -954,7 +979,7 @@ they affect, and whether they are focussed on input (parsing) or output
 
File: hledger_journal.info, Node: Directives and multiple files, Next: Comment blocks, Up: Directives File: hledger_journal.info, Node: Directives and multiple files, Next: Comment blocks, Up: Directives
1.12.1 Directives and multiple files 1.13.1 Directives and multiple files
------------------------------------ ------------------------------------
If you use multiple '-f'/'--file' options, or the 'include' directive, If you use multiple '-f'/'--file' options, or the 'include' directive,
@ -974,7 +999,7 @@ directives do not affect parent or sibling files (see below).
 
File: hledger_journal.info, Node: Comment blocks, Next: Including other files, Prev: Directives and multiple files, Up: Directives File: hledger_journal.info, Node: Comment blocks, Next: Including other files, Prev: Directives and multiple files, Up: Directives
1.12.2 Comment blocks 1.13.2 Comment blocks
--------------------- ---------------------
A line containing just 'comment' starts a commented region of the file, A line containing just 'comment' starts a commented region of the file,
@ -984,7 +1009,7 @@ file) ends it. See also comments.
 
File: hledger_journal.info, Node: Including other files, Next: Default year, Prev: Comment blocks, Up: Directives File: hledger_journal.info, Node: Including other files, Next: Default year, Prev: Comment blocks, Up: Directives
1.12.3 Including other files 1.13.3 Including other files
---------------------------- ----------------------------
You can pull in the content of additional files by writing an include You can pull in the content of additional files by writing an include
@ -1002,7 +1027,7 @@ include journal, timeclock or timedot files, but not CSV files.
 
File: hledger_journal.info, Node: Default year, Next: Declaring commodities, Prev: Including other files, Up: Directives File: hledger_journal.info, Node: Default year, Next: Declaring commodities, Prev: Including other files, Up: Directives
1.12.4 Default year 1.13.4 Default year
------------------- -------------------
You can set a default year to be used for subsequent dates which don't You can set a default year to be used for subsequent dates which don't
@ -1028,7 +1053,7 @@ Y2010 ; change default year to 2010
 
File: hledger_journal.info, Node: Declaring commodities, Next: Default commodity, Prev: Default year, Up: Directives File: hledger_journal.info, Node: Declaring commodities, Next: Default commodity, Prev: Default year, Up: Directives
1.12.5 Declaring commodities 1.13.5 Declaring commodities
---------------------------- ----------------------------
The 'commodity' directive has several functions: The 'commodity' directive has several functions:
@ -1079,9 +1104,9 @@ a comma, followed by 0 or more decimal digits.
zero decimal digits is "0". (More at Amount display style.) zero decimal digits is "0". (More at Amount display style.)
 
File: hledger_journal.info, Node: Default commodity, Next: Market prices, Prev: Declaring commodities, Up: Directives File: hledger_journal.info, Node: Default commodity, Next: Declaring market prices, Prev: Declaring commodities, Up: Directives
1.12.6 Default commodity 1.13.6 Default commodity
------------------------ ------------------------
The 'D' directive sets a default commodity, to be used for amounts The 'D' directive sets a default commodity, to be used for amounts
@ -1106,10 +1131,10 @@ D $1,000.00
b b
 
File: hledger_journal.info, Node: Market prices, Next: Declaring accounts, Prev: Default commodity, Up: Directives File: hledger_journal.info, Node: Declaring market prices, Next: Declaring accounts, Prev: Default commodity, Up: Directives
1.12.7 Market prices 1.13.7 Declaring market prices
-------------------- ------------------------------
The 'P' directive declares a market price, which is an exchange rate The 'P' directive declares a market price, which is an exchange rate
between two commodities on a certain date. (In Ledger, they are called between two commodities on a certain date. (In Ledger, they are called
@ -1132,13 +1157,13 @@ dollars during 2009, and $1.40 from 2010 onward:
P 2009/1/1 € $1.35 P 2009/1/1 € $1.35
P 2010/1/1 € $1.40 P 2010/1/1 € $1.40
The '-V/--value' flag can be used to convert reported amounts to The '-V', '-X' and '--value' flags use these market prices to show
another commodity using these prices. amount values in another commodity. See Valuation.
 
File: hledger_journal.info, Node: Declaring accounts, Next: Rewriting accounts, Prev: Market prices, Up: Directives File: hledger_journal.info, Node: Declaring accounts, Next: Rewriting accounts, Prev: Declaring market prices, Up: Directives
1.12.8 Declaring accounts 1.13.8 Declaring accounts
------------------------- -------------------------
'account' directives can be used to pre-declare accounts. Though not 'account' directives can be used to pre-declare accounts. Though not
@ -1171,7 +1196,7 @@ account assets:bank:checking
 
File: hledger_journal.info, Node: Account comments, Next: Account subdirectives, Up: Declaring accounts File: hledger_journal.info, Node: Account comments, Next: Account subdirectives, Up: Declaring accounts
1.12.8.1 Account comments 1.13.8.1 Account comments
......................... .........................
Comments, beginning with a semicolon, can be added: Comments, beginning with a semicolon, can be added:
@ -1191,7 +1216,7 @@ account assets:bank:checking ; same-line comment, note 2+ spaces before ;
 
File: hledger_journal.info, Node: Account subdirectives, Next: Account types, Prev: Account comments, Up: Declaring accounts File: hledger_journal.info, Node: Account subdirectives, Next: Account types, Prev: Account comments, Up: Declaring accounts
1.12.8.2 Account subdirectives 1.13.8.2 Account subdirectives
.............................. ..............................
We also allow (and ignore) Ledger-style indented subdirectives, just for We also allow (and ignore) Ledger-style indented subdirectives, just for
@ -1209,7 +1234,7 @@ account ACCTNAME [ACCTTYPE] [;COMMENT]
 
File: hledger_journal.info, Node: Account types, Next: Account display order, Prev: Account subdirectives, Up: Declaring accounts File: hledger_journal.info, Node: Account types, Next: Account display order, Prev: Account subdirectives, Up: Declaring accounts
1.12.8.3 Account types 1.13.8.3 Account types
...................... ......................
hledger recognises five types (or classes) of account: Asset, Liability, hledger recognises five types (or classes) of account: Asset, Liability,
@ -1254,7 +1279,7 @@ account - ; type:L
 
File: hledger_journal.info, Node: Account display order, Prev: Account types, Up: Declaring accounts File: hledger_journal.info, Node: Account display order, Prev: Account types, Up: Declaring accounts
1.12.8.4 Account display order 1.13.8.4 Account display order
.............................. ..............................
Account directives also set the order in which accounts are displayed, Account directives also set the order in which accounts are displayed,
@ -1300,7 +1325,7 @@ means:
 
File: hledger_journal.info, Node: Rewriting accounts, Next: Default parent account, Prev: Declaring accounts, Up: Directives File: hledger_journal.info, Node: Rewriting accounts, Next: Default parent account, Prev: Declaring accounts, Up: Directives
1.12.9 Rewriting accounts 1.13.9 Rewriting accounts
------------------------- -------------------------
You can define account alias rules which rewrite your account names, or You can define account alias rules which rewrite your account names, or
@ -1330,7 +1355,7 @@ hledger-web.
 
File: hledger_journal.info, Node: Basic aliases, Next: Regex aliases, Up: Rewriting accounts File: hledger_journal.info, Node: Basic aliases, Next: Regex aliases, Up: Rewriting accounts
1.12.9.1 Basic aliases 1.13.9.1 Basic aliases
...................... ......................
To set an account alias, use the 'alias' directive in your journal file. To set an account alias, use the 'alias' directive in your journal file.
@ -1353,7 +1378,7 @@ alias checking = assets:bank:wells fargo:checking
 
File: hledger_journal.info, Node: Regex aliases, Next: Combining aliases, Prev: Basic aliases, Up: Rewriting accounts File: hledger_journal.info, Node: Regex aliases, Next: Combining aliases, Prev: Basic aliases, Up: Rewriting accounts
1.12.9.2 Regex aliases 1.13.9.2 Regex aliases
...................... ......................
There is also a more powerful variant that uses a regular expression, There is also a more powerful variant that uses a regular expression,
@ -1378,7 +1403,7 @@ whitespace.
 
File: hledger_journal.info, Node: Combining aliases, Next: Aliases and multiple files, Prev: Regex aliases, Up: Rewriting accounts File: hledger_journal.info, Node: Combining aliases, Next: Aliases and multiple files, Prev: Regex aliases, Up: Rewriting accounts
1.12.9.3 Combining aliases 1.13.9.3 Combining aliases
.......................... ..........................
You can define as many aliases as you like, using journal directives You can define as many aliases as you like, using journal directives
@ -1415,7 +1440,7 @@ which aliases are being applied when.
 
File: hledger_journal.info, Node: Aliases and multiple files, Next: end aliases, Prev: Combining aliases, Up: Rewriting accounts File: hledger_journal.info, Node: Aliases and multiple files, Next: end aliases, Prev: Combining aliases, Up: Rewriting accounts
1.12.9.4 Aliases and multiple files 1.13.9.4 Aliases and multiple files
................................... ...................................
As explained at Directives and multiple files, 'alias' directives do not As explained at Directives and multiple files, 'alias' directives do not
@ -1447,7 +1472,7 @@ include c.journal ; also affected
 
File: hledger_journal.info, Node: end aliases, Prev: Aliases and multiple files, Up: Rewriting accounts File: hledger_journal.info, Node: end aliases, Prev: Aliases and multiple files, Up: Rewriting accounts
1.12.9.5 'end aliases' 1.13.9.5 'end aliases'
...................... ......................
You can clear (forget) all currently defined aliases with the 'end You can clear (forget) all currently defined aliases with the 'end
@ -1458,7 +1483,7 @@ end aliases
 
File: hledger_journal.info, Node: Default parent account, Prev: Rewriting accounts, Up: Directives File: hledger_journal.info, Node: Default parent account, Prev: Rewriting accounts, Up: Directives
1.12.10 Default parent account 1.13.10 Default parent account
------------------------------ ------------------------------
You can specify a parent account which will be prepended to all accounts You can specify a parent account which will be prepended to all accounts
@ -1499,7 +1524,7 @@ parent account.
 
File: hledger_journal.info, Node: Periodic transactions, Next: Auto postings, Prev: Directives, Up: Transactions File: hledger_journal.info, Node: Periodic transactions, Next: Auto postings, Prev: Directives, Up: Transactions
1.13 Periodic transactions 1.14 Periodic transactions
========================== ==========================
Periodic transaction rules describe transactions that recur. They allow Periodic transaction rules describe transactions that recur. They allow
@ -1544,7 +1569,7 @@ read this whole section - or at least these tips:
 
File: hledger_journal.info, Node: Periodic rule syntax, Next: Two spaces between period expression and description!, Up: Periodic transactions File: hledger_journal.info, Node: Periodic rule syntax, Next: Two spaces between period expression and description!, Up: Periodic transactions
1.13.1 Periodic rule syntax 1.14.1 Periodic rule syntax
--------------------------- ---------------------------
A periodic transaction rule looks like a normal journal entry, with the A periodic transaction rule looks like a normal journal entry, with the
@ -1567,7 +1592,7 @@ will be relative to Y/1/1.
 
File: hledger_journal.info, Node: Two spaces between period expression and description!, Next: Forecasting with periodic transactions, Prev: Periodic rule syntax, Up: Periodic transactions File: hledger_journal.info, Node: Two spaces between period expression and description!, Next: Forecasting with periodic transactions, Prev: Periodic rule syntax, Up: Periodic transactions
1.13.2 Two spaces between period expression and description! 1.14.2 Two spaces between period expression and description!
------------------------------------------------------------ ------------------------------------------------------------
If the period expression is followed by a transaction description, these If the period expression is followed by a transaction description, these
@ -1592,7 +1617,7 @@ accidentally alter their meaning, as in this example:
 
File: hledger_journal.info, Node: Forecasting with periodic transactions, Next: Budgeting with periodic transactions, Prev: Two spaces between period expression and description!, Up: Periodic transactions File: hledger_journal.info, Node: Forecasting with periodic transactions, Next: Budgeting with periodic transactions, Prev: Two spaces between period expression and description!, Up: Periodic transactions
1.13.3 Forecasting with periodic transactions 1.14.3 Forecasting with periodic transactions
--------------------------------------------- ---------------------------------------------
With the '--forecast' flag, each periodic transaction rule generates With the '--forecast' flag, each periodic transaction rule generates
@ -1645,7 +1670,7 @@ disables forecast transactions on previous dates.)
 
File: hledger_journal.info, Node: Budgeting with periodic transactions, Prev: Forecasting with periodic transactions, Up: Periodic transactions File: hledger_journal.info, Node: Budgeting with periodic transactions, Prev: Forecasting with periodic transactions, Up: Periodic transactions
1.13.4 Budgeting with periodic transactions 1.14.4 Budgeting with periodic transactions
------------------------------------------- -------------------------------------------
With the '--budget' flag, currently supported by the balance command, With the '--budget' flag, currently supported by the balance command,
@ -1661,7 +1686,7 @@ Forecasting.
 
File: hledger_journal.info, Node: Auto postings, Prev: Periodic transactions, Up: Transactions File: hledger_journal.info, Node: Auto postings, Prev: Periodic transactions, Up: Transactions
1.14 Auto postings 1.15 Auto postings
================== ==================
"Automated postings" or "auto postings" are extra postings which get "Automated postings" or "auto postings" are extra postings which get
@ -1739,7 +1764,7 @@ $ hledger print --auto
 
File: hledger_journal.info, Node: Auto postings and multiple files, Next: Auto postings and dates, Up: Auto postings File: hledger_journal.info, Node: Auto postings and multiple files, Next: Auto postings and dates, Up: Auto postings
1.14.1 Auto postings and multiple files 1.15.1 Auto postings and multiple files
--------------------------------------- ---------------------------------------
An auto posting rule can affect any transaction in the current file, or An auto posting rule can affect any transaction in the current file, or
@ -1749,7 +1774,7 @@ sibling files (when multiple '-f'/'--file' are used - see #1212).
 
File: hledger_journal.info, Node: Auto postings and dates, Next: Auto postings and transaction balancing / inferred amounts / balance assertions, Prev: Auto postings and multiple files, Up: Auto postings File: hledger_journal.info, Node: Auto postings and dates, Next: Auto postings and transaction balancing / inferred amounts / balance assertions, Prev: Auto postings and multiple files, Up: Auto postings
1.14.2 Auto postings and dates 1.15.2 Auto postings and dates
------------------------------ ------------------------------
A posting date (or secondary date) in the matched posting, or (taking A posting date (or secondary date) in the matched posting, or (taking
@ -1759,7 +1784,7 @@ used in the generated posting.
 
File: hledger_journal.info, Node: Auto postings and transaction balancing / inferred amounts / balance assertions, Next: Auto posting tags, Prev: Auto postings and dates, Up: Auto postings File: hledger_journal.info, Node: Auto postings and transaction balancing / inferred amounts / balance assertions, Next: Auto posting tags, Prev: Auto postings and dates, Up: Auto postings
1.14.3 Auto postings and transaction balancing / inferred amounts / 1.15.3 Auto postings and transaction balancing / inferred amounts /
------------------------------------------------------------------- -------------------------------------------------------------------
balance assertions Currently, auto postings are added: balance assertions Currently, auto postings are added:
@ -1775,7 +1800,7 @@ for background.
 
File: hledger_journal.info, Node: Auto posting tags, Prev: Auto postings and transaction balancing / inferred amounts / balance assertions, Up: Auto postings File: hledger_journal.info, Node: Auto posting tags, Prev: Auto postings and transaction balancing / inferred amounts / balance assertions, Up: Auto postings
1.14.4 Auto posting tags 1.15.4 Auto posting tags
------------------------ ------------------------
Automated postings will have some extra tags: Automated postings will have some extra tags:
@ -1799,120 +1824,122 @@ Tag Table:
Node: Top76 Node: Top76
Node: Transactions1875 Node: Transactions1875
Ref: #transactions1967 Ref: #transactions1967
Node: Dates3132 Node: Dates3251
Ref: #dates3231 Ref: #dates3350
Node: Simple dates3296 Node: Simple dates3415
Ref: #simple-dates3422 Ref: #simple-dates3541
Node: Secondary dates3931 Node: Secondary dates4050
Ref: #secondary-dates4085 Ref: #secondary-dates4204
Node: Posting dates5421 Node: Posting dates5540
Ref: #posting-dates5550 Ref: #posting-dates5669
Node: Status6922 Node: Status7041
Ref: #status7043 Ref: #status7162
Node: Description8751 Node: Description8870
Ref: #description8885 Ref: #description9004
Node: Payee and note9205 Node: Payee and note9324
Ref: #payee-and-note9319 Ref: #payee-and-note9438
Node: Comments9654 Node: Comments9773
Ref: #comments9780 Ref: #comments9899
Node: Tags10974 Node: Tags11093
Ref: #tags11089 Ref: #tags11208
Node: Postings12482 Node: Postings12601
Ref: #postings12610 Ref: #postings12729
Node: Virtual Postings13636 Node: Virtual postings13755
Ref: #virtual-postings13753 Ref: #virtual-postings13872
Node: Account names15058 Node: Account names15177
Ref: #account-names15199 Ref: #account-names15318
Node: Amounts15686 Node: Amounts15805
Ref: #amounts15825 Ref: #amounts15944
Node: Digit group marks16739 Node: Digit group marks17052
Ref: #digit-group-marks16887 Ref: #digit-group-marks17200
Node: Amount display style17825 Node: Amount display style18138
Ref: #amount-display-style17979 Ref: #amount-display-style18292
Node: Transaction prices19417 Node: Transaction prices19729
Ref: #transaction-prices19583 Ref: #transaction-prices19901
Node: Balance Assertions21849 Node: Lot prices and lot dates22233
Ref: #balance-assertions22029 Ref: #lot-prices-and-lot-dates22430
Node: Assertions and ordering23062 Node: Balance assertions22918
Ref: #assertions-and-ordering23250 Ref: #balance-assertions23104
Node: Assertions and included files23950 Node: Assertions and ordering24137
Ref: #assertions-and-included-files24193 Ref: #assertions-and-ordering24325
Node: Assertions and multiple -f options24526 Node: Assertions and included files25025
Ref: #assertions-and-multiple--f-options24782 Ref: #assertions-and-included-files25268
Node: Assertions and commodities24914 Node: Assertions and multiple -f options25601
Ref: #assertions-and-commodities25146 Ref: #assertions-and-multiple--f-options25857
Node: Assertions and prices26303 Node: Assertions and commodities25989
Ref: #assertions-and-prices26517 Ref: #assertions-and-commodities26221
Node: Assertions and subaccounts26957 Node: Assertions and prices27378
Ref: #assertions-and-subaccounts27186 Ref: #assertions-and-prices27592
Node: Assertions and virtual postings27510 Node: Assertions and subaccounts28032
Ref: #assertions-and-virtual-postings27752 Ref: #assertions-and-subaccounts28261
Node: Assertions and precision27894 Node: Assertions and virtual postings28585
Ref: #assertions-and-precision28087 Ref: #assertions-and-virtual-postings28827
Node: Balance Assignments28354 Node: Assertions and precision28969
Ref: #balance-assignments28528 Ref: #assertions-and-precision29162
Node: Balance assignments and prices29692 Node: Balance assignments29429
Ref: #balance-assignments-and-prices29864 Ref: #balance-assignments29603
Node: Directives30088 Node: Balance assignments and prices30767
Ref: #directives30247 Ref: #balance-assignments-and-prices30939
Node: Directives and multiple files35928 Node: Directives31163
Ref: #directives-and-multiple-files36111 Ref: #directives31322
Node: Comment blocks36775 Node: Directives and multiple files37013
Ref: #comment-blocks36958 Ref: #directives-and-multiple-files37196
Node: Including other files37134 Node: Comment blocks37860
Ref: #including-other-files37314 Ref: #comment-blocks38043
Node: Default year37722 Node: Including other files38219
Ref: #default-year37891 Ref: #including-other-files38399
Node: Declaring commodities38298 Node: Default year38807
Ref: #declaring-commodities38481 Ref: #default-year38976
Node: Default commodity40287 Node: Declaring commodities39383
Ref: #default-commodity40463 Ref: #declaring-commodities39566
Node: Market prices41352 Node: Default commodity41372
Ref: #market-prices41517 Ref: #default-commodity41558
Node: Declaring accounts42358 Node: Declaring market prices42447
Ref: #declaring-accounts42534 Ref: #declaring-market-prices42642
Node: Account comments43459 Node: Declaring accounts43499
Ref: #account-comments43622 Ref: #declaring-accounts43685
Node: Account subdirectives44046 Node: Account comments44610
Ref: #account-subdirectives44241 Ref: #account-comments44773
Node: Account types44554 Node: Account subdirectives45197
Ref: #account-types44738 Ref: #account-subdirectives45392
Node: Account display order46377 Node: Account types45705
Ref: #account-display-order46547 Ref: #account-types45889
Node: Rewriting accounts47698 Node: Account display order47528
Ref: #rewriting-accounts47883 Ref: #account-display-order47698
Node: Basic aliases48640 Node: Rewriting accounts48849
Ref: #basic-aliases48786 Ref: #rewriting-accounts49034
Node: Regex aliases49490 Node: Basic aliases49791
Ref: #regex-aliases49662 Ref: #basic-aliases49937
Node: Combining aliases50380 Node: Regex aliases50641
Ref: #combining-aliases50573 Ref: #regex-aliases50813
Node: Aliases and multiple files51849 Node: Combining aliases51531
Ref: #aliases-and-multiple-files52058 Ref: #combining-aliases51724
Node: end aliases52637 Node: Aliases and multiple files53000
Ref: #end-aliases52794 Ref: #aliases-and-multiple-files53209
Node: Default parent account52895 Node: end aliases53788
Ref: #default-parent-account53063 Ref: #end-aliases53945
Node: Periodic transactions53947 Node: Default parent account54046
Ref: #periodic-transactions54122 Ref: #default-parent-account54214
Node: Periodic rule syntax55994 Node: Periodic transactions55098
Ref: #periodic-rule-syntax56200 Ref: #periodic-transactions55273
Node: Two spaces between period expression and description!56904 Node: Periodic rule syntax57145
Ref: #two-spaces-between-period-expression-and-description57223 Ref: #periodic-rule-syntax57351
Node: Forecasting with periodic transactions57907 Node: Two spaces between period expression and description!58055
Ref: #forecasting-with-periodic-transactions58212 Ref: #two-spaces-between-period-expression-and-description58374
Node: Budgeting with periodic transactions60238 Node: Forecasting with periodic transactions59058
Ref: #budgeting-with-periodic-transactions60477 Ref: #forecasting-with-periodic-transactions59363
Node: Auto postings60926 Node: Budgeting with periodic transactions61389
Ref: #auto-postings61066 Ref: #budgeting-with-periodic-transactions61628
Node: Auto postings and multiple files63245 Node: Auto postings62077
Ref: #auto-postings-and-multiple-files63449 Ref: #auto-postings62217
Node: Auto postings and dates63658 Node: Auto postings and multiple files64396
Ref: #auto-postings-and-dates63932 Ref: #auto-postings-and-multiple-files64600
Node: Auto postings and transaction balancing / inferred amounts / balance assertions64107 Node: Auto postings and dates64809
Ref: #auto-postings-and-transaction-balancing-inferred-amounts-balance-assertions64458 Ref: #auto-postings-and-dates65083
Node: Auto posting tags64800 Node: Auto postings and transaction balancing / inferred amounts / balance assertions65258
Ref: #auto-posting-tags65015 Ref: #auto-postings-and-transaction-balancing-inferred-amounts-balance-assertions65609
Node: Auto posting tags65951
Ref: #auto-posting-tags66166
 
End Tag Table End Tag Table

View File

@ -57,7 +57,8 @@ FILE FORMAT
line, and any following indented lines beginning with a semicolon) line, and any following indented lines beginning with a semicolon)
o 0 or more indented posting lines, describing what was transferred and o 0 or more indented posting lines, describing what was transferred and
the accounts involved. the accounts involved (indented comment lines are also allowed, but
not blank lines or non-indented lines).
Here's a simple journal file containing one transaction: Here's a simple journal file containing one transaction:
@ -67,35 +68,35 @@ FILE FORMAT
Dates Dates
Simple dates Simple dates
Dates in the journal file use simple dates format: YYYY-MM-DD or Dates in the journal file use simple dates format: YYYY-MM-DD or
YYYY/MM/DD or YYYY.MM.DD, with leading zeros optional. The year may be YYYY/MM/DD or YYYY.MM.DD, with leading zeros optional. The year may be
omitted, in which case it will be inferred from the context: the cur- omitted, in which case it will be inferred from the context: the cur-
rent transaction, the default year set with a default year directive, rent transaction, the default year set with a default year directive,
or the current date when the command is run. Some examples: or the current date when the command is run. Some examples:
2010-01-31, 2010/01/31, 2010.1.31, 1/31. 2010-01-31, 2010/01/31, 2010.1.31, 1/31.
(The UI also accepts simple dates, as well as the more flexible smart (The UI also accepts simple dates, as well as the more flexible smart
dates documented in the hledger manual.) dates documented in the hledger manual.)
Secondary dates Secondary dates
Real-life transactions sometimes involve more than one date - eg the Real-life transactions sometimes involve more than one date - eg the
date you write a cheque, and the date it clears in your bank. When you date you write a cheque, and the date it clears in your bank. When you
want to model this, for more accurate daily balances, you can specify want to model this, for more accurate daily balances, you can specify
individual posting dates. individual posting dates.
Or, you can use the older secondary date feature (Ledger calls it aux- Or, you can use the older secondary date feature (Ledger calls it aux-
iliary date or effective date). Note: we support this for compatibil- iliary date or effective date). Note: we support this for compatibil-
ity, but I usually recommend avoiding this feature; posting dates are ity, but I usually recommend avoiding this feature; posting dates are
almost always clearer and simpler. almost always clearer and simpler.
A secondary date is written after the primary date, following an equals A secondary date is written after the primary date, following an equals
sign. If the year is omitted, the primary date's year is assumed. sign. If the year is omitted, the primary date's year is assumed.
When running reports, the primary (left) date is used by default, but When running reports, the primary (left) date is used by default, but
with the --date2 flag (or --aux-date or --effective), the secondary with the --date2 flag (or --aux-date or --effective), the secondary
(right) date will be used instead. (right) date will be used instead.
The meaning of secondary dates is up to you, but it's best to follow a The meaning of secondary dates is up to you, but it's best to follow a
consistent rule. Eg "primary = the bank's clearing date, secondary = consistent rule. Eg "primary = the bank's clearing date, secondary =
date the transaction was initiated, if different", as shown here: date the transaction was initiated, if different", as shown here:
2010/2/23=2/19 movie ticket 2010/2/23=2/19 movie ticket
@ -109,11 +110,11 @@ FILE FORMAT
2010-02-19 movie ticket assets:checking $-10 $-10 2010-02-19 movie ticket assets:checking $-10 $-10
Posting dates Posting dates
You can give individual postings a different date from their parent You can give individual postings a different date from their parent
transaction, by adding a posting comment containing a tag (see below) transaction, by adding a posting comment containing a tag (see below)
like date:DATE. This is probably the best way to control posting dates like date:DATE. This is probably the best way to control posting dates
precisely. Eg in this example the expense should appear in May re- precisely. Eg in this example the expense should appear in May re-
ports, and the deduction from checking should be reported on 6/1 for ports, and the deduction from checking should be reported on 6/1 for
easy bank reconciliation: easy bank reconciliation:
2015/5/30 2015/5/30
@ -126,22 +127,22 @@ FILE FORMAT
$ hledger -f t.j register checking $ hledger -f t.j register checking
2015-06-01 assets:checking $-10 $-10 2015-06-01 assets:checking $-10 $-10
DATE should be a simple date; if the year is not specified it will use DATE should be a simple date; if the year is not specified it will use
the year of the transaction's date. You can set the secondary date the year of the transaction's date. You can set the secondary date
similarly, with date2:DATE2. The date: or date2: tags must have a similarly, with date2:DATE2. The date: or date2: tags must have a
valid simple date value if they are present, eg a date: tag with no valid simple date value if they are present, eg a date: tag with no
value is not allowed. value is not allowed.
Ledger's earlier, more compact bracketed date syntax is also supported: Ledger's earlier, more compact bracketed date syntax is also supported:
[DATE], [DATE=DATE2] or [=DATE2]. hledger will attempt to parse any [DATE], [DATE=DATE2] or [=DATE2]. hledger will attempt to parse any
square-bracketed sequence of the 0123456789/-.= characters in this way. square-bracketed sequence of the 0123456789/-.= characters in this way.
With this syntax, DATE infers its year from the transaction and DATE2 With this syntax, DATE infers its year from the transaction and DATE2
infers its year from DATE. infers its year from DATE.
Status Status
Transactions, or individual postings within a transaction, can have a Transactions, or individual postings within a transaction, can have a
status mark, which is a single character before the transaction de- status mark, which is a single character before the transaction de-
scription or posting account name, separated from it by a space, indi- scription or posting account name, separated from it by a space, indi-
cating one of three statuses: cating one of three statuses:
mark status mark status
@ -150,23 +151,23 @@ FILE FORMAT
! pending ! pending
* cleared * cleared
When reporting, you can filter by status with the -U/--unmarked, When reporting, you can filter by status with the -U/--unmarked,
-P/--pending, and -C/--cleared flags; or the status:, status:!, and -P/--pending, and -C/--cleared flags; or the status:, status:!, and
status:* queries; or the U, P, C keys in hledger-ui. status:* queries; or the U, P, C keys in hledger-ui.
Note, in Ledger and in older versions of hledger, the "unmarked" state Note, in Ledger and in older versions of hledger, the "unmarked" state
is called "uncleared". As of hledger 1.3 we have renamed it to un- is called "uncleared". As of hledger 1.3 we have renamed it to un-
marked for clarity. marked for clarity.
To replicate Ledger and old hledger's behaviour of also matching pend- To replicate Ledger and old hledger's behaviour of also matching pend-
ing, combine -U and -P. ing, combine -U and -P.
Status marks are optional, but can be helpful eg for reconciling with Status marks are optional, but can be helpful eg for reconciling with
real-world accounts. Some editor modes provide highlighting and short- real-world accounts. Some editor modes provide highlighting and short-
cuts for working with status. Eg in Emacs ledger-mode, you can toggle cuts for working with status. Eg in Emacs ledger-mode, you can toggle
transaction status with C-c C-e, or posting status with C-c C-c. transaction status with C-c C-e, or posting status with C-c C-c.
What "uncleared", "pending", and "cleared" actually mean is up to you. What "uncleared", "pending", and "cleared" actually mean is up to you.
Here's one suggestion: Here's one suggestion:
status meaning status meaning
@ -177,34 +178,34 @@ FILE FORMAT
cleared complete, reconciled as far as possible, and considered cor- cleared complete, reconciled as far as possible, and considered cor-
rect rect
With this scheme, you would use -PC to see the current balance at your With this scheme, you would use -PC to see the current balance at your
bank, -U to see things which will probably hit your bank soon (like un- bank, -U to see things which will probably hit your bank soon (like un-
cashed checks), and no flags to see the most up-to-date state of your cashed checks), and no flags to see the most up-to-date state of your
finances. finances.
Description Description
A transaction's description is the rest of the line following the date A transaction's description is the rest of the line following the date
and status mark (or until a comment begins). Sometimes called the and status mark (or until a comment begins). Sometimes called the
"narration" in traditional bookkeeping, it can be used for whatever you "narration" in traditional bookkeeping, it can be used for whatever you
wish, or left blank. Transaction descriptions can be queried, unlike wish, or left blank. Transaction descriptions can be queried, unlike
comments. comments.
Payee and note Payee and note
You can optionally include a | (pipe) character in descriptions to sub- You can optionally include a | (pipe) character in descriptions to sub-
divide the description into separate fields for payee/payer name on the divide the description into separate fields for payee/payer name on the
left (up to the first |) and an additional note field on the right (af- left (up to the first |) and an additional note field on the right (af-
ter the first |). This may be worthwhile if you need to do more pre- ter the first |). This may be worthwhile if you need to do more pre-
cise querying and pivoting by payee or by note. cise querying and pivoting by payee or by note.
Comments Comments
Lines in the journal beginning with a semicolon (;) or hash (#) or star Lines in the journal beginning with a semicolon (;) or hash (#) or star
(*) are comments, and will be ignored. (Star comments cause org-mode (*) are comments, and will be ignored. (Star comments cause org-mode
nodes to be ignored, allowing emacs users to fold and navigate their nodes to be ignored, allowing emacs users to fold and navigate their
journals with org-mode or orgstruct-mode.) journals with org-mode or orgstruct-mode.)
You can attach comments to a transaction by writing them after the de- You can attach comments to a transaction by writing them after the de-
scription and/or indented on the following lines (before the postings). scription and/or indented on the following lines (before the postings).
Similarly, you can attach comments to an individual posting by writing Similarly, you can attach comments to an individual posting by writing
them after the amount and/or indented on the following lines. Transac- them after the amount and/or indented on the following lines. Transac-
tion and posting comments must begin with a semicolon (;). tion and posting comments must begin with a semicolon (;).
@ -228,24 +229,24 @@ FILE FORMAT
; another comment line for posting 2 ; another comment line for posting 2
; a file comment (because not indented) ; a file comment (because not indented)
You can also comment larger regions of a file using comment and end You can also comment larger regions of a file using comment and end
comment directives. comment directives.
Tags Tags
Tags are a way to add extra labels or labelled data to postings and Tags are a way to add extra labels or labelled data to postings and
transactions, which you can then search or pivot on. transactions, which you can then search or pivot on.
A simple tag is a word (which may contain hyphens) followed by a full A simple tag is a word (which may contain hyphens) followed by a full
colon, written inside a transaction or posting comment line: colon, written inside a transaction or posting comment line:
2017/1/16 bought groceries ; sometag: 2017/1/16 bought groceries ; sometag:
Tags can have a value, which is the text after the colon, up to the Tags can have a value, which is the text after the colon, up to the
next comma or end of line, with leading/trailing whitespace removed: next comma or end of line, with leading/trailing whitespace removed:
expenses:food $10 ; a-posting-tag: the tag value expenses:food $10 ; a-posting-tag: the tag value
Note this means hledger's tag values can not contain commas or new- Note this means hledger's tag values can not contain commas or new-
lines. Ending at commas means you can write multiple short tags on one lines. Ending at commas means you can write multiple short tags on one
line, comma separated: line, comma separated:
@ -259,57 +260,57 @@ FILE FORMAT
o "tag2" is another tag, whose value is "some value ..." o "tag2" is another tag, whose value is "some value ..."
Tags in a transaction comment affect the transaction and all of its Tags in a transaction comment affect the transaction and all of its
postings, while tags in a posting comment affect only that posting. postings, while tags in a posting comment affect only that posting.
For example, the following transaction has three tags (A, TAG2, third- For example, the following transaction has three tags (A, TAG2, third-
tag) and the posting has four (those plus posting-tag): tag) and the posting has four (those plus posting-tag):
1/1 a transaction ; A:, TAG2: 1/1 a transaction ; A:, TAG2:
; third-tag: a third transaction tag, <- with a value ; third-tag: a third transaction tag, <- with a value
(a) $1 ; posting-tag: (a) $1 ; posting-tag:
Tags are like Ledger's metadata feature, except hledger's tag values Tags are like Ledger's metadata feature, except hledger's tag values
are simple strings. are simple strings.
Postings Postings
A posting is an addition of some amount to, or removal of some amount A posting is an addition of some amount to, or removal of some amount
from, an account. Each posting line begins with at least one space or from, an account. Each posting line begins with at least one space or
tab (2 or 4 spaces is common), followed by: tab (2 or 4 spaces is common), followed by:
o (optional) a status character (empty, !, or *), followed by a space o (optional) a status character (empty, !, or *), followed by a space
o (required) an account name (any text, optionally containing single o (required) an account name (any text, optionally containing single
spaces, until end of line or a double space) spaces, until end of line or a double space)
o (optional) two or more spaces or tabs followed by an amount. o (optional) two or more spaces or tabs followed by an amount.
Positive amounts are being added to the account, negative amounts are Positive amounts are being added to the account, negative amounts are
being removed. being removed.
The amounts within a transaction must always sum up to zero. As a con- The amounts within a transaction must always sum up to zero. As a con-
venience, one amount may be left blank; it will be inferred so as to venience, one amount may be left blank; it will be inferred so as to
balance the transaction. balance the transaction.
Be sure to note the unusual two-space delimiter between account name Be sure to note the unusual two-space delimiter between account name
and amount. This makes it easy to write account names containing spa- and amount. This makes it easy to write account names containing spa-
ces. But if you accidentally leave only one space (or tab) before the ces. But if you accidentally leave only one space (or tab) before the
amount, the amount will be considered part of the account name. amount, the amount will be considered part of the account name.
Virtual Postings Virtual postings
A posting with a parenthesised account name is called a virtual posting A posting with a parenthesised account name is called a virtual posting
or unbalanced posting, which means it is exempt from the usual rule or unbalanced posting, which means it is exempt from the usual rule
that a transaction's postings must balance add up to zero. that a transaction's postings must balance add up to zero.
This is not part of double entry accounting, so you might choose to This is not part of double entry accounting, so you might choose to
avoid this feature. Or you can use it sparingly for certain special avoid this feature. Or you can use it sparingly for certain special
cases where it can be convenient. Eg, you could set opening balances cases where it can be convenient. Eg, you could set opening balances
without using a balancing equity account: without using a balancing equity account:
1/1 opening balances 1/1 opening balances
(assets:checking) $1000 (assets:checking) $1000
(assets:savings) $2000 (assets:savings) $2000
A posting with a bracketed account name is called a balanced virtual A posting with a bracketed account name is called a balanced virtual
posting. The balanced virtual postings in a transaction must add up to posting. The balanced virtual postings in a transaction must add up to
zero (separately from other postings). Eg: zero (separately from other postings). Eg:
@ -321,34 +322,34 @@ FILE FORMAT
[assets:checking:available] $10 ; <- [assets:checking:available] $10 ; <-
(something:else) $5 ; <- not required to balance (something:else) $5 ; <- not required to balance
Ordinary non-parenthesised, non-bracketed postings are called real Ordinary non-parenthesised, non-bracketed postings are called real
postings. You can exclude virtual postings from reports with the postings. You can exclude virtual postings from reports with the
-R/--real flag or real:1 query. -R/--real flag or real:1 query.
Account names Account names
Account names typically have several parts separated by a full colon, Account names typically have several parts separated by a full colon,
from which hledger derives a hierarchical chart of accounts. They can from which hledger derives a hierarchical chart of accounts. They can
be anything you like, but in finance there are traditionally five top- be anything you like, but in finance there are traditionally five top-
level accounts: assets, liabilities, income, expenses, and equity. level accounts: assets, liabilities, income, expenses, and equity.
Account names may contain single spaces, eg: assets:accounts receiv- Account names may contain single spaces, eg: assets:accounts receiv-
able. Because of this, they must always be followed by two or more able. Because of this, they must always be followed by two or more
spaces (or newline). spaces (or newline).
Account names can be aliased. Account names can be aliased.
Amounts Amounts
After the account name, there is usually an amount. (Important: be- After the account name, there is usually an amount. (Important: be-
tween account name and amount, there must be two or more spaces.) tween account name and amount, there must be two or more spaces.)
hledger's amount format is flexible, supporting several international hledger's amount format is flexible, supporting several international
formats. Here are some examples. Amounts have a number (the "quan- formats. Here are some examples. Amounts have a number (the "quan-
tity"): tity"):
1 1
..and usually a currency or commodity name (the "commodity"). This is ..and usually a currency or commodity name (the "commodity"). This is
a symbol, word, or phrase, to the left or right of the quantity, with a symbol, word, or phrase, to the left or right of the quantity, with
or without a separating space: or without a separating space:
$1 $1
@ -359,12 +360,19 @@ FILE FORMAT
3 "no. 42 green apples" 3 "no. 42 green apples"
Amounts can be negative. The minus sign can be written before or after Amounts can be preceded by a minus sign (or a plus sign, though plus is
a left-side commodity symbol: the default), The sign can be written before or after a left-side com-
modity symbol:
-$1 -$1
$-1 $-1
One or more spaces between the sign and the number are acceptable when
parsing (but they won't be displayed in output):
+ $1
$- 1
Scientific E notation is allowed: Scientific E notation is allowed:
1E-6 1E-6
@ -376,8 +384,8 @@ FILE FORMAT
1,23456780000009 1,23456780000009
Digit group marks Digit group marks
In the integer part of the quantity (left of the decimal mark), groups In the integer part of the quantity (left of the decimal mark), groups
of digits can optionally be separated by a "digit group mark" - a of digits can optionally be separated by a "digit group mark" - a
space, comma, or period (different from the decimal mark): space, comma, or period (different from the decimal mark):
$1,000,000.00 $1,000,000.00
@ -385,7 +393,7 @@ FILE FORMAT
INR 9,99,99,999.00 INR 9,99,99,999.00
1 000 000.9455 1 000 000.9455
Note, a number containing a single group mark and no decimal mark is Note, a number containing a single group mark and no decimal mark is
ambiguous. Are these group marks or decimal marks ? ambiguous. Are these group marks or decimal marks ?
1,000 1,000
@ -393,9 +401,9 @@ FILE FORMAT
hledger will treat them both as decimal marks by default (cf #793). If hledger will treat them both as decimal marks by default (cf #793). If
you use digit group marks, to prevent confusion and undetected typos we you use digit group marks, to prevent confusion and undetected typos we
recommend you write commodity directives at the top of the file to ex- recommend you write commodity directives at the top of the file to ex-
plicitly declare the decimal mark (and optionally a digit group mark). plicitly declare the decimal mark (and optionally a digit group mark).
Note, these formats ("amount styles") are specific to each commodity, Note, these formats ("amount styles") are specific to each commodity,
so if your data uses multiple formats, hledger can handle it: so if your data uses multiple formats, hledger can handle it:
commodity $1,000.00 commodity $1,000.00
@ -404,41 +412,41 @@ FILE FORMAT
commodity 1 000 000.9455 commodity 1 000 000.9455
Amount display style Amount display style
For each commodity, hledger chooses a consistent format to use when For each commodity, hledger chooses a consistent format to use when
displaying amounts. (Except price amounts, which are always displayed displaying amounts. (Except price amounts, which are always displayed
as written). The display style is chosen as follows: as written). The display style is chosen as follows:
o If there is a commodity directive (or default commodity directive) o If there is a commodity directive (or default commodity directive)
for the commodity, that format is used (see examples above). for the commodity, that format is used (see examples above).
o Otherwise the format of the first posting amount in that commodity o Otherwise the format of the first posting amount in that commodity
seen in the journal is used. But the number of decimal places ("pre- seen in the journal is used. But the number of decimal places ("pre-
cision") will be the maximum from all posting amounts in that comm- cision") will be the maximum from all posting amounts in that commod-
modity. ity.
o Or if there are no such amounts in the journal, a default format is o Or if there are no such amounts in the journal, a default format is
used (like $1000.00). used (like $1000.00).
Transaction prices don't affect the amount display style directly, but Transaction prices don't affect the amount display style directly, but
occasionally they can do so indirectly (eg when an posting's amount is occasionally they can do so indirectly (eg when an posting's amount is
inferred using a transaction price). If you find this causing prob- inferred using a transaction price). If you find this causing prob-
lems, use a commodity directive to fix the display style. lems, use a commodity directive to fix the display style.
In summary: amounts will be displayed much as they appear in your jour- In summary: amounts will be displayed much as they appear in your jour-
nal, with the max observed number of decimal places. If you want to nal, with the max observed number of decimal places. If you want to
see fewer decimal places in reports, use a commodity directive to over- see fewer decimal places in reports, use a commodity directive to over-
ride that. ride that.
hledger uses banker's rounding: it rounds to the nearest even number, hledger uses banker's rounding: it rounds to the nearest even number,
eg 0.5 displayed with zero decimal places is "0"). (Note, prior to eg 0.5 displayed with zero decimal places is "0"). (Note, prior to
hledger 1.17.1 this could vary if hledger happened to be built with an hledger 1.17.1 this could vary if hledger happened to be built with an
old version of Decimal (<0.5.1); since 1.17.1 it's guaranteed.) old version of Decimal (<0.5.1); since 1.17.1 it's guaranteed.)
Transaction prices Transaction prices
Within a transaction, you can note an amount's price in another commod- Within a transaction, you can note an amount's price in another commod-
ity. This can be used to document the cost (in a purchase) or selling ity. This can be used to document the cost (in a purchase) or selling
price (in a sale). For example, transaction prices are useful to price (in a sale). For example, transaction prices are useful to
record purchases of a foreign currency. Note transaction prices are record purchases of a foreign currency. Note transaction prices are
fixed at the time of the transaction, and do not change over time. See fixed at the time of the transaction, and do not change over time. See
also market prices, which represent prevailing exchange rates on a cer- also market prices, which represent prevailing exchange rates on a cer-
tain date. tain date.
@ -464,8 +472,9 @@ FILE FORMAT
assets:euros EUR100 ; one hundred euros purchased assets:euros EUR100 ; one hundred euros purchased
assets:dollars $-135 ; for $135 assets:dollars $-135 ; for $135
(Ledger users: Ledger uses a different syntax for fixed prices, {=UNIT- 5. Like 1 and 2, but the @ or @@ is parenthesised; this is for compati-
PRICE}, which hledger currently ignores). bility with Ledger journals (Virtual posting costs), and in hledger
is equivalent to 1 and 2.
Use the -B/--cost flag to convert amounts to their transaction price's Use the -B/--cost flag to convert amounts to their transaction price's
commodity, if any. (mnemonic: "B" is from "cost Basis", as in Ledger). commodity, if any. (mnemonic: "B" is from "cost Basis", as in Ledger).
@ -491,7 +500,16 @@ FILE FORMAT
EUR-100 assets:dollars # <- the dollars' selling price EUR-100 assets:dollars # <- the dollars' selling price
EUR100 assets:euros EUR100 assets:euros
Balance Assertions Lot prices and lot dates
Ledger allows another kind of price, lot price (four variants: {UNIT-
PRICE}, {{TOTALPRICE}}, {=FIXEDUNITPRICE}, {{=FIXEDTOTALPRICE}}),
and/or a lot date ([DATE]) to be specified. These are normally used to
select a lot when selling investments. hledger will parse these, for
compatibility with Ledger journals, but currently ignores them. A
transaction price, lot price and/or lot date may appear in any order,
after the posting amount and before the balance assertion if any.
Balance assertions
hledger supports Ledger-style balance assertions in journal files. hledger supports Ledger-style balance assertions in journal files.
These look like, for example, = EXPECTEDBALANCE following a posting's These look like, for example, = EXPECTEDBALANCE following a posting's
amount. Eg here we assert the expected dollar balance in accounts a amount. Eg here we assert the expected dollar balance in accounts a
@ -614,7 +632,7 @@ FILE FORMAT
limit the display precision, but this will not affect balance asser- limit the display precision, but this will not affect balance asser-
tions. Balance assertion failure messages show exact amounts. tions. Balance assertion failure messages show exact amounts.
Balance Assignments Balance assignments
Ledger-style balance assignments are also supported. These are like Ledger-style balance assignments are also supported. These are like
balance assertions, but with no posting amount on the left side of the balance assertions, but with no posting amount on the left side of the
equals sign; instead it is calculated automatically so as to satisfy equals sign; instead it is calculated automatically so as to satisfy
@ -710,6 +728,9 @@ FILE FORMAT
commodity commodity in re- commodity commodity in re-
ports, when -V is ports, when -V is
used used
Y declare a year for yearless following in- Y declare a year for yearless following in-
dates line/included en- dates line/included en-
tries until end of tries until end of
@ -863,7 +884,7 @@ FILE FORMAT
a 5 ; <- commodity-less amount, parsed as $5 and displayed as $5.00 a 5 ; <- commodity-less amount, parsed as $5 and displayed as $5.00
b b
Market prices Declaring market prices
The P directive declares a market price, which is an exchange rate be- The P directive declares a market price, which is an exchange rate be-
tween two commodities on a certain date. (In Ledger, they are called tween two commodities on a certain date. (In Ledger, they are called
"historical prices".) These are often obtained from a stock exchange, "historical prices".) These are often obtained from a stock exchange,
@ -886,8 +907,8 @@ FILE FORMAT
P 2009/1/1 EUR $1.35 P 2009/1/1 EUR $1.35
P 2010/1/1 EUR $1.40 P 2010/1/1 EUR $1.40
The -V/--value flag can be used to convert reported amounts to another The -V, -X and --value flags use these market prices to show amount
commodity using these prices. values in another commodity. See Valuation.
Declaring accounts Declaring accounts
account directives can be used to pre-declare accounts. Though not re- account directives can be used to pre-declare accounts. Though not re-
@ -1458,4 +1479,4 @@ SEE ALSO
hledger 1.17.99 March 2020 hledger_journal(5) hledger 1.17.99 May 2020 hledger_journal(5)

View File

@ -1,5 +1,5 @@
.TH "hledger_timeclock" "5" "March 2020" "hledger 1.17.99" "hledger User Manuals" .TH "hledger_timeclock" "5" "May 2020" "hledger 1.17.99" "hledger User Manuals"

View File

@ -78,4 +78,4 @@ SEE ALSO
hledger 1.17.99 March 2020 hledger_timeclock(5) hledger 1.17.99 May 2020 hledger_timeclock(5)

View File

@ -1,5 +1,5 @@
.TH "hledger_timedot" "5" "March 2020" "hledger 1.17.99" "hledger User Manuals" .TH "hledger_timedot" "5" "May 2020" "hledger 1.17.99" "hledger User Manuals"

View File

@ -161,4 +161,4 @@ SEE ALSO
hledger 1.17.99 March 2020 hledger_timedot(5) hledger 1.17.99 May 2020 hledger_timedot(5)

View File

@ -4,4 +4,4 @@ m4_dnl Program version. Updated by make setversion.
m4_define({{_version_}}, {{1.17.99}})m4_dnl m4_define({{_version_}}, {{1.17.99}})m4_dnl
m4_dnl m4_dnl
m4_dnl Date to show in man pages. Updated by make setdate. m4_dnl Date to show in man pages. Updated by make setdate.
m4_define({{_monthyear_}}, {{March 2020}})m4_dnl m4_define({{_monthyear_}}, {{May 2020}})m4_dnl

View File

@ -1,5 +1,5 @@
.TH "hledger-ui" "1" "March 2020" "hledger-ui 1.17.99" "hledger User Manuals" .TH "hledger-ui" "1" "May 2020" "hledger-ui 1.17.99" "hledger User Manuals"

View File

@ -441,4 +441,4 @@ SEE ALSO
hledger-ui 1.17.99 March 2020 hledger-ui(1) hledger-ui 1.17.99 May 2020 hledger-ui(1)

View File

@ -4,4 +4,4 @@ m4_dnl Program version. Updated by make setversion.
m4_define({{_version_}}, {{1.17.99}})m4_dnl m4_define({{_version_}}, {{1.17.99}})m4_dnl
m4_dnl m4_dnl
m4_dnl Date to show in man pages. Updated by make setdate. m4_dnl Date to show in man pages. Updated by make setdate.
m4_define({{_monthyear_}}, {{March 2020}})m4_dnl m4_define({{_monthyear_}}, {{May 2020}})m4_dnl

View File

@ -1,5 +1,5 @@
.TH "hledger-web" "1" "March 2020" "hledger-web 1.17.99" "hledger User Manuals" .TH "hledger-web" "1" "May 2020" "hledger-web 1.17.99" "hledger User Manuals"
@ -316,10 +316,20 @@ message until the file has been fixed.
that both machine clocks are roughly in step.) that both machine clocks are roughly in step.)
.SH JSON API .SH JSON API
.PP .PP
In addition to the web UI, hledger-web provides some API routes that In addition to the web UI, hledger-web also serves a JSON API that can
serve JSON in response to GET requests. be used to get data or add new transactions.
(And when started with \f[C]--serve-api\f[R], it provides only these If you want the JSON API only, you can use the \f[C]--serve-api\f[R]
routes.): flag.
Eg:
.IP
.nf
\f[C]
$ hledger-web -f examples/sample.journal --serve-api
\&...
\f[R]
.fi
.PP
You can get JSON data from these routes:
.IP .IP
.nf .nf
\f[C] \f[C]
@ -328,48 +338,201 @@ routes.):
/prices /prices
/commodities /commodities
/accounts /accounts
/accounttransactions/#AccountName /accounttransactions/ACCOUNTNAME
\f[R] \f[R]
.fi .fi
.PP .PP
Also, you can append a new transaction to the journal by sending a PUT Eg, all account names in the journal (similar to the accounts command):
request to \f[C]/add\f[R] (hledger-web only). .IP
As with the web UI\[aq]s add form, hledger-web must be started with the .nf
\f[C]add\f[R] capability for this (enabled by default). \f[C]
$ curl -s http://127.0.0.1:5000/accountnames | python -m json.tool
[
\[dq]assets\[dq],
\[dq]assets:bank\[dq],
\[dq]assets:bank:checking\[dq],
\[dq]assets:bank:saving\[dq],
\[dq]assets:cash\[dq],
\[dq]expenses\[dq],
\[dq]expenses:food\[dq],
\[dq]expenses:supplies\[dq],
\[dq]income\[dq],
\[dq]income:gifts\[dq],
\[dq]income:salary\[dq],
\[dq]liabilities\[dq],
\[dq]liabilities:debts\[dq]
]
\f[R]
.fi
.PP .PP
The payload should be a valid hledger transaction as JSON, similar to Or all transactions:
what you get from \f[C]/transactions\f[R] or .IP
\f[C]/accounttransactions\f[R]. .nf
\f[C]
$ curl -s http://127.0.0.1:5000/transactions | python -m json.tool
[
{
\[dq]tcode\[dq]: \[dq]\[dq],
\[dq]tcomment\[dq]: \[dq]\[dq],
\[dq]tdate\[dq]: \[dq]2008-01-01\[dq],
\[dq]tdate2\[dq]: null,
\[dq]tdescription\[dq]: \[dq]income\[dq],
\[dq]tindex\[dq]: 1,
\[dq]tpostings\[dq]: [
{
\[dq]paccount\[dq]: \[dq]assets:bank:checking\[dq],
\[dq]pamount\[dq]: [
{
\[dq]acommodity\[dq]: \[dq]$\[dq],
\[dq]aismultiplier\[dq]: false,
\[dq]aprice\[dq]: null,
\&...
\f[R]
.fi
.PP .PP
Another way to generate test data is with the Most of the JSON corresponds to hledger\[aq]s data types; for details of
\f[C]readJsonFile\f[R]/\f[C]writeJsonFile\f[R] helpers in what the fields mean, see the Hledger.Data.Json haddock docs and click
Hledger.Web.Json, which can write or read most of hledger\[aq]s data on the various data types, eg Transaction.
types to or from a file. And for a higher level understanding, see the journal manual.
Eg here we write the first transaction of a sample journal: .PP
In some cases there is outer JSON corresponding to a \[dq]Report\[dq]
type.
To understand that, go to the Hledger.Web.Handler.MiscR haddock and look
at the source for the appropriate handler to see what it returns.
Eg for \f[C]/accounttransactions\f[R] it\[aq]s getAccounttransactionsR,
returning a \[dq]\f[C]accountTransactionsReport ...\f[R]\[dq].
Looking up the haddock for that we can see that /accounttransactions
returns an AccountTransactionsReport, which consists of a report title
and a list of AccountTransactionsReportItem (etc).
.PP
You can add a new transaction to the journal with a PUT request to
\f[C]/add\f[R], if hledger-web was started with the \f[C]add\f[R]
capability (enabled by default).
The payload must be the full, exact JSON representation of a hledger
transaction (partial data won\[aq]t do).
You can get sample JSON from \f[C]/transactions\f[R] or
\f[C]/accounttransactions\f[R], or you can export it with
hledger-lib\[aq]s \f[C]writeJsonFile\f[R] helper, like so:
.IP .IP
.nf .nf
\f[C] \f[C]
$ make ghci-web $ make ghci-web
>>> :m +*Hledger.Web.Json >>> import Hledger
>>> writeJsonFile \[dq]txn.json\[dq] (head $ jtxns samplejournal) >>> writeJsonFile \[dq]txn.json\[dq] (head $ jtxns samplejournal) -- export samplejournal\[aq]s first txn
>>> :q >>> :q
$ python -m json.tool <txn.json >txn.pretty.json # optional: make human-readable
\f[R] \f[R]
.fi .fi
.PP .PP
(sample output & discussion) If you like, reformat the json to make it human-readable:
.PP
And here\[aq]s how to test adding that with curl:
.IP .IP
.nf .nf
\f[C] \f[C]
$ curl -s http://127.0.0.1:5000/add -X PUT -H \[aq]Content-Type: application/json\[aq] --data-binary \[at]txn.pretty.json; echo $ python -m json.tool txn.json >pretty
$ mv pretty txn.json
\f[R] \f[R]
.fi .fi
.PP .PP
By default, both the server-side HTML UI and the JSON API are served. Here\[aq]s how it looks as of hledger-1.17 (remember, this JSON
Running with \f[C]--serve-api\f[R] disables the former, useful if you corresponds to hledger\[aq]s Transaction and related data types):
only want to serve the API. .IP
.nf
\f[C]
{
\[dq]tcode\[dq]: \[dq]\[dq],
\[dq]tcomment\[dq]: \[dq]\[dq],
\[dq]tdate\[dq]: \[dq]2008-01-01\[dq],
\[dq]tdate2\[dq]: null,
\[dq]tdescription\[dq]: \[dq]income\[dq],
\[dq]tindex\[dq]: 1,
\[dq]tpostings\[dq]: [
{
\[dq]paccount\[dq]: \[dq]assets:bank:checking\[dq],
\[dq]pamount\[dq]: [
{
\[dq]acommodity\[dq]: \[dq]$\[dq],
\[dq]aismultiplier\[dq]: false,
\[dq]aprice\[dq]: null,
\[dq]aquantity\[dq]: {
\[dq]decimalMantissa\[dq]: 10000000000,
\[dq]decimalPlaces\[dq]: 10,
\[dq]floatingPoint\[dq]: 1
},
\[dq]astyle\[dq]: {
\[dq]ascommodityside\[dq]: \[dq]L\[dq],
\[dq]ascommodityspaced\[dq]: false,
\[dq]asdecimalpoint\[dq]: \[dq].\[dq],
\[dq]asdigitgroups\[dq]: null,
\[dq]asprecision\[dq]: 2
}
}
],
\[dq]pbalanceassertion\[dq]: null,
\[dq]pcomment\[dq]: \[dq]\[dq],
\[dq]pdate\[dq]: null,
\[dq]pdate2\[dq]: null,
\[dq]poriginal\[dq]: null,
\[dq]pstatus\[dq]: \[dq]Unmarked\[dq],
\[dq]ptags\[dq]: [],
\[dq]ptransaction_\[dq]: \[dq]1\[dq],
\[dq]ptype\[dq]: \[dq]RegularPosting\[dq]
},
{
\[dq]paccount\[dq]: \[dq]income:salary\[dq],
\[dq]pamount\[dq]: [
{
\[dq]acommodity\[dq]: \[dq]$\[dq],
\[dq]aismultiplier\[dq]: false,
\[dq]aprice\[dq]: null,
\[dq]aquantity\[dq]: {
\[dq]decimalMantissa\[dq]: -10000000000,
\[dq]decimalPlaces\[dq]: 10,
\[dq]floatingPoint\[dq]: -1
},
\[dq]astyle\[dq]: {
\[dq]ascommodityside\[dq]: \[dq]L\[dq],
\[dq]ascommodityspaced\[dq]: false,
\[dq]asdecimalpoint\[dq]: \[dq].\[dq],
\[dq]asdigitgroups\[dq]: null,
\[dq]asprecision\[dq]: 2
}
}
],
\[dq]pbalanceassertion\[dq]: null,
\[dq]pcomment\[dq]: \[dq]\[dq],
\[dq]pdate\[dq]: null,
\[dq]pdate2\[dq]: null,
\[dq]poriginal\[dq]: null,
\[dq]pstatus\[dq]: \[dq]Unmarked\[dq],
\[dq]ptags\[dq]: [],
\[dq]ptransaction_\[dq]: \[dq]1\[dq],
\[dq]ptype\[dq]: \[dq]RegularPosting\[dq]
}
],
\[dq]tprecedingcomment\[dq]: \[dq]\[dq],
\[dq]tsourcepos\[dq]: {
\[dq]contents\[dq]: [
\[dq]\[dq],
[
1,
1
]
],
\[dq]tag\[dq]: \[dq]JournalSourcePos\[dq]
},
\[dq]tstatus\[dq]: \[dq]Unmarked\[dq],
\[dq]ttags\[dq]: []
}
\f[R]
.fi
.PP
And here\[aq]s how to test adding it with curl.
This should add a new entry to your journal:
.IP
.nf
\f[C]
$ curl http://127.0.0.1:5000/add -X PUT -H \[aq]Content-Type: application/json\[aq] --data-binary \[at]txn.json
\f[R]
.fi
.SH ENVIRONMENT .SH ENVIRONMENT
.PP .PP
\f[B]LEDGER_FILE\f[R] The journal file path when not specified with \f[B]LEDGER_FILE\f[R] The journal file path when not specified with

View File

@ -330,45 +330,187 @@ File: hledger-web.info, Node: JSON API, Next: ENVIRONMENT, Prev: RELOADING,
5 JSON API 5 JSON API
********** **********
In addition to the web UI, hledger-web provides some API routes that In addition to the web UI, hledger-web also serves a JSON API that can
serve JSON in response to GET requests. (And when started with be used to get data or add new transactions. If you want the JSON API
'--serve-api', it provides only these routes.): only, you can use the '--serve-api' flag. Eg:
$ hledger-web -f examples/sample.journal --serve-api
...
You can get JSON data from these routes:
/accountnames /accountnames
/transactions /transactions
/prices /prices
/commodities /commodities
/accounts /accounts
/accounttransactions/#AccountName /accounttransactions/ACCOUNTNAME
Also, you can append a new transaction to the journal by sending a Eg, all account names in the journal (similar to the accounts
PUT request to '/add' (hledger-web only). As with the web UI's add command):
form, hledger-web must be started with the 'add' capability for this
(enabled by default).
The payload should be a valid hledger transaction as JSON, similar to $ curl -s http://127.0.0.1:5000/accountnames | python -m json.tool
what you get from '/transactions' or '/accounttransactions'. [
"assets",
"assets:bank",
"assets:bank:checking",
"assets:bank:saving",
"assets:cash",
"expenses",
"expenses:food",
"expenses:supplies",
"income",
"income:gifts",
"income:salary",
"liabilities",
"liabilities:debts"
]
Another way to generate test data is with the Or all transactions:
'readJsonFile'/'writeJsonFile' helpers in Hledger.Web.Json, which can
write or read most of hledger's data types to or from a file. Eg here $ curl -s http://127.0.0.1:5000/transactions | python -m json.tool
we write the first transaction of a sample journal: [
{
"tcode": "",
"tcomment": "",
"tdate": "2008-01-01",
"tdate2": null,
"tdescription": "income",
"tindex": 1,
"tpostings": [
{
"paccount": "assets:bank:checking",
"pamount": [
{
"acommodity": "$",
"aismultiplier": false,
"aprice": null,
...
Most of the JSON corresponds to hledger's data types; for details of
what the fields mean, see the Hledger.Data.Json haddock docs and click
on the various data types, eg Transaction. And for a higher level
understanding, see the journal manual.
In some cases there is outer JSON corresponding to a "Report" type.
To understand that, go to the Hledger.Web.Handler.MiscR haddock and look
at the source for the appropriate handler to see what it returns. Eg
for '/accounttransactions' it's getAccounttransactionsR, returning a
"'accountTransactionsReport ...'". Looking up the haddock for that we
can see that /accounttransactions returns an AccountTransactionsReport,
which consists of a report title and a list of
AccountTransactionsReportItem (etc).
You can add a new transaction to the journal with a PUT request to
'/add', if hledger-web was started with the 'add' capability (enabled by
default). The payload must be the full, exact JSON representation of a
hledger transaction (partial data won't do). You can get sample JSON
from '/transactions' or '/accounttransactions', or you can export it
with hledger-lib's 'writeJsonFile' helper, like so:
$ make ghci-web $ make ghci-web
>>> :m +*Hledger.Web.Json >>> import Hledger
>>> writeJsonFile "txn.json" (head $ jtxns samplejournal) >>> writeJsonFile "txn.json" (head $ jtxns samplejournal) -- export samplejournal's first txn
>>> :q >>> :q
$ python -m json.tool <txn.json >txn.pretty.json # optional: make human-readable
(sample output & discussion) If you like, reformat the json to make it human-readable:
And here's how to test adding that with curl: $ python -m json.tool txn.json >pretty
$ mv pretty txn.json
$ curl -s http://127.0.0.1:5000/add -X PUT -H 'Content-Type: application/json' --data-binary @txn.pretty.json; echo Here's how it looks as of hledger-1.17 (remember, this JSON
corresponds to hledger's Transaction and related data types):
By default, both the server-side HTML UI and the JSON API are served. {
Running with '--serve-api' disables the former, useful if you only want "tcode": "",
to serve the API. "tcomment": "",
"tdate": "2008-01-01",
"tdate2": null,
"tdescription": "income",
"tindex": 1,
"tpostings": [
{
"paccount": "assets:bank:checking",
"pamount": [
{
"acommodity": "$",
"aismultiplier": false,
"aprice": null,
"aquantity": {
"decimalMantissa": 10000000000,
"decimalPlaces": 10,
"floatingPoint": 1
},
"astyle": {
"ascommodityside": "L",
"ascommodityspaced": false,
"asdecimalpoint": ".",
"asdigitgroups": null,
"asprecision": 2
}
}
],
"pbalanceassertion": null,
"pcomment": "",
"pdate": null,
"pdate2": null,
"poriginal": null,
"pstatus": "Unmarked",
"ptags": [],
"ptransaction_": "1",
"ptype": "RegularPosting"
},
{
"paccount": "income:salary",
"pamount": [
{
"acommodity": "$",
"aismultiplier": false,
"aprice": null,
"aquantity": {
"decimalMantissa": -10000000000,
"decimalPlaces": 10,
"floatingPoint": -1
},
"astyle": {
"ascommodityside": "L",
"ascommodityspaced": false,
"asdecimalpoint": ".",
"asdigitgroups": null,
"asprecision": 2
}
}
],
"pbalanceassertion": null,
"pcomment": "",
"pdate": null,
"pdate2": null,
"poriginal": null,
"pstatus": "Unmarked",
"ptags": [],
"ptransaction_": "1",
"ptype": "RegularPosting"
}
],
"tprecedingcomment": "",
"tsourcepos": {
"contents": [
"",
[
1,
1
]
],
"tag": "JournalSourcePos"
},
"tstatus": "Unmarked",
"ttags": []
}
And here's how to test adding it with curl. This should add a new
entry to your journal:
$ curl http://127.0.0.1:5000/add -X PUT -H 'Content-Type: application/json' --data-binary @txn.json
 
File: hledger-web.info, Node: ENVIRONMENT, Next: FILES, Prev: JSON API, Up: Top File: hledger-web.info, Node: ENVIRONMENT, Next: FILES, Prev: JSON API, Up: Top
@ -437,12 +579,12 @@ Node: RELOADING10567
Ref: #reloading10701 Ref: #reloading10701
Node: JSON API11134 Node: JSON API11134
Ref: #json-api11248 Ref: #json-api11248
Node: ENVIRONMENT12686 Node: ENVIRONMENT16812
Ref: #environment12802 Ref: #environment16928
Node: FILES13535 Node: FILES17661
Ref: #files13635 Ref: #files17761
Node: BUGS13848 Node: BUGS17974
Ref: #bugs13926 Ref: #bugs18052
 
End Tag Table End Tag Table

View File

@ -289,45 +289,186 @@ RELOADING
that both machine clocks are roughly in step.) that both machine clocks are roughly in step.)
JSON API JSON API
In addition to the web UI, hledger-web provides some API routes that In addition to the web UI, hledger-web also serves a JSON API that can
serve JSON in response to GET requests. (And when started with be used to get data or add new transactions. If you want the JSON API
--serve-api, it provides only these routes.): only, you can use the --serve-api flag. Eg:
$ hledger-web -f examples/sample.journal --serve-api
...
You can get JSON data from these routes:
/accountnames /accountnames
/transactions /transactions
/prices /prices
/commodities /commodities
/accounts /accounts
/accounttransactions/#AccountName /accounttransactions/ACCOUNTNAME
Also, you can append a new transaction to the journal by sending a PUT Eg, all account names in the journal (similar to the accounts command):
request to /add (hledger-web only). As with the web UI's add form,
hledger-web must be started with the add capability for this (enabled
by default).
The payload should be a valid hledger transaction as JSON, similar to $ curl -s http://127.0.0.1:5000/accountnames | python -m json.tool
what you get from /transactions or /accounttransactions. [
"assets",
"assets:bank",
"assets:bank:checking",
"assets:bank:saving",
"assets:cash",
"expenses",
"expenses:food",
"expenses:supplies",
"income",
"income:gifts",
"income:salary",
"liabilities",
"liabilities:debts"
]
Another way to generate test data is with the readJsonFile/writeJson- Or all transactions:
File helpers in Hledger.Web.Json, which can write or read most of
hledger's data types to or from a file. Eg here we write the first $ curl -s http://127.0.0.1:5000/transactions | python -m json.tool
transaction of a sample journal: [
{
"tcode": "",
"tcomment": "",
"tdate": "2008-01-01",
"tdate2": null,
"tdescription": "income",
"tindex": 1,
"tpostings": [
{
"paccount": "assets:bank:checking",
"pamount": [
{
"acommodity": "$",
"aismultiplier": false,
"aprice": null,
...
Most of the JSON corresponds to hledger's data types; for details of
what the fields mean, see the Hledger.Data.Json haddock docs and click
on the various data types, eg Transaction. And for a higher level un-
derstanding, see the journal manual.
In some cases there is outer JSON corresponding to a "Report" type. To
understand that, go to the Hledger.Web.Handler.MiscR haddock and look
at the source for the appropriate handler to see what it returns. Eg
for /accounttransactions it's getAccounttransactionsR, returning a "ac-
countTransactionsReport ...". Looking up the haddock for that we can
see that /accounttransactions returns an AccountTransactionsReport,
which consists of a report title and a list of AccountTransactionsRe-
portItem (etc).
You can add a new transaction to the journal with a PUT request to
/add, if hledger-web was started with the add capability (enabled by
default). The payload must be the full, exact JSON representation of a
hledger transaction (partial data won't do). You can get sample JSON
from /transactions or /accounttransactions, or you can export it with
hledger-lib's writeJsonFile helper, like so:
$ make ghci-web $ make ghci-web
>>> :m +*Hledger.Web.Json >>> import Hledger
>>> writeJsonFile "txn.json" (head $ jtxns samplejournal) >>> writeJsonFile "txn.json" (head $ jtxns samplejournal) -- export samplejournal's first txn
>>> :q >>> :q
$ python -m json.tool <txn.json >txn.pretty.json # optional: make human-readable
(sample output & discussion) If you like, reformat the json to make it human-readable:
And here's how to test adding that with curl: $ python -m json.tool txn.json >pretty
$ mv pretty txn.json
$ curl -s http://127.0.0.1:5000/add -X PUT -H 'Content-Type: application/json' --data-binary @txn.pretty.json; echo Here's how it looks as of hledger-1.17 (remember, this JSON corresponds
to hledger's Transaction and related data types):
By default, both the server-side HTML UI and the JSON API are served. {
Running with --serve-api disables the former, useful if you only want "tcode": "",
to serve the API. "tcomment": "",
"tdate": "2008-01-01",
"tdate2": null,
"tdescription": "income",
"tindex": 1,
"tpostings": [
{
"paccount": "assets:bank:checking",
"pamount": [
{
"acommodity": "$",
"aismultiplier": false,
"aprice": null,
"aquantity": {
"decimalMantissa": 10000000000,
"decimalPlaces": 10,
"floatingPoint": 1
},
"astyle": {
"ascommodityside": "L",
"ascommodityspaced": false,
"asdecimalpoint": ".",
"asdigitgroups": null,
"asprecision": 2
}
}
],
"pbalanceassertion": null,
"pcomment": "",
"pdate": null,
"pdate2": null,
"poriginal": null,
"pstatus": "Unmarked",
"ptags": [],
"ptransaction_": "1",
"ptype": "RegularPosting"
},
{
"paccount": "income:salary",
"pamount": [
{
"acommodity": "$",
"aismultiplier": false,
"aprice": null,
"aquantity": {
"decimalMantissa": -10000000000,
"decimalPlaces": 10,
"floatingPoint": -1
},
"astyle": {
"ascommodityside": "L",
"ascommodityspaced": false,
"asdecimalpoint": ".",
"asdigitgroups": null,
"asprecision": 2
}
}
],
"pbalanceassertion": null,
"pcomment": "",
"pdate": null,
"pdate2": null,
"poriginal": null,
"pstatus": "Unmarked",
"ptags": [],
"ptransaction_": "1",
"ptype": "RegularPosting"
}
],
"tprecedingcomment": "",
"tsourcepos": {
"contents": [
"",
[
1,
1
]
],
"tag": "JournalSourcePos"
},
"tstatus": "Unmarked",
"ttags": []
}
And here's how to test adding it with curl. This should add a new en-
try to your journal:
$ curl http://127.0.0.1:5000/add -X PUT -H 'Content-Type: application/json' --data-binary @txn.json
ENVIRONMENT ENVIRONMENT
LEDGER_FILE The journal file path when not specified with -f. Default: LEDGER_FILE The journal file path when not specified with -f. Default:
@ -392,4 +533,4 @@ SEE ALSO
hledger-web 1.17.99 March 2020 hledger-web(1) hledger-web 1.17.99 May 2020 hledger-web(1)

View File

@ -4,4 +4,4 @@ m4_dnl Program version. Updated by make setversion.
m4_define({{_version_}}, {{1.17.99}})m4_dnl m4_define({{_version_}}, {{1.17.99}})m4_dnl
m4_dnl m4_dnl
m4_dnl Date to show in man pages. Updated by make setdate. m4_dnl Date to show in man pages. Updated by make setdate.
m4_define({{_monthyear_}}, {{March 2020}})m4_dnl m4_define({{_monthyear_}}, {{May 2020}})m4_dnl

View File

@ -1,6 +1,6 @@
.\"t .\"t
.TH "hledger" "1" "March 2020" "hledger 1.17.99" "hledger User Manuals" .TH "hledger" "1" "May 2020" "hledger 1.17.99" "hledger User Manuals"
@ -1136,20 +1136,28 @@ account alias directives and options:
\f[C]--alias /REGEX/=REPLACEMENT\f[R] \f[C]--alias /REGEX/=REPLACEMENT\f[R]
.PP .PP
hledger\[aq]s regular expressions come from the regex-tdfa library. hledger\[aq]s regular expressions come from the regex-tdfa library.
In general they: If they\[aq]re not doing what you expect, it\[aq]s important to know
.IP \[bu] 2 exactly what they support:
are case insensitive .IP "1." 3
.IP \[bu] 2 they are case insensitive
are infix matching (do not need to match the entire thing being matched) .IP "2." 3
.IP \[bu] 2 they are infix matching (they do not need to match the entire thing
are POSIX extended regular expressions being matched)
.IP \[bu] 2 .IP "3." 3
also support GNU word boundaries (\[rs]<, \[rs]>, \[rs]b, \[rs]B) they are POSIX ERE (extended regular expressions)
.IP \[bu] 2 .IP "4." 3
and parenthesised capturing groups and numeric backreferences in they also support GNU word boundaries (\f[C]\[rs]b\f[R],
replacement strings \f[C]\[rs]B\f[R], \f[C]\[rs]<\f[R], \f[C]\[rs]>\f[R])
.IP \[bu] 2 .IP "5." 3
do not support mode modifiers like (?s) they do not support backreferences; if you write \f[C]\[rs]1\f[R], it
will match the digit \f[C]1\f[R].
Except when doing text replacement, eg in account aliases, where
backreferences can be used in the replacement string to reference
capturing groups in the search regexp.
.IP "6." 3
they do not support mode modifiers (\f[C](?s)\f[R]), character classes
(\f[C]\[rs]w\f[R], \f[C]\[rs]d\f[R]), or anything else not mentioned
above.
.PP .PP
Some things to note: Some things to note:
.IP \[bu] 2 .IP \[bu] 2
@ -1671,31 +1679,48 @@ $ hledger balance --pivot member acct:.
\f[R] \f[R]
.fi .fi
.SS Valuation .SS Valuation
.PP
hledger can show cost reports, where amounts are converted to their cost
or sale amount at transaction time; or value reports, where amounts are
converted to their market value in another currency/commodity at a
specified date (using market prices inferred from your transactions, or
declared with P directives).
.PP
We call this \[dq]valuation\[dq], and it is controlled by the
\f[C]--value=VALUATIONTYPE[,COMMODITY]\f[R] option.
It can get a little involved, so we cover all the details below.
But most of the time, all you need to do is use these simpler flags
instead:
.IP \[bu] 2
\f[C]-B\f[R] to convert to cost/sale amount, or
.IP \[bu] 2
\f[C]-V\f[R] to convert to market value in your base currency.
Or occasionally,
.IP \[bu] 2
\f[C]-X COMMODITY\f[R] to convert to market value in some other
currency.
.SS -B: Cost .SS -B: Cost
.PP .PP
The \f[C]-B/--cost\f[R] flag converts amounts to their cost (or selling The \f[C]-B/--cost\f[R] flag converts amounts to their cost or sale
price) at transaction time, if they have a transaction price specified. amount at transaction time, if they have a transaction price specified.
This flag is equivalent to \f[C]--value=cost\f[R], described below. (It is equivalent to \f[C]--value=cost\f[R].)
.SS -V: Market value .SS -V: Value
.PP .PP
The \f[C]-V/--market\f[R] flag converts reported amounts to their market The \f[C]-V/--market\f[R] flag converts reported amounts to market value
value in a default valuation commodity, using the market prices in in their \f[I]default valuation commodity\f[R], using the market prices
effect on a default valuation date. in effect on a \f[I]default valuation date\f[R].
For single period reports, the valuation date is today (equivalent to (More on these below.)
\f[C]--value=now\f[R]); for multiperiod reports, it is the last day of
each subperiod (equivalent to \f[C]--value=end\f[R]).
.PP .PP
The default valuation commodity is the one referenced in the latest The default valuation commodity is the one referenced in the latest
applicable market price dated on or before the valuation date. applicable market price dated on or before the valuation date.
If most of your P declarations lead to a single home currency, this will Typically your P declarations or currency exchange transactions
usually be what you want. reference a single base currency, and -V will pick that.
(To specify the commodity, see -X below.)
.PP .PP
Note that in hledger, market prices are always declared explicitly with The default valuation date is today for single period reports
P directives; we do not infer them from transaction prices as Ledger (equivalent to \f[C]--value=now\f[R]), or the last day of each subperiod
does. for multiperiod reports (equivalent to \f[C]--value=end\f[R]).
.PP .PP
Here\[aq]s a quick example of -V: An example:
.IP .IP
.nf .nf
\f[C] \f[C]
@ -1743,8 +1768,31 @@ $ hledger -f t.j bal -N euros -V
.PP .PP
The \f[C]-X/--exchange\f[R] option is like \f[C]-V\f[R], except it The \f[C]-X/--exchange\f[R] option is like \f[C]-V\f[R], except it
specifies the target commodity you would like to convert to. specifies the target commodity you would like to convert to.
It is equivalent to \f[C]--value=now,COMM\f[R] or (It is equivalent to \f[C]--value=now,COMM\f[R] or
\f[C]--value=end,COMM\f[R]. \f[C]--value=end,COMM\f[R].)
.SS Market prices
.PP
To convert a commodity A to commodity B, hledger looks for a suitable
market price (exchange rate) in the following ways, in this order of
preference:
.IP "1." 3
a \f[I]declared market price\f[R] - the latest P directive specifying
the exchange rate from A to B, dated on or before the valuation date.
.IP "2." 3
a \f[I]transaction-implied market price\f[R] - a market price matching
the transaction price used in the latest transaction where A is
converted to B, dated on or before the valuation date.
(\f[I]since hledger 1.18; experimental\f[R])
.IP "3." 3
a \f[I]reverse declared market price\f[R] - calculated by inverting a
declared market price from B to A.
.IP "4." 3
a \f[I]reverse transaction-implied market price\f[R] - calculated by
inverting a transaction-implied market price from B to A.
.IP "5." 3
an \f[I]indirect market price\f[R] - calculated by combining the
shortest chain of market prices (any of the above types) leading from A
to B.
.SS --value: Flexible valuation .SS --value: Flexible valuation
.PP .PP
\f[I](experimental, added 201905)\f[R] \f[I](experimental, added 201905)\f[R]
@ -2243,9 +2291,6 @@ otherwise the latest transaction date in the journal, otherwise today.
\f[I]report interval\f[R] \f[I]report interval\f[R]
a flag (-D/-W/-M/-Q/-Y) or period expression that activates the a flag (-D/-W/-M/-Q/-Y) or period expression that activates the
report\[aq]s multi-period mode (whether showing one or many subperiods). report\[aq]s multi-period mode (whether showing one or many subperiods).
.SS Combining -B, -V, -X, --value
.PP
The rightmost of these flags wins.
.SH COMMANDS .SH COMMANDS
.PP .PP
hledger provides a number of subcommands; \f[C]hledger\f[R] with no hledger provides a number of subcommands; \f[C]hledger\f[R] with no
@ -4173,7 +4218,7 @@ $ hledger test -- -pData.Amount --color=never
.PP .PP
For help on these, see https://github.com/feuerbach/tasty#options For help on these, see https://github.com/feuerbach/tasty#options
(\f[C]-- --help\f[R] currently doesn\[aq]t show them). (\f[C]-- --help\f[R] currently doesn\[aq]t show them).
.SS Add-on Commands .SS Add-on commands
.PP .PP
hledger also searches for external add-on commands, and will include hledger also searches for external add-on commands, and will include
these in the commands list. these in the commands list.
@ -4312,45 +4357,42 @@ The command \f[C]env | grep LEDGER_FILE\f[R] should show it.
You may need to use \f[C]export\f[R]. You may need to use \f[C]export\f[R].
Here\[aq]s an explanation. Here\[aq]s an explanation.
.PP .PP
\f[B]\[dq]Illegal byte sequence\[dq] or \[dq]Invalid or incomplete \f[B]Getting errors like \[dq]Illegal byte sequence\[dq] or \[dq]Invalid
multibyte or wide character\[dq] errors\f[R] or incomplete multibyte or wide character\[dq] or
\[dq]commitAndReleaseBuffer: invalid argument (invalid
character)\[dq]\f[R]
.PD 0 .PD 0
.P .P
.PD .PD
In order to handle non-ascii letters and symbols (like \[Po]), hledger Programs compiled with GHC (hledger, haskell build tools, etc.) need to
needs an appropriate locale. have a UTF-8-aware locale configured in the environment, otherwise they
This is usually configured system-wide; you can also configure it will fail with these kinds of errors when they encounter non-ascii
temporarily. characters.
The locale may need to be one that supports UTF-8, if you built hledger
with GHC < 7.2 (or possibly always, I\[aq]m not sure yet).
.PP .PP
Here\[aq]s an example of setting the locale temporarily, on ubuntu To fix it, set the LANG environment variable to some locale which
gnu/linux: supports UTF-8.
The locale you choose must be installed on your system.
.PP
Here\[aq]s an example of setting LANG temporarily, on Ubuntu GNU/Linux:
.IP .IP
.nf .nf
\f[C] \f[C]
$ file my.journal $ file my.journal
my.journal: UTF-8 Unicode text # <- the file is UTF8-encoded my.journal: UTF-8 Unicode text # the file is UTF8-encoded
$ locale -a $ echo $LANG
C # LANG is set to the default locale, which does not support UTF8
$ locale -a # which locales are installed ?
C C
en_US.utf8 # <- a UTF8-aware locale is available en_US.utf8 # here\[aq]s a UTF8-aware one we can use
POSIX POSIX
$ LANG=en_US.utf8 hledger -f my.journal print # <- use it for this command $ LANG=en_US.utf8 hledger -f my.journal print # ensure it is used for this command
\f[R] \f[R]
.fi .fi
.PP .PP
Here\[aq]s one way to set it permanently, there are probably better If available, \f[C]C.UTF-8\f[R] will also work.
ways: If your preferred locale isn\[aq]t listed by \f[C]locale -a\f[R], you
.IP might need to install it.
.nf Eg on Ubuntu/Debian:
\f[C]
$ echo \[dq]export LANG=en_US.UTF-8\[dq] >>\[ti]/.bash_profile
$ bash --login
\f[R]
.fi
.PP
If we preferred to use eg \f[C]fr_FR.utf8\f[R], we might have to install
that first:
.IP .IP
.nf .nf
\f[C] \f[C]
@ -4368,9 +4410,27 @@ $ LANG=fr_FR.utf8 hledger -f my.journal print
\f[R] \f[R]
.fi .fi
.PP .PP
Note some platforms allow variant locale spellings, but not all (ubuntu Here\[aq]s how you could set it permanently, if you use a bash shell:
accepts \f[C]fr_FR.UTF8\f[R], mac osx requires exactly .IP
\f[C]fr_FR.UTF-8\f[R]). .nf
\f[C]
$ echo \[dq]export LANG=en_US.utf8\[dq] >>\[ti]/.bash_profile
$ bash --login
\f[R]
.fi
.PP
Exact spelling and capitalisation may be important.
Note the difference on MacOS (\f[C]UTF-8\f[R], not \f[C]utf8\f[R]).
Some platforms (eg ubuntu) allow variant spellings, but others (eg
macos) require it to be exact:
.IP
.nf
\f[C]
$ locale -a | grep -iE en_us.*utf
en_US.UTF-8
$ LANG=en_US.UTF-8 hledger -f my.journal print
\f[R]
.fi
.SH "REPORTING BUGS" .SH "REPORTING BUGS"

View File

@ -1052,17 +1052,22 @@ hledger uses regular expressions in a number of places:
* account alias directives and options: 'alias /REGEX/ = * account alias directives and options: 'alias /REGEX/ =
REPLACEMENT', '--alias /REGEX/=REPLACEMENT' REPLACEMENT', '--alias /REGEX/=REPLACEMENT'
hledger's regular expressions come from the regex-tdfa library. In hledger's regular expressions come from the regex-tdfa library. If
general they: they're not doing what you expect, it's important to know exactly what
they support:
* are case insensitive 1. they are case insensitive
* are infix matching (do not need to match the entire thing being 2. they are infix matching (they do not need to match the entire thing
matched) being matched)
* are POSIX extended regular expressions 3. they are POSIX ERE (extended regular expressions)
* also support GNU word boundaries (\<, \>, \b, \B) 4. they also support GNU word boundaries ('\b', '\B', '\<', '\>')
* and parenthesised capturing groups and numeric backreferences in 5. they do not support backreferences; if you write '\1', it will
replacement strings match the digit '1'. Except when doing text replacement, eg in
* do not support mode modifiers like (?s) account aliases, where backreferences can be used in the
replacement string to reference capturing groups in the search
regexp.
6. they do not support mode modifiers ('(?s)'), character classes
('\w', '\d'), or anything else not mentioned above.
Some things to note: Some things to note:
@ -1365,47 +1370,61 @@ File: hledger.info, Node: Valuation, Prev: Pivoting, Up: OPTIONS
2.17 Valuation 2.17 Valuation
============== ==============
hledger can show cost reports, where amounts are converted to their cost
or sale amount at transaction time; or value reports, where amounts are
converted to their market value in another currency/commodity at a
specified date (using market prices inferred from your transactions, or
declared with P directives).
We call this "valuation", and it is controlled by the
'--value=VALUATIONTYPE[,COMMODITY]' option. It can get a little
involved, so we cover all the details below. But most of the time, all
you need to do is use these simpler flags instead:
* '-B' to convert to cost/sale amount, or
* '-V' to convert to market value in your base currency. Or
occasionally,
* '-X COMMODITY' to convert to market value in some other currency.
* Menu: * Menu:
* -B Cost:: * -B Cost::
* -V Market value:: * -V Value::
* -X Market value in specified commodity:: * -X Market value in specified commodity::
* Market prices::
* --value Flexible valuation:: * --value Flexible valuation::
* Effect of --value on reports:: * Effect of --value on reports::
* Combining -B -V -X --value::
 
File: hledger.info, Node: -B Cost, Next: -V Market value, Up: Valuation File: hledger.info, Node: -B Cost, Next: -V Value, Up: Valuation
2.17.1 -B: Cost 2.17.1 -B: Cost
--------------- ---------------
The '-B/--cost' flag converts amounts to their cost (or selling price) The '-B/--cost' flag converts amounts to their cost or sale amount at
at transaction time, if they have a transaction price specified. This transaction time, if they have a transaction price specified. (It is
flag is equivalent to '--value=cost', described below. equivalent to '--value=cost'.)
 
File: hledger.info, Node: -V Market value, Next: -X Market value in specified commodity, Prev: -B Cost, Up: Valuation File: hledger.info, Node: -V Value, Next: -X Market value in specified commodity, Prev: -B Cost, Up: Valuation
2.17.2 -V: Market value 2.17.2 -V: Value
----------------------- ----------------
The '-V/--market' flag converts reported amounts to their market value The '-V/--market' flag converts reported amounts to market value in
in a default valuation commodity, using the market prices in effect on a their _default valuation commodity_, using the market prices in effect
default valuation date. For single period reports, the valuation date on a _default valuation date_. (More on these below.)
is today (equivalent to '--value=now'); for multiperiod reports, it is
the last day of each subperiod (equivalent to '--value=end').
The default valuation commodity is the one referenced in the latest The default valuation commodity is the one referenced in the latest
applicable market price dated on or before the valuation date. If most applicable market price dated on or before the valuation date.
of your P declarations lead to a single home currency, this will usually Typically your P declarations or currency exchange transactions
be what you want. (To specify the commodity, see -X below.) reference a single base currency, and -V will pick that.
Note that in hledger, market prices are always declared explicitly The default valuation date is today for single period reports
with P directives; we do not infer them from transaction prices as (equivalent to '--value=now'), or the last day of each subperiod for
Ledger does. multiperiod reports (equivalent to '--value=end').
Here's a quick example of -V: An example:
; one euro is worth this many dollars from nov 1 ; one euro is worth this many dollars from nov 1
P 2016/11/01 € $1.10 P 2016/11/01 € $1.10
@ -1435,19 +1454,47 @@ $ hledger -f t.j bal -N euros -V
$103.00 assets:euros $103.00 assets:euros
 
File: hledger.info, Node: -X Market value in specified commodity, Next: --value Flexible valuation, Prev: -V Market value, Up: Valuation File: hledger.info, Node: -X Market value in specified commodity, Next: Market prices, Prev: -V Value, Up: Valuation
2.17.3 -X: Market value in specified commodity 2.17.3 -X: Market value in specified commodity
---------------------------------------------- ----------------------------------------------
The '-X/--exchange' option is like '-V', except it specifies the target The '-X/--exchange' option is like '-V', except it specifies the target
commodity you would like to convert to. It is equivalent to commodity you would like to convert to. (It is equivalent to
'--value=now,COMM' or '--value=end,COMM'. '--value=now,COMM' or '--value=end,COMM'.)
 
File: hledger.info, Node: --value Flexible valuation, Next: Effect of --value on reports, Prev: -X Market value in specified commodity, Up: Valuation File: hledger.info, Node: Market prices, Next: --value Flexible valuation, Prev: -X Market value in specified commodity, Up: Valuation
2.17.4 -value: Flexible valuation 2.17.4 Market prices
--------------------
To convert a commodity A to commodity B, hledger looks for a suitable
market price (exchange rate) in the following ways, in this order of
preference:
1. a _declared market price_ - the latest P directive specifying the
exchange rate from A to B, dated on or before the valuation date.
2. a _transaction-implied market price_ - a market price matching the
transaction price used in the latest transaction where A is
converted to B, dated on or before the valuation date. (_since
hledger 1.18; experimental_)
3. a _reverse declared market price_ - calculated by inverting a
declared market price from B to A.
4. a _reverse transaction-implied market price_ - calculated by
inverting a transaction-implied market price from B to A.
5. an _indirect market price_ - calculated by combining the shortest
chain of market prices (any of the above types) leading from A to
B.

File: hledger.info, Node: --value Flexible valuation, Next: Effect of --value on reports, Prev: Market prices, Up: Valuation
2.17.5 -value: Flexible valuation
--------------------------------- ---------------------------------
_(experimental, added 201905)_ _(experimental, added 201905)_
@ -1617,9 +1664,9 @@ $ hledger print -X A
b -0.50A b -0.50A
 
File: hledger.info, Node: Effect of --value on reports, Next: Combining -B -V -X --value, Prev: --value Flexible valuation, Up: Valuation File: hledger.info, Node: Effect of --value on reports, Prev: --value Flexible valuation, Up: Valuation
2.17.5 Effect of -value on reports 2.17.6 Effect of -value on reports
---------------------------------- ----------------------------------
Here is a reference for how '--value' currently affects each part of Here is a reference for how '--value' currently affects each part of
@ -1732,14 +1779,6 @@ _report interval_
report's multi-period mode (whether showing one or many report's multi-period mode (whether showing one or many
subperiods). subperiods).

File: hledger.info, Node: Combining -B -V -X --value, Prev: Effect of --value on reports, Up: Valuation
2.17.6 Combining -B, -V, -X, -value
-----------------------------------
The rightmost of these flags wins.
 
File: hledger.info, Node: COMMANDS, Next: ENVIRONMENT, Prev: OPTIONS, Up: Top File: hledger.info, Node: COMMANDS, Next: ENVIRONMENT, Prev: OPTIONS, Up: Top
@ -1793,7 +1832,7 @@ detailed command help.
* stats:: * stats::
* tags:: * tags::
* test:: * test::
* Add-on Commands:: * Add-on commands::
 
File: hledger.info, Node: accounts, Next: activity, Up: COMMANDS File: hledger.info, Node: accounts, Next: activity, Up: COMMANDS
@ -3494,7 +3533,7 @@ considered. With -values flag, the tags' unique values are listed
instead. instead.
 
File: hledger.info, Node: test, Next: Add-on Commands, Prev: tags, Up: COMMANDS File: hledger.info, Node: test, Next: Add-on commands, Prev: tags, Up: COMMANDS
3.29 test 3.29 test
========= =========
@ -3521,9 +3560,9 @@ $ hledger test -- -pData.Amount --color=never
('-- --help' currently doesn't show them). ('-- --help' currently doesn't show them).
 
File: hledger.info, Node: Add-on Commands, Prev: test, Up: COMMANDS File: hledger.info, Node: Add-on commands, Prev: test, Up: COMMANDS
3.30 Add-on Commands 3.30 Add-on commands
==================== ====================
hledger also searches for external add-on commands, and will include hledger also searches for external add-on commands, and will include
@ -3562,7 +3601,7 @@ interfaces. These are maintained and released along with hledger:
* interest:: * interest::
 
File: hledger.info, Node: ui, Next: web, Up: Add-on Commands File: hledger.info, Node: ui, Next: web, Up: Add-on commands
3.30.1 ui 3.30.1 ui
--------- ---------
@ -3570,7 +3609,7 @@ File: hledger.info, Node: ui, Next: web, Up: Add-on Commands
hledger-ui provides an efficient terminal interface. hledger-ui provides an efficient terminal interface.
 
File: hledger.info, Node: web, Next: iadd, Prev: ui, Up: Add-on Commands File: hledger.info, Node: web, Next: iadd, Prev: ui, Up: Add-on commands
3.30.2 web 3.30.2 web
---------- ----------
@ -3580,7 +3619,7 @@ hledger-web provides a simple web interface.
Third party add-ons, maintained separately from hledger, include: Third party add-ons, maintained separately from hledger, include:
 
File: hledger.info, Node: iadd, Next: interest, Prev: web, Up: Add-on Commands File: hledger.info, Node: iadd, Next: interest, Prev: web, Up: Add-on commands
3.30.3 iadd 3.30.3 iadd
----------- -----------
@ -3589,7 +3628,7 @@ hledger-iadd is a more interactive, terminal UI replacement for the add
command. command.
 
File: hledger.info, Node: interest, Prev: iadd, Up: Add-on Commands File: hledger.info, Node: interest, Prev: iadd, Up: Add-on commands
3.30.4 interest 3.30.4 interest
--------------- ---------------
@ -3689,32 +3728,32 @@ file*
variable. The command 'env | grep LEDGER_FILE' should show it. You may variable. The command 'env | grep LEDGER_FILE' should show it. You may
need to use 'export'. Here's an explanation. need to use 'export'. Here's an explanation.
*"Illegal byte sequence" or "Invalid or incomplete multibyte or wide *Getting errors like "Illegal byte sequence" or "Invalid or
character" errors* incomplete multibyte or wide character" or "commitAndReleaseBuffer:
In order to handle non-ascii letters and symbols (like £), hledger needs invalid argument (invalid character)"*
an appropriate locale. This is usually configured system-wide; you can Programs compiled with GHC (hledger, haskell build tools, etc.) need to
also configure it temporarily. The locale may need to be one that have a UTF-8-aware locale configured in the environment, otherwise they
supports UTF-8, if you built hledger with GHC < 7.2 (or possibly always, will fail with these kinds of errors when they encounter non-ascii
I'm not sure yet). characters.
Here's an example of setting the locale temporarily, on ubuntu To fix it, set the LANG environment variable to some locale which
gnu/linux: supports UTF-8. The locale you choose must be installed on your system.
Here's an example of setting LANG temporarily, on Ubuntu GNU/Linux:
$ file my.journal $ file my.journal
my.journal: UTF-8 Unicode text # <- the file is UTF8-encoded my.journal: UTF-8 Unicode text # the file is UTF8-encoded
$ locale -a $ echo $LANG
C # LANG is set to the default locale, which does not support UTF8
$ locale -a # which locales are installed ?
C C
en_US.utf8 # <- a UTF8-aware locale is available en_US.utf8 # here's a UTF8-aware one we can use
POSIX POSIX
$ LANG=en_US.utf8 hledger -f my.journal print # <- use it for this command $ LANG=en_US.utf8 hledger -f my.journal print # ensure it is used for this command
Here's one way to set it permanently, there are probably better ways: If available, 'C.UTF-8' will also work. If your preferred locale
isn't listed by 'locale -a', you might need to install it. Eg on
$ echo "export LANG=en_US.UTF-8" >>~/.bash_profile Ubuntu/Debian:
$ bash --login
If we preferred to use eg 'fr_FR.utf8', we might have to install that
first:
$ apt-get install language-pack-fr $ apt-get install language-pack-fr
$ locale -a $ locale -a
@ -3728,8 +3767,18 @@ fr_LU.utf8
POSIX POSIX
$ LANG=fr_FR.utf8 hledger -f my.journal print $ LANG=fr_FR.utf8 hledger -f my.journal print
Note some platforms allow variant locale spellings, but not all Here's how you could set it permanently, if you use a bash shell:
(ubuntu accepts 'fr_FR.UTF8', mac osx requires exactly 'fr_FR.UTF-8').
$ echo "export LANG=en_US.utf8" >>~/.bash_profile
$ bash --login
Exact spelling and capitalisation may be important. Note the
difference on MacOS ('UTF-8', not 'utf8'). Some platforms (eg ubuntu)
allow variant spellings, but others (eg macos) require it to be exact:
$ locale -a | grep -iE en_us.*utf
en_US.UTF-8
$ LANG=en_US.UTF-8 hledger -f my.journal print
 
Tag Table: Tag Table:
@ -3780,141 +3829,141 @@ Node: Output format32576
Ref: #output-format32726 Ref: #output-format32726
Node: Regular expressions34774 Node: Regular expressions34774
Ref: #regular-expressions34931 Ref: #regular-expressions34931
Node: Smart dates36292 Node: Smart dates36667
Ref: #smart-dates36443 Ref: #smart-dates36818
Node: Report start & end date37804 Node: Report start & end date38179
Ref: #report-start-end-date37976 Ref: #report-start-end-date38351
Node: Report intervals39414 Node: Report intervals39789
Ref: #report-intervals39579 Ref: #report-intervals39954
Node: Period expressions39969 Node: Period expressions40344
Ref: #period-expressions40129 Ref: #period-expressions40504
Node: Depth limiting44255 Node: Depth limiting44630
Ref: #depth-limiting44399 Ref: #depth-limiting44774
Node: Pivoting44741 Node: Pivoting45116
Ref: #pivoting44864 Ref: #pivoting45239
Node: Valuation46540 Node: Valuation46915
Ref: #valuation46642 Ref: #valuation47017
Node: -B Cost46822 Node: -B Cost47937
Ref: #b-cost46933 Ref: #b-cost48041
Node: -V Market value47131 Node: -V Value48213
Ref: #v-market-value47305 Ref: #v-value48366
Node: -X Market value in specified commodity48737 Node: -X Market value in specified commodity49639
Ref: #x-market-value-in-specified-commodity48976 Ref: #x-market-value-in-specified-commodity49858
Node: --value Flexible valuation49152 Node: Market prices50036
Ref: #value-flexible-valuation49378 Ref: #market-prices50221
Node: Effect of --value on reports53883 Node: --value Flexible valuation51146
Ref: #effect-of---value-on-reports54099 Ref: #value-flexible-valuation51347
Node: Combining -B -V -X --value59645 Node: Effect of --value on reports55852
Ref: #combining--b--v--x---value59828 Ref: #effect-of---value-on-reports56033
Node: COMMANDS59864 Node: COMMANDS61579
Ref: #commands59972 Ref: #commands61687
Node: accounts61056 Node: accounts62771
Ref: #accounts61154 Ref: #accounts62869
Node: activity61853 Node: activity63568
Ref: #activity61963 Ref: #activity63678
Node: add62346 Node: add64061
Ref: #add62445 Ref: #add64160
Node: balance65184 Node: balance66899
Ref: #balance65295 Ref: #balance67010
Node: Classic balance report66753 Node: Classic balance report68468
Ref: #classic-balance-report66926 Ref: #classic-balance-report68641
Node: Customising the classic balance report68295 Node: Customising the classic balance report70010
Ref: #customising-the-classic-balance-report68523 Ref: #customising-the-classic-balance-report70238
Node: Colour support70599 Node: Colour support72314
Ref: #colour-support70766 Ref: #colour-support72481
Node: Flat mode70939 Node: Flat mode72654
Ref: #flat-mode71087 Ref: #flat-mode72802
Node: Depth limited balance reports71500 Node: Depth limited balance reports73215
Ref: #depth-limited-balance-reports71685 Ref: #depth-limited-balance-reports73400
Node: Percentages72141 Node: Percentages73856
Ref: #percentages72307 Ref: #percentages74022
Node: Multicolumn balance report73444 Node: Multicolumn balance report75159
Ref: #multicolumn-balance-report73624 Ref: #multicolumn-balance-report75339
Node: Budget report78886 Node: Budget report80601
Ref: #budget-report79029 Ref: #budget-report80744
Node: Nested budgets84295 Node: Nested budgets86010
Ref: #nested-budgets84407 Ref: #nested-budgets86122
Ref: #output-format-187888 Ref: #output-format-189603
Node: balancesheet88085 Node: balancesheet89800
Ref: #balancesheet88221 Ref: #balancesheet89936
Node: balancesheetequity89687 Node: balancesheetequity91402
Ref: #balancesheetequity89836 Ref: #balancesheetequity91551
Node: cashflow90559 Node: cashflow92274
Ref: #cashflow90687 Ref: #cashflow92402
Node: check-dates91866 Node: check-dates93581
Ref: #check-dates91993 Ref: #check-dates93708
Node: check-dupes92272 Node: check-dupes93987
Ref: #check-dupes92396 Ref: #check-dupes94111
Node: close92689 Node: close94404
Ref: #close92803 Ref: #close94518
Node: close usage94325 Node: close usage96040
Ref: #close-usage94418 Ref: #close-usage96133
Node: commodities97231 Node: commodities98946
Ref: #commodities97358 Ref: #commodities99073
Node: descriptions97440 Node: descriptions99155
Ref: #descriptions97568 Ref: #descriptions99283
Node: diff97749 Node: diff99464
Ref: #diff97855 Ref: #diff99570
Node: files98902 Node: files100617
Ref: #files99002 Ref: #files100717
Node: help99149 Node: help100864
Ref: #help99249 Ref: #help100964
Node: import100330 Node: import102045
Ref: #import100444 Ref: #import102159
Node: Importing balance assignments101337 Node: Importing balance assignments103052
Ref: #importing-balance-assignments101485 Ref: #importing-balance-assignments103200
Node: incomestatement102134 Node: incomestatement103849
Ref: #incomestatement102267 Ref: #incomestatement103982
Node: notes103754 Node: notes105469
Ref: #notes103867 Ref: #notes105582
Node: payees103993 Node: payees105708
Ref: #payees104099 Ref: #payees105814
Node: prices104257 Node: prices105972
Ref: #prices104363 Ref: #prices106078
Node: print104704 Node: print106419
Ref: #print104814 Ref: #print106529
Node: print-unique109600 Node: print-unique111315
Ref: #print-unique109726 Ref: #print-unique111441
Node: register110011 Node: register111726
Ref: #register110138 Ref: #register111853
Node: Custom register output114310 Node: Custom register output116025
Ref: #custom-register-output114439 Ref: #custom-register-output116154
Node: register-match115776 Node: register-match117491
Ref: #register-match115910 Ref: #register-match117625
Node: rewrite116261 Node: rewrite117976
Ref: #rewrite116376 Ref: #rewrite118091
Node: Re-write rules in a file118231 Node: Re-write rules in a file119946
Ref: #re-write-rules-in-a-file118365 Ref: #re-write-rules-in-a-file120080
Node: Diff output format119575 Node: Diff output format121290
Ref: #diff-output-format119744 Ref: #diff-output-format121459
Node: rewrite vs print --auto120836 Node: rewrite vs print --auto122551
Ref: #rewrite-vs.-print---auto121015 Ref: #rewrite-vs.-print---auto122730
Node: roi121571 Node: roi123286
Ref: #roi121669 Ref: #roi123384
Node: stats122681 Node: stats124396
Ref: #stats122780 Ref: #stats124495
Node: tags123568 Node: tags125283
Ref: #tags123666 Ref: #tags125381
Node: test123960 Node: test125675
Ref: #test124068 Ref: #test125783
Node: Add-on Commands124815 Node: Add-on commands126530
Ref: #add-on-commands124932 Ref: #add-on-commands126647
Node: ui126275 Node: ui127990
Ref: #ui126363 Ref: #ui128078
Node: web126417 Node: web128132
Ref: #web126520 Ref: #web128235
Node: iadd126636 Node: iadd128351
Ref: #iadd126747 Ref: #iadd128462
Node: interest126829 Node: interest128544
Ref: #interest126936 Ref: #interest128651
Node: ENVIRONMENT127176 Node: ENVIRONMENT128891
Ref: #environment127288 Ref: #environment129003
Node: FILES128117 Node: FILES129832
Ref: #files-1128220 Ref: #files-1129935
Node: LIMITATIONS128433 Node: LIMITATIONS130148
Ref: #limitations128552 Ref: #limitations130267
Node: TROUBLESHOOTING129294 Node: TROUBLESHOOTING131009
Ref: #troubleshooting129407 Ref: #troubleshooting131122
 
End Tag Table End Tag Table

File diff suppressed because it is too large Load Diff