640 lines
		
	
	
		
			21 KiB
		
	
	
	
		
			Groff
		
	
	
	
	
	
			
		
		
	
	
			640 lines
		
	
	
		
			21 KiB
		
	
	
	
		
			Groff
		
	
	
	
	
	
| 
 | |
| .TH "HLEDGER-WEB" "1" "December 2021" "hledger-web-1.23.99 " "hledger User Manuals"
 | |
| 
 | |
| 
 | |
| 
 | |
| .SH NAME
 | |
| .PP
 | |
| hledger-web is a web interface (WUI) for the hledger accounting tool.
 | |
| This manual is for hledger-web 1.23.99.
 | |
| .SH SYNOPSIS
 | |
| .PP
 | |
| \f[C]hledger-web [OPTIONS]\f[R]
 | |
| .PD 0
 | |
| .P
 | |
| .PD
 | |
| \f[C]hledger web -- [OPTIONS]\f[R]
 | |
| .SH DESCRIPTION
 | |
| .PP
 | |
| hledger is a reliable, cross-platform set of programs for tracking
 | |
| money, time, or any other commodity, using double-entry accounting and a
 | |
| simple, editable file format.
 | |
| hledger is inspired by and largely compatible with ledger(1).
 | |
| .PP
 | |
| hledger-web is hledger\[aq]s web interface.
 | |
| It starts a simple web application for browsing and adding transactions,
 | |
| and optionally opens it in a web browser window if possible.
 | |
| It provides a more user-friendly UI than the hledger CLI or hledger-ui
 | |
| interface, showing more at once (accounts, the current account register,
 | |
| balance charts) and allowing history-aware data entry, interactive
 | |
| searching, and bookmarking.
 | |
| .PP
 | |
| hledger-web also lets you share a ledger with multiple users, or even
 | |
| the public web.
 | |
| There is no access control, so if you need that you should put it behind
 | |
| a suitable web proxy.
 | |
| As a small protection against data loss when running an unprotected
 | |
| instance, it writes a numbered backup of the main journal file (only ?)
 | |
| on every edit.
 | |
| .PP
 | |
| Like hledger, it reads data from one or more files in hledger journal,
 | |
| timeclock, timedot, or CSV format specified with \f[C]-f\f[R], or
 | |
| \f[C]$LEDGER_FILE\f[R], or \f[C]$HOME/.hledger.journal\f[R] (on windows,
 | |
| perhaps \f[C]C:/Users/USER/.hledger.journal\f[R]).
 | |
| For more about this see hledger(1).
 | |
| .SH OPTIONS
 | |
| .PP
 | |
| Command-line options and arguments may be used to set an initial filter
 | |
| on the data.
 | |
| These filter options are not shown in the web UI, but it will be applied
 | |
| in addition to any search query entered there.
 | |
| .PP
 | |
| Note: if invoking hledger-web as a hledger subcommand, write
 | |
| \f[C]--\f[R] before options, as shown in the synopsis above.
 | |
| .TP
 | |
| \f[B]\f[CB]--serve\f[B]\f[R]
 | |
| serve and log requests, don\[aq]t browse or auto-exit
 | |
| .TP
 | |
| \f[B]\f[CB]--serve-api\f[B]\f[R]
 | |
| like --serve, but serve only the JSON web API, without the server-side
 | |
| web UI
 | |
| .TP
 | |
| \f[B]\f[CB]--host=IPADDR\f[B]\f[R]
 | |
| listen on this IP address (default: 127.0.0.1)
 | |
| .TP
 | |
| \f[B]\f[CB]--port=PORT\f[B]\f[R]
 | |
| listen on this TCP port (default: 5000)
 | |
| .TP
 | |
| \f[B]\f[CB]--socket=SOCKETFILE\f[B]\f[R]
 | |
| use a unix domain socket file to listen for requests instead of a TCP
 | |
| socket.
 | |
| Implies \f[C]--serve\f[R].
 | |
| It can only be used if the operating system can provide this type of
 | |
| socket.
 | |
| .TP
 | |
| \f[B]\f[CB]--base-url=URL\f[B]\f[R]
 | |
