;regen manuals
This commit is contained in:
		
							parent
							
								
									798a2c8674
								
							
						
					
					
						commit
						9417ee625e
					
				| @ -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 | ||||||
|  | |||||||
| @ -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 | ||||||
|  | |||||||
| @ -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 | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -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) | ||||||
|  | |||||||
| @ -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. | ||||||
|  | |||||||
| @ -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 | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -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) | ||||||
|  | |||||||
| @ -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" | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -78,4 +78,4 @@ SEE ALSO | |||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| hledger 1.17.99                   March 2020              hledger_timeclock(5) | hledger 1.17.99                    May 2020               hledger_timeclock(5) | ||||||
|  | |||||||
| @ -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" | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -161,4 +161,4 @@ SEE ALSO | |||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| hledger 1.17.99                   March 2020                hledger_timedot(5) | hledger 1.17.99                    May 2020                 hledger_timedot(5) | ||||||
|  | |||||||
| @ -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 | ||||||
|  | |||||||
| @ -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" | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -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) | ||||||
|  | |||||||
| @ -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 | ||||||
|  | |||||||
| @ -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 | ||||||
|  | |||||||
| @ -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 | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -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) | ||||||
|  | |||||||
| @ -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 | ||||||
|  | |||||||
| @ -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" | ||||||
|  | |||||||
| @ -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
											
										
									
								
							
		Loading…
	
		Reference in New Issue
	
	Block a user