| set the base url (default: http://IPADDR:PORT).
 | |
| You would change this when sharing over the network, or integrating
 | |
| within a larger website.
 | |
| .TP
 | |
| \f[B]\f[CB]--file-url=URL\f[B]\f[R]
 | |
| set the static files url (default: BASEURL/static).
 | |
| hledger-web normally serves static files itself, but if you wanted to
 | |
| serve them from another server for efficiency, you would set the url
 | |
| with this.
 | |
| .TP
 | |
| \f[B]\f[CB]--capabilities=CAP[,CAP..]\f[B]\f[R]
 | |
| enable the view, add, and/or manage capabilities (default: view,add)
 | |
| .TP
 | |
| \f[B]\f[CB]--capabilities-header=HTTPHEADER\f[B]\f[R]
 | |
| read capabilities to enable from a HTTP header, like
 | |
| X-Sandstorm-Permissions (default: disabled)
 | |
| .TP
 | |
| \f[B]\f[CB]--test\f[B]\f[R]
 | |
| run hledger-web\[aq]s tests and exit.
 | |
| hspec test runner args may follow a --, eg: hledger-web --test -- --help
 | |
| .PP
 | |
| hledger input options:
 | |
| .TP
 | |
| \f[B]\f[CB]-f FILE --file=FILE\f[B]\f[R]
 | |
| use a different input file.
 | |
| For stdin, use - (default: \f[C]$LEDGER_FILE\f[R] or
 | |
| \f[C]$HOME/.hledger.journal\f[R])
 | |
| .TP
 | |
| \f[B]\f[CB]--rules-file=RULESFILE\f[B]\f[R]
 | |
| Conversion rules file to use when reading CSV (default: FILE.rules)
 | |
| .TP
 | |
| \f[B]\f[CB]--separator=CHAR\f[B]\f[R]
 | |
| Field separator to expect when reading CSV (default: \[aq],\[aq])
 | |
| .TP
 | |
| \f[B]\f[CB]--alias=OLD=NEW\f[B]\f[R]
 | |
| rename accounts named OLD to NEW
 | |
| .TP
 | |
| \f[B]\f[CB]--anon\f[B]\f[R]
 | |
| anonymize accounts and payees
 | |
| .TP
 | |
| \f[B]\f[CB]--pivot FIELDNAME\f[B]\f[R]
 | |
| use some other field or tag for the account name
 | |
| .TP
 | |
| \f[B]\f[CB]-I --ignore-assertions\f[B]\f[R]
 | |
| disable balance assertion checks (note: does not disable balance
 | |
| assignments)
 | |
| .TP
 | |
| \f[B]\f[CB]-s --strict\f[B]\f[R]
 | |
| do extra error checking (check that all posted accounts are declared)
 | |
| .PP
 | |
| hledger reporting options:
 | |
| .TP
 | |
| \f[B]\f[CB]-b --begin=DATE\f[B]\f[R]
 | |
| include postings/txns on or after this date (will be adjusted to
 | |
| preceding subperiod start when using a report interval)
 | |
| .TP
 | |
| \f[B]\f[CB]-e --end=DATE\f[B]\f[R]
 | |
| include postings/txns before this date (will be adjusted to following
 | |
| subperiod end when using a report interval)
 | |
| .TP
 | |
| \f[B]\f[CB]-D --daily\f[B]\f[R]
 | |
| multiperiod/multicolumn report by day
 | |
| .TP
 | |
| \f[B]\f[CB]-W --weekly\f[B]\f[R]
 | |
| multiperiod/multicolumn report by week
 | |
| .TP
 | |
| \f[B]\f[CB]-M --monthly\f[B]\f[R]
 | |
| multiperiod/multicolumn report by month
 | |
| .TP
 | |
| \f[B]\f[CB]-Q --quarterly\f[B]\f[R]
 | |
| multiperiod/multicolumn report by quarter
 | |
| .TP
 | |
| \f[B]\f[CB]-Y --yearly\f[B]\f[R]
 | |
| multiperiod/multicolumn report by year
 | |
| .TP
 | |
| \f[B]\f[CB]-p --period=PERIODEXP\f[B]\f[R]
 | |
| set start date, end date, and/or reporting interval all at once using
 | |
| period expressions syntax
 | |
| .TP
 | |
| \f[B]\f[CB]--date2\f[B]\f[R]
 | |
| match the secondary date instead (see command help for other effects)
 | |
| .TP
 | |
| \f[B]\f[CB]--today=DATE\f[B]\f[R]
 | |
| override today\[aq]s date (affects relative smart dates, for
 | |
| tests/examples)
 | |
| .TP
 | |
| \f[B]\f[CB]-U --unmarked\f[B]\f[R]
 | |
| include only unmarked postings/txns (can combine with -P or -C)
 | |
| .TP
 | |
| \f[B]\f[CB]-P --pending\f[B]\f[R]
 | |
| include only pending postings/txns
 | |
| .TP
 | |
| \f[B]\f[CB]-C --cleared\f[B]\f[R]
 | |
| include only cleared postings/txns
 | |
| .TP
 | |
| \f[B]\f[CB]-R --real\f[B]\f[R]
 | |
| include only non-virtual postings
 | |
| .TP
 | |
| \f[B]\f[CB]-NUM --depth=NUM\f[B]\f[R]
 | |
| hide/aggregate accounts or postings more than NUM levels deep
 | |
| .TP
 | |
| \f[B]\f[CB]-E --empty\f[B]\f[R]
 | |
| show items with zero amount, normally hidden (and vice-versa in
 | |
| hledger-ui/hledger-web)
 | |
| .TP
 | |
| \f[B]\f[CB]-B --cost\f[B]\f[R]
 | |
| convert amounts to their cost/selling amount at transaction time
 | |
| .TP
 | |
| \f[B]\f[CB]-V --market\f[B]\f[R]
 | |
| convert amounts to their market value in default valuation commodities
 | |
| .TP
 | |
| \f[B]\f[CB]-X --exchange=COMM\f[B]\f[R]
 | |
| convert amounts to their market value in commodity COMM
 | |
| .TP
 | |
| \f[B]\f[CB]--value\f[B]\f[R]
 | |
| convert amounts to cost or market value, more flexibly than -B/-V/-X
 | |
| .TP
 | |
| \f[B]\f[CB]--infer-market-prices\f[B]\f[R]
 | |
| use transaction prices (recorded with \[at] or \[at]\[at]) as additional
 | |
| market prices, as if they were P directives
 | |
| .TP
 | |
| \f[B]\f[CB]--auto\f[B]\f[R]
 | |
| apply automated posting rules to modify transactions.
 | |
| .TP
 | |
| \f[B]\f[CB]--forecast\f[B]\f[R]
 | |
| generate future transactions from periodic transaction rules, for the
 | |
| next 6 months or till report end date.
 | |
| In hledger-ui, also make ordinary future transactions visible.
 | |
| .TP
 | |
| \f[B]\f[CB]--commodity-style\f[B]\f[R]
 | |
| Override the commodity style in the output for the specified commodity.
 | |
| For example \[aq]EUR1.000,00\[aq].
 | |
| .TP
 | |
| \f[B]\f[CB]--color=WHEN (or --colour=WHEN)\f[B]\f[R]
 | |
| Should color-supporting commands use ANSI color codes in text output.
 | |
| \[aq]auto\[aq] (default): whenever stdout seems to be a color-supporting
 | |
| terminal.
 | |
| \[aq]always\[aq] or \[aq]yes\[aq]: always, useful eg when piping output
 | |
| into \[aq]less -R\[aq].
 | |
| \[aq]never\[aq] or \[aq]no\[aq]: never.
 | |
| A NO_COLOR environment variable overrides this.
 | |
| .TP
 | |
| \f[B]\f[CB]--pretty[=WHEN]\f[B]\f[R]
 | |
| Show prettier output, e.g.
 | |
| using unicode box-drawing characters.
 | |
| Accepts \[aq]yes\[aq] (the default) or \[aq]no\[aq] (\[aq]y\[aq],
 | |
| \[aq]n\[aq], \[aq]always\[aq], \[aq]never\[aq] also work).
 | |
| If you provide an argument you must use \[aq]=\[aq], e.g.
 | |
| \[aq]--pretty=yes\[aq].
 | |
| .PP
 | |
| When a reporting option appears more than once in the command line, the
 | |
| last one takes precedence.
 | |
| .PP
 | |
| Some reporting options can also be written as query arguments.
 | |
| .PP
 | |
| hledger help options:
 | |
| .TP
 | |
| \f[B]\f[CB]-h --help\f[B]\f[R]
 | |
| show general or COMMAND help
 | |
| .TP
 | |
| \f[B]\f[CB]--man\f[B]\f[R]
 | |
| show general or COMMAND user manual with man
 | |
| .TP
 | |
| \f[B]\f[CB]--info\f[B]\f[R]
 | |
| show general or COMMAND user manual with info
 | |
| .TP
 | |
| \f[B]\f[CB]--version\f[B]\f[R]
 | |
| show general or ADDONCMD version
 | |
| .TP
 | |
| \f[B]\f[CB]--debug[=N]\f[B]\f[R]
 | |
| show debug output (levels 1-9, default: 1)
 | |
| .PP
 | |
| A \[at]FILE argument will be expanded to the contents of FILE, which
 | |
| should contain one command line option/argument per line.
 | |
| (To prevent this, insert a \f[C]--\f[R] argument before.)
 | |
| .PP
 | |
| By default, hledger-web starts the web app in \[dq]transient mode\[dq]
 | |
| and also opens it in your default web browser if possible.
 | |
| In this mode the web app will keep running for as long as you have it
 | |
| open in a browser window, and will exit after two minutes of inactivity
 | |
| (no requests and no browser windows viewing it).
 | |
| With \f[C]--serve\f[R], it just runs the web app without exiting, and
 | |
| logs requests to the console.
 | |
| With \f[C]--serve-api\f[R], only the JSON web api (see below) is served,
 | |
| with the usual HTML server-side web UI disabled.
 | |
| .PP
 | |
| By default the server listens on IP address 127.0.0.1, accessible only
 | |
| to local requests.
 | |
| You can use \f[C]--host\f[R] to change this, eg \f[C]--host 0.0.0.0\f[R]
 | |
| to listen on all configured addresses.
 | |
| .PP
 | |
| Similarly, use \f[C]--port\f[R] to set a TCP port other than 5000, eg if
 | |
| you are running multiple hledger-web instances.
 | |
| .PP
 | |
| Both of these options are ignored when \f[C]--socket\f[R] is used.
 | |
| In this case, it creates an \f[C]AF_UNIX\f[R] socket file at the
 | |
| supplied path and uses that for communication.
 | |
| This is an alternative way of running multiple hledger-web instances
 | |
| behind a reverse proxy that handles authentication for different users.
 | |
| The path can be derived in a predictable way, eg by using the username
 | |
| within the path.
 | |
| As an example, \f[C]nginx\f[R] as reverse proxy can use the variable
 | |
| \f[C]$remote_user\f[R] to derive a path from the username used in a HTTP
 | |
| basic authentication.
 | |
| The following \f[C]proxy_pass\f[R] directive allows access to all
 | |
| \f[C]hledger-web\f[R] instances that created a socket in
 | |
| \f[C]/tmp/hledger/\f[R]:
 | |
| .IP
 | |
| .nf
 | |
| \f[C]
 | |
|   proxy_pass http://unix:/tmp/hledger/${remote_user}.socket;
 | |
| \f[R]
 | |
| .fi
 | |
| .PP
 | |
| You can use \f[C]--base-url\f[R] to change the protocol, hostname, port
 | |
| and path that appear in hyperlinks, useful eg for integrating
 | |
| hledger-web within a larger website.
 | |
| The default is \f[C]http://HOST:PORT/\f[R] using the server\[aq]s
 | |
| configured host address and TCP port (or \f[C]http://HOST\f[R] if PORT
 | |
| is 80).
 | |
| .PP
 | |
| With \f[C]--file-url\f[R] you can set a different base url for static
 | |
| files, eg for better caching or cookie-less serving on high performance
 | |
| websites.
 | |
| .SH PERMISSIONS
 | |
| .PP
 | |
| By default, hledger-web allows anyone who can reach it to view the
 | |
| journal and to add new transactions, but not to change existing data.
 | |
| .PP
 | |
| You can restrict who can reach it by
 | |
| .IP \[bu] 2
 | |
| setting the IP address it listens on (see \f[C]--host\f[R] above).
 | |
| By default it listens on 127.0.0.1, accessible to all users on the local
 | |
| machine.
 | |
| .IP \[bu] 2
 | |
| putting it behind an authenticating proxy, using eg apache or nginx
 | |
| .IP \[bu] 2
 | |
| custom firewall rules
 | |
| .PP
 | |
| You can restrict what the users who reach it can do, by
 | |
| .IP \[bu] 2
 | |
| using the \f[C]--capabilities=CAP[,CAP..]\f[R] flag when you start it,
 | |
| enabling one or more of the following capabilities.
 | |
| The default value is \f[C]view,add\f[R]:
 | |
| .RS 2
 | |
| .IP \[bu] 2
 | |
| \f[C]view\f[R] - allows viewing the journal file and all included files
 | |
| .IP \[bu] 2
 | |
| \f[C]add\f[R] - allows adding new transactions to the main journal file
 | |
| .IP \[bu] 2
 | |
| \f[C]manage\f[R] - allows editing, uploading or downloading the main or
 | |
| included files
 | |
| .RE
 | |
| .IP \[bu] 2
 | |
| using the \f[C]--capabilities-header=HTTPHEADER\f[R] flag to specify a
 | |
| HTTP header from which it will read capabilities to enable.
 | |
| hledger-web on Sandstorm uses the X-Sandstorm-Permissions header to
 | |
| integrate with Sandstorm\[aq]s permissions.
 | |
| This is disabled by default.
 | |
| .SH EDITING, UPLOADING, DOWNLOADING
 | |
| .PP
 | |
| If you enable the \f[C]manage\f[R] capability mentioned above,
 | |
| you\[aq]ll see a new \[dq]spanner\[dq] button to the right of the search
 | |
| form.
 | |
| Clicking this will let you edit, upload, or download the journal file or
 | |
| any files it includes.
 | |
| .PP
 | |
| Note, unlike any other hledger command, in this mode you (or any
 | |
| visitor) can alter or wipe the data files.
 | |
| .PP
 | |
| Normally whenever a file is changed in this way, hledger-web saves a
 | |
| numbered backup (assuming file permissions allow it, the disk is not
 | |
| full, etc.) hledger-web is not aware of version control systems,
 | |
| currently; if you use one, you\[aq]ll have to arrange to commit the
 | |
| changes yourself (eg with a cron job or a file watcher like entr).
 | |
| .PP
 | |
| Changes which would leave the journal file(s) unparseable or non-valid
 | |
| (eg with failing balance assertions) are prevented.
 | |
| (Probably.
 | |
| This needs re-testing.)
 | |
| .SH RELOADING
 | |
| .PP
 | |
| hledger-web detects changes made to the files by other means (eg if you
 | |
| edit it directly, outside of hledger-web), and it will show the new data
 | |
| when you reload the page or navigate to a new page.
 | |
| If a change makes a file unparseable, hledger-web will display an error
 | |
| message until the file has been fixed.
 | |
| .PP
 | |
| (Note: if you are viewing files mounted from another machine, make sure
 | |
| that both machine clocks are roughly in step.)
 | |
| .SH JSON API
 | |
| .PP
 | |
| In addition to the web UI, hledger-web also serves a JSON API that can
 | |
| be used to get data or add new transactions.
 | |
| If you want the JSON API only, you can use the \f[C]--serve-api\f[R]
 | |
| 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
 | |
| .nf
 | |
| \f[C]
 | |
| /version
 | |
| /accountnames
 | |
| /transactions
 | |
| /prices
 | |
| /commodities
 | |
| /accounts
 | |
| /accounttransactions/ACCOUNTNAME
 | |
| \f[R]
 | |
| .fi
 | |
| .PP
 | |
| Eg, all account names in the journal (similar to the accounts command).
 | |
| (hledger-web\[aq]s JSON does not include newlines, here we use python to
 | |
| prettify it):
 | |
| .IP
 | |
| .nf
 | |
| \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
 | |
| Or all transactions:
 | |
| .IP
 | |
| .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
 | |
| Most of the JSON corresponds to hledger\[aq]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.
 | |
| .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 hledger-web\[aq]s \f[C]/transactions\f[R]
 | |
| or \f[C]/accounttransactions\f[R], or you can export it with
 | |
| hledger-lib, eg like so:
 | |
| .IP
 | |
| .nf
 | |
| \f[C]
 | |
| \&.../hledger$ stack ghci hledger-lib
 | |
| >>> writeJsonFile \[dq]txn.json\[dq] (head $ jtxns samplejournal)
 | |
| >>> :q
 | |
| \f[R]
 | |
| .fi
 | |
| .PP
 | |
| Here\[aq]s how it looks as of hledger-1.17 (remember, this JSON
 | |
| corresponds to hledger\[aq]s Transaction and related data types):
 | |
| .IP
 | |
| .nf
 | |
| \f[C]
 | |
| {
 | |
|     \[dq]tcomment\[dq]: \[dq]\[dq],
 | |
|     \[dq]tpostings\[dq]: [
 | |
|         {
 | |
|             \[dq]pbalanceassertion\[dq]: null,
 | |
|             \[dq]pstatus\[dq]: \[dq]Unmarked\[dq],
 | |
|             \[dq]pamount\[dq]: [
 | |
|                 {
 | |
|                     \[dq]aprice\[dq]: null,
 | |
|                     \[dq]acommodity\[dq]: \[dq]$\[dq],
 | |
|                     \[dq]aquantity\[dq]: {
 | |
|                         \[dq]floatingPoint\[dq]: 1,
 | |
|                         \[dq]decimalPlaces\[dq]: 10,
 | |
|                         \[dq]decimalMantissa\[dq]: 10000000000
 | |
|                     },
 | |
|                     \[dq]aismultiplier\[dq]: false,
 | |
|                     \[dq]astyle\[dq]: {
 | |
|                         \[dq]ascommodityside\[dq]: \[dq]L\[dq],
 | |
|                         \[dq]asdigitgroups\[dq]: null,
 | |
|                         \[dq]ascommodityspaced\[dq]: false,
 | |
|                         \[dq]asprecision\[dq]: 2,
 | |
|                         \[dq]asdecimalpoint\[dq]: \[dq].\[dq]
 | |
|                     }
 | |
|                 }
 | |
|             ],
 | |
|             \[dq]ptransaction_\[dq]: \[dq]1\[dq],
 | |
|             \[dq]paccount\[dq]: \[dq]assets:bank:checking\[dq],
 | |
|             \[dq]pdate\[dq]: null,
 | |
|             \[dq]ptype\[dq]: \[dq]RegularPosting\[dq],
 | |
|             \[dq]pcomment\[dq]: \[dq]\[dq],
 | |
|             \[dq]pdate2\[dq]: null,
 | |
|             \[dq]ptags\[dq]: [],
 | |
|             \[dq]poriginal\[dq]: null
 | |
|         },
 | |
|         {
 | |
|             \[dq]pbalanceassertion\[dq]: null,
 | |
|             \[dq]pstatus\[dq]: \[dq]Unmarked\[dq],
 | |
|             \[dq]pamount\[dq]: [
 | |
|                 {
 | |
|                     \[dq]aprice\[dq]: null,
 | |
|                     \[dq]acommodity\[dq]: \[dq]$\[dq],
 | |
|                     \[dq]aquantity\[dq]: {
 | |
|                         \[dq]floatingPoint\[dq]: -1,
 | |
|                         \[dq]decimalPlaces\[dq]: 10,
 | |
|                         \[dq]decimalMantissa\[dq]: -10000000000
 | |
|                     },
 | |
|                     \[dq]aismultiplier\[dq]: false,
 | |
|                     \[dq]astyle\[dq]: {
 | |
|                         \[dq]ascommodityside\[dq]: \[dq]L\[dq],
 | |
|                         \[dq]asdigitgroups\[dq]: null,
 | |
|                         \[dq]ascommodityspaced\[dq]: false,
 | |
|                         \[dq]asprecision\[dq]: 2,
 | |
|                         \[dq]asdecimalpoint\[dq]: \[dq].\[dq]
 | |
|                     }
 | |
|                 }
 | |
|             ],
 | |
|             \[dq]ptransaction_\[dq]: \[dq]1\[dq],
 | |
|             \[dq]paccount\[dq]: \[dq]income:salary\[dq],
 | |
|             \[dq]pdate\[dq]: null,
 | |
|             \[dq]ptype\[dq]: \[dq]RegularPosting\[dq],
 | |
|             \[dq]pcomment\[dq]: \[dq]\[dq],
 | |
|             \[dq]pdate2\[dq]: null,
 | |
|             \[dq]ptags\[dq]: [],
 | |
|             \[dq]poriginal\[dq]: null
 | |
|         }
 | |
|     ],
 | |
|     \[dq]ttags\[dq]: [],
 | |
|     \[dq]tsourcepos\[dq]: {
 | |
|         \[dq]tag\[dq]: \[dq]JournalSourcePos\[dq],
 | |
|         \[dq]contents\[dq]: [
 | |
|             \[dq]\[dq],
 | |
|             [
 | |
|                 1,
 | |
|                 1
 | |
|             ]
 | |
|         ]
 | |
|     },
 | |
|     \[dq]tdate\[dq]: \[dq]2008-01-01\[dq],
 | |
|     \[dq]tcode\[dq]: \[dq]\[dq],
 | |
|     \[dq]tindex\[dq]: 1,
 | |
|     \[dq]tprecedingcomment\[dq]: \[dq]\[dq],
 | |
|     \[dq]tdate2\[dq]: null,
 | |
|     \[dq]tdescription\[dq]: \[dq]income\[dq],
 | |
|     \[dq]tstatus\[dq]: \[dq]Unmarked\[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
 | |
| .PP
 | |
| \f[B]LEDGER_FILE\f[R] The journal file path when not specified with
 | |
| \f[C]-f\f[R].
 | |
| Default: \f[C]\[ti]/.hledger.journal\f[R] (on windows, perhaps
 | |
| \f[C]C:/Users/USER/.hledger.journal\f[R]).
 | |
| .PP
 | |
| A typical value is \f[C]\[ti]/DIR/YYYY.journal\f[R], where DIR is a
 | |
| version-controlled finance directory and YYYY is the current year.
 | |
| Or \f[C]\[ti]/DIR/current.journal\f[R], where current.journal is a
 | |
| symbolic link to YYYY.journal.
 | |
| .PP
 | |
| On Mac computers, you can set this and other environment variables in a
 | |
| more thorough way that also affects applications started from the GUI
 | |
| (say, an Emacs dock icon).
 | |
| Eg on MacOS Catalina I have a \f[C]\[ti]/.MacOSX/environment.plist\f[R]
 | |
| file containing
 | |
| .IP
 | |
| .nf
 | |
| \f[C]
 | |
| {
 | |
|   \[dq]LEDGER_FILE\[dq] : \[dq]\[ti]/finance/current.journal\[dq]
 | |
| }
 | |
| \f[R]
 | |
| .fi
 | |
| .PP
 | |
| To see the effect you may need to \f[C]killall Dock\f[R], or reboot.
 | |
| .SH FILES
 | |
| .PP
 | |
| Reads data from one or more files in hledger journal, timeclock,
 | |
| timedot, or CSV format specified with \f[C]-f\f[R], or
 | |
| \f[C]$LEDGER_FILE\f[R], or \f[C]$HOME/.hledger.journal\f[R] (on windows,
 | |
| perhaps \f[C]C:/Users/USER/.hledger.journal\f[R]).
 | |
| .SH BUGS
 | |
| .PP
 | |
| The need to precede options with \f[C]--\f[R] when invoked from hledger
 | |
| is awkward.
 | |
| .PP
 | |
| \f[C]-f-\f[R] doesn\[aq]t work (hledger-web can\[aq]t read from stdin).
 | |
| .PP
 | |
| Query arguments and some hledger options are ignored.
 | |
| .PP
 | |
| Does not work in text-mode browsers.
 | |
| .PP
 | |
| Does not work well on small screens.
 | |
| 
 | |
| 
 | |
| .SH "REPORTING BUGS"
 | |
| Report bugs at http://bugs.hledger.org
 | |
| (or on the #hledger IRC channel or hledger mail list)
 | |
| 
 | |
| .SH AUTHORS
 | |
| Simon Michael <simon@joyful.com> and contributors
 | |
| 
 | |
| .SH COPYRIGHT
 | |
| 
 | |
| Copyright (C) 2007-2020 Simon Michael.
 | |
| .br
 | |
| Released under GNU GPL v3 or later.
 | |
| 
 | |
| .SH SEE ALSO
 | |
| hledger(1), hledger\-ui(1), hledger\-web(1), ledger(1)
 |